js-libp2p-crypto/test/crypto.spec.js

151 lines
4.3 KiB
JavaScript
Raw Normal View History

/* eslint max-nested-callbacks: ["error", 8] */
2016-05-19 18:47:48 +02:00
/* eslint-env mocha */
'use strict'
2017-03-21 15:05:22 +00:00
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
2016-05-19 18:47:48 +02:00
const crypto = require('../src')
2016-05-20 14:41:25 +02:00
const fixtures = require('./fixtures/go-key-rsa')
2016-05-19 18:47:48 +02:00
describe('libp2p-crypto', function () {
this.timeout(20 * 1000)
2016-05-19 21:45:43 +02:00
let key
before((done) => {
2018-01-28 07:54:04 +13:00
crypto.keys.generateKeyPair('RSA', 512, (err, _key) => {
if (err) {
return done(err)
}
key = _key
done()
})
2016-05-19 21:45:43 +02:00
})
2016-05-19 20:18:31 +02:00
2016-05-19 21:45:43 +02:00
it('marshalPublicKey and unmarshalPublicKey', () => {
2017-07-22 10:57:27 -07:00
const key2 = crypto.keys.unmarshalPublicKey(
crypto.keys.marshalPublicKey(key.public))
2016-05-19 20:18:31 +02:00
2016-05-19 21:45:43 +02:00
expect(key2.equals(key.public)).to.be.eql(true)
expect(() => {
2017-07-22 10:57:27 -07:00
crypto.keys.marshalPublicKey(key.public, 'invalid-key-type')
}).to.throw()
2016-05-19 21:45:43 +02:00
})
2016-05-19 20:18:31 +02:00
it('marshalPrivateKey and unmarshalPrivateKey', (done) => {
expect(() => {
2017-07-22 10:57:27 -07:00
crypto.keys.marshalPrivateKey(key, 'invalid-key-type')
}).to.throw()
2017-07-22 10:57:27 -07:00
crypto.keys.unmarshalPrivateKey(crypto.keys.marshalPrivateKey(key), (err, key2) => {
if (err) {
return done(err)
}
2016-05-19 18:47:48 +02:00
expect(key2.equals(key)).to.be.eql(true)
expect(key2.public.equals(key.public)).to.be.eql(true)
done()
})
2016-05-19 18:47:48 +02:00
})
2016-05-20 14:41:25 +02:00
// marshalled keys seem to be slightly different
// unsure as to if this is just a difference in encoding
// or a bug
2016-05-20 14:41:25 +02:00
describe('go interop', () => {
it('unmarshals private key', (done) => {
2017-07-22 10:57:27 -07:00
crypto.keys.unmarshalPrivateKey(fixtures.private.key, (err, key) => {
if (err) {
return done(err)
}
const hash = fixtures.private.hash
2017-07-22 10:57:27 -07:00
expect(fixtures.private.key).to.eql(key.bytes)
2016-05-20 14:41:25 +02:00
key.hash((err, digest) => {
if (err) {
return done(err)
}
2017-07-22 10:57:27 -07:00
expect(digest).to.eql(hash)
done()
})
})
2016-05-20 14:41:25 +02:00
})
it('unmarshals public key', (done) => {
2017-07-22 10:57:27 -07:00
const key = crypto.keys.unmarshalPublicKey(fixtures.public.key)
2016-05-20 14:41:25 +02:00
const hash = fixtures.public.hash
2017-07-22 10:57:27 -07:00
expect(crypto.keys.marshalPublicKey(key)).to.eql(fixtures.public.key)
key.hash((err, digest) => {
if (err) {
return done(err)
}
2017-07-22 10:57:27 -07:00
expect(digest).to.eql(hash)
done()
})
2016-05-20 14:41:25 +02:00
})
it('unmarshal -> marshal, private key', (done) => {
2017-07-22 10:57:27 -07:00
crypto.keys.unmarshalPrivateKey(fixtures.private.key, (err, key) => {
if (err) {
return done(err)
}
2017-07-22 10:57:27 -07:00
const marshalled = crypto.keys.marshalPrivateKey(key)
expect(marshalled).to.eql(fixtures.private.key)
done()
})
2016-05-20 14:41:25 +02:00
})
it('unmarshal -> marshal, public key', () => {
2017-07-22 10:57:27 -07:00
const key = crypto.keys.unmarshalPublicKey(fixtures.public.key)
const marshalled = crypto.keys.marshalPublicKey(key)
expect(fixtures.public.key.equals(marshalled)).to.eql(true)
2016-05-20 14:41:25 +02:00
})
})
describe('pbkdf2', () => {
it('generates a derived password using sha1', () => {
const p1 = crypto.pbkdf2('password', 'at least 16 character salt', 500, 512 / 8, 'sha1')
expect(p1).to.exist()
expect(p1).to.be.a('string')
})
it('generates a derived password using sha2-512', () => {
const p1 = crypto.pbkdf2('password', 'at least 16 character salt', 500, 512 / 8, 'sha2-512')
expect(p1).to.exist()
expect(p1).to.be.a('string')
})
it('generates the same derived password with the same options', () => {
const p1 = crypto.pbkdf2('password', 'at least 16 character salt', 10, 512 / 8, 'sha1')
const p2 = crypto.pbkdf2('password', 'at least 16 character salt', 10, 512 / 8, 'sha1')
const p3 = crypto.pbkdf2('password', 'at least 16 character salt', 11, 512 / 8, 'sha1')
expect(p2).to.equal(p1)
expect(p3).to.not.equal(p2)
})
it('throws on invalid hash name', () => {
expect(() => crypto.pbkdf2('password', 'at least 16 character salt', 500, 512 / 8, 'shaX-xxx')).to.throw()
})
})
describe('randomBytes', () => {
it('throws with no number passed', () => {
expect(() => {
crypto.randomBytes()
}).to.throw()
})
it('generates different random things', () => {
const buf1 = crypto.randomBytes(10)
expect(buf1.length).to.equal(10)
const buf2 = crypto.randomBytes(10)
expect(buf1).to.not.eql(buf2)
})
2016-05-20 14:41:25 +02:00
})
2016-05-19 18:47:48 +02:00
})