@@ -12,23 +12,23 @@ contract P256Test is Test {
12
12
function testVerify (bytes32 digest , uint256 seed ) public {
13
13
uint256 privateKey = _asPrivateKey (seed);
14
14
15
- (bytes32 x , bytes32 y ) = P256PublicKey. getPublicKey (privateKey);
15
+ (uint256 x , uint256 y ) = vm. publicKeyP256 (privateKey);
16
16
(bytes32 r , bytes32 s ) = vm.signP256 (privateKey, digest);
17
17
s = _ensureLowerS (s);
18
- assertTrue (P256.verify (digest, r, s, x, y ));
19
- assertTrue (P256.verifySolidity (digest, r, s, x, y ));
18
+ assertTrue (P256.verify (digest, r, s, bytes32 (x), bytes32 (y) ));
19
+ assertTrue (P256.verifySolidity (digest, r, s, bytes32 (x), bytes32 (y) ));
20
20
}
21
21
22
22
/// forge-config: default.fuzz.runs = 512
23
23
function testRecover (bytes32 digest , uint256 seed ) public {
24
24
uint256 privateKey = _asPrivateKey (seed);
25
25
26
- (bytes32 x , bytes32 y ) = P256PublicKey. getPublicKey (privateKey);
26
+ (uint256 x , uint256 y ) = vm. publicKeyP256 (privateKey);
27
27
(bytes32 r , bytes32 s ) = vm.signP256 (privateKey, digest);
28
28
s = _ensureLowerS (s);
29
29
(bytes32 qx0 , bytes32 qy0 ) = P256.recovery (digest, 0 , r, s);
30
30
(bytes32 qx1 , bytes32 qy1 ) = P256.recovery (digest, 1 , r, s);
31
- assertTrue ((qx0 == x && qy0 == y) || (qx1 == x && qy1 == y ));
31
+ assertTrue ((qx0 == bytes32 (x) && qy0 == bytes32 (y)) || (qx1 == bytes32 (x) && qy1 == bytes32 (y) ));
32
32
}
33
33
34
34
function _asPrivateKey (uint256 seed ) private pure returns (uint256 ) {
@@ -42,98 +42,3 @@ contract P256Test is Test {
42
42
}
43
43
}
44
44
}
45
-
46
- /**
47
- * @dev Library to derive P256 public key from private key
48
- * Should be removed if Foundry adds this functionality
49
- * See https://github.com/foundry-rs/foundry/issues/7908
50
- */
51
- library P256PublicKey {
52
- function getPublicKey (uint256 privateKey ) internal view returns (bytes32 , bytes32 ) {
53
- (uint256 x , uint256 y , uint256 z ) = _jMult (P256.GX, P256.GY, 1 , privateKey);
54
- return _affineFromJacobian (x, y, z);
55
- }
56
-
57
- function _jMult (
58
- uint256 x ,
59
- uint256 y ,
60
- uint256 z ,
61
- uint256 k
62
- ) private pure returns (uint256 rx , uint256 ry , uint256 rz ) {
63
- unchecked {
64
- for (uint256 i = 0 ; i < 256 ; ++ i) {
65
- if (rz > 0 ) {
66
- (rx, ry, rz) = _jDouble (rx, ry, rz);
67
- }
68
- if (k >> 255 > 0 ) {
69
- if (rz == 0 ) {
70
- (rx, ry, rz) = (x, y, z);
71
- } else {
72
- (rx, ry, rz) = _jAdd (rx, ry, rz, x, y, z);
73
- }
74
- }
75
- k <<= 1 ;
76
- }
77
- }
78
- }
79
-
80
- /// From P256.sol
81
-
82
- function _affineFromJacobian (uint256 jx , uint256 jy , uint256 jz ) private view returns (bytes32 ax , bytes32 ay ) {
83
- if (jz == 0 ) return (0 , 0 );
84
- uint256 zinv = Math.invModPrime (jz, P256.P);
85
- uint256 zzinv = mulmod (zinv, zinv, P256.P);
86
- uint256 zzzinv = mulmod (zzinv, zinv, P256.P);
87
- ax = bytes32 (mulmod (jx, zzinv, P256.P));
88
- ay = bytes32 (mulmod (jy, zzzinv, P256.P));
89
- }
90
-
91
- function _jDouble (uint256 x , uint256 y , uint256 z ) private pure returns (uint256 rx , uint256 ry , uint256 rz ) {
92
- uint256 p = P256.P;
93
- uint256 a = P256.A;
94
- assembly ("memory-safe" ) {
95
- let yy := mulmod (y, y, p)
96
- let zz := mulmod (z, z, p)
97
- let s := mulmod (4 , mulmod (x, yy, p), p) // s = 4*x*y²
98
- let m := addmod (mulmod (3 , mulmod (x, x, p), p), mulmod (a, mulmod (zz, zz, p), p), p) // m = 3*x²+a*z⁴
99
- let t := addmod (mulmod (m, m, p), sub (p, mulmod (2 , s, p)), p) // t = m²-2*s
100
-
101
- // x' = t
102
- rx := t
103
- // y' = m*(s-t)-8*y⁴
104
- ry := addmod (mulmod (m, addmod (s, sub (p, t), p), p), sub (p, mulmod (8 , mulmod (yy, yy, p), p)), p)
105
- // z' = 2*y*z
106
- rz := mulmod (2 , mulmod (y, z, p), p)
107
- }
108
- }
109
-
110
- function _jAdd (
111
- uint256 x1 ,
112
- uint256 y1 ,
113
- uint256 z1 ,
114
- uint256 x2 ,
115
- uint256 y2 ,
116
- uint256 z2
117
- ) private pure returns (uint256 rx , uint256 ry , uint256 rz ) {
118
- uint256 p = P256.P;
119
- assembly ("memory-safe" ) {
120
- let zz1 := mulmod (z1, z1, p) // zz1 = z1²
121
- let zz2 := mulmod (z2, z2, p) // zz2 = z2²
122
- let u1 := mulmod (x1, zz2, p) // u1 = x1*z2²
123
- let u2 := mulmod (x2, zz1, p) // u2 = x2*z1²
124
- let s1 := mulmod (y1, mulmod (zz2, z2, p), p) // s1 = y1*z2³
125
- let s2 := mulmod (y2, mulmod (zz1, z1, p), p) // s2 = y2*z1³
126
- let h := addmod (u2, sub (p, u1), p) // h = u2-u1
127
- let hh := mulmod (h, h, p) // h²
128
- let hhh := mulmod (h, hh, p) // h³
129
- let r := addmod (s2, sub (p, s1), p) // r = s2-s1
130
-
131
- // x' = r²-h³-2*u1*h²
132
- rx := addmod (addmod (mulmod (r, r, p), sub (p, hhh), p), sub (p, mulmod (2 , mulmod (u1, hh, p), p)), p)
133
- // y' = r*(u1*h²-x')-s1*h³
134
- ry := addmod (mulmod (r, addmod (mulmod (u1, hh, p), sub (p, rx), p), p), sub (p, mulmod (s1, hhh, p)), p)
135
- // z' = h*z1*z2
136
- rz := mulmod (h, mulmod (z1, z2, p), p)
137
- }
138
- }
139
- }
0 commit comments