Use separate in and out pointers in secp256k1_ec_pubkey_decompress

Right now `secp256k1_ec_pubkey_decompress` takes an in/out pointer to
a public key and replaces the input key with its decompressed variant.
This forces users who store compressed keys in small (<65 byte) fixed
size buffers (for example, the Rust bindings do this) to explicitly
and wastefully copy their key to a larger buffer.

[API BREAK]
This commit is contained in:
Andrew Poelstra
2015-05-11 09:55:45 -05:00
parent 729badff14
commit 210ffed5cd
3 changed files with 28 additions and 13 deletions

View File

@@ -1511,7 +1511,19 @@ void test_ecdsa_end_to_end(void) {
CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1);
CHECK(secp256k1_ec_pubkey_create(ctx, pubkey, &pubkeylen, privkey, (secp256k1_rand32() & 3) != 0) == 1);
if (secp256k1_rand32() & 1) {
CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, &pubkeylen));
unsigned char pubkey2[65] = {0};
int pubkey2len = pubkeylen;
/* Decompress into a new array */
CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, pubkey2, &pubkey2len));
/* Check that the key was changed iff it was originally compressed */
if (pubkeylen == 65) {
CHECK(memcmp(pubkey, pubkey2, 65) == 0);
} else {
CHECK(memcmp(pubkey, pubkey2, 65) != 0);
}
/* Decompress in place */
CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, pubkey, &pubkeylen));
CHECK(memcmp(pubkey, pubkey2, 65) == 0);
}
CHECK(secp256k1_ec_pubkey_verify(ctx, pubkey, pubkeylen));