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