mirror of
https://github.com/fluencelabs/js-libp2p-crypto
synced 2025-07-23 07:42:13 +00:00
Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
967594c9a3 | ||
|
03893a3795 | ||
|
50afa4efbc | ||
|
1c54a9b196 | ||
|
6f2c347895 | ||
|
867982ab92 | ||
|
7b3625888c | ||
|
b7bce77ad5 | ||
|
c1f867bd9c | ||
|
e3f02eb6f1 | ||
|
a0874389a9 | ||
|
567d68c855 | ||
|
af782c5906 | ||
|
f0593c9e6d | ||
|
8d8294dc3f | ||
|
df23d634c5 | ||
|
88e1bcf75f | ||
|
c54ea206f0 |
34
.npmignore
34
.npmignore
@@ -1,34 +0,0 @@
|
|||||||
**/node_modules/
|
|
||||||
**/*.log
|
|
||||||
test/repo-tests*
|
|
||||||
|
|
||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
|
|
||||||
coverage
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage
|
|
||||||
|
|
||||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
|
||||||
.grunt
|
|
||||||
|
|
||||||
# node-waf configuration
|
|
||||||
.lock-wscript
|
|
||||||
|
|
||||||
build
|
|
||||||
|
|
||||||
# Dependency directory
|
|
||||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
|
||||||
node_modules
|
|
||||||
|
|
||||||
test
|
|
64
.travis.yml
64
.travis.yml
@@ -1,32 +1,44 @@
|
|||||||
# Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories.
|
|
||||||
sudo: false
|
|
||||||
language: node_js
|
language: node_js
|
||||||
|
|
||||||
matrix:
|
cache: npm
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- check
|
||||||
|
- test
|
||||||
|
- cov
|
||||||
|
|
||||||
|
node_js:
|
||||||
|
- '10'
|
||||||
|
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
- windows
|
||||||
|
|
||||||
|
script: npx nyc -s npm run test:node -- --bail
|
||||||
|
after_success: npx nyc report --reporter=text-lcov > coverage.lcov && npx codecov
|
||||||
|
|
||||||
|
jobs:
|
||||||
include:
|
include:
|
||||||
- node_js: 6
|
- stage: check
|
||||||
env: CXX=g++-4.8
|
script:
|
||||||
- node_js: 8
|
- npx aegir commitlint --travis
|
||||||
env: CXX=g++-4.8
|
- npx aegir dep-check
|
||||||
# - node_js: stable
|
- npm run lint
|
||||||
# env: CXX=g++-4.8
|
|
||||||
|
|
||||||
script:
|
- stage: test
|
||||||
- npm run lint
|
name: chrome
|
||||||
- npm run test
|
addons:
|
||||||
- npm run coverage
|
chrome: stable
|
||||||
|
script:
|
||||||
|
- npx aegir test -t browser
|
||||||
|
|
||||||
before_script:
|
- stage: test
|
||||||
- export DISPLAY=:99.0
|
name: firefox
|
||||||
- sh -e /etc/init.d/xvfb start
|
addons:
|
||||||
|
firefox: latest
|
||||||
|
script:
|
||||||
|
- npx aegir test -t browser -- --browsers FirefoxHeadless
|
||||||
|
|
||||||
after_success:
|
notifications:
|
||||||
- npm run coverage-publish
|
email: false
|
||||||
|
|
||||||
addons:
|
|
||||||
firefox: 'latest'
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- g++-4.8
|
|
||||||
|
35
CHANGELOG.md
35
CHANGELOG.md
@@ -1,3 +1,38 @@
|
|||||||
|
<a name="0.16.2"></a>
|
||||||
|
## [0.16.2](https://github.com/libp2p/js-libp2p-crypto/compare/v0.16.1...v0.16.2) (2019-09-25)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="0.16.1"></a>
|
||||||
|
## [0.16.1](https://github.com/libp2p/js-libp2p-crypto/compare/v0.16.0...v0.16.1) (2019-02-26)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="0.16.0"></a>
|
||||||
|
# [0.16.0](https://github.com/libp2p/js-libp2p-crypto/compare/v0.15.0...v0.16.0) (2019-01-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* clean up, bundle size reduction ([8d8294d](https://github.com/libp2p/js-libp2p-crypto/commit/8d8294d))
|
||||||
|
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* getRandomValues method exported from src/keys/rsa-browser.js and src/keys/rsa.js signature has changed from accepting an array to a number for random byte length
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="0.15.0"></a>
|
||||||
|
# [0.15.0](https://github.com/libp2p/js-libp2p-crypto/compare/v0.14.1...v0.15.0) (2019-01-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* nextTick instead of setImmediate, and fix sync in async ([#136](https://github.com/libp2p/js-libp2p-crypto/issues/136)) ([c54ea20](https://github.com/libp2p/js-libp2p-crypto/commit/c54ea20))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="0.14.1"></a>
|
<a name="0.14.1"></a>
|
||||||
## [0.14.1](https://github.com/libp2p/js-libp2p-crypto/compare/v0.14.0...v0.14.1) (2018-11-05)
|
## [0.14.1](https://github.com/libp2p/js-libp2p-crypto/compare/v0.14.0...v0.14.1) (2018-11-05)
|
||||||
|
|
||||||
|
11
README.md
11
README.md
@@ -1,9 +1,8 @@
|
|||||||
# js-libp2p-crypto
|
# js-libp2p-crypto
|
||||||
|
|
||||||
[](http://ipn.io)
|
[](http://protocol.ai)
|
||||||
[](http://ipfs.io/)
|
[](http://libp2p.io/)
|
||||||
[](http://webchat.freenode.net/?channels=%23ipfs)
|
[](http://webchat.freenode.net/?channels=%23libp2p)
|
||||||
[](https://github.com/RichardLitt/standard-readme)
|
|
||||||
[](https://coveralls.io/github/libp2p/js-libp2p-crypto?branch=master)
|
[](https://coveralls.io/github/libp2p/js-libp2p-crypto?branch=master)
|
||||||
[](https://travis-ci.org/libp2p/js-libp2p-crypto)
|
[](https://travis-ci.org/libp2p/js-libp2p-crypto)
|
||||||
[](https://circleci.com/gh/libp2p/js-libp2p-crypto)
|
[](https://circleci.com/gh/libp2p/js-libp2p-crypto)
|
||||||
@@ -62,7 +61,7 @@ This uses `CTR` mode.
|
|||||||
|
|
||||||
- `key: Buffer` The key, if length `16` then `AES 128` is used. For length `32`, `AES 256` is used.
|
- `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`.
|
- `iv: Buffer` Must have length `16`.
|
||||||
- `callback: Function`
|
- `callback: Function`
|
||||||
|
|
||||||
##### `decrypt(data, callback)`
|
##### `decrypt(data, callback)`
|
||||||
|
|
||||||
@@ -109,7 +108,7 @@ async function main () {
|
|||||||
if (!err) {
|
if (!err) {
|
||||||
console.log(decryptedBuffer)
|
console.log(decryptedBuffer)
|
||||||
// prints: <Buffer 42 f1 67 d9 2e 42 d0 32 9e b1 f8 3c>
|
// prints: <Buffer 42 f1 67 d9 2e 42 d0 32 9e b1 f8 3c>
|
||||||
|
|
||||||
console.log(decryptedBuffer.toString('utf-8'))
|
console.log(decryptedBuffer.toString('utf-8'))
|
||||||
// prints: Hello, world!
|
// prints: Hello, world!
|
||||||
}
|
}
|
||||||
|
29
appveyor.yml
29
appveyor.yml
@@ -1,29 +0,0 @@
|
|||||||
# Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories.
|
|
||||||
version: "{build}"
|
|
||||||
|
|
||||||
environment:
|
|
||||||
matrix:
|
|
||||||
- nodejs_version: "6"
|
|
||||||
- nodejs_version: "8"
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
|
|
||||||
install:
|
|
||||||
# Install Node.js
|
|
||||||
- ps: Install-Product node $env:nodejs_version
|
|
||||||
|
|
||||||
# Upgrade npm
|
|
||||||
- npm install -g npm
|
|
||||||
|
|
||||||
# Output our current versions for debugging
|
|
||||||
- node --version
|
|
||||||
- npm --version
|
|
||||||
|
|
||||||
# Install our package dependencies
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
test_script:
|
|
||||||
- npm run test:node
|
|
||||||
|
|
||||||
build: off
|
|
@@ -25,4 +25,4 @@ curves.forEach((curve) => {
|
|||||||
|
|
||||||
suite
|
suite
|
||||||
.on('cycle', (event) => console.log(String(event.target)))
|
.on('cycle', (event) => console.log(String(event.target)))
|
||||||
.run({async: true})
|
.run({ async: true })
|
||||||
|
@@ -25,7 +25,7 @@ async.waterfall([
|
|||||||
|
|
||||||
suite
|
suite
|
||||||
.on('cycle', (event) => console.log(String(event.target)))
|
.on('cycle', (event) => console.log(String(event.target)))
|
||||||
.run({async: true})
|
.run({ async: true })
|
||||||
})
|
})
|
||||||
|
|
||||||
function setup (cipher, hash, secret) {
|
function setup (cipher, hash, secret) {
|
||||||
|
@@ -40,4 +40,4 @@ suite.add('sign and verify', (d) => {
|
|||||||
|
|
||||||
suite
|
suite
|
||||||
.on('cycle', (event) => console.log(String(event.target)))
|
.on('cycle', (event) => console.log(String(event.target)))
|
||||||
.run({async: true})
|
.run({ async: true })
|
||||||
|
2
ci/Jenkinsfile
vendored
2
ci/Jenkinsfile
vendored
@@ -1,2 +0,0 @@
|
|||||||
// Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories.
|
|
||||||
javascript()
|
|
15
circle.yml
15
circle.yml
@@ -1,15 +0,0 @@
|
|||||||
# Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories.
|
|
||||||
machine:
|
|
||||||
node:
|
|
||||||
version: stable
|
|
||||||
|
|
||||||
dependencies:
|
|
||||||
pre:
|
|
||||||
- google-chrome --version
|
|
||||||
- curl -L -o google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
|
|
||||||
- sudo dpkg -i google-chrome.deb || true
|
|
||||||
- sudo apt-get update
|
|
||||||
- sudo apt-get install -f
|
|
||||||
- sudo apt-get install --only-upgrade lsb-base
|
|
||||||
- sudo dpkg -i google-chrome.deb
|
|
||||||
- google-chrome --version
|
|
33
package.json
33
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "libp2p-crypto",
|
"name": "libp2p-crypto",
|
||||||
"version": "0.14.1",
|
"version": "0.16.2",
|
||||||
"description": "Crypto primitives for libp2p",
|
"description": "Crypto primitives for libp2p",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"leadMaintainer": "Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
"leadMaintainer": "Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
||||||
@@ -10,6 +10,10 @@
|
|||||||
"./src/aes/ciphers.js": "./src/aes/ciphers-browser.js",
|
"./src/aes/ciphers.js": "./src/aes/ciphers-browser.js",
|
||||||
"./src/keys/rsa.js": "./src/keys/rsa-browser.js"
|
"./src/keys/rsa.js": "./src/keys/rsa-browser.js"
|
||||||
},
|
},
|
||||||
|
"files": [
|
||||||
|
"src",
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "aegir lint",
|
"lint": "aegir lint",
|
||||||
"build": "aegir build",
|
"build": "aegir build",
|
||||||
@@ -20,7 +24,8 @@
|
|||||||
"release": "aegir release",
|
"release": "aegir release",
|
||||||
"release-minor": "aegir release --type minor",
|
"release-minor": "aegir release --type minor",
|
||||||
"release-major": "aegir release --type major",
|
"release-major": "aegir release --type major",
|
||||||
"coverage": "aegir coverage --ignore src/keys/keys.proto.js"
|
"coverage": "aegir coverage --ignore src/keys/keys.proto.js",
|
||||||
|
"size": "bundlesize -f dist/index.min.js -s 139kB"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"IPFS",
|
"IPFS",
|
||||||
@@ -30,31 +35,34 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"asmcrypto.js": "^2.3.2",
|
||||||
"asn1.js": "^5.0.1",
|
"asn1.js": "^5.0.1",
|
||||||
"async": "^2.6.1",
|
"async": "^2.6.1",
|
||||||
|
"bn.js": "^4.11.8",
|
||||||
"browserify-aes": "^1.2.0",
|
"browserify-aes": "^1.2.0",
|
||||||
"bs58": "^4.0.1",
|
"bs58": "^4.0.1",
|
||||||
|
"iso-random-stream": "^1.1.0",
|
||||||
"keypair": "^1.0.1",
|
"keypair": "^1.0.1",
|
||||||
"libp2p-crypto-secp256k1": "~0.2.2",
|
"libp2p-crypto-secp256k1": "~0.3.0",
|
||||||
"multihashing-async": "~0.5.1",
|
"multihashing-async": "~0.5.1",
|
||||||
"node-forge": "~0.7.6",
|
"node-forge": "^0.8.5",
|
||||||
"pem-jwk": "^1.5.1",
|
"pem-jwk": "^2.0.0",
|
||||||
"protons": "^1.0.1",
|
"protons": "^1.0.1",
|
||||||
"rsa-pem-to-jwk": "^1.1.3",
|
"rsa-pem-to-jwk": "^1.1.3",
|
||||||
"tweetnacl": "^1.0.0",
|
"tweetnacl": "^1.0.0",
|
||||||
"ursa-optional": "~0.9.9",
|
"ursa-optional": "~0.10.0"
|
||||||
"webcrypto-shim": "github:dignifiedquire/webcrypto-shim#master"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"aegir": "^17.0.1",
|
"aegir": "^20.0.0",
|
||||||
"benchmark": "^2.1.4",
|
"benchmark": "^2.1.4",
|
||||||
|
"bundlesize": "^0.18.0",
|
||||||
"chai": "^4.2.0",
|
"chai": "^4.2.0",
|
||||||
"chai-string": "^1.5.0",
|
"chai-string": "^1.5.0",
|
||||||
"dirty-chai": "^2.0.1"
|
"dirty-chai": "^2.0.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.0.0",
|
"node": ">=10.0.0",
|
||||||
"npm": ">=3.0.0"
|
"npm": ">=6.0.0"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -65,10 +73,12 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/libp2p/js-libp2p-crypto",
|
"homepage": "https://github.com/libp2p/js-libp2p-crypto",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
|
"Alberto Elias <hi@albertoelias.me>",
|
||||||
"David Dias <daviddias.p@gmail.com>",
|
"David Dias <daviddias.p@gmail.com>",
|
||||||
"Dmitriy Ryajov <dryajov@gmail.com>",
|
"Dmitriy Ryajov <dryajov@gmail.com>",
|
||||||
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
||||||
"Greenkeeper <support@greenkeeper.io>",
|
"Greenkeeper <support@greenkeeper.io>",
|
||||||
|
"Hugo Dias <hugomrdias@gmail.com>",
|
||||||
"Jack Kleeman <jackkleeman@gmail.com>",
|
"Jack Kleeman <jackkleeman@gmail.com>",
|
||||||
"Jacob Heun <jacobheun@gmail.com>",
|
"Jacob Heun <jacobheun@gmail.com>",
|
||||||
"Joao Santos <jrmsantos15@gmail.com>",
|
"Joao Santos <jrmsantos15@gmail.com>",
|
||||||
@@ -76,8 +86,11 @@
|
|||||||
"Richard Littauer <richard.littauer@gmail.com>",
|
"Richard Littauer <richard.littauer@gmail.com>",
|
||||||
"Richard Schneider <makaretu@gmail.com>",
|
"Richard Schneider <makaretu@gmail.com>",
|
||||||
"Tom Swindell <t.swindell@rubyx.co.uk>",
|
"Tom Swindell <t.swindell@rubyx.co.uk>",
|
||||||
|
"Vasco Santos <vasco.santos@ua.pt>",
|
||||||
"Victor Bjelkholm <victorbjelkholm@gmail.com>",
|
"Victor Bjelkholm <victorbjelkholm@gmail.com>",
|
||||||
"Yusef Napora <yusef@napora.org>",
|
"Yusef Napora <yusef@napora.org>",
|
||||||
|
"achingbrain <alex@achingbrain.net>",
|
||||||
|
"dignifiedquire <dignifiedquire@users.noreply.github.com>",
|
||||||
"greenkeeper[bot] <greenkeeper[bot]@users.noreply.github.com>",
|
"greenkeeper[bot] <greenkeeper[bot]@users.noreply.github.com>",
|
||||||
"nikuda <nikuda@gmail.com>"
|
"nikuda <nikuda@gmail.com>"
|
||||||
]
|
]
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const asm = require('asmcrypto.js')
|
const asm = require('asmcrypto.js')
|
||||||
const setImmediate = require('async/setImmediate')
|
const nextTick = require('async/nextTick')
|
||||||
|
|
||||||
exports.create = function (key, iv, callback) {
|
exports.create = function (key, iv, callback) {
|
||||||
const done = (err, res) => setImmediate(() => callback(err, res))
|
const done = (err, res) => nextTick(() => callback(err, res))
|
||||||
|
|
||||||
if (key.length !== 16 && key.length !== 32) {
|
if (key.length !== 16 && key.length !== 32) {
|
||||||
return done(new Error('Invalid key length'))
|
return done(new Error('Invalid key length'))
|
||||||
@@ -21,7 +21,7 @@ exports.create = function (key, iv, callback) {
|
|||||||
|
|
||||||
const res = {
|
const res = {
|
||||||
encrypt (data, cb) {
|
encrypt (data, cb) {
|
||||||
const done = (err, res) => setImmediate(() => cb(err, res))
|
const done = (err, res) => nextTick(() => cb(err, res))
|
||||||
|
|
||||||
let res
|
let res
|
||||||
try {
|
try {
|
||||||
@@ -36,7 +36,7 @@ exports.create = function (key, iv, callback) {
|
|||||||
},
|
},
|
||||||
|
|
||||||
decrypt (data, cb) {
|
decrypt (data, cb) {
|
||||||
const done = (err, res) => setImmediate(() => cb(err, res))
|
const done = (err, res) => nextTick(() => cb(err, res))
|
||||||
|
|
||||||
let res
|
let res
|
||||||
try {
|
try {
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
const nodeify = require('../nodeify')
|
const nodeify = require('../nodeify')
|
||||||
|
|
||||||
const crypto = require('../webcrypto.js')()
|
const crypto = require('../webcrypto')
|
||||||
const lengths = require('./lengths')
|
const lengths = require('./lengths')
|
||||||
|
|
||||||
const hashTypes = {
|
const hashTypes = {
|
||||||
@@ -12,7 +12,7 @@ const hashTypes = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const sign = (key, data, cb) => {
|
const sign = (key, data, cb) => {
|
||||||
nodeify(crypto.subtle.sign({name: 'HMAC'}, key, data)
|
nodeify(crypto.subtle.sign({ name: 'HMAC' }, key, data)
|
||||||
.then((raw) => Buffer.from(raw)), cb)
|
.then((raw) => Buffer.from(raw)), cb)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ exports.create = function (hashType, secret, callback) {
|
|||||||
secret,
|
secret,
|
||||||
{
|
{
|
||||||
name: 'HMAC',
|
name: 'HMAC',
|
||||||
hash: {name: hash}
|
hash: { name: hash }
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
['sign']
|
['sign']
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
const crypto = require('crypto')
|
const crypto = require('crypto')
|
||||||
const lengths = require('./lengths')
|
const lengths = require('./lengths')
|
||||||
|
const nextTick = require('async/nextTick')
|
||||||
|
|
||||||
exports.create = function (hash, secret, callback) {
|
exports.create = function (hash, secret, callback) {
|
||||||
const res = {
|
const res = {
|
||||||
@@ -10,7 +11,9 @@ exports.create = function (hash, secret, callback) {
|
|||||||
|
|
||||||
hmac.update(data)
|
hmac.update(data)
|
||||||
|
|
||||||
cb(null, hmac.digest())
|
nextTick(() => {
|
||||||
|
cb(null, hmac.digest())
|
||||||
|
})
|
||||||
},
|
},
|
||||||
length: lengths[hash]
|
length: lengths[hash]
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const webcrypto = require('../webcrypto.js')()
|
const webcrypto = require('../webcrypto')
|
||||||
const nodeify = require('../nodeify')
|
const nodeify = require('../nodeify')
|
||||||
const BN = require('asn1.js').bignum
|
const BN = require('asn1.js').bignum
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const crypto = require('crypto')
|
const crypto = require('crypto')
|
||||||
const setImmediate = require('async/setImmediate')
|
const nextTick = require('async/nextTick')
|
||||||
|
|
||||||
const curves = {
|
const curves = {
|
||||||
'P-256': 'prime256v1',
|
'P-256': 'prime256v1',
|
||||||
@@ -16,7 +16,7 @@ exports.generateEphmeralKeyPair = function (curve, callback) {
|
|||||||
const ecdh = crypto.createECDH(curves[curve])
|
const ecdh = crypto.createECDH(curves[curve])
|
||||||
ecdh.generateKeys()
|
ecdh.generateKeys()
|
||||||
|
|
||||||
setImmediate(() => callback(null, {
|
nextTick(() => callback(null, {
|
||||||
key: ecdh.getPublicKey(),
|
key: ecdh.getPublicKey(),
|
||||||
genSharedKey (theirPub, forcePrivate, cb) {
|
genSharedKey (theirPub, forcePrivate, cb) {
|
||||||
if (typeof forcePrivate === 'function') {
|
if (typeof forcePrivate === 'function') {
|
||||||
@@ -35,7 +35,7 @@ exports.generateEphmeralKeyPair = function (curve, callback) {
|
|||||||
return cb(err)
|
return cb(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
setImmediate(() => cb(null, secret))
|
nextTick(() => cb(null, secret))
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const nacl = require('tweetnacl')
|
const nacl = require('tweetnacl')
|
||||||
const setImmediate = require('async/setImmediate')
|
const nextTick = require('async/nextTick')
|
||||||
|
|
||||||
exports.publicKeyLength = nacl.sign.publicKeyLength
|
exports.publicKeyLength = nacl.sign.publicKeyLength
|
||||||
exports.privateKeyLength = nacl.sign.secretKeyLength
|
exports.privateKeyLength = nacl.sign.secretKeyLength
|
||||||
|
|
||||||
exports.generateKey = function (callback) {
|
exports.generateKey = function (callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
let result
|
let result
|
||||||
try {
|
try {
|
||||||
result = nacl.sign.keyPair()
|
result = nacl.sign.keyPair()
|
||||||
@@ -20,7 +20,7 @@ exports.generateKey = function (callback) {
|
|||||||
|
|
||||||
// seed should be a 32 byte uint8array
|
// seed should be a 32 byte uint8array
|
||||||
exports.generateKeyFromSeed = function (seed, callback) {
|
exports.generateKeyFromSeed = function (seed, callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
let result
|
let result
|
||||||
try {
|
try {
|
||||||
result = nacl.sign.keyPair.fromSeed(seed)
|
result = nacl.sign.keyPair.fromSeed(seed)
|
||||||
@@ -32,13 +32,13 @@ exports.generateKeyFromSeed = function (seed, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
exports.hashAndSign = function (key, msg, callback) {
|
exports.hashAndSign = function (key, msg, callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
callback(null, Buffer.from(nacl.sign.detached(msg, key)))
|
callback(null, Buffer.from(nacl.sign.detached(msg, key)))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.hashAndVerify = function (key, sig, msg, callback) {
|
exports.hashAndVerify = function (key, sig, msg, callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
let result
|
let result
|
||||||
try {
|
try {
|
||||||
result = nacl.sign.detached.verify(msg, sig, key)
|
result = nacl.sign.detached.verify(msg, sig, key)
|
||||||
|
@@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
const protobuf = require('protons')
|
const protobuf = require('protons')
|
||||||
const keysPBM = protobuf(require('./keys.proto'))
|
const keysPBM = protobuf(require('./keys.proto'))
|
||||||
const forge = require('node-forge')
|
require('node-forge/lib/asn1')
|
||||||
|
require('node-forge/lib/rsa')
|
||||||
|
require('node-forge/lib/pbe')
|
||||||
|
const forge = require('node-forge/lib/forge')
|
||||||
|
|
||||||
exports = module.exports
|
exports = module.exports
|
||||||
|
|
||||||
@@ -25,7 +28,7 @@ exports.generateEphemeralKeyPair = require('./ephemeral-keys')
|
|||||||
|
|
||||||
// Generates a keypair of the given type and bitsize
|
// Generates a keypair of the given type and bitsize
|
||||||
exports.generateKeyPair = (type, bits, cb) => {
|
exports.generateKeyPair = (type, bits, cb) => {
|
||||||
let key = supportedKeys[type.toLowerCase()]
|
const key = supportedKeys[type.toLowerCase()]
|
||||||
|
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return cb(new Error('invalid or unsupported key type'))
|
return cb(new Error('invalid or unsupported key type'))
|
||||||
@@ -37,7 +40,7 @@ exports.generateKeyPair = (type, bits, cb) => {
|
|||||||
// Generates a keypair of the given type and bitsize
|
// Generates a keypair of the given type and bitsize
|
||||||
// seed is a 32 byte uint8array
|
// seed is a 32 byte uint8array
|
||||||
exports.generateKeyPairFromSeed = (type, seed, bits, cb) => {
|
exports.generateKeyPairFromSeed = (type, seed, bits, cb) => {
|
||||||
let key = supportedKeys[type.toLowerCase()]
|
const key = supportedKeys[type.toLowerCase()]
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return cb(new Error('invalid or unsupported key type'))
|
return cb(new Error('invalid or unsupported key type'))
|
||||||
}
|
}
|
||||||
|
@@ -47,7 +47,7 @@ module.exports = (cipherType, hash, secret, callback) => {
|
|||||||
return callback(err)
|
return callback(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = []
|
const result = []
|
||||||
let j = 0
|
let j = 0
|
||||||
|
|
||||||
whilst(
|
whilst(
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const nodeify = require('../nodeify')
|
const nodeify = require('../nodeify')
|
||||||
|
const webcrypto = require('../webcrypto')
|
||||||
const webcrypto = require('../webcrypto.js')()
|
const randomBytes = require('../random-bytes')
|
||||||
|
|
||||||
exports.utils = require('./rsa-utils')
|
exports.utils = require('./rsa-utils')
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ exports.generateKey = function (bits, callback) {
|
|||||||
name: 'RSASSA-PKCS1-v1_5',
|
name: 'RSASSA-PKCS1-v1_5',
|
||||||
modulusLength: bits,
|
modulusLength: bits,
|
||||||
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
|
||||||
hash: {name: 'SHA-256'}
|
hash: { name: 'SHA-256' }
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
['sign', 'verify']
|
['sign', 'verify']
|
||||||
@@ -31,7 +31,7 @@ exports.unmarshalPrivateKey = function (key, callback) {
|
|||||||
key,
|
key,
|
||||||
{
|
{
|
||||||
name: 'RSASSA-PKCS1-v1_5',
|
name: 'RSASSA-PKCS1-v1_5',
|
||||||
hash: {name: 'SHA-256'}
|
hash: { name: 'SHA-256' }
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
['sign']
|
['sign']
|
||||||
@@ -49,9 +49,7 @@ exports.unmarshalPrivateKey = function (key, callback) {
|
|||||||
})), callback)
|
})), callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.getRandomValues = function (arr) {
|
exports.getRandomValues = randomBytes
|
||||||
return Buffer.from(webcrypto.getRandomValues(arr))
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.hashAndSign = function (key, msg, callback) {
|
exports.hashAndSign = function (key, msg, callback) {
|
||||||
nodeify(webcrypto.subtle.importKey(
|
nodeify(webcrypto.subtle.importKey(
|
||||||
@@ -59,13 +57,13 @@ exports.hashAndSign = function (key, msg, callback) {
|
|||||||
key,
|
key,
|
||||||
{
|
{
|
||||||
name: 'RSASSA-PKCS1-v1_5',
|
name: 'RSASSA-PKCS1-v1_5',
|
||||||
hash: {name: 'SHA-256'}
|
hash: { name: 'SHA-256' }
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
['sign']
|
['sign']
|
||||||
).then((privateKey) => {
|
).then((privateKey) => {
|
||||||
return webcrypto.subtle.sign(
|
return webcrypto.subtle.sign(
|
||||||
{name: 'RSASSA-PKCS1-v1_5'},
|
{ name: 'RSASSA-PKCS1-v1_5' },
|
||||||
privateKey,
|
privateKey,
|
||||||
Uint8Array.from(msg)
|
Uint8Array.from(msg)
|
||||||
)
|
)
|
||||||
@@ -78,13 +76,13 @@ exports.hashAndVerify = function (key, sig, msg, callback) {
|
|||||||
key,
|
key,
|
||||||
{
|
{
|
||||||
name: 'RSASSA-PKCS1-v1_5',
|
name: 'RSASSA-PKCS1-v1_5',
|
||||||
hash: {name: 'SHA-256'}
|
hash: { name: 'SHA-256' }
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
['verify']
|
['verify']
|
||||||
).then((publicKey) => {
|
).then((publicKey) => {
|
||||||
return webcrypto.subtle.verify(
|
return webcrypto.subtle.verify(
|
||||||
{name: 'RSASSA-PKCS1-v1_5'},
|
{ name: 'RSASSA-PKCS1-v1_5' },
|
||||||
publicKey,
|
publicKey,
|
||||||
sig,
|
sig,
|
||||||
msg
|
msg
|
||||||
@@ -109,7 +107,7 @@ function derivePublicFromPrivate (jwKey) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'RSASSA-PKCS1-v1_5',
|
name: 'RSASSA-PKCS1-v1_5',
|
||||||
hash: {name: 'SHA-256'}
|
hash: { name: 'SHA-256' }
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
['verify']
|
['verify']
|
||||||
|
@@ -3,11 +3,13 @@
|
|||||||
const multihashing = require('multihashing-async')
|
const multihashing = require('multihashing-async')
|
||||||
const protobuf = require('protons')
|
const protobuf = require('protons')
|
||||||
const bs58 = require('bs58')
|
const bs58 = require('bs58')
|
||||||
|
const nextTick = require('async/nextTick')
|
||||||
|
|
||||||
const crypto = require('./rsa')
|
const crypto = require('./rsa')
|
||||||
const pbm = protobuf(require('./keys.proto'))
|
const pbm = protobuf(require('./keys.proto'))
|
||||||
const forge = require('node-forge')
|
require('node-forge/lib/sha512')
|
||||||
const setImmediate = require('async/setImmediate')
|
require('node-forge/lib/pbe')
|
||||||
|
const forge = require('node-forge/lib/forge')
|
||||||
|
|
||||||
class RsaPublicKey {
|
class RsaPublicKey {
|
||||||
constructor (key) {
|
constructor (key) {
|
||||||
@@ -53,7 +55,7 @@ class RsaPrivateKey {
|
|||||||
}
|
}
|
||||||
|
|
||||||
genSecret () {
|
genSecret () {
|
||||||
return crypto.getRandomValues(new Uint8Array(16))
|
return crypto.getRandomValues(16)
|
||||||
}
|
}
|
||||||
|
|
||||||
sign (message, callback) {
|
sign (message, callback) {
|
||||||
@@ -129,14 +131,13 @@ class RsaPrivateKey {
|
|||||||
|
|
||||||
ensure(callback)
|
ensure(callback)
|
||||||
|
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
let err = null
|
let err = null
|
||||||
let pem = null
|
let pem = null
|
||||||
try {
|
try {
|
||||||
const buffer = new forge.util.ByteBuffer(this.marshal())
|
const buffer = new forge.util.ByteBuffer(this.marshal())
|
||||||
const asn1 = forge.asn1.fromDer(buffer)
|
const asn1 = forge.asn1.fromDer(buffer)
|
||||||
const privateKey = forge.pki.privateKeyFromAsn1(asn1)
|
const privateKey = forge.pki.privateKeyFromAsn1(asn1)
|
||||||
|
|
||||||
if (format === 'pkcs-8') {
|
if (format === 'pkcs-8') {
|
||||||
const options = {
|
const options = {
|
||||||
algorithm: 'aes256',
|
algorithm: 'aes256',
|
||||||
|
@@ -1,6 +1,9 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const crypto = require('crypto')
|
const crypto = require('crypto')
|
||||||
|
const randomBytes = require('../random-bytes')
|
||||||
|
const nextTick = require('async/nextTick')
|
||||||
|
|
||||||
let keypair
|
let keypair
|
||||||
try {
|
try {
|
||||||
if (process.env.LP2P_FORCE_CRYPTO_LIB === 'keypair') {
|
if (process.env.LP2P_FORCE_CRYPTO_LIB === 'keypair') {
|
||||||
@@ -8,7 +11,7 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ursa = require('ursa-optional') // throws if not compiled
|
const ursa = require('ursa-optional') // throws if not compiled
|
||||||
keypair = ({bits}) => {
|
keypair = ({ bits }) => {
|
||||||
const key = ursa.generatePrivateKey(bits)
|
const key = ursa.generatePrivateKey(bits)
|
||||||
return {
|
return {
|
||||||
private: key.toPrivatePem(),
|
private: key.toPrivatePem(),
|
||||||
@@ -22,14 +25,13 @@ try {
|
|||||||
|
|
||||||
keypair = require('keypair')
|
keypair = require('keypair')
|
||||||
}
|
}
|
||||||
const setImmediate = require('async/setImmediate')
|
|
||||||
const pemToJwk = require('pem-jwk').pem2jwk
|
const pemToJwk = require('pem-jwk').pem2jwk
|
||||||
const jwkToPem = require('pem-jwk').jwk2pem
|
const jwkToPem = require('pem-jwk').jwk2pem
|
||||||
|
|
||||||
exports.utils = require('./rsa-utils')
|
exports.utils = require('./rsa-utils')
|
||||||
|
|
||||||
exports.generateKey = function (bits, callback) {
|
exports.generateKey = function (bits, callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
let result
|
let result
|
||||||
try {
|
try {
|
||||||
const key = keypair({ bits: bits })
|
const key = keypair({ bits: bits })
|
||||||
@@ -47,7 +49,7 @@ exports.generateKey = function (bits, callback) {
|
|||||||
|
|
||||||
// Takes a jwk key
|
// Takes a jwk key
|
||||||
exports.unmarshalPrivateKey = function (key, callback) {
|
exports.unmarshalPrivateKey = function (key, callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return callback(new Error('Key is invalid'))
|
return callback(new Error('Key is invalid'))
|
||||||
}
|
}
|
||||||
@@ -62,12 +64,10 @@ exports.unmarshalPrivateKey = function (key, callback) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.getRandomValues = function (arr) {
|
exports.getRandomValues = randomBytes
|
||||||
return crypto.randomBytes(arr.length)
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.hashAndSign = function (key, msg, callback) {
|
exports.hashAndSign = function (key, msg, callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
let result
|
let result
|
||||||
try {
|
try {
|
||||||
const sign = crypto.createSign('RSA-SHA256')
|
const sign = crypto.createSign('RSA-SHA256')
|
||||||
@@ -83,7 +83,7 @@ exports.hashAndSign = function (key, msg, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
exports.hashAndVerify = function (key, sig, msg, callback) {
|
exports.hashAndVerify = function (key, sig, msg, callback) {
|
||||||
setImmediate(() => {
|
nextTick(() => {
|
||||||
let result
|
let result
|
||||||
try {
|
try {
|
||||||
const verify = crypto.createVerify('RSA-SHA256')
|
const verify = crypto.createVerify('RSA-SHA256')
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const forge = require('node-forge')
|
const forgePbkdf2 = require('node-forge/lib/pbkdf2')
|
||||||
|
const forgeUtil = require('node-forge/lib/util')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maps an IPFS hash name to its node-forge equivalent.
|
* Maps an IPFS hash name to its node-forge equivalent.
|
||||||
@@ -30,13 +31,13 @@ function pbkdf2 (password, salt, iterations, keySize, hash) {
|
|||||||
if (!hasher) {
|
if (!hasher) {
|
||||||
throw new Error(`Hash '${hash}' is unknown or not supported`)
|
throw new Error(`Hash '${hash}' is unknown or not supported`)
|
||||||
}
|
}
|
||||||
const dek = forge.pkcs5.pbkdf2(
|
const dek = forgePbkdf2(
|
||||||
password,
|
password,
|
||||||
salt,
|
salt,
|
||||||
iterations,
|
iterations,
|
||||||
keySize,
|
keySize,
|
||||||
hasher)
|
hasher)
|
||||||
return forge.util.encode64(dek)
|
return forgeUtil.encode64(dek)
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = pbkdf2
|
module.exports = pbkdf2
|
||||||
|
@@ -1,13 +1,9 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
const randomBytes = require('iso-random-stream/src/random')
|
||||||
|
|
||||||
const rsa = require('./keys/rsa')
|
module.exports = function (number) {
|
||||||
|
|
||||||
function randomBytes (number) {
|
|
||||||
if (!number || typeof number !== 'number') {
|
if (!number || typeof number !== 'number') {
|
||||||
throw new Error('first argument must be a Number bigger than 0')
|
throw new Error('first argument must be a Number bigger than 0')
|
||||||
}
|
}
|
||||||
|
return randomBytes(number)
|
||||||
return rsa.getRandomValues(new Uint8Array(number))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = randomBytes
|
|
||||||
|
@@ -6,7 +6,7 @@ const BN = require('asn1.js').bignum
|
|||||||
// Adapted from https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#appendix-C
|
// Adapted from https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#appendix-C
|
||||||
exports.toBase64 = function toBase64 (bn, len) {
|
exports.toBase64 = function toBase64 (bn, len) {
|
||||||
// if len is defined then the bytes are leading-0 padded to the length
|
// if len is defined then the bytes are leading-0 padded to the length
|
||||||
let s = bn.toArrayLike(Buffer, 'be', len).toString('base64')
|
const s = bn.toArrayLike(Buffer, 'be', len).toString('base64')
|
||||||
|
|
||||||
return s
|
return s
|
||||||
.replace(/(=*)$/, '') // Remove any trailing '='s
|
.replace(/(=*)$/, '') // Remove any trailing '='s
|
||||||
|
@@ -2,15 +2,4 @@
|
|||||||
|
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = self.crypto || self.msCrypto
|
||||||
// This is only a shim for interfaces, not for functionality
|
|
||||||
if (typeof self !== 'undefined') {
|
|
||||||
require('webcrypto-shim')(self)
|
|
||||||
|
|
||||||
if (self.crypto) {
|
|
||||||
return self.crypto
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error('Please use an environment with crypto support')
|
|
||||||
}
|
|
||||||
|
@@ -19,7 +19,7 @@ function doTests (fncName, fnc, num, skipBuffersAndStrings) {
|
|||||||
// skip this garbage because it's a buffer or a string and we were told do do that
|
// skip this garbage because it's a buffer or a string and we were told do do that
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let args = []
|
const args = []
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
args.push(garbage)
|
args.push(garbage)
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,7 @@ describe('Util', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('toBase64 zero padding', (done) => {
|
it('toBase64 zero padding', (done) => {
|
||||||
let bnpad = new BN('ff', 16)
|
const bnpad = new BN('ff', 16)
|
||||||
expect(util.toBase64(bnpad, 2)).to.eql('AP8')
|
expect(util.toBase64(bnpad, 2)).to.eql('AP8')
|
||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user