@solana/keys 2.0.0-experimental.457d032 → 2.0.0-experimental.45c014d
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/LICENSE +1 -1
- package/README.md +69 -19
- package/dist/index.browser.cjs +58 -100
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +54 -97
- package/dist/index.browser.js.map +1 -1
- package/dist/index.development.js +116 -321
- package/dist/index.development.js.map +1 -1
- package/dist/index.native.js +54 -86
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +58 -89
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +54 -86
- package/dist/index.node.js.map +1 -1
- package/dist/index.production.min.js +11 -6
- package/dist/types/index.d.ts +1 -2
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/key-pair.d.ts.map +1 -0
- package/dist/types/signatures.d.ts +12 -0
- package/dist/types/signatures.d.ts.map +1 -0
- package/package.json +18 -19
- package/dist/types/base58.d.ts +0 -10
- package/dist/types/guard.d.ts +0 -5
- package/dist/types/pubkey.d.ts +0 -3
package/dist/index.native.js
CHANGED
|
@@ -1,79 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
// ../build-scripts/env-shim.ts
|
|
4
|
-
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
5
|
-
function assertIsBase58EncodedAddress(putativeBase58EncodedAddress) {
|
|
6
|
-
try {
|
|
7
|
-
if (
|
|
8
|
-
// Lowest address (32 bytes of zeroes)
|
|
9
|
-
putativeBase58EncodedAddress.length < 32 || // Highest address (32 bytes of 255)
|
|
10
|
-
putativeBase58EncodedAddress.length > 44
|
|
11
|
-
) {
|
|
12
|
-
throw new Error("Expected input string to decode to a byte array of length 32.");
|
|
13
|
-
}
|
|
14
|
-
const bytes = base58.serialize(putativeBase58EncodedAddress);
|
|
15
|
-
const numBytes = bytes.byteLength;
|
|
16
|
-
if (numBytes !== 32) {
|
|
17
|
-
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
|
|
18
|
-
}
|
|
19
|
-
} catch (e) {
|
|
20
|
-
throw new Error(`\`${putativeBase58EncodedAddress}\` is not a base-58 encoded address`, {
|
|
21
|
-
cause: e
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
function getBase58EncodedAddressCodec(config) {
|
|
26
|
-
return string({
|
|
27
|
-
description: config?.description ?? (__DEV__ ? "A 32-byte account address" : ""),
|
|
28
|
-
encoding: base58,
|
|
29
|
-
size: 32
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
function getBase58EncodedAddressComparator() {
|
|
33
|
-
return new Intl.Collator("en", {
|
|
34
|
-
caseFirst: "lower",
|
|
35
|
-
ignorePunctuation: false,
|
|
36
|
-
localeMatcher: "best fit",
|
|
37
|
-
numeric: false,
|
|
38
|
-
sensitivity: "variant",
|
|
39
|
-
usage: "sort"
|
|
40
|
-
}).compare;
|
|
41
|
-
}
|
|
42
|
-
var cachedEd25519Decision;
|
|
43
|
-
async function isEd25519CurveSupported(subtle) {
|
|
44
|
-
if (cachedEd25519Decision === void 0) {
|
|
45
|
-
cachedEd25519Decision = new Promise((resolve) => {
|
|
46
|
-
subtle.generateKey(
|
|
47
|
-
"Ed25519",
|
|
48
|
-
/* extractable */
|
|
49
|
-
false,
|
|
50
|
-
["sign", "verify"]
|
|
51
|
-
).catch(() => {
|
|
52
|
-
resolve(cachedEd25519Decision = false);
|
|
53
|
-
}).then(() => {
|
|
54
|
-
resolve(cachedEd25519Decision = true);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
if (typeof cachedEd25519Decision === "boolean") {
|
|
59
|
-
return cachedEd25519Decision;
|
|
60
|
-
} else {
|
|
61
|
-
return await cachedEd25519Decision;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async function assertKeyGenerationIsAvailable() {
|
|
65
|
-
if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.generateKey !== "function") {
|
|
66
|
-
throw new Error("No key generation implementation could be found");
|
|
67
|
-
}
|
|
68
|
-
if (!await isEd25519CurveSupported(globalThis.crypto.subtle)) {
|
|
69
|
-
throw new Error("This runtime does not support the generation of Ed25519 keypairs");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async function assertKeyExporterIsAvailable() {
|
|
73
|
-
if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.exportKey !== "function") {
|
|
74
|
-
throw new Error("No key export implementation could be found");
|
|
75
|
-
}
|
|
76
|
-
}
|
|
1
|
+
import { assertKeyGenerationIsAvailable, assertSigningCapabilityIsAvailable, assertVerificationCapabilityIsAvailable } from '@solana/assertions';
|
|
2
|
+
import { getBase58Encoder } from '@solana/codecs-strings';
|
|
77
3
|
|
|
78
4
|
// src/key-pair.ts
|
|
79
5
|
async function generateKeyPair() {
|
|
@@ -90,18 +16,60 @@ async function generateKeyPair() {
|
|
|
90
16
|
);
|
|
91
17
|
return keyPair;
|
|
92
18
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
19
|
+
var base58Encoder;
|
|
20
|
+
function assertIsSignature(putativeSignature) {
|
|
21
|
+
if (!base58Encoder)
|
|
22
|
+
base58Encoder = getBase58Encoder();
|
|
23
|
+
try {
|
|
24
|
+
if (
|
|
25
|
+
// Lowest value (64 bytes of zeroes)
|
|
26
|
+
putativeSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
27
|
+
putativeSignature.length > 88
|
|
28
|
+
) {
|
|
29
|
+
throw new Error("Expected input string to decode to a byte array of length 64.");
|
|
30
|
+
}
|
|
31
|
+
const bytes = base58Encoder.encode(putativeSignature);
|
|
32
|
+
const numBytes = bytes.byteLength;
|
|
33
|
+
if (numBytes !== 64) {
|
|
34
|
+
throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
|
|
35
|
+
}
|
|
36
|
+
} catch (e) {
|
|
37
|
+
throw new Error(`\`${putativeSignature}\` is not a signature`, {
|
|
38
|
+
cause: e
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isSignature(putativeSignature) {
|
|
43
|
+
if (!base58Encoder)
|
|
44
|
+
base58Encoder = getBase58Encoder();
|
|
45
|
+
if (
|
|
46
|
+
// Lowest value (64 bytes of zeroes)
|
|
47
|
+
putativeSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
48
|
+
putativeSignature.length > 88
|
|
49
|
+
) {
|
|
50
|
+
return false;
|
|
99
51
|
}
|
|
100
|
-
const
|
|
101
|
-
const
|
|
102
|
-
|
|
52
|
+
const bytes = base58Encoder.encode(putativeSignature);
|
|
53
|
+
const numBytes = bytes.byteLength;
|
|
54
|
+
if (numBytes !== 64) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
async function signBytes(key, data) {
|
|
60
|
+
await assertSigningCapabilityIsAvailable();
|
|
61
|
+
const signedData = await crypto.subtle.sign("Ed25519", key, data);
|
|
62
|
+
return new Uint8Array(signedData);
|
|
63
|
+
}
|
|
64
|
+
function signature(putativeSignature) {
|
|
65
|
+
assertIsSignature(putativeSignature);
|
|
66
|
+
return putativeSignature;
|
|
67
|
+
}
|
|
68
|
+
async function verifySignature(key, signature2, data) {
|
|
69
|
+
await assertVerificationCapabilityIsAvailable();
|
|
70
|
+
return await crypto.subtle.verify("Ed25519", key, signature2, data);
|
|
103
71
|
}
|
|
104
72
|
|
|
105
|
-
export {
|
|
73
|
+
export { assertIsSignature, generateKeyPair, isSignature, signBytes, signature, verifySignature };
|
|
106
74
|
//# sourceMappingURL=out.js.map
|
|
107
75
|
//# sourceMappingURL=index.native.js.map
|
package/dist/index.native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../src/key-pair.ts","../src/signatures.ts"],"names":["signature"],"mappings":";AAAA,SAAS,sCAAsC;AAE/C,eAAsB,kBAA0C;AAC5D,QAAM,+BAA+B;AACrC,QAAM,UAAU,MAAM,OAAO,OAAO;AAAA;AAAA,IAChB;AAAA;AAAA;AAAA,IACE;AAAA;AAAA;AAAA,IACC,CAAC,QAAQ,QAAQ;AAAA,EACxC;AACA,SAAO;AACX;;;ACVA,SAAS,oCAAoC,+CAA+C;AAE5F,SAAS,wBAAwB;AAKjC,IAAI;AAEG,SAAS,kBAAkB,mBAAmE;AACjG,MAAI,CAAC;AAAe,oBAAgB,iBAAiB;AAErD,MAAI;AAEA;AAAA;AAAA,MAEI,kBAAkB,SAAS;AAAA,MAE3B,kBAAkB,SAAS;AAAA,MAC7B;AACE,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACnF;AAEA,UAAM,QAAQ,cAAc,OAAO,iBAAiB;AACpD,UAAM,WAAW,MAAM;AACvB,QAAI,aAAa,IAAI;AACjB,YAAM,IAAI,MAAM,gFAAgF,QAAQ,EAAE;AAAA,IAC9G;AAAA,EACJ,SAAS,GAAG;AACR,UAAM,IAAI,MAAM,KAAK,iBAAiB,yBAAyB;AAAA,MAC3D,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AACJ;AAEO,SAAS,YAAY,mBAA2D;AACnF,MAAI,CAAC;AAAe,oBAAgB,iBAAiB;AAGrD;AAAA;AAAA,IAEI,kBAAkB,SAAS;AAAA,IAE3B,kBAAkB,SAAS;AAAA,IAC7B;AACE,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ,cAAc,OAAO,iBAAiB;AACpD,QAAM,WAAW,MAAM;AACvB,MAAI,aAAa,IAAI;AACjB,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,eAAsB,UAAU,KAAgB,MAA2C;AACvF,QAAM,mCAAmC;AACzC,QAAM,aAAa,MAAM,OAAO,OAAO,KAAK,WAAW,KAAK,IAAI;AAChE,SAAO,IAAI,WAAW,UAAU;AACpC;AAEO,SAAS,UAAU,mBAAsC;AAC5D,oBAAkB,iBAAiB;AACnC,SAAO;AACX;AAEA,eAAsB,gBAAgB,KAAgBA,YAA2B,MAAoC;AACjH,QAAM,wCAAwC;AAC9C,SAAO,MAAM,OAAO,OAAO,OAAO,WAAW,KAAKA,YAAW,IAAI;AACrE","sourcesContent":["import { assertKeyGenerationIsAvailable } from '@solana/assertions';\n\nexport async function generateKeyPair(): Promise<CryptoKeyPair> {\n await assertKeyGenerationIsAvailable();\n const keyPair = await crypto.subtle.generateKey(\n /* algorithm */ 'Ed25519', // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20\n /* extractable */ false, // Prevents the bytes of the private key from being visible to JS.\n /* allowed uses */ ['sign', 'verify']\n );\n return keyPair as CryptoKeyPair;\n}\n","import { assertSigningCapabilityIsAvailable, assertVerificationCapabilityIsAvailable } from '@solana/assertions';\nimport { Encoder } from '@solana/codecs-core';\nimport { getBase58Encoder } from '@solana/codecs-strings';\n\nexport type Signature = string & { readonly __brand: unique symbol };\nexport type SignatureBytes = Uint8Array & { readonly __brand: unique symbol };\n\nlet base58Encoder: Encoder<string> | undefined;\n\nexport function assertIsSignature(putativeSignature: string): asserts putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n try {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n throw new Error('Expected input string to decode to a byte array of length 64.');\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n const numBytes = bytes.byteLength;\n if (numBytes !== 64) {\n throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);\n }\n } catch (e) {\n throw new Error(`\\`${putativeSignature}\\` is not a signature`, {\n cause: e,\n });\n }\n}\n\nexport function isSignature(putativeSignature: string): putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n const numBytes = bytes.byteLength;\n if (numBytes !== 64) {\n return false;\n }\n return true;\n}\n\nexport async function signBytes(key: CryptoKey, data: Uint8Array): Promise<SignatureBytes> {\n await assertSigningCapabilityIsAvailable();\n const signedData = await crypto.subtle.sign('Ed25519', key, data);\n return new Uint8Array(signedData) as SignatureBytes;\n}\n\nexport function signature(putativeSignature: string): Signature {\n assertIsSignature(putativeSignature);\n return putativeSignature;\n}\n\nexport async function verifySignature(key: CryptoKey, signature: SignatureBytes, data: Uint8Array): Promise<boolean> {\n await assertVerificationCapabilityIsAvailable();\n return await crypto.subtle.verify('Ed25519', key, signature, data);\n}\n"]}
|
package/dist/index.node.cjs
CHANGED
|
@@ -1,113 +1,82 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var assertions = require('@solana/assertions');
|
|
4
|
+
var codecsStrings = require('@solana/codecs-strings');
|
|
4
5
|
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
// src/key-pair.ts
|
|
7
|
+
async function generateKeyPair() {
|
|
8
|
+
await assertions.assertKeyGenerationIsAvailable();
|
|
9
|
+
const keyPair = await crypto.subtle.generateKey(
|
|
10
|
+
/* algorithm */
|
|
11
|
+
"Ed25519",
|
|
12
|
+
// Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20
|
|
13
|
+
/* extractable */
|
|
14
|
+
false,
|
|
15
|
+
// Prevents the bytes of the private key from being visible to JS.
|
|
16
|
+
/* allowed uses */
|
|
17
|
+
["sign", "verify"]
|
|
18
|
+
);
|
|
19
|
+
return keyPair;
|
|
20
|
+
}
|
|
21
|
+
var base58Encoder;
|
|
22
|
+
function assertIsSignature(putativeSignature) {
|
|
23
|
+
if (!base58Encoder)
|
|
24
|
+
base58Encoder = codecsStrings.getBase58Encoder();
|
|
8
25
|
try {
|
|
9
26
|
if (
|
|
10
|
-
// Lowest
|
|
11
|
-
|
|
12
|
-
|
|
27
|
+
// Lowest value (64 bytes of zeroes)
|
|
28
|
+
putativeSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
29
|
+
putativeSignature.length > 88
|
|
13
30
|
) {
|
|
14
|
-
throw new Error("Expected input string to decode to a byte array of length
|
|
31
|
+
throw new Error("Expected input string to decode to a byte array of length 64.");
|
|
15
32
|
}
|
|
16
|
-
const bytes =
|
|
33
|
+
const bytes = base58Encoder.encode(putativeSignature);
|
|
17
34
|
const numBytes = bytes.byteLength;
|
|
18
|
-
if (numBytes !==
|
|
19
|
-
throw new Error(`Expected input string to decode to a byte array of length
|
|
35
|
+
if (numBytes !== 64) {
|
|
36
|
+
throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
|
|
20
37
|
}
|
|
21
38
|
} catch (e) {
|
|
22
|
-
throw new Error(`\`${
|
|
39
|
+
throw new Error(`\`${putativeSignature}\` is not a signature`, {
|
|
23
40
|
cause: e
|
|
24
41
|
});
|
|
25
42
|
}
|
|
26
43
|
}
|
|
27
|
-
function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
caseFirst: "lower",
|
|
37
|
-
ignorePunctuation: false,
|
|
38
|
-
localeMatcher: "best fit",
|
|
39
|
-
numeric: false,
|
|
40
|
-
sensitivity: "variant",
|
|
41
|
-
usage: "sort"
|
|
42
|
-
}).compare;
|
|
43
|
-
}
|
|
44
|
-
var cachedEd25519Decision;
|
|
45
|
-
async function isEd25519CurveSupported(subtle) {
|
|
46
|
-
if (cachedEd25519Decision === void 0) {
|
|
47
|
-
cachedEd25519Decision = new Promise((resolve) => {
|
|
48
|
-
subtle.generateKey(
|
|
49
|
-
"Ed25519",
|
|
50
|
-
/* extractable */
|
|
51
|
-
false,
|
|
52
|
-
["sign", "verify"]
|
|
53
|
-
).catch(() => {
|
|
54
|
-
resolve(cachedEd25519Decision = false);
|
|
55
|
-
}).then(() => {
|
|
56
|
-
resolve(cachedEd25519Decision = true);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
44
|
+
function isSignature(putativeSignature) {
|
|
45
|
+
if (!base58Encoder)
|
|
46
|
+
base58Encoder = codecsStrings.getBase58Encoder();
|
|
47
|
+
if (
|
|
48
|
+
// Lowest value (64 bytes of zeroes)
|
|
49
|
+
putativeSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
50
|
+
putativeSignature.length > 88
|
|
51
|
+
) {
|
|
52
|
+
return false;
|
|
59
53
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return
|
|
54
|
+
const bytes = base58Encoder.encode(putativeSignature);
|
|
55
|
+
const numBytes = bytes.byteLength;
|
|
56
|
+
if (numBytes !== 64) {
|
|
57
|
+
return false;
|
|
64
58
|
}
|
|
59
|
+
return true;
|
|
65
60
|
}
|
|
66
|
-
async function
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (!await isEd25519CurveSupported(globalThis.crypto.subtle)) {
|
|
71
|
-
throw new Error("This runtime does not support the generation of Ed25519 keypairs");
|
|
72
|
-
}
|
|
61
|
+
async function signBytes(key, data) {
|
|
62
|
+
await assertions.assertSigningCapabilityIsAvailable();
|
|
63
|
+
const signedData = await crypto.subtle.sign("Ed25519", key, data);
|
|
64
|
+
return new Uint8Array(signedData);
|
|
73
65
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// src/key-pair.ts
|
|
81
|
-
async function generateKeyPair() {
|
|
82
|
-
await assertKeyGenerationIsAvailable();
|
|
83
|
-
const keyPair = await crypto.subtle.generateKey(
|
|
84
|
-
/* algorithm */
|
|
85
|
-
"Ed25519",
|
|
86
|
-
// Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20
|
|
87
|
-
/* extractable */
|
|
88
|
-
false,
|
|
89
|
-
// Prevents the bytes of the private key from being visible to JS.
|
|
90
|
-
/* allowed uses */
|
|
91
|
-
["sign", "verify"]
|
|
92
|
-
);
|
|
93
|
-
return keyPair;
|
|
66
|
+
function signature(putativeSignature) {
|
|
67
|
+
assertIsSignature(putativeSignature);
|
|
68
|
+
return putativeSignature;
|
|
94
69
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
await assertKeyExporterIsAvailable();
|
|
99
|
-
if (publicKey.type !== "public" || publicKey.algorithm.name !== "Ed25519") {
|
|
100
|
-
throw new Error("The `CryptoKey` must be an `Ed25519` public key");
|
|
101
|
-
}
|
|
102
|
-
const publicKeyBytes = await crypto.subtle.exportKey("raw", publicKey);
|
|
103
|
-
const [base58EncodedAddress] = getBase58EncodedAddressCodec().deserialize(new Uint8Array(publicKeyBytes));
|
|
104
|
-
return base58EncodedAddress;
|
|
70
|
+
async function verifySignature(key, signature2, data) {
|
|
71
|
+
await assertions.assertVerificationCapabilityIsAvailable();
|
|
72
|
+
return await crypto.subtle.verify("Ed25519", key, signature2, data);
|
|
105
73
|
}
|
|
106
74
|
|
|
107
|
-
exports.
|
|
75
|
+
exports.assertIsSignature = assertIsSignature;
|
|
108
76
|
exports.generateKeyPair = generateKeyPair;
|
|
109
|
-
exports.
|
|
110
|
-
exports.
|
|
111
|
-
exports.
|
|
77
|
+
exports.isSignature = isSignature;
|
|
78
|
+
exports.signBytes = signBytes;
|
|
79
|
+
exports.signature = signature;
|
|
80
|
+
exports.verifySignature = verifySignature;
|
|
112
81
|
//# sourceMappingURL=out.js.map
|
|
113
82
|
//# sourceMappingURL=index.node.cjs.map
|
package/dist/index.node.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../src/key-pair.ts","../src/signatures.ts"],"names":["signature"],"mappings":";AAAA,SAAS,sCAAsC;AAE/C,eAAsB,kBAA0C;AAC5D,QAAM,+BAA+B;AACrC,QAAM,UAAU,MAAM,OAAO,OAAO;AAAA;AAAA,IAChB;AAAA;AAAA;AAAA,IACE;AAAA;AAAA;AAAA,IACC,CAAC,QAAQ,QAAQ;AAAA,EACxC;AACA,SAAO;AACX;;;ACVA,SAAS,oCAAoC,+CAA+C;AAE5F,SAAS,wBAAwB;AAKjC,IAAI;AAEG,SAAS,kBAAkB,mBAAmE;AACjG,MAAI,CAAC;AAAe,oBAAgB,iBAAiB;AAErD,MAAI;AAEA;AAAA;AAAA,MAEI,kBAAkB,SAAS;AAAA,MAE3B,kBAAkB,SAAS;AAAA,MAC7B;AACE,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACnF;AAEA,UAAM,QAAQ,cAAc,OAAO,iBAAiB;AACpD,UAAM,WAAW,MAAM;AACvB,QAAI,aAAa,IAAI;AACjB,YAAM,IAAI,MAAM,gFAAgF,QAAQ,EAAE;AAAA,IAC9G;AAAA,EACJ,SAAS,GAAG;AACR,UAAM,IAAI,MAAM,KAAK,iBAAiB,yBAAyB;AAAA,MAC3D,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AACJ;AAEO,SAAS,YAAY,mBAA2D;AACnF,MAAI,CAAC;AAAe,oBAAgB,iBAAiB;AAGrD;AAAA;AAAA,IAEI,kBAAkB,SAAS;AAAA,IAE3B,kBAAkB,SAAS;AAAA,IAC7B;AACE,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ,cAAc,OAAO,iBAAiB;AACpD,QAAM,WAAW,MAAM;AACvB,MAAI,aAAa,IAAI;AACjB,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,eAAsB,UAAU,KAAgB,MAA2C;AACvF,QAAM,mCAAmC;AACzC,QAAM,aAAa,MAAM,OAAO,OAAO,KAAK,WAAW,KAAK,IAAI;AAChE,SAAO,IAAI,WAAW,UAAU;AACpC;AAEO,SAAS,UAAU,mBAAsC;AAC5D,oBAAkB,iBAAiB;AACnC,SAAO;AACX;AAEA,eAAsB,gBAAgB,KAAgBA,YAA2B,MAAoC;AACjH,QAAM,wCAAwC;AAC9C,SAAO,MAAM,OAAO,OAAO,OAAO,WAAW,KAAKA,YAAW,IAAI;AACrE","sourcesContent":["import { assertKeyGenerationIsAvailable } from '@solana/assertions';\n\nexport async function generateKeyPair(): Promise<CryptoKeyPair> {\n await assertKeyGenerationIsAvailable();\n const keyPair = await crypto.subtle.generateKey(\n /* algorithm */ 'Ed25519', // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20\n /* extractable */ false, // Prevents the bytes of the private key from being visible to JS.\n /* allowed uses */ ['sign', 'verify']\n );\n return keyPair as CryptoKeyPair;\n}\n","import { assertSigningCapabilityIsAvailable, assertVerificationCapabilityIsAvailable } from '@solana/assertions';\nimport { Encoder } from '@solana/codecs-core';\nimport { getBase58Encoder } from '@solana/codecs-strings';\n\nexport type Signature = string & { readonly __brand: unique symbol };\nexport type SignatureBytes = Uint8Array & { readonly __brand: unique symbol };\n\nlet base58Encoder: Encoder<string> | undefined;\n\nexport function assertIsSignature(putativeSignature: string): asserts putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n try {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n throw new Error('Expected input string to decode to a byte array of length 64.');\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n const numBytes = bytes.byteLength;\n if (numBytes !== 64) {\n throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);\n }\n } catch (e) {\n throw new Error(`\\`${putativeSignature}\\` is not a signature`, {\n cause: e,\n });\n }\n}\n\nexport function isSignature(putativeSignature: string): putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n const numBytes = bytes.byteLength;\n if (numBytes !== 64) {\n return false;\n }\n return true;\n}\n\nexport async function signBytes(key: CryptoKey, data: Uint8Array): Promise<SignatureBytes> {\n await assertSigningCapabilityIsAvailable();\n const signedData = await crypto.subtle.sign('Ed25519', key, data);\n return new Uint8Array(signedData) as SignatureBytes;\n}\n\nexport function signature(putativeSignature: string): Signature {\n assertIsSignature(putativeSignature);\n return putativeSignature;\n}\n\nexport async function verifySignature(key: CryptoKey, signature: SignatureBytes, data: Uint8Array): Promise<boolean> {\n await assertVerificationCapabilityIsAvailable();\n return await crypto.subtle.verify('Ed25519', key, signature, data);\n}\n"]}
|
package/dist/index.node.js
CHANGED
|
@@ -1,79 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
// ../build-scripts/env-shim.ts
|
|
4
|
-
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
5
|
-
function assertIsBase58EncodedAddress(putativeBase58EncodedAddress) {
|
|
6
|
-
try {
|
|
7
|
-
if (
|
|
8
|
-
// Lowest address (32 bytes of zeroes)
|
|
9
|
-
putativeBase58EncodedAddress.length < 32 || // Highest address (32 bytes of 255)
|
|
10
|
-
putativeBase58EncodedAddress.length > 44
|
|
11
|
-
) {
|
|
12
|
-
throw new Error("Expected input string to decode to a byte array of length 32.");
|
|
13
|
-
}
|
|
14
|
-
const bytes = base58.serialize(putativeBase58EncodedAddress);
|
|
15
|
-
const numBytes = bytes.byteLength;
|
|
16
|
-
if (numBytes !== 32) {
|
|
17
|
-
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
|
|
18
|
-
}
|
|
19
|
-
} catch (e) {
|
|
20
|
-
throw new Error(`\`${putativeBase58EncodedAddress}\` is not a base-58 encoded address`, {
|
|
21
|
-
cause: e
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
function getBase58EncodedAddressCodec(config) {
|
|
26
|
-
return string({
|
|
27
|
-
description: config?.description ?? (__DEV__ ? "A 32-byte account address" : ""),
|
|
28
|
-
encoding: base58,
|
|
29
|
-
size: 32
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
function getBase58EncodedAddressComparator() {
|
|
33
|
-
return new Intl.Collator("en", {
|
|
34
|
-
caseFirst: "lower",
|
|
35
|
-
ignorePunctuation: false,
|
|
36
|
-
localeMatcher: "best fit",
|
|
37
|
-
numeric: false,
|
|
38
|
-
sensitivity: "variant",
|
|
39
|
-
usage: "sort"
|
|
40
|
-
}).compare;
|
|
41
|
-
}
|
|
42
|
-
var cachedEd25519Decision;
|
|
43
|
-
async function isEd25519CurveSupported(subtle) {
|
|
44
|
-
if (cachedEd25519Decision === void 0) {
|
|
45
|
-
cachedEd25519Decision = new Promise((resolve) => {
|
|
46
|
-
subtle.generateKey(
|
|
47
|
-
"Ed25519",
|
|
48
|
-
/* extractable */
|
|
49
|
-
false,
|
|
50
|
-
["sign", "verify"]
|
|
51
|
-
).catch(() => {
|
|
52
|
-
resolve(cachedEd25519Decision = false);
|
|
53
|
-
}).then(() => {
|
|
54
|
-
resolve(cachedEd25519Decision = true);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
if (typeof cachedEd25519Decision === "boolean") {
|
|
59
|
-
return cachedEd25519Decision;
|
|
60
|
-
} else {
|
|
61
|
-
return await cachedEd25519Decision;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async function assertKeyGenerationIsAvailable() {
|
|
65
|
-
if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.generateKey !== "function") {
|
|
66
|
-
throw new Error("No key generation implementation could be found");
|
|
67
|
-
}
|
|
68
|
-
if (!await isEd25519CurveSupported(globalThis.crypto.subtle)) {
|
|
69
|
-
throw new Error("This runtime does not support the generation of Ed25519 keypairs");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async function assertKeyExporterIsAvailable() {
|
|
73
|
-
if (typeof globalThis.crypto === "undefined" || typeof globalThis.crypto.subtle?.exportKey !== "function") {
|
|
74
|
-
throw new Error("No key export implementation could be found");
|
|
75
|
-
}
|
|
76
|
-
}
|
|
1
|
+
import { assertKeyGenerationIsAvailable, assertSigningCapabilityIsAvailable, assertVerificationCapabilityIsAvailable } from '@solana/assertions';
|
|
2
|
+
import { getBase58Encoder } from '@solana/codecs-strings';
|
|
77
3
|
|
|
78
4
|
// src/key-pair.ts
|
|
79
5
|
async function generateKeyPair() {
|
|
@@ -90,18 +16,60 @@ async function generateKeyPair() {
|
|
|
90
16
|
);
|
|
91
17
|
return keyPair;
|
|
92
18
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
19
|
+
var base58Encoder;
|
|
20
|
+
function assertIsSignature(putativeSignature) {
|
|
21
|
+
if (!base58Encoder)
|
|
22
|
+
base58Encoder = getBase58Encoder();
|
|
23
|
+
try {
|
|
24
|
+
if (
|
|
25
|
+
// Lowest value (64 bytes of zeroes)
|
|
26
|
+
putativeSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
27
|
+
putativeSignature.length > 88
|
|
28
|
+
) {
|
|
29
|
+
throw new Error("Expected input string to decode to a byte array of length 64.");
|
|
30
|
+
}
|
|
31
|
+
const bytes = base58Encoder.encode(putativeSignature);
|
|
32
|
+
const numBytes = bytes.byteLength;
|
|
33
|
+
if (numBytes !== 64) {
|
|
34
|
+
throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
|
|
35
|
+
}
|
|
36
|
+
} catch (e) {
|
|
37
|
+
throw new Error(`\`${putativeSignature}\` is not a signature`, {
|
|
38
|
+
cause: e
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isSignature(putativeSignature) {
|
|
43
|
+
if (!base58Encoder)
|
|
44
|
+
base58Encoder = getBase58Encoder();
|
|
45
|
+
if (
|
|
46
|
+
// Lowest value (64 bytes of zeroes)
|
|
47
|
+
putativeSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
48
|
+
putativeSignature.length > 88
|
|
49
|
+
) {
|
|
50
|
+
return false;
|
|
99
51
|
}
|
|
100
|
-
const
|
|
101
|
-
const
|
|
102
|
-
|
|
52
|
+
const bytes = base58Encoder.encode(putativeSignature);
|
|
53
|
+
const numBytes = bytes.byteLength;
|
|
54
|
+
if (numBytes !== 64) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
async function signBytes(key, data) {
|
|
60
|
+
await assertSigningCapabilityIsAvailable();
|
|
61
|
+
const signedData = await crypto.subtle.sign("Ed25519", key, data);
|
|
62
|
+
return new Uint8Array(signedData);
|
|
63
|
+
}
|
|
64
|
+
function signature(putativeSignature) {
|
|
65
|
+
assertIsSignature(putativeSignature);
|
|
66
|
+
return putativeSignature;
|
|
67
|
+
}
|
|
68
|
+
async function verifySignature(key, signature2, data) {
|
|
69
|
+
await assertVerificationCapabilityIsAvailable();
|
|
70
|
+
return await crypto.subtle.verify("Ed25519", key, signature2, data);
|
|
103
71
|
}
|
|
104
72
|
|
|
105
|
-
export {
|
|
73
|
+
export { assertIsSignature, generateKeyPair, isSignature, signBytes, signature, verifySignature };
|
|
106
74
|
//# sourceMappingURL=out.js.map
|
|
107
75
|
//# sourceMappingURL=index.node.js.map
|
package/dist/index.node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../src/key-pair.ts","../src/signatures.ts"],"names":["signature"],"mappings":";AAAA,SAAS,sCAAsC;AAE/C,eAAsB,kBAA0C;AAC5D,QAAM,+BAA+B;AACrC,QAAM,UAAU,MAAM,OAAO,OAAO;AAAA;AAAA,IAChB;AAAA;AAAA;AAAA,IACE;AAAA;AAAA;AAAA,IACC,CAAC,QAAQ,QAAQ;AAAA,EACxC;AACA,SAAO;AACX;;;ACVA,SAAS,oCAAoC,+CAA+C;AAE5F,SAAS,wBAAwB;AAKjC,IAAI;AAEG,SAAS,kBAAkB,mBAAmE;AACjG,MAAI,CAAC;AAAe,oBAAgB,iBAAiB;AAErD,MAAI;AAEA;AAAA;AAAA,MAEI,kBAAkB,SAAS;AAAA,MAE3B,kBAAkB,SAAS;AAAA,MAC7B;AACE,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACnF;AAEA,UAAM,QAAQ,cAAc,OAAO,iBAAiB;AACpD,UAAM,WAAW,MAAM;AACvB,QAAI,aAAa,IAAI;AACjB,YAAM,IAAI,MAAM,gFAAgF,QAAQ,EAAE;AAAA,IAC9G;AAAA,EACJ,SAAS,GAAG;AACR,UAAM,IAAI,MAAM,KAAK,iBAAiB,yBAAyB;AAAA,MAC3D,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AACJ;AAEO,SAAS,YAAY,mBAA2D;AACnF,MAAI,CAAC;AAAe,oBAAgB,iBAAiB;AAGrD;AAAA;AAAA,IAEI,kBAAkB,SAAS;AAAA,IAE3B,kBAAkB,SAAS;AAAA,IAC7B;AACE,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ,cAAc,OAAO,iBAAiB;AACpD,QAAM,WAAW,MAAM;AACvB,MAAI,aAAa,IAAI;AACjB,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,eAAsB,UAAU,KAAgB,MAA2C;AACvF,QAAM,mCAAmC;AACzC,QAAM,aAAa,MAAM,OAAO,OAAO,KAAK,WAAW,KAAK,IAAI;AAChE,SAAO,IAAI,WAAW,UAAU;AACpC;AAEO,SAAS,UAAU,mBAAsC;AAC5D,oBAAkB,iBAAiB;AACnC,SAAO;AACX;AAEA,eAAsB,gBAAgB,KAAgBA,YAA2B,MAAoC;AACjH,QAAM,wCAAwC;AAC9C,SAAO,MAAM,OAAO,OAAO,OAAO,WAAW,KAAKA,YAAW,IAAI;AACrE","sourcesContent":["import { assertKeyGenerationIsAvailable } from '@solana/assertions';\n\nexport async function generateKeyPair(): Promise<CryptoKeyPair> {\n await assertKeyGenerationIsAvailable();\n const keyPair = await crypto.subtle.generateKey(\n /* algorithm */ 'Ed25519', // Native implementation status: https://github.com/WICG/webcrypto-secure-curves/issues/20\n /* extractable */ false, // Prevents the bytes of the private key from being visible to JS.\n /* allowed uses */ ['sign', 'verify']\n );\n return keyPair as CryptoKeyPair;\n}\n","import { assertSigningCapabilityIsAvailable, assertVerificationCapabilityIsAvailable } from '@solana/assertions';\nimport { Encoder } from '@solana/codecs-core';\nimport { getBase58Encoder } from '@solana/codecs-strings';\n\nexport type Signature = string & { readonly __brand: unique symbol };\nexport type SignatureBytes = Uint8Array & { readonly __brand: unique symbol };\n\nlet base58Encoder: Encoder<string> | undefined;\n\nexport function assertIsSignature(putativeSignature: string): asserts putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n try {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n throw new Error('Expected input string to decode to a byte array of length 64.');\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n const numBytes = bytes.byteLength;\n if (numBytes !== 64) {\n throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);\n }\n } catch (e) {\n throw new Error(`\\`${putativeSignature}\\` is not a signature`, {\n cause: e,\n });\n }\n}\n\nexport function isSignature(putativeSignature: string): putativeSignature is Signature {\n if (!base58Encoder) base58Encoder = getBase58Encoder();\n\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest value (64 bytes of zeroes)\n putativeSignature.length < 64 ||\n // Highest value (64 bytes of 255)\n putativeSignature.length > 88\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const bytes = base58Encoder.encode(putativeSignature);\n const numBytes = bytes.byteLength;\n if (numBytes !== 64) {\n return false;\n }\n return true;\n}\n\nexport async function signBytes(key: CryptoKey, data: Uint8Array): Promise<SignatureBytes> {\n await assertSigningCapabilityIsAvailable();\n const signedData = await crypto.subtle.sign('Ed25519', key, data);\n return new Uint8Array(signedData) as SignatureBytes;\n}\n\nexport function signature(putativeSignature: string): Signature {\n assertIsSignature(putativeSignature);\n return putativeSignature;\n}\n\nexport async function verifySignature(key: CryptoKey, signature: SignatureBytes, data: Uint8Array): Promise<boolean> {\n await assertVerificationCapabilityIsAvailable();\n return await crypto.subtle.verify('Ed25519', key, signature, data);\n}\n"]}
|