@haneullabs/signers 0.1.0

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.
Files changed (88) hide show
  1. package/CHANGELOG.md +555 -0
  2. package/README.md +200 -0
  3. package/aws/package.json +6 -0
  4. package/dist/cjs/aws/aws-client.d.ts +43 -0
  5. package/dist/cjs/aws/aws-client.js +79 -0
  6. package/dist/cjs/aws/aws-client.js.map +7 -0
  7. package/dist/cjs/aws/aws-kms-signer.d.ts +61 -0
  8. package/dist/cjs/aws/aws-kms-signer.js +114 -0
  9. package/dist/cjs/aws/aws-kms-signer.js.map +7 -0
  10. package/dist/cjs/aws/aws4fetch.d.ts +125 -0
  11. package/dist/cjs/aws/aws4fetch.js +382 -0
  12. package/dist/cjs/aws/aws4fetch.js.map +7 -0
  13. package/dist/cjs/aws/index.d.ts +5 -0
  14. package/dist/cjs/aws/index.js +25 -0
  15. package/dist/cjs/aws/index.js.map +7 -0
  16. package/dist/cjs/gcp/gcp-kms-client.d.ts +68 -0
  17. package/dist/cjs/gcp/gcp-kms-client.js +147 -0
  18. package/dist/cjs/gcp/gcp-kms-client.js.map +7 -0
  19. package/dist/cjs/gcp/index.d.ts +4 -0
  20. package/dist/cjs/gcp/index.js +25 -0
  21. package/dist/cjs/gcp/index.js.map +7 -0
  22. package/dist/cjs/ledger/bcs.d.ts +14 -0
  23. package/dist/cjs/ledger/bcs.js +85 -0
  24. package/dist/cjs/ledger/bcs.js.map +7 -0
  25. package/dist/cjs/ledger/index.d.ts +66 -0
  26. package/dist/cjs/ledger/index.js +158 -0
  27. package/dist/cjs/ledger/index.js.map +7 -0
  28. package/dist/cjs/ledger/objects.d.ts +5 -0
  29. package/dist/cjs/ledger/objects.js +60 -0
  30. package/dist/cjs/ledger/objects.js.map +7 -0
  31. package/dist/cjs/package.json +5 -0
  32. package/dist/cjs/utils/utils.d.ts +18 -0
  33. package/dist/cjs/utils/utils.js +85 -0
  34. package/dist/cjs/utils/utils.js.map +7 -0
  35. package/dist/cjs/webcrypto/index.d.ts +26 -0
  36. package/dist/cjs/webcrypto/index.js +112 -0
  37. package/dist/cjs/webcrypto/index.js.map +7 -0
  38. package/dist/esm/aws/aws-client.d.ts +43 -0
  39. package/dist/esm/aws/aws-client.js +59 -0
  40. package/dist/esm/aws/aws-client.js.map +7 -0
  41. package/dist/esm/aws/aws-kms-signer.d.ts +61 -0
  42. package/dist/esm/aws/aws-kms-signer.js +94 -0
  43. package/dist/esm/aws/aws-kms-signer.js.map +7 -0
  44. package/dist/esm/aws/aws4fetch.d.ts +125 -0
  45. package/dist/esm/aws/aws4fetch.js +362 -0
  46. package/dist/esm/aws/aws4fetch.js.map +7 -0
  47. package/dist/esm/aws/index.d.ts +5 -0
  48. package/dist/esm/aws/index.js +5 -0
  49. package/dist/esm/aws/index.js.map +7 -0
  50. package/dist/esm/gcp/gcp-kms-client.d.ts +68 -0
  51. package/dist/esm/gcp/gcp-kms-client.js +127 -0
  52. package/dist/esm/gcp/gcp-kms-client.js.map +7 -0
  53. package/dist/esm/gcp/index.d.ts +4 -0
  54. package/dist/esm/gcp/index.js +5 -0
  55. package/dist/esm/gcp/index.js.map +7 -0
  56. package/dist/esm/ledger/bcs.d.ts +14 -0
  57. package/dist/esm/ledger/bcs.js +70 -0
  58. package/dist/esm/ledger/bcs.js.map +7 -0
  59. package/dist/esm/ledger/index.d.ts +66 -0
  60. package/dist/esm/ledger/index.js +138 -0
  61. package/dist/esm/ledger/index.js.map +7 -0
  62. package/dist/esm/ledger/objects.d.ts +5 -0
  63. package/dist/esm/ledger/objects.js +40 -0
  64. package/dist/esm/ledger/objects.js.map +7 -0
  65. package/dist/esm/package.json +5 -0
  66. package/dist/esm/utils/utils.d.ts +18 -0
  67. package/dist/esm/utils/utils.js +65 -0
  68. package/dist/esm/utils/utils.js.map +7 -0
  69. package/dist/esm/webcrypto/index.d.ts +26 -0
  70. package/dist/esm/webcrypto/index.js +92 -0
  71. package/dist/esm/webcrypto/index.js.map +7 -0
  72. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  73. package/dist/tsconfig.tsbuildinfo +1 -0
  74. package/gcp/package.json +6 -0
  75. package/ledger/package.json +6 -0
  76. package/package.json +76 -0
  77. package/src/aws/aws-client.ts +107 -0
  78. package/src/aws/aws-kms-signer.ts +111 -0
  79. package/src/aws/aws4fetch.ts +502 -0
  80. package/src/aws/index.ts +9 -0
  81. package/src/gcp/gcp-kms-client.ts +165 -0
  82. package/src/gcp/index.ts +9 -0
  83. package/src/ledger/bcs.ts +87 -0
  84. package/src/ledger/index.ts +164 -0
  85. package/src/ledger/objects.ts +56 -0
  86. package/src/utils/utils.ts +119 -0
  87. package/src/webcrypto/index.ts +108 -0
  88. package/webcrypto/package.json +6 -0
@@ -0,0 +1,108 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { SignatureScheme } from '@haneullabs/haneul/cryptography';
5
+ import { Signer } from '@haneullabs/haneul/cryptography';
6
+ import { Secp256r1PublicKey } from '@haneullabs/haneul/keypairs/secp256r1';
7
+ import { secp256r1 } from '@noble/curves/p256';
8
+
9
+ // Convert from uncompressed (65 bytes) to compressed (33 bytes) format
10
+ function getCompressedPublicKey(publicKey: Uint8Array) {
11
+ const rawBytes = new Uint8Array(publicKey);
12
+ const x = rawBytes.slice(1, 33);
13
+ const y = rawBytes.slice(33, 65);
14
+
15
+ const prefix = (y[31] & 1) === 0 ? 0x02 : 0x03;
16
+
17
+ const compressed = new Uint8Array(Secp256r1PublicKey.SIZE);
18
+ compressed[0] = prefix;
19
+ compressed.set(x, 1);
20
+
21
+ return compressed;
22
+ }
23
+
24
+ export interface ExportedWebCryptoKeypair {
25
+ privateKey: CryptoKey;
26
+ publicKey: Uint8Array<ArrayBuffer>;
27
+ }
28
+
29
+ export class WebCryptoSigner extends Signer {
30
+ privateKey: CryptoKey;
31
+
32
+ #publicKey: Secp256r1PublicKey;
33
+
34
+ static async generate({ extractable = false }: { extractable?: boolean } = {}) {
35
+ const keypair = await globalThis.crypto.subtle.generateKey(
36
+ {
37
+ name: 'ECDSA',
38
+ namedCurve: 'P-256',
39
+ },
40
+ extractable,
41
+ ['sign', 'verify'],
42
+ );
43
+
44
+ const publicKey = await globalThis.crypto.subtle.exportKey('raw', keypair.publicKey);
45
+
46
+ return new WebCryptoSigner(
47
+ keypair.privateKey,
48
+ getCompressedPublicKey(new Uint8Array(publicKey)),
49
+ );
50
+ }
51
+
52
+ /**
53
+ * Imports a keypair using the value returned by `export()`.
54
+ */
55
+ static import(data: ExportedWebCryptoKeypair) {
56
+ return new WebCryptoSigner(data.privateKey, data.publicKey);
57
+ }
58
+
59
+ getKeyScheme(): SignatureScheme {
60
+ return 'Secp256r1';
61
+ }
62
+
63
+ constructor(privateKey: CryptoKey, publicKey: Uint8Array) {
64
+ super();
65
+ this.privateKey = privateKey;
66
+ this.#publicKey = new Secp256r1PublicKey(publicKey);
67
+ }
68
+
69
+ /**
70
+ * Exports the keypair so that it can be stored in IndexedDB.
71
+ */
72
+ export(): ExportedWebCryptoKeypair {
73
+ const exportedKeypair = {
74
+ privateKey: this.privateKey,
75
+ publicKey: this.#publicKey.toRawBytes(),
76
+ };
77
+
78
+ Object.defineProperty(exportedKeypair, 'toJSON', {
79
+ enumerable: false,
80
+ value: () => {
81
+ throw new Error(
82
+ 'The exported keypair must not be serialized. It must be stored in IndexedDB directly.',
83
+ );
84
+ },
85
+ });
86
+
87
+ return exportedKeypair;
88
+ }
89
+
90
+ getPublicKey() {
91
+ return this.#publicKey;
92
+ }
93
+
94
+ async sign(bytes: Uint8Array): Promise<Uint8Array<ArrayBuffer>> {
95
+ const rawSignature = await globalThis.crypto.subtle.sign(
96
+ {
97
+ name: 'ECDSA',
98
+ hash: 'SHA-256',
99
+ },
100
+ this.privateKey,
101
+ bytes as BufferSource,
102
+ );
103
+
104
+ const signature = secp256r1.Signature.fromCompact(new Uint8Array(rawSignature));
105
+
106
+ return signature.normalizeS().toCompactRawBytes() as Uint8Array<ArrayBuffer>;
107
+ }
108
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "private": true,
3
+ "import": "../dist/esm/webcrypto/index.js",
4
+ "main": "../dist/cjs/webcrypto/index.js",
5
+ "sideEffects": false
6
+ }