| ... | ... | @@ -229,18 +229,17 @@ pub const Hash = struct { |
| 229 | 229 | const buf = self.state.toSlice(); |
| 230 | 230 | var in = data; |
| 231 | 231 | while (in.len > 0) { |
| 232 | | var left = State.RATE - self.buf_off; |
| 233 | | if (left == 0) { |
| 234 | | self.state.permute(); |
| 235 | | self.buf_off = 0; |
| 236 | | left = State.RATE; |
| 237 | | } |
| 232 | const left = State.RATE - self.buf_off; |
| 238 | 233 | const ps = math.min(in.len, left); |
| 239 | 234 | for (buf[self.buf_off .. self.buf_off + ps]) |*p, i| { |
| 240 | 235 | p.* ^= in[i]; |
| 241 | 236 | } |
| 242 | 237 | self.buf_off += ps; |
| 243 | 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 | 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 | 295 | pub const Aead = struct { |
| 281 | 296 | pub const tag_length = State.RATE; |
| 282 | 297 | pub const nonce_length = 16; |