-
Couldn't load subscription status.
- Fork 51
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 @@ | |
| [](https://circleci.com/gh/libp2p/js-libp2p-crypto) | ||
| [](https://david-dm.org/libp2p/js-libp2p-crypto) | ||
| [](https://github.com/feross/standard) | ||
|  | ||
|  | ||
| | ||
| [](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.