lax_der_privatekey_parsing.h raw

   1  /***********************************************************************
   2   * Copyright (c) 2014, 2015 Pieter Wuille                              *
   3   * Distributed under the MIT software license, see the accompanying    *
   4   * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
   5   ***********************************************************************/
   6  
   7  /****
   8   * Please do not link this file directly. It is not part of the libsecp256k1
   9   * project and does not promise any stability in its API, functionality or
  10   * presence. Projects which use this code should instead copy this header
  11   * and its accompanying .c file directly into their codebase.
  12   ****/
  13  
  14  /* This file contains code snippets that parse DER private keys with
  15   * various errors and violations.  This is not a part of the library
  16   * itself, because the allowed violations are chosen arbitrarily and
  17   * do not follow or establish any standard.
  18   *
  19   * It also contains code to serialize private keys in a compatible
  20   * manner.
  21   *
  22   * These functions are meant for compatibility with applications
  23   * that require BER encoded keys. When working with secp256k1-specific
  24   * code, the simple 32-byte private keys normally used by the
  25   * library are sufficient.
  26   */
  27  
  28  #ifndef SECP256K1_CONTRIB_BER_PRIVATEKEY_H
  29  #define SECP256K1_CONTRIB_BER_PRIVATEKEY_H
  30  
  31  /* #include secp256k1.h only when it hasn't been included yet.
  32     This enables this file to be #included directly in other project
  33     files (such as tests.c) without the need to set an explicit -I flag,
  34     which would be necessary to locate secp256k1.h. */
  35  #ifndef SECP256K1_H
  36  #include <secp256k1.h>
  37  #endif
  38  
  39  #ifdef __cplusplus
  40  extern "C" {
  41  #endif
  42  
  43  /** Export a private key in DER format.
  44   *
  45   *  Returns: 1 if the private key was valid.
  46   *  Args: ctx:        pointer to a context object (not secp256k1_context_static).
  47   *  Out: privkey:     pointer to an array for storing the private key in BER.
  48   *                    Should have space for 279 bytes, and cannot be NULL.
  49   *       privkeylen:  Pointer to an int where the length of the private key in
  50   *                    privkey will be stored.
  51   *  In:  seckey:      pointer to a 32-byte secret key to export.
  52   *       compressed:  1 if the key should be exported in
  53   *                    compressed format, 0 otherwise
  54   *
  55   *  This function is purely meant for compatibility with applications that
  56   *  require BER encoded keys. When working with secp256k1-specific code, the
  57   *  simple 32-byte private keys are sufficient.
  58   *
  59   *  Note that this function does not guarantee correct DER output. It is
  60   *  guaranteed to be parsable by secp256k1_ec_privkey_import_der
  61   */
  62  SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der(
  63      const secp256k1_context* ctx,
  64      unsigned char *privkey,
  65      size_t *privkeylen,
  66      const unsigned char *seckey,
  67      int compressed
  68  ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
  69  
  70  /** Import a private key in DER format.
  71   * Returns: 1 if a private key was extracted.
  72   * Args: ctx:        pointer to a context object (cannot be NULL).
  73   * Out:  seckey:     pointer to a 32-byte array for storing the private key.
  74   *                   (cannot be NULL).
  75   * In:   privkey:    pointer to a private key in DER format (cannot be NULL).
  76   *       privkeylen: length of the DER private key pointed to be privkey.
  77   *
  78   * This function will accept more than just strict DER, and even allow some BER
  79   * violations. The public key stored inside the DER-encoded private key is not
  80   * verified for correctness, nor are the curve parameters. Use this function
  81   * only if you know in advance it is supposed to contain a secp256k1 private
  82   * key.
  83   */
  84  SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der(
  85      const secp256k1_context* ctx,
  86      unsigned char *seckey,
  87      const unsigned char *privkey,
  88      size_t privkeylen
  89  ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
  90  
  91  #ifdef __cplusplus
  92  }
  93  #endif
  94  
  95  #endif /* SECP256K1_CONTRIB_BER_PRIVATEKEY_H */
  96