@libp2p/crypto 0.0.0 → 0.22.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 (170) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +314 -0
  3. package/dist/src/aes/cipher-mode.d.ts +2 -0
  4. package/dist/src/aes/cipher-mode.d.ts.map +1 -0
  5. package/dist/src/aes/cipher-mode.js +13 -0
  6. package/dist/src/aes/cipher-mode.js.map +1 -0
  7. package/dist/src/aes/ciphers-browser.d.ts +8 -0
  8. package/dist/src/aes/ciphers-browser.d.ts.map +1 -0
  9. package/dist/src/aes/ciphers-browser.js +26 -0
  10. package/dist/src/aes/ciphers-browser.js.map +1 -0
  11. package/dist/src/aes/ciphers.d.ts +5 -0
  12. package/dist/src/aes/ciphers.d.ts.map +1 -0
  13. package/dist/src/aes/ciphers.js +4 -0
  14. package/dist/src/aes/ciphers.js.map +1 -0
  15. package/dist/src/aes/index.d.ts +6 -0
  16. package/dist/src/aes/index.d.ts.map +1 -0
  17. package/dist/src/aes/index.js +17 -0
  18. package/dist/src/aes/index.js.map +1 -0
  19. package/dist/src/ciphers/aes-gcm.browser.d.ts +3 -0
  20. package/dist/src/ciphers/aes-gcm.browser.d.ts.map +1 -0
  21. package/dist/src/ciphers/aes-gcm.browser.js +61 -0
  22. package/dist/src/ciphers/aes-gcm.browser.js.map +1 -0
  23. package/dist/src/ciphers/aes-gcm.d.ts +3 -0
  24. package/dist/src/ciphers/aes-gcm.d.ts.map +1 -0
  25. package/dist/src/ciphers/aes-gcm.js +83 -0
  26. package/dist/src/ciphers/aes-gcm.js.map +1 -0
  27. package/dist/src/ciphers/interface.d.ts +14 -0
  28. package/dist/src/ciphers/interface.d.ts.map +1 -0
  29. package/dist/src/ciphers/interface.js +2 -0
  30. package/dist/src/ciphers/interface.js.map +1 -0
  31. package/dist/src/hmac/index-browser.d.ts +5 -0
  32. package/dist/src/hmac/index-browser.d.ts.map +1 -0
  33. package/dist/src/hmac/index-browser.js +25 -0
  34. package/dist/src/hmac/index-browser.js.map +1 -0
  35. package/dist/src/hmac/index.d.ts +5 -0
  36. package/dist/src/hmac/index.d.ts.map +1 -0
  37. package/dist/src/hmac/index.js +14 -0
  38. package/dist/src/hmac/index.js.map +1 -0
  39. package/dist/src/hmac/lengths.d.ts +7 -0
  40. package/dist/src/hmac/lengths.d.ts.map +1 -0
  41. package/dist/src/hmac/lengths.js +6 -0
  42. package/dist/src/hmac/lengths.js.map +1 -0
  43. package/dist/src/index.d.ts +11 -0
  44. package/dist/src/index.d.ts.map +1 -0
  45. package/dist/src/index.js +11 -0
  46. package/dist/src/index.js.map +1 -0
  47. package/dist/src/keys/ecdh-browser.d.ts +3 -0
  48. package/dist/src/keys/ecdh-browser.d.ts.map +1 -0
  49. package/dist/src/keys/ecdh-browser.js +97 -0
  50. package/dist/src/keys/ecdh-browser.js.map +1 -0
  51. package/dist/src/keys/ecdh.d.ts +3 -0
  52. package/dist/src/keys/ecdh.d.ts.map +1 -0
  53. package/dist/src/keys/ecdh.js +26 -0
  54. package/dist/src/keys/ecdh.js.map +1 -0
  55. package/dist/src/keys/ed25519-class.d.ts +39 -0
  56. package/dist/src/keys/ed25519-class.d.ts.map +1 -0
  57. package/dist/src/keys/ed25519-class.js +119 -0
  58. package/dist/src/keys/ed25519-class.js.map +1 -0
  59. package/dist/src/keys/ed25519.d.ts +18 -0
  60. package/dist/src/keys/ed25519.d.ts.map +1 -0
  61. package/dist/src/keys/ed25519.js +52 -0
  62. package/dist/src/keys/ed25519.js.map +1 -0
  63. package/dist/src/keys/ephemeral-keys.d.ts +9 -0
  64. package/dist/src/keys/ephemeral-keys.d.ts.map +1 -0
  65. package/dist/src/keys/ephemeral-keys.js +9 -0
  66. package/dist/src/keys/ephemeral-keys.js.map +1 -0
  67. package/dist/src/keys/exporter.d.ts +7 -0
  68. package/dist/src/keys/exporter.d.ts.map +1 -0
  69. package/dist/src/keys/exporter.js +13 -0
  70. package/dist/src/keys/exporter.js.map +1 -0
  71. package/dist/src/keys/importer.d.ts +7 -0
  72. package/dist/src/keys/importer.d.ts.map +1 -0
  73. package/dist/src/keys/importer.js +13 -0
  74. package/dist/src/keys/importer.js.map +1 -0
  75. package/dist/src/keys/index.d.ts +33 -0
  76. package/dist/src/keys/index.d.ts.map +1 -0
  77. package/dist/src/keys/index.js +111 -0
  78. package/dist/src/keys/index.js.map +1 -0
  79. package/dist/src/keys/interface.d.ts +17 -0
  80. package/dist/src/keys/interface.d.ts.map +1 -0
  81. package/dist/src/keys/interface.js +2 -0
  82. package/dist/src/keys/interface.js.map +1 -0
  83. package/dist/src/keys/jwk2pem.d.ts +4 -0
  84. package/dist/src/keys/jwk2pem.d.ts.map +1 -0
  85. package/dist/src/keys/jwk2pem.js +14 -0
  86. package/dist/src/keys/jwk2pem.js.map +1 -0
  87. package/dist/src/keys/key-stretcher.d.ts +17 -0
  88. package/dist/src/keys/key-stretcher.d.ts.map +1 -0
  89. package/dist/src/keys/key-stretcher.js +65 -0
  90. package/dist/src/keys/key-stretcher.js.map +1 -0
  91. package/dist/src/keys/keys.d.ts +225 -0
  92. package/dist/src/keys/keys.d.ts.map +1 -0
  93. package/dist/src/keys/keys.js +345 -0
  94. package/dist/src/keys/keys.js.map +1 -0
  95. package/dist/src/keys/rsa-browser.d.ts +17 -0
  96. package/dist/src/keys/rsa-browser.d.ts.map +1 -0
  97. package/dist/src/keys/rsa-browser.js +99 -0
  98. package/dist/src/keys/rsa-browser.js.map +1 -0
  99. package/dist/src/keys/rsa-class.d.ts +42 -0
  100. package/dist/src/keys/rsa-class.d.ts.map +1 -0
  101. package/dist/src/keys/rsa-class.js +126 -0
  102. package/dist/src/keys/rsa-class.js.map +1 -0
  103. package/dist/src/keys/rsa-utils.d.ts +7 -0
  104. package/dist/src/keys/rsa-utils.d.ts.map +1 -0
  105. package/dist/src/keys/rsa-utils.js +65 -0
  106. package/dist/src/keys/rsa-utils.js.map +1 -0
  107. package/dist/src/keys/rsa.d.ts +13 -0
  108. package/dist/src/keys/rsa.d.ts.map +1 -0
  109. package/dist/src/keys/rsa.js +58 -0
  110. package/dist/src/keys/rsa.js.map +1 -0
  111. package/dist/src/keys/secp256k1-class.d.ts +36 -0
  112. package/dist/src/keys/secp256k1-class.d.ts.map +1 -0
  113. package/dist/src/keys/secp256k1-class.js +95 -0
  114. package/dist/src/keys/secp256k1-class.js.map +1 -0
  115. package/dist/src/keys/secp256k1.d.ts +17 -0
  116. package/dist/src/keys/secp256k1.d.ts.map +1 -0
  117. package/dist/src/keys/secp256k1.js +65 -0
  118. package/dist/src/keys/secp256k1.js.map +1 -0
  119. package/dist/src/pbkdf2.d.ts +5 -0
  120. package/dist/src/pbkdf2.d.ts.map +1 -0
  121. package/dist/src/pbkdf2.js +30 -0
  122. package/dist/src/pbkdf2.js.map +1 -0
  123. package/dist/src/random-bytes.d.ts +2 -0
  124. package/dist/src/random-bytes.d.ts.map +1 -0
  125. package/dist/src/random-bytes.js +9 -0
  126. package/dist/src/random-bytes.js.map +1 -0
  127. package/dist/src/util.d.ts +9 -0
  128. package/dist/src/util.d.ts.map +1 -0
  129. package/dist/src/util.js +37 -0
  130. package/dist/src/util.js.map +1 -0
  131. package/dist/src/webcrypto.d.ts +5 -0
  132. package/dist/src/webcrypto.d.ts.map +1 -0
  133. package/dist/src/webcrypto.js +17 -0
  134. package/dist/src/webcrypto.js.map +1 -0
  135. package/package.json +123 -4
  136. package/src/aes/cipher-mode.ts +15 -0
  137. package/src/aes/ciphers-browser.ts +28 -0
  138. package/src/aes/ciphers.ts +4 -0
  139. package/src/aes/index.ts +25 -0
  140. package/src/ciphers/aes-gcm.browser.ts +74 -0
  141. package/src/ciphers/aes-gcm.ts +102 -0
  142. package/src/ciphers/interface.ts +15 -0
  143. package/src/hmac/index-browser.ts +35 -0
  144. package/src/hmac/index.ts +15 -0
  145. package/src/hmac/lengths.ts +6 -0
  146. package/src/index.ts +11 -0
  147. package/src/keys/ecdh-browser.ts +138 -0
  148. package/src/keys/ecdh.ts +33 -0
  149. package/src/keys/ed25519-class.ts +145 -0
  150. package/src/keys/ed25519.ts +63 -0
  151. package/src/keys/ephemeral-keys.ts +9 -0
  152. package/src/keys/exporter.ts +13 -0
  153. package/src/keys/importer.ts +13 -0
  154. package/src/keys/index.ts +126 -0
  155. package/src/keys/interface.ts +20 -0
  156. package/src/keys/jwk2pem.ts +16 -0
  157. package/src/keys/key-stretcher.ts +77 -0
  158. package/src/keys/keys.d.ts +146 -0
  159. package/src/keys/keys.js +366 -0
  160. package/src/keys/keys.proto +15 -0
  161. package/src/keys/rsa-browser.ts +156 -0
  162. package/src/keys/rsa-class.ts +155 -0
  163. package/src/keys/rsa-utils.ts +74 -0
  164. package/src/keys/rsa.ts +69 -0
  165. package/src/keys/secp256k1-class.ts +118 -0
  166. package/src/keys/secp256k1.ts +69 -0
  167. package/src/pbkdf2.ts +39 -0
  168. package/src/random-bytes.ts +9 -0
  169. package/src/util.ts +42 -0
  170. package/src/webcrypto.ts +24 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/ciphers/interface.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;IACjF,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;CAClF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/ciphers/interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export declare function create(hashType: 'SHA1' | 'SHA256' | 'SHA512', secret: Uint8Array): Promise<{
2
+ digest(data: Uint8Array): Promise<Uint8Array>;
3
+ length: number;
4
+ }>;
5
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../../src/hmac/index-browser.ts"],"names":[],"mappings":"AAcA,wBAAsB,MAAM,CAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,EAAE,MAAM,EAAE,UAAU;iBAehE,UAAU;;GAKjC"}
@@ -0,0 +1,25 @@
1
+ import webcrypto from '../webcrypto.js';
2
+ import lengths from './lengths.js';
3
+ const hashTypes = {
4
+ SHA1: 'SHA-1',
5
+ SHA256: 'SHA-256',
6
+ SHA512: 'SHA-512'
7
+ };
8
+ const sign = async (key, data) => {
9
+ const buf = await webcrypto.get().subtle.sign({ name: 'HMAC' }, key, data);
10
+ return new Uint8Array(buf, 0, buf.byteLength);
11
+ };
12
+ export async function create(hashType, secret) {
13
+ const hash = hashTypes[hashType];
14
+ const key = await webcrypto.get().subtle.importKey('raw', secret, {
15
+ name: 'HMAC',
16
+ hash: { name: hash }
17
+ }, false, ['sign']);
18
+ return {
19
+ async digest(data) {
20
+ return await sign(key, data);
21
+ },
22
+ length: lengths[hashType]
23
+ };
24
+ }
25
+ //# sourceMappingURL=index-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.js","sourceRoot":"","sources":["../../../src/hmac/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,SAAS,GAAG;IAChB,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;CAClB,CAAA;AAED,MAAM,IAAI,GAAG,KAAK,EAAE,GAAc,EAAE,IAAgB,EAAE,EAAE;IACtD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC1E,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAE,QAAsC,EAAE,MAAkB;IACtF,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;IAEhC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAChD,KAAK,EACL,MAAM,EACN;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;KACrB,EACD,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAA;IAED,OAAO;QACL,KAAK,CAAC,MAAM,CAAE,IAAgB;YAC5B,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC9B,CAAC;QACD,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;KAC1B,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function create(hash: 'SHA1' | 'SHA256' | 'SHA512', secret: Uint8Array): Promise<{
2
+ digest(data: Uint8Array): Promise<Buffer>;
3
+ length: number;
4
+ }>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hmac/index.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,CAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,EAAE,MAAM,EAAE,UAAU;iBAE5D,UAAU;;GASjC"}
@@ -0,0 +1,14 @@
1
+ import crypto from 'crypto';
2
+ import lengths from './lengths.js';
3
+ export async function create(hash, secret) {
4
+ const res = {
5
+ async digest(data) {
6
+ const hmac = crypto.createHmac(hash.toLowerCase(), secret);
7
+ hmac.update(data);
8
+ return hmac.digest();
9
+ },
10
+ length: lengths[hash]
11
+ };
12
+ return res;
13
+ }
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hmac/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAE,IAAkC,EAAE,MAAkB;IAClF,MAAM,GAAG,GAAG;QACV,KAAK,CAAC,MAAM,CAAE,IAAgB;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAA;YAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACjB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;QACtB,CAAC;QACD,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;KACtB,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ SHA1: number;
3
+ SHA256: number;
4
+ SHA512: number;
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=lengths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lengths.d.ts","sourceRoot":"","sources":["../../../src/hmac/lengths.ts"],"names":[],"mappings":";;;;;AACA,wBAIC"}
@@ -0,0 +1,6 @@
1
+ export default {
2
+ SHA1: 20,
3
+ SHA256: 32,
4
+ SHA512: 64
5
+ };
6
+ //# sourceMappingURL=lengths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lengths.js","sourceRoot":"","sources":["../../../src/hmac/lengths.ts"],"names":[],"mappings":"AACA,eAAe;IACb,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;CACX,CAAA"}
@@ -0,0 +1,11 @@
1
+ import * as hmac from './hmac/index.js';
2
+ import * as aes from './aes/index.js';
3
+ import * as keys from './keys/index.js';
4
+ import randomBytes from './random-bytes.js';
5
+ import pbkdf2 from './pbkdf2.js';
6
+ export { aes };
7
+ export { hmac };
8
+ export { keys };
9
+ export { randomBytes };
10
+ export { pbkdf2 };
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA;AACvC,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,GAAG,EAAE,CAAA;AACd,OAAO,EAAE,IAAI,EAAE,CAAA;AACf,OAAO,EAAE,IAAI,EAAE,CAAA;AACf,OAAO,EAAE,WAAW,EAAE,CAAA;AACtB,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -0,0 +1,11 @@
1
+ import * as hmac from './hmac/index.js';
2
+ import * as aes from './aes/index.js';
3
+ import * as keys from './keys/index.js';
4
+ import randomBytes from './random-bytes.js';
5
+ import pbkdf2 from './pbkdf2.js';
6
+ export { aes };
7
+ export { hmac };
8
+ export { keys };
9
+ export { randomBytes };
10
+ export { pbkdf2 };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA;AACvC,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,GAAG,EAAE,CAAA;AACd,OAAO,EAAE,IAAI,EAAE,CAAA;AACf,OAAO,EAAE,IAAI,EAAE,CAAA;AACf,OAAO,EAAE,WAAW,EAAE,CAAA;AACtB,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ECDHKey } from './interface.js';
2
+ export declare function generateEphmeralKeyPair(curve: string): Promise<ECDHKey>;
3
+ //# sourceMappingURL=ecdh-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdh-browser.d.ts","sourceRoot":"","sources":["../../../src/keys/ecdh-browser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,gBAAgB,CAAA;AAW1D,wBAAsB,uBAAuB,CAAE,KAAK,EAAE,MAAM,oBAmE3D"}
@@ -0,0 +1,97 @@
1
+ import errcode from 'err-code';
2
+ import webcrypto from '../webcrypto.js';
3
+ import { base64urlToBuffer } from '../util.js';
4
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
5
+ import { concat as uint8ArrayConcat } from 'uint8arrays/concat';
6
+ import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
7
+ const bits = {
8
+ 'P-256': 256,
9
+ 'P-384': 384,
10
+ 'P-521': 521
11
+ };
12
+ const curveTypes = Object.keys(bits);
13
+ const names = curveTypes.join(' / ');
14
+ export async function generateEphmeralKeyPair(curve) {
15
+ if (curve !== 'P-256' && curve !== 'P-384' && curve !== 'P-521') {
16
+ throw errcode(new Error(`Unknown curve: ${curve}. Must be ${names}`), 'ERR_INVALID_CURVE');
17
+ }
18
+ const pair = await webcrypto.get().subtle.generateKey({
19
+ name: 'ECDH',
20
+ namedCurve: curve
21
+ }, true, ['deriveBits']);
22
+ // forcePrivate is used for testing only
23
+ const genSharedKey = async (theirPub, forcePrivate) => {
24
+ let privateKey;
25
+ if (forcePrivate != null) {
26
+ privateKey = await webcrypto.get().subtle.importKey('jwk', unmarshalPrivateKey(curve, forcePrivate), {
27
+ name: 'ECDH',
28
+ namedCurve: curve
29
+ }, false, ['deriveBits']);
30
+ }
31
+ else {
32
+ privateKey = pair.privateKey;
33
+ }
34
+ const key = await webcrypto.get().subtle.importKey('jwk', unmarshalPublicKey(curve, theirPub), {
35
+ name: 'ECDH',
36
+ namedCurve: curve
37
+ }, false, []);
38
+ const buffer = await webcrypto.get().subtle.deriveBits({
39
+ name: 'ECDH',
40
+ // @ts-expect-error namedCurve is missing from the types
41
+ namedCurve: curve,
42
+ public: key
43
+ }, privateKey, bits[curve]);
44
+ return new Uint8Array(buffer, 0, buffer.byteLength);
45
+ };
46
+ // @ts-expect-error jwk is missing from the types
47
+ const publicKey = await webcrypto.get().subtle.exportKey('jwk', pair.publicKey);
48
+ const ecdhKey = {
49
+ key: marshalPublicKey(publicKey),
50
+ genSharedKey
51
+ };
52
+ return ecdhKey;
53
+ }
54
+ const curveLengths = {
55
+ 'P-256': 32,
56
+ 'P-384': 48,
57
+ 'P-521': 66
58
+ };
59
+ // Marshal converts a jwk encoded ECDH public key into the
60
+ // form specified in section 4.3.6 of ANSI X9.62. (This is the format
61
+ // go-ipfs uses)
62
+ function marshalPublicKey(jwk) {
63
+ if (jwk.crv == null || jwk.x == null || jwk.y == null) {
64
+ throw errcode(new Error('JWK was missing components'), 'ERR_INVALID_PARAMETERS');
65
+ }
66
+ if (jwk.crv !== 'P-256' && jwk.crv !== 'P-384' && jwk.crv !== 'P-521') {
67
+ throw errcode(new Error(`Unknown curve: ${jwk.crv}. Must be ${names}`), 'ERR_INVALID_CURVE');
68
+ }
69
+ const byteLen = curveLengths[jwk.crv];
70
+ return uint8ArrayConcat([
71
+ Uint8Array.from([4]),
72
+ base64urlToBuffer(jwk.x, byteLen),
73
+ base64urlToBuffer(jwk.y, byteLen)
74
+ ], 1 + byteLen * 2);
75
+ }
76
+ // Unmarshal converts a point, serialized by Marshal, into an jwk encoded key
77
+ function unmarshalPublicKey(curve, key) {
78
+ if (curve !== 'P-256' && curve !== 'P-384' && curve !== 'P-521') {
79
+ throw errcode(new Error(`Unknown curve: ${curve}. Must be ${names}`), 'ERR_INVALID_CURVE');
80
+ }
81
+ const byteLen = curveLengths[curve];
82
+ if (!uint8ArrayEquals(key.slice(0, 1), Uint8Array.from([4]))) {
83
+ throw errcode(new Error('Cannot unmarshal public key - invalid key format'), 'ERR_INVALID_KEY_FORMAT');
84
+ }
85
+ return {
86
+ kty: 'EC',
87
+ crv: curve,
88
+ x: uint8ArrayToString(key.slice(1, byteLen + 1), 'base64url'),
89
+ y: uint8ArrayToString(key.slice(1 + byteLen), 'base64url'),
90
+ ext: true
91
+ };
92
+ }
93
+ const unmarshalPrivateKey = (curve, key) => ({
94
+ ...unmarshalPublicKey(curve, key.public),
95
+ d: uint8ArrayToString(key.private, 'base64url')
96
+ });
97
+ //# sourceMappingURL=ecdh-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdh-browser.js","sourceRoot":"","sources":["../../../src/keys/ecdh-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ECDHKey } from './interface.js';
2
+ export declare function generateEphmeralKeyPair(curve: string): Promise<ECDHKey>;
3
+ //# sourceMappingURL=ecdh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdh.d.ts","sourceRoot":"","sources":["../../../src/keys/ecdh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,gBAAgB,CAAA;AAW1D,wBAAsB,uBAAuB,CAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB9E"}
@@ -0,0 +1,26 @@
1
+ import crypto from 'crypto';
2
+ import errcode from 'err-code';
3
+ const curves = {
4
+ 'P-256': 'prime256v1',
5
+ 'P-384': 'secp384r1',
6
+ 'P-521': 'secp521r1'
7
+ };
8
+ const curveTypes = Object.keys(curves);
9
+ const names = curveTypes.join(' / ');
10
+ export async function generateEphmeralKeyPair(curve) {
11
+ if (curve !== 'P-256' && curve !== 'P-384' && curve !== 'P-521') {
12
+ throw errcode(new Error(`Unknown curve: ${curve}. Must be ${names}`), 'ERR_INVALID_CURVE');
13
+ }
14
+ const ecdh = crypto.createECDH(curves[curve]);
15
+ ecdh.generateKeys();
16
+ return {
17
+ key: ecdh.getPublicKey(),
18
+ async genSharedKey(theirPub, forcePrivate) {
19
+ if (forcePrivate != null) {
20
+ ecdh.setPrivateKey(forcePrivate.private);
21
+ }
22
+ return ecdh.computeSecret(theirPub);
23
+ }
24
+ };
25
+ }
26
+ //# sourceMappingURL=ecdh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdh.js","sourceRoot":"","sources":["../../../src/keys/ecdh.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,OAAO,MAAM,UAAU,CAAA;AAG9B,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,WAAW;CACrB,CAAA;AAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACtC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAEpC,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAE,KAAa;IAC1D,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,EAAE;QAC/D,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,kBAAkB,KAAK,aAAa,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAA;KAC3F;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7C,IAAI,CAAC,YAAY,EAAE,CAAA;IAEnB,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,YAAY,EAAgB;QAEtC,KAAK,CAAC,YAAY,CAAE,QAAoB,EAAE,YAA0B;YAClE,IAAI,YAAY,IAAI,IAAI,EAAE;gBACxB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;aACzC;YAED,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACrC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ export declare class Ed25519PublicKey {
2
+ private readonly _key;
3
+ constructor(key: Uint8Array);
4
+ verify(data: Uint8Array, sig: Uint8Array): Promise<boolean>;
5
+ marshal(): Uint8Array;
6
+ get bytes(): Uint8Array;
7
+ equals(key: Ed25519PublicKey): boolean;
8
+ hash(): Promise<Uint8Array>;
9
+ }
10
+ export declare class Ed25519PrivateKey {
11
+ private readonly _key;
12
+ private readonly _publicKey;
13
+ constructor(key: Uint8Array, publicKey: Uint8Array);
14
+ sign(message: Uint8Array): Promise<Uint8Array>;
15
+ get public(): Ed25519PublicKey;
16
+ marshal(): Uint8Array;
17
+ get bytes(): Uint8Array;
18
+ equals(key: Ed25519PrivateKey): boolean;
19
+ hash(): Promise<Uint8Array>;
20
+ /**
21
+ * Gets the ID of the key.
22
+ *
23
+ * The key id is the base58 encoding of the identity multihash containing its public key.
24
+ * The public key is a protobuf encoding containing a type and the DER encoding
25
+ * of the PKCS SubjectPublicKeyInfo.
26
+ *
27
+ * @returns {Promise<string>}
28
+ */
29
+ id(): Promise<string>;
30
+ /**
31
+ * Exports the key into a password protected `format`
32
+ */
33
+ export(password: string, format?: string): Promise<import("multiformats/bases/base").Multibase<"m">>;
34
+ }
35
+ export declare function unmarshalEd25519PrivateKey(bytes: Uint8Array): Ed25519PrivateKey;
36
+ export declare function unmarshalEd25519PublicKey(bytes: Uint8Array): Ed25519PublicKey;
37
+ export declare function generateKeyPair(): Promise<Ed25519PrivateKey>;
38
+ export declare function generateKeyPairFromSeed(seed: Uint8Array): Promise<Ed25519PrivateKey>;
39
+ //# sourceMappingURL=ed25519-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ed25519-class.d.ts","sourceRoot":"","sources":["../../../src/keys/ed25519-class.ts"],"names":[],"mappings":"AASA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;gBAEpB,GAAG,EAAE,UAAU;IAItB,MAAM,CAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU;IAI/C,OAAO;IAIP,IAAI,KAAK,eAKR;IAED,MAAM,CAAE,GAAG,EAAE,gBAAgB;IAIvB,IAAI;CAKX;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAI1B,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;IAK7C,IAAI,CAAE,OAAO,EAAE,UAAU;IAI/B,IAAI,MAAM,qBAET;IAED,OAAO;IAIP,IAAI,KAAK,eAKR;IAED,MAAM,CAAE,GAAG,EAAE,iBAAiB;IAIxB,IAAI;IAMV;;;;;;;;OAQG;IACG,EAAE;IAKR;;OAEG;IACG,MAAM,CAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAe;CAOtD;AAED,wBAAgB,0BAA0B,CAAE,KAAK,EAAE,UAAU,qBAa5D;AAED,wBAAgB,yBAAyB,CAAE,KAAK,EAAE,UAAU,oBAG3D;AAED,wBAAsB,eAAe,+BAGpC;AAED,wBAAsB,uBAAuB,CAAE,IAAI,EAAE,UAAU,8BAG9D"}
@@ -0,0 +1,119 @@
1
+ import errcode from 'err-code';
2
+ import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
3
+ import { sha256 } from 'multiformats/hashes/sha2';
4
+ import { base58btc } from 'multiformats/bases/base58';
5
+ import { identity } from 'multiformats/hashes/identity';
6
+ import * as crypto from './ed25519.js';
7
+ import * as pbm from './keys.js';
8
+ import { exporter } from './exporter.js';
9
+ export class Ed25519PublicKey {
10
+ constructor(key) {
11
+ this._key = ensureKey(key, crypto.publicKeyLength);
12
+ }
13
+ async verify(data, sig) {
14
+ return await crypto.hashAndVerify(this._key, sig, data);
15
+ }
16
+ marshal() {
17
+ return this._key;
18
+ }
19
+ get bytes() {
20
+ return pbm.PublicKey.encode({
21
+ Type: pbm.KeyType.Ed25519,
22
+ Data: this.marshal()
23
+ }).finish();
24
+ }
25
+ equals(key) {
26
+ return uint8ArrayEquals(this.bytes, key.bytes);
27
+ }
28
+ async hash() {
29
+ const { bytes } = await sha256.digest(this.bytes);
30
+ return bytes;
31
+ }
32
+ }
33
+ export class Ed25519PrivateKey {
34
+ // key - 64 byte Uint8Array containing private key
35
+ // publicKey - 32 byte Uint8Array containing public key
36
+ constructor(key, publicKey) {
37
+ this._key = ensureKey(key, crypto.privateKeyLength);
38
+ this._publicKey = ensureKey(publicKey, crypto.publicKeyLength);
39
+ }
40
+ async sign(message) {
41
+ return await crypto.hashAndSign(this._key, message);
42
+ }
43
+ get public() {
44
+ return new Ed25519PublicKey(this._publicKey);
45
+ }
46
+ marshal() {
47
+ return this._key;
48
+ }
49
+ get bytes() {
50
+ return pbm.PrivateKey.encode({
51
+ Type: pbm.KeyType.Ed25519,
52
+ Data: this.marshal()
53
+ }).finish();
54
+ }
55
+ equals(key) {
56
+ return uint8ArrayEquals(this.bytes, key.bytes);
57
+ }
58
+ async hash() {
59
+ const { bytes } = await sha256.digest(this.bytes);
60
+ return bytes;
61
+ }
62
+ /**
63
+ * Gets the ID of the key.
64
+ *
65
+ * The key id is the base58 encoding of the identity multihash containing its public key.
66
+ * The public key is a protobuf encoding containing a type and the DER encoding
67
+ * of the PKCS SubjectPublicKeyInfo.
68
+ *
69
+ * @returns {Promise<string>}
70
+ */
71
+ async id() {
72
+ const encoding = await identity.digest(this.public.bytes);
73
+ return base58btc.encode(encoding.bytes).substring(1);
74
+ }
75
+ /**
76
+ * Exports the key into a password protected `format`
77
+ */
78
+ async export(password, format = 'libp2p-key') {
79
+ if (format === 'libp2p-key') {
80
+ return await exporter(this.bytes, password);
81
+ }
82
+ else {
83
+ throw errcode(new Error(`export format '${format}' is not supported`), 'ERR_INVALID_EXPORT_FORMAT');
84
+ }
85
+ }
86
+ }
87
+ export function unmarshalEd25519PrivateKey(bytes) {
88
+ // Try the old, redundant public key version
89
+ if (bytes.length > crypto.privateKeyLength) {
90
+ bytes = ensureKey(bytes, crypto.privateKeyLength + crypto.publicKeyLength);
91
+ const privateKeyBytes = bytes.slice(0, crypto.privateKeyLength);
92
+ const publicKeyBytes = bytes.slice(crypto.privateKeyLength, bytes.length);
93
+ return new Ed25519PrivateKey(privateKeyBytes, publicKeyBytes);
94
+ }
95
+ bytes = ensureKey(bytes, crypto.privateKeyLength);
96
+ const privateKeyBytes = bytes.slice(0, crypto.privateKeyLength);
97
+ const publicKeyBytes = bytes.slice(crypto.publicKeyLength);
98
+ return new Ed25519PrivateKey(privateKeyBytes, publicKeyBytes);
99
+ }
100
+ export function unmarshalEd25519PublicKey(bytes) {
101
+ bytes = ensureKey(bytes, crypto.publicKeyLength);
102
+ return new Ed25519PublicKey(bytes);
103
+ }
104
+ export async function generateKeyPair() {
105
+ const { privateKey, publicKey } = await crypto.generateKey();
106
+ return new Ed25519PrivateKey(privateKey, publicKey);
107
+ }
108
+ export async function generateKeyPairFromSeed(seed) {
109
+ const { privateKey, publicKey } = await crypto.generateKeyFromSeed(seed);
110
+ return new Ed25519PrivateKey(privateKey, publicKey);
111
+ }
112
+ function ensureKey(key, length) {
113
+ key = Uint8Array.from(key ?? []);
114
+ if (key.length !== length) {
115
+ throw errcode(new Error(`Key must be a Uint8Array of length ${length}, got ${key.length}`), 'ERR_INVALID_KEY_TYPE');
116
+ }
117
+ return key;
118
+ }
119
+ //# sourceMappingURL=ed25519-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ed25519-class.js","sourceRoot":"","sources":["../../../src/keys/ed25519-class.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ declare const PUBLIC_KEY_BYTE_LENGTH = 32;
2
+ declare const PRIVATE_KEY_BYTE_LENGTH = 64;
3
+ export { PUBLIC_KEY_BYTE_LENGTH as publicKeyLength };
4
+ export { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength };
5
+ export declare function generateKey(): Promise<{
6
+ privateKey: Uint8Array;
7
+ publicKey: Uint8Array;
8
+ }>;
9
+ /**
10
+ * Generate keypair from a 32 byte uint8array
11
+ */
12
+ export declare function generateKeyFromSeed(seed: Uint8Array): Promise<{
13
+ privateKey: Uint8Array;
14
+ publicKey: Uint8Array;
15
+ }>;
16
+ export declare function hashAndSign(privateKey: Uint8Array, msg: Uint8Array): Promise<Uint8Array>;
17
+ export declare function hashAndVerify(publicKey: Uint8Array, sig: Uint8Array, msg: Uint8Array): Promise<boolean>;
18
+ //# sourceMappingURL=ed25519.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ed25519.d.ts","sourceRoot":"","sources":["../../../src/keys/ed25519.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,sBAAsB,KAAK,CAAA;AACjC,QAAA,MAAM,uBAAuB,KAAK,CAAA;AAGlC,OAAO,EAAE,sBAAsB,IAAI,eAAe,EAAE,CAAA;AACpD,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,CAAA;AAEtD,wBAAsB,WAAW;;;GAYhC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAE,IAAI,EAAE,UAAU;;;GAiB1D;AAED,wBAAsB,WAAW,CAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,uBAIzE;AAED,wBAAsB,aAAa,CAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,oBAE3F"}
@@ -0,0 +1,52 @@
1
+ import * as ed from '@noble/ed25519';
2
+ const PUBLIC_KEY_BYTE_LENGTH = 32;
3
+ const PRIVATE_KEY_BYTE_LENGTH = 64; // private key is actually 32 bytes but for historical reasons we concat private and public keys
4
+ const KEYS_BYTE_LENGTH = 32;
5
+ export { PUBLIC_KEY_BYTE_LENGTH as publicKeyLength };
6
+ export { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength };
7
+ export async function generateKey() {
8
+ // the actual private key (32 bytes)
9
+ const privateKeyRaw = ed.utils.randomPrivateKey();
10
+ const publicKey = await ed.getPublicKey(privateKeyRaw);
11
+ // concatenated the public key to the private key
12
+ const privateKey = concatKeys(privateKeyRaw, publicKey);
13
+ return {
14
+ privateKey,
15
+ publicKey
16
+ };
17
+ }
18
+ /**
19
+ * Generate keypair from a 32 byte uint8array
20
+ */
21
+ export async function generateKeyFromSeed(seed) {
22
+ if (seed.length !== KEYS_BYTE_LENGTH) {
23
+ throw new TypeError('"seed" must be 32 bytes in length.');
24
+ }
25
+ else if (!(seed instanceof Uint8Array)) {
26
+ throw new TypeError('"seed" must be a node.js Buffer, or Uint8Array.');
27
+ }
28
+ // based on node forges algorithm, the seed is used directly as private key
29
+ const privateKeyRaw = seed;
30
+ const publicKey = await ed.getPublicKey(privateKeyRaw);
31
+ const privateKey = concatKeys(privateKeyRaw, publicKey);
32
+ return {
33
+ privateKey,
34
+ publicKey
35
+ };
36
+ }
37
+ export async function hashAndSign(privateKey, msg) {
38
+ const privateKeyRaw = privateKey.slice(0, KEYS_BYTE_LENGTH);
39
+ return await ed.sign(msg, privateKeyRaw);
40
+ }
41
+ export async function hashAndVerify(publicKey, sig, msg) {
42
+ return await ed.verify(sig, msg, publicKey);
43
+ }
44
+ function concatKeys(privateKeyRaw, publicKey) {
45
+ const privateKey = new Uint8Array(PRIVATE_KEY_BYTE_LENGTH);
46
+ for (let i = 0; i < KEYS_BYTE_LENGTH; i++) {
47
+ privateKey[i] = privateKeyRaw[i];
48
+ privateKey[KEYS_BYTE_LENGTH + i] = publicKey[i];
49
+ }
50
+ return privateKey;
51
+ }
52
+ //# sourceMappingURL=ed25519.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ed25519.js","sourceRoot":"","sources":["../../../src/keys/ed25519.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEpC,MAAM,sBAAsB,GAAG,EAAE,CAAA;AACjC,MAAM,uBAAuB,GAAG,EAAE,CAAA,CAAC,gGAAgG;AACnI,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,OAAO,EAAE,sBAAsB,IAAI,eAAe,EAAE,CAAA;AACpD,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,CAAA;AAEtD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,oCAAoC;IACpC,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAA;IACjD,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;IAEtD,iDAAiD;IACjD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAEvD,OAAO;QACL,UAAU;QACV,SAAS;KACV,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAE,IAAgB;IACzD,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,EAAE;QACpC,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAA;KAC1D;SAAM,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC,EAAE;QACxC,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;KACvE;IAED,2EAA2E;IAC3E,MAAM,aAAa,GAAG,IAAI,CAAA;IAC1B,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;IAEtD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAEvD,OAAO;QACL,UAAU;QACV,SAAS;KACV,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAE,UAAsB,EAAE,GAAe;IACxE,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAA;IAE3D,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,SAAqB,EAAE,GAAe,EAAE,GAAe;IAC1F,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,UAAU,CAAE,aAAyB,EAAE,SAAqB;IACnE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,uBAAuB,CAAC,CAAA;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE;QACzC,UAAU,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QAChC,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;KAChD;IACD,OAAO,UAAU,CAAA;AACnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { generateEphmeralKeyPair } from './ecdh.js';
2
+ /**
3
+ * Generates an ephemeral public key and returns a function that will compute
4
+ * the shared secret key.
5
+ *
6
+ * Focuses only on ECDH now, but can be made more general in the future.
7
+ */
8
+ export default generateEphmeralKeyPair;
9
+ //# sourceMappingURL=ephemeral-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ephemeral-keys.d.ts","sourceRoot":"","sources":["../../../src/keys/ephemeral-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AAEnD;;;;;GAKG;AACH,eAAe,uBAAuB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { generateEphmeralKeyPair } from './ecdh.js';
2
+ /**
3
+ * Generates an ephemeral public key and returns a function that will compute
4
+ * the shared secret key.
5
+ *
6
+ * Focuses only on ECDH now, but can be made more general in the future.
7
+ */
8
+ export default generateEphmeralKeyPair;
9
+ //# sourceMappingURL=ephemeral-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ephemeral-keys.js","sourceRoot":"","sources":["../../../src/keys/ephemeral-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AAEnD;;;;;GAKG;AACH,eAAe,uBAAuB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Exports the given PrivateKey as a base64 encoded string.
3
+ * The PrivateKey is encrypted via a password derived PBKDF2 key
4
+ * leveraging the aes-gcm cipher algorithm.
5
+ */
6
+ export declare function exporter(privateKey: Uint8Array, password: string): Promise<import("multiformats/bases/base").Multibase<"m">>;
7
+ //# sourceMappingURL=exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../src/keys/exporter.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,QAAQ,CAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,6DAIvE"}
@@ -0,0 +1,13 @@
1
+ import { base64 } from 'multiformats/bases/base64';
2
+ import * as ciphers from '../ciphers/aes-gcm.js';
3
+ /**
4
+ * Exports the given PrivateKey as a base64 encoded string.
5
+ * The PrivateKey is encrypted via a password derived PBKDF2 key
6
+ * leveraging the aes-gcm cipher algorithm.
7
+ */
8
+ export async function exporter(privateKey, password) {
9
+ const cipher = ciphers.create();
10
+ const encryptedKey = await cipher.encrypt(privateKey, password);
11
+ return base64.encode(encryptedKey);
12
+ }
13
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../src/keys/exporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAEhD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAE,UAAsB,EAAE,QAAgB;IACtE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;IAC/B,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Attempts to decrypt a base64 encoded PrivateKey string
3
+ * with the given password. The privateKey must have been exported
4
+ * using the same password and underlying cipher (aes-gcm)
5
+ */
6
+ export declare function importer(privateKey: string, password: string): Promise<Uint8Array>;
7
+ //# sourceMappingURL=importer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../src/keys/importer.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,QAAQ,CAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,uBAInE"}