mindoodb 0.0.2 → 0.0.3
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/README.md +92 -19
- package/dist/__mocks__/expo-standard-web-crypto.d.ts +10 -0
- package/dist/__mocks__/expo-standard-web-crypto.d.ts.map +1 -0
- package/dist/__mocks__/expo-standard-web-crypto.js +22 -0
- package/dist/__mocks__/expo-standard-web-crypto.js.map +1 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts +8 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts.map +1 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js +16 -0
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js.map +1 -0
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts +1 -1
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts.map +1 -1
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js +2 -2
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +11 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +94 -0
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +13 -2
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +86 -0
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +19 -2
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +96 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/index.d.ts +1 -1
- package/dist/appendonlystores/network/index.d.ts.map +1 -1
- package/dist/appendonlystores/network/index.js.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +61 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +685 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.d.ts +25 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.d.ts.map +1 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.js +41 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStoreFactory.js.map +1 -0
- package/dist/browser/index.d.ts +5 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +13 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/core/BaseMindooDB.d.ts +12 -0
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +210 -108
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +40 -6
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +179 -21
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +10 -0
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +22 -28
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +161 -65
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +68 -0
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -0
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js +659 -0
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +43 -3
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +162 -23
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/bloom.d.ts +85 -0
- package/dist/core/appendonlystores/bloom.d.ts.map +1 -0
- package/dist/core/appendonlystores/bloom.js +228 -0
- package/dist/core/appendonlystores/bloom.js.map +1 -0
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +22 -2
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +10 -0
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.js.map +1 -1
- package/dist/core/appendonlystores/types.d.ts +123 -0
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/automerge-adapter.d.ts +15 -0
- package/dist/core/automerge-adapter.d.ts.map +1 -0
- package/dist/core/automerge-adapter.js +73 -0
- package/dist/core/automerge-adapter.js.map +1 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts +12 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts.map +1 -0
- package/dist/core/crypto/pbkdf2Iterations.js +55 -0
- package/dist/core/crypto/pbkdf2Iterations.js.map +1 -0
- package/dist/core/index.d.ts +7 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +30 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/keys/KeyBag.d.ts +32 -12
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +86 -26
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/keys/KeyContext.d.ts +4 -0
- package/dist/core/keys/KeyContext.d.ts.map +1 -0
- package/dist/core/keys/KeyContext.js +11 -0
- package/dist/core/keys/KeyContext.js.map +1 -0
- package/dist/core/types.d.ts +218 -50
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts +58 -0
- package/dist/core/uri/MindooURI.d.ts.map +1 -0
- package/dist/core/uri/MindooURI.js +169 -0
- package/dist/core/uri/MindooURI.js.map +1 -0
- package/dist/core/userid/index.d.ts +0 -10
- package/dist/core/userid/index.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +541 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +1334 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -0
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +5 -1
- package/dist/node/index.js.map +1 -1
- package/dist/reactnative/crypto/AESAdapter.d.ts +18 -0
- package/dist/reactnative/crypto/AESAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/AESAdapter.js +112 -0
- package/dist/reactnative/crypto/AESAdapter.js.map +1 -0
- package/dist/reactnative/crypto/Ed25519Adapter.d.ts +34 -0
- package/dist/reactnative/crypto/Ed25519Adapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/Ed25519Adapter.js +386 -0
- package/dist/reactnative/crypto/Ed25519Adapter.js.map +1 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.d.ts +23 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.js +51 -0
- package/dist/reactnative/crypto/ExpoGoCryptoAdapter.js.map +1 -0
- package/dist/reactnative/crypto/HMACAdapter.d.ts +13 -0
- package/dist/reactnative/crypto/HMACAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/HMACAdapter.js +50 -0
- package/dist/reactnative/crypto/HMACAdapter.js.map +1 -0
- package/dist/reactnative/crypto/KeyFormatConverter.d.ts +21 -0
- package/dist/reactnative/crypto/KeyFormatConverter.d.ts.map +1 -0
- package/dist/reactnative/crypto/KeyFormatConverter.js +72 -0
- package/dist/reactnative/crypto/KeyFormatConverter.js.map +1 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.d.ts +19 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.js +67 -0
- package/dist/reactnative/crypto/PBKDF2Adapter.js.map +1 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.d.ts +37 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.js +72 -0
- package/dist/reactnative/crypto/QuickCryptoAdapter.js.map +1 -0
- package/dist/reactnative/crypto/RSAAdapter.d.ts +38 -0
- package/dist/reactnative/crypto/RSAAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/RSAAdapter.js +184 -0
- package/dist/reactnative/crypto/RSAAdapter.js.map +1 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.d.ts +33 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.js +61 -0
- package/dist/reactnative/crypto/ReactNativeCryptoAdapter.js.map +1 -0
- package/dist/reactnative/crypto/SHA256Adapter.d.ts +9 -0
- package/dist/reactnative/crypto/SHA256Adapter.d.ts.map +1 -0
- package/dist/reactnative/crypto/SHA256Adapter.js +29 -0
- package/dist/reactnative/crypto/SHA256Adapter.js.map +1 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.d.ts +63 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.d.ts.map +1 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.js +350 -0
- package/dist/reactnative/crypto/SubtleCryptoPolyfill.js.map +1 -0
- package/dist/reactnative/index.d.ts +8 -0
- package/dist/reactnative/index.d.ts.map +1 -0
- package/dist/reactnative/index.js +38 -0
- package/dist/reactnative/index.js.map +1 -0
- package/package.json +51 -6
- package/patches/PATCHES.md +111 -0
- package/patches/react-native+0.76.9.patch +34 -0
- package/patches/react-native-quick-crypto+1.0.7.patch +42 -0
- package/scripts/cli.js +21 -0
- package/scripts/setup-react-native.js +228 -0
- package/templates/reactnative/App.js +252 -0
- package/templates/reactnative/app.json +29 -0
- package/templates/reactnative/babel.config.js +6 -0
- package/templates/reactnative/index.js +26 -0
- package/templates/reactnative/metro.config.snippet.js +39 -0
- package/templates/reactnative/mindoodb-polyfills.js +116 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ed25519 Adapter
|
|
4
|
+
* Implements Ed25519 key generation, signing, and verification using TweetNaCl
|
|
5
|
+
*
|
|
6
|
+
* TweetNaCl is CommonJS compatible and works directly with Jest without mocking.
|
|
7
|
+
* It provides real Ed25519 elliptic curve operations, audited by Cure53.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ed25519GenerateKey = ed25519GenerateKey;
|
|
14
|
+
exports.ed25519ImportKey = ed25519ImportKey;
|
|
15
|
+
exports.ed25519ExportKey = ed25519ExportKey;
|
|
16
|
+
exports.ed25519Sign = ed25519Sign;
|
|
17
|
+
exports.ed25519Verify = ed25519Verify;
|
|
18
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
19
|
+
// Ed25519 key sizes
|
|
20
|
+
const ED25519_SEED_SIZE = 32; // The 32-byte seed (what PKCS8 stores)
|
|
21
|
+
const ED25519_PUBLIC_KEY_SIZE = 32; // The 32-byte public key
|
|
22
|
+
const ED25519_SECRET_KEY_SIZE = 64; // TweetNaCl's format: seed + public key
|
|
23
|
+
const ED25519_SIGNATURE_SIZE = 64;
|
|
24
|
+
/**
|
|
25
|
+
* Generate Ed25519 key pair
|
|
26
|
+
*/
|
|
27
|
+
async function ed25519GenerateKey() {
|
|
28
|
+
const keyPair = tweetnacl_1.default.sign.keyPair();
|
|
29
|
+
return {
|
|
30
|
+
publicKey: {
|
|
31
|
+
type: "public",
|
|
32
|
+
extractable: true,
|
|
33
|
+
algorithm: { name: "Ed25519" },
|
|
34
|
+
usages: ["verify"],
|
|
35
|
+
_rawPublicKey: keyPair.publicKey,
|
|
36
|
+
},
|
|
37
|
+
privateKey: {
|
|
38
|
+
type: "private",
|
|
39
|
+
extractable: true,
|
|
40
|
+
algorithm: { name: "Ed25519" },
|
|
41
|
+
usages: ["sign"],
|
|
42
|
+
// Store the full 64-byte secret key (TweetNaCl format)
|
|
43
|
+
_rawPrivateKey: keyPair.secretKey,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Import Ed25519 key from SPKI (public) or PKCS8 (private) format
|
|
49
|
+
*/
|
|
50
|
+
async function ed25519ImportKey(format, keyData, algorithm, extractable, keyUsages) {
|
|
51
|
+
// Ensure we have an ArrayBuffer (not SharedArrayBuffer)
|
|
52
|
+
// Note: We don't explicitly check for SharedArrayBuffer here because:
|
|
53
|
+
// 1. SharedArrayBuffer may not exist in React Native/Expo Go environments
|
|
54
|
+
// 2. Using (keyData as any) and copying works for both SharedArrayBuffer and ArrayBufferView
|
|
55
|
+
// 3. This approach avoids ReferenceError when SharedArrayBuffer is undefined
|
|
56
|
+
let buffer;
|
|
57
|
+
if (keyData instanceof ArrayBuffer) {
|
|
58
|
+
buffer = keyData;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Copy from SharedArrayBuffer or ArrayBufferView
|
|
62
|
+
const view = new Uint8Array(keyData);
|
|
63
|
+
const copy = new Uint8Array(view.length);
|
|
64
|
+
copy.set(view);
|
|
65
|
+
buffer = copy.buffer;
|
|
66
|
+
}
|
|
67
|
+
const keyBytes = new Uint8Array(buffer);
|
|
68
|
+
if (format === "spki") {
|
|
69
|
+
// SPKI format for public keys
|
|
70
|
+
const publicKey = extractEd25519PublicKeyFromSPKI(keyBytes);
|
|
71
|
+
return {
|
|
72
|
+
type: "public",
|
|
73
|
+
extractable,
|
|
74
|
+
algorithm,
|
|
75
|
+
usages: keyUsages,
|
|
76
|
+
_rawPublicKey: publicKey,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// PKCS8 format for private keys
|
|
81
|
+
// Extract the 32-byte seed from PKCS8
|
|
82
|
+
const seed = extractEd25519PrivateKeyFromPKCS8(keyBytes);
|
|
83
|
+
// Derive the full 64-byte secret key from the seed using TweetNaCl
|
|
84
|
+
const keyPair = tweetnacl_1.default.sign.keyPair.fromSeed(seed);
|
|
85
|
+
return {
|
|
86
|
+
type: "private",
|
|
87
|
+
extractable,
|
|
88
|
+
algorithm,
|
|
89
|
+
usages: keyUsages,
|
|
90
|
+
// Store the full 64-byte secret key
|
|
91
|
+
_rawPrivateKey: keyPair.secretKey,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Export Ed25519 key to SPKI (public) or PKCS8 (private) format
|
|
97
|
+
*/
|
|
98
|
+
async function ed25519ExportKey(format, key) {
|
|
99
|
+
if (format === "spki") {
|
|
100
|
+
const publicKey = key._rawPublicKey;
|
|
101
|
+
if (!publicKey) {
|
|
102
|
+
throw new Error("Key does not contain public key material");
|
|
103
|
+
}
|
|
104
|
+
return encodeEd25519PublicKeyToSPKI(publicKey);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const secretKey = key._rawPrivateKey;
|
|
108
|
+
if (!secretKey) {
|
|
109
|
+
throw new Error("Key does not contain private key material");
|
|
110
|
+
}
|
|
111
|
+
// PKCS8 stores only the 32-byte seed (first half of TweetNaCl's 64-byte secret key)
|
|
112
|
+
const seed = secretKey.slice(0, ED25519_SEED_SIZE);
|
|
113
|
+
return encodeEd25519PrivateKeyToPKCS8(seed);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Sign data with Ed25519 private key
|
|
118
|
+
*/
|
|
119
|
+
async function ed25519Sign(algorithm, key, data) {
|
|
120
|
+
const secretKey = key._rawPrivateKey;
|
|
121
|
+
if (!secretKey) {
|
|
122
|
+
throw new Error("Key does not contain private key material");
|
|
123
|
+
}
|
|
124
|
+
const dataBytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
125
|
+
// Use detached signature (just the signature, not message + signature)
|
|
126
|
+
const signature = tweetnacl_1.default.sign.detached(dataBytes, secretKey);
|
|
127
|
+
// Ensure we return an ArrayBuffer (not SharedArrayBuffer)
|
|
128
|
+
const copy = new Uint8Array(signature);
|
|
129
|
+
return copy.buffer;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Verify Ed25519 signature
|
|
133
|
+
*/
|
|
134
|
+
async function ed25519Verify(algorithm, key, signature, data) {
|
|
135
|
+
const publicKey = key._rawPublicKey;
|
|
136
|
+
if (!publicKey) {
|
|
137
|
+
throw new Error("Key does not contain public key material");
|
|
138
|
+
}
|
|
139
|
+
const sigBytes = signature instanceof Uint8Array ? signature : new Uint8Array(signature);
|
|
140
|
+
const dataBytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
141
|
+
return tweetnacl_1.default.sign.detached.verify(dataBytes, sigBytes, publicKey);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Extract Ed25519 public key from SPKI format
|
|
145
|
+
* SPKI format: SEQUENCE { AlgorithmIdentifier { OID 1.3.101.112 }, BIT STRING }
|
|
146
|
+
*/
|
|
147
|
+
function extractEd25519PublicKeyFromSPKI(spki) {
|
|
148
|
+
let pos = 0;
|
|
149
|
+
// Skip outer SEQUENCE tag (0x30)
|
|
150
|
+
if (spki[pos] !== 0x30) {
|
|
151
|
+
throw new Error("Invalid SPKI format: expected SEQUENCE");
|
|
152
|
+
}
|
|
153
|
+
pos++;
|
|
154
|
+
// Skip length (can be 1-4 bytes)
|
|
155
|
+
const seqLength = readASN1Length(spki, pos);
|
|
156
|
+
pos += seqLength.bytesRead;
|
|
157
|
+
// Skip AlgorithmIdentifier SEQUENCE
|
|
158
|
+
if (spki[pos] !== 0x30) {
|
|
159
|
+
throw new Error("Invalid SPKI format: expected AlgorithmIdentifier SEQUENCE");
|
|
160
|
+
}
|
|
161
|
+
pos++;
|
|
162
|
+
const algIdLength = readASN1Length(spki, pos);
|
|
163
|
+
pos += algIdLength.bytesRead + algIdLength.value;
|
|
164
|
+
// Now we should be at the BIT STRING (0x03)
|
|
165
|
+
if (spki[pos] !== 0x03) {
|
|
166
|
+
throw new Error("Invalid SPKI format: expected BIT STRING");
|
|
167
|
+
}
|
|
168
|
+
pos++;
|
|
169
|
+
// Read BIT STRING length
|
|
170
|
+
const bitStringLength = readASN1Length(spki, pos);
|
|
171
|
+
pos += bitStringLength.bytesRead;
|
|
172
|
+
// Skip the unused bits byte (usually 0x00)
|
|
173
|
+
pos++;
|
|
174
|
+
// Extract the 32-byte public key
|
|
175
|
+
if (bitStringLength.value - 1 !== ED25519_PUBLIC_KEY_SIZE) {
|
|
176
|
+
throw new Error(`Invalid Ed25519 public key size: expected ${ED25519_PUBLIC_KEY_SIZE}, got ${bitStringLength.value - 1}`);
|
|
177
|
+
}
|
|
178
|
+
return spki.slice(pos, pos + ED25519_PUBLIC_KEY_SIZE);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Extract Ed25519 private key (seed) from PKCS8 format
|
|
182
|
+
* PKCS8 format: SEQUENCE { version, AlgorithmIdentifier { OID 1.3.101.112 }, OCTET STRING { OCTET STRING { seed } } }
|
|
183
|
+
*
|
|
184
|
+
* Note: RFC 8410 specifies that Ed25519 private keys in PKCS8 are wrapped in an additional OCTET STRING
|
|
185
|
+
*/
|
|
186
|
+
function extractEd25519PrivateKeyFromPKCS8(pkcs8) {
|
|
187
|
+
let pos = 0;
|
|
188
|
+
// Skip outer SEQUENCE tag (0x30)
|
|
189
|
+
if (pkcs8[pos] !== 0x30) {
|
|
190
|
+
throw new Error("Invalid PKCS8 format: expected SEQUENCE");
|
|
191
|
+
}
|
|
192
|
+
pos++;
|
|
193
|
+
// Skip length
|
|
194
|
+
const seqLength = readASN1Length(pkcs8, pos);
|
|
195
|
+
pos += seqLength.bytesRead;
|
|
196
|
+
// Skip version INTEGER (0x02)
|
|
197
|
+
if (pkcs8[pos] !== 0x02) {
|
|
198
|
+
throw new Error("Invalid PKCS8 format: expected version INTEGER");
|
|
199
|
+
}
|
|
200
|
+
pos++;
|
|
201
|
+
const versionLength = readASN1Length(pkcs8, pos);
|
|
202
|
+
pos += versionLength.bytesRead + versionLength.value;
|
|
203
|
+
// Skip AlgorithmIdentifier SEQUENCE
|
|
204
|
+
if (pkcs8[pos] !== 0x30) {
|
|
205
|
+
throw new Error("Invalid PKCS8 format: expected AlgorithmIdentifier SEQUENCE");
|
|
206
|
+
}
|
|
207
|
+
pos++;
|
|
208
|
+
const algIdLength = readASN1Length(pkcs8, pos);
|
|
209
|
+
pos += algIdLength.bytesRead + algIdLength.value;
|
|
210
|
+
// Now we should be at the outer OCTET STRING (0x04)
|
|
211
|
+
if (pkcs8[pos] !== 0x04) {
|
|
212
|
+
throw new Error("Invalid PKCS8 format: expected OCTET STRING");
|
|
213
|
+
}
|
|
214
|
+
pos++;
|
|
215
|
+
// Read outer OCTET STRING length
|
|
216
|
+
const outerOctetLength = readASN1Length(pkcs8, pos);
|
|
217
|
+
pos += outerOctetLength.bytesRead;
|
|
218
|
+
// Check if there's an inner OCTET STRING (RFC 8410 format)
|
|
219
|
+
if (pkcs8[pos] === 0x04) {
|
|
220
|
+
// Inner OCTET STRING contains the actual seed
|
|
221
|
+
pos++;
|
|
222
|
+
const innerOctetLength = readASN1Length(pkcs8, pos);
|
|
223
|
+
pos += innerOctetLength.bytesRead;
|
|
224
|
+
if (innerOctetLength.value !== ED25519_SEED_SIZE) {
|
|
225
|
+
throw new Error(`Invalid Ed25519 private key size: expected ${ED25519_SEED_SIZE}, got ${innerOctetLength.value}`);
|
|
226
|
+
}
|
|
227
|
+
return pkcs8.slice(pos, pos + ED25519_SEED_SIZE);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// Direct seed (older format)
|
|
231
|
+
if (outerOctetLength.value !== ED25519_SEED_SIZE) {
|
|
232
|
+
throw new Error(`Invalid Ed25519 private key size: expected ${ED25519_SEED_SIZE}, got ${outerOctetLength.value}`);
|
|
233
|
+
}
|
|
234
|
+
return pkcs8.slice(pos, pos + ED25519_SEED_SIZE);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Read ASN.1 length field
|
|
239
|
+
* Returns { value: number, bytesRead: number }
|
|
240
|
+
*/
|
|
241
|
+
function readASN1Length(data, pos) {
|
|
242
|
+
if (pos >= data.length) {
|
|
243
|
+
throw new Error("Invalid ASN.1: unexpected end of data");
|
|
244
|
+
}
|
|
245
|
+
const firstByte = data[pos];
|
|
246
|
+
// Short form (length < 128)
|
|
247
|
+
if ((firstByte & 0x80) === 0) {
|
|
248
|
+
return { value: firstByte, bytesRead: 1 };
|
|
249
|
+
}
|
|
250
|
+
// Long form (length >= 128)
|
|
251
|
+
const lengthBytes = firstByte & 0x7f;
|
|
252
|
+
if (lengthBytes === 0 || lengthBytes > 4) {
|
|
253
|
+
throw new Error("Invalid ASN.1: invalid length encoding");
|
|
254
|
+
}
|
|
255
|
+
if (pos + 1 + lengthBytes > data.length) {
|
|
256
|
+
throw new Error("Invalid ASN.1: unexpected end of data");
|
|
257
|
+
}
|
|
258
|
+
let length = 0;
|
|
259
|
+
for (let i = 0; i < lengthBytes; i++) {
|
|
260
|
+
length = (length << 8) | data[pos + 1 + i];
|
|
261
|
+
}
|
|
262
|
+
return { value: length, bytesRead: 1 + lengthBytes };
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Encode Ed25519 public key to SPKI format
|
|
266
|
+
*/
|
|
267
|
+
function encodeEd25519PublicKeyToSPKI(publicKey) {
|
|
268
|
+
if (publicKey.length !== ED25519_PUBLIC_KEY_SIZE) {
|
|
269
|
+
throw new Error(`Invalid Ed25519 public key size: expected ${ED25519_PUBLIC_KEY_SIZE}, got ${publicKey.length}`);
|
|
270
|
+
}
|
|
271
|
+
// Ed25519 SPKI structure:
|
|
272
|
+
// SEQUENCE {
|
|
273
|
+
// SEQUENCE {
|
|
274
|
+
// OID 1.3.101.112 (Ed25519) = [0x06, 0x03, 0x2b, 0x65, 0x70]
|
|
275
|
+
// }
|
|
276
|
+
// BIT STRING { 0x00 (unused bits), publicKey (32 bytes) }
|
|
277
|
+
// }
|
|
278
|
+
const oid = new Uint8Array([0x06, 0x03, 0x2b, 0x65, 0x70]); // OID 1.3.101.112
|
|
279
|
+
const algorithmId = encodeASN1Sequence([oid]);
|
|
280
|
+
const bitString = encodeASN1BitString(publicKey);
|
|
281
|
+
const outerSequence = encodeASN1Sequence([algorithmId, bitString]);
|
|
282
|
+
// Ensure we return an ArrayBuffer (not SharedArrayBuffer)
|
|
283
|
+
const copy = new Uint8Array(outerSequence);
|
|
284
|
+
return copy.buffer;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Encode Ed25519 private key (seed) to PKCS8 format
|
|
288
|
+
* Uses RFC 8410 format with wrapped OCTET STRING
|
|
289
|
+
*/
|
|
290
|
+
function encodeEd25519PrivateKeyToPKCS8(seed) {
|
|
291
|
+
if (seed.length !== ED25519_SEED_SIZE) {
|
|
292
|
+
throw new Error(`Invalid Ed25519 seed size: expected ${ED25519_SEED_SIZE}, got ${seed.length}`);
|
|
293
|
+
}
|
|
294
|
+
// Ed25519 PKCS8 structure (RFC 8410):
|
|
295
|
+
// SEQUENCE {
|
|
296
|
+
// INTEGER 0 (version)
|
|
297
|
+
// SEQUENCE {
|
|
298
|
+
// OID 1.3.101.112 (Ed25519) = [0x06, 0x03, 0x2b, 0x65, 0x70]
|
|
299
|
+
// }
|
|
300
|
+
// OCTET STRING { OCTET STRING { seed (32 bytes) } }
|
|
301
|
+
// }
|
|
302
|
+
const version = encodeASN1Integer(new Uint8Array([0x00])); // INTEGER 0
|
|
303
|
+
const oid = new Uint8Array([0x06, 0x03, 0x2b, 0x65, 0x70]); // OID 1.3.101.112
|
|
304
|
+
const algorithmId = encodeASN1Sequence([oid]);
|
|
305
|
+
// Inner OCTET STRING contains the seed
|
|
306
|
+
const innerOctetString = encodeASN1OctetString(seed);
|
|
307
|
+
// Outer OCTET STRING wraps the inner one
|
|
308
|
+
const outerOctetString = encodeASN1OctetString(innerOctetString);
|
|
309
|
+
const outerSequence = encodeASN1Sequence([version, algorithmId, outerOctetString]);
|
|
310
|
+
// Ensure we return an ArrayBuffer (not SharedArrayBuffer)
|
|
311
|
+
const copy = new Uint8Array(outerSequence);
|
|
312
|
+
return copy.buffer;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Encode ASN.1 SEQUENCE
|
|
316
|
+
*/
|
|
317
|
+
function encodeASN1Sequence(items) {
|
|
318
|
+
let totalLength = 0;
|
|
319
|
+
for (const item of items) {
|
|
320
|
+
totalLength += item.length;
|
|
321
|
+
}
|
|
322
|
+
const lengthBytes = encodeASN1Length(totalLength);
|
|
323
|
+
const result = new Uint8Array(1 + lengthBytes.length + totalLength);
|
|
324
|
+
result[0] = 0x30; // SEQUENCE tag
|
|
325
|
+
result.set(lengthBytes, 1);
|
|
326
|
+
let pos = 1 + lengthBytes.length;
|
|
327
|
+
for (const item of items) {
|
|
328
|
+
result.set(item, pos);
|
|
329
|
+
pos += item.length;
|
|
330
|
+
}
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Encode ASN.1 BIT STRING
|
|
335
|
+
*/
|
|
336
|
+
function encodeASN1BitString(data) {
|
|
337
|
+
// BIT STRING: tag (0x03) + length + unused bits (0x00) + data
|
|
338
|
+
const length = 1 + data.length; // 1 byte for unused bits + data
|
|
339
|
+
const lengthBytes = encodeASN1Length(length);
|
|
340
|
+
const result = new Uint8Array(1 + lengthBytes.length + length);
|
|
341
|
+
result[0] = 0x03; // BIT STRING tag
|
|
342
|
+
result.set(lengthBytes, 1);
|
|
343
|
+
result[1 + lengthBytes.length] = 0x00; // unused bits
|
|
344
|
+
result.set(data, 1 + lengthBytes.length + 1);
|
|
345
|
+
return result;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Encode ASN.1 OCTET STRING
|
|
349
|
+
*/
|
|
350
|
+
function encodeASN1OctetString(data) {
|
|
351
|
+
const lengthBytes = encodeASN1Length(data.length);
|
|
352
|
+
const result = new Uint8Array(1 + lengthBytes.length + data.length);
|
|
353
|
+
result[0] = 0x04; // OCTET STRING tag
|
|
354
|
+
result.set(lengthBytes, 1);
|
|
355
|
+
result.set(data, 1 + lengthBytes.length);
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Encode ASN.1 INTEGER
|
|
360
|
+
*/
|
|
361
|
+
function encodeASN1Integer(data) {
|
|
362
|
+
const lengthBytes = encodeASN1Length(data.length);
|
|
363
|
+
const result = new Uint8Array(1 + lengthBytes.length + data.length);
|
|
364
|
+
result[0] = 0x02; // INTEGER tag
|
|
365
|
+
result.set(lengthBytes, 1);
|
|
366
|
+
result.set(data, 1 + lengthBytes.length);
|
|
367
|
+
return result;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Encode ASN.1 length field
|
|
371
|
+
*/
|
|
372
|
+
function encodeASN1Length(length) {
|
|
373
|
+
if (length < 128) {
|
|
374
|
+
// Short form
|
|
375
|
+
return new Uint8Array([length]);
|
|
376
|
+
}
|
|
377
|
+
// Long form
|
|
378
|
+
const bytes = [];
|
|
379
|
+
let value = length;
|
|
380
|
+
while (value > 0) {
|
|
381
|
+
bytes.unshift(value & 0xff);
|
|
382
|
+
value >>>= 8;
|
|
383
|
+
}
|
|
384
|
+
return new Uint8Array([0x80 | bytes.length, ...bytes]);
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=Ed25519Adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ed25519Adapter.js","sourceRoot":"","sources":["../../../src/reactnative/crypto/Ed25519Adapter.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;AAaH,gDAoBC;AAKD,4CAoDC;AAKD,4CAmBC;AAKD,kCAkBC;AAKD,sCAeC;AA3JD,0DAA6B;AAE7B,oBAAoB;AACpB,MAAM,iBAAiB,GAAG,EAAE,CAAC,CAAQ,uCAAuC;AAC5E,MAAM,uBAAuB,GAAG,EAAE,CAAC,CAAE,yBAAyB;AAC9D,MAAM,uBAAuB,GAAG,EAAE,CAAC,CAAE,wCAAwC;AAC7E,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC;;GAEG;AACI,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAEpC,OAAO;QACL,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC9B,MAAM,EAAE,CAAC,QAAQ,CAAC;YAClB,aAAa,EAAE,OAAO,CAAC,SAAS;SAC1B;QACR,UAAU,EAAE;YACV,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC9B,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,uDAAuD;YACvD,cAAc,EAAE,OAAO,CAAC,SAAS;SAC3B;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,MAAwB,EACxB,OAAsC,EACtC,SAA8B,EAC9B,WAAoB,EACpB,SAAqB;IAErB,wDAAwD;IACxD,sEAAsE;IACtE,0EAA0E;IAC1E,6FAA6F;IAC7F,6EAA6E;IAC7E,IAAI,MAAmB,CAAC;IACxB,IAAI,OAAO,YAAY,WAAW,EAAE,CAAC;QACnC,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,iDAAiD;QACjD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAc,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,8BAA8B;QAC9B,MAAM,SAAS,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC;QAE5D,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,WAAW;YACX,SAAS;YACT,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,SAAS;SAClB,CAAC;IACX,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,sCAAsC;QACtC,MAAM,IAAI,GAAG,iCAAiC,CAAC,QAAQ,CAAC,CAAC;QAEzD,mEAAmE;QACnE,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEjD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,WAAW;YACX,SAAS;YACT,MAAM,EAAE,SAAS;YACjB,oCAAoC;YACpC,cAAc,EAAE,OAAO,CAAC,SAAS;SAC3B,CAAC;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,MAAwB,EACxB,GAAc;IAEd,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,SAAS,GAAI,GAAW,CAAC,aAAa,CAAC;QAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,4BAA4B,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAI,GAAW,CAAC,cAAc,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,oFAAoF;QACpF,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACnD,OAAO,8BAA8B,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAC/B,SAA8B,EAC9B,GAAc,EACd,IAA8B;IAE9B,MAAM,SAAS,GAAI,GAAW,CAAC,cAAc,CAAC;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3E,uEAAuE;IACvE,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE3D,0DAA0D;IAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,SAA8B,EAC9B,GAAc,EACd,SAAmC,EACnC,IAA8B;IAE9B,MAAM,SAAS,GAAI,GAAW,CAAC,aAAa,CAAC;IAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,YAAY,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3E,OAAO,mBAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,SAAS,+BAA+B,CAAC,IAAgB;IACvD,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,iCAAiC;IACjC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,GAAG,EAAE,CAAC;IAEN,iCAAiC;IACjC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5C,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC;IAE3B,oCAAoC;IACpC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,GAAG,EAAE,CAAC;IACN,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAEjD,4CAA4C;IAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,GAAG,EAAE,CAAC;IAEN,yBAAyB;IACzB,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClD,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC;IAEjC,2CAA2C;IAC3C,GAAG,EAAE,CAAC;IAEN,iCAAiC;IACjC,IAAI,eAAe,CAAC,KAAK,GAAG,CAAC,KAAK,uBAAuB,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,6CAA6C,uBAAuB,SAAS,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5H,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,uBAAuB,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,SAAS,iCAAiC,CAAC,KAAiB;IAC1D,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,iCAAiC;IACjC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,GAAG,EAAE,CAAC;IAEN,cAAc;IACd,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC;IAE3B,8BAA8B;IAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,GAAG,EAAE,CAAC;IACN,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjD,GAAG,IAAI,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC;IAErD,oCAAoC;IACpC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,GAAG,EAAE,CAAC;IACN,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAEjD,oDAAoD;IACpD,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,GAAG,EAAE,CAAC;IAEN,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC;IAElC,2DAA2D;IAC3D,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACxB,8CAA8C;QAC9C,GAAG,EAAE,CAAC;QACN,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACpD,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC;QAElC,IAAI,gBAAgB,CAAC,KAAK,KAAK,iBAAiB,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,8CAA8C,iBAAiB,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC;QACpH,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,IAAI,gBAAgB,CAAC,KAAK,KAAK,iBAAiB,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,8CAA8C,iBAAiB,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC;QACpH,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAgB,EAAE,GAAW;IACnD,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5B,4BAA4B;IAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC5C,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,IAAI,WAAW,KAAK,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B,CAAC,SAAqB;IACzD,IAAI,SAAS,CAAC,MAAM,KAAK,uBAAuB,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,6CAA6C,uBAAuB,SAAS,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,0BAA0B;IAC1B,aAAa;IACb,eAAe;IACf,iEAAiE;IACjE,MAAM;IACN,4DAA4D;IAC5D,IAAI;IAEJ,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB;IAC9E,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAEnE,0DAA0D;IAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,SAAS,8BAA8B,CAAC,IAAgB;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,uCAAuC,iBAAiB,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,sCAAsC;IACtC,aAAa;IACb,wBAAwB;IACxB,eAAe;IACf,iEAAiE;IACjE,MAAM;IACN,sDAAsD;IACtD,IAAI;IAEJ,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;IACvE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB;IAC9E,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9C,uCAAuC;IACvC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACrD,yCAAyC;IACzC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IAEjE,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEnF,0DAA0D;IAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAmB;IAC7C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,eAAe;IACjC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE3B,IAAI,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtB,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAgB;IAC3C,8DAA8D;IAC9D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,gCAAgC;IAChE,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC/D,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,iBAAiB;IACnC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,cAAc;IACrD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAgB;IAC7C,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,mBAAmB;IACrC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAgB;IACzC,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,cAAc;IAChC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAc;IACtC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACjB,aAAa;QACb,OAAO,IAAI,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,YAAY;IACZ,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,MAAM,CAAC;IACnB,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;QACjB,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,CAAC;IACf,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expo Go Crypto Adapter
|
|
3
|
+
* JavaScript-only implementation of CryptoAdapter for Expo Go
|
|
4
|
+
* Uses pure JS crypto libraries since native modules don't work in Expo Go
|
|
5
|
+
*/
|
|
6
|
+
import type { CryptoAdapter } from "../../core/crypto/CryptoAdapter";
|
|
7
|
+
/**
|
|
8
|
+
* Expo Go Crypto Adapter
|
|
9
|
+
* Implements the CryptoAdapter interface using JavaScript-only crypto libraries
|
|
10
|
+
*/
|
|
11
|
+
export declare class ExpoGoCryptoAdapter implements CryptoAdapter {
|
|
12
|
+
private subtle;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Get the SubtleCrypto interface
|
|
16
|
+
*/
|
|
17
|
+
getSubtle(): SubtleCrypto;
|
|
18
|
+
/**
|
|
19
|
+
* Get random values using expo-standard-web-crypto or fallback
|
|
20
|
+
*/
|
|
21
|
+
getRandomValues(array: Uint8Array): Uint8Array;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ExpoGoCryptoAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoGoCryptoAdapter.d.ts","sourceRoot":"","sources":["../../../src/reactnative/crypto/ExpoGoCryptoAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAerE;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,MAAM,CAAuB;;IAMrC;;OAEG;IACH,SAAS,IAAI,YAAY;IAIzB;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;CAe/C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Expo Go Crypto Adapter
|
|
4
|
+
* JavaScript-only implementation of CryptoAdapter for Expo Go
|
|
5
|
+
* Uses pure JS crypto libraries since native modules don't work in Expo Go
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ExpoGoCryptoAdapter = void 0;
|
|
9
|
+
const SubtleCryptoPolyfill_1 = require("./SubtleCryptoPolyfill");
|
|
10
|
+
// Dynamic import of expo-standard-web-crypto to handle environments where it's not available
|
|
11
|
+
let getRandomValuesFn = null;
|
|
12
|
+
try {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
14
|
+
const expoStandardWebCrypto = require("expo-standard-web-crypto");
|
|
15
|
+
// Handle both default export and named export
|
|
16
|
+
getRandomValuesFn = expoStandardWebCrypto.getRandomValues || expoStandardWebCrypto.default?.getRandomValues;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// expo-standard-web-crypto not available, will use fallback
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Expo Go Crypto Adapter
|
|
23
|
+
* Implements the CryptoAdapter interface using JavaScript-only crypto libraries
|
|
24
|
+
*/
|
|
25
|
+
class ExpoGoCryptoAdapter {
|
|
26
|
+
constructor() {
|
|
27
|
+
this.subtle = new SubtleCryptoPolyfill_1.SubtleCryptoPolyfill();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the SubtleCrypto interface
|
|
31
|
+
*/
|
|
32
|
+
getSubtle() {
|
|
33
|
+
return this.subtle;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get random values using expo-standard-web-crypto or fallback
|
|
37
|
+
*/
|
|
38
|
+
getRandomValues(array) {
|
|
39
|
+
if (getRandomValuesFn) {
|
|
40
|
+
return getRandomValuesFn(array);
|
|
41
|
+
}
|
|
42
|
+
// Fallback: use global crypto if available (e.g., in Node.js tests)
|
|
43
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
44
|
+
return crypto.getRandomValues(array);
|
|
45
|
+
}
|
|
46
|
+
throw new Error("getRandomValues not available. " +
|
|
47
|
+
"Install expo-standard-web-crypto for React Native support.");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.ExpoGoCryptoAdapter = ExpoGoCryptoAdapter;
|
|
51
|
+
//# sourceMappingURL=ExpoGoCryptoAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpoGoCryptoAdapter.js","sourceRoot":"","sources":["../../../src/reactnative/crypto/ExpoGoCryptoAdapter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,iEAA8D;AAE9D,6FAA6F;AAC7F,IAAI,iBAAiB,GAA+C,IAAI,CAAC;AAEzE,IAAI,CAAC;IACH,8DAA8D;IAC9D,MAAM,qBAAqB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAClE,8CAA8C;IAC9C,iBAAiB,GAAG,qBAAqB,CAAC,eAAe,IAAI,qBAAqB,CAAC,OAAO,EAAE,eAAe,CAAC;AAC9G,CAAC;AAAC,MAAM,CAAC;IACP,4DAA4D;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAa,mBAAmB;IAG9B;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,2CAAoB,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAiC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAAiB;QAC/B,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,oEAAoE;QACpE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5D,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,KAAK,CACb,iCAAiC;YACjC,4DAA4D,CAC7D,CAAC;IACJ,CAAC;CACF;AAhCD,kDAgCC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMAC-SHA256 Adapter
|
|
3
|
+
* Implements HMAC-SHA256 signing and verification using node-forge
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Sign data with HMAC-SHA256
|
|
7
|
+
*/
|
|
8
|
+
export declare function hmacSign(key: ArrayBuffer, data: ArrayBuffer | Uint8Array): Promise<ArrayBuffer>;
|
|
9
|
+
/**
|
|
10
|
+
* Verify HMAC-SHA256 signature
|
|
11
|
+
*/
|
|
12
|
+
export declare function hmacVerify(key: ArrayBuffer, signature: ArrayBuffer | Uint8Array, data: ArrayBuffer | Uint8Array): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=HMACAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HMACAdapter.d.ts","sourceRoot":"","sources":["../../../src/reactnative/crypto/HMACAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAmBrG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,WAAW,GAAG,UAAU,EACnC,IAAI,EAAE,WAAW,GAAG,UAAU,GAC7B,OAAO,CAAC,OAAO,CAAC,CAelB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HMAC-SHA256 Adapter
|
|
4
|
+
* Implements HMAC-SHA256 signing and verification using node-forge
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.hmacSign = hmacSign;
|
|
11
|
+
exports.hmacVerify = hmacVerify;
|
|
12
|
+
const node_forge_1 = __importDefault(require("node-forge"));
|
|
13
|
+
/**
|
|
14
|
+
* Sign data with HMAC-SHA256
|
|
15
|
+
*/
|
|
16
|
+
async function hmacSign(key, data) {
|
|
17
|
+
const keyBytes = new Uint8Array(key);
|
|
18
|
+
const dataBytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
19
|
+
const hmac = node_forge_1.default.hmac.create();
|
|
20
|
+
const keyBuf = node_forge_1.default.util.createBuffer(keyBytes.buffer);
|
|
21
|
+
const dataBuf = node_forge_1.default.util.createBuffer(dataBytes.buffer);
|
|
22
|
+
hmac.start("sha256", keyBuf.getBytes());
|
|
23
|
+
hmac.update(dataBuf.getBytes());
|
|
24
|
+
const signature = hmac.digest();
|
|
25
|
+
// Convert signature to Uint8Array
|
|
26
|
+
const sigHex = signature.toHex();
|
|
27
|
+
const sigBytes = new Uint8Array(sigHex.length / 2);
|
|
28
|
+
for (let i = 0; i < sigBytes.length; i++) {
|
|
29
|
+
sigBytes[i] = parseInt(sigHex.substr(i * 2, 2), 16);
|
|
30
|
+
}
|
|
31
|
+
return sigBytes.buffer;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Verify HMAC-SHA256 signature
|
|
35
|
+
*/
|
|
36
|
+
async function hmacVerify(key, signature, data) {
|
|
37
|
+
const expectedSignature = await hmacSign(key, data);
|
|
38
|
+
const sigBytes = signature instanceof Uint8Array ? signature : new Uint8Array(signature);
|
|
39
|
+
const expectedBytes = new Uint8Array(expectedSignature);
|
|
40
|
+
if (sigBytes.length !== expectedBytes.length) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
// Constant-time comparison
|
|
44
|
+
let result = 0;
|
|
45
|
+
for (let i = 0; i < sigBytes.length; i++) {
|
|
46
|
+
result |= sigBytes[i] ^ expectedBytes[i];
|
|
47
|
+
}
|
|
48
|
+
return result === 0;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=HMACAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HMACAdapter.js","sourceRoot":"","sources":["../../../src/reactnative/crypto/HMACAdapter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAOH,4BAmBC;AAKD,gCAmBC;AAhDD,4DAA+B;AAE/B;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAC,GAAgB,EAAE,IAA8B;IAC7E,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3E,MAAM,IAAI,GAAG,oBAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,oBAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAqB,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,oBAAK,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAqB,CAAC,CAAC;IACzE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEhC,kCAAkC;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAC9B,GAAgB,EAChB,SAAmC,EACnC,IAA8B;IAE9B,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,YAAY,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAExD,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,KAAK,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Format Converter
|
|
3
|
+
* Handles conversions between PEM format and raw key material for Ed25519 and RSA keys
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert PEM string to ArrayBuffer (base64 decoded)
|
|
7
|
+
*/
|
|
8
|
+
export declare function pemToArrayBuffer(pem: string): ArrayBuffer;
|
|
9
|
+
/**
|
|
10
|
+
* Convert ArrayBuffer to PEM string
|
|
11
|
+
*/
|
|
12
|
+
export declare function arrayBufferToPEM(buffer: ArrayBuffer, type: "PUBLIC KEY" | "PRIVATE KEY"): string;
|
|
13
|
+
/**
|
|
14
|
+
* Convert Uint8Array to base64 string
|
|
15
|
+
*/
|
|
16
|
+
export declare function uint8ArrayToBase64(bytes: Uint8Array): string;
|
|
17
|
+
/**
|
|
18
|
+
* Convert base64 string to Uint8Array
|
|
19
|
+
*/
|
|
20
|
+
export declare function base64ToUint8Array(base64: string): Uint8Array;
|
|
21
|
+
//# sourceMappingURL=KeyFormatConverter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyFormatConverter.d.ts","sourceRoot":"","sources":["../../../src/reactnative/crypto/KeyFormatConverter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAczD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,aAAa,GAAG,MAAM,CAsBhG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAM5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAO7D"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Key Format Converter
|
|
4
|
+
* Handles conversions between PEM format and raw key material for Ed25519 and RSA keys
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.pemToArrayBuffer = pemToArrayBuffer;
|
|
8
|
+
exports.arrayBufferToPEM = arrayBufferToPEM;
|
|
9
|
+
exports.uint8ArrayToBase64 = uint8ArrayToBase64;
|
|
10
|
+
exports.base64ToUint8Array = base64ToUint8Array;
|
|
11
|
+
/**
|
|
12
|
+
* Convert PEM string to ArrayBuffer (base64 decoded)
|
|
13
|
+
*/
|
|
14
|
+
function pemToArrayBuffer(pem) {
|
|
15
|
+
// Remove PEM headers and whitespace
|
|
16
|
+
const pemContents = pem
|
|
17
|
+
.replace(/-----BEGIN [A-Z ]+-----/g, "")
|
|
18
|
+
.replace(/-----END [A-Z ]+-----/g, "")
|
|
19
|
+
.replace(/\s/g, "");
|
|
20
|
+
// Decode base64
|
|
21
|
+
const binary = atob(pemContents);
|
|
22
|
+
const bytes = new Uint8Array(binary.length);
|
|
23
|
+
for (let i = 0; i < binary.length; i++) {
|
|
24
|
+
bytes[i] = binary.charCodeAt(i);
|
|
25
|
+
}
|
|
26
|
+
return bytes.buffer;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Convert ArrayBuffer to PEM string
|
|
30
|
+
*/
|
|
31
|
+
function arrayBufferToPEM(buffer, type) {
|
|
32
|
+
const bytes = new Uint8Array(buffer);
|
|
33
|
+
let binary = "";
|
|
34
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
35
|
+
binary += String.fromCharCode(bytes[i]);
|
|
36
|
+
}
|
|
37
|
+
const base64 = btoa(binary);
|
|
38
|
+
const header = type === "PUBLIC KEY"
|
|
39
|
+
? "-----BEGIN PUBLIC KEY-----"
|
|
40
|
+
: "-----BEGIN PRIVATE KEY-----";
|
|
41
|
+
const footer = type === "PUBLIC KEY"
|
|
42
|
+
? "-----END PUBLIC KEY-----"
|
|
43
|
+
: "-----END PRIVATE KEY-----";
|
|
44
|
+
// Format with line breaks (64 chars per line)
|
|
45
|
+
const lines = [];
|
|
46
|
+
for (let i = 0; i < base64.length; i += 64) {
|
|
47
|
+
lines.push(base64.slice(i, i + 64));
|
|
48
|
+
}
|
|
49
|
+
return `${header}\n${lines.join("\n")}\n${footer}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert Uint8Array to base64 string
|
|
53
|
+
*/
|
|
54
|
+
function uint8ArrayToBase64(bytes) {
|
|
55
|
+
let binary = "";
|
|
56
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
57
|
+
binary += String.fromCharCode(bytes[i]);
|
|
58
|
+
}
|
|
59
|
+
return btoa(binary);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Convert base64 string to Uint8Array
|
|
63
|
+
*/
|
|
64
|
+
function base64ToUint8Array(base64) {
|
|
65
|
+
const binary = atob(base64);
|
|
66
|
+
const bytes = new Uint8Array(binary.length);
|
|
67
|
+
for (let i = 0; i < binary.length; i++) {
|
|
68
|
+
bytes[i] = binary.charCodeAt(i);
|
|
69
|
+
}
|
|
70
|
+
return bytes;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=KeyFormatConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyFormatConverter.js","sourceRoot":"","sources":["../../../src/reactnative/crypto/KeyFormatConverter.ts"],"names":[],"mappings":"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"}
|