crypto: support ML-DSA KeyObject, sign, and verify · nodejs/node@38aedfb

@@ -1916,6 +1916,9 @@ This can be called many times with new data as it is streamed.

19161916

<!-- YAML

19171917

added: v11.6.0

19181918

changes:

1919+

- version: REPLACEME

1920+

pr-url: https://github.com/nodejs/node/pull/59259

1921+

description: Add support for ML-DSA keys.

19191922

- version:

19201923

- v14.5.0

19211924

- v12.19.0

@@ -2021,6 +2024,9 @@ Other key details might be exposed via this API using additional attributes.

20212024

<!-- YAML

20222025

added: v11.6.0

20232026

changes:

2027+

- version: REPLACEME

2028+

pr-url: https://github.com/nodejs/node/pull/59259

2029+

description: Add support for ML-DSA keys.

20242030

- version:

20252031

- v13.9.0

20262032

- v12.17.0

@@ -2055,6 +2061,9 @@ types are:

20552061

* `'ed25519'` (OID 1.3.101.112)

20562062

* `'ed448'` (OID 1.3.101.113)

20572063

* `'dh'` (OID 1.2.840.113549.1.3.1)

2064+

* `'ml-dsa-44'`[^openssl35] (OID 2.16.840.1.101.3.4.3.17)

2065+

* `'ml-dsa-65'`[^openssl35] (OID 2.16.840.1.101.3.4.3.18)

2066+

* `'ml-dsa-87'`[^openssl35] (OID 2.16.840.1.101.3.4.3.19)

2058206720592068

This property is `undefined` for unrecognized `KeyObject` types and symmetric

20602069

keys.

@@ -3403,6 +3412,9 @@ input.on('readable', () => {

34033412

<!-- YAML

34043413

added: v11.6.0

34053414

changes:

3415+

- version: REPLACEME

3416+

pr-url: https://github.com/nodejs/node/pull/59259

3417+

description: Add support for ML-DSA keys.

34063418

- version: v15.12.0

34073419

pr-url: https://github.com/nodejs/node/pull/37254

34083420

description: The key can also be a JWK object.

@@ -3439,6 +3451,9 @@ of the passphrase is limited to 1024 bytes.

34393451

<!-- YAML

34403452

added: v11.6.0

34413453

changes:

3454+

- version: REPLACEME

3455+

pr-url: https://github.com/nodejs/node/pull/59259

3456+

description: Add support for ML-DSA keys.

34423457

- version: v15.12.0

34433458

pr-url: https://github.com/nodejs/node/pull/37254

34443459

description: The key can also be a JWK object.

@@ -3648,6 +3663,9 @@ underlying hash function. See [`crypto.createHmac()`][] for more information.

36483663

<!-- YAML

36493664

added: v10.12.0

36503665

changes:

3666+

- version: REPLACEME

3667+

pr-url: https://github.com/nodejs/node/pull/59259

3668+

description: Add support for ML-DSA key pairs.

36513669

- version: v18.0.0

36523670

pr-url: https://github.com/nodejs/node/pull/41678

36533671

description: Passing an invalid callback to the `callback` argument

@@ -3678,7 +3696,8 @@ changes:

36783696

-->

3679369736803698

* `type` {string} Must be `'rsa'`, `'rsa-pss'`, `'dsa'`, `'ec'`, `'ed25519'`,

3681-

`'ed448'`, `'x25519'`, `'x448'`, or `'dh'`.

3699+

`'ed448'`, `'x25519'`, `'x448'`, `'dh'`, `'ml-dsa-44'`[^openssl35],

3700+

`'ml-dsa-65'`[^openssl35], or `'ml-dsa-87'`[^openssl35].

36823701

* `options` {Object}

36833702

* `modulusLength` {number} Key size in bits (RSA, DSA).

36843703

* `publicExponent` {number} Public exponent (RSA). **Default:** `0x10001`.

@@ -3767,6 +3786,9 @@ a `Promise` for an `Object` with `publicKey` and `privateKey` properties.

37673786

<!-- YAML

37683787

added: v10.12.0

37693788

changes:

3789+

- version: REPLACEME

3790+

pr-url: https://github.com/nodejs/node/pull/59259

3791+

description: Add support for ML-DSA key pairs.

37703792

- version: v16.10.0

37713793

pr-url: https://github.com/nodejs/node/pull/39927

37723794

description: Add ability to define `RSASSA-PSS-params` sequence parameters

@@ -3792,7 +3814,8 @@ changes:

37923814

-->

3793381537943816

* `type` {string} Must be `'rsa'`, `'rsa-pss'`, `'dsa'`, `'ec'`, `'ed25519'`,

3795-

`'ed448'`, `'x25519'`, `'x448'`, or `'dh'`.

3817+

`'ed448'`, `'x25519'`, `'x448'`, `'dh'`, `'ml-dsa-44'`[^openssl35],

3818+

`'ml-dsa-65'`[^openssl35], or `'ml-dsa-87'`[^openssl35].

37963819

* `options` {Object}

37973820

* `modulusLength` {number} Key size in bits (RSA, DSA).

37983821

* `publicExponent` {number} Public exponent (RSA). **Default:** `0x10001`.

@@ -3816,7 +3839,7 @@ changes:

38163839

* `privateKey` {string | Buffer | KeyObject}

3817384038183841

Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC,

3819-

Ed25519, Ed448, X25519, X448, and DH are currently supported.

3842+

Ed25519, Ed448, X25519, X448, DH, and ML-DSA[^openssl35] are currently supported.

3820384338213844

If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function

38223845

behaves as if [`keyObject.export()`][] had been called on its result. Otherwise,

@@ -5416,6 +5439,9 @@ Throws an error if FIPS mode is not available.

54165439

<!-- YAML

54175440

added: v12.0.0

54185441

changes:

5442+

- version: REPLACEME

5443+

pr-url: https://github.com/nodejs/node/pull/59259

5444+

description: Add support for ML-DSA signing.

54195445

- version: v18.0.0

54205446

pr-url: https://github.com/nodejs/node/pull/41678

54215447

description: Passing an invalid callback to the `callback` argument

@@ -5445,7 +5471,10 @@ changes:

5445547154465472

Calculates and returns the signature for `data` using the given private key and

54475473

algorithm. If `algorithm` is `null` or `undefined`, then the algorithm is

5448-

dependent upon the key type (especially Ed25519 and Ed448).

5474+

dependent upon the key type.

5475+5476+

`algorithm` is required to be `null` or `undefined` for Ed25519, Ed448, and

5477+

ML-DSA.

5449547854505479

If `key` is not a [`KeyObject`][], this function behaves as if `key` had been

54515480

passed to [`crypto.createPrivateKey()`][]. If it is an object, the following

@@ -5526,6 +5555,9 @@ not introduce timing vulnerabilities.

55265555

<!-- YAML

55275556

added: v12.0.0

55285557

changes:

5558+

- version: REPLACEME

5559+

pr-url: https://github.com/nodejs/node/pull/59259

5560+

description: Add support for ML-DSA signature verification.

55295561

- version: v18.0.0

55305562

pr-url: https://github.com/nodejs/node/pull/41678

55315563

description: Passing an invalid callback to the `callback` argument

@@ -5561,7 +5593,10 @@ changes:

5561559355625594

Verifies the given signature for `data` using the given key and algorithm. If

55635595

`algorithm` is `null` or `undefined`, then the algorithm is dependent upon the

5564-

key type (especially Ed25519 and Ed448).

5596+

key type.

5597+5598+

`algorithm` is required to be `null` or `undefined` for Ed25519, Ed448, and

5599+

ML-DSA.

5565560055665601

If `key` is not a [`KeyObject`][], this function behaves as if `key` had been

55675602

passed to [`crypto.createPublicKey()`][]. If it is an object, the following

@@ -6150,6 +6185,8 @@ See the [list of SSL OP Flags][] for details.

61506185

</tr>

61516186

</table>

615261876188+

[^openssl35]: Requires OpenSSL >= 3.5

6189+61536190

[AEAD algorithms]: https://en.wikipedia.org/wiki/Authenticated_encryption

61546191

[CCM mode]: #ccm-mode

61556192

[CVE-2021-44532]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44532