PHP WebShell
Текущая директория: /opt/BitGoJS/node_modules/key-encoder/src
Просмотр файла: key-encoder.ts
import { ec as EC } from 'elliptic'
// @ts-ignore
import * as asn1 from 'asn1.js'
const BN = require('bn.js')
/**
* Use types for the `bn.js` lib, e.g. `@types/bn.js`
*/
type BNjs = any
const ECPrivateKeyASN = asn1.define('ECPrivateKey', function () {
// @ts-ignore
const self = this as any
self.seq().obj(
self.key('version').int(),
self.key('privateKey').octstr(),
self.key('parameters').explicit(0).objid().optional(),
self.key('publicKey').explicit(1).bitstr().optional()
)
})
const SubjectPublicKeyInfoASN = asn1.define('SubjectPublicKeyInfo', function () {
// @ts-ignore
const self = this as any
self.seq().obj(
self.key('algorithm').seq().obj(
self.key("id").objid(),
self.key("curve").objid()
),
self.key('pub').bitstr()
)
})
interface CurveOptions {
curveParameters: number[];
privatePEMOptions: { label: string };
publicPEMOptions: { label: string };
curve: EC;
}
const curves: { [index: string]: CurveOptions } = {
secp256k1: {
curveParameters: [1, 3, 132, 0, 10],
privatePEMOptions: { label: 'EC PRIVATE KEY' },
publicPEMOptions: { label: 'PUBLIC KEY' },
curve: new EC('secp256k1')
}
}
interface PrivateKey {
version: BNjs;
privateKey: Buffer;
parameters: number[];
publicKey?: {
unused: number;
data: Buffer;
}
}
type KeyFormat = 'raw' | 'pem' | 'der';
export default class KeyEncoder {
static ECPrivateKeyASN = ECPrivateKeyASN
static SubjectPublicKeyInfoASN = SubjectPublicKeyInfoASN
algorithmID: number[]
options: CurveOptions
constructor(options: string | CurveOptions) {
if (typeof options === 'string') {
if (options !== 'secp256k1') {
throw new Error('Unknown curve ' + options)
}
options = curves[options]
}
this.options = options
this.algorithmID = [1, 2, 840, 10045, 2, 1]
}
privateKeyObject(rawPrivateKey: string, rawPublicKey: string) {
const privateKeyObject: PrivateKey = {
version: new BN(1),
privateKey: Buffer.from(rawPrivateKey, 'hex'),
parameters: this.options.curveParameters
}
if (rawPublicKey) {
privateKeyObject.publicKey = {
unused: 0,
data: Buffer.from(rawPublicKey, 'hex')
}
}
return privateKeyObject
}
publicKeyObject(rawPublicKey: string) {
return {
algorithm: {
id: this.algorithmID,
curve: this.options.curveParameters
},
pub: {
unused: 0,
data: Buffer.from(rawPublicKey, 'hex')
}
}
}
encodePrivate(privateKey: string | Buffer, originalFormat: KeyFormat, destinationFormat: KeyFormat): string {
let privateKeyObject: PrivateKey
/* Parse the incoming private key and convert it to a private key object */
if (originalFormat === 'raw') {
if (typeof privateKey !== 'string') {
throw 'private key must be a string'
}
let keyPair = this.options.curve.keyFromPrivate(privateKey, 'hex')
let rawPublicKey = keyPair.getPublic('hex')
privateKeyObject = this.privateKeyObject(privateKey, rawPublicKey)
} else if (originalFormat === 'der') {
if (typeof privateKey !== 'string') {
// do nothing
} else if (typeof privateKey === 'string') {
privateKey = Buffer.from(privateKey, 'hex')
} else {
throw 'private key must be a buffer or a string'
}
privateKeyObject = ECPrivateKeyASN.decode(privateKey, 'der')
} else if (originalFormat === 'pem') {
if (typeof privateKey !== 'string') {
throw 'private key must be a string'
}
privateKeyObject = ECPrivateKeyASN.decode(privateKey, 'pem', this.options.privatePEMOptions)
} else {
throw 'invalid private key format'
}
/* Export the private key object to the desired format */
if (destinationFormat === 'raw') {
return privateKeyObject.privateKey.toString('hex')
} else if (destinationFormat === 'der') {
return ECPrivateKeyASN.encode(privateKeyObject, 'der').toString('hex')
} else if (destinationFormat === 'pem') {
return ECPrivateKeyASN.encode(privateKeyObject, 'pem', this.options.privatePEMOptions)
} else {
throw 'invalid destination format for private key'
}
}
encodePublic(publicKey: string | Buffer, originalFormat: KeyFormat, destinationFormat: KeyFormat): string {
let publicKeyObject
/* Parse the incoming public key and convert it to a public key object */
if (originalFormat === 'raw') {
if (typeof publicKey !== 'string') {
throw 'public key must be a string'
}
publicKeyObject = this.publicKeyObject(publicKey)
} else if (originalFormat === 'der') {
if (typeof publicKey !== 'string') {
// do nothing
} else if (typeof publicKey === 'string') {
publicKey = Buffer.from(publicKey, 'hex')
} else {
throw 'public key must be a buffer or a string'
}
publicKeyObject = SubjectPublicKeyInfoASN.decode(publicKey, 'der')
} else if (originalFormat === 'pem') {
if (typeof publicKey !== 'string') {
throw 'public key must be a string'
}
publicKeyObject = SubjectPublicKeyInfoASN.decode(publicKey, 'pem', this.options.publicPEMOptions)
} else {
throw 'invalid public key format'
}
/* Export the private key object to the desired format */
if (destinationFormat === 'raw') {
return publicKeyObject.pub.data.toString('hex')
} else if (destinationFormat === 'der') {
return SubjectPublicKeyInfoASN.encode(publicKeyObject, 'der').toString('hex')
} else if (destinationFormat === 'pem') {
return SubjectPublicKeyInfoASN.encode(publicKeyObject, 'pem', this.options.publicPEMOptions)
} else {
throw 'invalid destination format for public key'
}
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!