@@ -74,25 +74,44 @@ void secp256k1_context_destroy(
7474 secp256k1_context_t * ctx
7575) SECP256K1_ARG_NONNULL (1 );
7676
77+ /** Data type to hold a parsed public key.
78+ This data type should be considered opaque to the user, and only created
79+ through API functions.
80+ */
81+ typedef struct {
82+ unsigned char data [64 ];
83+ } secp256k1_pubkey_t ;
84+
85+ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse (
86+ const secp256k1_context_t * ctx ,
87+ secp256k1_pubkey_t * pubkey ,
88+ const unsigned char * input ,
89+ int inputlen
90+ ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 );
91+
92+ int secp256k1_ec_pubkey_serialize (
93+ const secp256k1_context_t * ctx ,
94+ unsigned char * output ,
95+ int * outputlen ,
96+ const secp256k1_pubkey_t * pubkey ,
97+ int compressed
98+ ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 ) SECP256K1_ARG_NONNULL (4 );
99+
77100/** Verify an ECDSA signature.
78101 * Returns: 1: correct signature
79- * 0: incorrect signature
80- * -1: invalid public key
81- * -2: invalid signature
102+ * 0: incorrect or unparseable signature
82103 * In: ctx: a secp256k1 context object, initialized for verification.
83104 * msg32: the 32-byte message hash being verified (cannot be NULL)
84105 * sig: the signature being verified (cannot be NULL)
85106 * siglen: the length of the signature
86107 * pubkey: the public key to verify with (cannot be NULL)
87- * pubkeylen: the length of pubkey
88108 */
89109SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify (
90110 const secp256k1_context_t * ctx ,
91111 const unsigned char * msg32 ,
92112 const unsigned char * sig ,
93113 int siglen ,
94- const unsigned char * pubkey ,
95- int pubkeylen
114+ const secp256k1_pubkey_t * pubkey
96115) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 ) SECP256K1_ARG_NONNULL (5 );
97116
98117/** A pointer to a function to deterministically generate a nonce.
@@ -124,7 +143,6 @@ extern const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979;
124143/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */
125144extern const secp256k1_nonce_function_t secp256k1_nonce_function_default ;
126145
127-
128146/** Create an ECDSA signature.
129147 * Returns: 1: signature created
130148 * 0: the nonce generation function failed, the private key was invalid, or there is not
@@ -202,20 +220,16 @@ int secp256k1_ecdsa_sign_compact(
202220 * In: ctx: pointer to a context object, initialized for verification (cannot be NULL)
203221 * msg32: the 32-byte message hash assumed to be signed (cannot be NULL)
204222 * sig64: signature as 64 byte array (cannot be NULL)
205- * compressed: whether to recover a compressed or uncompressed pubkey
206223 * recid: the recovery id (0-3, as returned by ecdsa_sign_compact)
207- * Out: pubkey: pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL)
208- * pubkeylen: pointer to an int that will contain the pubkey length (cannot be NULL)
224+ * Out: pubkey: pointer to the recoved public key (cannot be NULL)
209225 */
210226SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact (
211227 const secp256k1_context_t * ctx ,
212228 const unsigned char * msg32 ,
213229 const unsigned char * sig64 ,
214- unsigned char * pubkey ,
215- int * pubkeylen ,
216- int compressed ,
230+ secp256k1_pubkey_t * pubkey ,
217231 int recid
218- ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 ) SECP256K1_ARG_NONNULL (4 ) SECP256K1_ARG_NONNULL ( 5 ) ;
232+ ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 ) SECP256K1_ARG_NONNULL (4 );
219233
220234/** Verify an ECDSA secret key.
221235 * Returns: 1: secret key is valid
@@ -228,24 +242,11 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(
228242 const unsigned char * seckey
229243) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 );
230244
231- /** Just validate a public key.
232- * Returns: 1: public key is valid
233- * 0: public key is invalid
234- * In: ctx: pointer to a context object (cannot be NULL)
235- * pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL).
236- * pubkeylen: length of pubkey
237- */
238- SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify (
239- const secp256k1_context_t * ctx ,
240- const unsigned char * pubkey ,
241- int pubkeylen
242- ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 );
243-
244245/** Compute the public key for a secret key.
245246 * In: ctx: pointer to a context object, initialized for signing (cannot be NULL)
246247 * compressed: whether the computed public key should be compressed
247248 * seckey: pointer to a 32-byte private key (cannot be NULL)
248- * Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed )
249+ * Out: pubkey: pointer to the created public key (cannot be NULL )
249250 * area to store the public key (cannot be NULL)
250251 * pubkeylen: pointer to int that will be updated to contains the pubkey's
251252 * length (cannot be NULL)
@@ -254,45 +255,9 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify(
254255 */
255256SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create (
256257 const secp256k1_context_t * ctx ,
257- unsigned char * pubkey ,
258- int * pubkeylen ,
259- const unsigned char * seckey ,
260- int compressed
261- ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 ) SECP256K1_ARG_NONNULL (4 );
262-
263- /** Compress a public key.
264- * In: ctx: pointer to a context object (cannot be NULL)
265- * pubkeyin: pointer to a 33-byte or 65-byte public key (cannot be NULL)
266- * Out: pubkeyout: pointer to a 33-byte array to put the compressed public key (cannot be NULL)
267- * May alias pubkeyin.
268- * pubkeylen: pointer to the size of the public key pointed to by pubkeyin (cannot be NULL)
269- * It will be updated to reflect the size of the public key in pubkeyout.
270- * Returns: 0: pubkeyin was invalid
271- * 1: pubkeyin was valid, and pubkeyout is its compressed version
272- */
273- SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_compress (
274- const secp256k1_context_t * ctx ,
275- const unsigned char * pubkeyin ,
276- unsigned char * pubkeyout ,
277- int * pubkeylen
278- ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 ) SECP256K1_ARG_NONNULL (4 );
279-
280- /** Decompress a public key.
281- * In: ctx: pointer to a context object (cannot be NULL)
282- * pubkeyin: pointer to a 33-byte or 65-byte public key (cannot be NULL)
283- * Out: pubkeyout: pointer to a 65-byte array to put the decompressed public key (cannot be NULL)
284- * May alias pubkeyin.
285- * pubkeylen: pointer to the size of the public key pointed to by pubkeyin (cannot be NULL)
286- * It will be updated to reflect the size of the public key in pubkeyout.
287- * Returns: 0: pubkeyin was invalid
288- * 1: pubkeyin was valid, and pubkeyout is its decompressed version
289- */
290- SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress (
291- const secp256k1_context_t * ctx ,
292- const unsigned char * pubkeyin ,
293- unsigned char * pubkeyout ,
294- int * pubkeylen
295- ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 ) SECP256K1_ARG_NONNULL (4 );
258+ secp256k1_pubkey_t * pubkey ,
259+ const unsigned char * seckey
260+ ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 );
296261
297262/** Export a private key in DER format.
298263 * In: ctx: pointer to a context object, initialized for signing (cannot be NULL)
@@ -325,10 +290,9 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(
325290 */
326291SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add (
327292 const secp256k1_context_t * ctx ,
328- unsigned char * pubkey ,
329- int pubkeylen ,
293+ secp256k1_pubkey_t * pubkey ,
330294 const unsigned char * tweak
331- ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (4 );
295+ ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 );
332296
333297/** Tweak a private key by multiplying it with tweak. */
334298SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul (
@@ -342,10 +306,9 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(
342306 */
343307SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul (
344308 const secp256k1_context_t * ctx ,
345- unsigned char * pubkey ,
346- int pubkeylen ,
309+ secp256k1_pubkey_t * pubkey ,
347310 const unsigned char * tweak
348- ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (4 );
311+ ) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 );
349312
350313/** Updates the context randomization.
351314 * Returns: 1: randomization successfully updated
0 commit comments