-
Notifications
You must be signed in to change notification settings - Fork 52
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,6 +9,11 @@ | |
[![Circle CI](https://circleci.com/gh/libp2p/js-libp2p-crypto.svg?style=svg)](https://circleci.com/gh/libp2p/js-libp2p-crypto) | ||
[![Dependency Status](https://david-dm.org/libp2p/js-libp2p-crypto.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-crypto) | ||
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) | ||
![](https://img.shields.io/badge/npm-%3E%3D3.0.0-orange.svg?style=flat-square) | ||
![](https://img.shields.io/badge/Node.js-%3E%3D4.0.0-orange.svg?style=flat-square) | ||
|
||
[![Sauce Test Status](https://saucelabs.com/browser-matrix/ipfs-js-libp2p-crypto.svg)](https://saucelabs.com/u/ipfs-js- | ||
libp2p-crypto) | ||
|
||
> Crypto primitives for libp2p in JavaScript | ||
|
||
|
@@ -21,13 +26,22 @@ needed for libp2p. This is based on this [go implementation](https://github.com/ | |
- [Usage](#usage) | ||
- [Example](#example) | ||
- [API](#api) | ||
- [`generateKeyPair(type, bits)`](#generatekeypairtype-bits) | ||
- [`generateEphemeralKeyPair(curve)`](#generateephemeralkeypaircurve) | ||
- [`keyStretcher(cipherType, hashType, secret)`](#keystretcherciphertype-hashtype-secret) | ||
- [`marshalPublicKey(key[, type])`](#marshalpublickeykey-type) | ||
- [`hmac`](#hmac) | ||
- [`create(hash, secret, callback)`](#createhash-secret-callback) | ||
- [`digest(data, callback)`](#digestdata-callback) | ||
- [`aes`](#aes) | ||
- [`create(key, iv, callback)`](#createkey-iv-callback) | ||
- [`encrypt(data, callback)`](#encryptdata-callback) | ||
- [`encrypt(data, callback)`](#encryptdata-callback) | ||
- [`webcrypto`](#webcrypto) | ||
- [`keys`](#keys) | ||
- [`generateKeyPair(type, bits, callback)`](#generatekeypairtype-bits-callback) | ||
- [`generateEphemeralKeyPair(curve, callback)`](#generateephemeralkeypaircurve-callback) | ||
- [`keyStretcher(cipherType, hashType, secret, callback)`](#keystretcherciphertype-hashtype-secret-callback) | ||
- [`marshalPublicKey(key[, type], callback)`](#marshalpublickeykey-type-callback) | ||
- [`unmarshalPublicKey(buf)`](#unmarshalpublickeybuf) | ||
- [`marshalPrivateKey(key[, type])`](#marshalprivatekeykey-type) | ||
- [`unmarshalPrivateKey(buf)`](#unmarshalprivatekeybuf) | ||
- [`unmarshalPrivateKey(buf, callback)`](#unmarshalprivatekeybuf-callback) | ||
- [Contribute](#contribute) | ||
- [License](#license) | ||
|
||
|
@@ -44,43 +58,91 @@ npm install --save libp2p-crypto | |
```js | ||
const crypto = require('libp2p-crypto') | ||
|
||
var keyPair = crypto.generateKeyPair('RSA', 2048) | ||
crypto.generateKeyPair('RSA', 2048, (err, key) => { | ||
}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it |
||
``` | ||
|
||
## API | ||
|
||
### `generateKeyPair(type, bits)` | ||
### `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 length `16` then `AES 128` is used. For length `32`, `AES 256` is used. | ||
- `iv: Buffer` Must have length `16`. | ||
- `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](https://github.com/PeculiarVentures/node-webcrypto-ossl) or the result of `window.crypto`. | ||
|
||
### `keys` | ||
|
||
### `generateKeyPair(type, bits, callback)` | ||
|
||
- `type: String`, only `'RSA'` is currently supported | ||
- `bits: Number` | ||
- `bits: Number` Minimum of 1024 | ||
- `callback: Function` | ||
|
||
Generates a keypair of the given type and bitsize. | ||
|
||
### `generateEphemeralKeyPair(curve)` | ||
### `generateEphemeralKeyPair(curve, callback)` | ||
|
||
- `curve: String`, one of `'P-256'`, `'P-384'`, `'P-521'` is currently supported | ||
- `callback: 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. | ||
|
||
Returns an object of the form | ||
Calls back with an object of the form | ||
|
||
```js | ||
{ | ||
key: Buffer, | ||
genSharedKey: Function | ||
} | ||
``` | ||
|
||
### `keyStretcher(cipherType, hashType, secret)` | ||
### `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. | ||
|
||
Returns an object of the form | ||
Calls back with an object of the form | ||
```js | ||
{ | ||
k1: { | ||
|
@@ -95,7 +157,8 @@ Returns an object of the form | |
} | ||
} | ||
``` | ||
### `marshalPublicKey(key[, type])` | ||
|
||
### `marshalPublicKey(key[, type], callback)` | ||
|
||
- `key: crypto.rsa.RsaPublicKey` | ||
- `type: String`, only `'RSA'` is currently supported | ||
|
@@ -115,11 +178,13 @@ Converts a protobuf serialized public key into its representative object. | |
|
||
Converts a private key object into a protobuf serialized private key. | ||
|
||
### `unmarshalPrivateKey(buf)` | ||
### `unmarshalPrivateKey(buf, callback)` | ||
|
||
- `buf: Buffer` | ||
- `callback: Function` | ||
|
||
Converts a protobuf serialized private key into its representative object. | ||
|
||
Converts a protobuf serialized private key into its representative object. | ||
|
||
## Contribute | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
'use strict' | ||
|
||
const Benchmark = require('benchmark') | ||
const crypto = require('../src') | ||
|
||
const suite = new Benchmark.Suite('ephemeral-keys') | ||
|
||
const secrets = [] | ||
const curves = ['P-256', 'P-384', 'P-521'] | ||
|
||
curves.forEach((curve) => { | ||
suite.add(`ephemeral key with secrect ${curve}`, (d) => { | ||
crypto.generateEphemeralKeyPair('P-256', (err, res) => { | ||
if (err) { | ||
throw err | ||
} | ||
res.genSharedKey(res.key, (err, secret) => { | ||
if (err) { | ||
throw err | ||
} | ||
secrets.push(secret) | ||
|
||
d.resolve() | ||
}) | ||
}) | ||
}, { | ||
defer: true | ||
}) | ||
}) | ||
|
||
suite | ||
.on('cycle', (event) => { | ||
console.log(String(event.target)) | ||
}) | ||
.run({ | ||
'async': true | ||
}) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
'use strict' | ||
|
||
const Benchmark = require('benchmark') | ||
const crypto = require('../src') | ||
|
||
const suite = new Benchmark.Suite('key-stretcher') | ||
|
||
const keys = [] | ||
|
||
const ciphers = ['AES-128', 'AES-256', 'Blowfish'] | ||
const hashes = ['SHA1', 'SHA256', 'SHA512'] | ||
|
||
crypto.generateEphemeralKeyPair('P-256', (err, res) => { | ||
if (err) { | ||
throw err | ||
} | ||
|
||
res.genSharedKey(res.key, (err, secret) => { | ||
if (err) { | ||
throw err | ||
} | ||
ciphers.forEach((cipher) => { | ||
hashes.forEach((hash) => { | ||
suite.add(`keyStretcher ${cipher} ${hash}`, (d) => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't we all want to know ;) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is an object provided from |
||
crypto.keyStretcher(cipher, hash, secret, (err, k) => { | ||
if (err) { | ||
throw err | ||
} | ||
|
||
keys.push(k) | ||
d.resolve() | ||
}) | ||
}, { | ||
defer: true | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
|
||
suite | ||
.on('cycle', (event) => { | ||
console.log(String(event.target)) | ||
}) | ||
.run({ | ||
'async': true | ||
}) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
'use strict' | ||
|
||
const Benchmark = require('benchmark') | ||
const crypto = require('../src') | ||
|
||
const suite = new Benchmark.Suite('rsa') | ||
|
||
const keys = [] | ||
const bits = [1024, 2048, 4096] | ||
|
||
bits.forEach((bit) => { | ||
suite.add(`generateKeyPair ${bit}bits`, (d) => { | ||
crypto.generateKeyPair('RSA', bit, (err, key) => { | ||
if (err) throw err | ||
keys.push(key) | ||
d.resolve() | ||
}) | ||
}, { | ||
defer: true | ||
}) | ||
}) | ||
|
||
suite.add('sign and verify', (d) => { | ||
const key = keys[0] | ||
const text = key.genSecret() | ||
|
||
key.sign(text, (err, sig) => { | ||
if (err) { | ||
throw err | ||
} | ||
|
||
key.public.verify(text, sig, (err, res) => { | ||
if (err) { | ||
throw err | ||
} | ||
if (res !== true) { | ||
throw new Error('failed to verify') | ||
} | ||
d.resolve() | ||
}) | ||
}) | ||
}, { | ||
defer: true | ||
}) | ||
|
||
suite | ||
.on('cycle', (event) => { | ||
console.log(String(event.target)) | ||
}) | ||
.run({ | ||
'async': true | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why stop linking to things?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's continue linking the methods.