| ... | @@ -229,18 +229,17 @@ pub const Hash = struct { | ... | @@ -229,18 +229,17 @@ pub const Hash = struct { |
| 229 | const buf = self.state.toSlice(); | 229 | const buf = self.state.toSlice(); |
| 230 | var in = data; | 230 | var in = data; |
| 231 | while (in.len > 0) { | 231 | while (in.len > 0) { |
| 232 | var left = State.RATE - self.buf_off; | 232 | const left = State.RATE - self.buf_off; |
| 233 | if (left == 0) { | | |
| 234 | self.state.permute(); | | |
| 235 | self.buf_off = 0; | | |
| 236 | left = State.RATE; | | |
| 237 | } | | |
| 238 | const ps = math.min(in.len, left); | 233 | const ps = math.min(in.len, left); |
| 239 | for (buf[self.buf_off .. self.buf_off + ps]) |*p, i| { | 234 | for (buf[self.buf_off .. self.buf_off + ps]) |*p, i| { |
| 240 | p.* ^= in[i]; | 235 | p.* ^= in[i]; |
| 241 | } | 236 | } |
| 242 | self.buf_off += ps; | 237 | self.buf_off += ps; |
| 243 | in = in[ps..]; | 238 | in = in[ps..]; |
| | 239 | if (self.buf_off == State.RATE) { |
| | 240 | self.state.permute(); |
| | 241 | self.buf_off = 0; |
| | 242 | } |
| 244 | } | 243 | } |
| 245 | } | 244 | } |
| 246 | | 245 | |
| ... | @@ -277,6 +276,22 @@ test "hash" { | ... | @@ -277,6 +276,22 @@ test "hash" { |
| 277 | htest.assertEqual("1C9A03DC6A5DDC5444CFC6F4B154CFF5CF081633B2CEA4D7D0AE7CCFED5AAA44", &md); | 276 | htest.assertEqual("1C9A03DC6A5DDC5444CFC6F4B154CFF5CF081633B2CEA4D7D0AE7CCFED5AAA44", &md); |
| 278 | } | 277 | } |
| 279 | | 278 | |
| | 279 | test "hash test vector 17" { |
| | 280 | var msg: [32 / 2]u8 = undefined; |
| | 281 | try std.fmt.hexToBytes(&msg, "000102030405060708090A0B0C0D0E0F"); |
| | 282 | var md: [32]u8 = undefined; |
| | 283 | hash(&md, &msg, .{}); |
| | 284 | htest.assertEqual("404C130AF1B9023A7908200919F690FFBB756D5176E056FFDE320016A37C7282", &md); |
| | 285 | } |
| | 286 | |
| | 287 | test "hash test vector 33" { |
| | 288 | var msg: [32]u8 = undefined; |
| | 289 | try std.fmt.hexToBytes(&msg, "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); |
| | 290 | var md: [32]u8 = undefined; |
| | 291 | hash(&md, &msg, .{}); |
| | 292 | htest.assertEqual("A8F4FA28708BDA7EFB4C1914CA4AFA9E475B82D588D36504F87DBB0ED9AB3C4B", &md); |
| | 293 | } |
| | 294 | |
| 280 | pub const Aead = struct { | 295 | pub const Aead = struct { |
| 281 | pub const tag_length = State.RATE; | 296 | pub const tag_length = State.RATE; |
| 282 | pub const nonce_length = 16; | 297 | pub const nonce_length = 16; |