@@ -16,6 +16,8 @@ private Friend() {}
16
16
public static final int POINT_SIZE = 56 ;
17
17
public static final int SCALAR_SIZE = 56 ;
18
18
19
+ private static class F extends X448Field {};
20
+
19
21
private static final int C_A = 156326 ;
20
22
private static final int C_A24 = (C_A + 2 )/4 ;
21
23
@@ -64,19 +66,19 @@ public static void generatePublicKey(byte[] k, int kOff, byte[] r, int rOff)
64
66
65
67
private static void pointDouble (int [] x , int [] z )
66
68
{
67
- int [] A = X448Field .create ();
68
- int [] B = X448Field .create ();
69
-
70
- // X448Field .apm(x, z, A, B );
71
- X448Field .add (x , z , A );
72
- X448Field .sub (x , z , B );
73
- X448Field .sqr (A , A );
74
- X448Field .sqr (B , B );
75
- X448Field .mul (A , B , x );
76
- X448Field .sub (A , B , A );
77
- X448Field .mul (A , C_A24 , z );
78
- X448Field .add (z , B , z );
79
- X448Field .mul (z , A , z );
69
+ int [] a = F .create ();
70
+ int [] b = F .create ();
71
+
72
+ // F .apm(x, z, a, b );
73
+ F .add (x , z , a );
74
+ F .sub (x , z , b );
75
+ F .sqr (a , a );
76
+ F .sqr (b , b );
77
+ F .mul (a , b , x );
78
+ F .sub (a , b , a );
79
+ F .mul (a , C_A24 , z );
80
+ F .add (z , b , z );
81
+ F .mul (z , a , z );
80
82
}
81
83
82
84
public static void precompute ()
@@ -86,54 +88,54 @@ public static void precompute()
86
88
87
89
public static void scalarMult (byte [] k , int kOff , byte [] u , int uOff , byte [] r , int rOff )
88
90
{
89
- int [] n = new int [14 ]; decodeScalar (k , kOff , n );
91
+ int [] n = new int [14 ]; decodeScalar (k , kOff , n );
90
92
91
- int [] x1 = X448Field .create (); X448Field .decode (u , uOff , x1 );
92
- int [] x2 = X448Field .create (); X448Field .copy (x1 , 0 , x2 , 0 );
93
- int [] z2 = X448Field .create (); z2 [0 ] = 1 ;
94
- int [] x3 = X448Field .create (); x3 [0 ] = 1 ;
95
- int [] z3 = X448Field .create ();
93
+ int [] x1 = F .create (); F .decode (u , uOff , x1 );
94
+ int [] x2 = F .create (); F .copy (x1 , 0 , x2 , 0 );
95
+ int [] z2 = F .create (); z2 [0 ] = 1 ;
96
+ int [] x3 = F .create (); x3 [0 ] = 1 ;
97
+ int [] z3 = F .create ();
96
98
97
- int [] t1 = X448Field .create ();
98
- int [] t2 = X448Field .create ();
99
+ int [] t1 = F .create ();
100
+ int [] t2 = F .create ();
99
101
100
102
// assert n[13] >>> 31 == 1;
101
103
102
104
int bit = 447 , swap = 1 ;
103
105
do
104
106
{
105
- // X448Field .apm(x3, z3, t1, x3);
106
- X448Field .add (x3 , z3 , t1 );
107
- X448Field .sub (x3 , z3 , x3 );
108
- // X448Field .apm(x2, z2, z3, x2);
109
- X448Field .add (x2 , z2 , z3 );
110
- X448Field .sub (x2 , z2 , x2 );
111
-
112
- X448Field .mul (t1 , x2 , t1 );
113
- X448Field .mul (x3 , z3 , x3 );
114
- X448Field .sqr (z3 , z3 );
115
- X448Field .sqr (x2 , x2 );
116
-
117
- X448Field .sub (z3 , x2 , t2 );
118
- X448Field .mul (t2 , C_A24 , z2 );
119
- X448Field .add (z2 , x2 , z2 );
120
- X448Field .mul (z2 , t2 , z2 );
121
- X448Field .mul (x2 , z3 , x2 );
122
-
123
- // X448Field .apm(t1, x3, x3, z3);
124
- X448Field .sub (t1 , x3 , z3 );
125
- X448Field .add (t1 , x3 , x3 );
126
- X448Field .sqr (x3 , x3 );
127
- X448Field .sqr (z3 , z3 );
128
- X448Field .mul (z3 , x1 , z3 );
107
+ // F .apm(x3, z3, t1, x3);
108
+ F .add (x3 , z3 , t1 );
109
+ F .sub (x3 , z3 , x3 );
110
+ // F .apm(x2, z2, z3, x2);
111
+ F .add (x2 , z2 , z3 );
112
+ F .sub (x2 , z2 , x2 );
113
+
114
+ F .mul (t1 , x2 , t1 );
115
+ F .mul (x3 , z3 , x3 );
116
+ F .sqr (z3 , z3 );
117
+ F .sqr (x2 , x2 );
118
+
119
+ F .sub (z3 , x2 , t2 );
120
+ F .mul (t2 , C_A24 , z2 );
121
+ F .add (z2 , x2 , z2 );
122
+ F .mul (z2 , t2 , z2 );
123
+ F .mul (x2 , z3 , x2 );
124
+
125
+ // F .apm(t1, x3, x3, z3);
126
+ F .sub (t1 , x3 , z3 );
127
+ F .add (t1 , x3 , x3 );
128
+ F .sqr (x3 , x3 );
129
+ F .sqr (z3 , z3 );
130
+ F .mul (z3 , x1 , z3 );
129
131
130
132
--bit ;
131
133
132
134
int word = bit >>> 5 , shift = bit & 0x1F ;
133
135
int kt = (n [word ] >>> shift ) & 1 ;
134
136
swap ^= kt ;
135
- X448Field .cswap (swap , x2 , x3 );
136
- X448Field .cswap (swap , z2 , z3 );
137
+ F .cswap (swap , x2 , x3 );
138
+ F .cswap (swap , z2 , z3 );
137
139
swap = kt ;
138
140
}
139
141
while (bit >= 2 );
@@ -145,25 +147,25 @@ public static void scalarMult(byte[] k, int kOff, byte[] u, int uOff, byte[] r,
145
147
pointDouble (x2 , z2 );
146
148
}
147
149
148
- X448Field .inv (z2 , z2 );
149
- X448Field .mul (x2 , z2 , x2 );
150
+ F .inv (z2 , z2 );
151
+ F .mul (x2 , z2 , x2 );
150
152
151
- X448Field .normalize (x2 );
152
- X448Field .encode (x2 , r , rOff );
153
+ F .normalize (x2 );
154
+ F .encode (x2 , r , rOff );
153
155
}
154
156
155
157
public static void scalarMultBase (byte [] k , int kOff , byte [] r , int rOff )
156
158
{
157
- int [] x = X448Field .create ();
158
- int [] y = X448Field .create ();
159
+ int [] x = F .create ();
160
+ int [] y = F .create ();
159
161
160
162
Ed448 .scalarMultBaseXY (Friend .INSTANCE , k , kOff , x , y );
161
163
162
- X448Field .inv (x , x );
163
- X448Field .mul (x , y , x );
164
- X448Field .sqr (x , x );
164
+ F .inv (x , x );
165
+ F .mul (x , y , x );
166
+ F .sqr (x , x );
165
167
166
- X448Field .normalize (x );
167
- X448Field .encode (x , r , rOff );
168
+ F .normalize (x );
169
+ F .encode (x , r , rOff );
168
170
}
169
171
}
0 commit comments