|
1 | 1 | const { ethers } = require('hardhat'); |
2 | 2 | const { expect } = require('chai'); |
3 | | -const { secp256r1 } = require('@noble/curves/p256'); |
| 3 | +const { p256 } = require('@noble/curves/nist.js'); |
4 | 4 | const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers'); |
5 | 5 |
|
6 | 6 | const N = 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551n; |
7 | 7 |
|
8 | | -// As in ECDSA, signatures are malleable and the tooling produce both high and low S values. |
9 | | -// We need to ensure that the s value is in the lower half of the order of the curve. |
10 | | -const ensureLowerOrderS = ({ s, recovery, ...rest }) => { |
11 | | - if (s > N / 2n) { |
12 | | - s = N - s; |
13 | | - recovery = 1 - recovery; |
14 | | - } |
15 | | - return { s, recovery, ...rest }; |
16 | | -}; |
17 | | - |
18 | 8 | const prepareSignature = ( |
19 | | - privateKey = secp256r1.utils.randomPrivateKey(), |
| 9 | + privateKey = p256.utils.randomSecretKey(), |
20 | 10 | messageHash = ethers.hexlify(ethers.randomBytes(0x20)), |
21 | 11 | ) => { |
22 | 12 | const publicKey = [ |
23 | | - secp256r1.getPublicKey(privateKey, false).slice(0x01, 0x21), |
24 | | - secp256r1.getPublicKey(privateKey, false).slice(0x21, 0x41), |
| 13 | + p256.getPublicKey(privateKey, false).slice(0x01, 0x21), |
| 14 | + p256.getPublicKey(privateKey, false).slice(0x21, 0x41), |
25 | 15 | ].map(ethers.hexlify); |
26 | | - const { r, s, recovery } = ensureLowerOrderS(secp256r1.sign(messageHash.replace(/0x/, ''), privateKey)); |
27 | | - const signature = [r, s].map(v => ethers.toBeHex(v, 0x20)); |
| 16 | + |
| 17 | + const rawSignature = p256.sign(ethers.getBytes(messageHash), privateKey, { prehash: false, format: 'recovered' }); |
| 18 | + const signature = [ethers.hexlify(rawSignature.slice(0x01, 0x21)), ethers.hexlify(rawSignature.slice(0x21, 0x41))]; |
| 19 | + const recovery = rawSignature[0]; |
28 | 20 |
|
29 | 21 | return { privateKey, publicKey, signature, recovery, messageHash }; |
30 | 22 | }; |
|
0 commit comments