Вы говорите, что используете Node.js версии 10, но ваша ссылка указывает на документацию для Node.js версии 11. Документация для версии 10: https://nodejs.org/dist/latest-v10.x/docs/api/crypto.html
В версии 11 *Свойства 1004 * и privateKeyEncoding
объекта options
, переданные в качестве второго аргумента crypto.generateKeyPairSync
, являются необязательными.В версии 10 эти свойства не являются обязательными, они должны быть указаны .Ваша программа не предоставляет эти свойства, и поэтому она взрывается.
Если вы измените:
const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'sect239k1'
});
на:
const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
publicKeyEncoding: { type: 'spki', format: 'der' },
privateKeyEncoding: { type: 'pkcs8', format: 'der' }
});
, тогда ваша программа должнабыть намного счастливее.
Обновление
ОК, я установил Node 10 и запустил вашу программу.sign.sign()
взрывается, потому что, как указано в документации, закрытый ключ должен быть в формате PEM.Он не может обработать закрытый ключ в формате DER, полученный моим первоначальным ответом.То же самое относится и к формату открытого ключа, переданного в verify.verify()
- это должен быть PEM, а не DER.Поэтому измените это:
const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
publicKeyEncoding: { type: 'spki', format: 'der' },
privateKeyEncoding: { type: 'pkcs8', format: 'der' }
});
на следующее:
const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
publicKeyEncoding: { type: 'spki', format: 'pem' },
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
});
То есть измените оба вхождения с 'der'
на 'pem'
.
Это позволит вашемуПрограмма запускается без исключения.Однако попытка проверки не удастся, и сообщенный результат, записанный последним вызовом console.log()
, будет false
.Это потому, что программа не сообщает verify.verify()
кодировку, которая использовалась в строке privateKey
.Чтобы исправить это и получить true
результат проверки, измените:
verify.verify(publicKey, signature)
на:
verify.verify(publicKey, signature, 'hex')
, соответствующий строковой кодировке, которая была указана при создании подписи sign.sign()
.Документация не очень ясна в этой части, но из экспериментов видно, что если подпись является строкой, то вы всегда должны указывать кодировку строки.Единственное обстоятельство, при котором вы можете пропустить предоставление кодировки здесь, это если вы также пропустите ее при вызове sign.sign()
, что привело бы к генерации signature
как Buffer
, а не как строка.