UNPKG

@chainsafe/libp2p-noise

Version:
89 lines (79 loc) 3.5 kB
import type { Nonce } from './nonce.js' import type { NoiseExtensions, NoiseHandshakePayload } from './proto/payload.js' import type { ConnectionEncrypter, Logger, PrivateKey, PublicKey } from '@libp2p/interface' import type { LengthPrefixedStream } from 'it-length-prefixed-stream' import type { Uint8ArrayList } from 'uint8arraylist' /** Crypto functions defined by the noise protocol, abstracted from the underlying implementations */ export interface ICrypto { generateKeypair(): KeyPair dh(keypair: KeyPair, publicKey: Uint8Array | Uint8ArrayList): Uint8Array encrypt(plaintext: Uint8Array | Uint8ArrayList, nonce: Uint8Array, ad: Uint8Array, k: Uint8Array): Uint8ArrayList | Uint8Array decrypt(ciphertext: Uint8Array | Uint8ArrayList, nonce: Uint8Array, ad: Uint8Array, k: Uint8Array, dst?: Uint8Array): Uint8ArrayList | Uint8Array hash(data: Uint8Array | Uint8ArrayList): Uint8Array hkdf(ck: Uint8Array, ikm: Uint8Array): [Uint8Array, Uint8Array, Uint8Array] } export interface HandshakeParams { log: Logger connection: LengthPrefixedStream crypto: ICrypto privateKey: PrivateKey prologue: Uint8Array /** static keypair */ s: KeyPair remoteIdentityKey?: PublicKey extensions?: NoiseExtensions } export interface HandshakeResult { payload: NoiseHandshakePayload encrypt (plaintext: Uint8Array | Uint8ArrayList): Uint8Array | Uint8ArrayList decrypt (ciphertext: Uint8Array | Uint8ArrayList, dst?: Uint8Array): Uint8Array | Uint8ArrayList } /** * A CipherState object contains k and n variables, which it uses to encrypt and decrypt ciphertexts. * During the handshake phase each party has a single CipherState, but during the transport phase each party has two CipherState objects: one for sending, and one for receiving. */ export interface ICipherState { /** A cipher key of 32 bytes (which may be empty). Empty is a special value which indicates k has not yet been initialized. */ k?: Uint8Array /** * An 8-byte (64-bit) unsigned integer nonce. * * For performance reasons, the nonce is represented as a Nonce object * The nonce is treated as a uint64, even though the underlying `number` only has 52 safely-available bits. */ n: Nonce } /** * A SymmetricState object contains a CipherState plus ck and h variables. It is so-named because it encapsulates all the "symmetric crypto" used by Noise. * During the handshake phase each party has a single SymmetricState, which can be deleted once the handshake is finished. */ export interface ISymmetricState { cs: ICipherState /** A chaining key of 32 bytes. */ ck: Uint8Array /** A hash output of 32 bytes. */ h: Uint8Array } /** * A HandshakeState object contains a SymmetricState plus DH variables (s, e, rs, re) and a variable representing the handshake pattern. * During the handshake phase each party has a single HandshakeState, which can be deleted once the handshake is finished. */ export interface IHandshakeState { ss: ISymmetricState /** The local static key pair */ s?: KeyPair /** The local ephemeral key pair */ e?: KeyPair /** The remote party's static public key */ rs?: Uint8Array | Uint8ArrayList /** The remote party's ephemeral public key */ re?: Uint8Array | Uint8ArrayList } export interface KeyPair { publicKey: Uint8Array privateKey: Uint8Array } export interface INoiseExtensions { webtransportCerthashes: Uint8Array[] } export interface INoiseConnection extends ConnectionEncrypter<INoiseExtensions> { }