@libp2p/noise 12.0.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.
Files changed (98) hide show
  1. package/dist/index.min.js +27 -0
  2. package/dist/src/@types/basic.d.ts +5 -0
  3. package/dist/src/@types/basic.d.ts.map +1 -0
  4. package/dist/src/@types/basic.js +2 -0
  5. package/dist/src/@types/basic.js.map +1 -0
  6. package/dist/src/@types/handshake-interface.d.ts +15 -0
  7. package/dist/src/@types/handshake-interface.d.ts.map +1 -0
  8. package/dist/src/@types/handshake-interface.js +2 -0
  9. package/dist/src/@types/handshake-interface.js.map +1 -0
  10. package/dist/src/@types/handshake.d.ts +40 -0
  11. package/dist/src/@types/handshake.d.ts.map +1 -0
  12. package/dist/src/@types/handshake.js +2 -0
  13. package/dist/src/@types/handshake.js.map +1 -0
  14. package/dist/src/@types/libp2p.d.ts +10 -0
  15. package/dist/src/@types/libp2p.d.ts.map +1 -0
  16. package/dist/src/@types/libp2p.js +2 -0
  17. package/dist/src/@types/libp2p.js.map +1 -0
  18. package/dist/src/constants.d.ts +4 -0
  19. package/dist/src/constants.d.ts.map +1 -0
  20. package/dist/src/constants.js +4 -0
  21. package/dist/src/constants.js.map +1 -0
  22. package/dist/src/crypto/js.d.ts +3 -0
  23. package/dist/src/crypto/js.d.ts.map +1 -0
  24. package/dist/src/crypto/js.js +42 -0
  25. package/dist/src/crypto/js.js.map +1 -0
  26. package/dist/src/crypto/streaming.d.ts +7 -0
  27. package/dist/src/crypto/streaming.d.ts.map +1 -0
  28. package/dist/src/crypto/streaming.js +50 -0
  29. package/dist/src/crypto/streaming.js.map +1 -0
  30. package/dist/src/crypto.d.ts +13 -0
  31. package/dist/src/crypto.d.ts.map +1 -0
  32. package/dist/src/crypto.js +2 -0
  33. package/dist/src/crypto.js.map +1 -0
  34. package/dist/src/encoder.d.ts +15 -0
  35. package/dist/src/encoder.d.ts.map +1 -0
  36. package/dist/src/encoder.js +63 -0
  37. package/dist/src/encoder.js.map +1 -0
  38. package/dist/src/handshake-xx.d.ts +33 -0
  39. package/dist/src/handshake-xx.d.ts.map +1 -0
  40. package/dist/src/handshake-xx.js +139 -0
  41. package/dist/src/handshake-xx.js.map +1 -0
  42. package/dist/src/handshakes/abstract-handshake.d.ts +36 -0
  43. package/dist/src/handshakes/abstract-handshake.d.ts.map +1 -0
  44. package/dist/src/handshakes/abstract-handshake.js +140 -0
  45. package/dist/src/handshakes/abstract-handshake.js.map +1 -0
  46. package/dist/src/handshakes/xx.d.ts +18 -0
  47. package/dist/src/handshakes/xx.d.ts.map +1 -0
  48. package/dist/src/handshakes/xx.js +161 -0
  49. package/dist/src/handshakes/xx.js.map +1 -0
  50. package/dist/src/index.d.ts +7 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +6 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/dist/src/logger.d.ts +11 -0
  55. package/dist/src/logger.d.ts.map +1 -0
  56. package/dist/src/logger.js +45 -0
  57. package/dist/src/logger.js.map +1 -0
  58. package/dist/src/metrics.d.ts +4 -0
  59. package/dist/src/metrics.d.ts.map +1 -0
  60. package/dist/src/metrics.js +20 -0
  61. package/dist/src/metrics.js.map +1 -0
  62. package/dist/src/noise.d.ts +55 -0
  63. package/dist/src/noise.d.ts.map +1 -0
  64. package/dist/src/noise.js +130 -0
  65. package/dist/src/noise.js.map +1 -0
  66. package/dist/src/nonce.d.ts +18 -0
  67. package/dist/src/nonce.d.ts.map +1 -0
  68. package/dist/src/nonce.js +41 -0
  69. package/dist/src/nonce.js.map +1 -0
  70. package/dist/src/proto/payload.d.ts +21 -0
  71. package/dist/src/proto/payload.d.ts.map +1 -0
  72. package/dist/src/proto/payload.js +114 -0
  73. package/dist/src/proto/payload.js.map +1 -0
  74. package/dist/src/utils.d.ts +20 -0
  75. package/dist/src/utils.d.ts.map +1 -0
  76. package/dist/src/utils.js +74 -0
  77. package/dist/src/utils.js.map +1 -0
  78. package/package.json +99 -0
  79. package/src/@types/basic.ts +5 -0
  80. package/src/@types/handshake-interface.ts +12 -0
  81. package/src/@types/handshake.ts +48 -0
  82. package/src/@types/libp2p.ts +10 -0
  83. package/src/constants.ts +4 -0
  84. package/src/crypto/js.ts +58 -0
  85. package/src/crypto/streaming.ts +58 -0
  86. package/src/crypto.ts +16 -0
  87. package/src/encoder.ts +81 -0
  88. package/src/handshake-xx.ts +177 -0
  89. package/src/handshakes/abstract-handshake.ts +180 -0
  90. package/src/handshakes/xx.ts +184 -0
  91. package/src/index.ts +10 -0
  92. package/src/logger.ts +51 -0
  93. package/src/metrics.ts +32 -0
  94. package/src/noise.ts +192 -0
  95. package/src/nonce.ts +49 -0
  96. package/src/proto/payload.proto +11 -0
  97. package/src/proto/payload.ts +148 -0
  98. package/src/utils.ts +111 -0
package/src/utils.ts ADDED
@@ -0,0 +1,111 @@
1
+ import { unmarshalPublicKey, unmarshalPrivateKey } from '@libp2p/crypto/keys'
2
+ import { peerIdFromKeys } from '@libp2p/peer-id'
3
+ import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
4
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
5
+ import { type NoiseExtensions, NoiseHandshakePayload } from './proto/payload.js'
6
+ import type { bytes } from './@types/basic.js'
7
+ import type { PeerId } from '@libp2p/interface/peer-id'
8
+
9
+ export async function getPayload (
10
+ localPeer: PeerId,
11
+ staticPublicKey: bytes,
12
+ extensions?: NoiseExtensions
13
+ ): Promise<bytes> {
14
+ const signedPayload = await signPayload(localPeer, getHandshakePayload(staticPublicKey))
15
+
16
+ if (localPeer.publicKey == null) {
17
+ throw new Error('PublicKey was missing from local PeerId')
18
+ }
19
+
20
+ return createHandshakePayload(
21
+ localPeer.publicKey,
22
+ signedPayload,
23
+ extensions
24
+ )
25
+ }
26
+
27
+ export function createHandshakePayload (
28
+ libp2pPublicKey: Uint8Array,
29
+ signedPayload: Uint8Array,
30
+ extensions?: NoiseExtensions
31
+ ): bytes {
32
+ return NoiseHandshakePayload.encode({
33
+ identityKey: libp2pPublicKey,
34
+ identitySig: signedPayload,
35
+ extensions: extensions ?? { webtransportCerthashes: [] }
36
+ }).subarray()
37
+ }
38
+
39
+ export async function signPayload (peerId: PeerId, payload: bytes): Promise<bytes> {
40
+ if (peerId.privateKey == null) {
41
+ throw new Error('PrivateKey was missing from PeerId')
42
+ }
43
+
44
+ const privateKey = await unmarshalPrivateKey(peerId.privateKey)
45
+
46
+ return privateKey.sign(payload)
47
+ }
48
+
49
+ export async function getPeerIdFromPayload (payload: NoiseHandshakePayload): Promise<PeerId> {
50
+ return peerIdFromKeys(payload.identityKey)
51
+ }
52
+
53
+ export function decodePayload (payload: bytes | Uint8Array): NoiseHandshakePayload {
54
+ return NoiseHandshakePayload.decode(payload)
55
+ }
56
+
57
+ export function getHandshakePayload (publicKey: bytes): bytes {
58
+ const prefix = uint8ArrayFromString('noise-libp2p-static-key:')
59
+ return uint8ArrayConcat([prefix, publicKey], prefix.length + publicKey.length)
60
+ }
61
+
62
+ /**
63
+ * Verifies signed payload, throws on any irregularities.
64
+ *
65
+ * @param {bytes} noiseStaticKey - owner's noise static key
66
+ * @param {bytes} payload - decoded payload
67
+ * @param {PeerId} remotePeer - owner's libp2p peer ID
68
+ * @returns {Promise<PeerId>} - peer ID of payload owner
69
+ */
70
+ export async function verifySignedPayload (
71
+ noiseStaticKey: bytes,
72
+ payload: NoiseHandshakePayload,
73
+ remotePeer: PeerId
74
+ ): Promise<PeerId> {
75
+ // Unmarshaling from PublicKey protobuf
76
+ const payloadPeerId = await peerIdFromKeys(payload.identityKey)
77
+ if (!payloadPeerId.equals(remotePeer)) {
78
+ throw new Error(`Payload identity key ${payloadPeerId.toString()} does not match expected remote peer ${remotePeer.toString()}`)
79
+ }
80
+ const generatedPayload = getHandshakePayload(noiseStaticKey)
81
+
82
+ if (payloadPeerId.publicKey == null) {
83
+ throw new Error('PublicKey was missing from PeerId')
84
+ }
85
+
86
+ if (payload.identitySig == null) {
87
+ throw new Error('Signature was missing from message')
88
+ }
89
+
90
+ const publicKey = unmarshalPublicKey(payloadPeerId.publicKey)
91
+
92
+ const valid = await publicKey.verify(generatedPayload, payload.identitySig)
93
+
94
+ if (!valid) {
95
+ throw new Error("Static key doesn't match to peer that signed payload!")
96
+ }
97
+
98
+ return payloadPeerId
99
+ }
100
+
101
+ export function isValidPublicKey (pk: bytes): boolean {
102
+ if (!(pk instanceof Uint8Array)) {
103
+ return false
104
+ }
105
+
106
+ if (pk.length !== 32) {
107
+ return false
108
+ }
109
+
110
+ return true
111
+ }