1.0.0 • Published 1 year ago

@didkovsky/keys-converter v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

Elliptic curve's keys converter

Tool that can convert binary private or public key to pem and der formats. Also includes factory for KeyObject from @node/crypto.

Install

npm i @didkovsky/keys-converter

Example

random private key for (secp256k1)

9d8ce6ab12507d729b9d160d352a0be329ec73dbc8afa65d6e5570bb14a8f71f

pem

-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIJ2M5qsSUH1ym50WDTUqC+Mp7HPbyK+mXW5VcLsUqPcfoAcGBSuBBAAK
oUQDQgAE4zjQ9EYcK1uUoF/eCboVjNVlCOFH58VV6RmyZfZzpSrQjltCJQVubOmt
LLD1FWKZv76d4H4UNc/0mN0LkMKGDw==
-----END EC PRIVATE KEY-----

der (hex)

307402010104209d8ce6ab12507d729b9d160d352a0be329ec73dbc8afa65d6e5570bb14a8f71fa00706052b8104000aa14403420004e338d0f4461c2b5b94a05fde09ba158cd56508e147e7c555e919b265f673a52ad08e5b4225056e6ce9ad2cb0f5156299bfbe9de07e1435cff498dd0b90c2860f

Supported curves

NamePriv length (bytes)Pub length (bytes)Priv headerPriv optionsPub header
SM232650x307702010104200xa00a06082a811ccf5501822da1440342000x3059301306072a8648ce3d020106082a811ccf5501822d034200
brainpoolP160r120410x305402010104140xa00b06092b2403030208010101a12c032a000x3042301406072a8648ce3d020106092b2403030208010101032a00
brainpoolP160t120410x305402010104140xa00b06092b2403030208010102a12c032a000x3042301406072a8648ce3d020106092b2403030208010102032a00
brainpoolP192r124490x306002010104180xa00b06092b2403030208010103a1340332000x304a301406072a8648ce3d020106092b2403030208010103033200
brainpoolP192t124490x306002010104180xa00b06092b2403030208010104a1340332000x304a301406072a8648ce3d020106092b2403030208010104033200
brainpoolP224r128570x306c020101041c0xa00b06092b2403030208010105a13c033a000x3052301406072a8648ce3d020106092b2403030208010105033a00
brainpoolP224t128570x306c020101041c0xa00b06092b2403030208010106a13c033a000x3052301406072a8648ce3d020106092b2403030208010106033a00
brainpoolP256r132650x307802010104200xa00b06092b2403030208010107a1440342000x305a301406072a8648ce3d020106092b2403030208010107034200
brainpoolP256t132650x307802010104200xa00b06092b2403030208010108a1440342000x305a301406072a8648ce3d020106092b2403030208010108034200
brainpoolP320r140810x30819002010104280xa00b06092b2403030208010109a1540352000x306a301406072a8648ce3d020106092b2403030208010109035200
brainpoolP320t140810x30819002010104280xa00b06092b240303020801010aa1540352000x306a301406072a8648ce3d020106092b240303020801010a035200
brainpoolP384r148970x3081a802010104300xa00b06092b240303020801010ba1640362000x307a301406072a8648ce3d020106092b240303020801010b036200
brainpoolP384t148970x3081a802010104300xa00b06092b240303020801010ca1640362000x307a301406072a8648ce3d020106092b240303020801010c036200
brainpoolP512r1641290x3081da02010104400xa00b06092b240303020801010da18185038182000x30819b301406072a8648ce3d020106092b240303020801010d03818200
brainpoolP512t1641290x3081da02010104400xa00b06092b240303020801010ea18185038182000x30819b301406072a8648ce3d020106092b240303020801010e03818200
c2pnb163v121430x305602010104150xa00a06082a8648ce3d030001a12e032c000x3043301306072a8648ce3d020106082a8648ce3d030001032c00
c2pnb163v221430x305602010104150xa00a06082a8648ce3d030002a12e032c000x3043301306072a8648ce3d020106082a8648ce3d030002032c00
c2pnb163v321430x305602010104150xa00a06082a8648ce3d030003a12e032c000x3043301306072a8648ce3d020106082a8648ce3d030003032c00
c2pnb208w124530x30640201010419000xa00a06082a8648ce3d03000aa1380336000x304d301306072a8648ce3d020106082a8648ce3d03000a033600
c2pnb272w132690x307c0201010421000xa00a06082a8648ce3d030010a1480346000x305d301306072a8648ce3d020106082a8648ce3d030010034600
c2pnb304w136770x3081880201010425000xa00a06082a8648ce3d030011a150034e000x3065301306072a8648ce3d020106082a8648ce3d030011034e00
c2pnb368w144930x3081a0020101042d000xa00a06082a8648ce3d030013a160035e000x3075301306072a8648ce3d020106082a8648ce3d030013035e00
c2tnb191v124490x305f02010104180xa00a06082a8648ce3d030005a1340332000x3049301306072a8648ce3d020106082a8648ce3d030005033200
c2tnb191v224490x305f02010104180xa00a06082a8648ce3d030006a1340332000x3049301306072a8648ce3d020106082a8648ce3d030006033200
c2tnb191v324490x305f02010104180xa00a06082a8648ce3d030007a1340332000x3049301306072a8648ce3d020106082a8648ce3d030007033200
c2tnb239v130610x3071020101041e0xa00a06082a8648ce3d03000ba140033e000x3055301306072a8648ce3d020106082a8648ce3d03000b033e00
c2tnb239v230610x3071020101041e0xa00a06082a8648ce3d03000ca140033e000x3055301306072a8648ce3d020106082a8648ce3d03000c033e00
c2tnb239v330610x3071020101041e0xa00a06082a8648ce3d03000da140033e000x3055301306072a8648ce3d020106082a8648ce3d03000d033e00
c2tnb359v145910x30819e020101042d0xa00a06082a8648ce3d030012a15e035c000x3073301306072a8648ce3d020106082a8648ce3d030012035c00
c2tnb431r1531090x3081b802010104350xa00a06082a8648ce3d030014a170036e000x308185301306072a8648ce3d020106082a8648ce3d030014036e00
prime192v124490x305f02010104180xa00a06082a8648ce3d030101a1340332000x3049301306072a8648ce3d020106082a8648ce3d030101033200
prime192v224490x305f02010104180xa00a06082a8648ce3d030102a1340332000x3049301306072a8648ce3d020106082a8648ce3d030102033200
prime192v324490x305f02010104180xa00a06082a8648ce3d030103a1340332000x3049301306072a8648ce3d020106082a8648ce3d030103033200
prime239v130610x3071020101041e0xa00a06082a8648ce3d030104a140033e000x3055301306072a8648ce3d020106082a8648ce3d030104033e00
prime239v230610x3071020101041e0xa00a06082a8648ce3d030105a140033e000x3055301306072a8648ce3d020106082a8648ce3d030105033e00
prime239v330610x3071020101041e0xa00a06082a8648ce3d030106a140033e000x3055301306072a8648ce3d020106082a8648ce3d030106033e00
prime256v132650x307702010104200xa00a06082a8648ce3d030107a1440342000x3059301306072a8648ce3d020106082a8648ce3d030107034200
secp112r114290x303e020101040e0xa00706052b81040006a120031e000x3032301006072a8648ce3d020106052b81040006031e00
secp112r214290x303e020101040e0xa00706052b81040007a120031e000x3032301006072a8648ce3d020106052b81040007031e00
secp128r116330x304402010104100xa00706052b8104001ca1240322000x3036301006072a8648ce3d020106052b8104001c032200
secp128r216330x304402010104100xa00706052b8104001da1240322000x3036301006072a8648ce3d020106052b8104001d032200
secp160k120410x30510201010415000xa00706052b81040009a12c032a000x303e301006072a8648ce3d020106052b81040009032a00
secp160r120410x30510201010415000xa00706052b81040008a12c032a000x303e301006072a8648ce3d020106052b81040008032a00
secp160r220410x30510201010415000xa00706052b8104001ea12c032a000x303e301006072a8648ce3d020106052b8104001e032a00
secp192k124490x305c02010104180xa00706052b8104001fa1340332000x3046301006072a8648ce3d020106052b8104001f033200
secp224k128570x3069020101041d000xa00706052b81040020a13c033a000x304e301006072a8648ce3d020106052b81040020033a00
secp224r128570x3068020101041c0xa00706052b81040021a13c033a000x304e301006072a8648ce3d020106052b81040021033a00
secp256k132650x307402010104200xa00706052b8104000aa1440342000x3056301006072a8648ce3d020106052b8104000a034200
secp384r148970x3081a402010104300xa00706052b81040022a1640362000x3076301006072a8648ce3d020106052b81040022036200
secp521r1661330x3081dc02010104420xa00706052b81040023a18189038186000x30819b301006072a8648ce3d020106052b8104002303818600
sect113r114310x3041020101040f000xa00706052b81040004a1220320000x3034301006072a8648ce3d020106052b81040004032000
sect113r214310x3041020101040f000xa00706052b81040005a1220320000x3034301006072a8648ce3d020106052b81040005032000
sect131r117350x304702010104110xa00706052b81040016a1260324000x3038301006072a8648ce3d020106052b81040016032400
sect131r217350x304702010104110xa00706052b81040017a1260324000x3038301006072a8648ce3d020106052b81040017032400
sect163k121430x305302010104150xa00706052b81040001a12e032c000x3040301006072a8648ce3d020106052b81040001032c00
sect163r121430x305302010104150xa00706052b81040002a12e032c000x3040301006072a8648ce3d020106052b81040002032c00
sect163r221430x305302010104150xa00706052b8104000fa12e032c000x3040301006072a8648ce3d020106052b8104000f032c00
sect193r124510x305f0201010419000xa00706052b81040018a1360334000x3048301006072a8648ce3d020106052b81040018033400
sect193r224510x305f0201010419000xa00706052b81040019a1360334000x3048301006072a8648ce3d020106052b81040019033400
sect233k129610x306d020101041d0xa00706052b8104001aa140033e000x3052301006072a8648ce3d020106052b8104001a033e00
sect233r129610x306e020101041e000xa00706052b8104001ba140033e000x3052301006072a8648ce3d020106052b8104001b033e00
sect239k130610x306e020101041e0xa00706052b81040003a140033e000x3052301006072a8648ce3d020106052b81040003033e00
sect283k136730x30818002010104240xa00706052b81040010a14c034a000x305e301006072a8648ce3d020106052b81040010034a00
sect283r136730x30818002010104240xa00706052b81040011a14c034a000x305e301006072a8648ce3d020106052b81040011034a00
sect409k1511050x3081af02010104330xa00706052b81040024a16c036a000x307e301006072a8648ce3d020106052b81040024036a00
sect409r1511050x3081b00201010434000xa00706052b81040025a16c036a000x307e301006072a8648ce3d020106052b81040025036a00
sect571k1721450x3081ee02010104480xa00706052b81040026a18195038192000x3081a7301006072a8648ce3d020106052b8104002603819200
sect571r1721450x3081ee02010104480xa00706052b81040027a18195038192000x3081a7301006072a8648ce3d020106052b8104002703819200
wap-wsg-idm-ecid-wtls114310x3040020101040e0xa0070605672b010401a1220320000x3034301006072a8648ce3d02010605672b010401032000
wap-wsg-idm-ecid-wtls1029610x306d020101041d0xa0070605672b01040aa140033e000x3052301006072a8648ce3d02010605672b01040a033e00
wap-wsg-idm-ecid-wtls1129610x306e020101041e000xa0070605672b01040ba140033e000x3052301006072a8648ce3d02010605672b01040b033e00
wap-wsg-idm-ecid-wtls1228570x3068020101041c0xa0070605672b01040ca13c033a000x304e301006072a8648ce3d02010605672b01040c033a00
wap-wsg-idm-ecid-wtls321430x305302010104150xa0070605672b010403a12e032c000x3040301006072a8648ce3d02010605672b010403032c00
wap-wsg-idm-ecid-wtls414310x3041020101040f000xa0070605672b010404a1220320000x3034301006072a8648ce3d02010605672b010404032000
wap-wsg-idm-ecid-wtls521430x305302010104150xa0070605672b010405a12e032c000x3040301006072a8648ce3d02010605672b010405032c00
wap-wsg-idm-ecid-wtls614290x303e020101040e0xa0070605672b010406a120031e000x3032301006072a8648ce3d02010605672b010406031e00
wap-wsg-idm-ecid-wtls720410x30510201010415000xa0070605672b010407a12c032a000x303e301006072a8648ce3d02010605672b010407032a00
wap-wsg-idm-ecid-wtls814290x303f020101040f000xa0070605672b010408a120031e000x3032301006072a8648ce3d02010605672b010408031e00
wap-wsg-idm-ecid-wtls920410x30510201010415000xa0070605672b010409a12c032a000x303e301006072a8648ce3d02010605672b010409032a00

Usage

See /examples folder.

convert private key

const { PrivConverter, getCurves } = require('@didkovsky/keys-converter')

/**
 * Get list of supported curves
 */
const curves = getCurves()

/**
 * Create converter for specified curve.
 */
const converter = PrivConverter.for(curves.secp256k1)

/**
 * Some private key.
 */
const priv = Buffer.alloc(32, 0x1)

/**
 * GetPem string.
 */
const pem = converter.toPem(priv)

/*
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBoAcGBSuBBAAK
oUQDQgAEG4TFVnsSZECZXT7VqroFZdceGDRgSBn/nBf16dXdB49wvq+PWItUFQf+
1qZCxatC39+BIKf2Od5RItR6aajo0Q==
-----END EC PRIVATE KEY-----
*/
console.log(pem)

/**
 * Get der Buffer.
 */
const der = converter.toDer(priv)

// Buffer(118) [Uint8Array] [ ... ]
console.dir(der)

/**
 * Get KeyObject from @node/crypto
 */
const keyObj = converter.toKeyObject(priv)

// PrivateKeyObject { [Symbol(kKeyType)]: 'private' }
console.dir(keyObj)

convert public key

const { PubConverter, getCurves } = require('@didkovsky/keys-converter')
const { createECDH } = require('crypto')

/**
 * Get list of supported curves
 */
const curves = getCurves()

/**
 * Create converter for specified curve.
 */
const converter = PubConverter.for(curves.secp256k1)

/**
 * Create keypair
 */
const priv = Buffer.alloc(32, 0x1)
const ecdh = createECDH('secp256k1')
ecdh.setPrivateKey(priv)
const pub = ecdh.getPublicKey()

// BBuExVZ7EmRAmV0+1aq6BWXXHhg0YEgZ/5wX9enV3QePcL6vj1iLVBUH/tamQsWrQt/fgSCn9jneUSLUemmo6NE=
console.log(pub.toString('base64'))

/**
 * GetPem string.
 */
const pem = converter.toPem(pub)

/*
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEG4TFVnsSZECZXT7VqroFZdceGDRgSBn/
nBf16dXdB49wvq+PWItUFQf+1qZCxatC39+BIKf2Od5RItR6aajo0Q==
-----END PUBLIC KEY-----
*/
console.log(pem)

/**
 * Get der Buffer.
 */
const der = converter.toDer(pub)

// Buffer(88) [Uint8Array] [ ... ]
console.dir(der)

/**
 * Get KeyObject from @node/crypto
 */
const keyObj = converter.toKeyObject(pub)

// PublicKeyObject { [Symbol(kKeyType)]: 'public' }
console.dir(keyObj)

sign

With createSign from @node/crypto

const { createSign } = require('crypto')
const { PrivConverter, getCurves } = require('@didkovsky/keys-converter')

/**
 * Get list of supported curves
 */
const curves = getCurves()

/**
 * Create converter for specified curve.
 */
const converter = PrivConverter.for(curves.secp256k1)
 
/**
 * Some private key.
 */
const priv = Buffer.alloc(32, 0x1)

/**
 * Get keyObject from @node/crypto
 */
const privObj = converter.toKeyObject(priv)

/**
 * Signing some message.
 */
const message = 'Hello world!'
const signer = createSign('sha256')
signer.update(message).end()
const signature = signer.sign(privObj)

// MEUCIDHplD47Iy3PaSspcMmAScvE8Acdwc+4nrlPJwq64oynAiEA5+kGFrOqaihg7OQekCae5eKNprwweT02cKNQ5MPBrAE=
console.log(signature.toString('base64'))

verify

With createVerify from @node/crypto

const { createVerify } = require('crypto')
const { PubConverter, getCurves } = require('@didkovsky/keys-converter')

/**
 * Get list of supported curves
 */
const curves = getCurves()

/**
 * Create converter for specified curve.
 */
const converter = PubConverter.for(curves.secp256k1)

/**
 * Raw public key in base64 (65 bytes)
 */
const pub = 'BBuExVZ7EmRAmV0+1aq6BWXXHhg0YEgZ/5wX9enV3QePcL6vj1iLVBUH/tamQsWrQt/fgSCn9jneUSLUemmo6NE='

/**
 * Get keyObject from @node/crypto
 */
const pubObj = converter.toKeyObject(Buffer.from(pub, 'base64'))

/**
 * Our test signature and message
 */
const message = 'Hello world!'
const signature = 'MEUCIDHplD47Iy3PaSspcMmAScvE8Acdwc+4nrlPJwq64oynAiEA5+kGFrOqaihg7OQekCae5eKNprwweT02cKNQ5MPBrAE='

/**
 * Verifiyng signature
 */
const verifier = createVerify('sha256')
verifier.update(message).end()
const result = verifier.verify(pubObj, Buffer.from(signature, 'base64'))

// true
console.log(result)