Compare commits

..

216 Commits

Author SHA1 Message Date
b5335cd4ee chore: release version v0.13.5 2019-11-12 15:06:13 +01:00
519052693d chore: update contributors 2019-11-12 15:06:13 +01:00
bbf0416f08 feat: deprecate isEqual in favor of equals (#107) 2019-11-12 15:00:11 +01:00
4fbf859efc chore: release version v0.13.4 2019-11-04 19:15:07 +01:00
52bd949b43 chore: update contributors 2019-11-04 19:15:07 +01:00
544ca7d74b feat: support Peer ID represented as CID (#105)
* feat: support Peer ID represented as CID

This change adds two functions:

- createFromCID accepts CID as String|CID|Buffer
  and creates PeerId from the multihash value inside of it
- toCIDString serializes PeerId multihash into a CIDv1 in Base32,
  as agreed in https://github.com/libp2p/specs/pull/209

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>

* refactor: rename toCIDString to toString

CIDv1 is self describing, and toString was not defined.
Makes sense to use generic toString in this case.

This change also:
- remembers string with CID, so it is lazily generated only once
- switches createFromB58String to createFromCID (b58 is CIDv0),
  making it easier to migrate existing codebases.

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>

* docs: comment tests

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>

* feat: validate CID multicodec

- require CID with 'libp2p-key' (CIDv1) or 'dag-pb' (CIDv0 converted to CIDv1)
- delegate CID validation to CID constructor

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>
2019-11-04 18:22:29 +01:00
11d4ec10bd fix: bang in bin.js (#106) 2019-11-04 12:26:50 +01:00
4d5bb2cfff chore: include marshalPubKey and example (#104) 2019-09-29 19:54:45 +02:00
a2ac32ac0f chore: fix docs typo (#103) 2019-09-28 11:33:57 +02:00
ed211a943b chore: release version v0.13.3 2019-09-25 16:30:21 +02:00
8ea480a3b0 chore: update contributors 2019-09-25 16:30:21 +02:00
f39fb24321 feat: allow nested PeerIds to support pubKey function when using identity encoding (#101) 2019-09-25 15:39:24 +02:00
911aa634d3 chore: lead maintainer update (#98) 2019-07-30 21:17:24 +02:00
94aa3483b3 chore: release version v0.13.2 2019-07-12 18:43:04 +01:00
1f1f86f576 chore: update contributors 2019-07-12 18:43:04 +01:00
76864184da feat: add compact protobuf format (#76)
* docs: document .createFromProtobuf and .marshal
* fix: lint
* test: verify .marshal() does it's job
2019-07-12 18:35:46 +01:00
f50b2ac016 chore: release version v0.13.1 2019-07-11 20:38:24 +01:00
6754752b05 chore: update contributors 2019-07-11 20:38:23 +01:00
17440a3f9a feat(peerid): support creating from secp256k1; harmonize algo with Go (#95) 2019-07-11 20:31:39 +01:00
989b413a96 chore: release version v0.13.0 2019-07-11 18:26:18 +01:00
52ed9c58a5 chore: update contributors 2019-07-11 18:26:18 +01:00
c3463c7421 feat: async await (#87)
BREAKING CHANGE: API refactored to use async/await
2019-07-11 18:09:21 +01:00
bbabd7451e chore: add discourse badge (#93) 2019-04-18 19:32:14 +02:00
1624b0f70a chore: release version v0.12.2 2019-01-09 15:14:15 +00:00
ce8a6ff77e chore: update contributors 2019-01-09 15:14:15 +00:00
41ce1d4671 chore: fix lint 2019-01-09 15:03:49 +00:00
231e553a22 chore: fix lint 2019-01-09 15:03:49 +00:00
cd2099305e fix: clean repo and bundle size reduction 2019-01-09 15:03:49 +00:00
8e030b24d4 chore: release version v0.12.1 2019-01-03 17:10:26 +00:00
9f69e1ba74 chore: update contributors 2019-01-03 17:10:26 +00:00
cbc8c5e2ba Merge pull request #91 from libp2p/chore/update-deps-20190103
chore: update dependencies
2019-01-03 17:05:15 +00:00
77000dbd8b chore: update dependencies 2019-01-03 16:46:46 +00:00
eb062759c6 chore: release version v0.12.0 2018-10-18 11:00:01 +01:00
39e17c0c0b chore: update contributors 2018-10-18 11:00:01 +01:00
e03a4098df chore: update contributors 2018-10-18 10:57:19 +01:00
d7e633a90b Merge pull request #84 from libp2p/feat/add-class-is-module
feat: add class-is module
2018-10-18 10:50:45 +01:00
2e5e666140 fix: add peerIdWithIs to the API functions using the instance 2018-10-17 10:51:42 +01:00
b388257b69 Merge pull request #86 from libp2p/docs/readme-tweaks
docs: various readme tweaks
2018-10-12 19:58:47 +01:00
6ecd9a8cb0 docs: various readme tweaks 2018-10-12 18:01:55 +02:00
6513a02e1e feat: add class-is module 2018-10-04 11:29:31 +01:00
bd1dc9bda0 chore: release version v0.11.0 2018-07-02 19:28:04 +02:00
31cbb5d94c chore: update contributors 2018-07-02 19:28:03 +02:00
35556c3a37 chore: update deps 2018-07-02 19:26:36 +02:00
e8ab1b9281 feat: change toPrint output to match go implementation 2018-07-02 19:26:03 +02:00
a786018528 chore: remove pre-commit module 2018-06-04 09:48:30 +01:00
417fd330b9 docs: add lead maintainer 2018-06-04 09:48:30 +01:00
d74bdebcc8 chore: update deps 2018-06-04 09:48:30 +01:00
ffed046595 chore: release version v0.10.7 2018-04-05 16:41:39 +01:00
1727a135aa chore: update contributors 2018-04-05 16:41:39 +01:00
466b3a030d chore: update deps 2018-04-05 16:39:53 +01:00
464c92a53b chore: release version v0.10.6 2018-02-12 09:34:42 +00:00
8a608def32 chore: update contributors 2018-02-12 09:34:42 +00:00
19deeff432 chore: update deps 2018-02-12 09:33:14 +00:00
b18c0082ff chore: release version v0.10.5 2018-01-27 18:18:00 -08:00
2b050bcaa1 chore: update contributors 2018-01-27 18:17:59 -08:00
b19edf2ab2 chore: update deps 2018-01-27 18:15:52 -08:00
35b384ed15 chore: release version v0.10.4 2017-12-20 12:33:36 +00:00
655ceec29b chore: update contributors 2017-12-20 12:33:36 +00:00
8b9a134276 fix: update dependencies (#73) 2017-12-20 12:32:35 +00:00
a637297112 chore: release version v0.10.3 2017-12-01 08:51:43 +00:00
e666b7284f chore: update contributors 2017-12-01 08:51:43 +00:00
156911e162 fix: catch error when unmarshaling instead of crashing (#72) 2017-12-01 08:49:50 +00:00
f91f2b6506 chore: Updating CI files (#70)
* Updating CI files

This commit updates all CI scripts to the latest version

* Faster tests
2017-11-24 17:46:24 +00:00
8f6935499e chore: release version v0.10.2 2017-10-12 10:21:43 +02:00
80da1a54b2 chore: update contributors 2017-10-12 10:21:43 +02:00
300266ad51 chore: update deps 2017-10-12 10:20:43 +02:00
3abdcdabbb fix: Always add public key to constructor if possible, Fix for undefined pubKey in remote peers (#68)
* Always add public key to constructor if possible

* extending Non-default # of bits test time, travis took 59521ms

License: MIT
Signed-off-by: Yahya <ya7yaz@gmail.com>
2017-10-12 10:09:18 +02:00
7d3cb8e87c chore: release version v0.10.1 2017-09-07 14:51:57 +01:00
a57c0c6f14 chore: update contributors 2017-09-07 14:51:57 +01:00
d7088d6650 feat(deps): update aegir and libp2p-crypto (#67) 2017-09-07 14:50:44 +01:00
c945d6ad48 chore: release version v0.10.0 2017-09-03 11:51:33 +01:00
0eee1a2a69 chore: update contributors 2017-09-03 11:51:33 +01:00
63428faae9 feat: p2p addrs situation (#66)
* chore: update deps

* chore: update gitignore

* chore: update CI

* chore: update README badge
2017-09-03 11:49:56 +01:00
a38e3859d2 chore: release version v0.9.0 2017-07-22 13:38:56 -07:00
551fd710be chore: update contributors 2017-07-22 13:38:55 -07:00
442df13a11 feat: use next libp2p-crypto (#64)
* feat: use next libp2p-crypto

* chore: update deps
2017-07-22 13:37:01 -07:00
156088db99 chore: release version v0.8.8 2017-07-21 09:30:10 -07:00
9c0c648001 chore: update contributors 2017-07-21 09:30:10 -07:00
a2934aa371 chore: update ci 2017-07-21 09:29:12 -07:00
ac98b7582a chore: update deps 2017-07-21 09:29:06 -07:00
0dc3c14f2b docs: update readme 2017-07-09 10:05:03 +01:00
af6575d06c chore: release version v0.8.7 2017-04-03 08:29:40 -04:00
ccf0b7875c chore: update contributors 2017-04-03 08:29:40 -04:00
733b40bb47 Merge pull request #60 from libp2p/feat/update-keys
feat: set privKey pubKey
2017-04-03 08:11:33 -04:00
ac27907241 feat: set privKey pubKey 2017-04-02 22:47:44 -04:00
e206c46549 chore: release version v0.8.6 2017-03-30 10:06:09 +01:00
41d3e5be5b chore: update contributors 2017-03-30 10:06:09 +01:00
bc213dd818 Merge pull request #58 from libp2p/feat/isEqual
feat: isEqual
2017-03-30 10:02:36 +01:00
3f4f670691 feat: isEqual 2017-03-30 09:47:11 +01:00
d2894bfa32 chore: release version v0.8.5 2017-03-27 14:20:31 +01:00
c3e3b70d09 chore: update contributors 2017-03-27 14:20:31 +01:00
f08866047d Merge pull request #57 from libp2p/feat/isPeerId
isPeerId
2017-03-27 14:17:09 +01:00
a3fe1a2f03 fix: avoid using constructor.name 2017-03-27 13:58:21 +01:00
0acc572fd3 feat: isPeerId 2017-03-27 13:23:18 +01:00
8c49610dff chore: update deps 2017-03-27 12:38:48 +01:00
e1ffe9bba5 chore: release version v0.8.4 2017-03-16 17:08:03 +00:00
e59010b439 chore: update contributors 2017-03-16 17:08:03 +00:00
60b1c09665 chore: release version v0.8.3 2017-03-16 17:07:10 +00:00
b28b8ef693 chore: update contributors 2017-03-16 17:07:10 +00:00
961b218a53 chore: update aegir and fix lint 2017-03-16 17:07:10 +00:00
0642070fdd Merge pull request #45 from libp2p/greenkeeper-aegir-10.0.0
Update aegir to version 10.0.0 🚀
2017-02-13 18:07:31 -08:00
3da91b92fa chore: release version v0.8.2 2017-02-09 08:10:40 -08:00
ad9a43b7c8 chore: update contributors 2017-02-09 08:10:40 -08:00
c67bf150f2 chore: ^ to ~ 2017-02-09 08:08:43 -08:00
a2afb2aeea chore(package): update aegir to version 10.0.0
https://greenkeeper.io/
2017-02-07 18:45:23 +01:00
6624c27d8d chore: release version v0.8.1 2016-12-18 08:06:16 +00:00
26ac06d21c chore: update contributors 2016-12-18 08:06:16 +00:00
f0d72b7bfe Merge pull request #44 from libp2p/feat/cache
feat: cache b58 id
2016-12-18 08:05:41 +00:00
78d96d0b14 feat: create b58 string on creation and throw on id mutation 2016-12-18 09:02:37 +01:00
bebb0a7eae feat: cache b58 id 2016-12-14 09:05:07 +01:00
5d6a962b6c chore(package): update aegir to version 9.2.1 (#43)
https://greenkeeper.io/
2016-12-10 11:59:28 -08:00
531c9f1086 Fix typo in README example (#42) 2016-12-04 21:52:26 -08:00
06f93cd961 chore(package): update aegir to version 9.1.2 (#39)
https://greenkeeper.io/
2016-11-28 15:52:39 +00:00
1452f233c8 chore(package): update multihashes to version 0.3.0 (#40)
https://greenkeeper.io/
2016-11-28 15:34:50 +00:00
77900c7b45 chore(package): update aegir to version 9.1.0 (#38)
https://greenkeeper.io/
2016-11-03 17:59:54 +00:00
564489b0ea chore: release version v0.8.0 2016-11-03 07:52:10 +00:00
65c2ac8dca chore: update contributors 2016-11-03 07:52:10 +00:00
31701e236d Async Crypto Endeavour (#33)
* refactor: make import and creation async - This allows the use of native key generation in the browser

BREAKING CHANGE:

This changes the interface of .create, .createFromPrivKey,
.createFromPubKey, .createFromJSON
2016-11-03 07:51:29 +00:00
e08907ff94 Merge pull request #34 from RichardLitt/master
Update README URLs based on HTTP redirects
2016-10-02 15:06:15 +01:00
f6a42fef76 Update README URLs based on HTTP redirects 2016-10-02 10:03:56 -04:00
ba8aa3ff34 Merge pull request #32 from libp2p/greenkeeper-libp2p-crypto-0.6.1
Update libp2p-crypto to version 0.6.1 🚀
2016-09-13 17:23:40 +02:00
ae81e95927 chore(package): update libp2p-crypto to version 0.6.1
https://greenkeeper.io/
2016-09-13 12:35:32 +02:00
d24500a042 Update README.md 2016-09-11 16:40:26 -04:00
5fec44833e Update README.md 2016-09-11 16:40:09 -04:00
2432c56ad5 Merge pull request #30 from npmcdn-to-unpkg-bot/npmcdn-to-unpkg
Replace npmcdn.com with unpkg.com
2016-09-11 13:03:07 -04:00
f0e380af58 Replace npmcdn.com with unpkg.com 2016-09-11 12:29:33 +01:00
24cd31b2d1 Merge pull request #29 from libp2p/greenkeeper-aegir-8.0.0
Update aegir to version 8.0.0 🚀
2016-09-06 21:15:05 +02:00
5f9136b3ca chore(package): update aegir to version 8.0.0
https://greenkeeper.io/
2016-09-06 15:11:37 +02:00
4fe3e12b3c Merge pull request #26 from libp2p/greenkeeper-update-all
Update all dependencies 🌴
2016-08-04 20:43:19 +02:00
49d454da7d chore(package): update dependencies
https://greenkeeper.io/
2016-08-04 19:11:03 +02:00
7336b6ad80 chore: release version v0.7.0 2016-05-26 19:23:08 +01:00
461d2ea287 chore: update contributors 2016-05-26 19:23:08 +01:00
7c100f845a update aegir 2016-05-26 19:20:59 +01:00
c3f50a2dfd Merge pull request #25 from diasdavid/crypto
refactor: use libp2p and standardized rsa keys
2016-05-24 13:24:54 +01:00
907ed1571d chore: add more release tasks 2016-05-24 14:15:00 +02:00
2aad1dce7b test: fix node-forge for the browser setup 2016-05-24 14:14:11 +02:00
58f1933980 fix: code review and docs and go interop 2016-05-24 14:03:31 +02:00
ab5504686a fix: use new version of libp2p-crypto 2016-05-24 12:39:36 +02:00
4beb1f8888 refactor: use libp2p and standardized rsa keys 2016-05-23 22:06:25 +02:00
7635cfcfda chore: release version v0.6.7 2016-05-23 15:32:57 +01:00
afbd96edda chore: update contributors 2016-05-23 15:32:57 +01:00
c1e18ee420 Merge pull request #24 from diasdavid/feat/marshal-unmarshal
Feat/marshal unmarshal
2016-05-23 15:31:38 +01:00
b358530dfb add toJSON and fromJSOn and cli to quickly generate 2016-05-23 15:25:30 +01:00
4afbedb525 update dependencies 2016-05-23 14:16:30 +01:00
e9b107fc55 Merge pull request #21 from diasdavid/aegir
refactor: use aegir
2016-04-15 14:13:57 +01:00
855a97956d refactor: use aegir 2016-04-15 13:20:05 +02:00
dee54d3dcc Merge pull request #20 from noffle/circle
circle-ci config
2016-04-14 00:01:25 +01:00
167b726dad Merge pull request #19 from noffle/readme-formatting
fixes README formatting
2016-04-14 00:01:05 +01:00
3b9f8af2e7 circle-ci config 2016-04-13 10:11:39 -07:00
771b994d7e fixes README formatting 2016-04-13 10:00:26 -07:00
524fc37877 chore: release version v0.6.6 2016-04-12 22:14:58 +01:00
3c55473a45 Merge pull request #18 from diasdavid/fix-jsnext
fix jsnext:main
2016-04-12 22:13:03 +01:00
8771627ce4 fix it 2016-04-12 22:06:12 +01:00
bbf6bae073 chore: release version v0.6.5 2016-04-12 21:28:27 +01:00
e45a9f4083 Merge pull request #17 from diasdavid/jsnext-add
jsnext add
2016-04-12 21:24:11 +01:00
13f98c8913 jsnext add 2016-04-12 21:09:41 +01:00
f374ab4411 chore: release version v0.6.4 2016-04-12 17:31:47 +01:00
2f4cdd3725 Merge pull request #16 from noffle/docs-and-examples
readme <3
2016-04-12 17:28:37 +01:00
d2f90ff447 Merge pull request #15 from noffle/coverage
100% coverage
2016-04-12 17:27:29 +01:00
f2a75f1188 100% coverage badge 2016-04-12 09:07:59 -07:00
dab90bd3b6 other bundlers 2016-04-12 09:04:02 -07:00
e9fdc0a27e applies readme love 2016-04-11 15:23:34 -07:00
f0a17a9bd9 100% coverage 2016-04-11 14:43:50 -07:00
57ab8406c0 chore: release version v0.6.3 2016-04-07 19:47:53 -04:00
f16c08e7fd update the readme 2016-04-07 19:45:21 -04:00
be5d4f9b41 chore: release version v0.6.2 2016-04-07 19:41:09 -04:00
35a3ccca3d update coverage script 2016-04-07 19:38:43 -04:00
989c3fb7a5 add .npmignore 2016-04-07 19:30:19 -04:00
bbe67df1c8 Merge pull request #12 from dignifiedquire/dignified
Use dignified.js
2016-04-07 19:27:13 -04:00
8849d90d6a Use dignified.js 1.0.0 2016-04-07 21:22:53 +02:00
2552871bcc Update travis 2016-03-22 17:03:51 +01:00
ab76788771 Use dignified.js 2016-03-22 17:01:46 +01:00
f62023f8a7 Release v0.6.1. 2016-03-15 23:28:07 +00:00
95367871ac Merge pull request #11 from noffle/bits
exposes opts + bits
2016-03-15 23:22:41 +00:00
352a6cfa17 tests # of bits 2016-03-15 12:15:44 -07:00
727355c4f5 exposes opts + bits 2016-03-14 17:10:02 -07:00
bd185f8081 Release v0.6.0. 2016-03-10 19:43:32 +00:00
d4c3de1ecb codestyle 2016-03-10 19:43:23 +00:00
b692394116 chore: dist 2016-03-10 19:40:52 +00:00
a8e591525b update readme 2016-03-10 19:36:47 +00:00
6ad5d85f76 Merge pull request #10 from nginnever/master
buffer the public key for consistency
2016-03-10 19:31:47 +00:00
ca9cef6de7 comparing buffers 2016-03-10 11:25:59 -08:00
f55eebcef7 buffer the public key for consistency 2016-03-10 10:32:48 -08:00
6442bb4b59 Release v0.5.3. 2016-03-05 21:56:53 +00:00
33ff2aa608 Merge pull request #8 from diasdavid/update/git-repo
add git repo and fix codestyle issues
2016-03-05 21:56:36 +00:00
bbeb6fc0f6 add git repo and fix codestyle issues 2016-03-05 21:54:18 +00:00
f518ced776 add git repo to the package.json 2016-03-05 21:49:26 +00:00
73b42ff2aa dist file 2016-03-03 14:19:10 -08:00
b3e3dbe3c0 Release v0.5.1. 2016-03-03 17:45:53 +00:00
b2b90bfbb5 remove jshintrc and jshintignore 2016-03-03 17:43:30 +00:00
d9113d55e0 Merge pull request #6 from diasdavid/cleanup
came to fix a square bracket, ended up touch a bunch of other things :)
2016-03-03 17:39:14 +00:00
59b89039b6 came to fix a square bracket, ended up touch a bunch of other things :) 2016-03-03 17:31:33 +00:00
1cdbf19857 Release v0.5.0. 2016-02-14 07:37:10 +00:00
845bd088fe add coverage, fix codestyle 2016-02-14 07:32:09 +00:00
1f72aaf7b7 Merge pull request #4 from nginnever/master
public key derivation from private key stored in go-ipfs config file
2016-02-14 07:24:06 +00:00
effa21b892 removed node forge bundle comment 2016-02-13 13:46:33 -08:00
91bc56eb05 small grammar changes 2016-02-13 07:49:51 -08:00
3cc3cb31f0 removed uneeded dev deps 2016-02-12 20:09:42 -08:00
de572bd15f Merge branch 'master' of https://github.com/nginnever/js-peer-id 2016-02-12 19:56:37 -08:00
1a336f9289 cleanup changes 2016-02-12 19:55:44 -08:00
77790571aa Delete id-test.js 2016-02-12 19:50:55 -08:00
d9b9ca8812 Delete crypto.proto 2016-02-12 19:45:50 -08:00
67c26ec546 travis addons 2016-02-12 16:38:29 -08:00
58fe038e07 time out increased 2016-02-12 16:13:09 -08:00
61c0c663d6 new timeout set 2016-02-12 16:06:40 -08:00
8adbdd0d6e Merge https://github.com/diasdavid/js-peer-id 2016-02-12 15:29:26 -08:00
7ae9be8f71 new tests 2016-02-12 14:55:05 -08:00
16c77433f9 getting ready to rewrite tests 2016-02-10 13:55:59 -08:00
6ce01ab434 keys now generated and derived match with go client 2016-02-04 12:02:18 -08:00
5cb511c646 added create id from private key 2016-02-04 12:01:58 -08:00
370e5c55b1 Release v0.4.0. 2015-11-05 18:51:53 +00:00
e3cc273a14 Merge pull request #3 from diasdavid/update
tests, browser tests, move to RSA based key (instead of ECDH), conform with go-ipfs
2015-11-05 18:51:21 +00:00
2c1874a689 merge latest master 2015-11-05 18:48:13 +00:00
3c0c9a3b19 tests and browser tests setup 2015-11-05 18:46:02 +00:00
d7ab4bd8fb complement readme 2015-11-05 17:47:44 +00:00
9aee5bf670 abandon ECD for RSA, in order to conform with go impl 2015-11-05 17:35:23 +00:00
14 changed files with 1430 additions and 131 deletions

22
.gitignore vendored
View File

@ -1,7 +1,15 @@
docs
**/node_modules/
**/*.log
test/repo-tests*
**/bundle.js
# Logs
logs
*.log
coverage
# Runtime data
pids
*.pid
@ -19,9 +27,19 @@ coverage
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
build
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
docs
lib
dist
test/test-data/go-ipfs-repo/LOCK
test/test-data/go-ipfs-repo/LOG
test/test-data/go-ipfs-repo/LOG.old
# while testing npm5
package-lock.json
yarn.lock

View File

@ -1 +0,0 @@
node_modules

View File

@ -1,10 +0,0 @@
{
"node": true,
"curly": true,
"latedef": true,
"quotmark": true,
"undef": true,
"unused": true,
"trailing": true
}

View File

@ -1,13 +1,45 @@
language: node_js
cache: npm
stages:
- check
- test
- cov
node_js:
- "4.0"
- '10'
branches:
only:
- master
os:
- linux
- osx
before_install:
- npm i -g npm
# Workaround for a permissions issue with Travis virtual machine images
script:
- npm test
script: npx nyc -s npm run test:node -- --bail
after_success: npx nyc report --reporter=text-lcov > coverage.lcov && npx codecov
jobs:
include:
- os: windows
cache: false
- stage: check
script:
- npx aegir dep-check
- npm run lint
- stage: test
name: chrome
addons:
chrome: stable
script:
- npx aegir test -t browser
- npx aegir test -t webworker
- stage: test
name: firefox
addons:
firefox: latest
script:
- npx aegir test -t browser -- --browsers FirefoxHeadless
- npx aegir test -t webworker -- --browsers FirefoxHeadless
notifications:
email: false

351
CHANGELOG.md Normal file
View File

@ -0,0 +1,351 @@
<a name="0.13.5"></a>
## [0.13.5](https://github.com/libp2p/js-peer-id/compare/v0.13.4...v0.13.5) (2019-11-12)
### Features
* deprecate isEqual in favor of equals ([#107](https://github.com/libp2p/js-peer-id/issues/107)) ([bbf0416](https://github.com/libp2p/js-peer-id/commit/bbf0416))
<a name="0.13.4"></a>
## [0.13.4](https://github.com/libp2p/js-peer-id/compare/v0.13.3...v0.13.4) (2019-11-04)
### Bug Fixes
* bang in bin.js ([#106](https://github.com/libp2p/js-peer-id/issues/106)) ([11d4ec1](https://github.com/libp2p/js-peer-id/commit/11d4ec1))
### Features
* support Peer ID represented as CID ([#105](https://github.com/libp2p/js-peer-id/issues/105)) ([544ca7d](https://github.com/libp2p/js-peer-id/commit/544ca7d))
<a name="0.13.3"></a>
## [0.13.3](https://github.com/libp2p/js-peer-id/compare/v0.13.2...v0.13.3) (2019-09-25)
### Features
* allow nested PeerIds to support pubKey function when using identity encoding ([#101](https://github.com/libp2p/js-peer-id/issues/101)) ([f39fb24](https://github.com/libp2p/js-peer-id/commit/f39fb24))
<a name="0.13.2"></a>
## [0.13.2](https://github.com/libp2p/js-peer-id/compare/v0.13.1...v0.13.2) (2019-07-12)
### Features
* add compact protobuf format ([#76](https://github.com/libp2p/js-peer-id/issues/76)) ([7686418](https://github.com/libp2p/js-peer-id/commit/7686418))
<a name="0.13.1"></a>
## [0.13.1](https://github.com/libp2p/js-peer-id/compare/v0.13.0...v0.13.1) (2019-07-11)
### Features
* **peerid:** support creating from secp256k1; harmonize algo with Go ([#95](https://github.com/libp2p/js-peer-id/issues/95)) ([17440a3](https://github.com/libp2p/js-peer-id/commit/17440a3))
<a name="0.13.0"></a>
# [0.13.0](https://github.com/libp2p/js-peer-id/compare/v0.12.2...v0.13.0) (2019-07-11)
### Features
* async await ([#87](https://github.com/libp2p/js-peer-id/issues/87)) ([c3463c7](https://github.com/libp2p/js-peer-id/commit/c3463c7))
### BREAKING CHANGES
* API refactored to use async/await
<a name="0.12.2"></a>
## [0.12.2](https://github.com/libp2p/js-peer-id/compare/v0.12.1...v0.12.2) (2019-01-09)
### Bug Fixes
* clean repo and bundle size reduction ([cd20993](https://github.com/libp2p/js-peer-id/commit/cd20993))
<a name="0.12.1"></a>
## [0.12.1](https://github.com/libp2p/js-peer-id/compare/v0.12.0...v0.12.1) (2019-01-03)
<a name="0.12.0"></a>
# [0.12.0](https://github.com/libp2p/js-peer-id/compare/v0.11.0...v0.12.0) (2018-10-18)
### Bug Fixes
* add peerIdWithIs to the API functions using the instance ([2e5e666](https://github.com/libp2p/js-peer-id/commit/2e5e666))
### Features
* add class-is module ([6513a02](https://github.com/libp2p/js-peer-id/commit/6513a02))
<a name="0.11.0"></a>
# [0.11.0](https://github.com/libp2p/js-peer-id/compare/v0.10.7...v0.11.0) (2018-07-02)
### Features
* change toPrint output to match go implementation ([e8ab1b9](https://github.com/libp2p/js-peer-id/commit/e8ab1b9))
<a name="0.10.7"></a>
## [0.10.7](https://github.com/libp2p/js-peer-id/compare/v0.10.6...v0.10.7) (2018-04-05)
<a name="0.10.6"></a>
## [0.10.6](https://github.com/libp2p/js-peer-id/compare/v0.10.5...v0.10.6) (2018-02-12)
<a name="0.10.5"></a>
## [0.10.5](https://github.com/libp2p/js-peer-id/compare/v0.10.4...v0.10.5) (2018-01-28)
<a name="0.10.4"></a>
## [0.10.4](https://github.com/libp2p/js-peer-id/compare/v0.10.3...v0.10.4) (2017-12-20)
### Bug Fixes
* update dependencies ([#73](https://github.com/libp2p/js-peer-id/issues/73)) ([8b9a134](https://github.com/libp2p/js-peer-id/commit/8b9a134))
<a name="0.10.3"></a>
## [0.10.3](https://github.com/libp2p/js-peer-id/compare/v0.10.2...v0.10.3) (2017-12-01)
### Bug Fixes
* catch error when unmarshaling instead of crashing ([#72](https://github.com/libp2p/js-peer-id/issues/72)) ([156911e](https://github.com/libp2p/js-peer-id/commit/156911e))
<a name="0.10.2"></a>
## [0.10.2](https://github.com/libp2p/js-peer-id/compare/v0.10.1...v0.10.2) (2017-10-12)
### Bug Fixes
* Always add public key to constructor if possible, Fix for undefined pubKey in remote peers ([#68](https://github.com/libp2p/js-peer-id/issues/68)) ([3abdcda](https://github.com/libp2p/js-peer-id/commit/3abdcda))
<a name="0.10.1"></a>
## [0.10.1](https://github.com/libp2p/js-peer-id/compare/v0.10.0...v0.10.1) (2017-09-07)
### Features
* **deps:** update aegir and libp2p-crypto ([#67](https://github.com/libp2p/js-peer-id/issues/67)) ([d7088d6](https://github.com/libp2p/js-peer-id/commit/d7088d6))
<a name="0.10.0"></a>
# [0.10.0](https://github.com/libp2p/js-peer-id/compare/v0.9.0...v0.10.0) (2017-09-03)
### Features
* p2p addrs situation ([#66](https://github.com/libp2p/js-peer-id/issues/66)) ([63428fa](https://github.com/libp2p/js-peer-id/commit/63428fa))
<a name="0.9.0"></a>
# [0.9.0](https://github.com/libp2p/js-peer-id/compare/v0.8.8...v0.9.0) (2017-07-22)
### Features
* use next libp2p-crypto ([#64](https://github.com/libp2p/js-peer-id/issues/64)) ([442df13](https://github.com/libp2p/js-peer-id/commit/442df13))
<a name="0.8.8"></a>
## [0.8.8](https://github.com/libp2p/js-peer-id/compare/v0.8.7...v0.8.8) (2017-07-21)
<a name="0.8.7"></a>
## [0.8.7](https://github.com/libp2p/js-peer-id/compare/v0.8.6...v0.8.7) (2017-04-03)
### Features
* set privKey pubKey ([ac27907](https://github.com/libp2p/js-peer-id/commit/ac27907))
<a name="0.8.6"></a>
## [0.8.6](https://github.com/libp2p/js-peer-id/compare/v0.8.5...v0.8.6) (2017-03-30)
### Features
* isEqual ([3f4f670](https://github.com/libp2p/js-peer-id/commit/3f4f670))
<a name="0.8.5"></a>
## [0.8.5](https://github.com/libp2p/js-peer-id/compare/v0.8.4...v0.8.5) (2017-03-27)
### Bug Fixes
* avoid using constructor.name ([a3fe1a2](https://github.com/libp2p/js-peer-id/commit/a3fe1a2))
### Features
* isPeerId ([0acc572](https://github.com/libp2p/js-peer-id/commit/0acc572))
<a name="0.8.4"></a>
## [0.8.4](https://github.com/libp2p/js-peer-id/compare/v0.8.2...v0.8.4) (2017-03-16)
<a name="0.8.2"></a>
## [0.8.2](https://github.com/libp2p/js-peer-id/compare/v0.8.1...v0.8.2) (2017-02-09)
<a name="0.8.1"></a>
## [0.8.1](https://github.com/libp2p/js-peer-id/compare/v0.8.0...v0.8.1) (2016-12-18)
### Features
* cache b58 id ([bebb0a7](https://github.com/libp2p/js-peer-id/commit/bebb0a7))
* create b58 string on creation and throw on id mutation ([78d96d0](https://github.com/libp2p/js-peer-id/commit/78d96d0))
<a name="0.8.0"></a>
# [0.8.0](https://github.com/libp2p/js-peer-id/compare/v0.7.0...v0.8.0) (2016-11-03)
* Async Crypto Endeavour (#33) ([31701e2](https://github.com/libp2p/js-peer-id/commit/31701e2))
### BREAKING CHANGES
* This changes the interface of .create, .createFromPrivKey,
.createFromPubKey, .createFromJSON
<a name="0.7.0"></a>
# [0.7.0](https://github.com/libp2p/js-peer-id/compare/v0.6.7...v0.7.0) (2016-05-26)
### Bug Fixes
* code review and docs and go interop ([58f1933](https://github.com/libp2p/js-peer-id/commit/58f1933))
* use new version of libp2p-crypto ([ab55046](https://github.com/libp2p/js-peer-id/commit/ab55046))
<a name="0.6.7"></a>
## [0.6.7](https://github.com/libp2p/js-peer-id/compare/v0.6.6...v0.6.7) (2016-05-23)
<a name="0.6.6"></a>
## [0.6.6](https://github.com/libp2p/js-peer-id/compare/v0.6.5...v0.6.6) (2016-04-12)
<a name="0.6.5"></a>
## [0.6.5](https://github.com/libp2p/js-peer-id/compare/v0.6.1...v0.6.5) (2016-04-12)
<a name="0.6.1"></a>
## [0.6.1](https://github.com/libp2p/js-peer-id/compare/v0.6.0...v0.6.1) (2016-03-15)
<a name="0.6.0"></a>
# [0.6.0](https://github.com/libp2p/js-peer-id/compare/v0.5.3...v0.6.0) (2016-03-10)
<a name="0.5.3"></a>
## [0.5.3](https://github.com/libp2p/js-peer-id/compare/v0.5.1...v0.5.3) (2016-03-05)
<a name="0.5.1"></a>
## [0.5.1](https://github.com/libp2p/js-peer-id/compare/v0.5.0...v0.5.1) (2016-03-03)
<a name="0.5.0"></a>
# [0.5.0](https://github.com/libp2p/js-peer-id/compare/v0.4.0...v0.5.0) (2016-02-14)
<a name="0.4.0"></a>
# [0.4.0](https://github.com/libp2p/js-peer-id/compare/v0.3.4...v0.4.0) (2015-11-05)
<a name="0.3.4"></a>
## [0.3.4](https://github.com/libp2p/js-peer-id/compare/v0.3.3...v0.3.4) (2015-10-28)
<a name="0.3.3"></a>
## [0.3.3](https://github.com/libp2p/js-peer-id/compare/v0.3.2...v0.3.3) (2015-09-15)
<a name="0.3.2"></a>
## [0.3.2](https://github.com/libp2p/js-peer-id/compare/v0.3.1...v0.3.2) (2015-09-14)
<a name="0.3.1"></a>
## [0.3.1](https://github.com/libp2p/js-peer-id/compare/v0.3.0...v0.3.1) (2015-08-25)
<a name="0.3.0"></a>
# [0.3.0](https://github.com/libp2p/js-peer-id/compare/v0.2.0...v0.3.0) (2015-07-19)
<a name="0.2.0"></a>
# [0.2.0](https://github.com/libp2p/js-peer-id/compare/v0.1.0...v0.2.0) (2015-07-17)
<a name="0.1.0"></a>
# 0.1.0 (2015-07-08)

308
README.md
View File

@ -1,66 +1,280 @@
peer-id JavaScript implementation
==============================
# peer-id
[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [[![](https://img.shields.io/badge/freejs-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) ![Build Status](https://travis-ci.org/diasdavid/js-peer-id.svg?style=flat-square)](https://travis-ci.org/diasdavid/js-peer-id) ![](https://img.shields.io/badge/coverage-%3F-yellow.svg?style=flat-square) [![Dependency Status](https://david-dm.org/diasdavid/js-peer-id.svg?style=flat-square)](https://david-dm.org/diasdavid/js-peer-id) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard)
[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai)
[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p)
[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io)
[![](https://img.shields.io/codecov/c/github/libp2p/js-peer-id.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-peer-id)
[![](https://img.shields.io/travis/libp2p/js-peer-id.svg?style=flat-square)](https://travis-ci.com/libp2p/js-peer-id)
[![Dependency Status](https://david-dm.org/libp2p/js-peer-id.svg?style=flat-square)](https://david-dm.org/libp2p/js-peer-id)
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard)
> IPFS Peer Id implementation in Node.js
> [IPFS](https://github.com/ipfs/ipfs) Peer ID implementation in JavaScript.
## Lead Maintainer
[Vasco Santos](https://github.com/vasco-santos)
## Table of Contents
- [peer-id](#peer-id)
- [Lead Maintainer](#lead-maintainer)
- [Table of Contents](#table-of-contents)
- [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)
- [Create](#create)
- [`new PeerId(id[, privKey, pubKey])`](#new-peeridid-privkey-pubkey)
- [`create([opts])`](#createopts)
- [Import](#import)
- [`createFromHexString(str)`](#createfromhexstringstr)
- [`createFromBytes(buf)`](#createfrombytesbuf)
- [`createFromCID(cid)`](#createfromcidcid)
- [`createFromB58String(str)`](#createfromb58stringstr)
- [`createFromPubKey(pubKey)`](#createfrompubkeypubkey)
- [`createFromPrivKey(privKey)`](#createfromprivkeyprivkey)
- [`createFromJSON(obj)`](#createfromjsonobj)
- [`createFromProtobuf(buf)`](#createfromprotobufbuf)
- [Export](#export)
- [`toHexString()`](#tohexstring)
- [`toBytes()`](#tobytes)
- [`toString()`](#tostring)
- [`toB58String()`](#tob58string)
- [`toJSON()`](#tojson)
- [`marshal(excludePrivateKey)`](#marshalexcludeprivatekey)
- [`marshalPubKey()`](#marshalpubkey)
- [`toPrint()`](#toprint)
- [`equals(id)`](#equalsid)
- [`isEqual(id)`](#isequalid)
- [License](#license)
# Description
A IPFS Peer Id is based on a sha256 has 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).
# Usage
A Peer ID is the SHA-256 [multihash](https://github.com/multiformats/multihash) of a public key.
### Installing
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.
```
$ npm install peer-id
# Example
```JavaScript
const PeerId = require('peer-id')
const id = await PeerId.create({ bits: 1024, keyType: 'rsa' })
console.log(JSON.stringify(id.toJSON(), null, 2))
```
### Creating a new Id
```
var PeerId = require('ipfs-peer')
// Create a new Id
var id = new PeerId.create()
// Recreate an Id from Hex string
var id = new PeerId.createFromHexString(str)
// Recreate an Id from a Buffer
var id = new PeerId.createFromBytes(buf)
// Recreate an B58 String
var id = new PeerId.createFromB58String(str)
// Recreate from a Public Key
var id = new PeerId.createFromPubKey(pubKey)
// Recreate from a Private Key
var id = new PeerId.createFromPrivKey(privKey)
```bash
{
"id": "Qma9T5YraSnpRDZqRR4krcSJabThc8nwZuJV3LercPHufi",
"privKey": "CAAS4AQwggJcAgEAAoGBAMBgbIqyOL26oV3nGPBYrdpbv..",
"pubKey": "CAASogEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMBgbIqyOL26oV3nGPBYrdpbvzCY..."
}
```
### Exporting an Id
# Installation
```
// Print friendly format
id.toPrint() // returns an object with id, privKey and pubKey in hex format
## npm
// Export to an hex string
id.toHexString()
// Export to Buffer
id.toBytes() (same as id.id)
// Export to a B58 string
id.toB58String()
```sh
> npm i peer-id
```
### Id format
# Setup
## Node.js
```js
const 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
const 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>
```
# API
```js
const PeerId = require('peer-id')
```
## Create
### `new PeerId(id[, privKey, pubKey])`
- `id: Buffer` - The multihash of the publick key as `Buffer`
- `privKey: RsaPrivateKey` - The private key
- `pubKey: RsaPublicKey` - The public key
The key format is detailed in [libp2p-crypto](https://github.com/libp2p/js-libp2p-crypto).
### `create([opts])`
Generates a new Peer ID, complete with public/private keypair.
- `opts: Object`: Default: `{bits: 2048, keyType: 'rsa'}`
Returns `Promise<PeerId>`.
## Import
### `createFromHexString(str)`
Creates a Peer ID from hex string representing the key's multihash.
Returns `PeerId.
### `createFromBytes(buf)`
Creates a Peer ID from a buffer representing the key's multihash.
Returns `PeerId`.
### `createFromCID(cid)`
- `cid: CID|String|Buffer` - The multihash encoded as [CID](https://github.com/ipld/js-cid) (object, `String` or `Buffer`)
Creates a Peer ID from a CID representation of the key's multihash ([RFC 0001](https://github.com/libp2p/specs/blob/master/RFC/0001-text-peerid-cid.md)).
Returns `PeerId`.
### `createFromB58String(str)`
Creates a Peer ID from a Base58 string representing the key's multihash.
Returns `PeerId`.
### `createFromPubKey(pubKey)`
- `publicKey: Buffer`
Creates a Peer ID from a buffer containing a public key.
Returns `Promise<PeerId>`.
### `createFromPrivKey(privKey)`
- `privKey: Buffer`
Creates a Peer ID from a buffer containing a private key.
Returns `Promise<PeerId>`.
### `createFromJSON(obj)`
- `obj.id: String` - The multihash encoded in `base58`
- `obj.pubKey: String` - The public key in protobuf format, encoded in `base64`
- `obj.privKey: String` - The private key in protobuf format, encoded in `base64`
Returns `Promise<PeerId>`.
### `createFromProtobuf(buf)`
`buf` is a protocol-buffers encoded PeerId (see `marshal()`)
## Export
### `toHexString()`
Returns the Peer ID's `id` as a hex string.
```
id.pubKey // Buffer containing the Public Key
id.privKey // Buffer containing the Private Key
id.id // Buffer containing the multihash
1220d6243998f2fc56343ad7ed0342ab7886a4eb18d736f1b67d44b37fcc81e0f39f
```
### `toBytes()`
Returns the Peer ID's `id` as a buffer.
```
<Buffer 12 20 d6 24 39 98 f2 fc 56 34 3a d7 ed 03 42 ab 78 86 a4 eb 18 d7 36 f1 b6 7d 44 b3 7f cc 81 e0 f3 9f>
```
### `toString()`
Returns the Peer ID's `id` as a self-describing CIDv1 in Base32 ([RFC 0001](https://github.com/libp2p/specs/blob/master/RFC/0001-text-peerid-cid.md))
```
bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4
```
### `toB58String()`
Returns the Peer ID's `id` as a base58 string (multihash/CIDv0).
```
QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi
```
### `toJSON()`
Returns an `obj` of the form
- `obj.id: String` - The multihash encoded in `base58`
- `obj.pubKey: String` - The public key in protobuf format, encoded in 'base64'
- `obj.privKey: String` - The private key in protobuf format, encoded in 'base 64'
### `marshal(excludePrivateKey)`
Returns a protocol-buffers encoded version of the id, public key and, if `excludePrivateKey` is not set, the private key.
### `marshalPubKey()`
Returns a protobuf of just the public key, compatible with `libp2p-crypto` (unlike `marshal` above).
For example:
```js
const crypto = require('libp2p-crypto')
PeerId.create({ bits: 256, keyType: 'ed25519' }).then( pid => {
let pk = crypto.keys.unmarshalPublicKey(pid.marshalPubKey())
// your code here
}
```
### `toPrint()`
Returns the Peer ID as a printable string without the `Qm` prefix.
Example: `<peer.ID xxxxxx>`
### `equals(id)`
Returns `true` if the given PeerId is equal to the current instance.
- `id` can be a PeerId or a Buffer containing the id
### `isEqual(id)`
**Deprecation Notice**: Use [`equals`](#equalsid), `isEqual` will be removed in 0.14.0.
- `id` can be a PeerId or a Buffer containing the id
# License
MIT

View File

@ -1,39 +1,79 @@
{
"name": "peer-id",
"version": "0.3.4",
"version": "0.13.5",
"description": "IPFS Peer Id implementation in Node.js",
"leadMaintainer": "Vasco Santos <santos.vasco10@gmail.com>",
"main": "src/index.js",
"bin": "src/bin.js",
"scripts": {
"test": "./node_modules/.bin/lab tests/*-test.js",
"coverage": "./node_modules/.bin/lab -t 100 tests/*-test.js",
"codestyle": "./node_modules/.bin/standard --format",
"lint": "jshint .",
"validate": "npm ls"
"lint": "aegir lint",
"build": "aegir build",
"test": "aegir test",
"test:node": "aegir test -t node",
"test:browser": "aegir test -t browser -t webworker",
"release": "aegir release",
"release-minor": "aegir release --type minor",
"release-major": "aegir release --type major",
"coverage": "aegir coverage",
"size": "bundlesize -f dist/index.min.js -s 140kB"
},
"files": [
"src",
"dist"
],
"keywords": [
"IPFS"
],
"author": "David Dias <daviddias@ipfs.io>",
"license": "MIT",
"pre-commit": [
"codestyle",
"test"
],
"engines": {
"node": "^4.0.0"
"node": ">=10.0.0",
"npm": ">=6.0.0"
},
"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": {
"code": "^1.4.1",
"lab": "^5.13.0",
"pre-commit": "^1.1.1",
"standard": "^4.5.2"
"aegir": "^20.0.0",
"bundlesize": "~0.18.0",
"chai": "^4.2.0",
"dirty-chai": "^2.0.1"
},
"dependencies": {
"bs58": "^2.0.1",
"multihashing": "^0.1.3"
}
"cids": "~0.7.1",
"class-is": "^1.1.0",
"libp2p-crypto": "~0.17.0",
"multihashes": "~0.4.15",
"protons": "^1.0.1"
},
"repository": {
"type": "git",
"url": "https://github.com/libp2p/js-peer-id.git"
},
"contributors": [
"Arve Knudsen <arve.knudsen@gmail.com>",
"David Dias <daviddias.p@gmail.com>",
"David Dias <mail@daviddias.me>",
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
"Henrique Dias <hacdias@gmail.com>",
"Hugo Dias <hugomrdias@gmail.com>",
"Jacob Heun <jacobheun@gmail.com>",
"Maciej Krüger <mkg20001@gmail.com>",
"Marcin Rataj <lidel@lidel.org>",
"Michael Garvin <gar+gh@danger.computer>",
"Nate Foss <npfoss@gmail.com>",
"Pedro Teixeira <i@pgte.me>",
"Prashanth Chandra <coolshanth94@gmail.com>",
"Richard Littauer <richard.littauer@gmail.com>",
"Richard Schneider <makaretu@gmail.com>",
"Stephen Whitmore <stephen.whitmore@gmail.com>",
"Topper Bowers <topper@quorumcontrol.com>",
"Vasco Santos <vasco.santos@moxy.studio>",
"Vasco Santos <vasco.santos@ua.pt>",
"Yahya <ya7yaz@gmail.com>",
"greenkeeperio-bot <support@greenkeeper.io>",
"nginnever <ginneversource@gmail.com>",
"npmcdn-to-unpkg-bot <npmcdn-to-unpkg-bot@users.noreply.github.com>",
"ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>"
]
}

12
src/bin.js Executable file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env node
'use strict'
const PeerId = require('./index.js')
async function main () {
const id = await PeerId.create()
console.log(JSON.stringify(id.toJSON(), null, 2)) // eslint-disable-line no-console
}
main()

View File

@ -2,77 +2,341 @@
* Id is an object representation of a peer Id. a peer Id is a multihash
*/
var multihashing = require('multihashing')
var base58 = require('bs58')
var crypto = require('crypto')
'use strict'
exports = module.exports = Id
const mh = require('multihashes')
const CID = require('cids')
const cryptoKeys = require('libp2p-crypto/src/keys')
const assert = require('assert')
const withIs = require('class-is')
const { PeerIdProto } = require('./proto')
function Id (id, privKey, pubKey) {
var self = this
class PeerId {
constructor (id, privKey, pubKey) {
assert(Buffer.isBuffer(id), 'invalid id provided')
if (!(self instanceof Id)) {
throw new Error('Id must be called with new')
if (privKey && pubKey) {
assert(privKey.public.bytes.equals(pubKey.bytes), 'inconsistent arguments')
}
this._id = id
this._idB58String = mh.toB58String(this.id)
this._privKey = privKey
this._pubKey = pubKey
}
self.privKey = privKey
self.pubKey = pubKey
self.id = id // multihash - sha256 - buffer
get id () {
return this._id
}
// pretty print
set id (val) {
throw new Error('Id is immutable')
}
self.toPrint = function () {
get privKey () {
return this._privKey
}
set privKey (privKey) {
this._privKey = privKey
}
get pubKey () {
if (this._pubKey) {
return this._pubKey
}
if (this._privKey) {
return this._privKey.public
}
const decoded = mh.decode(this.id)
if (decoded.name === 'identity') {
this._pubKey = cryptoKeys.unmarshalPublicKey(decoded.digest)
return this._pubKey
}
}
set pubKey (pubKey) {
this._pubKey = pubKey
}
// Return the protobuf version of the public key, matching go ipfs formatting
marshalPubKey () {
if (this.pubKey) {
return cryptoKeys.marshalPublicKey(this.pubKey)
}
}
// Return the protobuf version of the private key, matching go ipfs formatting
marshalPrivKey () {
if (this.privKey) {
return cryptoKeys.marshalPrivateKey(this.privKey)
}
}
// Return the protobuf version of the peer-id
marshal (excludePriv) {
return PeerIdProto.encode({
id: this.toBytes(),
pubKey: this.marshalPubKey(),
privKey: excludePriv ? null : this.marshalPrivKey()
})
}
toPrint () {
let pid = this.toB58String()
// All sha256 nodes start with Qm
// We can skip the Qm to make the peer.ID more useful
if (pid.startsWith('Qm')) {
pid = pid.slice(2)
}
let maxRunes = 6
if (pid.length < maxRunes) {
maxRunes = pid.length
}
return '<peer.ID ' + pid.substr(0, maxRunes) + '>'
}
// return the jsonified version of the key, matching the formatting
// of go-ipfs for its config file
toJSON () {
return {
id: id.toHexString(),
privKey: privKey.toString('hex'),
pubKey: pubKey.toString('hex')
id: this.toB58String(),
privKey: toB64Opt(this.marshalPrivKey()),
pubKey: toB64Opt(this.marshalPubKey())
}
}
// encode/decode functions
self.toHexString = function () {
return self.id.toString('hex')
toHexString () {
return mh.toHexString(this.id)
}
self.toBytes = function () {
return self.id
toBytes () {
return this.id
}
self.toB58String = function () {
return base58.encode(self.id)
toB58String () {
return this._idB58String
}
// return self-describing String representation
// in default format from RFC 0001: https://github.com/libp2p/specs/pull/209
toString () {
if (!this._idCIDString) {
const cid = new CID(1, 'libp2p-key', this.id, 'base32')
this._idCIDString = cid.toBaseEncodedString('base32')
}
return this._idCIDString
}
/**
* Checks the equality of `this` peer against a given PeerId.
* @param {Buffer|PeerId} id
* @returns {boolean}
*/
equals (id) {
if (Buffer.isBuffer(id)) {
return this.id.equals(id)
} else if (id.id) {
return this.id.equals(id.id)
} else {
throw new Error('not valid Id')
}
}
/**
* Checks the equality of `this` peer against a given PeerId.
* @deprecated Use `.equals`
* @param {Buffer|PeerId} id
* @returns {boolean}
*/
isEqual (id) {
return this.equals(id)
}
/*
* Check if this PeerId instance is valid (privKey -> pubKey -> Id)
*/
isValid () {
// TODO: needs better checking
return Boolean(this.privKey &&
this.privKey.public &&
this.privKey.public.bytes &&
Buffer.isBuffer(this.pubKey.bytes) &&
this.privKey.public.bytes.equals(this.pubKey.bytes))
}
}
const PeerIdWithIs = withIs(PeerId, {
className: 'PeerId',
symbolName: '@libp2p/js-peer-id/PeerId'
})
exports = module.exports = PeerIdWithIs
const computeDigest = (pubKey) => {
if (pubKey.bytes.length <= 42) {
return mh.encode(pubKey.bytes, 'identity')
} else {
return pubKey.hash()
}
}
const computePeerId = async (privKey, pubKey) => {
const digest = await computeDigest(pubKey)
return new PeerIdWithIs(digest, privKey, pubKey)
}
// generation
exports.create = async (opts) => {
opts = opts || {}
opts.bits = opts.bits || 2048
opts.keyType = opts.keyType || 'RSA'
exports.create = function () {
var ecdh = crypto.createECDH('secp256k1')
ecdh.generateKeys()
var mhId = multihashing(ecdh.getPublicKey(), 'sha2-256')
return new Id(mhId, ecdh.getPrivateKey(), ecdh.getPublicKey())
const key = await cryptoKeys.generateKeyPair(opts.keyType, opts.bits)
return computePeerId(key, key.public)
}
exports.createFromHexString = function (str) {
return new Id(new Buffer(str), 'hex')
exports.createFromHexString = (str) => {
return new PeerIdWithIs(mh.fromHexString(str))
}
exports.createFromBytes = function (buf) {
return new Id(buf)
exports.createFromBytes = (buf) => {
return new PeerIdWithIs(buf)
}
exports.createFromB58String = function (str) {
return new Id(new Buffer(base58.decode(str)))
exports.createFromB58String = (str) => {
return exports.createFromCID(str) // B58String is CIDv0
}
exports.createFromPubKey = function (pubKey) {
var mhId = multihashing(pubKey, 'sha2-256')
return new Id(mhId, null, pubKey)
const validMulticodec = (cid) => {
// supported: 'libp2p-key' (CIDv1) and 'dag-pb' (CIDv0 converted to CIDv1)
return cid.codec === 'libp2p-key' || cid.codec === 'dag-pb'
}
exports.createFromPrivKey = function () {
// TODO(daviddias) derive PubKey from priv
exports.createFromCID = (cid) => {
cid = CID.isCID(cid) ? cid : new CID(cid)
if (!validMulticodec(cid)) throw new Error('Supplied PeerID CID has invalid multicodec: ' + cid.codec)
return new PeerIdWithIs(cid.multihash)
}
// Public Key input will be a buffer
exports.createFromPubKey = async (key) => {
let buf = key
if (typeof buf === 'string') {
buf = Buffer.from(key, 'base64')
}
if (!Buffer.isBuffer(buf)) {
throw new Error('Supplied key is neither a base64 string nor a buffer')
}
const pubKey = await cryptoKeys.unmarshalPublicKey(buf)
return computePeerId(null, pubKey)
}
// Private key input will be a string
exports.createFromPrivKey = async (key) => {
let buf = key
if (typeof buf === 'string') {
buf = Buffer.from(key, 'base64')
}
if (!Buffer.isBuffer(buf)) {
throw new Error('Supplied key is neither a base64 string nor a buffer')
}
const privKey = await cryptoKeys.unmarshalPrivateKey(buf)
return computePeerId(privKey, privKey.public)
}
exports.createFromJSON = async (obj) => {
const id = mh.fromB58String(obj.id)
const rawPrivKey = obj.privKey && Buffer.from(obj.privKey, 'base64')
const rawPubKey = obj.pubKey && Buffer.from(obj.pubKey, 'base64')
const pub = rawPubKey && await cryptoKeys.unmarshalPublicKey(rawPubKey)
if (!rawPrivKey) {
return new PeerIdWithIs(id, null, pub)
}
const privKey = await cryptoKeys.unmarshalPrivateKey(rawPrivKey)
const privDigest = await computeDigest(privKey.public)
let pubDigest
if (pub) {
pubDigest = await computeDigest(pub)
}
if (pub && !privDigest.equals(pubDigest)) {
throw new Error('Public and private key do not match')
}
if (id && !privDigest.equals(id)) {
throw new Error('Id and private key do not match')
}
return new PeerIdWithIs(id, privKey, pub)
}
exports.createFromProtobuf = async (buf) => {
if (typeof buf === 'string') {
buf = Buffer.from(buf, 'hex')
}
let { id, privKey, pubKey } = PeerIdProto.decode(buf)
privKey = privKey ? await cryptoKeys.unmarshalPrivateKey(privKey) : false
pubKey = pubKey ? await cryptoKeys.unmarshalPublicKey(pubKey) : false
let pubDigest
let privDigest
if (privKey) {
privDigest = await computeDigest(privKey.public)
}
if (pubKey) {
pubDigest = await computeDigest(pubKey)
}
if (privKey) {
if (pubKey) {
if (!privDigest.equals(pubDigest)) {
throw new Error('Public and private key do not match')
}
}
return new PeerIdWithIs(privDigest, privKey, privKey.public)
}
// TODO: val id and pubDigest
if (pubKey) {
return new PeerIdWithIs(pubDigest, null, pubKey)
}
if (id) {
return new PeerIdWithIs(id)
}
throw new Error('Protobuf did not contain any usable key material')
}
exports.isPeerId = (peerId) => {
return Boolean(typeof peerId === 'object' &&
peerId._id &&
peerId._idB58String)
}
function toB64Opt (val) {
if (val) {
return val.toString('base64')
}
}

12
src/proto.js Normal file
View File

@ -0,0 +1,12 @@
'use strict'
const protons = require('protons')
module.exports = protons(`
message PeerIdProto {
required bytes id = 1;
bytes pubKey = 2;
bytes privKey = 3;
}
`)

6
test/fixtures/go-private-key.js vendored Normal file
View 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='
}

8
test/fixtures/sample-id.js vendored Normal file
View File

@ -0,0 +1,8 @@
'use strict'
module.exports = {
id: '122019318b6e5e0cf93a2314bf01269a2cc23cd3dcd452d742cdb9379d8646f6e4a9',
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=',
marshaled: '0a22122019318b6e5e0cf93a2314bf01269a2cc23cd3dcd452d742cdb9379d8646f6e4a912ab02080012a60230820122300d06092a864886f70d01010105000382010f003082010a0282010100b648aa3f1cc1597819a5d401775e28f3af1adf417749ce378f05901b771a8a47531cea3b911d78a3e875d83e3940934d41845d52dcb9782f08b47001e18207f8e7bb0c839e545b278629e52fd2e720bc2a41c25479710d36d22d0c8338cf58e2d6ab5aedbd26cd7008b6644567ebe43611c1e8df052f591b4b78acfe0d94997f0d8f1030be0c63c93e5edff20ef3979e98ca69a6cc7f658992cdaf383faa2768914bf9bb5a5d1ab7292ee3cd79338393472a281f8e51bb8a8fd1928581020848dac9b24397ddbbea86a52fd82106d49e12fdb492e81ab53bd8cb9f74c05949924bf297e9cfc481f410460c28af5745696ef57627a127dba22c1cbfc3374a5b2302030100011aab09080012a609308204a20201000282010100b648aa3f1cc1597819a5d401775e28f3af1adf417749ce378f05901b771a8a47531cea3b911d78a3e875d83e3940934d41845d52dcb9782f08b47001e18207f8e7bb0c839e545b278629e52fd2e720bc2a41c25479710d36d22d0c8338cf58e2d6ab5aedbd26cd7008b6644567ebe43611c1e8df052f591b4b78acfe0d94997f0d8f1030be0c63c93e5edff20ef3979e98ca69a6cc7f658992cdaf383faa2768914bf9bb5a5d1ab7292ee3cd79338393472a281f8e51bb8a8fd1928581020848dac9b24397ddbbea86a52fd82106d49e12fdb492e81ab53bd8cb9f74c05949924bf297e9cfc481f410460c28af5745696ef57627a127dba22c1cbfc3374a5b2302030100010282010066d8eefdb70abca14fcf49a41e2689729c9ccbd4932a9868ae9093f37b2b055422e7d09d154e8c8fe68bff1b749023cc562809c3c3f7fd808427d27ead2f01b28584fb159412c26fb57a13eefccf1da02d337722d4765ddf4d8ccf5f86812f04a5dc7eec5e69f345c014b0d49c42f33b329fb6f58666659f49e0e7b25c1538d90bff5540cf02b2ec27ba864e12c5113b976344d8e9254873b30865357fbf19cd560a4a74b9020f58ac68ce0264ce5c36ca34a37fa88a2b010d5ba2fcc6a02c31de21886ad40a14ec72542c8ed4fb09613ec93be9196e105645113e2fb97ea693c447d6dd2c5c6cd6de42aca734efc87ec2e52bd394b53f52635e4ebca64dfe9102818100de2bc011d75dfbdccce26fabb3a631b380d44ccdd60db84c568f1cb1033cf9dcd011ef3acf1ef5ef7c8aa30d270b27835c44ed9375d85701f66838f547e64e0f24728b04f2ae5d9a56968a24080c84358efe3dde794bcafe6be32eb2b31a8183658dbe566d54e037c7207698a6f656db20596937a4996958cb40bdc9f13587eb02818100d20a1cc8b64a965f5d4236cb49f73272504db423b2eba720493601b582dbf3dd93144029f73f1c47b50ccdf67d4fd2649262cfa304a3eea12c982edd70c1ed74fe5a602f8ae4296537fe6d4ccadd2dbde27d59ca8787ab737006dbfdf5e95054ffa384960e299690f92e09bfbc8ffff6ca25e4d1afd3d9fdfacca32e66fba3a90281802e81ec10100c6d87d81fe28e87e9d767a3254dfa9cbf7c800672a8e7e92c9f8578ccf84e504343ea6120c8671d70395247436a943ecc0dd2ac593eeb21a4f55c381dfe3a07ef364af3ab49b9a731af8f62a29822f533478820df8acbffb021c276c4c83e615eae1d1f030db080eafa5d9e94f8f09bf53d57481d025dbeaf9d070281802edb0aa8cbe1bfc1ee7003013eb2e29215cfffcba6f2630a14caf37ea67ea2dc5f1f39612342f4f01a378d0adbd19ec1c8d63a33c7a93a66c22800ec6d6715adefc0018d1992e4992bf09a397357fc084c2a628987ca8038f458d362c8251042a5f4b873311d9df521615fd362214d9ca463e7b3cf619753cd4b316bfc954e610281806beec9501236f93a79f99999c60e1fbbd81c4b35d83006484ed0e09da5d212aa4d05d0fc5bcb6d8314e297644a62c88f5760fd42f303e226c4a11a6db213004f5979ebad9356733695b826d71eb664590a200431b71c65cd754e0c0160b28989728a7201a4fa68009652ce918b9966cc5a1dbcf91252e80417e8a1eb2b5a36bb'
}

353
test/peer-id.spec.js Normal file
View File

@ -0,0 +1,353 @@
/* eslint max-nested-callbacks: ["error", 8] */
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
chai.use(dirtyChai)
const expect = chai.expect
const crypto = require('libp2p-crypto')
const mh = require('multihashes')
const CID = require('cids')
const PeerId = require('../src')
const util = require('util')
const testId = require('./fixtures/sample-id')
const testIdHex = testId.id
const testIdBytes = mh.fromHexString(testId.id)
const testIdB58String = mh.toB58String(testIdBytes)
const testIdCID = new CID(1, 'libp2p-key', testIdBytes)
const testIdCIDString = testIdCID.toBaseEncodedString('base32')
const goId = require('./fixtures/go-private-key')
// Test options for making PeerId.create faster
// INSECURE, only use when testing
const testOpts = {
bits: 512
}
describe('PeerId', () => {
it('create an id without \'new\'', () => {
expect(PeerId).to.throw(Error)
})
it('create a new id', async () => {
const id = await PeerId.create(testOpts)
expect(id.toB58String().length).to.equal(46)
})
it('can be created for a Secp256k1 key', async () => {
const id = await PeerId.create({ keyType: 'secp256k1', bits: 256 })
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
})
it('can get the public key from a Secp256k1 key', async () => {
const original = await PeerId.create({ keyType: 'secp256k1', bits: 256 })
const newId = PeerId.createFromB58String(original.toB58String())
expect(original.pubKey.bytes).to.eql(newId.pubKey.bytes)
})
it('isPeerId', async () => {
const id = await PeerId.create(testOpts)
expect(PeerId.isPeerId(id)).to.equal(true)
expect(PeerId.isPeerId('aaa')).to.equal(false)
expect(PeerId.isPeerId(Buffer.from('batatas'))).to.equal(false)
})
it('throws on changing the id', async () => {
const id = await PeerId.create(testOpts)
expect(id.toB58String().length).to.equal(46)
expect(() => {
id.id = Buffer.from('hello')
}).to.throw(/immutable/)
})
it('recreate from Hex string', () => {
const id = PeerId.createFromHexString(testIdHex)
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from a Buffer', () => {
const id = PeerId.createFromBytes(testIdBytes)
expect(testId.id).to.equal(id.toHexString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from a B58 String', () => {
const id = PeerId.createFromB58String(testIdB58String)
expect(testIdB58String).to.equal(id.toB58String())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from CID object', () => {
const id = PeerId.createFromCID(testIdCID)
expect(testIdCIDString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from Base58 String (CIDv0))', () => {
const id = PeerId.createFromCID(testIdB58String)
expect(testIdCIDString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from CIDv1 Base32 (libp2p-key multicodec)', () => {
const cid = new CID(1, 'libp2p-key', testIdBytes)
const cidString = cid.toBaseEncodedString('base32')
const id = PeerId.createFromCID(cidString)
expect(cidString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from CIDv1 Base32 (dag-pb multicodec)', () => {
const cid = new CID(1, 'dag-pb', testIdBytes)
const cidString = cid.toBaseEncodedString('base32')
const id = PeerId.createFromCID(cidString)
// toString should return CID with multicodec set to libp2p-key
expect(new CID(id.toString()).codec).to.equal('libp2p-key')
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from CID Buffer', () => {
const id = PeerId.createFromCID(testIdCID.buffer)
expect(testIdCIDString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('throws on invalid CID multicodec', () => {
// only libp2p and dag-pb are supported
const invalidCID = new CID(1, 'raw', testIdBytes).toBaseEncodedString('base32')
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/Supplied PeerID CID has invalid multicodec: raw/)
})
it('throws on invalid CID value', () => {
// using function code that does not represent valid hash function
// https://github.com/multiformats/js-multihash/blob/b85999d5768bf06f1b0f16b926ef2cb6d9c14265/src/constants.js#L345
const invalidCID = 'QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L'
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/multihash unknown function code: 0x50/)
})
it('throws on invalid CID object', () => {
const invalidCID = {}
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/Invalid version, must be a number equal to 1 or 0/)
})
it('throws on invalid CID object', () => {
const invalidCID = {}
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/Invalid version, must be a number equal to 1 or 0/)
})
it('recreate from a Public Key', async () => {
const id = await PeerId.createFromPubKey(testId.pubKey)
expect(testIdB58String).to.equal(id.toB58String())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from a Private Key', async () => {
const id = await PeerId.createFromPrivKey(testId.privKey)
expect(testIdB58String).to.equal(id.toB58String())
const encoded = Buffer.from(testId.privKey, 'base64')
const id2 = await PeerId.createFromPrivKey(encoded)
expect(testIdB58String).to.equal(id2.toB58String())
expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey())
})
it('recreate from Protobuf', async () => {
const id = await PeerId.createFromProtobuf(testId.marshaled)
expect(testIdB58String).to.equal(id.toB58String())
const encoded = Buffer.from(testId.privKey, 'base64')
const id2 = await PeerId.createFromPrivKey(encoded)
expect(testIdB58String).to.equal(id2.toB58String())
expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey())
expect(id.marshal().toString('hex')).to.deep.equal(testId.marshaled)
})
it('can be created from a Secp256k1 public key', async () => {
const privKey = await crypto.keys.generateKeyPair('secp256k1', 256)
const id = await PeerId.createFromPubKey(privKey.public.bytes)
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
})
it('can be created from a Secp256k1 private key', async () => {
const privKey = await crypto.keys.generateKeyPair('secp256k1', 256)
const id = await PeerId.createFromPrivKey(privKey.bytes)
const expB58 = mh.toB58String(mh.encode(id.pubKey.bytes, 'identity'))
expect(id.toB58String()).to.equal(expB58)
})
it('Compare generated ID with one created from PubKey', async () => {
const id1 = await PeerId.create(testOpts)
const id2 = await PeerId.createFromPubKey(id1.marshalPubKey())
expect(id1.id).to.be.eql(id2.id)
})
it('Works with default options', async function () {
this.timeout(10000)
const id = await PeerId.create()
expect(id.toB58String().length).to.equal(46)
})
it('Non-default # of bits', async function () {
this.timeout(1000 * 60)
const shortId = await PeerId.create(testOpts)
const longId = await PeerId.create({ bits: 1024 })
expect(shortId.privKey.bytes.length).is.below(longId.privKey.bytes.length)
})
it('Pretty printing', async () => {
const id1 = await PeerId.create(testOpts)
const id2 = await PeerId.createFromPrivKey((id1.toJSON()).privKey)
expect(id1.toPrint()).to.be.eql(id2.toPrint())
expect(id1.toPrint()).to.equal('<peer.ID ' + id1.toB58String().substr(2, 6) + '>')
})
it('toBytes', () => {
const id = PeerId.createFromHexString(testIdHex)
expect(id.toBytes().toString('hex')).to.equal(testIdBytes.toString('hex'))
})
it('isEqual', async () => {
const ids = await Promise.all([
PeerId.create(testOpts),
PeerId.create(testOpts)
])
expect(ids[0].isEqual(ids[0])).to.equal(true)
expect(ids[0].isEqual(ids[1])).to.equal(false)
expect(ids[0].isEqual(ids[0].id)).to.equal(true)
expect(ids[0].isEqual(ids[1].id)).to.equal(false)
})
it('equals', async () => {
const ids = await Promise.all([
PeerId.create(testOpts),
PeerId.create(testOpts)
])
expect(ids[0].equals(ids[0])).to.equal(true)
expect(ids[0].equals(ids[1])).to.equal(false)
expect(ids[0].equals(ids[0].id)).to.equal(true)
expect(ids[0].equals(ids[1].id)).to.equal(false)
})
describe('fromJSON', () => {
it('full node', async () => {
const id = await PeerId.create(testOpts)
const other = await PeerId.createFromJSON(id.toJSON())
expect(id.toB58String()).to.equal(other.toB58String())
expect(id.privKey.bytes).to.eql(other.privKey.bytes)
expect(id.pubKey.bytes).to.eql(other.pubKey.bytes)
})
it('only id', async () => {
const key = await crypto.keys.generateKeyPair('RSA', 1024)
const digest = await key.public.hash()
const id = PeerId.createFromBytes(digest)
expect(id.privKey).to.not.exist()
expect(id.pubKey).to.not.exist()
const other = await PeerId.createFromJSON(id.toJSON())
expect(id.toB58String()).to.equal(other.toB58String())
})
it('go interop', async () => {
const id = await PeerId.createFromJSON(goId)
const digest = await id.privKey.public.hash()
expect(mh.toB58String(digest)).to.eql(goId.id)
})
})
it('set privKey (valid)', async () => {
const peerId = await PeerId.create(testOpts)
peerId.privKey = peerId._privKey
expect(peerId.isValid()).to.equal(true)
})
it('set pubKey (valid)', async () => {
const peerId = await PeerId.create(testOpts)
peerId.pubKey = peerId._pubKey
expect(peerId.isValid()).to.equal(true)
})
it('set privKey (invalid)', async () => {
const peerId = await PeerId.create(testOpts)
peerId.privKey = Buffer.from('bufff')
expect(peerId.isValid()).to.equal(false)
})
it('set pubKey (invalid)', async () => {
const peerId = await PeerId.create(testOpts)
peerId.pubKey = Buffer.from('bufff')
expect(peerId.isValid()).to.equal(false)
})
describe('returns error via cb instead of crashing', () => {
const garbage = [
Buffer.from('00010203040506070809', 'hex'),
{}, null, false, undefined, true, 1, 0,
Buffer.from(''), 'aGVsbG93b3JsZA==', 'helloworld', ''
]
const fncs = ['createFromPubKey', 'createFromPrivKey', 'createFromJSON', 'createFromProtobuf']
for (const gb of garbage) {
for (const fn of fncs) {
it(`${fn} (${util.inspect(gb)})`, async () => {
try {
await PeerId[fn](gb)
} catch (err) {
expect(err).to.exist()
}
})
}
}
})
describe('throws on inconsistent data', () => {
let k1
let k2
let k3
before(async () => {
const keys = await Promise.all([
crypto.keys.generateKeyPair('RSA', 512),
crypto.keys.generateKeyPair('RSA', 512),
crypto.keys.generateKeyPair('RSA', 512)
])
k1 = keys[0]
k2 = keys[1]
k3 = keys[2]
})
it('missmatch private - public key', async () => {
const digest = await k1.public.hash()
expect(() => {
new PeerId(digest, k1, k2.public) // eslint-disable-line no-new
}).to.throw(/inconsistent arguments/)
})
it('missmatch id - private - public key', async () => {
const digest = await k1.public.hash()
expect(() => {
new PeerId(digest, k1, k3.public) // eslint-disable-line no-new
}).to.throw(/inconsistent arguments/)
})
it('invalid id', () => {
expect(() => new PeerId('hello world')).to.throw(/invalid id/)
})
})
})

View File