2016-05-19 18:47:48 +02:00
|
|
|
'use strict'
|
|
|
|
|
2017-07-22 10:57:27 -07:00
|
|
|
const protobuf = require('protocol-buffers')
|
|
|
|
const pbm = protobuf(require('./keys.proto'))
|
|
|
|
|
|
|
|
const keys = exports.keys = require('./keys')
|
|
|
|
|
|
|
|
exports = module.exports
|
|
|
|
|
|
|
|
exports.pbm = pbm
|
|
|
|
|
|
|
|
function isValidKeyType (keyType) {
|
|
|
|
const key = keys[keyType.toLowerCase()]
|
|
|
|
return key !== undefined
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.keyStretcher = require('./key-stretcher')
|
|
|
|
exports.generateEphemeralKeyPair = require('./ephemeral-keys')
|
|
|
|
|
|
|
|
// Generates a keypair of the given type and bitsize
|
|
|
|
exports.generateKeyPair = (type, bits, cb) => {
|
|
|
|
let key = keys[type.toLowerCase()]
|
|
|
|
|
|
|
|
if (!key) {
|
|
|
|
return cb(new Error('invalid or unsupported key type'))
|
|
|
|
}
|
|
|
|
|
|
|
|
key.generateKeyPair(bits, cb)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Generates a keypair of the given type and bitsize
|
|
|
|
// seed is a 32 byte uint8array
|
|
|
|
exports.generateKeyPairFromSeed = (type, seed, bits, cb) => {
|
|
|
|
let key = keys[type.toLowerCase()]
|
|
|
|
if (!key) {
|
|
|
|
return cb(new Error('invalid or unsupported key type'))
|
|
|
|
}
|
|
|
|
if (type.toLowerCase() !== 'ed25519') {
|
|
|
|
return cb(new Error('Seed key derivation is unimplemented for RSA or secp256k1'))
|
|
|
|
}
|
|
|
|
key.generateKeyPairFromSeed(seed, bits, cb)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Converts a protobuf serialized public key into its
|
|
|
|
// representative object
|
|
|
|
exports.unmarshalPublicKey = (buf) => {
|
|
|
|
const decoded = pbm.PublicKey.decode(buf)
|
|
|
|
|
|
|
|
switch (decoded.Type) {
|
|
|
|
case pbm.KeyType.RSA:
|
|
|
|
return keys.rsa.unmarshalRsaPublicKey(decoded.Data)
|
|
|
|
case pbm.KeyType.Ed25519:
|
|
|
|
return keys.ed25519.unmarshalEd25519PublicKey(decoded.Data)
|
|
|
|
case pbm.KeyType.Secp256k1:
|
|
|
|
if (keys.secp256k1) {
|
|
|
|
return keys.secp256k1.unmarshalSecp256k1PublicKey(decoded.Data)
|
|
|
|
} else {
|
|
|
|
throw new Error('secp256k1 support requires libp2p-crypto-secp256k1 package')
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
throw new Error('invalid or unsupported key type')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Converts a public key object into a protobuf serialized public key
|
|
|
|
exports.marshalPublicKey = (key, type) => {
|
|
|
|
type = (type || 'rsa').toLowerCase()
|
|
|
|
if (!isValidKeyType(type)) {
|
|
|
|
throw new Error('invalid or unsupported key type')
|
|
|
|
}
|
|
|
|
|
|
|
|
return key.bytes
|
|
|
|
}
|
|
|
|
|
|
|
|
// Converts a protobuf serialized private key into its
|
|
|
|
// representative object
|
|
|
|
exports.unmarshalPrivateKey = (buf, callback) => {
|
|
|
|
const decoded = pbm.PrivateKey.decode(buf)
|
|
|
|
|
|
|
|
switch (decoded.Type) {
|
|
|
|
case pbm.KeyType.RSA:
|
|
|
|
return keys.rsa.unmarshalRsaPrivateKey(decoded.Data, callback)
|
|
|
|
case pbm.KeyType.Ed25519:
|
|
|
|
return keys.ed25519.unmarshalEd25519PrivateKey(decoded.Data, callback)
|
|
|
|
case pbm.KeyType.Secp256k1:
|
|
|
|
if (keys.secp256k1) {
|
|
|
|
return keys.secp256k1.unmarshalSecp256k1PrivateKey(decoded.Data, callback)
|
|
|
|
} else {
|
|
|
|
return callback(new Error('secp256k1 support requires libp2p-crypto-secp256k1 package'))
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
callback(new Error('invalid or unsupported key type'))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Converts a private key object into a protobuf serialized private key
|
|
|
|
exports.marshalPrivateKey = (key, type) => {
|
|
|
|
type = (type || 'rsa').toLowerCase()
|
|
|
|
if (!isValidKeyType(type)) {
|
|
|
|
throw new Error('invalid or unsupported key type')
|
|
|
|
}
|
|
|
|
|
|
|
|
return key.bytes
|
2017-02-04 04:23:38 -05:00
|
|
|
}
|