我正在try 仅从私钥重新创建P-521 JWK.
根据第spec条(第4.2.1节):
"x成员包含椭圆曲线点的x坐标. 它表示为坐标的BIG的Base64url编码 端序表示法."
我try 过对私钥进行Base64url解码,并将其与P-521基点进行标量相乘,以获得公钥点.然后,我try 将x和y坐标转换为大端八位字节表示法,并将其编码回base 64url格式.结果与JWK中原始的x和y Base64url编码字段不匹配.
我也try 过P-256曲线,但也不起作用.
const elliptic = require('elliptic');
const EC = elliptic.ec;
const {base16, base64url} = require('rfc4648');
const BN = require("bn.js");
const padBase16ToWholeOctets = s => s.length%2===0 ? s : '0'+s;
const bnToB64 = n => base64url.stringify(base16.parse(padBase16ToWholeOctets(n.toString(16))))
console.log('begin'); // forces console output to show from async IIFE
(async () => {
let keyPair = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-521" }, true, ['sign'])
let jwk = await crypto.subtle.exportKey("jwk", keyPair.privateKey)
console.log(jwk)
const dHex = base16.stringify(base64url.parse(jwk.d, { loose: true }))
const ec = new EC('p521')
const [x,y] = ec.curve.g.mul(new BN(dHex, 16, 'be')).toJSON()
console.log(`expected x: ` + jwk.x)
console.log(`actual x: ` + bnToB64(x))
console.log(`expected y: ` + jwk.y)
console.log(`actual y: ` + bnToB64(y))
})();