lax_der_privatekey_parsing.h (4072B)
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 haskellsecp256k1_v0_1_0_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 haskellsecp256k1_v0_1_0_ec_privkey_import_der 61 */ 62 SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der( 63 const haskellsecp256k1_v0_1_0_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 haskellsecp256k1_v0_1_0_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 */