- Use defined constants instead of hard-coding their integer value. - Allocate secp256k1 structs on the C stack instead of converting []byte - Remove dead code
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**********************************************************************
 | 
						|
 * Copyright (c) 2014, 2015 Pieter Wuille                             *
 | 
						|
 * Distributed under the MIT software license, see the accompanying   *
 | 
						|
 * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
 | 
						|
 **********************************************************************/
 | 
						|
 | 
						|
/****
 | 
						|
 * Please do not link this file directly. It is not part of the libsecp256k1
 | 
						|
 * project and does not promise any stability in its API, functionality or
 | 
						|
 * presence. Projects which use this code should instead copy this header
 | 
						|
 * and its accompanying .c file directly into their codebase.
 | 
						|
 ****/
 | 
						|
 | 
						|
/* This file contains code snippets that parse DER private keys with
 | 
						|
 * various errors and violations.  This is not a part of the library
 | 
						|
 * itself, because the allowed violations are chosen arbitrarily and
 | 
						|
 * do not follow or establish any standard.
 | 
						|
 *
 | 
						|
 * It also contains code to serialize private keys in a compatible
 | 
						|
 * manner.
 | 
						|
 *
 | 
						|
 * These functions are meant for compatibility with applications
 | 
						|
 * that require BER encoded keys. When working with secp256k1-specific
 | 
						|
 * code, the simple 32-byte private keys normally used by the
 | 
						|
 * library are sufficient.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_
 | 
						|
#define _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_
 | 
						|
 | 
						|
#include <secp256k1.h>
 | 
						|
 | 
						|
# ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
# endif
 | 
						|
 | 
						|
/** Export a private key in DER format.
 | 
						|
 *
 | 
						|
 *  Returns: 1 if the private key was valid.
 | 
						|
 *  Args: ctx:        pointer to a context object, initialized for signing (cannot
 | 
						|
 *                    be NULL)
 | 
						|
 *  Out: privkey:     pointer to an array for storing the private key in BER.
 | 
						|
 *                    Should have space for 279 bytes, and cannot be NULL.
 | 
						|
 *       privkeylen:  Pointer to an int where the length of the private key in
 | 
						|
 *                    privkey will be stored.
 | 
						|
 *  In:  seckey:      pointer to a 32-byte secret key to export.
 | 
						|
 *       compressed:  1 if the key should be exported in
 | 
						|
 *                    compressed format, 0 otherwise
 | 
						|
 *
 | 
						|
 *  This function is purely meant for compatibility with applications that
 | 
						|
 *  require BER encoded keys. When working with secp256k1-specific code, the
 | 
						|
 *  simple 32-byte private keys are sufficient.
 | 
						|
 *
 | 
						|
 *  Note that this function does not guarantee correct DER output. It is
 | 
						|
 *  guaranteed to be parsable by secp256k1_ec_privkey_import_der
 | 
						|
 */
 | 
						|
SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der(
 | 
						|
    const secp256k1_context* ctx,
 | 
						|
    unsigned char *privkey,
 | 
						|
    size_t *privkeylen,
 | 
						|
    const unsigned char *seckey,
 | 
						|
    int compressed
 | 
						|
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
 | 
						|
 | 
						|
/** Import a private key in DER format.
 | 
						|
 * Returns: 1 if a private key was extracted.
 | 
						|
 * Args: ctx:        pointer to a context object (cannot be NULL).
 | 
						|
 * Out:  seckey:     pointer to a 32-byte array for storing the private key.
 | 
						|
 *                   (cannot be NULL).
 | 
						|
 * In:   privkey:    pointer to a private key in DER format (cannot be NULL).
 | 
						|
 *       privkeylen: length of the DER private key pointed to be privkey.
 | 
						|
 *
 | 
						|
 * This function will accept more than just strict DER, and even allow some BER
 | 
						|
 * violations. The public key stored inside the DER-encoded private key is not
 | 
						|
 * verified for correctness, nor are the curve parameters. Use this function
 | 
						|
 * only if you know in advance it is supposed to contain a secp256k1 private
 | 
						|
 * key.
 | 
						|
 */
 | 
						|
SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der(
 | 
						|
    const secp256k1_context* ctx,
 | 
						|
    unsigned char *seckey,
 | 
						|
    const unsigned char *privkey,
 | 
						|
    size_t privkeylen
 | 
						|
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 |