Skip to content

Commit bbb59ce

Browse files
karel-msjaeckel
authored andcommitted
failing wycheproof tests
1 parent 2e9f2b5 commit bbb59ce

File tree

1 file changed

+172
-0
lines changed

1 file changed

+172
-0
lines changed

tests/ecc_test.c

+172
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,177 @@ static int s_ecc_issue443_447(void)
332332
return CRYPT_OK;
333333
}
334334

335+
/* https://github.com/libtom/libtomcrypt/issues/446 */
336+
static int s_ecc_issue446(void)
337+
{
338+
const ltc_ecc_curve* cu;
339+
ecc_key key1, key2, key3, key4;
340+
int err, stat = 0;
341+
unsigned char hash[64];
342+
unsigned long hashlen;
343+
const unsigned char msg1[] = { 0x31,0x32,0x33,0x34,0x30,0x30 };
344+
const unsigned char msg2[] = { 0x36,0x39,0x38,0x31,0x39 };
345+
const unsigned char msg3[] = { 0x4d,0x73,0x67 };
346+
const unsigned char msg4[] = { 0x54,0x65,0x73,0x74 };
347+
const unsigned char pub1[] = {
348+
0x04, /* secp256r1 */
349+
0x29,0x27,0xb1,0x05,0x12,0xba,0xe3,0xed,0xdc,0xfe,0x46,0x78,0x28,0x12,0x8b,0xad,
350+
0x29,0x03,0x26,0x99,0x19,0xf7,0x08,0x60,0x69,0xc8,0xc4,0xdf,0x6c,0x73,0x28,0x38,
351+
0xc7,0x78,0x79,0x64,0xea,0xac,0x00,0xe5,0x92,0x1f,0xb1,0x49,0x8a,0x60,0xf4,0x60,
352+
0x67,0x66,0xb3,0xd9,0x68,0x50,0x01,0x55,0x8d,0x1a,0x97,0x4e,0x73,0x41,0x51,0x3e
353+
};
354+
const unsigned char pub2[] = {
355+
0x04, /* secp224r1 */
356+
0x53,0x88,0x35,0x38,0xd8,0x66,0x09,0x21,0x7a,0x4d,0x9c,0x27,0x99,0x2e,
357+
0x2b,0xd7,0x04,0xa4,0xbb,0x12,0xfb,0x91,0x25,0x3c,0xd4,0xf4,0x96,0xfa,
358+
0x00,0xb3,0x2f,0x3a,0x2d,0x15,0x3a,0x52,0xbb,0x57,0x76,0x50,0xcd,0xf1,
359+
0xb7,0x3a,0x34,0x05,0x35,0xc7,0xe7,0x3d,0xeb,0x59,0x9a,0xa9,0x50,0x88
360+
};
361+
const unsigned char pub3[] = {
362+
0x04, /* brainpoolP256r1 */
363+
0x30,0x29,0x1b,0xca,0x4e,0xb9,0x3c,0x41,0x99,0x1d,0xae,0xc0,0xfd,0x2e,0x87,0xc2,
364+
0x77,0x8d,0x95,0x8d,0x9a,0x8e,0x2f,0xa4,0xe6,0xd3,0x83,0x5d,0x48,0x5b,0xc2,0x3e,
365+
0x42,0x17,0xf6,0x84,0xcf,0xdd,0x83,0x6d,0x7c,0xf6,0x09,0x9a,0x34,0xc6,0x82,0x61,
366+
0xe5,0xa0,0x94,0xad,0xb5,0xb3,0xe4,0xa9,0x26,0x2f,0xf5,0x95,0x7c,0x1b,0x1b,0xa8
367+
};
368+
const unsigned char pub4[] = {
369+
0x04, /* brainpoolP256t1 */
370+
0x44,0x24,0xf0,0x9e,0x4f,0x86,0x92,0x31,0xe4,0x7b,0x1e,0x34,0x26,0xec,0x26,0x9e,
371+
0x5b,0xef,0x19,0xec,0x64,0xcc,0x96,0xda,0x5b,0x2e,0xfd,0xd2,0x11,0x6b,0x83,0xf0,
372+
0x7a,0x86,0x3d,0x25,0x74,0x3b,0xb2,0x60,0xa6,0x38,0xde,0x64,0x97,0x96,0xc6,0x76,
373+
0xe1,0x38,0x05,0x86,0x5c,0x8b,0xb9,0xda,0xc3,0x8e,0x16,0xfa,0xe5,0x4b,0x0c,0xef
374+
};
375+
/* msg1+pub1+sig1 test vector is from wycheproof/ecdsa_test VALID */
376+
const unsigned char sig1[] = {
377+
0x30,0x45,0x02,0x20,0x2b,0xa3,0xa8,0xbe,0x6b,0x94,0xd5,0xec,0x80,0xa6,0xd9,0xd1,0x19,0x0a,
378+
0x43,0x6e,0xff,0xe5,0x0d,0x85,0xa1,0xee,0xe8,0x59,0xb8,0xcc,0x6a,0xf9,0xbd,0x5c,0x2e,0x18,
379+
0x02,0x21,0x00,0xb3,0x29,0xf4,0x79,0xa2,0xbb,0xd0,0xa5,0xc3,0x84,0xee,0x14,0x93,0xb1,0xf5,
380+
0x18,0x6a,0x87,0x13,0x9c,0xac,0x5d,0xf4,0x08,0x7c,0x13,0x4b,0x49,0x15,0x68,0x47,0xdb
381+
};
382+
/* msg1+pub1+sig2 test vector is from wycheproof/ecdsa_test INVALID (changing tag value of sequence) */
383+
const unsigned char sig2[] = {
384+
0x31,0x45,0x02,0x20,0x2b,0xa3,0xa8,0xbe,0x6b,0x94,0xd5,0xec,0x80,0xa6,0xd9,0xd1,0x19,0x0a,
385+
0x43,0x6e,0xff,0xe5,0x0d,0x85,0xa1,0xee,0xe8,0x59,0xb8,0xcc,0x6a,0xf9,0xbd,0x5c,0x2e,0x18,
386+
0x02,0x21,0x00,0xb3,0x29,0xf4,0x79,0xa2,0xbb,0xd0,0xa5,0xc3,0x84,0xee,0x14,0x93,0xb1,0xf5,
387+
0x18,0x6a,0x87,0x13,0x9c,0xac,0x5d,0xf4,0x08,0x7c,0x13,0x4b,0x49,0x15,0x68,0x47,0xdb
388+
};
389+
/* msg2+pub1+sig3 test vector is from wycheproof/ecdsa_test VALID (Edge case for Shamir multiplication) */
390+
const unsigned char sig3[] = {
391+
0x30,0x44,0x02,0x20,0x64,0xa1,0xaa,0xb5,0x00,0x0d,0x0e,0x80,0x4f,0x3e,0x2f,0xc0,0x2b,0xde,
392+
0xe9,0xbe,0x8f,0xf3,0x12,0x33,0x4e,0x2b,0xa1,0x6d,0x11,0x54,0x7c,0x97,0x71,0x1c,0x89,0x8e,
393+
0x02,0x20,0x6a,0xf0,0x15,0x97,0x1c,0xc3,0x0b,0xe6,0xd1,0xa2,0x06,0xd4,0xe0,0x13,0xe0,0x99,
394+
0x77,0x72,0xa2,0xf9,0x1d,0x73,0x28,0x6f,0xfd,0x68,0x3b,0x9b,0xb2,0xcf,0x4f,0x1b
395+
};
396+
/* msg1+pub1+sig4 test vector is from wycheproof/ecdsa_test INVALID (long form encoding of length) */
397+
const unsigned char sig4[] = {
398+
0x30,0x81,0x45,0x02,0x20,0x2b,0xa3,0xa8,0xbe,0x6b,0x94,0xd5,0xec,0x80,0xa6,0xd9,0xd1,0x19,
399+
0x0a,0x43,0x6e,0xff,0xe5,0x0d,0x85,0xa1,0xee,0xe8,0x59,0xb8,0xcc,0x6a,0xf9,0xbd,0x5c,0x2e,
400+
0x18,0x02,0x21,0x00,0xb3,0x29,0xf4,0x79,0xa2,0xbb,0xd0,0xa5,0xc3,0x84,0xee,0x14,0x93,0xb1,
401+
0xf5,0x18,0x6a,0x87,0x13,0x9c,0xac,0x5d,0xf4,0x08,0x7c,0x13,0x4b,0x49,0x15,0x68,0x47,0xdb
402+
};
403+
/* msg1+pub1+sig5 test vector is from wycheproof/ecdsa_test INVALID (length contains leading 0) */
404+
const unsigned char sig5[] = {
405+
0x30,0x82,0x00,0x45,0x02,0x20,0x2b,0xa3,0xa8,0xbe,0x6b,0x94,0xd5,0xec,0x80,0xa6,0xd9,0xd1,
406+
0x19,0x0a,0x43,0x6e,0xff,0xe5,0x0d,0x85,0xa1,0xee,0xe8,0x59,0xb8,0xcc,0x6a,0xf9,0xbd,0x5c,
407+
0x2e,0x18,0x02,0x21,0x00,0xb3,0x29,0xf4,0x79,0xa2,0xbb,0xd0,0xa5,0xc3,0x84,0xee,0x14,0x93,
408+
0xb1,0xf5,0x18,0x6a,0x87,0x13,0x9c,0xac,0x5d,0xf4,0x08,0x7c,0x13,0x4b,0x49,0x15,0x68,0x47,0xdb
409+
};
410+
/* msg3+pub2+sig6 test vector is from wycheproof/ecdsa_test VALID (extreme value for k and edgecase s) */
411+
const unsigned char sig6[] = {
412+
0x30,0x3c,0x02,0x1c,0x70,0x6a,0x46,0xdc,0x76,0xdc,0xb7,0x67,0x98,0xe6,0x0e,0x6d,0x89,0x47,0x47,0x88,0xd1,
413+
0x6d,0xc1,0x80,0x32,0xd2,0x68,0xfd,0x1a,0x70,0x4f,0xa6,0x02,0x1c,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
414+
0x55,0x55,0x55,0x55,0x55,0x55,0x07,0x8b,0xa0,0x3d,0xa5,0x6a,0x06,0x9f,0x0d,0xc1,0xc9,0x74,0x0e,0x14
415+
};
416+
/* msg4+pub3+sig7 test vector is from wycheproof/ecdsa_test VALID (extreme value for k) */
417+
const unsigned char sig7[] = {
418+
0x30,0x44,0x02,0x20,0x74,0x3c,0xf1,0xb8,0xb5,0xcd,0x4f,0x2e,0xb5,0x5f,0x8a,0xa3,0x69,0x59,
419+
0x3a,0xc4,0x36,0xef,0x04,0x41,0x66,0x69,0x9e,0x37,0xd5,0x1a,0x14,0xc2,0xce,0x13,0xea,0x0e,
420+
0x02,0x20,0x77,0x47,0x2d,0x9a,0x28,0xb4,0xec,0xe7,0x1c,0xf4,0x13,0xa6,0x8e,0xac,0x0e,0xb4,
421+
0x23,0xa1,0x6f,0xb4,0x62,0xb1,0xf4,0x87,0x06,0xfe,0xd4,0x8c,0xa4,0x37,0xbd,0x2d
422+
};
423+
/* msg4+pub4+sig8 test vector is from wycheproof/ecdsa_test VALID (extreme value for k and s^-1) */
424+
const unsigned char sig8[] = {
425+
0x30,0x45,0x02,0x21,0x00,0x83,0x38,0x42,0x7c,0x7c,0xf4,0xd1,0x1c,0xb9,0x81,0xd9,0xb1,0x87,
426+
0x93,0xe3,0x77,0x9c,0x49,0x4c,0x50,0x2c,0x75,0xbd,0x73,0x9e,0x57,0x8d,0xe2,0xa7,0x00,0x57,
427+
0x8d,0x02,0x20,0x30,0x90,0xf4,0x87,0xe5,0x1f,0x9e,0x35,0xc8,0xaf,0x70,0xbb,0x9a,0xb7,0xdf,
428+
0x45,0x03,0x7e,0x23,0x0a,0x33,0xd2,0xc1,0xfd,0x96,0xe4,0x04,0x25,0x4f,0xcb,0x86,0x79
429+
};
430+
431+
DO(ecc_find_curve("secp256r1", &cu));
432+
DO(ecc_set_curve(cu, &key1));
433+
DO(ecc_set_key(pub1, sizeof(pub1), PK_PUBLIC, &key1));
434+
435+
DO(ecc_find_curve("secp224r1", &cu));
436+
DO(ecc_set_curve(cu, &key2));
437+
DO(ecc_set_key(pub2, sizeof(pub2), PK_PUBLIC, &key2));
438+
439+
DO(ecc_find_curve("brainpoolP256r1", &cu));
440+
DO(ecc_set_curve(cu, &key3));
441+
DO(ecc_set_key(pub3, sizeof(pub3), PK_PUBLIC, &key3));
442+
443+
DO(ecc_find_curve("brainpoolP256t1", &cu));
444+
DO(ecc_set_curve(cu, &key4));
445+
DO(ecc_set_key(pub4, sizeof(pub4), PK_PUBLIC, &key4));
446+
447+
hashlen = sizeof(hash);
448+
DO(hash_memory(find_hash("sha256"), msg1, sizeof(msg1), hash, &hashlen));
449+
DO(ecc_verify_hash(sig1, sizeof(sig1), hash, hashlen, &stat, &key1));
450+
if (stat != 1) return CRYPT_FAIL_TESTVECTOR; /* expected result: VALID */
451+
452+
err = ecc_verify_hash(sig2, sizeof(sig2), hash, hashlen, &stat, &key1);
453+
if (err == CRYPT_OK && stat == 1) {
454+
fprintf(stderr, "XXX-TODO should fail - wycheproof / changing tag value of sequence\n");
455+
/* return CRYPT_FAIL_TESTVECTOR; / * expected result: INVALID */
456+
}
457+
458+
err = ecc_verify_hash(sig4, sizeof(sig4), hash, hashlen, &stat, &key1);
459+
if (err == CRYPT_OK && stat == 1) {
460+
fprintf(stderr, "XXX-TODO should fail - wycheproof / long form encoding of length\n");
461+
/* return CRYPT_FAIL_TESTVECTOR; / * expected result: INVALID */
462+
}
463+
464+
err = ecc_verify_hash(sig5, sizeof(sig5), hash, hashlen, &stat, &key1);
465+
if (err == CRYPT_OK && stat == 1) {
466+
fprintf(stderr, "XXX-TODO should fail - wycheproof / length contains leading 0\n");
467+
/* return CRYPT_FAIL_TESTVECTOR; / * expected result: INVALID */
468+
}
469+
470+
hashlen = sizeof(hash);
471+
DO(hash_memory(find_hash("sha256"), msg2, sizeof(msg2), hash, &hashlen));
472+
DO(ecc_verify_hash(sig3, sizeof(sig3), hash, hashlen, &stat, &key1));
473+
if (stat != 1) {
474+
fprintf(stderr, "XXX-TODO should be valid - wycheproof / Edge case for Shamir multiplication\n");
475+
/* return CRYPT_FAIL_TESTVECTOR; / * expected result: VALID */
476+
}
477+
478+
hashlen = sizeof(hash);
479+
DO(hash_memory(find_hash("sha224"), msg3, sizeof(msg3), hash, &hashlen));
480+
DO(ecc_verify_hash(sig6, sizeof(sig6), hash, hashlen, &stat, &key2));
481+
if (stat != 1) {
482+
fprintf(stderr, "XXX-TODO should be valid - wycheproof / extreme value for k and edgecase s\n");
483+
/* return CRYPT_FAIL_TESTVECTOR; / * expected result: VALID */
484+
}
485+
486+
hashlen = sizeof(hash);
487+
DO(hash_memory(find_hash("sha256"), msg4, sizeof(msg4), hash, &hashlen));
488+
DO(ecc_verify_hash(sig7, sizeof(sig7), hash, hashlen, &stat, &key3));
489+
if (stat != 1) {
490+
fprintf(stderr, "XXX-TODO should be valid - wycheproof / extreme value for k\n");
491+
/* return CRYPT_FAIL_TESTVECTOR; / * expected result: VALID */
492+
}
493+
DO(ecc_verify_hash(sig8, sizeof(sig8), hash, hashlen, &stat, &key4));
494+
if (stat != 1) {
495+
fprintf(stderr, "XXX-TODO should be valid - wycheproof / extreme value for k and s^-1\n");
496+
/* return CRYPT_FAIL_TESTVECTOR; / * expected result: VALID */
497+
}
498+
499+
ecc_free(&key1);
500+
ecc_free(&key2);
501+
ecc_free(&key3);
502+
ecc_free(&key4);
503+
return CRYPT_OK;
504+
}
505+
335506
static int s_ecc_test_mp(void)
336507
{
337508
void *a, *modulus, *order;
@@ -1630,6 +1801,7 @@ int ecc_test(void)
16301801
DO(s_ecc_issue108());
16311802
DO(s_ecc_issue443_447());
16321803
DO(s_ecc_issue630());
1804+
DO(s_ecc_issue446());
16331805
#ifdef LTC_ECC_SHAMIR
16341806
DO(s_ecc_test_shamir());
16351807
DO(s_ecc_test_recovery());

0 commit comments

Comments
 (0)