|
31 | 31 | #include <stdio.h> |
32 | 32 | #include <wolfssh/ssh.h> |
33 | 33 | #include <wolfssh/keygen.h> |
| 34 | +#include <wolfssh/error.h> |
34 | 35 | #include <wolfssh/internal.h> |
| 36 | +#include <wolfssl/wolfcrypt/random.h> |
| 37 | +#include <wolfssl/wolfcrypt/integer.h> |
35 | 38 | #include <wolfssl/wolfcrypt/hmac.h> |
36 | 39 |
|
37 | 40 | #define WOLFSSH_TEST_HEX2BIN |
@@ -439,6 +442,191 @@ static int test_DoReceive_VerifyMacFailure(void) |
439 | 442 | #endif /* WOLFSSH_TEST_INTERNAL && any HMAC SHA variant enabled */ |
440 | 443 |
|
441 | 444 |
|
| 445 | +#if defined(WOLFSSH_TEST_INTERNAL) && !defined(WOLFSSH_NO_DH_GEX_SHA256) |
| 446 | + |
| 447 | +typedef struct { |
| 448 | + const char* candidate; |
| 449 | + const char* generator; |
| 450 | + word32 minBits; |
| 451 | + word32 maxBits; |
| 452 | + int expectedResult; |
| 453 | +} PrimeTestVector; |
| 454 | + |
| 455 | +static const PrimeTestVector primeTestVectors[] = { |
| 456 | + { |
| 457 | + /* |
| 458 | + * For testing the ValidateKexDhGexGroup() function, we need to |
| 459 | + * verify that the function detects unsafe primes. The following |
| 460 | + * unsafe prime is the prime used with GOST-ECC. (RFC 7836) It is |
| 461 | + * prime and fine for its application. It isn't safe for DH, as |
| 462 | + * q = (p-1)/2 is not prime. |
| 463 | + */ |
| 464 | + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" |
| 465 | + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc7", |
| 466 | + "02", |
| 467 | + 512, 8192, WS_CRYPTO_FAILED |
| 468 | + }, |
| 469 | + { |
| 470 | + /* |
| 471 | + * We need to verify that the function detects safe primes. The |
| 472 | + * following safePrime is the MODP 2048-bit group from RFC 3526. |
| 473 | + */ |
| 474 | + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74" |
| 475 | + "020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437" |
| 476 | + "4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed" |
| 477 | + "ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05" |
| 478 | + "98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb" |
| 479 | + "9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b" |
| 480 | + "e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718" |
| 481 | + "3995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff", |
| 482 | + "02", |
| 483 | + 2048, 8192, WS_SUCCESS |
| 484 | + }, |
| 485 | + { |
| 486 | + /* |
| 487 | + * This checks for g = p - 1. |
| 488 | + */ |
| 489 | + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74" |
| 490 | + "020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437" |
| 491 | + "4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed" |
| 492 | + "ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05" |
| 493 | + "98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb" |
| 494 | + "9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b" |
| 495 | + "e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718" |
| 496 | + "3995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff", |
| 497 | + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74" |
| 498 | + "020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437" |
| 499 | + "4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed" |
| 500 | + "ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05" |
| 501 | + "98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb" |
| 502 | + "9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b" |
| 503 | + "e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718" |
| 504 | + "3995497cea956ae515d2261898fa051015728e5a8aacaa68fffffffffffffffe", |
| 505 | + 2048, 8192, WS_CRYPTO_FAILED |
| 506 | + }, |
| 507 | + { |
| 508 | + /* |
| 509 | + * This checks for g = 1. |
| 510 | + */ |
| 511 | + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74" |
| 512 | + "020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437" |
| 513 | + "4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed" |
| 514 | + "ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05" |
| 515 | + "98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb" |
| 516 | + "9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b" |
| 517 | + "e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718" |
| 518 | + "3995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff", |
| 519 | + "01", |
| 520 | + 2048, 8192, WS_CRYPTO_FAILED |
| 521 | + }, |
| 522 | + { |
| 523 | + /* |
| 524 | + * This checks prime size less than minBits. |
| 525 | + */ |
| 526 | + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74" |
| 527 | + "020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437" |
| 528 | + "4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed" |
| 529 | + "ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05" |
| 530 | + "98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb" |
| 531 | + "9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b" |
| 532 | + "e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718" |
| 533 | + "3995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff", |
| 534 | + "02", |
| 535 | + 3072, 8192, WS_DH_SIZE_E |
| 536 | + }, |
| 537 | + { |
| 538 | + /* |
| 539 | + * This checks prime size greater than maxBits. |
| 540 | + */ |
| 541 | + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74" |
| 542 | + "020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437" |
| 543 | + "4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed" |
| 544 | + "ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05" |
| 545 | + "98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb" |
| 546 | + "9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b" |
| 547 | + "e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718" |
| 548 | + "3995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff", |
| 549 | + "02", |
| 550 | + 512, 1024, WS_DH_SIZE_E |
| 551 | + }, |
| 552 | + { |
| 553 | + /* |
| 554 | + * This checks for even p. |
| 555 | + */ |
| 556 | + "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74" |
| 557 | + "020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f1437" |
| 558 | + "4fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed" |
| 559 | + "ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf05" |
| 560 | + "98da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb" |
| 561 | + "9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3b" |
| 562 | + "e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf695581718" |
| 563 | + "3995497cea956ae515d2261898fa051015728e5a8aacaa68fffffffffffffffe", |
| 564 | + "02", |
| 565 | + 2048, 8192, WS_CRYPTO_FAILED |
| 566 | + }, |
| 567 | + { |
| 568 | + /* |
| 569 | + * A well known composite number that breaks some MR implementations. |
| 570 | + * This is calculated by wolfCrypt for one of its prime tests. |
| 571 | + */ |
| 572 | + "000000000088cbf655be37a612fa535b4a9b81d394854ecbedfe1a4afbecdc7b" |
| 573 | + "a6a263549dd3c17882b054329384962576e7c5aa281e04ab5a0e7245584ad324" |
| 574 | + "9c7ac4de7caf5663bae95f6bb9e8bec4124e04d82eac54a246bda49a5c5c2a1b" |
| 575 | + "366ef8c085fc7c5f87478a55832d1b2184154c24260df67561d17c4359724403", |
| 576 | + "02", |
| 577 | + 512, 8192, WS_CRYPTO_FAILED |
| 578 | + }, |
| 579 | +}; |
| 580 | + |
| 581 | +static int test_DhGexGroupValidate(void) |
| 582 | +{ |
| 583 | + WC_RNG rng; |
| 584 | + const PrimeTestVector* tv; |
| 585 | + byte* candidate; |
| 586 | + byte* generator; |
| 587 | + word32 candidateSz; |
| 588 | + word32 generatorSz; |
| 589 | + int tc = (int)(sizeof(primeTestVectors)/sizeof(primeTestVectors[0])); |
| 590 | + int result = 0, ret, i; |
| 591 | + |
| 592 | + if (wc_InitRng(&rng) != 0) { |
| 593 | + printf("DhGexGroupValidate: wc_InitRng failed\n"); |
| 594 | + return -110; |
| 595 | + } |
| 596 | + |
| 597 | + for (i = 0, tv = primeTestVectors; i < tc; i++, tv++) { |
| 598 | + candidate = NULL; |
| 599 | + candidateSz = 0; |
| 600 | + generator = NULL; |
| 601 | + generatorSz = 0; |
| 602 | + |
| 603 | + ret = ConvertHexToBin(tv->candidate, &candidate, &candidateSz, |
| 604 | + tv->generator, &generator, &generatorSz, |
| 605 | + NULL, NULL, NULL, NULL, NULL, NULL); |
| 606 | + if (ret != 0) { |
| 607 | + result = -113; |
| 608 | + break; |
| 609 | + } |
| 610 | + |
| 611 | + ret = wolfSSH_TestValidateKexDhGexGroup(candidate, candidateSz, |
| 612 | + generator, generatorSz, tv->minBits, tv->maxBits, &rng); |
| 613 | + if (ret != tv->expectedResult) { |
| 614 | + printf("DhGexGroupValidate: %d validator returned %d, expected %d\n", |
| 615 | + i, ret, tv->expectedResult); |
| 616 | + result = -121; |
| 617 | + break; |
| 618 | + } |
| 619 | + |
| 620 | + FreeBins(candidate, generator, NULL, NULL); |
| 621 | + } |
| 622 | + |
| 623 | + wc_FreeRng(&rng); |
| 624 | + return result; |
| 625 | +} |
| 626 | + |
| 627 | +#endif /* WOLFSSH_TEST_INTERNAL && !WOLFSSH_NO_DH_GEX_SHA256 */ |
| 628 | + |
| 629 | + |
442 | 630 | /* Error Code And Message Test */ |
443 | 631 |
|
444 | 632 | static int test_Errors(void) |
@@ -520,6 +708,13 @@ int wolfSSH_UnitTest(int argc, char** argv) |
520 | 708 | testResult = testResult || unitResult; |
521 | 709 | #endif |
522 | 710 |
|
| 711 | +#if defined(WOLFSSH_TEST_INTERNAL) && !defined(WOLFSSH_NO_DH_GEX_SHA256) |
| 712 | + unitResult = test_DhGexGroupValidate(); |
| 713 | + printf("DhGexGroupValidate: %s\n", |
| 714 | + (unitResult == 0 ? "SUCCESS" : "FAILED")); |
| 715 | + testResult = testResult || unitResult; |
| 716 | +#endif |
| 717 | + |
523 | 718 | #ifdef WOLFSSH_KEYGEN |
524 | 719 | #ifndef WOLFSSH_NO_RSA |
525 | 720 | unitResult = test_RsaKeyGen(); |
|
0 commit comments