1
0
mirror of https://github.com/fluencelabs/js-libp2p-crypto synced 2025-04-27 09:32:30 +00:00

115 lines
3.3 KiB
JavaScript
Raw Normal View History

2016-05-19 18:47:48 +02:00
'use strict'
2016-05-19 21:45:43 +02:00
const protobuf = require('protocol-buffers')
const pbm = protobuf(require('./crypto.proto'))
const c = require('./crypto')
2016-05-19 21:45:43 +02:00
exports.protobuf = pbm
exports.hmac = c.hmac
exports.aes = c.aes
exports.webcrypto = c.webcrypto
2016-05-19 18:47:48 +02:00
const keys = exports.keys = require('./keys')
function isValidKeyType (keyType) {
const key = keys[keyType.toLowerCase()]
return key !== undefined
}
exports.keyStretcher = require('./key-stretcher')
exports.generateEphemeralKeyPair = require('./ephemeral-keys')
2016-05-19 18:47:48 +02:00
// Generates a keypair of the given type and bitsize
exports.generateKeyPair = (type, bits, cb) => {
2016-05-19 20:18:31 +02:00
let key = keys[type.toLowerCase()]
if (!key) {
return cb(new Error('invalid or unsupported key type'))
2016-05-19 18:47:48 +02:00
}
key.generateKeyPair(bits, cb)
2016-05-19 18:47:48 +02:00
}
// 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)
}
2016-05-19 21:45:43 +02:00
// 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')
}
2016-05-19 21:45:43 +02:00
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)) {
2016-05-19 21:45:43 +02:00
throw new Error('invalid or unsupported key type')
}
return key.bytes
2016-05-19 21:45:43 +02:00
}
// Converts a protobuf serialized private key into its
// representative object
exports.unmarshalPrivateKey = (buf, callback) => {
2016-05-19 21:45:43 +02:00
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'))
}
2016-05-19 21:45:43 +02:00
default:
callback(new Error('invalid or unsupported key type'))
2016-05-19 21:45:43 +02:00
}
}
// Converts a private key object into a protobuf serialized private key
exports.marshalPrivateKey = (key, type) => {
type = (type || 'rsa').toLowerCase()
if (!isValidKeyType(type)) {
2016-05-19 21:45:43 +02:00
throw new Error('invalid or unsupported key type')
}
return key.bytes
2016-05-19 21:45:43 +02:00
}
exports.randomBytes = (number) => {
if (!number || typeof number !== 'number') {
throw new Error('first argument must be a Number bigger than 0')
}
return c.rsa.getRandomValues(new Uint8Array(number))
}