| ... | ... | @@ -75,16 +75,8 @@ pub const Edwards25519 = struct { |
| 75 | 75 | .is_base = true, |
| 76 | 76 | }; |
| 77 | 77 | |
| 78 | | /// The edwards25519 neutral element. |
| 79 | | pub const neutralElement = Edwards25519{ |
| 80 | | .x = Fe{ .limbs = .{ 2251799813685229, 2251799813685247, 2251799813685247, 2251799813685247, 2251799813685247 } }, |
| 81 | | .y = Fe{ .limbs = .{ 1507481815385608, 2223447444246085, 1083941587175919, 2059929906842505, 1581435440146976 } }, |
| 82 | | .z = Fe{ .limbs = .{ 1507481815385608, 2223447444246085, 1083941587175919, 2059929906842505, 1581435440146976 } }, |
| 83 | | .t = Fe{ .limbs = .{ 2251799813685229, 2251799813685247, 2251799813685247, 2251799813685247, 2251799813685247 } }, |
| 84 | | .is_base = false, |
| 85 | | }; |
| 86 | | |
| 87 | | const identityElement = Edwards25519{ .x = Fe.zero, .y = Fe.one, .z = Fe.one, .t = Fe.zero }; |
| 78 | pub const neutralElement = @compileError("deprecated: use identityElement instead"); |
| 79 | pub const identityElement = Edwards25519{ .x = Fe.zero, .y = Fe.one, .z = Fe.one, .t = Fe.zero }; |
| 88 | 80 | |
| 89 | 81 | /// Reject the neutral element. |
| 90 | 82 | pub fn rejectIdentity(p: Edwards25519) IdentityElementError!void { |
| ... | ... | @@ -160,9 +152,10 @@ pub const Edwards25519 = struct { |
| 160 | 152 | return t; |
| 161 | 153 | } |
| 162 | 154 | |
| 163 | | fn nonAdjacentForm(s: [32]u8) [2 * 32]i8 { |
| 155 | fn slide(s: [32]u8) [2 * 32]i8 { |
| 156 | const reduced = if ((s[s.len - 1] & 0x80) != 0) s else scalar.reduce(s); |
| 164 | 157 | var e: [2 * 32]i8 = undefined; |
| 165 | | for (s) |x, i| { |
| 158 | for (reduced) |x, i| { |
| 166 | 159 | e[i * 2 + 0] = @as(i8, @truncate(u4, x)); |
| 167 | 160 | e[i * 2 + 1] = @as(i8, @truncate(u4, x >> 4)); |
| 168 | 161 | } |
| ... | ... | @@ -185,7 +178,7 @@ pub const Edwards25519 = struct { |
| 185 | 178 | // avoid these to keep the standard library lightweight. |
| 186 | 179 | fn pcMul(pc: [9]Edwards25519, s: [32]u8, comptime vartime: bool) IdentityElementError!Edwards25519 { |
| 187 | 180 | std.debug.assert(vartime); |
| 188 | | const e = nonAdjacentForm(s); |
| 181 | const e = slide(s); |
| 189 | 182 | var q = Edwards25519.identityElement; |
| 190 | 183 | var pos: usize = 2 * 32 - 1; |
| 191 | 184 | while (true) : (pos -= 1) { |
| ... | ... | @@ -280,8 +273,8 @@ pub const Edwards25519 = struct { |
| 280 | 273 | xpc[4].rejectIdentity() catch return error.WeakPublicKey; |
| 281 | 274 | break :pc xpc; |
| 282 | 275 | }; |
| 283 | | const e1 = nonAdjacentForm(s1); |
| 284 | | const e2 = nonAdjacentForm(s2); |
| 276 | const e1 = slide(s1); |
| 277 | const e2 = slide(s2); |
| 285 | 278 | var q = Edwards25519.identityElement; |
| 286 | 279 | var pos: usize = 2 * 32 - 1; |
| 287 | 280 | while (true) : (pos -= 1) { |
| ... | ... | @@ -318,7 +311,7 @@ pub const Edwards25519 = struct { |
| 318 | 311 | } |
| 319 | 312 | var es: [count][2 * 32]i8 = undefined; |
| 320 | 313 | for (ss) |s, i| { |
| 321 | | es[i] = nonAdjacentForm(s); |
| 314 | es[i] = slide(s); |
| 322 | 315 | } |
| 323 | 316 | var q = Edwards25519.identityElement; |
| 324 | 317 | var pos: usize = 2 * 32 - 1; |