UNPKG

@stablelib/poly1305

Version:

Poly1305 one-time message authentication code

281 lines 13.1 kB
// Copyright (C) 2016 Dmitry Chestnykh // MIT License. See LICENSE file for details. import { describe, expect, it } from 'vitest'; import { encode, decode } from "@stablelib/hex"; import { concat } from "@stablelib/bytes"; import { oneTimeAuth, Poly1305 } from "./poly1305.js"; const testVectors = [ { data: "48656C6C6F20776F726C6421", key: "746869732069732033322D62797465206B657920666F7220506F6C7931333035", mac: "A6F745008F81C916A20DCC74EEF2B2F0" }, { data: "0000000000000000000000000000000000000000000000000000000000000000", key: "746869732069732033322D62797465206B657920666F7220506F6C7931333035", mac: "49EC78090E481EC6C26B33B91CCC0307" }, { data: new Array(2007 + 1).join("00"), key: "746869732069732033322D62797465206B657920666F7220506F6C7931333035", mac: "DA84BCAB02676C38CDB015604274C2AA" }, { data: new Array(2007 + 1).join("00"), key: "0000000000000000000000000000000000000000000000000000000000000000", mac: "00000000000000000000000000000000" }, { data: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F" + "202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F" + "404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F" + "606162636465666768696A6B6C6D6E6F", key: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", mac: "B98AD2F7EC2AE52AFBA1E66FE9133817" }, /* * RFC7539 */ { data: "43727970746F6772617068696320466F72756D2052657365617263682047726F7570", key: "85D6BE7857556D337F4452FE42D506A80103808AFB0DB2FD4ABFF6AF4149F51B", mac: "A8061DC1305136C6C22B8BAF0C0127A9" }, /* * Test vectors from "The Poly1305-AES message-authentication Code" */ { data: "F3F6", key: "851FC40C3467AC0BE05CC20404F3F700580B3B0F9447BB1E69D095B5928B6DBC", mac: "F4C633C3044FC145F84F335CB81953DE" }, { data: "", key: "A0F3080000F46400D0C7E9076C834403DD3FAB2251F11AC759F0887129CC2EE7", mac: "DD3FAB2251F11AC759F0887129CC2EE7" }, { data: "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136", key: "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF", mac: "0EE1C16BB73F0F4FD19881753C01CDBE" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "5154AD0D2CB26E01274FC51148491F1B" }, /* * Self-generated */ { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "812059A5DA198637CAC7C4A631BEE466" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "5B88D7F6228B11E2E28579A5C0C1F761" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "BBB613B2B6D753BA07395B916AAECE15" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "C794D7057D1778C4BBEE0A39B3D97342" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "FFBCB9B371423152D7FCA5AD042FBAA9" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136" + "812059A5DA198637CAC7C4A631BEE466", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "069ED6B8EF0F207B3E243BB1019FE632" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136" + "812059A5DA198637CAC7C4A631BEE4665B88D7F6228B11E2E28579A5C0C1F761", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "CCA339D9A45FA2368C2C68B3A4179133" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136" + "812059A5DA198637CAC7C4A631BEE4665B88D7F6228B11E2E28579A5C0C1F761" + "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "53F6E828A2F0FE0EE815BF0BD5841A34" }, { data: "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136" + "812059A5DA198637CAC7C4A631BEE4665B88D7F6228B11E2E28579A5C0C1F761" + "AB0812724A7F1E342742CBED374D94D136C6B8795D45B3819830F2C04491FAF0" + "990C62E48B8018B2C3E4A0FA3134CB67FA83E158C994D961C4CB21095C1BF9AF" + "48443D0BB0D21109C89A100B5CE2C20883149C69B561DD88298A1798B10716EF" + "663CEA190FFB83D89593F3F476B6BC24D7E679107EA26ADB8CAF6652D0656136" + "812059A5DA198637CAC7C4A631BEE4665B88D7F6228B11E2E28579A5C0C1F761", key: "12976A08C4426D0CE8A82407C4F4820780F8C20AA71202D1E29179CBCB555A57", mac: "B846D44E9BBD53CEDFFBFBB6B7FA4933" }, { /* * poly1305_ieee754.c failed this in final stage */ data: "842364E156336C0998B933A6237726180D9E3FDCBDE4CD5D17080FC3BEB49614" + "D7122C037463FF104D73F19C12704628D417C4C54A3FE30D3C3D7714382D43B0" + "382A50A5DEE54BE844B076E8DF88201A1CD43B90EB21643FA96F39B518AA8340" + "C942FF3C31BAF7C9BDBF0F31AE3FA096BF8C63030609829FE72E179824890BC8" + "E08C315C1CCE2A83144DBBFF09F74E3EFC770B54D0984A8F19B14719E6363564" + "1D6B1EEDF63EFBF080E1783D32445412114C20DE0B837A0DFA33D6B82825FFF4" + "4C9A70EA54CE47F07DF698E6B03323B53079364A5FC3E9DD034392BDDE86DCCD" + "DA94321C5E44060489336CB65BF3989C36F7282C2F5D2B882C171E74", key: "95D5C005503E510D8CD0AA072C4A4D066EABC52D11653DF47FBF63AB198BCC26", mac: "F248312E578D9D58F8B7BB4D19105431" }, /* * AVX2 in poly1305-x86.pl failed this with 176+32 split */ { data: "248AC31085B6C2ADAAA38259A0D7192C5C35D1BB4EF39AD94C38D1C82479E2DD" + "2159A077024B0589BC8A20101B506F0A1AD0BBAB76E83A83F1B94BE6BEAE74E8" + "74CAB692C5963A75436B776121EC9F62399A3E66B2D22707DAE81933B6277F3C" + "8516BCBE26DBBD86F373103D7CF4CAD1888C952118FBFBD0D7B4BEDC4AE4936A" + "FF91157E7AA47C54442EA78D6AC251D324A0FBE49D89CC3521B66D16E9C66A37" + "09894E4EB0A4EEDC4AE19468E66B81F2" + "71351B1D921EA551047ABCC6B87A901FDE7DB79FA1818C11336DBC07244A40EB", key: "000102030405060708090A0B0C0D0E0F00000000000000000000000000000000", mac: "BC939BC5281480FA99C6D68C258EC42F" }, /* * test vectors from Google */ { data: "", key: "C8AFAAC331EE372CD6082DE134943B174710130E9F6FEA8D72293850A667D86C", mac: "4710130E9F6FEA8D72293850A667D86C", }, { data: "48656C6C6F20776F726C6421", key: "746869732069732033322D62797465206B657920666F7220506F6C7931333035", mac: "A6F745008F81C916A20DCC74EEF2B2F0" }, { data: "0000000000000000000000000000000000000000000000000000000000000000", key: "746869732069732033322D62797465206B657920666F7220506F6C7931333035", mac: "49EC78090E481EC6C26B33B91CCC0307" }, /* * test vectors from Andrew Moon */ { data: "8E993B9F48681273C29650BA32FC76CE48332EA7164D96A4476FB8C531A1186A" + "C0DFC17C98DCE87B4DA7F011EC48C97271D2C20F9B928FE2270D6FB863D51738" + "B48EEEE314A7CC8AB932164548E526AE90224368517ACFEABD6BB3732BC0E9DA" + "99832B61CA01B6DE56244A9E88D5F9B37973F622A43D14A6599B1F654CB45A74" + "E355A5", key: "EEA6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF880", mac: "F3FFC7703F9400E52A7DFB4B3D3305D9" }, { data: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", key: "0200000000000000000000000000000000000000000000000000000000000000", mac: "03000000000000000000000000000000" }, { data: "02000000000000000000000000000000", key: "02000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", mac: "03000000000000000000000000000000" }, { data: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + "11000000000000000000000000000000", key: "0100000000000000000000000000000000000000000000000000000000000000", mac: "05000000000000000000000000000000" }, { data: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE" + "01010101010101010101010101010101", key: "0100000000000000000000000000000000000000000000000000000000000000", mac: "00000000000000000000000000000000" }, { data: "FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", key: "0200000000000000000000000000000000000000000000000000000000000000", mac: "FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, { data: "E33594D7505E43B900000000000000003394D7505E4379CD0100000000000000" + "0000000000000000000000000000000001000000000000000000000000000000", key: "0100000000000000040000000000000000000000000000000000000000000000", mac: "14000000000000005500000000000000" }, { data: "E33594D7505E43B900000000000000003394D7505E4379CD0100000000000000" + "00000000000000000000000000000000", key: "0100000000000000040000000000000000000000000000000000000000000000", mac: "13000000000000000000000000000000" } ]; describe("poly1305", () => { it("should produce correct values", () => { testVectors.forEach(v => { const mac = oneTimeAuth(decode(v.key), decode(v.data)); expect(encode(mac)).toBe(v.mac); }); }); it('multiple update should produce the same result as a single update', () => { const key = new Uint8Array(32); for (let i = 0; i < key.length; i++) { key[i] = i; } const data = new Uint8Array(4 + 64 + 169); for (let i = 0; i < data.length; i++) { data[i] = i; } const d1 = data.subarray(0, 4); const d2 = data.subarray(4, 4 + 64); const d3 = data.subarray(4 + 64); expect(encode(concat(d1, d2, d3))).toBe(encode(data)); const p1 = new Poly1305(key); p1.update(data); const r1 = p1.digest(); const p2 = new Poly1305(key); p2.update(d1); p2.update(d2); p2.update(d3); const r2 = p2.digest(); expect(encode(r1)).toBe(encode(r2)); }); }); //# sourceMappingURL=poly1305.test.js.map