1
0
mirror of https://github.com/fluencelabs/js-libp2p-crypto synced 2025-04-02 19:11:16 +00:00

148 lines
3.2 KiB
JavaScript
Raw Normal View History

2016-05-19 21:45:43 +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)
const Buffer = require('safe-buffer').Buffer
2016-05-19 21:45:43 +02:00
2017-07-22 10:57:27 -07:00
const crypto = require('../../src')
const rsa = crypto.keys.keys.rsa
const fixtures = require('../fixtures/go-key-rsa')
2016-05-19 21:45:43 +02:00
describe('RSA', () => {
let key
2017-07-22 10:57:27 -07:00
before((done) => {
2017-07-22 10:57:27 -07:00
crypto.keys.generateKeyPair('RSA', 2048, (err, _key) => {
if (err) {
return done(err)
}
key = _key
done()
})
2016-05-19 21:45:43 +02:00
})
it('generates a valid key', (done) => {
2017-07-22 10:57:27 -07:00
expect(key).to.be.an.instanceof(rsa.RsaPrivateKey)
2016-05-19 21:45:43 +02:00
key.hash((err, digest) => {
if (err) {
return done(err)
}
expect(digest).to.have.length(34)
done()
})
2016-05-19 21:45:43 +02:00
})
it('signs', (done) => {
2016-05-19 21:45:43 +02:00
const text = key.genSecret()
key.sign(text, (err, sig) => {
if (err) {
return done(err)
}
key.public.verify(text, sig, (err, res) => {
if (err) {
return done(err)
}
expect(res).to.be.eql(true)
done()
})
})
2016-05-19 21:45:43 +02:00
})
it('encoding', (done) => {
2016-05-19 21:45:43 +02:00
const keyMarshal = key.marshal()
rsa.unmarshalRsaPrivateKey(keyMarshal, (err, key2) => {
if (err) {
return done(err)
}
const keyMarshal2 = key2.marshal()
2016-05-19 21:45:43 +02:00
2017-07-22 10:57:27 -07:00
expect(keyMarshal).to.eql(keyMarshal2)
2016-05-19 21:45:43 +02:00
const pk = key.public
const pkMarshal = pk.marshal()
const pk2 = rsa.unmarshalRsaPublicKey(pkMarshal)
const pkMarshal2 = pk2.marshal()
2016-05-19 21:45:43 +02:00
2017-07-22 10:57:27 -07:00
expect(pkMarshal).to.eql(pkMarshal2)
done()
})
2016-05-19 21:45:43 +02:00
})
describe('key equals', () => {
it('equals itself', () => {
2017-07-22 10:57:27 -07:00
expect(key.equals(key)).to.eql(true)
expect(key.public.equals(key.public)).to.eql(true)
2016-05-19 21:45:43 +02:00
})
it('not equals other key', (done) => {
2017-07-22 10:57:27 -07:00
crypto.keys.generateKeyPair('RSA', 2048, (err, key2) => {
if (err) {
return done(err)
}
expect(key.equals(key2)).to.eql(false)
expect(key2.equals(key)).to.eql(false)
expect(key.public.equals(key2.public)).to.eql(false)
expect(key2.public.equals(key.public)).to.eql(false)
done()
})
2016-05-19 21:45:43 +02:00
})
})
it('sign and verify', (done) => {
const data = Buffer.from('hello world')
key.sign(data, (err, sig) => {
if (err) {
return done(err)
}
key.public.verify(data, sig, (err, valid) => {
if (err) {
return done(err)
}
expect(valid).to.be.eql(true)
done()
})
})
})
it('fails to verify for different data', (done) => {
const data = Buffer.from('hello world')
key.sign(data, (err, sig) => {
if (err) {
return done(err)
}
key.public.verify(Buffer.from('hello'), sig, (err, valid) => {
if (err) {
return done(err)
}
expect(valid).to.be.eql(false)
done()
})
})
})
describe('go interop', () => {
it('verifies with data from go', (done) => {
2017-07-22 10:57:27 -07:00
const key = crypto.keys.unmarshalPublicKey(fixtures.verify.publicKey)
key.verify(fixtures.verify.data, fixtures.verify.signature, (err, ok) => {
if (err) throw err
2017-03-21 15:05:22 +00:00
expect(err).to.not.exist()
expect(ok).to.equal(true)
done()
})
})
})
2016-05-19 21:45:43 +02:00
})