react-native-quick-crypto 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/QuickCrypto.podspec +14 -5
- package/android/CMakeLists.txt +4 -2
- package/android/build.gradle +1 -1
- package/cpp/cipher/HybridCipher.cpp +3 -2
- package/cpp/cipher/HybridRsaCipher.cpp +20 -1
- package/cpp/keys/HybridKeyObjectHandle.cpp +8 -0
- package/cpp/keys/KeyObjectData.hpp +1 -1
- package/cpp/mldsa/HybridMlDsaKeyPair.cpp +264 -0
- package/cpp/mldsa/HybridMlDsaKeyPair.hpp +47 -0
- package/cpp/sign/HybridSignHandle.cpp +97 -22
- package/cpp/sign/HybridVerifyHandle.cpp +90 -21
- package/deps/ncrypto/.bazelignore +4 -0
- package/deps/ncrypto/.bazelrc +2 -0
- package/deps/ncrypto/.bazelversion +1 -0
- package/deps/ncrypto/.clang-format +111 -0
- package/deps/ncrypto/.github/workflows/bazel.yml +58 -0
- package/deps/ncrypto/.github/workflows/linter.yml +38 -0
- package/deps/ncrypto/.github/workflows/macos.yml +43 -0
- package/deps/ncrypto/.github/workflows/ubuntu.yml +46 -0
- package/deps/ncrypto/.github/workflows/visual-studio.yml +49 -0
- package/deps/ncrypto/.python-version +1 -0
- package/deps/ncrypto/BUILD.bazel +36 -0
- package/deps/ncrypto/CMakeLists.txt +55 -0
- package/deps/ncrypto/LICENSE +21 -0
- package/deps/ncrypto/MODULE.bazel +1 -0
- package/deps/ncrypto/MODULE.bazel.lock +280 -0
- package/deps/ncrypto/README.md +18 -0
- package/deps/ncrypto/WORKSPACE +15 -0
- package/deps/ncrypto/cmake/CPM.cmake +1225 -0
- package/deps/ncrypto/cmake/ncrypto-flags.cmake +16 -0
- package/deps/ncrypto/include/dh-primes.h +67 -0
- package/deps/ncrypto/{ncrypto.h → include/ncrypto.h} +361 -89
- package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +28 -0
- package/deps/ncrypto/pyproject.toml +38 -0
- package/deps/ncrypto/src/CMakeLists.txt +15 -0
- package/deps/ncrypto/src/engine.cpp +93 -0
- package/deps/ncrypto/{ncrypto.cc → src/ncrypto.cpp} +1168 -234
- package/deps/ncrypto/tests/BUILD.bazel +9 -0
- package/deps/ncrypto/tests/CMakeLists.txt +7 -0
- package/deps/ncrypto/tests/basic.cpp +86 -0
- package/deps/ncrypto/tools/run-clang-format.sh +42 -0
- package/lib/commonjs/keys/classes.js +6 -0
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/mldsa.js +69 -0
- package/lib/commonjs/mldsa.js.map +1 -0
- package/lib/commonjs/specs/mlDsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/mlDsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +111 -6
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/module/keys/classes.js +6 -0
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/mldsa.js +63 -0
- package/lib/module/mldsa.js.map +1 -0
- package/lib/module/specs/mlDsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/mlDsaKeyPair.nitro.js.map +1 -0
- package/lib/module/subtle.js +111 -6
- package/lib/module/subtle.js.map +1 -1
- package/lib/module/utils/types.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/keys/classes.d.ts +2 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/mldsa.d.ts +18 -0
- package/lib/typescript/mldsa.d.ts.map +1 -0
- package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts +16 -0
- package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/lib/typescript/utils/types.d.ts +5 -3
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +1 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +10 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +10 -0
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +12 -0
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +73 -0
- package/package.json +7 -3
- package/src/keys/classes.ts +9 -0
- package/src/mldsa.ts +125 -0
- package/src/specs/mlDsaKeyPair.nitro.ts +29 -0
- package/src/subtle.ts +148 -8
- package/src/utils/types.ts +11 -3
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#include <ncrypto.h>
|
|
2
|
+
|
|
3
|
+
#include <gtest/gtest.h>
|
|
4
|
+
#include <string>
|
|
5
|
+
|
|
6
|
+
using namespace ncrypto;
|
|
7
|
+
|
|
8
|
+
// Convenience class for creating buffers in tests
|
|
9
|
+
struct TestBuf : public std::string {
|
|
10
|
+
TestBuf(const std::string& constStr)
|
|
11
|
+
: std::string(constStr),
|
|
12
|
+
buf{reinterpret_cast<unsigned char*>(data()), size()} {}
|
|
13
|
+
TestBuf(size_t n) : TestBuf(std::string(n, 0)) {}
|
|
14
|
+
|
|
15
|
+
operator Buffer<unsigned char>&() { return buf; }
|
|
16
|
+
|
|
17
|
+
Buffer<const unsigned char> asConst() const {
|
|
18
|
+
return Buffer<const unsigned char>{
|
|
19
|
+
.data = reinterpret_cast<const unsigned char*>(data()), .len = size()};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private:
|
|
23
|
+
Buffer<unsigned char> buf;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
#include <string>
|
|
27
|
+
#include <unordered_set>
|
|
28
|
+
|
|
29
|
+
using namespace ncrypto;
|
|
30
|
+
|
|
31
|
+
TEST(basic, cipher_foreach) {
|
|
32
|
+
std::unordered_set<std::string> foundCiphers;
|
|
33
|
+
|
|
34
|
+
Cipher::ForEach([&](const char* name) { foundCiphers.insert(name); });
|
|
35
|
+
|
|
36
|
+
// When testing Cipher::ForEach, we cannot expect a particular list of ciphers
|
|
37
|
+
// as that depends on openssl vs boringssl, versions, configuration, etc.
|
|
38
|
+
// Instead, we look for a couple of very common ciphers that should always be
|
|
39
|
+
// present.
|
|
40
|
+
ASSERT_TRUE(foundCiphers.count("AES-128-CTR"));
|
|
41
|
+
ASSERT_TRUE(foundCiphers.count("AES-256-CBC"));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#ifdef OPENSSL_IS_BORINGSSL
|
|
45
|
+
TEST(basic, chacha20_poly1305) {
|
|
46
|
+
unsigned char key[] = {0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03,
|
|
47
|
+
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
|
48
|
+
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
|
|
49
|
+
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7};
|
|
50
|
+
|
|
51
|
+
auto aead = Aead::CHACHA20_POLY1305;
|
|
52
|
+
auto encryptCtx = AeadCtxPointer::New(aead, true, key, aead.getKeyLength());
|
|
53
|
+
|
|
54
|
+
TestBuf input("Hello world");
|
|
55
|
+
TestBuf tag(aead.getMaxTagLength());
|
|
56
|
+
TestBuf nonce(aead.getNonceLength());
|
|
57
|
+
TestBuf aad("I dunno man");
|
|
58
|
+
TestBuf encryptOutput(input.size());
|
|
59
|
+
|
|
60
|
+
auto encryptOk = encryptCtx.encrypt(
|
|
61
|
+
input.asConst(), encryptOutput, tag, nonce.asConst(), aad.asConst());
|
|
62
|
+
ASSERT_TRUE(encryptOk);
|
|
63
|
+
ASSERT_NE(input, encryptOutput);
|
|
64
|
+
|
|
65
|
+
auto decryptCtx = AeadCtxPointer::New(aead, false, key, aead.getKeyLength());
|
|
66
|
+
|
|
67
|
+
TestBuf decryptOutput(encryptOutput.size());
|
|
68
|
+
|
|
69
|
+
auto decryptOk = decryptCtx.decrypt(encryptOutput.asConst(),
|
|
70
|
+
decryptOutput,
|
|
71
|
+
tag.asConst(),
|
|
72
|
+
nonce.asConst(),
|
|
73
|
+
aad.asConst());
|
|
74
|
+
ASSERT_TRUE(decryptOk);
|
|
75
|
+
ASSERT_EQ(input, decryptOutput);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
TEST(basic, aead_info) {
|
|
79
|
+
auto aead = Aead::FromName("aEs-256-gcM"); // spongebob does encryption
|
|
80
|
+
ASSERT_EQ(aead.getName(), "aes-256-gcm");
|
|
81
|
+
ASSERT_EQ(aead.getModeLabel(), "gcm");
|
|
82
|
+
ASSERT_EQ(aead.getBlockSize(), 1);
|
|
83
|
+
ASSERT_EQ(aead.getNonceLength(), 12);
|
|
84
|
+
ASSERT_EQ(aead.getMaxTagLength(), 16);
|
|
85
|
+
}
|
|
86
|
+
#endif
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Copyright 2023 Yagiz Nizipli and Daniel Lemire
|
|
4
|
+
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
# subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
# copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
+
|
|
22
|
+
set -e
|
|
23
|
+
COMMAND=$*
|
|
24
|
+
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
|
|
25
|
+
MAINSOURCE=$SCRIPTPATH/..
|
|
26
|
+
ALL_FILES=$(cd $MAINSOURCE && git ls-tree --full-tree --name-only -r HEAD | grep -e ".*\.\(c\|h\|cc\|cpp\|hh\)\$")
|
|
27
|
+
|
|
28
|
+
if clang-format-17 --version 2>/dev/null | grep -qF 'version 17.'; then
|
|
29
|
+
cd $MAINSOURCE; clang-format-17 --style=file --verbose -i "$@" $ALL_FILES
|
|
30
|
+
exit 0
|
|
31
|
+
elif clang-format --version 2>/dev/null | grep -qF 'version 17.'; then
|
|
32
|
+
cd $MAINSOURCE; clang-format --style=file --verbose -i "$@" $ALL_FILES
|
|
33
|
+
exit 0
|
|
34
|
+
fi
|
|
35
|
+
echo "Trying to use docker"
|
|
36
|
+
command -v docker >/dev/null 2>&1 || { echo >&2 "Please install docker. E.g., go to https://www.docker.com/products/docker-desktop Type 'docker' to diagnose the problem."; exit 1; }
|
|
37
|
+
docker info >/dev/null 2>&1 || { echo >&2 "Docker server is not running? type 'docker info'."; exit 1; }
|
|
38
|
+
|
|
39
|
+
if [ -t 0 ]; then DOCKER_ARGS=-it; fi
|
|
40
|
+
docker pull kszonek/clang-format-17
|
|
41
|
+
|
|
42
|
+
docker run --rm $DOCKER_ARGS -v "$MAINSOURCE":"$MAINSOURCE":Z -w "$MAINSOURCE" -u "$(id -u $USER):$(id -g $USER)" kszonek/clang-format-17 --style=file --verbose -i "$@" $ALL_FILES
|
|
@@ -9,6 +9,9 @@ var _reactNativeNitroModules = require("react-native-nitro-modules");
|
|
|
9
9
|
var _utils = require("../utils");
|
|
10
10
|
var _utils2 = require("./utils");
|
|
11
11
|
class CryptoKey {
|
|
12
|
+
get [Symbol.toStringTag]() {
|
|
13
|
+
return 'CryptoKey';
|
|
14
|
+
}
|
|
12
15
|
constructor(keyObject, keyAlgorithm, keyUsages, keyExtractable) {
|
|
13
16
|
this.keyObject = keyObject;
|
|
14
17
|
this.keyAlgorithm = keyAlgorithm;
|
|
@@ -51,6 +54,9 @@ class CryptoKey {
|
|
|
51
54
|
}
|
|
52
55
|
exports.CryptoKey = CryptoKey;
|
|
53
56
|
class KeyObject {
|
|
57
|
+
get [Symbol.toStringTag]() {
|
|
58
|
+
return 'KeyObject';
|
|
59
|
+
}
|
|
54
60
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
55
61
|
export(_options) {
|
|
56
62
|
// This is a placeholder and should be overridden by subclasses.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_buffer","require","_reactNativeNitroModules","_utils","_utils2","CryptoKey","constructor","keyObject","keyAlgorithm","keyUsages","keyExtractable","inspect","_depth","_options","Error","type","extractable","algorithm","usages","exports","KeyObject","export","handleOrKey","ArrayBuffer","handle","NitroModules","createHybridObject","keyType","KeyType","PUBLIC","PRIVATE","SECRET","init","createKeyObject","key","format","encoding","undefined","getAsymmetricKeyType","PublicKeyObject","PrivateKeyObject","SecretKeyObject","getAsymmetricKeyDetails","options","exportKey","Buffer","from","AsymmetricKeyObject","asymmetricKeyType","_asymmetricKeyType","asymmetricKeyDetails","_asymmetricKeyDetails","keyDetail","namedCurve","parsePublicKeyEncoding","buffer","toString","passphrase","cipher","parsePrivateKeyEncoding"],"sourceRoot":"../../../src","sources":["keys/classes.ts"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AASA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AAEO,MAAMI,SAAS,CAAC;
|
|
1
|
+
{"version":3,"names":["_buffer","require","_reactNativeNitroModules","_utils","_utils2","CryptoKey","Symbol","toStringTag","constructor","keyObject","keyAlgorithm","keyUsages","keyExtractable","inspect","_depth","_options","Error","type","extractable","algorithm","usages","exports","KeyObject","export","handleOrKey","ArrayBuffer","handle","NitroModules","createHybridObject","keyType","KeyType","PUBLIC","PRIVATE","SECRET","init","createKeyObject","key","format","encoding","undefined","getAsymmetricKeyType","PublicKeyObject","PrivateKeyObject","SecretKeyObject","getAsymmetricKeyDetails","options","exportKey","Buffer","from","AsymmetricKeyObject","asymmetricKeyType","_asymmetricKeyType","asymmetricKeyDetails","_asymmetricKeyDetails","keyDetail","namedCurve","parsePublicKeyEncoding","buffer","toString","passphrase","cipher","parsePrivateKeyEncoding"],"sourceRoot":"../../../src","sources":["keys/classes.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.MlDsa = void 0;
|
|
7
|
+
exports.mldsa_generateKeyPairWebCrypto = mldsa_generateKeyPairWebCrypto;
|
|
8
|
+
var _reactNativeNitroModules = require("react-native-nitro-modules");
|
|
9
|
+
var _keys = require("./keys");
|
|
10
|
+
var _utils = require("./utils");
|
|
11
|
+
class MlDsa {
|
|
12
|
+
constructor(variant) {
|
|
13
|
+
this.variant = variant;
|
|
14
|
+
this.native = _reactNativeNitroModules.NitroModules.createHybridObject('MlDsaKeyPair');
|
|
15
|
+
this.native.setVariant(variant);
|
|
16
|
+
}
|
|
17
|
+
async generateKeyPair() {
|
|
18
|
+
await this.native.generateKeyPair(_utils.KFormatType.DER, _utils.KeyEncoding.SPKI, _utils.KFormatType.DER, _utils.KeyEncoding.PKCS8);
|
|
19
|
+
}
|
|
20
|
+
generateKeyPairSync() {
|
|
21
|
+
this.native.generateKeyPairSync(_utils.KFormatType.DER, _utils.KeyEncoding.SPKI, _utils.KFormatType.DER, _utils.KeyEncoding.PKCS8);
|
|
22
|
+
}
|
|
23
|
+
getPublicKey() {
|
|
24
|
+
return this.native.getPublicKey();
|
|
25
|
+
}
|
|
26
|
+
getPrivateKey() {
|
|
27
|
+
return this.native.getPrivateKey();
|
|
28
|
+
}
|
|
29
|
+
async sign(message) {
|
|
30
|
+
return this.native.sign(message);
|
|
31
|
+
}
|
|
32
|
+
signSync(message) {
|
|
33
|
+
return this.native.signSync(message);
|
|
34
|
+
}
|
|
35
|
+
async verify(signature, message) {
|
|
36
|
+
return this.native.verify(signature, message);
|
|
37
|
+
}
|
|
38
|
+
verifySync(signature, message) {
|
|
39
|
+
return this.native.verifySync(signature, message);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.MlDsa = MlDsa;
|
|
43
|
+
async function mldsa_generateKeyPairWebCrypto(variant, extractable, keyUsages) {
|
|
44
|
+
if ((0, _utils.hasAnyNotIn)(keyUsages, ['sign', 'verify'])) {
|
|
45
|
+
throw (0, _utils.lazyDOMException)(`Unsupported key usage for ${variant}`, 'SyntaxError');
|
|
46
|
+
}
|
|
47
|
+
const publicUsages = (0, _utils.getUsagesUnion)(keyUsages, 'verify');
|
|
48
|
+
const privateUsages = (0, _utils.getUsagesUnion)(keyUsages, 'sign');
|
|
49
|
+
if (privateUsages.length === 0) {
|
|
50
|
+
throw (0, _utils.lazyDOMException)('Usages cannot be empty', 'SyntaxError');
|
|
51
|
+
}
|
|
52
|
+
const mldsa = new MlDsa(variant);
|
|
53
|
+
await mldsa.generateKeyPair();
|
|
54
|
+
const publicKeyData = mldsa.getPublicKey();
|
|
55
|
+
const privateKeyData = mldsa.getPrivateKey();
|
|
56
|
+
const pub = _keys.KeyObject.createKeyObject('public', publicKeyData, _utils.KFormatType.DER, _utils.KeyEncoding.SPKI);
|
|
57
|
+
const publicKey = new _keys.CryptoKey(pub, {
|
|
58
|
+
name: variant
|
|
59
|
+
}, publicUsages, true);
|
|
60
|
+
const priv = _keys.KeyObject.createKeyObject('private', privateKeyData, _utils.KFormatType.DER, _utils.KeyEncoding.PKCS8);
|
|
61
|
+
const privateKey = new _keys.CryptoKey(priv, {
|
|
62
|
+
name: variant
|
|
63
|
+
}, privateUsages, extractable);
|
|
64
|
+
return {
|
|
65
|
+
publicKey,
|
|
66
|
+
privateKey
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=mldsa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeNitroModules","require","_keys","_utils","MlDsa","constructor","variant","native","NitroModules","createHybridObject","setVariant","generateKeyPair","KFormatType","DER","KeyEncoding","SPKI","PKCS8","generateKeyPairSync","getPublicKey","getPrivateKey","sign","message","signSync","verify","signature","verifySync","exports","mldsa_generateKeyPairWebCrypto","extractable","keyUsages","hasAnyNotIn","lazyDOMException","publicUsages","getUsagesUnion","privateUsages","length","mldsa","publicKeyData","privateKeyData","pub","KeyObject","createKeyObject","publicKey","CryptoKey","name","priv","privateKey"],"sourceRoot":"../../src","sources":["mldsa.ts"],"mappings":";;;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAEA,IAAAC,KAAA,GAAAD,OAAA;AAOA,IAAAE,MAAA,GAAAF,OAAA;AAUO,MAAMG,KAAK,CAAC;EAIjBC,WAAWA,CAACC,OAAqB,EAAE;IACjC,IAAI,CAACA,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,MAAM,GAAGC,qCAAY,CAACC,kBAAkB,CAAe,cAAc,CAAC;IAC3E,IAAI,CAACF,MAAM,CAACG,UAAU,CAACJ,OAAO,CAAC;EACjC;EAEA,MAAMK,eAAeA,CAAA,EAAkB;IACrC,MAAM,IAAI,CAACJ,MAAM,CAACI,eAAe,CAC/BC,kBAAW,CAACC,GAAG,EACfC,kBAAW,CAACC,IAAI,EAChBH,kBAAW,CAACC,GAAG,EACfC,kBAAW,CAACE,KACd,CAAC;EACH;EAEAC,mBAAmBA,CAAA,EAAS;IAC1B,IAAI,CAACV,MAAM,CAACU,mBAAmB,CAC7BL,kBAAW,CAACC,GAAG,EACfC,kBAAW,CAACC,IAAI,EAChBH,kBAAW,CAACC,GAAG,EACfC,kBAAW,CAACE,KACd,CAAC;EACH;EAEAE,YAAYA,CAAA,EAAgB;IAC1B,OAAO,IAAI,CAACX,MAAM,CAACW,YAAY,CAAC,CAAC;EACnC;EAEAC,aAAaA,CAAA,EAAgB;IAC3B,OAAO,IAAI,CAACZ,MAAM,CAACY,aAAa,CAAC,CAAC;EACpC;EAEA,MAAMC,IAAIA,CAACC,OAAoB,EAAwB;IACrD,OAAO,IAAI,CAACd,MAAM,CAACa,IAAI,CAACC,OAAO,CAAC;EAClC;EAEAC,QAAQA,CAACD,OAAoB,EAAe;IAC1C,OAAO,IAAI,CAACd,MAAM,CAACe,QAAQ,CAACD,OAAO,CAAC;EACtC;EAEA,MAAME,MAAMA,CAACC,SAAsB,EAAEH,OAAoB,EAAoB;IAC3E,OAAO,IAAI,CAACd,MAAM,CAACgB,MAAM,CAACC,SAAS,EAAEH,OAAO,CAAC;EAC/C;EAEAI,UAAUA,CAACD,SAAsB,EAAEH,OAAoB,EAAW;IAChE,OAAO,IAAI,CAACd,MAAM,CAACkB,UAAU,CAACD,SAAS,EAAEH,OAAO,CAAC;EACnD;AACF;AAACK,OAAA,CAAAtB,KAAA,GAAAA,KAAA;AAEM,eAAeuB,8BAA8BA,CAClDrB,OAAqB,EACrBsB,WAAoB,EACpBC,SAAqB,EACG;EACxB,IAAI,IAAAC,kBAAW,EAACD,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE;IAC9C,MAAM,IAAAE,uBAAgB,EACpB,6BAA6BzB,OAAO,EAAE,EACtC,aACF,CAAC;EACH;EAEA,MAAM0B,YAAY,GAAG,IAAAC,qBAAc,EAACJ,SAAS,EAAE,QAAQ,CAAC;EACxD,MAAMK,aAAa,GAAG,IAAAD,qBAAc,EAACJ,SAAS,EAAE,MAAM,CAAC;EAEvD,IAAIK,aAAa,CAACC,MAAM,KAAK,CAAC,EAAE;IAC9B,MAAM,IAAAJ,uBAAgB,EAAC,wBAAwB,EAAE,aAAa,CAAC;EACjE;EAEA,MAAMK,KAAK,GAAG,IAAIhC,KAAK,CAACE,OAAO,CAAC;EAChC,MAAM8B,KAAK,CAACzB,eAAe,CAAC,CAAC;EAE7B,MAAM0B,aAAa,GAAGD,KAAK,CAAClB,YAAY,CAAC,CAAC;EAC1C,MAAMoB,cAAc,GAAGF,KAAK,CAACjB,aAAa,CAAC,CAAC;EAE5C,MAAMoB,GAAG,GAAGC,eAAS,CAACC,eAAe,CACnC,QAAQ,EACRJ,aAAa,EACbzB,kBAAW,CAACC,GAAG,EACfC,kBAAW,CAACC,IACd,CAAoB;EACpB,MAAM2B,SAAS,GAAG,IAAIC,eAAS,CAC7BJ,GAAG,EACH;IAAEK,IAAI,EAAEtC;EAAQ,CAAC,EACjB0B,YAAY,EACZ,IACF,CAAC;EAED,MAAMa,IAAI,GAAGL,eAAS,CAACC,eAAe,CACpC,SAAS,EACTH,cAAc,EACd1B,kBAAW,CAACC,GAAG,EACfC,kBAAW,CAACE,KACd,CAA0B;EAC1B,MAAM8B,UAAU,GAAG,IAAIH,eAAS,CAC9BE,IAAI,EACJ;IAAED,IAAI,EAAEtC;EAAQ,CAAC,EACjB4B,aAAa,EACbN,WACF,CAAC;EAED,OAAO;IAAEc,SAAS;IAAEI;EAAW,CAAC;AAClC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/mlDsaKeyPair.nitro.ts"],"mappings":"","ignoreList":[]}
|
package/lib/commonjs/subtle.js
CHANGED
|
@@ -22,6 +22,7 @@ var _random = require("./random");
|
|
|
22
22
|
var _hmac = require("./hmac");
|
|
23
23
|
var _signVerify = require("./keys/signVerify");
|
|
24
24
|
var _ed = require("./ed");
|
|
25
|
+
var _mldsa = require("./mldsa");
|
|
25
26
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
26
27
|
// import { pbkdf2DeriveBits } from './pbkdf2';
|
|
27
28
|
// import { aesCipher, aesGenerateKey, aesImportKey, getAlgorithmName } from './aes';
|
|
@@ -350,10 +351,13 @@ async function hmacGenerateKey(algorithm, extractable, keyUsages) {
|
|
|
350
351
|
// Create secret key
|
|
351
352
|
const keyObject = (0, _keys.createSecretKey)(keyBytes);
|
|
352
353
|
|
|
353
|
-
// Construct algorithm object
|
|
354
|
+
// Construct algorithm object with hash normalized to { name: string } format per WebCrypto spec
|
|
355
|
+
const webCryptoHashName = (0, _hashnames.normalizeHashName)(hash, _hashnames.HashContext.WebCrypto);
|
|
354
356
|
const keyAlgorithm = {
|
|
355
357
|
name: 'HMAC',
|
|
356
|
-
hash:
|
|
358
|
+
hash: {
|
|
359
|
+
name: webCryptoHashName
|
|
360
|
+
},
|
|
357
361
|
length
|
|
358
362
|
};
|
|
359
363
|
return new _keys.CryptoKey(keyObject, keyAlgorithm, keyUsages, extractable);
|
|
@@ -427,10 +431,17 @@ function rsaImportKey(format, data, algorithm, extractable, keyUsages) {
|
|
|
427
431
|
}
|
|
428
432
|
publicExponentBytes = new Uint8Array(bytes.length > 0 ? bytes : [0]);
|
|
429
433
|
}
|
|
434
|
+
|
|
435
|
+
// Normalize hash to { name: string } format per WebCrypto spec
|
|
436
|
+
const hashName = (0, _hashnames.normalizeHashName)(algorithm.hash, _hashnames.HashContext.WebCrypto);
|
|
437
|
+
const normalizedHash = {
|
|
438
|
+
name: hashName
|
|
439
|
+
};
|
|
430
440
|
const algorithmWithDetails = {
|
|
431
441
|
...algorithm,
|
|
432
442
|
modulusLength: keyDetails?.modulusLength,
|
|
433
|
-
publicExponent: publicExponentBytes
|
|
443
|
+
publicExponent: publicExponentBytes,
|
|
444
|
+
hash: normalizedHash
|
|
434
445
|
};
|
|
435
446
|
return new _keys.CryptoKey(keyObject, algorithmWithDetails, keyUsages, extractable);
|
|
436
447
|
}
|
|
@@ -477,10 +488,17 @@ async function hmacImportKey(algorithm, format, data, extractable, keyUsages) {
|
|
|
477
488
|
} else {
|
|
478
489
|
throw new Error(`Unable to import HMAC key with format ${format}`);
|
|
479
490
|
}
|
|
480
|
-
|
|
491
|
+
|
|
492
|
+
// Normalize hash to { name: string } format per WebCrypto spec
|
|
493
|
+
const hashName = (0, _hashnames.normalizeHashName)(algorithm.hash, _hashnames.HashContext.WebCrypto);
|
|
494
|
+
const normalizedAlgorithm = {
|
|
481
495
|
...algorithm,
|
|
482
|
-
name: 'HMAC'
|
|
483
|
-
|
|
496
|
+
name: 'HMAC',
|
|
497
|
+
hash: {
|
|
498
|
+
name: hashName
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
return new _keys.CryptoKey(keyObject, normalizedAlgorithm, keyUsages, extractable);
|
|
484
502
|
}
|
|
485
503
|
async function aesImportKey(algorithm, format, data, extractable, keyUsages) {
|
|
486
504
|
const {
|
|
@@ -567,6 +585,31 @@ function edImportKey(format, data, algorithm, extractable, keyUsages) {
|
|
|
567
585
|
name
|
|
568
586
|
}, keyUsages, extractable);
|
|
569
587
|
}
|
|
588
|
+
function mldsaImportKey(format, data, algorithm, extractable, keyUsages) {
|
|
589
|
+
const {
|
|
590
|
+
name
|
|
591
|
+
} = algorithm;
|
|
592
|
+
|
|
593
|
+
// Validate usages
|
|
594
|
+
if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
|
|
595
|
+
throw (0, _errors.lazyDOMException)(`Unsupported key usage for ${name} key`, 'SyntaxError');
|
|
596
|
+
}
|
|
597
|
+
let keyObject;
|
|
598
|
+
if (format === 'spki') {
|
|
599
|
+
// Import public key
|
|
600
|
+
const keyData = (0, _conversion.bufferLikeToArrayBuffer)(data);
|
|
601
|
+
keyObject = _keys.KeyObject.createKeyObject('public', keyData, _utils.KFormatType.DER, _utils.KeyEncoding.SPKI);
|
|
602
|
+
} else if (format === 'pkcs8') {
|
|
603
|
+
// Import private key
|
|
604
|
+
const keyData = (0, _conversion.bufferLikeToArrayBuffer)(data);
|
|
605
|
+
keyObject = _keys.KeyObject.createKeyObject('private', keyData, _utils.KFormatType.DER, _utils.KeyEncoding.PKCS8);
|
|
606
|
+
} else {
|
|
607
|
+
throw (0, _errors.lazyDOMException)(`Unsupported format for ${name} import: ${format}`, 'NotSupportedError');
|
|
608
|
+
}
|
|
609
|
+
return new _keys.CryptoKey(keyObject, {
|
|
610
|
+
name
|
|
611
|
+
}, keyUsages, extractable);
|
|
612
|
+
}
|
|
570
613
|
const exportKeySpki = async key => {
|
|
571
614
|
switch (key.algorithm.name) {
|
|
572
615
|
case 'RSASSA-PKCS1-v1_5':
|
|
@@ -593,6 +636,16 @@ const exportKeySpki = async key => {
|
|
|
593
636
|
return (0, _conversion.bufferLikeToArrayBuffer)(key.keyObject.handle.exportKey(_utils.KFormatType.DER, _utils.KeyEncoding.SPKI));
|
|
594
637
|
}
|
|
595
638
|
break;
|
|
639
|
+
case 'ML-DSA-44':
|
|
640
|
+
// Fall through
|
|
641
|
+
case 'ML-DSA-65':
|
|
642
|
+
// Fall through
|
|
643
|
+
case 'ML-DSA-87':
|
|
644
|
+
if (key.type === 'public') {
|
|
645
|
+
// Export ML-DSA key in SPKI DER format
|
|
646
|
+
return (0, _conversion.bufferLikeToArrayBuffer)(key.keyObject.handle.exportKey(_utils.KFormatType.DER, _utils.KeyEncoding.SPKI));
|
|
647
|
+
}
|
|
648
|
+
break;
|
|
596
649
|
}
|
|
597
650
|
throw new Error(`Unable to export a spki ${key.algorithm.name} ${key.type} key`);
|
|
598
651
|
};
|
|
@@ -622,6 +675,16 @@ const exportKeyPkcs8 = async key => {
|
|
|
622
675
|
return (0, _conversion.bufferLikeToArrayBuffer)(key.keyObject.handle.exportKey(_utils.KFormatType.DER, _utils.KeyEncoding.PKCS8));
|
|
623
676
|
}
|
|
624
677
|
break;
|
|
678
|
+
case 'ML-DSA-44':
|
|
679
|
+
// Fall through
|
|
680
|
+
case 'ML-DSA-65':
|
|
681
|
+
// Fall through
|
|
682
|
+
case 'ML-DSA-87':
|
|
683
|
+
if (key.type === 'private') {
|
|
684
|
+
// Export ML-DSA key in PKCS8 DER format
|
|
685
|
+
return (0, _conversion.bufferLikeToArrayBuffer)(key.keyObject.handle.exportKey(_utils.KFormatType.DER, _utils.KeyEncoding.PKCS8));
|
|
686
|
+
}
|
|
687
|
+
break;
|
|
625
688
|
}
|
|
626
689
|
throw new Error(`Unable to export a pkcs8 ${key.algorithm.name} ${key.type} key`);
|
|
627
690
|
};
|
|
@@ -816,6 +879,29 @@ function edSignVerify(key, data, signature) {
|
|
|
816
879
|
return ed.verifySync(signatureBuffer, dataBuffer, rawKey);
|
|
817
880
|
}
|
|
818
881
|
}
|
|
882
|
+
function mldsaSignVerify(key, data, signature) {
|
|
883
|
+
const isSign = signature === undefined;
|
|
884
|
+
const expectedKeyType = isSign ? 'private' : 'public';
|
|
885
|
+
if (key.type !== expectedKeyType) {
|
|
886
|
+
throw (0, _errors.lazyDOMException)(`Key must be a ${expectedKeyType} key`, 'InvalidAccessError');
|
|
887
|
+
}
|
|
888
|
+
const dataBuffer = (0, _conversion.bufferLikeToArrayBuffer)(data);
|
|
889
|
+
if (isSign) {
|
|
890
|
+
const signer = (0, _signVerify.createSign)('');
|
|
891
|
+
signer.update(dataBuffer);
|
|
892
|
+
const sig = signer.sign({
|
|
893
|
+
key: key
|
|
894
|
+
});
|
|
895
|
+
return sig.buffer.slice(sig.byteOffset, sig.byteOffset + sig.byteLength);
|
|
896
|
+
} else {
|
|
897
|
+
const signatureBuffer = (0, _conversion.bufferLikeToArrayBuffer)(signature);
|
|
898
|
+
const verifier = (0, _signVerify.createVerify)('');
|
|
899
|
+
verifier.update(dataBuffer);
|
|
900
|
+
return verifier.verify({
|
|
901
|
+
key: key
|
|
902
|
+
}, signatureBuffer);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
819
905
|
const signVerify = (algorithm, key, data, signature) => {
|
|
820
906
|
const usage = signature === undefined ? 'sign' : 'verify';
|
|
821
907
|
algorithm = normalizeAlgorithm(algorithm, usage);
|
|
@@ -834,6 +920,10 @@ const signVerify = (algorithm, key, data, signature) => {
|
|
|
834
920
|
case 'Ed25519':
|
|
835
921
|
case 'Ed448':
|
|
836
922
|
return edSignVerify(key, data, signature);
|
|
923
|
+
case 'ML-DSA-44':
|
|
924
|
+
case 'ML-DSA-65':
|
|
925
|
+
case 'ML-DSA-87':
|
|
926
|
+
return mldsaSignVerify(key, data, signature);
|
|
837
927
|
}
|
|
838
928
|
throw (0, _errors.lazyDOMException)(`Unrecognized algorithm name '${algorithm.name}' for '${usage}'`, 'NotSupportedError');
|
|
839
929
|
};
|
|
@@ -925,6 +1015,14 @@ class Subtle {
|
|
|
925
1015
|
result = await (0, _ed.ed_generateKeyPairWebCrypto)(algorithm.name.toLowerCase(), extractable, keyUsages);
|
|
926
1016
|
checkCryptoKeyPairUsages(result);
|
|
927
1017
|
break;
|
|
1018
|
+
case 'ML-DSA-44':
|
|
1019
|
+
// Fall through
|
|
1020
|
+
case 'ML-DSA-65':
|
|
1021
|
+
// Fall through
|
|
1022
|
+
case 'ML-DSA-87':
|
|
1023
|
+
result = await (0, _mldsa.mldsa_generateKeyPairWebCrypto)(algorithm.name, extractable, keyUsages);
|
|
1024
|
+
checkCryptoKeyPairUsages(result);
|
|
1025
|
+
break;
|
|
928
1026
|
default:
|
|
929
1027
|
throw new Error(`'subtle.generateKey()' is not implemented for ${algorithm.name}.
|
|
930
1028
|
Unrecognized algorithm name`);
|
|
@@ -967,6 +1065,13 @@ class Subtle {
|
|
|
967
1065
|
case 'Ed448':
|
|
968
1066
|
result = edImportKey(format, data, normalizedAlgorithm, extractable, keyUsages);
|
|
969
1067
|
break;
|
|
1068
|
+
case 'ML-DSA-44':
|
|
1069
|
+
// Fall through
|
|
1070
|
+
case 'ML-DSA-65':
|
|
1071
|
+
// Fall through
|
|
1072
|
+
case 'ML-DSA-87':
|
|
1073
|
+
result = mldsaImportKey(format, data, normalizedAlgorithm, extractable, keyUsages);
|
|
1074
|
+
break;
|
|
970
1075
|
default:
|
|
971
1076
|
throw new Error(`"subtle.importKey()" is not implemented for ${normalizedAlgorithm.name}`);
|
|
972
1077
|
}
|