@dxos/crypto 0.10.0 → 0.11.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.
@@ -0,0 +1,126 @@
1
+ import { subtleCrypto, webcrypto } from "#subtle";
2
+ import { invariant } from "@dxos/invariant";
3
+ import { PUBLIC_KEY_LENGTH, PublicKey, SECRET_KEY_LENGTH } from "@dxos/keys";
4
+ import crypto, { verify as verify$1 } from "@dxos/vendor-hypercore/hypercore-crypto";
5
+ export * from "#subtle";
6
+ //#region src/keys.ts
7
+ var __dxlog_file = "/__w/dxos/dxos/packages/common/crypto/src/keys.ts";
8
+ var SIGNATURE_LENGTH = 64;
9
+ /**
10
+ * @deprecated
11
+ */
12
+ var createId = () => PublicKey.stringify(randomBytes(32));
13
+ var createKeyPair = (seed) => {
14
+ if (seed) {
15
+ invariant(seed.length >= 32, "Seedphrase too sort. Expecting length of 32.", {
16
+ "~LogMeta": "~LogMeta",
17
+ F: __dxlog_file,
18
+ L: 19,
19
+ S: void 0,
20
+ A: ["seed.length >= 32", "'Seedphrase too sort. Expecting length of 32.'"]
21
+ });
22
+ return crypto.keyPair(seed.slice(0, 32));
23
+ }
24
+ return crypto.keyPair();
25
+ };
26
+ var validateKeyPair = (publicKey, secretKey) => crypto.validateKeyPair({
27
+ publicKey: publicKey.asBuffer(),
28
+ secretKey
29
+ });
30
+ var discoveryKey = (key) => crypto.discoveryKey(PublicKey.from(key).asBuffer().slice(1));
31
+ /**
32
+ * Return random bytes of length.
33
+ * @param [length=32]
34
+ * @return {Buffer}
35
+ */
36
+ var randomBytes = (length = 32) => crypto.randomBytes(length);
37
+ /**
38
+ * Sign the contents of message with secret_key
39
+ * @param {Buffer} message
40
+ * @param {Buffer} secretKey
41
+ * @returns {Buffer} signature
42
+ */
43
+ var sign = (message, secretKey) => {
44
+ invariant(Buffer.isBuffer(message), void 0, {
45
+ "~LogMeta": "~LogMeta",
46
+ F: __dxlog_file,
47
+ L: 49,
48
+ S: void 0,
49
+ A: ["Buffer.isBuffer(message)", ""]
50
+ });
51
+ invariant(Buffer.isBuffer(secretKey) && secretKey.length === SECRET_KEY_LENGTH, void 0, {
52
+ "~LogMeta": "~LogMeta",
53
+ F: __dxlog_file,
54
+ L: 50,
55
+ S: void 0,
56
+ A: ["Buffer.isBuffer(secretKey) && secretKey.length === SECRET_KEY_LENGTH", ""]
57
+ });
58
+ return crypto.sign(message, secretKey);
59
+ };
60
+ /**
61
+ * Verifies the signature against the message and public_key.
62
+ * @param {Buffer} message
63
+ * @param {Buffer} publicKey
64
+ * @param {Buffer} signature
65
+ * @return {boolean}
66
+ */
67
+ var verify = (message, signature, publicKey) => {
68
+ invariant(Buffer.isBuffer(message), void 0, {
69
+ "~LogMeta": "~LogMeta",
70
+ F: __dxlog_file,
71
+ L: 63,
72
+ S: void 0,
73
+ A: ["Buffer.isBuffer(message)", ""]
74
+ });
75
+ invariant(Buffer.isBuffer(signature) && signature.length === 64, void 0, {
76
+ "~LogMeta": "~LogMeta",
77
+ F: __dxlog_file,
78
+ L: 64,
79
+ S: void 0,
80
+ A: ["Buffer.isBuffer(signature) && signature.length === SIGNATURE_LENGTH", ""]
81
+ });
82
+ invariant(Buffer.isBuffer(publicKey) && publicKey.length === PUBLIC_KEY_LENGTH, void 0, {
83
+ "~LogMeta": "~LogMeta",
84
+ F: __dxlog_file,
85
+ L: 65,
86
+ S: void 0,
87
+ A: ["Buffer.isBuffer(publicKey) && publicKey.length === PUBLIC_KEY_LENGTH", ""]
88
+ });
89
+ return crypto.verify(message, signature, publicKey);
90
+ };
91
+ //#endregion
92
+ //#region src/uuid.ts
93
+ var randomUUID = () => {
94
+ return webcrypto.randomUUID();
95
+ };
96
+ //#endregion
97
+ //#region src/validator.ts
98
+ /**
99
+ * Generator for signature validation function.
100
+ * @param {String} publicKey
101
+ */
102
+ var getSignatureValidator = (publicKey) => (message, signature) => verify$1(message, signature, PublicKey.bufferize(publicKey));
103
+ //#endregion
104
+ //#region src/verify.ts
105
+ /**
106
+ * Verify a signature with the given key.
107
+ */
108
+ var verifySignature = async (key, message, signature, algorithm = {
109
+ name: "ECDSA",
110
+ namedCurve: "P-256"
111
+ }) => {
112
+ let publicKey;
113
+ try {
114
+ publicKey = await subtleCrypto.importKey("raw", key.asUint8Array(), algorithm, true, ["verify"]);
115
+ } catch {
116
+ return false;
117
+ }
118
+ return subtleCrypto.verify({
119
+ name: algorithm.name,
120
+ hash: "SHA-256"
121
+ }, publicKey, signature, message);
122
+ };
123
+ //#endregion
124
+ export { SIGNATURE_LENGTH, createId, createKeyPair, discoveryKey, getSignatureValidator, randomBytes, randomUUID, sign, validateKeyPair, verify, verifySignature };
125
+
126
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/keys.ts","../../src/uuid.ts","../../src/validator.ts","../../src/verify.ts"],"sourcesContent":["//\n// Copyright 2020 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { type KeyPair, PUBLIC_KEY_LENGTH, PublicKey, type PublicKeyLike, SECRET_KEY_LENGTH } from '@dxos/keys';\nimport crypto from '@dxos/vendor-hypercore/hypercore-crypto';\n\nexport const SIGNATURE_LENGTH = 64;\n\n/**\n * @deprecated\n */\n// TODO(burdon): Remove.\nexport const createId = (): string => PublicKey.stringify(randomBytes(32));\n\nexport const createKeyPair = (seed?: Buffer): KeyPair => {\n if (seed) {\n invariant(seed.length >= 32, 'Seedphrase too sort. Expecting length of 32.');\n return crypto.keyPair(seed.slice(0, 32));\n }\n\n // TODO(burdon): Enable seed for debugging.\n return crypto.keyPair();\n};\n\n// TODO(burdon): Buffer.\nexport const validateKeyPair = (publicKey: PublicKey, secretKey: Buffer) =>\n crypto.validateKeyPair({ publicKey: publicKey.asBuffer(), secretKey });\n\n// TODO(dmaretskyi): Slicing because webcrypto keys are too long.\nexport const discoveryKey = (key: PublicKeyLike): Buffer =>\n crypto.discoveryKey(PublicKey.from(key).asBuffer().slice(1));\n\n/**\n * Return random bytes of length.\n * @param [length=32]\n * @return {Buffer}\n */\nexport const randomBytes = (length = 32): Buffer => crypto.randomBytes(length);\n\n/**\n * Sign the contents of message with secret_key\n * @param {Buffer} message\n * @param {Buffer} secretKey\n * @returns {Buffer} signature\n */\nexport const sign = (message: Buffer, secretKey: Buffer): Buffer => {\n invariant(Buffer.isBuffer(message));\n invariant(Buffer.isBuffer(secretKey) && secretKey.length === SECRET_KEY_LENGTH);\n\n return crypto.sign(message, secretKey);\n};\n\n/**\n * Verifies the signature against the message and public_key.\n * @param {Buffer} message\n * @param {Buffer} publicKey\n * @param {Buffer} signature\n * @return {boolean}\n */\nexport const verify = (message: Buffer, signature: Buffer, publicKey: Buffer): boolean => {\n invariant(Buffer.isBuffer(message));\n invariant(Buffer.isBuffer(signature) && signature.length === SIGNATURE_LENGTH);\n invariant(Buffer.isBuffer(publicKey) && publicKey.length === PUBLIC_KEY_LENGTH);\n\n return crypto.verify(message, signature, publicKey);\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { webcrypto } from '#subtle';\n\nexport const randomUUID = (): string => {\n return webcrypto.randomUUID();\n};\n","//\n// Copyright 2020 DXOS.org\n//\n\nimport { PublicKey } from '@dxos/keys';\nimport { verify } from '@dxos/vendor-hypercore/hypercore-crypto';\n\n/**\n * Generator for signature validation function.\n * @param {String} publicKey\n */\nexport const getSignatureValidator = (publicKey: string) => (message: Buffer, signature: Buffer) =>\n verify(message, signature, PublicKey.bufferize(publicKey));\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { type PublicKey } from '@dxos/keys';\n\nimport { subtleCrypto } from '#subtle';\n\n/**\n * Verify a signature with the given key.\n */\nexport const verifySignature = async (\n key: PublicKey,\n message: Uint8Array,\n signature: Uint8Array,\n algorithm: { name: string; namedCurve?: string } = { name: 'ECDSA', namedCurve: 'P-256' },\n): Promise<boolean> => {\n let publicKey!: CryptoKey;\n\n try {\n publicKey = await subtleCrypto.importKey('raw', key.asUint8Array() as Uint8Array<ArrayBuffer>, algorithm, true, [\n 'verify',\n ]);\n } catch {\n return false;\n }\n\n return subtleCrypto.verify(\n {\n name: algorithm.name,\n hash: 'SHA-256',\n },\n publicKey,\n signature as Uint8Array<ArrayBuffer>,\n message as Uint8Array<ArrayBuffer>,\n );\n};\n"],"mappings":";;;;;;;AAQA,IAAa,mBAAmB;;;;AAMhC,IAAa,iBAAyB,UAAU,UAAU,YAAY,EAAE,CAAC;AAEzE,IAAa,iBAAiB,SAA2B;CACvD,IAAI,MAAM;EACR,UAAU,KAAK,UAAU,IAAI,gDAA6C;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA,KAAA;GAAA,GAAA,CAAA,qBAAA,gDAAA;EAAA,CAAC;EAC3E,OAAO,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;CACzC;CAGA,OAAO,OAAO,QAAQ;AACxB;AAGA,IAAa,mBAAmB,WAAsB,cACpD,OAAO,gBAAgB;CAAE,WAAW,UAAU,SAAS;CAAG;AAAU,CAAC;AAGvE,IAAa,gBAAgB,QAC3B,OAAO,aAAa,UAAU,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;;;;;;AAO7D,IAAa,eAAe,SAAS,OAAe,OAAO,YAAY,MAAM;;;;;;;AAQ7E,IAAa,QAAQ,SAAiB,cAA8B;CAClE,UAAU,OAAO,SAAS,OAAO,GAAA,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,4BAAA,EAAA;CAAA,CAAC;CAClC,UAAU,OAAO,SAAS,SAAS,KAAK,UAAU,WAAW,mBAAgB,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,wEAAA,EAAA;CAAA,CAAC;CAE9E,OAAO,OAAO,KAAK,SAAS,SAAS;AACvC;;;;;;;;AASA,IAAa,UAAU,SAAiB,WAAmB,cAA+B;CACxF,UAAU,OAAO,SAAS,OAAO,GAAA,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,4BAAA,EAAA;CAAA,CAAC;CAClC,UAAU,OAAO,SAAS,SAAS,KAAK,UAAU,WAAA,IAA0B,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,uEAAA,EAAA;CAAA,CAAC;CAC7E,UAAU,OAAO,SAAS,SAAS,KAAK,UAAU,WAAW,mBAAgB,KAAA,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA,KAAA;EAAA,GAAA,CAAA,wEAAA,EAAA;CAAA,CAAC;CAE9E,OAAO,OAAO,OAAO,SAAS,WAAW,SAAS;AACpD;;;AC7DA,IAAa,mBAA2B;CACtC,OAAO,UAAU,WAAW;AAC9B;;;;;;;ACGA,IAAa,yBAAyB,eAAuB,SAAiB,cAC5E,SAAO,SAAS,WAAW,UAAU,UAAU,SAAS,CAAC;;;;;;ACD3D,IAAa,kBAAkB,OAC7B,KACA,SACA,WACA,YAAmD;CAAE,MAAM;CAAS,YAAY;AAAQ,MACnE;CACrB,IAAI;CAEJ,IAAI;EACF,YAAY,MAAM,aAAa,UAAU,OAAO,IAAI,aAAa,GAA8B,WAAW,MAAM,CAC9G,QACF,CAAC;CACH,QAAQ;EACN,OAAO;CACT;CAEA,OAAO,aAAa,OAClB;EACE,MAAM,UAAU;EAChB,MAAM;CACR,GACA,WACA,WACA,OACF;AACF"}