I managed to solve it.
Create schemas for RFC5480 and RFC59159 using ASN1.js
const asn1 = require("asn1.js");
const ASN1ECRfc5915Key = asn1.define("Rfc5915Key", function () {
this.seq().obj(
this.key("version").int(),
this.key("privateKey").octstr(),
this.key("parameters").optional().explicit(0).objid({
"1 3 132 0 10": "secp256k1",
}),
this.key("publicKey").optional().explicit(1).bitstr()
);
});
const ASN1ECRfc5280Key = asn1.define("Rfc5280Key", function () {
const self = this;
self.seq().obj(
self
.key("algorithm")
.seq()
.obj(
this.key("algorithm").objid({
"1 2 840 10045 2 1": "EC",
}),
this.key("parameters").objid({
"1 3 132 0 10": "secp256k1",
})
),
self.key("subjectPublicKey").bitstr()
);
});
Generate private key using crypto.createECDH
function generatePrivateKey(curve) {
const ecdh = crypto.createECDH(curve);
ecdh.generateKeys();
return ASN1ECRfc5915Key.encode(
{
version: 1,
privateKey: ecdh.getPrivateKey(),
parameters: curve,
publicKey: {
data: ecdh.getPublicKey(),
},
},
"der"
);
}
console.log(generatePrivateKey("secp256k1").toString("base64"))
// MHQCAQEEIAjhVqemJ8iEla6JeA9QhgDttBHgrJLqKgdRgXKaDBx8oAcGBSuBBAAKoUQDQgAEn++0D2O/1vTTurCN6t623tP5LCYqhyKj7Xmv9RwYcGorv/b++vDx92s5lksBYBj7zAoUrsw2R2gXeQiutJskFw==
Get Public key
function getPublicKey(privateKeyInBase64) {
const key = Buffer.from(privateKeyInBase64, "base64");
const { privateKey, parameters } = ASN1ECRfc5915Key.decode(key, "der");
const ecdh = crypto.createECDH(parameters);
ecdh.setPrivateKey(privateKey);
const publicKey = ASN1ECRfc5280Key.encode(
{
algorithm: {
algorithm: "EC",
parameters,
},
subjectPublicKey: {
data: ecdh.getPublicKey(undefined, "compressed"),
},
},
"der"
);
return publicKey.toString("base64");
}
console.log(getPublicKey("MHQCAQEEIAjhVqemJ8iEla6JeA9QhgDttBHgrJLqKgdRgXKaDBx8oAcGBSuBBAAKoUQDQgAEn++0D2O/1vTTurCN6t623tP5LCYqhyKj7Xmv9RwYcGorv/b++vDx92s5lksBYBj7zAoUrsw2R2gXeQiutJskFw=="))
// MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgADn++0D2O/1vTTurCN6t623tP5LCYqhyKj7Xmv9RwYcGo=
console.log(getPublicKey("MHQCAQEEILmOaO0KmLm5LhlJZOXbcoqALQ4odJ65HtO3HbIvc2jRoAcGBSuBBAAKoUQDQgAEvXnfhfL2zg4zzQiJoZAtJ5Qm6NkddYjLUnRCxRY/WUWzuN6xTCUacSthftrhK43tQA5hmEpk95gqhknHVKktnQ=="))
// MDYwEAYHKoZIzj0CAQYFK4EEAAoDIgADvXnfhfL2zg4zzQiJoZAtJ5Qm6NkddYjLUnRCxRY/WUU=