mirror of
https://github.com/fluencelabs/js-libp2p-crypto
synced 2025-03-15 15:10:59 +00:00
refactor: make rsa key generation sync
This commit is contained in:
parent
fba4d3cc0f
commit
1270f3e37e
@ -18,11 +18,10 @@ needed for libp2p. This is based on this [go implementation](https://github.com/
|
|||||||
|
|
||||||
## API
|
## API
|
||||||
|
|
||||||
### `generateKeyPair(type, bits, cb)`
|
### `generateKeyPair(type, bits)`
|
||||||
|
|
||||||
- `type: String`, only `'RSA'` is currently supported
|
- `type: String`, only `'RSA'` is currently supported
|
||||||
- `bits: Number`
|
- `bits: Number`
|
||||||
- `cb: Function`, with the signature `function (err, privateKey)`
|
|
||||||
|
|
||||||
Generates a keypair of the given type and bitsize.
|
Generates a keypair of the given type and bitsize.
|
||||||
|
|
||||||
|
@ -12,13 +12,13 @@ exports.keyStretcher = require('./key-stretcher')
|
|||||||
exports.generateEphemeralKeyPair = require('./ephemeral-keys')
|
exports.generateEphemeralKeyPair = require('./ephemeral-keys')
|
||||||
|
|
||||||
// Generates a keypair of the given type and bitsize
|
// Generates a keypair of the given type and bitsize
|
||||||
exports.generateKeyPair = (type, bits, cb) => {
|
exports.generateKeyPair = (type, bits) => {
|
||||||
let key = keys[type.toLowerCase()]
|
let key = keys[type.toLowerCase()]
|
||||||
if (!key) {
|
if (!key) {
|
||||||
throw new Error('invalid or unsupported key type')
|
throw new Error('invalid or unsupported key type')
|
||||||
}
|
}
|
||||||
|
|
||||||
key.generateKeyPair(bits, cb)
|
return key.generateKeyPair(bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Converts a protobuf serialized public key into its
|
// Converts a protobuf serialized public key into its
|
||||||
|
@ -55,7 +55,11 @@ class RsaPublicKey {
|
|||||||
class RsaPrivateKey {
|
class RsaPrivateKey {
|
||||||
constructor (privKey, pubKey) {
|
constructor (privKey, pubKey) {
|
||||||
this._privateKey = privKey
|
this._privateKey = privKey
|
||||||
this._publicKey = pubKey
|
if (pubKey) {
|
||||||
|
this._publicKey = pubKey
|
||||||
|
} else {
|
||||||
|
this._publicKey = forge.pki.setRsaPublicKey(privKey.n, privKey.e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
genSecret () {
|
genSecret () {
|
||||||
@ -123,15 +127,9 @@ function unmarshalRsaPublicKey (bytes) {
|
|||||||
return new RsaPublicKey(key)
|
return new RsaPublicKey(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateKeyPair (bits, cb) {
|
function generateKeyPair (bits) {
|
||||||
rsa.generateKeyPair({
|
const p = rsa.generateKeyPair({bits})
|
||||||
bits,
|
return new RsaPrivateKey(p.privateKey, p.publicKey)
|
||||||
workerScript: utils.workerScript
|
|
||||||
}, (err, p) => {
|
|
||||||
if (err) return cb(err)
|
|
||||||
|
|
||||||
cb(null, new RsaPrivateKey(p.privateKey, p.publicKey))
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
32
src/utils.js
32
src/utils.js
@ -1,40 +1,8 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const multihashing = require('multihashing')
|
const multihashing = require('multihashing')
|
||||||
const path = require('path')
|
|
||||||
const fs = require('fs')
|
|
||||||
|
|
||||||
const URL = global.window && (window.URL || window.webkitURL)
|
|
||||||
|
|
||||||
// Hashes a key
|
// Hashes a key
|
||||||
exports.keyHash = (bytes) => {
|
exports.keyHash = (bytes) => {
|
||||||
return multihashing(bytes, 'sha2-256')
|
return multihashing(bytes, 'sha2-256')
|
||||||
}
|
}
|
||||||
|
|
||||||
const toBlob = (content) => {
|
|
||||||
try {
|
|
||||||
let blob
|
|
||||||
try {
|
|
||||||
// BlobBuilder = Deprecated, but widely implemented
|
|
||||||
const BlobBuilder = global.window &&
|
|
||||||
(window.BlobBuilder ||
|
|
||||||
window.WebKitBlobBuilder ||
|
|
||||||
window.MozBlobBuilder ||
|
|
||||||
window.MSBlobBuilder)
|
|
||||||
|
|
||||||
blob = new BlobBuilder()
|
|
||||||
blob.append(content)
|
|
||||||
blob = blob.getBlob()
|
|
||||||
} catch (e) {
|
|
||||||
// The proposed API
|
|
||||||
blob = new window.Blob([content])
|
|
||||||
}
|
|
||||||
return URL.createObjectURL(blob)
|
|
||||||
} catch (e) {
|
|
||||||
return 'data:application/javascript,' + encodeURIComponent(content)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const rawScript = fs.readFileSync(path.join(__dirname, '../vendor/prime.worker.js'))
|
|
||||||
|
|
||||||
exports.workerScript = toBlob(rawScript.toString())
|
|
||||||
|
@ -8,12 +8,8 @@ const fixtures = require('./fixtures/go-key-rsa')
|
|||||||
|
|
||||||
describe('libp2p-crypto', () => {
|
describe('libp2p-crypto', () => {
|
||||||
let key
|
let key
|
||||||
before((done) => {
|
before(() => {
|
||||||
crypto.generateKeyPair('RSA', 2048, (err, _key) => {
|
key = crypto.generateKeyPair('RSA', 2048)
|
||||||
if (err) return done(err)
|
|
||||||
key = _key
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('marshalPublicKey and unmarshalPublicKey', () => {
|
it('marshalPublicKey and unmarshalPublicKey', () => {
|
||||||
|
@ -8,12 +8,8 @@ const rsa = crypto.keys.rsa
|
|||||||
|
|
||||||
describe('RSA', () => {
|
describe('RSA', () => {
|
||||||
let key
|
let key
|
||||||
before((done) => {
|
before(() => {
|
||||||
crypto.generateKeyPair('RSA', 2048, (err, _key) => {
|
key = crypto.generateKeyPair('RSA', 2048)
|
||||||
if (err) return done(err)
|
|
||||||
key = _key
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('generates a valid key', () => {
|
it('generates a valid key', () => {
|
||||||
@ -80,36 +76,32 @@ describe('RSA', () => {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('not equals other key', (done) => {
|
it('not equals other key', () => {
|
||||||
crypto.generateKeyPair('RSA', 2048, (err, key2) => {
|
const key2 = crypto.generateKeyPair('RSA', 2048)
|
||||||
if (err) return done(err)
|
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
key.equals(key2)
|
key.equals(key2)
|
||||||
).to.be.eql(
|
).to.be.eql(
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
key2.equals(key)
|
key2.equals(key)
|
||||||
).to.be.eql(
|
).to.be.eql(
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
key.public.equals(key2.public)
|
key.public.equals(key2.public)
|
||||||
).to.be.eql(
|
).to.be.eql(
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
key2.public.equals(key.public)
|
key2.public.equals(key.public)
|
||||||
).to.be.eql(
|
).to.be.eql(
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
1486
vendor/prime.worker.js
vendored
1486
vendor/prime.worker.js
vendored
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user