| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 | 4 |
| 5 /* | 5 /* |
| 6 * RSA key generation, public key op, private key op. | 6 * RSA key generation, public key op, private key op. |
| 7 */ | 7 */ |
| 8 #ifdef FREEBL_NO_DEPEND | 8 #ifdef FREEBL_NO_DEPEND |
| 9 #include "stubs.h" | 9 #include "stubs.h" |
| 10 #endif | 10 #endif |
| (...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1399 CHECK_MPI_OK( mp_init(&q) ); | 1399 CHECK_MPI_OK( mp_init(&q) ); |
| 1400 CHECK_MPI_OK( mp_init(&n) ); | 1400 CHECK_MPI_OK( mp_init(&n) ); |
| 1401 CHECK_MPI_OK( mp_init(&psub1)); | 1401 CHECK_MPI_OK( mp_init(&psub1)); |
| 1402 CHECK_MPI_OK( mp_init(&qsub1)); | 1402 CHECK_MPI_OK( mp_init(&qsub1)); |
| 1403 CHECK_MPI_OK( mp_init(&e) ); | 1403 CHECK_MPI_OK( mp_init(&e) ); |
| 1404 CHECK_MPI_OK( mp_init(&d) ); | 1404 CHECK_MPI_OK( mp_init(&d) ); |
| 1405 CHECK_MPI_OK( mp_init(&d_p) ); | 1405 CHECK_MPI_OK( mp_init(&d_p) ); |
| 1406 CHECK_MPI_OK( mp_init(&d_q) ); | 1406 CHECK_MPI_OK( mp_init(&d_q) ); |
| 1407 CHECK_MPI_OK( mp_init(&qInv) ); | 1407 CHECK_MPI_OK( mp_init(&qInv) ); |
| 1408 CHECK_MPI_OK( mp_init(&res) ); | 1408 CHECK_MPI_OK( mp_init(&res) ); |
| 1409 |
| 1410 if (!key->modulus.data || !key->prime1.data || !key->prime2.data || |
| 1411 !key->publicExponent.data || !key->privateExponent.data || |
| 1412 !key->exponent1.data || !key->exponent2.data || |
| 1413 !key->coefficient.data) { |
| 1414 /*call RSA_PopulatePrivateKey first, if the application wishes to |
| 1415 * recover these parameters */ |
| 1416 err = MP_BADARG; |
| 1417 goto cleanup; |
| 1418 } |
| 1419 |
| 1409 SECITEM_TO_MPINT(key->modulus, &n); | 1420 SECITEM_TO_MPINT(key->modulus, &n); |
| 1410 SECITEM_TO_MPINT(key->prime1, &p); | 1421 SECITEM_TO_MPINT(key->prime1, &p); |
| 1411 SECITEM_TO_MPINT(key->prime2, &q); | 1422 SECITEM_TO_MPINT(key->prime2, &q); |
| 1412 SECITEM_TO_MPINT(key->publicExponent, &e); | 1423 SECITEM_TO_MPINT(key->publicExponent, &e); |
| 1413 SECITEM_TO_MPINT(key->privateExponent, &d); | 1424 SECITEM_TO_MPINT(key->privateExponent, &d); |
| 1414 SECITEM_TO_MPINT(key->exponent1, &d_p); | 1425 SECITEM_TO_MPINT(key->exponent1, &d_p); |
| 1415 SECITEM_TO_MPINT(key->exponent2, &d_q); | 1426 SECITEM_TO_MPINT(key->exponent2, &d_q); |
| 1416 SECITEM_TO_MPINT(key->coefficient, &qInv); | 1427 SECITEM_TO_MPINT(key->coefficient, &qInv); |
| 1417 /* p > q */ | 1428 /* p > q */ |
| 1418 if (mp_cmp(&p, &q) <= 0) { | 1429 if (mp_cmp(&p, &q) <= 0) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1451 CHECK_MPI_OK( mp_sub_d(&q, 1, &qsub1) ); | 1462 CHECK_MPI_OK( mp_sub_d(&q, 1, &qsub1) ); |
| 1452 CHECK_MPI_OK( mp_gcd(&e, &qsub1, &res) ); | 1463 CHECK_MPI_OK( mp_gcd(&e, &qsub1, &res) ); |
| 1453 VERIFY_MPI_EQUAL_1(&res); | 1464 VERIFY_MPI_EQUAL_1(&res); |
| 1454 /* d*e == 1 mod p-1 */ | 1465 /* d*e == 1 mod p-1 */ |
| 1455 CHECK_MPI_OK( mp_mulmod(&d, &e, &psub1, &res) ); | 1466 CHECK_MPI_OK( mp_mulmod(&d, &e, &psub1, &res) ); |
| 1456 VERIFY_MPI_EQUAL_1(&res); | 1467 VERIFY_MPI_EQUAL_1(&res); |
| 1457 /* d*e == 1 mod q-1 */ | 1468 /* d*e == 1 mod q-1 */ |
| 1458 CHECK_MPI_OK( mp_mulmod(&d, &e, &qsub1, &res) ); | 1469 CHECK_MPI_OK( mp_mulmod(&d, &e, &qsub1, &res) ); |
| 1459 VERIFY_MPI_EQUAL_1(&res); | 1470 VERIFY_MPI_EQUAL_1(&res); |
| 1460 /* | 1471 /* |
| 1461 * The following errors can be recovered from. | 1472 * The following errors can be recovered from. However, the purpose of this |
| 1473 * function is to check consistency, so they are not. |
| 1462 */ | 1474 */ |
| 1463 /* d_p == d mod p-1 */ | 1475 /* d_p == d mod p-1 */ |
| 1464 CHECK_MPI_OK( mp_mod(&d, &psub1, &res) ); | 1476 CHECK_MPI_OK( mp_mod(&d, &psub1, &res) ); |
| 1465 if (mp_cmp(&d_p, &res) != 0) { | 1477 VERIFY_MPI_EQUAL(&res, &d_p); |
| 1466 » /* swap in the correct value */ | |
| 1467 » CHECK_SEC_OK( swap_in_key_value(key->arena, &res, &key->exponent1) ); | |
| 1468 } | |
| 1469 /* d_q == d mod q-1 */ | 1478 /* d_q == d mod q-1 */ |
| 1470 CHECK_MPI_OK( mp_mod(&d, &qsub1, &res) ); | 1479 CHECK_MPI_OK( mp_mod(&d, &qsub1, &res) ); |
| 1471 if (mp_cmp(&d_q, &res) != 0) { | 1480 VERIFY_MPI_EQUAL(&res, &d_q); |
| 1472 » /* swap in the correct value */ | |
| 1473 » CHECK_SEC_OK( swap_in_key_value(key->arena, &res, &key->exponent2) ); | |
| 1474 } | |
| 1475 /* q * q**-1 == 1 mod p */ | 1481 /* q * q**-1 == 1 mod p */ |
| 1476 CHECK_MPI_OK( mp_mulmod(&q, &qInv, &p, &res) ); | 1482 CHECK_MPI_OK( mp_mulmod(&q, &qInv, &p, &res) ); |
| 1477 if (mp_cmp_d(&res, 1) != 0) { | 1483 VERIFY_MPI_EQUAL_1(&res); |
| 1478 » /* compute the correct value */ | 1484 |
| 1479 » CHECK_MPI_OK( mp_invmod(&q, &p, &qInv) ); | |
| 1480 » CHECK_SEC_OK( swap_in_key_value(key->arena, &qInv, &key->coefficient) ); | |
| 1481 } | |
| 1482 cleanup: | 1485 cleanup: |
| 1483 mp_clear(&n); | 1486 mp_clear(&n); |
| 1484 mp_clear(&p); | 1487 mp_clear(&p); |
| 1485 mp_clear(&q); | 1488 mp_clear(&q); |
| 1486 mp_clear(&psub1); | 1489 mp_clear(&psub1); |
| 1487 mp_clear(&qsub1); | 1490 mp_clear(&qsub1); |
| 1488 mp_clear(&e); | 1491 mp_clear(&e); |
| 1489 mp_clear(&d); | 1492 mp_clear(&d); |
| 1490 mp_clear(&d_p); | 1493 mp_clear(&d_p); |
| 1491 mp_clear(&d_q); | 1494 mp_clear(&d_q); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1569 PRBool bl_parentForkedAfterC_Initialize; | 1572 PRBool bl_parentForkedAfterC_Initialize; |
| 1570 | 1573 |
| 1571 /* | 1574 /* |
| 1572 * Set fork flag so it can be tested in SKIP_AFTER_FORK on relevant platforms. | 1575 * Set fork flag so it can be tested in SKIP_AFTER_FORK on relevant platforms. |
| 1573 */ | 1576 */ |
| 1574 void BL_SetForkState(PRBool forked) | 1577 void BL_SetForkState(PRBool forked) |
| 1575 { | 1578 { |
| 1576 bl_parentForkedAfterC_Initialize = forked; | 1579 bl_parentForkedAfterC_Initialize = forked; |
| 1577 } | 1580 } |
| 1578 | 1581 |
| OLD | NEW |