mirror of
https://github.com/fluencelabs/js-peer-id
synced 2025-07-04 23:11:50 +00:00
Compare commits
81 Commits
Author | SHA1 | Date | |
---|---|---|---|
3ef704ba32 | |||
1be7d888d6 | |||
0d3d9f835b | |||
c1ed9751e3 | |||
01957fa095 | |||
06f93cd961 | |||
1452f233c8 | |||
77900c7b45 | |||
564489b0ea | |||
65c2ac8dca | |||
31701e236d | |||
e08907ff94 | |||
f6a42fef76 | |||
ba8aa3ff34 | |||
ae81e95927 | |||
d24500a042 | |||
5fec44833e | |||
2432c56ad5 | |||
f0e380af58 | |||
24cd31b2d1 | |||
5f9136b3ca | |||
4fe3e12b3c | |||
49d454da7d | |||
7336b6ad80 | |||
461d2ea287 | |||
7c100f845a | |||
c3f50a2dfd | |||
907ed1571d | |||
2aad1dce7b | |||
58f1933980 | |||
ab5504686a | |||
4beb1f8888 | |||
7635cfcfda | |||
afbd96edda | |||
c1e18ee420 | |||
b358530dfb | |||
4afbedb525 | |||
e9b107fc55 | |||
855a97956d | |||
dee54d3dcc | |||
167b726dad | |||
3b9f8af2e7 | |||
771b994d7e | |||
524fc37877 | |||
3c55473a45 | |||
8771627ce4 | |||
bbf6bae073 | |||
e45a9f4083 | |||
13f98c8913 | |||
f374ab4411 | |||
2f4cdd3725 | |||
d2f90ff447 | |||
f2a75f1188 | |||
dab90bd3b6 | |||
e9fdc0a27e | |||
f0a17a9bd9 | |||
57ab8406c0 | |||
f16c08e7fd | |||
be5d4f9b41 | |||
35a3ccca3d | |||
989c3fb7a5 | |||
bbe67df1c8 | |||
8849d90d6a | |||
2552871bcc | |||
ab76788771 | |||
f62023f8a7 | |||
95367871ac | |||
352a6cfa17 | |||
727355c4f5 | |||
bd185f8081 | |||
d4c3de1ecb | |||
b692394116 | |||
a8e591525b | |||
6ad5d85f76 | |||
ca9cef6de7 | |||
f55eebcef7 | |||
6442bb4b59 | |||
33ff2aa608 | |||
bbeb6fc0f6 | |||
f518ced776 | |||
73b42ff2aa |
3
.gitignore
vendored
3
.gitignore
vendored
@ -25,3 +25,6 @@ build/Release
|
|||||||
# Dependency directory
|
# Dependency directory
|
||||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
||||||
node_modules
|
node_modules
|
||||||
|
|
||||||
|
dist
|
||||||
|
docs
|
28
.npmignore
Normal file
28
.npmignore
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
test
|
38
.travis.yml
38
.travis.yml
@ -1,21 +1,37 @@
|
|||||||
|
sudo: false
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
|
||||||
- "4.0"
|
|
||||||
|
|
||||||
branches:
|
matrix:
|
||||||
only:
|
include:
|
||||||
- master
|
- node_js: 4
|
||||||
|
env: CXX=g++-4.8
|
||||||
|
- node_js: 6
|
||||||
|
env:
|
||||||
|
- SAUCE=true
|
||||||
|
- CXX=g++-4.8
|
||||||
|
- node_js: stable
|
||||||
|
env: CXX=g++-4.8
|
||||||
|
|
||||||
|
# Make sure we have new NPM.
|
||||||
before_install:
|
before_install:
|
||||||
- npm i -g npm
|
- npm install -g npm
|
||||||
# Workaround for a permissions issue with Travis virtual machine images
|
|
||||||
|
|
||||||
addons:
|
script:
|
||||||
firefox: 'latest'
|
- npm run lint
|
||||||
|
- npm test
|
||||||
|
- npm run coverage
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- export DISPLAY=:99.0
|
- export DISPLAY=:99.0
|
||||||
- sh -e /etc/init.d/xvfb start
|
- sh -e /etc/init.d/xvfb start
|
||||||
|
|
||||||
script:
|
after_success:
|
||||||
- npm test
|
- npm run coverage-publish
|
||||||
|
|
||||||
|
addons:
|
||||||
|
firefox: latest
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- g++-4.8
|
||||||
|
131
README.md
131
README.md
@ -1,93 +1,98 @@
|
|||||||
peer-id JavaScript implementation
|
# peer-id
|
||||||
=================================
|
|
||||||
|
|
||||||
[](http://ipn.io)
|
[](http://ipn.io)
|
||||||
[](http://webchat.freenode.net/?channels=%23ipfs)
|
[](http://webchat.freenode.net/?channels=%23ipfs)
|
||||||
[](https://travis-ci.org/diasdavid/js-peer-id)
|
[](https://travis-ci.org/libp2p/js-peer-id)
|
||||||

|
[](https://coveralls.io/github/libp2p/js-peer-id?branch=master)
|
||||||
[](https://david-dm.org/diasdavid/js-peer-id)
|
[](https://david-dm.org/libp2p/js-peer-id)
|
||||||
[](https://github.com/feross/standard)
|
[](https://github.com/feross/standard)
|
||||||
> IPFS Peer Id implementation in JavaScript
|

|
||||||
|

|
||||||
|
|
||||||
|
[](https://saucelabs.com/u/ipfs-js-peer-id)
|
||||||
|
|
||||||
|
> [IPFS](https://github.com/ipfs/ipfs) Peer ID implementation in JavaScript.
|
||||||
|
|
||||||
|
- [Description](#description)
|
||||||
|
- [Example](#example)
|
||||||
|
- [Installation](#installation)
|
||||||
|
- [npm](#npm)
|
||||||
|
- [Setup](#setup)
|
||||||
|
- [Node.js](#nodejs)
|
||||||
|
- [Browser: Browserify, Webpack, other bundlers](#browser-browserify-webpack-other-bundlers)
|
||||||
|
- [Browser: `<script>` Tag](#browser-script-tag)
|
||||||
|
- [API](#api)
|
||||||
|
- [License](#license)
|
||||||
|
|
||||||
# Description
|
# Description
|
||||||
|
|
||||||
An IPFS Peer Id is based on a sha256 hash of the peer public key, using [multihash](https://github.com/jbenet/multihash)
|
Generate, import, and export PeerIDs, for use with [IPFS](https://github.com/ipfs/ipfs).
|
||||||
|
|
||||||
The public key is a base64 encoded string of a protobuf containing an RSA DER buffer. This uses a node buffer to pass the base64 encoded public key protobuf to the multihash for ID generation.
|
*A Peer ID is the SHA-256 [multihash](https://github.com/multiformats/multihash) of a
|
||||||
|
public key.*
|
||||||
|
|
||||||
|
*The public key is a base64 encoded string of a protobuf containing an RSA DER
|
||||||
|
buffer. This uses a node buffer to pass the base64 encoded public key protobuf
|
||||||
|
to the multihash for ID generation.*
|
||||||
|
|
||||||
# Usage
|
# Example
|
||||||
|
|
||||||
### In Node.js through npm
|
```js
|
||||||
|
var PeerId = require('peer-id')
|
||||||
|
|
||||||
```bash
|
PeerId.create({ bits: 1024 }, (err, id) => {
|
||||||
> npm install --save peer-id
|
console.log(JSON.stringify(id.toJSON(), null, 2)
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
```javascript
|
```
|
||||||
const PeerId = require('peer-id')
|
{
|
||||||
|
"id": "Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi",
|
||||||
|
"privKey": "CAAS4AQwggJcAgEAAoGBAMBgbIqyOL26oV3nGPBYrdpbv..",
|
||||||
|
"pubKey": "CAASogEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMBgbIqyOL26oV3nGPBYrdpbvzCY..."
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### In the Browser through browserify
|
# Installation
|
||||||
|
|
||||||
Same as in Node.js, you just have to [browserify](https://github.com/substack/node-browserify) the code before serving it. See the browserify repo for how to do that.
|
## npm
|
||||||
|
|
||||||
### In the Browser through `<script>` tag
|
```sh
|
||||||
|
> npm i peer-id
|
||||||
Make the [peer-id.min.js](/dist/peer-id.min.js) available through your server and load it using a normal `<script>` tag, this will export the `peerId` constructor on the `window` object, such that:
|
|
||||||
|
|
||||||
```JavaScript
|
|
||||||
const PeerId = window.PeerId
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Gotchas
|
# Setup
|
||||||
|
|
||||||
You will need to use Node.js `Buffer` API compatible, if you are running inside the browser, you can access it by `PeerId.Buffer` or you can install Feross's [Buffer](https://github.com/feross/buffer).
|
## Node.js
|
||||||
|
|
||||||
### Creating a new Id
|
```js
|
||||||
|
var PeerId = require('peer-id')
|
||||||
```
|
|
||||||
const PeerId = require('ipfs-peer')
|
|
||||||
|
|
||||||
// Create a new Id
|
|
||||||
const id = PeerId.create()
|
|
||||||
|
|
||||||
// Recreate an Id from Hex string
|
|
||||||
const id = PeerId.createFromHexString(str)
|
|
||||||
|
|
||||||
// Recreate an Id from a Buffer
|
|
||||||
const id = PeerId.createFromBytes(buf)
|
|
||||||
|
|
||||||
// Recreate an B58 String
|
|
||||||
const id = PeerId.createFromB58String(str)
|
|
||||||
|
|
||||||
// Recreate from a Public Key
|
|
||||||
const id = PeerId.createFromPubKey(pubKey)
|
|
||||||
|
|
||||||
// Recreate from a Private Key
|
|
||||||
const id = PeerId.createFromPrivKey(privKey)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Exporting an Id
|
## Browser: Browserify, Webpack, other bundlers
|
||||||
|
|
||||||
```
|
The code published to npm that gets loaded on require is in fact a ES5
|
||||||
// Print friendly format
|
transpiled version with the right shims added. This means that you can require
|
||||||
id.toPrint() // returns an object with id, privKey and pubKey in hex format
|
it and use with your favourite bundler without having to adjust asset management
|
||||||
|
process.
|
||||||
|
|
||||||
// Export to an hex string
|
```js
|
||||||
id.toHexString()
|
var PeerId = require('peer-id')
|
||||||
|
|
||||||
// Export to Buffer
|
|
||||||
id.toBytes() (same as id.id)
|
|
||||||
|
|
||||||
// Export to a B58 string
|
|
||||||
id.toB58String()
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Id format
|
## Browser: `<script>` Tag
|
||||||
|
|
||||||
|
Loading this module through a script tag will make the `PeerId` obj available in
|
||||||
|
the global namespace.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://unpkg.com/peer-id/dist/index.min.js"></script>
|
||||||
|
<!-- OR -->
|
||||||
|
<script src="https://unpkg.com/peer-id/dist/index.js"></script>
|
||||||
```
|
```
|
||||||
id.pubKey // Buffer containing the Public Key
|
|
||||||
id.privKey // Buffer containing the Private Key
|
# API
|
||||||
id.id // Buffer containing the multihash
|
|
||||||
```
|
# License
|
||||||
|
|
||||||
|
MIT
|
||||||
|
12
circle.yml
Normal file
12
circle.yml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
machine:
|
||||||
|
node:
|
||||||
|
version: stable
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
pre:
|
||||||
|
- google-chrome --version
|
||||||
|
- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
|
||||||
|
- sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
|
||||||
|
- sudo apt-get update
|
||||||
|
- sudo apt-get --only-upgrade install google-chrome-stable
|
||||||
|
- google-chrome --version
|
29552
deps/forge.bundle.js
vendored
29552
deps/forge.bundle.js
vendored
File diff suppressed because it is too large
Load Diff
5
documentation.yml
Normal file
5
documentation.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
toc:
|
||||||
|
- name: Introduction
|
||||||
|
file: intro.md
|
||||||
|
- PeerId
|
||||||
|
- PeerIdJson
|
61
intro.md
Normal file
61
intro.md
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
Generate, import, and export PeerIDs, for use with [IPFS](https://github.com/ipfs/ipfs).
|
||||||
|
|
||||||
|
> A Peer ID is the SHA-256 [multihash](https://github.com/multiformats/multihash) of a public key.
|
||||||
|
>
|
||||||
|
> The public key is a base64 encoded string of a protobuf containing an RSA DER buffer. This uses a node buffer to pass the base64 encoded public key protobuf to the multihash for ID generation.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```js
|
||||||
|
var PeerId = require('peer-id')
|
||||||
|
|
||||||
|
PeerId.create({ bits: 1024 }, (err, id) => {
|
||||||
|
console.log(JSON.stringify(id.toJSON(), null, 2)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": "Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi",
|
||||||
|
"privKey": "CAAS4AQwggJcAgEAAoGBAMBgbIqyOL26oV3nGPBYrdpbv..",
|
||||||
|
"pubKey": "CAASogEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMBgbIqyOL26oV3nGPBYrdpbvzCY..."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### npm
|
||||||
|
|
||||||
|
```sh
|
||||||
|
> npm i peer-id
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
### Node.js
|
||||||
|
|
||||||
|
```js
|
||||||
|
var PeerId = require('peer-id')
|
||||||
|
```
|
||||||
|
|
||||||
|
### Browser: Browserify, Webpack, other bundlers
|
||||||
|
|
||||||
|
The code published to npm that gets loaded on require is in fact a ES5
|
||||||
|
transpiled version with the right shims added. This means that you can require
|
||||||
|
it and use with your favourite bundler without having to adjust asset management
|
||||||
|
process.
|
||||||
|
|
||||||
|
```js
|
||||||
|
var PeerId = require('peer-id')
|
||||||
|
```
|
||||||
|
|
||||||
|
### Browser: `<script>` Tag
|
||||||
|
|
||||||
|
Loading this module through a script tag will make the `PeerId` obj available in
|
||||||
|
the global namespace.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://unpkg.com/peer-id/dist/index.min.js"></script>
|
||||||
|
<!-- OR -->
|
||||||
|
<script src="https://unpkg.com/peer-id/dist/index.js"></script>
|
||||||
|
```
|
@ -1,57 +0,0 @@
|
|||||||
module.exports = (config) => {
|
|
||||||
const path = require('path')
|
|
||||||
const node_modules_dir = path.join(__dirname, 'node_modules')
|
|
||||||
const deps = [
|
|
||||||
'deps/forge.bundle.js'
|
|
||||||
]
|
|
||||||
config.set({
|
|
||||||
basePath: '',
|
|
||||||
frameworks: ['mocha'],
|
|
||||||
|
|
||||||
files: [
|
|
||||||
'tests/test.js'
|
|
||||||
],
|
|
||||||
|
|
||||||
preprocessors: {
|
|
||||||
'tests/*': ['webpack']
|
|
||||||
},
|
|
||||||
|
|
||||||
webpack: {
|
|
||||||
resolve: {
|
|
||||||
extensions: ['', '.js', '.json'],
|
|
||||||
alias: { 'node-forge': path.resolve(__dirname, 'deps/forge.bundle.js') }
|
|
||||||
},
|
|
||||||
externals: {
|
|
||||||
fs: '{}'
|
|
||||||
},
|
|
||||||
node: {
|
|
||||||
Buffer: true
|
|
||||||
},
|
|
||||||
module: {
|
|
||||||
loaders: [
|
|
||||||
{ test: /\.json$/, loader: 'json' }
|
|
||||||
],
|
|
||||||
noParse: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
webpackMiddleware: {
|
|
||||||
noInfo: true,
|
|
||||||
stats: {
|
|
||||||
colors: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
reporters: ['spec'],
|
|
||||||
port: 9876,
|
|
||||||
colors: true,
|
|
||||||
logLevel: config.LOG_INFO,
|
|
||||||
autoWatch: false,
|
|
||||||
browsers: process.env.TRAVIS ? ['Firefox'] : ['Chrome'],
|
|
||||||
singleRun: true
|
|
||||||
})
|
|
||||||
|
|
||||||
deps.forEach((dep) => {
|
|
||||||
const depPath = path.resolve(node_modules_dir, dep)
|
|
||||||
config.webpack.module.noParse.push(depPath)
|
|
||||||
})
|
|
||||||
}
|
|
70
package.json
70
package.json
@ -1,14 +1,21 @@
|
|||||||
{
|
{
|
||||||
"name": "peer-id",
|
"name": "peer-id",
|
||||||
"version": "0.5.1",
|
"version": "0.8.0",
|
||||||
"description": "IPFS Peer Id implementation in Node.js",
|
"description": "IPFS Peer Id implementation in Node.js",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
|
"bin": "src/bin.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "standard",
|
"lint": "aegir-lint",
|
||||||
"test": "npm run test:node && npm run test:browser",
|
"build": "aegir-build",
|
||||||
"test:node": "mocha tests/test.js",
|
"test": "aegir-test",
|
||||||
"test:browser": "karma start karma.conf.js",
|
"test:node": "aegir-test node",
|
||||||
"coverage": "istanbul cover --print both -- _mocha tests/test.js"
|
"test:browser": "aegir-test browser",
|
||||||
|
"release": "aegir-release",
|
||||||
|
"release-minor": "aegir-release --type minor",
|
||||||
|
"release-major": "aegir-release --type major",
|
||||||
|
"coverage": "aegir-coverage",
|
||||||
|
"coverage-publish": "aegir-coverage publish",
|
||||||
|
"docs": "aegir-docs"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"IPFS"
|
"IPFS"
|
||||||
@ -19,40 +26,35 @@
|
|||||||
"lint",
|
"lint",
|
||||||
"test"
|
"test"
|
||||||
],
|
],
|
||||||
"standard": {
|
|
||||||
"ignore": [
|
|
||||||
"dist",
|
|
||||||
"deps"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^4.3.0"
|
"node": ">=4.0.0"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/diasdavid/js-peer-id/issues"
|
"url": "https://github.com/libp2p/js-peer-id/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/diasdavid/js-peer-id",
|
"homepage": "https://github.com/libp2p/js-peer-id",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"buffer-loader": "0.0.1",
|
"aegir": "^9.1.2",
|
||||||
"chai": "^3.5.0",
|
"chai": "^3.5.0",
|
||||||
"istanbul": "^0.4.2",
|
"pre-commit": "^1.1.3"
|
||||||
"json-loader": "^0.5.4",
|
|
||||||
"karma": "^0.13.19",
|
|
||||||
"karma-chrome-launcher": "^0.2.2",
|
|
||||||
"karma-cli": "^0.1.2",
|
|
||||||
"karma-firefox-launcher": "^0.1.7",
|
|
||||||
"karma-mocha": "^0.2.1",
|
|
||||||
"karma-spec-reporter": "0.0.24",
|
|
||||||
"karma-webpack": "^1.7.0",
|
|
||||||
"mocha": "^2.4.5",
|
|
||||||
"pre-commit": "^1.1.1",
|
|
||||||
"standard": "^6.0.7",
|
|
||||||
"webpack": "^1.12.13"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bs58": "^3.0.0",
|
"async": "^2.0.1",
|
||||||
"multihashing": "^0.2.0",
|
"libp2p-crypto": "^0.7.0",
|
||||||
"node-forge": "^0.6.38",
|
"multihashes": "^0.3.0"
|
||||||
"protocol-buffers": "^3.1.4"
|
},
|
||||||
}
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/libp2p/js-peer-id.git"
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
"David Dias <daviddias.p@gmail.com>",
|
||||||
|
"David Dias <mail@daviddias.me>",
|
||||||
|
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
||||||
|
"Richard Littauer <richard.littauer@gmail.com>",
|
||||||
|
"Stephen Whitmore <stephen.whitmore@gmail.com>",
|
||||||
|
"greenkeeperio-bot <support@greenkeeper.io>",
|
||||||
|
"nginnever <ginneversource@gmail.com>",
|
||||||
|
"npmcdn-to-unpkg-bot <npmcdn-to-unpkg-bot@users.noreply.github.com>"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
13
src/bin.js
Executable file
13
src/bin.js
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/local/bin/node
|
||||||
|
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const PeerId = require('./index.js')
|
||||||
|
|
||||||
|
PeerId.create((err, id) => {
|
||||||
|
if (err) {
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(JSON.stringify(id.toJSON(), null, 2))
|
||||||
|
})
|
447
src/index.js
447
src/index.js
@ -1,164 +1,339 @@
|
|||||||
/*
|
'use strict'
|
||||||
* Id is an object representation of a peer Id. a peer Id is a multihash
|
|
||||||
|
const mh = require('multihashes')
|
||||||
|
const crypto = require('libp2p-crypto')
|
||||||
|
const assert = require('assert')
|
||||||
|
const waterfall = require('async/waterfall')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name PeerIdJson
|
||||||
|
* @type {Object}
|
||||||
|
* @typedef {Object} PeerIdJson
|
||||||
|
* @param {string} id - `Base58` encoded peer id
|
||||||
|
* @param {string=} privKey - The RSA private key in protobuf format, encoded in `base64`.
|
||||||
|
* @param {string=} pubKey - The RSA public key in protobuf format, encoded in `base64`.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs')
|
/**
|
||||||
const multihashing = require('multihashing')
|
* A Peer ID is the SHA-256
|
||||||
const base58 = require('bs58')
|
* [multihash](https://github.com/multiformats/multihash) of a
|
||||||
const forge = require('node-forge')
|
* public key.
|
||||||
const protobuf = require('protocol-buffers')
|
* @class PeerId
|
||||||
const path = require('path')
|
* @see [libp2p-crypto](htttps://github.com/libp2p/js-libp2p-crypto)
|
||||||
|
*/
|
||||||
|
class PeerId {
|
||||||
|
/**
|
||||||
|
* @param {Buffer} id
|
||||||
|
* @param {RSAPrivateKey=} privKey
|
||||||
|
* @param {RSAPublickKey=} pubKey
|
||||||
|
*/
|
||||||
|
constructor (id, privKey, pubKey) {
|
||||||
|
assert(Buffer.isBuffer(id), 'invalid id provided')
|
||||||
|
|
||||||
const isNode = !global.window
|
if (privKey && pubKey) {
|
||||||
|
assert(privKey.public.bytes.equals(pubKey.bytes), 'inconsistent arguments')
|
||||||
|
}
|
||||||
|
|
||||||
// protobuf read from file
|
/**
|
||||||
const messages = isNode ? protobuf(fs.readFileSync(path.resolve(__dirname, 'pb/crypto.proto')))
|
* @type {Buffer}
|
||||||
: protobuf(require('buffer!./pb/crypto.proto'))
|
*/
|
||||||
|
this.id = id
|
||||||
exports = module.exports = Id
|
this._privKey = privKey
|
||||||
|
this._pubKey = pubKey
|
||||||
exports.Buffer = Buffer
|
|
||||||
|
|
||||||
function Id (id, privKey, pubKey) {
|
|
||||||
const self = this
|
|
||||||
|
|
||||||
if (!(self instanceof Id)) {
|
|
||||||
throw new Error('Id must be called with new')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.privKey = privKey
|
/**
|
||||||
self.pubKey = pubKey
|
* The private key of this id, if it exists.
|
||||||
self.id = id // multihash - sha256 - buffer
|
*
|
||||||
|
* @type {RSAPrivateKey|undefined}
|
||||||
|
*/
|
||||||
|
get privKey () {
|
||||||
|
return this._privKey
|
||||||
|
}
|
||||||
|
|
||||||
// pretty print
|
/**
|
||||||
|
* The public key of this id, if it exists.
|
||||||
|
*
|
||||||
|
* @type {(RSAPublicKey|undefined)}
|
||||||
|
*/
|
||||||
|
get pubKey () {
|
||||||
|
if (this._pubKey) {
|
||||||
|
return this._pubKey
|
||||||
|
}
|
||||||
|
|
||||||
self.toPrint = function () {
|
if (this.privKey) {
|
||||||
return {
|
return this.privKey.public
|
||||||
id: self.toB58String(),
|
|
||||||
privKey: privKey.toString('hex'),
|
|
||||||
pubKey: pubKey.toString('hex')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode/decode functions
|
/** Create the protobuf version of the public key,
|
||||||
|
* matching go-ipfs formatting.
|
||||||
self.toHexString = function () {
|
*
|
||||||
return self.id.toString('hex')
|
* @returns {Buffer} - The marshalled public key
|
||||||
|
*/
|
||||||
|
marshalPubKey () {
|
||||||
|
if (this.pubKey) {
|
||||||
|
return crypto.marshalPublicKey(this.pubKey)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.toBytes = function () {
|
/** Create the protobuf version of the private key,
|
||||||
return self.id
|
* matching go-ipfs formatting.
|
||||||
|
*
|
||||||
|
* @returns {Buffer}
|
||||||
|
*/
|
||||||
|
marshalPrivKey () {
|
||||||
|
if (this.privKey) {
|
||||||
|
return crypto.marshalPrivateKey(this.privKey)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.toB58String = function () {
|
/**
|
||||||
return base58.encode(self.id)
|
* Alias for `toJSON`.
|
||||||
|
*
|
||||||
|
* @returns {PeerIdJson}
|
||||||
|
*/
|
||||||
|
toPrint () {
|
||||||
|
return this.toJSON()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// unwrap the private key protobuf
|
/**
|
||||||
function unmarshal (key) {
|
* Return the jsonified version of the key, matching the formatting
|
||||||
return messages.PrivateKey.decode(key)
|
* of go-ipfs for its config file.
|
||||||
}
|
*
|
||||||
|
* @returns {PeerIdJson}
|
||||||
|
*/
|
||||||
|
toJSON () {
|
||||||
|
return {
|
||||||
|
id: mh.toB58String(this.id),
|
||||||
|
privKey: toB64Opt(this.marshalPrivKey()),
|
||||||
|
pubKey: toB64Opt(this.marshalPubKey())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// create a public key protobuf to be base64 string stored in config
|
/**
|
||||||
function marshal (data, type) {
|
* Returns the Peer ID's `id` as a hex string.
|
||||||
var epb
|
*
|
||||||
if (type === 'Public') {
|
* @returns {String}
|
||||||
epb = messages.PublicKey.encode({
|
*/
|
||||||
Type: 0,
|
toHexString () {
|
||||||
Data: data
|
return mh.toHexString(this.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Peer ID's `id` as a buffer.
|
||||||
|
*
|
||||||
|
* @returns {Buffer}
|
||||||
|
*/
|
||||||
|
toBytes () {
|
||||||
|
return this.id
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Peer ID's `id` as a base58 string.
|
||||||
|
*
|
||||||
|
* @returns {String}
|
||||||
|
*/
|
||||||
|
toB58String () {
|
||||||
|
return mh.toB58String(this.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new `PeerId` by generating a new public/private keypair.
|
||||||
|
*
|
||||||
|
* @param {Object=} opts - Configuration object.
|
||||||
|
* @param {number} [opts.bits=2048] - How many bits to use for the RSA key generation.
|
||||||
|
* @param {function(Error, PeerId)} callback - Node.js style callback.
|
||||||
|
* @returns {undefined}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* const PeerId = require('peer-id')
|
||||||
|
*
|
||||||
|
* PeerId.create((err, id) => {
|
||||||
|
* if (err) {
|
||||||
|
* throw err
|
||||||
|
* }
|
||||||
|
* console.log('id', JSON.stringify(id))
|
||||||
|
* })
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static create (opts, callback) {
|
||||||
|
if (typeof opts === 'function') {
|
||||||
|
callback = opts
|
||||||
|
opts = {}
|
||||||
|
}
|
||||||
|
opts = opts || {}
|
||||||
|
opts.bits = opts.bits || 2048
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => crypto.generateKeyPair('RSA', opts.bits, cb),
|
||||||
|
(privKey, cb) => privKey.public.hash((err, digest) => {
|
||||||
|
cb(err, digest, privKey)
|
||||||
|
})
|
||||||
|
], (err, digest, privKey) => {
|
||||||
|
if (err) {
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, new PeerId(digest, privKey))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'Private') {
|
/**
|
||||||
epb = messages.PrivateKey.encode({
|
* Creates a Peer ID from hex string representing the key's multihash.
|
||||||
Type: 0,
|
*
|
||||||
Data: data
|
* @param {string} str - Hex encoded id
|
||||||
|
* @returns {PeerId}
|
||||||
|
*/
|
||||||
|
static createFromHexString (str) {
|
||||||
|
return new PeerId(mh.fromHexString(str))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Peer ID from a buffer representing the key's multihash.
|
||||||
|
*
|
||||||
|
* @param {Buffer} buf
|
||||||
|
* @returns {PeerId}
|
||||||
|
*/
|
||||||
|
static createFromBytes (buf) {
|
||||||
|
return new PeerId(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Peer ID from a `base58` string representing the
|
||||||
|
* key's multihash.
|
||||||
|
*
|
||||||
|
* @param {string} str - `base58` encoded id
|
||||||
|
* @returns {PeerId}
|
||||||
|
*/
|
||||||
|
static createFromB58String (str) {
|
||||||
|
return new PeerId(mh.fromB58String(str))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a Peer ID from a buffer containing a public key.
|
||||||
|
*
|
||||||
|
* @param {string|Buffer} key
|
||||||
|
* @param {function(Error, PeerId)} callback
|
||||||
|
* @returns {undefined}
|
||||||
|
*/
|
||||||
|
static createFromPubKey (key, callback) {
|
||||||
|
let buf = key
|
||||||
|
if (typeof buf === 'string') {
|
||||||
|
buf = new Buffer(key, 'base64')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof callback !== 'function') {
|
||||||
|
throw new Error('callback is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
const pubKey = crypto.unmarshalPublicKey(buf)
|
||||||
|
pubKey.hash((err, digest) => {
|
||||||
|
if (err) {
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, new PeerId(digest, null, pubKey))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return epb
|
/**
|
||||||
|
* Creates a Peer ID from a buffer containing a private key.
|
||||||
|
*
|
||||||
|
* @param {string|Buffer} key - The private key, if passed as
|
||||||
|
* string `base64` encoding is assumed.
|
||||||
|
* @param {function(Error, PeerId)} callback
|
||||||
|
* @returns {undefined}
|
||||||
|
*/
|
||||||
|
static createFromPrivKey (key, callback) {
|
||||||
|
let buf = key
|
||||||
|
if (typeof buf === 'string') {
|
||||||
|
buf = new Buffer(key, 'base64')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof callback !== 'function') {
|
||||||
|
throw new Error('callback is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
waterfall([
|
||||||
|
(cb) => crypto.unmarshalPrivateKey(buf, cb),
|
||||||
|
(privKey, cb) => privKey.public.hash((err, digest) => {
|
||||||
|
cb(err, digest, privKey)
|
||||||
|
})
|
||||||
|
], (err, digest, privKey) => {
|
||||||
|
if (err) {
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, new PeerId(digest, privKey))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Import a `PeerId` from a serialized JSON object.
|
||||||
|
*
|
||||||
|
* @param {PeerIdJson} obj
|
||||||
|
* @param {function(Error, PeerId)} callback
|
||||||
|
* @returns {undefined}
|
||||||
|
*/
|
||||||
|
static createFromJSON (obj, callback) {
|
||||||
|
if (typeof callback !== 'function') {
|
||||||
|
throw new Error('callback is required')
|
||||||
|
}
|
||||||
|
|
||||||
|
const id = mh.fromB58String(obj.id)
|
||||||
|
const rawPrivKey = obj.privKey && new Buffer(obj.privKey, 'base64')
|
||||||
|
const rawPubKey = obj.pubKey && new Buffer(obj.pubKey, 'base64')
|
||||||
|
const pub = rawPubKey && crypto.unmarshalPublicKey(rawPubKey)
|
||||||
|
|
||||||
|
if (rawPrivKey) {
|
||||||
|
waterfall([
|
||||||
|
(cb) => crypto.unmarshalPrivateKey(rawPrivKey, cb),
|
||||||
|
(priv, cb) => priv.public.hash((err, digest) => {
|
||||||
|
cb(err, digest, priv)
|
||||||
|
}),
|
||||||
|
(privDigest, priv, cb) => {
|
||||||
|
if (pub) {
|
||||||
|
pub.hash((err, pubDigest) => {
|
||||||
|
cb(err, privDigest, priv, pubDigest)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
cb(null, privDigest, priv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
], (err, privDigest, priv, pubDigest) => {
|
||||||
|
if (err) {
|
||||||
|
return callback(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pub && !privDigest.equals(pubDigest)) {
|
||||||
|
return callback(new Error('Public and private key do not match'))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id && !privDigest.equals(id)) {
|
||||||
|
return callback(new Error('Id and private key do not match'))
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, new PeerId(id, priv, pub))
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
callback(null, new PeerId(id, null, pub))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// this returns a base64 encoded protobuf of the public key
|
/**
|
||||||
function formatKey (key, type) {
|
* Convert a given `Buffer` to a `base64` encoded string.
|
||||||
// create der buffer of public key asn.1 object
|
* If no `val` is given it just returns `undefined`.
|
||||||
const der = forge.asn1.toDer(key)
|
*
|
||||||
|
* @private
|
||||||
// create forge buffer of der public key buffer
|
* @param {Buffer=} val
|
||||||
const fDerBuf = forge.util.createBuffer(der.data, 'binary')
|
* @returns {string|undefined}
|
||||||
|
*/
|
||||||
// convert forge buffer to node buffer public key
|
function toB64Opt (val) {
|
||||||
const nDerBuf = new Buffer(fDerBuf.getBytes(), 'binary')
|
if (val) {
|
||||||
|
return val.toString('base64')
|
||||||
// protobuf the new DER bytes to the PublicKey Data: field
|
}
|
||||||
const marshalKey = marshal(nDerBuf, type)
|
|
||||||
|
|
||||||
// encode the protobuf public key to base64 string
|
|
||||||
const b64 = marshalKey.toString('base64')
|
|
||||||
return b64
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// generation
|
exports = module.exports = PeerId
|
||||||
exports.create = function () {
|
|
||||||
// generate keys
|
|
||||||
const pair = forge.rsa.generateKeyPair({ bits: 2048, e: 0x10001 })
|
|
||||||
|
|
||||||
// return the RSA public/private key to asn1 object
|
|
||||||
const asnPub = forge.pki.publicKeyToAsn1(pair.publicKey)
|
|
||||||
const asnPriv = forge.pki.privateKeyToAsn1(pair.privateKey)
|
|
||||||
|
|
||||||
// format the keys to protobuf base64 encoded string
|
|
||||||
const protoPublic64 = formatKey(asnPub, 'Public')
|
|
||||||
const protoPrivate64 = formatKey(asnPriv, 'Private')
|
|
||||||
|
|
||||||
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
|
|
||||||
|
|
||||||
return new Id(mhId, protoPrivate64, protoPublic64)
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.createFromHexString = function (str) {
|
|
||||||
return new Id(new Buffer(str, 'hex'))
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.createFromBytes = function (buf) {
|
|
||||||
return new Id(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.createFromB58String = function (str) {
|
|
||||||
return new Id(new Buffer(base58.decode(str)))
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.createFromPubKey = function (pubKey) {
|
|
||||||
const buf = new Buffer(pubKey, 'base64')
|
|
||||||
const mhId = multihashing(buf, 'sha2-256')
|
|
||||||
return new Id(mhId, null, pubKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.createFromPrivKey = function (privKey) {
|
|
||||||
// create a buffer from the base64 encoded string
|
|
||||||
const buf = new Buffer(privKey, 'base64')
|
|
||||||
|
|
||||||
// get the private key data from the protobuf
|
|
||||||
const mpk = unmarshal(buf)
|
|
||||||
|
|
||||||
// create a forge buffer
|
|
||||||
const fbuf = forge.util.createBuffer(mpk.Data.toString('binary'))
|
|
||||||
|
|
||||||
// create an asn1 object from the private key bytes saved in the protobuf Data: field
|
|
||||||
const asnPriv = forge.asn1.fromDer(fbuf)
|
|
||||||
|
|
||||||
// get the RSA privatekey data from the asn1 object
|
|
||||||
const privateKey = forge.pki.privateKeyFromAsn1(asnPriv)
|
|
||||||
|
|
||||||
// set the RSA public key to the modulus and exponent of the private key
|
|
||||||
const publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e)
|
|
||||||
|
|
||||||
// return the RSA public key to asn1 object
|
|
||||||
const asnPub = forge.pki.publicKeyToAsn1(publicKey)
|
|
||||||
|
|
||||||
// format the public key
|
|
||||||
const protoPublic64 = formatKey(asnPub, 'Public')
|
|
||||||
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
|
|
||||||
return new Id(mhId, privKey, protoPublic64)
|
|
||||||
}
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
enum KeyType {
|
|
||||||
RSA = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PublicKey {
|
|
||||||
required KeyType Type = 1;
|
|
||||||
required bytes Data = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PrivateKey {
|
|
||||||
required KeyType Type = 1;
|
|
||||||
required bytes Data = 2;
|
|
||||||
}
|
|
6
test/fixtures/go-private-key.js
vendored
Normal file
6
test/fixtures/go-private-key.js
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
id: 'QmRLoXS3E73psYaUsma1VSbboTa2J8Z9kso1tpiGLk9WQ4',
|
||||||
|
privKey: 'CAASpwkwggSjAgEAAoIBAQDWBEbO8kc6a5kEks09CKPQargY3p0DCmCczoCT52/RYFqxvH9dI+s+u4ZAvF9aLWOBvFomL7jHZODPxKDrbiNCmyEbViNgZYK+PNbwh0V3ZGbB27X3q8yZtLvYA8dhcNkz/2SHBarSoC4QLA5MXUuSWtVaYMY3MzMnzBF57Jc9Ase7NvHOIUI90M7aN5izP7hxPXpZ+shiN+TyjM8mFxYONG7ZSsY3IxUhtrU5MRzFX+tp1o/gb/aa51mHf7AL3N02j5ABiYbCK97Rbwr03hsBcwgMxoDPJmP3WZ+D5yyPcOIIF1Vd7+4/f7FQJnIw3xr9/jvaFbPyDCVbBOhr9oyxAgMBAAECggEALlrgx2Q8v0+c5hux7p1XdgYXd/OHyKfPw0cLHH4NfylCm6q7X34vLvhJHO5wLMUV/3y/ffPqLu4Pr5DkVfoWExAsvJIMuY1jIzdkStbR2glaJHUlVc7VUxmNcj1nSxi5QwT3TjORC2v8bi5Mroeqnbmk6p15cW1akC0oP+NZ4rG48+WFHRqsBaBusdSOVfA+IiZUqSd1ILysJ1w7aVN3EC7jLjDG43i+P/2BcEHy8TVClGOknJL341bHe3UPdEpmeu6k6aHGlDI4blUMXahCIUh0IdZuj+Vi/TxQME9+3bKIOjQb8RCNm3U3j/uz5gs9SyTjBuYIib9Scj/jDbLh0QKBgQDfLr3go3Q/AR0jb12QjGALJz1lc9ZRX2RQJkqqmYkZwOlHHyl+YJgqOZiO80fUkN0sJ29CmKecXU4gXuHir913Fdceei1ScBSsvZpWtBLhEZXKrRJYq8U0atKUFQADDMGutyB/uGCNeNwR6VcJezHPICvHxQfmWlWHA5VIOEtRPQKBgQD1fID76SkIpF/EaJMnN2alXWWnzKhUBUPGpQtbpwgSfaCBiZ4vr3NQwKBntOOB5QwHmifNZMoqaFQLzC4B/uyTNUcQMQQ6arYav7WQXqXTmW6poTsjUSuSOPx1swsHlYX09SmUwWDfd94XF9UOU0KUfA2/c85ixzNlV5ejkFA4hQKBgEvP3uQN4hD82d8Nl2TgqkdfnvV1cdnWY4buWvK0kOPUqelk5n1tZoMBaZc1gLLuOpMjGiIvJNByyXUpheWxA7POEXLi4b5dIEjFZ0YIiVk21gEw5UiFoMl7d+ihcY2Xqbslrb507SdhZLAY6V3pITRQo06K2XIgQWlJiE4uATepAoGBALZ2vEiBnYZW5vfN4tKbUyhGq3B1pggNgbr8odyV4mIcDlk6OOGov0WeZ5ut0AyUesSLyFnaOIoc0ZuTP/8rxBwG1bMrO8FP39sx83pDX25P9PkQZixyALjGsp+pXOFeOhtAvo9azO5M4j638Bydtjc3neBX62dwOLtyx7tDYN0hAoGAVLmr3w7XMVHTfEuCSzKHyRrOaN2PAuSX31QAji1PwlwVKMylVrb8rRvBOpTicA/wXPX9Q5O/yjegqhqLT/LXAm9ziFzy5b9/9SzXPukKebXXbvc0FOmcsrcxtijlPyUzf9fKM1ShiwqqsgM9eNyZ9GWUJw2GFATCWW7pl7rtnWk='
|
||||||
|
}
|
56
tests/test.js → test/fixtures/sample-id.js
vendored
56
tests/test.js → test/fixtures/sample-id.js
vendored
@ -1,59 +1,7 @@
|
|||||||
/* globals describe, it */
|
|
||||||
|
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const expect = require('chai').expect
|
module.exports = {
|
||||||
const PeerId = require('../src')
|
id: '122019318b6e5e0cf93a2314bf01269a2cc23cd3dcd452d742cdb9379d8646f6e4a9',
|
||||||
|
|
||||||
const testId = {
|
|
||||||
id: '1220151ab1658d8294ab34b71d5582cfe20d06414212f440a69366f1bc31deb5c72d',
|
|
||||||
privKey: 'CAASpgkwggSiAgEAAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAECggEAZtju/bcKvKFPz0mkHiaJcpycy9STKphorpCT83srBVQi59CdFU6Mj+aL/xt0kCPMVigJw8P3/YCEJ9J+rS8BsoWE+xWUEsJvtXoT7vzPHaAtM3ci1HZd302Mz1+GgS8Epdx+7F5p80XAFLDUnELzOzKftvWGZmWfSeDnslwVONkL/1VAzwKy7Ce6hk4SxRE7l2NE2OklSHOzCGU1f78ZzVYKSnS5Ag9YrGjOAmTOXDbKNKN/qIorAQ1bovzGoCwx3iGIatQKFOxyVCyO1PsJYT7JO+kZbhBWRRE+L7l+ppPER9bdLFxs1t5CrKc078h+wuUr05S1P1JjXk68pk3+kQKBgQDeK8AR11373Mzib6uzpjGzgNRMzdYNuExWjxyxAzz53NAR7zrPHvXvfIqjDScLJ4NcRO2TddhXAfZoOPVH5k4PJHKLBPKuXZpWlookCAyENY7+Pd55S8r+a+MusrMagYNljb5WbVTgN8cgdpim9lbbIFlpN6SZaVjLQL3J8TWH6wKBgQDSChzItkqWX11CNstJ9zJyUE20I7LrpyBJNgG1gtvz3ZMUQCn3PxxHtQzN9n1P0mSSYs+jBKPuoSyYLt1wwe10/lpgL4rkKWU3/m1Myt0tveJ9WcqHh6tzcAbb/fXpUFT/o4SWDimWkPkuCb+8j//2yiXk0a/T2f36zKMuZvujqQKBgC6B7BAQDG2H2B/ijofp12ejJU36nL98gAZyqOfpLJ+FeMz4TlBDQ+phIMhnHXA5UkdDapQ+zA3SrFk+6yGk9Vw4Hf46B+82SvOrSbmnMa+PYqKYIvUzR4gg34rL/7AhwnbEyD5hXq4dHwMNsIDq+l2elPjwm/U9V0gdAl2+r50HAoGALtsKqMvhv8HucAMBPrLikhXP/8um8mMKFMrzfqZ+otxfHzlhI0L08Bo3jQrb0Z7ByNY6M8epOmbCKADsbWcVre/AAY0ZkuSZK/CaOXNX/AhMKmKJh8qAOPRY02LIJRBCpfS4czEdnfUhYV/TYiFNnKRj57PPYZdTzUsxa/yVTmECgYBr7slQEjb5Onn5mZnGDh+72BxLNdgwBkhO0OCdpdISqk0F0Pxby22DFOKXZEpiyI9XYP1C8wPiJsShGm2yEwBPWXnrrZNWczaVuCbXHrZkWQogBDG3HGXNdU4MAWCyiYlyinIBpPpoAJZSzpGLmWbMWh28+RJS6AQX6KHrK1o2uw==',
|
privKey: 'CAASpgkwggSiAgEAAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAECggEAZtju/bcKvKFPz0mkHiaJcpycy9STKphorpCT83srBVQi59CdFU6Mj+aL/xt0kCPMVigJw8P3/YCEJ9J+rS8BsoWE+xWUEsJvtXoT7vzPHaAtM3ci1HZd302Mz1+GgS8Epdx+7F5p80XAFLDUnELzOzKftvWGZmWfSeDnslwVONkL/1VAzwKy7Ce6hk4SxRE7l2NE2OklSHOzCGU1f78ZzVYKSnS5Ag9YrGjOAmTOXDbKNKN/qIorAQ1bovzGoCwx3iGIatQKFOxyVCyO1PsJYT7JO+kZbhBWRRE+L7l+ppPER9bdLFxs1t5CrKc078h+wuUr05S1P1JjXk68pk3+kQKBgQDeK8AR11373Mzib6uzpjGzgNRMzdYNuExWjxyxAzz53NAR7zrPHvXvfIqjDScLJ4NcRO2TddhXAfZoOPVH5k4PJHKLBPKuXZpWlookCAyENY7+Pd55S8r+a+MusrMagYNljb5WbVTgN8cgdpim9lbbIFlpN6SZaVjLQL3J8TWH6wKBgQDSChzItkqWX11CNstJ9zJyUE20I7LrpyBJNgG1gtvz3ZMUQCn3PxxHtQzN9n1P0mSSYs+jBKPuoSyYLt1wwe10/lpgL4rkKWU3/m1Myt0tveJ9WcqHh6tzcAbb/fXpUFT/o4SWDimWkPkuCb+8j//2yiXk0a/T2f36zKMuZvujqQKBgC6B7BAQDG2H2B/ijofp12ejJU36nL98gAZyqOfpLJ+FeMz4TlBDQ+phIMhnHXA5UkdDapQ+zA3SrFk+6yGk9Vw4Hf46B+82SvOrSbmnMa+PYqKYIvUzR4gg34rL/7AhwnbEyD5hXq4dHwMNsIDq+l2elPjwm/U9V0gdAl2+r50HAoGALtsKqMvhv8HucAMBPrLikhXP/8um8mMKFMrzfqZ+otxfHzlhI0L08Bo3jQrb0Z7ByNY6M8epOmbCKADsbWcVre/AAY0ZkuSZK/CaOXNX/AhMKmKJh8qAOPRY02LIJRBCpfS4czEdnfUhYV/TYiFNnKRj57PPYZdTzUsxa/yVTmECgYBr7slQEjb5Onn5mZnGDh+72BxLNdgwBkhO0OCdpdISqk0F0Pxby22DFOKXZEpiyI9XYP1C8wPiJsShGm2yEwBPWXnrrZNWczaVuCbXHrZkWQogBDG3HGXNdU4MAWCyiYlyinIBpPpoAJZSzpGLmWbMWh28+RJS6AQX6KHrK1o2uw==',
|
||||||
pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAE='
|
pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAE='
|
||||||
}
|
}
|
||||||
|
|
||||||
const testIdHex = '1220151ab1658d8294ab34b71d5582cfe20d06414212f440a69366f1bc31deb5c72d'
|
|
||||||
|
|
||||||
const testIdBytes = new Buffer('1220151ab1658d8294ab34b71d5582cfe20d06414212f440a69366f1bc31deb5c72d', 'hex')
|
|
||||||
|
|
||||||
const testIdB58String = 'QmQ2zigjQikYnyYUSXZydNXrDRhBut2mubwJBaLXobMt3A'
|
|
||||||
|
|
||||||
describe('id', function (done) {
|
|
||||||
this.timeout(30000)
|
|
||||||
|
|
||||||
it('create a new id', (done) => {
|
|
||||||
const id = PeerId.create()
|
|
||||||
expect(id.toB58String().length).to.equal(46)
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('recreate an Id from Hex string', (done) => {
|
|
||||||
const id = PeerId.createFromHexString(testIdHex)
|
|
||||||
expect(testIdBytes).to.deep.equal(id.id)
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Recreate an Id from a Buffer', (done) => {
|
|
||||||
const id = PeerId.createFromBytes(testIdBytes)
|
|
||||||
expect(testId.id).to.equal(id.toHexString())
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Recreate a B58 String', (done) => {
|
|
||||||
const id = PeerId.createFromB58String(testIdB58String)
|
|
||||||
expect(testIdB58String).to.equal(id.toB58String())
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Recreate from a Public Key', (done) => {
|
|
||||||
const id = PeerId.createFromPubKey(testId.pubKey)
|
|
||||||
expect(testIdB58String).to.equal(id.toB58String())
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Recreate from a Private Key', (done) => {
|
|
||||||
const id = PeerId.createFromPrivKey(testId.privKey)
|
|
||||||
expect(testIdB58String).to.equal(id.toB58String())
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
225
test/index.spec.js
Normal file
225
test/index.spec.js
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
/* eslint max-nested-callbacks: ["error", 8] */
|
||||||
|
/* eslint-env mocha */
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const expect = require('chai').expect
|
||||||
|
const crypto = require('libp2p-crypto')
|
||||||
|
const mh = require('multihashes')
|
||||||
|
const parallel = require('async/parallel')
|
||||||
|
|
||||||
|
const PeerId = require('../src')
|
||||||
|
|
||||||
|
const testId = require('./fixtures/sample-id')
|
||||||
|
const testIdHex = testId.id
|
||||||
|
const testIdBytes = mh.fromHexString(testId.id)
|
||||||
|
const testIdB58String = mh.toB58String(testIdBytes)
|
||||||
|
|
||||||
|
const goId = require('./fixtures/go-private-key')
|
||||||
|
|
||||||
|
describe('PeerId', () => {
|
||||||
|
it('create an id without \'new\'', () => {
|
||||||
|
expect(PeerId).to.throw(Error)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('create a new id', (done) => {
|
||||||
|
PeerId.create((err, id) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(id.toB58String().length).to.equal(46)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('recreate an Id from Hex string', () => {
|
||||||
|
const id = PeerId.createFromHexString(testIdHex)
|
||||||
|
expect(testIdBytes).to.deep.equal(id.id)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Recreate an Id from a Buffer', () => {
|
||||||
|
const id = PeerId.createFromBytes(testIdBytes)
|
||||||
|
expect(testId.id).to.equal(id.toHexString())
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Recreate a B58 String', () => {
|
||||||
|
const id = PeerId.createFromB58String(testIdB58String)
|
||||||
|
expect(testIdB58String).to.equal(id.toB58String())
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Recreate from a Public Key', (done) => {
|
||||||
|
PeerId.createFromPubKey(testId.pubKey, (err, id) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(testIdB58String).to.equal(id.toB58String())
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Recreate from a Private Key', (done) => {
|
||||||
|
PeerId.createFromPrivKey(testId.privKey, (err, id) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(testIdB58String).to.equal(id.toB58String())
|
||||||
|
|
||||||
|
const encoded = new Buffer(testId.privKey, 'base64')
|
||||||
|
PeerId.createFromPrivKey(encoded, (err, id2) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(testIdB58String).to.equal(id2.toB58String())
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Compare generated ID with one created from PubKey', (done) => {
|
||||||
|
PeerId.create((err, id1) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
|
||||||
|
PeerId.createFromPubKey(id1.marshalPubKey(), (err, id2) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(id1.id).to.be.eql(id2.id)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Non-default # of bits', (done) => {
|
||||||
|
PeerId.create({ bits: 1024 }, (err, shortId) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
PeerId.create({ bits: 4096 }, (err, longId) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(shortId.privKey.bytes.length).is.below(longId.privKey.bytes.length)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Pretty printing', (done) => {
|
||||||
|
PeerId.create((err, id1) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
PeerId.createFromPrivKey(id1.toPrint().privKey, (err, id2) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(id1.toPrint()).to.be.eql(id2.toPrint())
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('toBytes', () => {
|
||||||
|
const id = PeerId.createFromHexString(testIdHex)
|
||||||
|
expect(id.toBytes().toString('hex')).to.equal(testIdBytes.toString('hex'))
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('fromJSON', () => {
|
||||||
|
it('full node', (done) => {
|
||||||
|
PeerId.create({bits: 1024}, (err, id) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
|
||||||
|
PeerId.createFromJSON(id.toJSON(), (err, other) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(
|
||||||
|
id.toB58String()
|
||||||
|
).to.equal(
|
||||||
|
other.toB58String()
|
||||||
|
)
|
||||||
|
expect(
|
||||||
|
id.privKey.bytes
|
||||||
|
).to.deep.equal(
|
||||||
|
other.privKey.bytes
|
||||||
|
)
|
||||||
|
expect(
|
||||||
|
id.pubKey.bytes
|
||||||
|
).to.deep.equal(
|
||||||
|
other.pubKey.bytes
|
||||||
|
)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('only id', (done) => {
|
||||||
|
crypto.generateKeyPair('RSA', 1024, (err, key) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
key.public.hash((err, digest) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
|
||||||
|
const id = PeerId.createFromBytes(digest)
|
||||||
|
expect(id.privKey).to.not.exist
|
||||||
|
expect(id.pubKey).to.not.exist
|
||||||
|
|
||||||
|
PeerId.createFromJSON(id.toJSON(), (err, other) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(
|
||||||
|
id.toB58String()
|
||||||
|
).to.equal(
|
||||||
|
other.toB58String()
|
||||||
|
)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('go interop', (done) => {
|
||||||
|
PeerId.createFromJSON(goId, (err, id) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
id.privKey.public.hash((err, digest) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(
|
||||||
|
mh.toB58String(digest)
|
||||||
|
).to.be.eql(
|
||||||
|
goId.id
|
||||||
|
)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('throws on inconsistent data', () => {
|
||||||
|
let k1, k2, k3
|
||||||
|
before((done) => {
|
||||||
|
parallel([
|
||||||
|
(cb) => crypto.generateKeyPair('RSA', 1024, cb),
|
||||||
|
(cb) => crypto.generateKeyPair('RSA', 1024, cb),
|
||||||
|
(cb) => crypto.generateKeyPair('RSA', 1024, cb)
|
||||||
|
], (err, keys) => {
|
||||||
|
if (err) {
|
||||||
|
return done(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
k1 = keys[0]
|
||||||
|
k2 = keys[1]
|
||||||
|
k3 = keys[2]
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('missmatch private - public key', (done) => {
|
||||||
|
k1.public.hash((err, digest) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(
|
||||||
|
() => new PeerId(digest, k1, k2.public)
|
||||||
|
).to.throw(
|
||||||
|
/inconsistent arguments/
|
||||||
|
)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('missmatch id - private - public key', (done) => {
|
||||||
|
k1.public.hash((err, digest) => {
|
||||||
|
expect(err).to.not.exist
|
||||||
|
expect(
|
||||||
|
() => new PeerId(digest, k1, k3.public)
|
||||||
|
).to.throw(
|
||||||
|
/inconsistent arguments/
|
||||||
|
)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('invalid id', () => {
|
||||||
|
expect(
|
||||||
|
() => new PeerId('hello world')
|
||||||
|
).to.throw(
|
||||||
|
/invalid id/
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
Reference in New Issue
Block a user