| ... | ... | @@ -155,12 +155,12 @@ fn AesOcb(comptime Aes: anytype) type { |
| 155 | 155 | xorWith(&offset, lx.star); |
| 156 | 156 | var pad = offset; |
| 157 | 157 | aes_enc_ctx.encrypt(&pad, &pad); |
| 158 | | for (m[i * 16 ..], 0..) |x, j| { |
| 159 | | c[i * 16 + j] = pad[j] ^ x; |
| 160 | | } |
| 161 | 158 | var e = [_]u8{0} ** 16; |
| 162 | 159 | @memcpy(e[0..leftover], m[i * 16 ..][0..leftover]); |
| 163 | 160 | e[leftover] = 0x80; |
| 161 | for (m[i * 16 ..], 0..) |x, j| { |
| 162 | c[i * 16 + j] = pad[j] ^ x; |
| 163 | } |
| 164 | 164 | xorWith(&sum, e); |
| 165 | 165 | } |
| 166 | 166 | var e = xorBlocks(xorBlocks(sum, offset), lx.dol); |
| ... | ... | @@ -354,3 +354,32 @@ test "AesOcb test vector 4" { |
| 354 | 354 | try Aes128Ocb.decrypt(&m2, &c, tag, &ad, nonce, k); |
| 355 | 355 | assert(mem.eql(u8, &m, &m2)); |
| 356 | 356 | } |
| 357 | |
| 358 | test "AesOcb in-place encryption-decryption" { |
| 359 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 360 | |
| 361 | var k: [Aes128Ocb.key_length]u8 = undefined; |
| 362 | var nonce: [Aes128Ocb.nonce_length]u8 = undefined; |
| 363 | var tag: [Aes128Ocb.tag_length]u8 = undefined; |
| 364 | var m: [40]u8 = undefined; |
| 365 | var original_m: [m.len]u8 = undefined; |
| 366 | _ = try hexToBytes(&k, "000102030405060708090A0B0C0D0E0F"); |
| 367 | _ = try hexToBytes(&m, "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"); |
| 368 | _ = try hexToBytes(&nonce, "BBAA9988776655443322110D"); |
| 369 | const ad = m; |
| 370 | |
| 371 | @memcpy(&original_m, &m); |
| 372 | |
| 373 | Aes128Ocb.encrypt(&m, &tag, &m, &ad, nonce, k); |
| 374 | |
| 375 | var expected_c: [m.len]u8 = undefined; |
| 376 | var expected_tag: [tag.len]u8 = undefined; |
| 377 | _ = try hexToBytes(&expected_tag, "ED07BA06A4A69483A7035490C5769E60"); |
| 378 | _ = try hexToBytes(&expected_c, "D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7A"); |
| 379 | |
| 380 | try testing.expectEqualSlices(u8, &expected_tag, &tag); |
| 381 | try testing.expectEqualSlices(u8, &expected_c, &m); |
| 382 | try Aes128Ocb.decrypt(&m, &m, tag, &ad, nonce, k); |
| 383 | |
| 384 | try testing.expectEqualSlices(u8, &original_m, &m); |
| 385 | } |