Due to the design of `AES-CTR` in the webcrypto spec, there is no streaming mode provided. This results in the counter not being reused between subsequent calls to `encrypt` or `decrypt`. As both the node.js and the go implementation rely on this webcrypto had to be replaced.
js-libp2p-crypto
[](https://saucelabs.com/u/ipfs-js-
libp2p-crypto)
Crypto primitives for libp2p in JavaScript
This repo contains the JavaScript implementation of the crypto primitives needed for libp2p. This is based on this go implementation.
Table of Contents
- Install
- Usage
- API
- Contribute
- License
Install
npm install --save libp2p-crypto
Usage
Example
const crypto = require('libp2p-crypto')
crypto.generateKeyPair('RSA', 2048, (err, key) => {
})
API
hmac
Exposes an interface to the Keyed-Hash Message Authentication Code (HMAC) as defined in U.S. Federal Information Processing Standards Publication 198. An HMAC is a cryptographic hash that uses a key to sign a message. The receiver verifies the hash by recomputing it using the same key.
create(hash, secret, callback)
hash: String
secret: Buffer
callback: Function
digest(data, callback)
data: Buffer
callback: Function
aes
Expoes an interface to AES encryption (formerly Rijndael), as defined in U.S. Federal Information Processing Standards Publication 197.
This uses CTR
mode.
create(key, iv, callback)
key: Buffer
The key, if length16
thenAES 128
is used. For length32
,AES 256
is used.iv: Buffer
Must have length16
.callback: Function
encrypt(data, callback)
data: Buffer
callback: Function
encrypt(data, callback)
data: Buffer
callback: Function
webcrypto
Depending on the environment this is either an instance of node-webcrypto-ossl or the result of window.crypto
.
keys
generateKeyPair(type, bits, callback)
type: String
, only'RSA'
is currently supportedbits: Number
Minimum of 1024callback: Function
Generates a keypair of the given type and bitsize.
generateEphemeralKeyPair(curve, callback)
curve: String
, one of'P-256'
,'P-384'
,'P-521'
is currently supportedcallback: Function
Generates an ephemeral public key and returns a function that will compute the shared secret key.
Focuses only on ECDH now, but can be made more general in the future.
Calls back with an object of the form
{
key: Buffer,
genSharedKey: Function
}
keyStretcher(cipherType, hashType, secret, callback)
cipherType: String
, one of'AES-128'
,'AES-256'
,'Blowfish'
hashType: String
, one of'SHA1'
,SHA256
,SHA512
secret: Buffer
callback: Function
Generates a set of keys for each party by stretching the shared key.
Calls back with an object of the form
{
k1: {
iv: Buffer,
cipherKey: Buffer,
macKey: Buffer
},
k2: {
iv: Buffer,
cipherKey: Buffer,
macKey: Buffer
}
}
marshalPublicKey(key[, type], callback)
key: crypto.rsa.RsaPublicKey
type: String
, only'RSA'
is currently supported
Converts a public key object into a protobuf serialized public key.
unmarshalPublicKey(buf)
buf: Buffer
Converts a protobuf serialized public key into its representative object.
marshalPrivateKey(key[, type])
key: crypto.rsa.RsaPrivateKey
type: String
, only'RSA'
is currently supported
Converts a private key object into a protobuf serialized private key.
unmarshalPrivateKey(buf, callback)
buf: Buffer
callback: Function
Converts a protobuf serialized private key into its representative object.
Contribute
Feel free to join in. All welcome. Open an issue!
This repository falls under the IPFS Code of Conduct.