@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.
- package/dist/index.min.js +27 -0
- package/dist/src/@types/basic.d.ts +5 -0
- package/dist/src/@types/basic.d.ts.map +1 -0
- package/dist/src/@types/basic.js +2 -0
- package/dist/src/@types/basic.js.map +1 -0
- package/dist/src/@types/handshake-interface.d.ts +15 -0
- package/dist/src/@types/handshake-interface.d.ts.map +1 -0
- package/dist/src/@types/handshake-interface.js +2 -0
- package/dist/src/@types/handshake-interface.js.map +1 -0
- package/dist/src/@types/handshake.d.ts +40 -0
- package/dist/src/@types/handshake.d.ts.map +1 -0
- package/dist/src/@types/handshake.js +2 -0
- package/dist/src/@types/handshake.js.map +1 -0
- package/dist/src/@types/libp2p.d.ts +10 -0
- package/dist/src/@types/libp2p.d.ts.map +1 -0
- package/dist/src/@types/libp2p.js +2 -0
- package/dist/src/@types/libp2p.js.map +1 -0
- package/dist/src/constants.d.ts +4 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +4 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/crypto/js.d.ts +3 -0
- package/dist/src/crypto/js.d.ts.map +1 -0
- package/dist/src/crypto/js.js +42 -0
- package/dist/src/crypto/js.js.map +1 -0
- package/dist/src/crypto/streaming.d.ts +7 -0
- package/dist/src/crypto/streaming.d.ts.map +1 -0
- package/dist/src/crypto/streaming.js +50 -0
- package/dist/src/crypto/streaming.js.map +1 -0
- package/dist/src/crypto.d.ts +13 -0
- package/dist/src/crypto.d.ts.map +1 -0
- package/dist/src/crypto.js +2 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/encoder.d.ts +15 -0
- package/dist/src/encoder.d.ts.map +1 -0
- package/dist/src/encoder.js +63 -0
- package/dist/src/encoder.js.map +1 -0
- package/dist/src/handshake-xx.d.ts +33 -0
- package/dist/src/handshake-xx.d.ts.map +1 -0
- package/dist/src/handshake-xx.js +139 -0
- package/dist/src/handshake-xx.js.map +1 -0
- package/dist/src/handshakes/abstract-handshake.d.ts +36 -0
- package/dist/src/handshakes/abstract-handshake.d.ts.map +1 -0
- package/dist/src/handshakes/abstract-handshake.js +140 -0
- package/dist/src/handshakes/abstract-handshake.js.map +1 -0
- package/dist/src/handshakes/xx.d.ts +18 -0
- package/dist/src/handshakes/xx.d.ts.map +1 -0
- package/dist/src/handshakes/xx.js +161 -0
- package/dist/src/handshakes/xx.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logger.d.ts +11 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +45 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/metrics.d.ts +4 -0
- package/dist/src/metrics.d.ts.map +1 -0
- package/dist/src/metrics.js +20 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/noise.d.ts +55 -0
- package/dist/src/noise.d.ts.map +1 -0
- package/dist/src/noise.js +130 -0
- package/dist/src/noise.js.map +1 -0
- package/dist/src/nonce.d.ts +18 -0
- package/dist/src/nonce.d.ts.map +1 -0
- package/dist/src/nonce.js +41 -0
- package/dist/src/nonce.js.map +1 -0
- package/dist/src/proto/payload.d.ts +21 -0
- package/dist/src/proto/payload.d.ts.map +1 -0
- package/dist/src/proto/payload.js +114 -0
- package/dist/src/proto/payload.js.map +1 -0
- package/dist/src/utils.d.ts +20 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +74 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +99 -0
- package/src/@types/basic.ts +5 -0
- package/src/@types/handshake-interface.ts +12 -0
- package/src/@types/handshake.ts +48 -0
- package/src/@types/libp2p.ts +10 -0
- package/src/constants.ts +4 -0
- package/src/crypto/js.ts +58 -0
- package/src/crypto/streaming.ts +58 -0
- package/src/crypto.ts +16 -0
- package/src/encoder.ts +81 -0
- package/src/handshake-xx.ts +177 -0
- package/src/handshakes/abstract-handshake.ts +180 -0
- package/src/handshakes/xx.ts +184 -0
- package/src/index.ts +10 -0
- package/src/logger.ts +51 -0
- package/src/metrics.ts +32 -0
- package/src/noise.ts +192 -0
- package/src/nonce.ts +49 -0
- package/src/proto/payload.proto +11 -0
- package/src/proto/payload.ts +148 -0
- 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
|
+
}
|