GeezerVison is showing github.com — crypto: reject dh,x25519,x448 in {Sign,Verify}Final · nodejs/node@231ab78
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/crypto/crypto_sig.cc +20-13Lines changed: 20 additions & 13 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -92,12 +92,15 @@ std::unique_ptr<BackingStore> Node_SignFinal(Environment* env, | 92 | 92 | sig = ArrayBuffer::NewBackingStore(env->isolate(), sig_len); | 93 | 93 | } | 94 | 94 | EVPKeyCtxPointer pkctx(EVP_PKEY_CTX_new(pkey.get(), nullptr)); | 95 | | - if (pkctx && | 96 | | - EVP_PKEY_sign_init(pkctx.get()) && | | 95 | + if (pkctx && EVP_PKEY_sign_init(pkctx.get()) > 0 && | 97 | 96 | ApplyRSAOptions(pkey, pkctx.get(), padding, pss_salt_len) && | 98 | | - EVP_PKEY_CTX_set_signature_md(pkctx.get(), EVP_MD_CTX_md(mdctx.get())) && | 99 | | - EVP_PKEY_sign(pkctx.get(), static_cast<unsigned char*>(sig->Data()), | 100 | | - &sig_len, m, m_len)) { | | 97 | + EVP_PKEY_CTX_set_signature_md(pkctx.get(), EVP_MD_CTX_md(mdctx.get())) > | | 98 | + 0 && | | 99 | + EVP_PKEY_sign(pkctx.get(), | | 100 | + static_cast<unsigned char*>(sig->Data()), | | 101 | + &sig_len, | | 102 | + m, | | 103 | + m_len) > 0) { | 101 | 104 | CHECK_LE(sig_len, sig->ByteLength()); | 102 | 105 | if (sig_len == 0) { | 103 | 106 | sig = ArrayBuffer::NewBackingStore(env->isolate(), 0); | @@ -527,14 +530,18 @@ SignBase::Error Verify::VerifyFinal(const ManagedEVPPKey& pkey, | 527 | 530 | return kSignPublicKey; | 528 | 531 |
| 529 | 532 | EVPKeyCtxPointer pkctx(EVP_PKEY_CTX_new(pkey.get(), nullptr)); | 530 | | - if (pkctx && | 531 | | - EVP_PKEY_verify_init(pkctx.get()) > 0 && | 532 | | - ApplyRSAOptions(pkey, pkctx.get(), padding, saltlen) && | 533 | | - EVP_PKEY_CTX_set_signature_md(pkctx.get(), | 534 | | - EVP_MD_CTX_md(mdctx.get())) > 0) { | 535 | | - const unsigned char* s = sig.data<unsigned char>(); | 536 | | - const int r = EVP_PKEY_verify(pkctx.get(), s, sig.size(), m, m_len); | 537 | | - *verify_result = r == 1; | | 533 | + if (pkctx) { | | 534 | + const int init_ret = EVP_PKEY_verify_init(pkctx.get()); | | 535 | + if (init_ret == -2) { | | 536 | + return kSignPublicKey; | | 537 | + } | | 538 | + if (init_ret > 0 && ApplyRSAOptions(pkey, pkctx.get(), padding, saltlen) && | | 539 | + EVP_PKEY_CTX_set_signature_md(pkctx.get(), EVP_MD_CTX_md(mdctx.get())) > | | 540 | + 0) { | | 541 | + const unsigned char* s = sig.data<unsigned char>(); | | 542 | + const int r = EVP_PKEY_verify(pkctx.get(), s, sig.size(), m, m_len); | | 543 | + *verify_result = r == 1; | | 544 | + } | 538 | 545 | } | 539 | 546 |
| 540 | 547 | return kSignOk; | |
Collapse file Copy file name to clipboardExpand all lines: test/fixtures/keys/Makefile +8Lines changed: 8 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 25 | 25 | dh1024.pem \ | 26 | 26 | dh2048.pem \ | 27 | 27 | dherror.pem \ | | 28 | + dh_private.pem \ | | 29 | + dh_public.pem \ | 28 | 30 | dsa_params.pem \ | 29 | 31 | dsa_private.pem \ | 30 | 32 | dsa_private_encrypted.pem \ | @@ -597,6 +599,12 @@ dh2048.pem: | 597 | 599 | dherror.pem: dh1024.pem | 598 | 600 | sed 's/^[^-].*/AAAAAAAAAA/g' dh1024.pem > dherror.pem | 599 | 601 |
| | 602 | +dh_private.pem: | | 603 | + openssl genpkey -algorithm dh -out dh_private.pem -pkeyopt dh_param:ffdhe2048 | | 604 | + | | 605 | +dh_public.pem: dh_private.pem | | 606 | + openssl pkey -in dh_private.pem -pubout -out dh_public.pem | | 607 | + | 600 | 608 | dsa_params.pem: | 601 | 609 | openssl dsaparam -out dsa_params.pem 2048 | 602 | 610 |
| |
Collapse file Copy file name to clipboard +9Lines changed: 9 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +-----BEGIN PRIVATE KEY----- | | 2 | +MIIBPgIBADCCARcGCSqGSIb3DQEDATCCAQgCggEBAP//////////rfhUWKK7Spqv | | 3 | +3FYgJz088di5xYPOLTaVqeE2QRRkM/vMk53OJJs++X0v42NjDHXY9oGyAq7EYXrT | | 4 | +3x7V1f1lYSQz9R9fBm7QhWNlVT3tGvO1VxNef1fJNZhPDHDg5ot34qaJ2vPv6HId | | 5 | +8VihNq3nNTCsyk9IOnl6vAqxgrMk+2HRCKlLssjj+7lq2rdg1/RoHU9Co945TfSu | | 6 | +Vu3nY3K7GQsHp8juCm1wngL84c334uzANATNKDQvYZFy/pzphYP/jk8SMu7ygYPD | | 7 | +/jsbTG+tczu1/LwuwiAFxY7xg30Wg7LG80omwbLv+ohrQjhhKFyX//////////8C | | 8 | +AQIEHgIcKNGyhQRxIhVXoyktdymwbN6MgXv85vPax+8eqQ== | | 9 | +-----END PRIVATE KEY----- |
Collapse file Copy file name to clipboard +14Lines changed: 14 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +-----BEGIN PUBLIC KEY----- | | 2 | +MIICJTCCARcGCSqGSIb3DQEDATCCAQgCggEBAP//////////rfhUWKK7Spqv3FYg | | 3 | +Jz088di5xYPOLTaVqeE2QRRkM/vMk53OJJs++X0v42NjDHXY9oGyAq7EYXrT3x7V | | 4 | +1f1lYSQz9R9fBm7QhWNlVT3tGvO1VxNef1fJNZhPDHDg5ot34qaJ2vPv6HId8Vih | | 5 | +Nq3nNTCsyk9IOnl6vAqxgrMk+2HRCKlLssjj+7lq2rdg1/RoHU9Co945TfSuVu3n | | 6 | +Y3K7GQsHp8juCm1wngL84c334uzANATNKDQvYZFy/pzphYP/jk8SMu7ygYPD/jsb | | 7 | +TG+tczu1/LwuwiAFxY7xg30Wg7LG80omwbLv+ohrQjhhKFyX//////////8CAQID | | 8 | +ggEGAAKCAQEA2whDVdYtNbr/isSFdw7rOSdbmcWrxiX6ppqDZ6yp8XjUj3/CEf/P | | 9 | +60X7HndX+nXD7YaPtVZxktkIpArI7C+AH7fZxBduuv2eLnvYwK82jFHKe7zvfdMr | | 10 | +26akMCV0kBA3ktgcftHlqYsIj52BaJlG37FRha3SDOL2yJOij3hNQhHCXTWLg7tP | | 11 | +GtXmD202OoZ6Ll+LxBzBCFnxVauiKnzBGeawy4gDycUEHmq5oDRR68I2gmxmsLg5 | | 12 | +MQVAP5ljp+FEu4+TZm6hR4wQ5PRjCQ+teq+VqMro7EbbvZpn+X9kAgKSl2WDu0fT | | 13 | +FbUnBn3HPBmUa/Fv/ooXrlckTUDjLkbWZQ== | | 14 | +-----END PUBLIC KEY----- |
Collapse file Copy file name to clipboardExpand all lines: test/parallel/test-crypto-sign-verify.js +18Lines changed: 18 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -793,3 +793,21 @@ assert.throws( | 793 | 793 | }, { code: 'ERR_CRYPTO_UNSUPPORTED_OPERATION', message: 'Unsupported crypto operation' }); | 794 | 794 | } | 795 | 795 | } | | 796 | + | | 797 | +{ | | 798 | + // Dh, x25519 and x448 should not be used for signing/verifying | | 799 | + // https://github.com/nodejs/node/issues/53742 | | 800 | + for (const algo of ['dh', 'x25519', 'x448']) { | | 801 | + const privateKey = fixtures.readKey(`${algo}_private.pem`, 'ascii'); | | 802 | + const publicKey = fixtures.readKey(`${algo}_public.pem`, 'ascii'); | | 803 | + assert.throws(() => { | | 804 | + crypto.createSign('SHA256').update('Test123').sign(privateKey); | | 805 | + }, { code: 'ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE', message: /operation not supported for this keytype/ }); | | 806 | + assert.throws(() => { | | 807 | + crypto.createVerify('SHA256').update('Test123').verify(privateKey, 'sig'); | | 808 | + }, { code: 'ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE', message: /operation not supported for this keytype/ }); | | 809 | + assert.throws(() => { | | 810 | + crypto.createVerify('SHA256').update('Test123').verify(publicKey, 'sig'); | | 811 | + }, { code: 'ERR_OSSL_EVP_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE', message: /operation not supported for this keytype/ }); | | 812 | + } | | 813 | +} |
|