| OLD | NEW |
| 1 /* crypto/ecdsa/ecdsatest.c */ | 1 /* crypto/ecdsa/ecdsatest.c */ |
| 2 /* | 2 /* |
| 3 * Written by Nils Larsch for the OpenSSL project. | 3 * Written by Nils Larsch for the OpenSSL project. |
| 4 */ | 4 */ |
| 5 /* ==================================================================== | 5 /* ==================================================================== |
| 6 * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. |
| 7 * | 7 * |
| 8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
| 9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
| 10 * are met: | 10 * are met: |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 return 0; | 161 return 0; |
| 162 tmp = BN_new(); | 162 tmp = BN_new(); |
| 163 if (!tmp) | 163 if (!tmp) |
| 164 return 0; | 164 return 0; |
| 165 if (!BN_dec2bn(&tmp, numbers[fbytes_counter])) | 165 if (!BN_dec2bn(&tmp, numbers[fbytes_counter])) |
| 166 { | 166 { |
| 167 BN_free(tmp); | 167 BN_free(tmp); |
| 168 return 0; | 168 return 0; |
| 169 } | 169 } |
| 170 fbytes_counter ++; | 170 fbytes_counter ++; |
| 171 » ret = BN_bn2bin(tmp, buf);» | 171 » if (num != BN_num_bytes(tmp) || !BN_bn2bin(tmp, buf)) |
| 172 » if (ret == 0 || ret != num) | |
| 173 ret = 0; | 172 ret = 0; |
| 174 » else | 173 » else |
| 175 ret = 1; | 174 ret = 1; |
| 176 if (tmp) | 175 if (tmp) |
| 177 BN_free(tmp); | 176 BN_free(tmp); |
| 178 return ret; | 177 return ret; |
| 179 } | 178 } |
| 180 | 179 |
| 181 /* some tests from the X9.62 draft */ | 180 /* some tests from the X9.62 draft */ |
| 182 int x9_62_test_internal(BIO *out, int nid, const char *r_in, const char *s_in) | 181 int x9_62_test_internal(BIO *out, int nid, const char *r_in, const char *s_in) |
| 183 { | 182 { |
| 184 int ret = 0; | 183 int ret = 0; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 ret = 0; | 279 ret = 0; |
| 281 return ret; | 280 return ret; |
| 282 } | 281 } |
| 283 | 282 |
| 284 int test_builtin(BIO *out) | 283 int test_builtin(BIO *out) |
| 285 { | 284 { |
| 286 EC_builtin_curve *curves = NULL; | 285 EC_builtin_curve *curves = NULL; |
| 287 size_t crv_len = 0, n = 0; | 286 size_t crv_len = 0, n = 0; |
| 288 EC_KEY *eckey = NULL, *wrong_eckey = NULL; | 287 EC_KEY *eckey = NULL, *wrong_eckey = NULL; |
| 289 EC_GROUP *group; | 288 EC_GROUP *group; |
| 289 ECDSA_SIG *ecdsa_sig = NULL; |
| 290 unsigned char digest[20], wrong_digest[20]; | 290 unsigned char digest[20], wrong_digest[20]; |
| 291 » unsigned char» *signature = NULL; | 291 » unsigned char» *signature = NULL; |
| 292 » unsigned int» sig_len; | 292 » unsigned char» *sig_ptr; |
| 293 » unsigned char» *raw_buf = NULL; |
| 294 » unsigned int» sig_len, degree, r_len, s_len, bn_len, buf_len; |
| 293 int nid, ret = 0; | 295 int nid, ret = 0; |
| 294 | 296 |
| 295 /* fill digest values with some random data */ | 297 /* fill digest values with some random data */ |
| 296 if (!RAND_pseudo_bytes(digest, 20) || | 298 if (!RAND_pseudo_bytes(digest, 20) || |
| 297 !RAND_pseudo_bytes(wrong_digest, 20)) | 299 !RAND_pseudo_bytes(wrong_digest, 20)) |
| 298 { | 300 { |
| 299 BIO_printf(out, "ERROR: unable to get random data\n"); | 301 BIO_printf(out, "ERROR: unable to get random data\n"); |
| 300 goto builtin_err; | 302 goto builtin_err; |
| 301 } | 303 } |
| 302 | 304 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 332 continue; | 334 continue; |
| 333 /* create new ecdsa key (== EC_KEY) */ | 335 /* create new ecdsa key (== EC_KEY) */ |
| 334 if ((eckey = EC_KEY_new()) == NULL) | 336 if ((eckey = EC_KEY_new()) == NULL) |
| 335 goto builtin_err; | 337 goto builtin_err; |
| 336 group = EC_GROUP_new_by_curve_name(nid); | 338 group = EC_GROUP_new_by_curve_name(nid); |
| 337 if (group == NULL) | 339 if (group == NULL) |
| 338 goto builtin_err; | 340 goto builtin_err; |
| 339 if (EC_KEY_set_group(eckey, group) == 0) | 341 if (EC_KEY_set_group(eckey, group) == 0) |
| 340 goto builtin_err; | 342 goto builtin_err; |
| 341 EC_GROUP_free(group); | 343 EC_GROUP_free(group); |
| 342 » » if (EC_GROUP_get_degree(EC_KEY_get0_group(eckey)) < 160) | 344 » » degree = EC_GROUP_get_degree(EC_KEY_get0_group(eckey)); |
| 345 » » if (degree < 160) |
| 343 /* drop the curve */ | 346 /* drop the curve */ |
| 344 { | 347 { |
| 345 EC_KEY_free(eckey); | 348 EC_KEY_free(eckey); |
| 346 eckey = NULL; | 349 eckey = NULL; |
| 347 continue; | 350 continue; |
| 348 } | 351 } |
| 349 BIO_printf(out, "%s: ", OBJ_nid2sn(nid)); | 352 BIO_printf(out, "%s: ", OBJ_nid2sn(nid)); |
| 350 /* create key */ | 353 /* create key */ |
| 351 if (!EC_KEY_generate_key(eckey)) | 354 if (!EC_KEY_generate_key(eckey)) |
| 352 { | 355 { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 (void)BIO_flush(out); | 411 (void)BIO_flush(out); |
| 409 /* wrong digest */ | 412 /* wrong digest */ |
| 410 if (ECDSA_verify(0, wrong_digest, 20, signature, sig_len, | 413 if (ECDSA_verify(0, wrong_digest, 20, signature, sig_len, |
| 411 eckey) == 1) | 414 eckey) == 1) |
| 412 { | 415 { |
| 413 BIO_printf(out, " failed\n"); | 416 BIO_printf(out, " failed\n"); |
| 414 goto builtin_err; | 417 goto builtin_err; |
| 415 } | 418 } |
| 416 BIO_printf(out, "."); | 419 BIO_printf(out, "."); |
| 417 (void)BIO_flush(out); | 420 (void)BIO_flush(out); |
| 418 » » /* modify a single byte of the signature */ | 421 » » /* wrong length */ |
| 419 » » offset = signature[10] % sig_len; | 422 » » if (ECDSA_verify(0, digest, 20, signature, sig_len - 1, |
| 420 » » dirt = signature[11]; | 423 » » » eckey) == 1) |
| 421 » » signature[offset] ^= dirt ? dirt : 1; | 424 » » » { |
| 425 » » » BIO_printf(out, " failed\n"); |
| 426 » » » goto builtin_err; |
| 427 » » » } |
| 428 » » BIO_printf(out, "."); |
| 429 » » (void)BIO_flush(out); |
| 430 |
| 431 » » /* Modify a single byte of the signature: to ensure we don't |
| 432 » » * garble the ASN1 structure, we read the raw signature and |
| 433 » » * modify a byte in one of the bignums directly. */ |
| 434 » » sig_ptr = signature; |
| 435 » » if ((ecdsa_sig = d2i_ECDSA_SIG(NULL, &sig_ptr, sig_len)) == NULL
) |
| 436 » » » { |
| 437 » » » BIO_printf(out, " failed\n"); |
| 438 » » » goto builtin_err; |
| 439 » » » } |
| 440 |
| 441 » » /* Store the two BIGNUMs in raw_buf. */ |
| 442 » » r_len = BN_num_bytes(ecdsa_sig->r); |
| 443 » » s_len = BN_num_bytes(ecdsa_sig->s); |
| 444 » » bn_len = (degree + 7) / 8; |
| 445 » » if ((r_len > bn_len) || (s_len > bn_len)) |
| 446 » » » { |
| 447 » » » BIO_printf(out, " failed\n"); |
| 448 » » » goto builtin_err; |
| 449 » » » } |
| 450 » » buf_len = 2 * bn_len; |
| 451 » » if ((raw_buf = OPENSSL_malloc(buf_len)) == NULL) |
| 452 » » » goto builtin_err; |
| 453 » » /* Pad the bignums with leading zeroes. */ |
| 454 » » memset(raw_buf, 0, buf_len); |
| 455 » » BN_bn2bin(ecdsa_sig->r, raw_buf + bn_len - r_len); |
| 456 » » BN_bn2bin(ecdsa_sig->s, raw_buf + buf_len - s_len); |
| 457 |
| 458 » » /* Modify a single byte in the buffer. */ |
| 459 » » offset = raw_buf[10] % buf_len; |
| 460 » » dirt = raw_buf[11] ? raw_buf[11] : 1; |
| 461 » » raw_buf[offset] ^= dirt; |
| 462 » » /* Now read the BIGNUMs back in from raw_buf. */ |
| 463 » » if ((BN_bin2bn(raw_buf, bn_len, ecdsa_sig->r) == NULL) || |
| 464 » » » (BN_bin2bn(raw_buf + bn_len, bn_len, ecdsa_sig->s) == NU
LL)) |
| 465 » » » goto builtin_err; |
| 466 |
| 467 » » sig_ptr = signature; |
| 468 » » sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr); |
| 422 if (ECDSA_verify(0, digest, 20, signature, sig_len, eckey) == 1) | 469 if (ECDSA_verify(0, digest, 20, signature, sig_len, eckey) == 1) |
| 423 { | 470 { |
| 424 BIO_printf(out, " failed\n"); | 471 BIO_printf(out, " failed\n"); |
| 425 goto builtin_err; | 472 goto builtin_err; |
| 426 } | 473 } |
| 474 /* Sanity check: undo the modification and verify signature. */ |
| 475 raw_buf[offset] ^= dirt; |
| 476 if ((BN_bin2bn(raw_buf, bn_len, ecdsa_sig->r) == NULL) || |
| 477 (BN_bin2bn(raw_buf + bn_len, bn_len, ecdsa_sig->s) == NU
LL)) |
| 478 goto builtin_err; |
| 479 |
| 480 sig_ptr = signature; |
| 481 sig_len = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr); |
| 482 if (ECDSA_verify(0, digest, 20, signature, sig_len, eckey) != 1) |
| 483 { |
| 484 BIO_printf(out, " failed\n"); |
| 485 goto builtin_err; |
| 486 } |
| 427 BIO_printf(out, "."); | 487 BIO_printf(out, "."); |
| 428 (void)BIO_flush(out); | 488 (void)BIO_flush(out); |
| 429 | 489 |
| 430 BIO_printf(out, " ok\n"); | 490 BIO_printf(out, " ok\n"); |
| 431 /* cleanup */ | 491 /* cleanup */ |
| 492 /* clean bogus errors */ |
| 493 ERR_clear_error(); |
| 432 OPENSSL_free(signature); | 494 OPENSSL_free(signature); |
| 433 signature = NULL; | 495 signature = NULL; |
| 434 EC_KEY_free(eckey); | 496 EC_KEY_free(eckey); |
| 435 eckey = NULL; | 497 eckey = NULL; |
| 436 EC_KEY_free(wrong_eckey); | 498 EC_KEY_free(wrong_eckey); |
| 437 wrong_eckey = NULL; | 499 wrong_eckey = NULL; |
| 500 ECDSA_SIG_free(ecdsa_sig); |
| 501 ecdsa_sig = NULL; |
| 502 OPENSSL_free(raw_buf); |
| 503 raw_buf = NULL; |
| 438 } | 504 } |
| 439 | 505 |
| 440 ret = 1; | 506 ret = 1; |
| 441 builtin_err: | 507 builtin_err: |
| 442 if (eckey) | 508 if (eckey) |
| 443 EC_KEY_free(eckey); | 509 EC_KEY_free(eckey); |
| 444 if (wrong_eckey) | 510 if (wrong_eckey) |
| 445 EC_KEY_free(wrong_eckey); | 511 EC_KEY_free(wrong_eckey); |
| 512 if (ecdsa_sig) |
| 513 ECDSA_SIG_free(ecdsa_sig); |
| 446 if (signature) | 514 if (signature) |
| 447 OPENSSL_free(signature); | 515 OPENSSL_free(signature); |
| 516 if (raw_buf) |
| 517 OPENSSL_free(raw_buf); |
| 448 if (curves) | 518 if (curves) |
| 449 OPENSSL_free(curves); | 519 OPENSSL_free(curves); |
| 450 | 520 |
| 451 return ret; | 521 return ret; |
| 452 } | 522 } |
| 453 | 523 |
| 454 int main(void) | 524 int main(void) |
| 455 { | 525 { |
| 456 int ret = 1; | 526 int ret = 1; |
| 457 BIO *out; | 527 BIO *out; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 483 | 553 |
| 484 ret = 0; | 554 ret = 0; |
| 485 err: | 555 err: |
| 486 if (ret) | 556 if (ret) |
| 487 BIO_printf(out, "\nECDSA test failed\n"); | 557 BIO_printf(out, "\nECDSA test failed\n"); |
| 488 else | 558 else |
| 489 BIO_printf(out, "\nECDSA test passed\n"); | 559 BIO_printf(out, "\nECDSA test passed\n"); |
| 490 if (ret) | 560 if (ret) |
| 491 ERR_print_errors(out); | 561 ERR_print_errors(out); |
| 492 CRYPTO_cleanup_all_ex_data(); | 562 CRYPTO_cleanup_all_ex_data(); |
| 493 » ERR_remove_state(0); | 563 » ERR_remove_thread_state(NULL); |
| 494 ERR_free_strings(); | 564 ERR_free_strings(); |
| 495 CRYPTO_mem_leaks(out); | 565 CRYPTO_mem_leaks(out); |
| 496 if (out != NULL) | 566 if (out != NULL) |
| 497 BIO_free(out); | 567 BIO_free(out); |
| 498 return ret; | 568 return ret; |
| 499 } | 569 } |
| 500 #endif | 570 #endif |
| OLD | NEW |