Skip to content

Commit 16c08c5

Browse files
shigekibnoordhuis
authored andcommitted
crypto: warn if counter mode used in createCipher
`crypto.createCipher()` sets the fixed IV derived from password and it leads to a security risk of nonce reuse when counter mode is used. A warning is emitted when CTR, GCM or CCM is used in `crypto.createCipher()` to notify users to avoid nonce reuse. Fixes: nodejs#13801 PR-URL: nodejs#13821 Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Fedor Indutny <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent b0fadbe commit 16c08c5

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

doc/api/crypto.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1102,7 +1102,11 @@ rapidly.
11021102
In line with OpenSSL's recommendation to use pbkdf2 instead of
11031103
[`EVP_BytesToKey`][] it is recommended that developers derive a key and IV on
11041104
their own using [`crypto.pbkdf2()`][] and to use [`crypto.createCipheriv()`][]
1105-
to create the `Cipher` object.
1105+
to create the `Cipher` object. Users should not use ciphers with counter mode
1106+
(e.g. CTR, GCM or CCM) in `crypto.createCipher()`. A warning is emitted when
1107+
they are used in order to avoid the risk of IV reuse that causes
1108+
vulnerabilities. For the case when IV is reused in GCM, see [Nonce-Disrespecting
1109+
Adversaries][] for details.
11061110

11071111
### crypto.createCipheriv(algorithm, key, iv)
11081112

@@ -2023,6 +2027,7 @@ the `crypto`, `tls`, and `https` modules and are generally specific to OpenSSL.
20232027
[NIST SP 800-131A]: http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf
20242028
[NIST SP 800-132]: http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf
20252029
[OpenSSL cipher list format]: https://www.openssl.org/docs/man1.0.2/apps/ciphers.html#CIPHER-LIST-FORMAT
2030+
[Nonce-Disrespecting Adversaries]: https://github.com/nonce-disrespect/nonce-disrespect
20262031
[OpenSSL's SPKAC implementation]: https://www.openssl.org/docs/man1.0.2/apps/spkac.html
20272032
[publicly trusted list of CAs]: https://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt
20282033
[RFC 2412]: https://www.rfc-editor.org/rfc/rfc2412.txt

src/node_crypto.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3352,6 +3352,14 @@ void CipherBase::Init(const char* cipher_type,
33523352
EVP_CIPHER_CTX_init(&ctx_);
33533353
const bool encrypt = (kind_ == kCipher);
33543354
EVP_CipherInit_ex(&ctx_, cipher_, nullptr, nullptr, nullptr, encrypt);
3355+
3356+
int mode = EVP_CIPHER_CTX_mode(&ctx_);
3357+
if (encrypt && (mode == EVP_CIPH_CTR_MODE || mode == EVP_CIPH_GCM_MODE ||
3358+
mode == EVP_CIPH_CCM_MODE)) {
3359+
ProcessEmitWarning(env(), "Use Cipheriv for counter mode of %s",
3360+
cipher_type);
3361+
}
3362+
33553363
if (!EVP_CIPHER_CTX_set_key_length(&ctx_, key_len)) {
33563364
EVP_CIPHER_CTX_cleanup(&ctx_);
33573365
return env()->ThrowError("Invalid key length");

0 commit comments

Comments
 (0)