Fix checks of whitelist serialize/parse arguments
This commit is contained in:
parent
cb8a394102
commit
a809ac484f
@ -88,7 +88,7 @@ SECP256K1_API int secp256k1_whitelist_signature_serialize(
|
|||||||
unsigned char *output,
|
unsigned char *output,
|
||||||
size_t *output_len,
|
size_t *output_len,
|
||||||
const secp256k1_whitelist_signature *sig
|
const secp256k1_whitelist_signature *sig
|
||||||
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
|
) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
|
||||||
|
|
||||||
/** Compute a whitelist signature
|
/** Compute a whitelist signature
|
||||||
* Returns 1: signature was successfully created
|
* Returns 1: signature was successfully created
|
||||||
|
@ -141,6 +141,10 @@ int secp256k1_whitelist_signature_parse(const secp256k1_context* ctx, secp256k1_
|
|||||||
ARG_CHECK(sig != NULL);
|
ARG_CHECK(sig != NULL);
|
||||||
ARG_CHECK(input != NULL);
|
ARG_CHECK(input != NULL);
|
||||||
|
|
||||||
|
if (input_len == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sig->n_keys = input[0];
|
sig->n_keys = input[0];
|
||||||
if (sig->n_keys >= MAX_KEYS || input_len != 1 + 32 * (sig->n_keys + 1)) {
|
if (sig->n_keys >= MAX_KEYS || input_len != 1 + 32 * (sig->n_keys + 1)) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -153,6 +157,7 @@ int secp256k1_whitelist_signature_parse(const secp256k1_context* ctx, secp256k1_
|
|||||||
int secp256k1_whitelist_signature_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *output_len, const secp256k1_whitelist_signature *sig) {
|
int secp256k1_whitelist_signature_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *output_len, const secp256k1_whitelist_signature *sig) {
|
||||||
VERIFY_CHECK(ctx != NULL);
|
VERIFY_CHECK(ctx != NULL);
|
||||||
ARG_CHECK(output != NULL);
|
ARG_CHECK(output != NULL);
|
||||||
|
ARG_CHECK(output_len != NULL);
|
||||||
ARG_CHECK(sig != NULL);
|
ARG_CHECK(sig != NULL);
|
||||||
|
|
||||||
if (*output_len < 1 + 32 * (sig->n_keys + 1)) {
|
if (*output_len < 1 + 32 * (sig->n_keys + 1)) {
|
||||||
|
@ -63,6 +63,7 @@ void test_whitelist_end_to_end(const size_t n_keys) {
|
|||||||
CHECK(secp256k1_whitelist_verify(ctx, &sig, offline_pubkeys, online_pubkeys, &sub_pubkey) != 1);
|
CHECK(secp256k1_whitelist_verify(ctx, &sig, offline_pubkeys, online_pubkeys, &sub_pubkey) != 1);
|
||||||
/* Serialization round trip */
|
/* Serialization round trip */
|
||||||
CHECK(secp256k1_whitelist_signature_serialize(ctx, serialized, &slen, &sig) == 1);
|
CHECK(secp256k1_whitelist_signature_serialize(ctx, serialized, &slen, &sig) == 1);
|
||||||
|
CHECK(slen == 33 + 32 * n_keys);
|
||||||
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen) == 1);
|
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen) == 1);
|
||||||
/* (Check various bad-length conditions) */
|
/* (Check various bad-length conditions) */
|
||||||
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen + 32) == 0);
|
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig1, serialized, slen + 32) == 0);
|
||||||
@ -87,23 +88,53 @@ void test_whitelist_end_to_end(const size_t n_keys) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void test_whitelist_bad_parse(void) {
|
void test_whitelist_bad_parse(void) {
|
||||||
const unsigned char serialized[] = {
|
|
||||||
/* Hash */
|
|
||||||
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|
||||||
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|
||||||
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|
||||||
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|
||||||
/* Length in excess of maximum */
|
|
||||||
0x00, 0x00, 0x01, 0x00
|
|
||||||
/* No room for s-values; parse should be rejected before reading past length */
|
|
||||||
};
|
|
||||||
secp256k1_whitelist_signature sig;
|
secp256k1_whitelist_signature sig;
|
||||||
|
|
||||||
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig, serialized, sizeof(serialized)) == 0);
|
const unsigned char serialized0[] = { 1+32*(0+1) };
|
||||||
|
const unsigned char serialized1[] = {
|
||||||
|
0x00,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06
|
||||||
|
};
|
||||||
|
const unsigned char serialized2[] = {
|
||||||
|
0x01,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Empty input */
|
||||||
|
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig, serialized0, 0) == 0);
|
||||||
|
/* Misses one byte of e0 */
|
||||||
|
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig, serialized1, sizeof(serialized1)) == 0);
|
||||||
|
/* Enough bytes for e0, but there is no s value */
|
||||||
|
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig, serialized2, sizeof(serialized2)) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_whitelist_bad_serialize(void) {
|
||||||
|
unsigned char serialized[] = {
|
||||||
|
0x00,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
|
||||||
|
};
|
||||||
|
size_t serialized_len;
|
||||||
|
secp256k1_whitelist_signature sig;
|
||||||
|
|
||||||
|
CHECK(secp256k1_whitelist_signature_parse(ctx, &sig, serialized, sizeof(serialized)) == 1);
|
||||||
|
serialized_len = sizeof(serialized) - 1;
|
||||||
|
/* Output buffer is one byte too short */
|
||||||
|
CHECK(secp256k1_whitelist_signature_serialize(ctx, serialized, &serialized_len, &sig) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void run_whitelist_tests(void) {
|
void run_whitelist_tests(void) {
|
||||||
int i;
|
int i;
|
||||||
|
test_whitelist_bad_parse();
|
||||||
|
test_whitelist_bad_serialize();
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
test_whitelist_end_to_end(1);
|
test_whitelist_end_to_end(1);
|
||||||
test_whitelist_end_to_end(10);
|
test_whitelist_end_to_end(10);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user