gmsm/mlkem/mlkem512_test.go

337 lines
72 KiB
Go
Raw Normal View History

Merge develop into main (#370) * build(deps): bump github/codeql-action from 3.29.11 to 3.30.0 (#361) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.11 to 3.30.0. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/3c3833e0f8c1c83d449a7478aa59c036a9165498...2d92b76c45b91eb80fc44c74ce3fce0ee94e8f9d) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.30.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump codecov/codecov-action from 5.5.0 to 5.5.1 (#362) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.5.0 to 5.5.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/fdcc8476540edceab3de004e990f80d881c6cc00...5a1091511ad55cbe89839c7260b706298ca349f7) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: 5.5.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump actions/setup-go from 5.5.0 to 6.0.0 (#363) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5.5.0 to 6.0.0. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/d35c59abb061a4a6fb18e82ac0862c26744d6ab5...44694675825211faa026b3c33043df3e48a5fa00) --- updated-dependencies: - dependency-name: actions/setup-go dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github/codeql-action from 3.30.0 to 3.30.1 (#364) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.0 to 3.30.1. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/2d92b76c45b91eb80fc44c74ce3fce0ee94e8f9d...f1f6e5f6af878fb37288ce1c627459e94dbf7d01) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.30.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump step-security/harden-runner from 2.13.0 to 2.13.1 (#367) Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.13.0 to 2.13.1. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/ec9f2d5744a09debf3a187a3f4f675c53b671911...f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-version: 2.13.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump github/codeql-action from 3.30.1 to 3.30.2 (#368) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.1 to 3.30.2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/f1f6e5f6af878fb37288ce1c627459e94dbf7d01...d3678e237b9c32a6c9bffb3315c335f976f3549f) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.30.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(mlkem): initialize mlkem from golang standard library * chore(mlkem): refactoring, reduce alloc times * build(deps): bump github/codeql-action from 3.30.2 to 3.30.3 (#369) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.2 to 3.30.3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/d3678e237b9c32a6c9bffb3315c335f976f3549f...192325c86100d080feab897ff886c34abd4c83a3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.30.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * doc(README): include MLKEM --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sun Yimin <emmansun@users.noreply.github.com>
2025-09-11 08:48:21 +08:00
// Copyright 2025 Sun Yimin. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
//go:build go1.24
package mlkem
import (
"bytes"
"crypto/rand"
"encoding/hex"
"errors"
"io"
"testing"
)
// https://github.com/usnistgov/ACVP-Server/blob/master/gen-val/json-files/ML-KEM-keyGen-FIPS203/internalProjection.json
var kenGen512InternalProjectionCases = []struct {
tcId int
seed string
ek string
dk string
}{
{
1,
"BBA3C0F5DF044CDF4D9CAA53CA15FDE26F34EB3541555CFC54CA9C31B964D0C80A64FDD51A8D91B3166C4958A94EFC3166A4F5DF680980B878DB8371B7624C96",
"1CAB32BE749CA76124EE19907B9CCB7FD30F8B2C38DC970E81F9956C97A8BD3C6E37B07C29E60BB2B75C5258B572626A859ABA89DB3AABC571424618B26310278B8EC4E76ED07A10B864AABF37BFC9F364731050631421BFCB1C3B9153D4316A95089197A027AB80B39C362CE6D97EFF422244FB81AAF67354F03894CC25B2707939A4A06D302C59D106EB743678DAA3F1D1C3F46B03F0DAA0641835A548363180744E6B6235B84DB9A4628279A6EF7231499208E657A3F9BB6E3F782606B79FC9A38723576FA80898E8A6887D94C3ED774E46A86CFE705B34C6B5535865329C5A4A820F9114CE9A9C68495C726368B9E073CBBE627A7DE419F7F7B4AD221576F91FB1E66CFF9651BD6C25E3CC9CA49A570CF041E457658072B684E714BD6A86B3D05C7597A729E12E512C8D7E5B5C27049EFB0AC0E085B1B88347BFD314B4E4AB4B8875A489ADB8C9AE28008BAD36AAAD24683563BFAF19BDA8677AB7BAC7E33C3087B84A45246A2AB1AEF397750D386ACDAC63C87506166A0FAE18773F530E74545D54BC670DD7353B75B16373CB8A6269AF37097EE1B1640458153132AD80AB64F7A599B8670E301205043C136C56CA5A06DBFABA3204671C1B237B18824555B5DDB206A74ACE637005B363238378BDA5E198AD69B85CBB399E8B07CB899F9E93CF6CF62FCAFC9E4D77363CA2149E92197F2133223799C182CF5F182ECD35B5FDFCBF0A93A1350198F2F244F3216B442A22FDDB2F4F3BB8CBF0168D0220AA725A0E287DF08079A1DBB8747C02F0C2C829759A5D95B6237522E7F71AB5669390377E03A93AB7FC7E9FD6BB59C1B9B8CC966141B0BA6796E66829D6A403B1F5816C8557EE8841031B2ED6C6CCFE8A55B39B9273F8BA050B1B328C7B9A238A7B8324F16A7A474C0B5721B9C8246531E19208838356F3337768BCB3397B4E01CC26175B67A66DFCD11F07B295C20AB484A60E7D086DB39B8301845B654A484462508FA78506357BBBF42DBAC157BCA7769C099A0B1894D4A17256F504EBE50BE284656F653845A26B00856D76A8A5A166CD09D04705261EBAFA20687A1068D9B9E28326848B67A0A3994D2DBA4B7A8F623B901E17CBEE610847A2903301C58287",
"C8D473A9EA0987F356FB309356A39E766633746B8FBAF03D588495E4B1CC87E4B283C871514182D3E1844D9ACB4FA5948BC38D85E05478BB699E41170FA593F7D74226D4597655C5DE80AC8C79181EE750121685C71797D3B5C240676637C7BDEBA61969508C3FABB4CD97CC53C529EBC993C4B883B2B52F42789F64C022620B624B8107E0E55FFE29280BB005DC66A83A0A219A0080F8E656729B29CBF8AA7866358694C94E477E499A055C8A8ECAC7338F461897329ED02B1EF0F0AB627B71B5322692268578B11E5EC203E674251C0182C10C775971247537358C0651EF21704CC68B57D5CF61C627C0AB30DE5743FB027B40D86071531F0C8B67092BAC18361FACEC1BFC53C65D512B3911156A991F462C8588D638526389E3CAAC808809EB7B50ACB83A10142C954B9AC938B983133D5D024303790DF848B7FB06AE4C751DAEDBAF08728A96C481B5A84B53FA37DEEAC6174C745F3C0821553CC88858C3DB392570AA388624CFA98E7232970B746BCF301642D92F3E452E3BF99E24329C470A57B31AA765C8952333A334102605BB8099555230287F07A813109C427E692393540FAD769831756701B481611472A060CA1E7C34F9412371C7658F4C69C9C0BC956404B88AB27BC89ED7F751E51781D95A1D0DCC476E7A8FD4A54272B5A9679B0227176D481035A3864FD747B52739B8FA801713BC0757347BC96A022487BFA5A3C0E30B9FBEAA6838553D9111351FF49A73970263B39CDF180F163972AB993C1630A89A06A2FF69A274F27A819C3727E2244B23163B320DD568B227B6589A402A5E16333C70C4D3264CAC8A80BDC64705675788CC20FE083635D25C89F387F5B39580737F06287F236B7CCCA4CC3A69AC0E84B33B20BA7661B8BA9B575CC555DC820481FA9941A8C259D962273536B36B0BB1E434B18A63BE405583925CCA14001FF9AA28EA7FFF525ABA151944607056F6CD5052C823D00F33651BFBF428257B388544654E9A14F2E595BB4CC5D5929A03F62BC2DC6C6B885D86969B298A06F0294CAE69337944C4AEB5B22E126AEB02BD34083637299D2C41080481C61CAB32BE749CA76124EE19907B9CCB7FD30F8B2C38DC970E81F9956C97A8BD3C6E37B07C29E60BB2B75C5258B572626A859ABA89DB3AABC571424618B26310278B8EC4E76ED07A10B864AABF37BFC9F364731050631421BFCB1C3B9153D4316A95089197A027AB80B39C362CE6D97EFF422244FB81AAF67354F03894CC25B2707939A4A06D302C59D106EB743678DAA3F1D1C3F46B03F0DAA0641835A548363180744E6B6235B84DB9A4628279A6EF7231499208E657A3F9BB6E3F782606B79FC9A38723576FA80898E8A6887D94C3ED774E46A86CFE705B34C6B5535865329C5A4A820F9114CE9A9C68495C726368B9E073CBBE627A7DE419F7F7B4AD221576F91FB1E66CFF9651BD6C25E3CC9CA49A570CF041E457658072B684E714BD6A86B3D05C7597A729E12E512C8D7E5B5C27049EFB0AC0E085B1B88347BFD314B4E4AB4B8875A489ADB8C9AE28008BAD36AAAD24683563BFAF19BDA8677AB7BAC7E33C3087B84A45246A2AB1AEF397750D386ACDAC63C87506166A0FAE18773F530E74545D54BC670DD7353B75B16373CB8A6269AF37097EE1B1640458153132AD80AB64F7A599B8670E301205043C136C56CA5A06DBFABA3204671C1B237B18824555B5DDB206A74ACE637005B363238378BDA5E198AD69B85CBB399E8B07CB899F9E93CF6CF62FCAFC9E4D77363CA2149E92197F2133223799C182CF5F182ECD35B5FDFCBF0A93A1350198F2F244F3216B442A22FDDB2F4F3BB8CBF0168D0220AA725A0E287DF08079A1DBB8747C02F0C2C829759A5D95B6237522E7F71AB5669390377E03A93AB7FC7E9FD6BB59C1B9B8CC966141B0BA6796E66829D6A403B1F5816C8557EE8841031B2ED6C6CCFE8A55B39B9273F8BA050B1B328C7B9A238A7B8324F16A7A474C0B5721B9C8246531E19208838356F3337768BCB3397B4E01CC26175B67A66DFCD11F07B295C20AB484A60E7D086DB39B8301845B654A484462508FA78506357BBBF42DBAC157BCA7769C099A0B1894D4A17256F504EBE50BE284656F653845A26B00856D76A8A5A166CD09D04705261EBAFA20687A1068D9B9E28326848B67A0A3994D2DBA4B7A8F623B901E17CBEE610847A2903301C5828747D4B351E049B7757A2545602C398D2EBCF7C28804BCC8862E270D7324AB435E0A64FDD51A8D91B3166C4958A94EFC3166A4F5DF680980B878DB8371B7624C96",
},
{
2,
"00C7E4AB727C202A92869BE37F8A7CBAE63A67463C3A54000F1A3290B987E96F3764A9B01F8C411BEB6DACF298CC30841FEB65A10D6DEBA9780338B4970B983E",
"C4A019A8941B1C639C0C6698AAA051E3B9C78BF7A15005A92AB3C6AB30AE974682F517B96F743889696F6F75BDDF6C9A588963AE04477FD52396C3B904459A3DAA39D5939F33817E8F20CD70860915F3B59FB088FFF98C0AFAAEFE352344681A249BCD0529B3578B4123D35C88E14F67616B1E19B28D027AB7988680CB3B1C257257D36FC3A2B81E18B1F918AB9EB650874135AAD478E3F5B34526856F81A3C32541781127F82304FE86BE29A70D489177FA5B9292882BDC58B5756043C558CC50D666D888C70762C71FAA5A0014A1E573B080016BFB17172D8B1B563C64AC39B536D568DA1853D00968334C412A26AE9272B0606A98C6199E96417A946B8780988445BC867050B5CA9904B6322DC059993068B02C09C9C9C2B00E719F45FBAF183B02CA258C95239E5A4993376B7BC47A8D2751C75C59B3AAA90640379ACB0A66B1ECA226D95E377CBC47B7210422BE338283404496D8A29C8553417E38818547ACB6213D7892248BA7746626B562CB1209871A058A92E85248B37185DD3393D7C95C9C36159CD646A7713B47A60EF33825F4F7CCBBC07B4AF88C25A553D11C3D637859818387013806D5A24914FBC7E6D58977674598CC57CF632148C6BFBE24878F318E1471B08EBC90DB01978A837A86C36C3ED14E69F7C771C32939B7AAA28498A038B558F75779D5C2C0736003C91864206E52A296F949058069ADC15033251890309A3F94D97A2716992C7745F8A991D10653E6F480F7A912C6619B0BD85926F8A2A9885112ABB1C3604EFA6B84301A2ABD0A5D6FC29C8B16C98AFA817B41ACF90C9776D603FC7A6B8DF22377E26105D159D35C1089ACAE7B7427DDB6B01E1CAE79FB8AFAA6917C16BB4DCA544B3CB121D00F4921CDF10BBF4437588351623153C916908BD5824684DCAA5B4C44EE9B1063405F723CA60EB52E0B75B7BF67BFD6D34F5AA94657B3AD1BD4CC8D0566BA35C501A78BCF8183D5A52D2E5C4E606AC09C29ABE5A539A280AB838B66A261BADE2028C1D1A9C352B4C6F1919BDA72C2C213D3EA9586C73E0E2C3486D9B199FAA0EA8B039EE9C3EE3B8E1380CE3C0E2BA2E81C9745BD63054616AD78EC8AC8C44B08CC4A217CA320DE7476805E",
"B0618E21C291A7D7228F2B5624037B382628A90A89D0213D54E20CA6989BF887A5F0E03256F660264724A5518830B5BA681153C512454CC47A3CEC3E49F3B300A928B05316155C0CF2E069BD6084B52C30422878064B6CB3535FB5485491E6874AA00D820770D0E55A6CAB40F3F4117E764EA43C62A3912943B6096CC41FF87ACA0C140AA37A8C49170E355B60CBF16399A00508989A316CB99426BCC9B9054AE7B46DD3B9CE703CA98C4E8FF6759D2006E66114027B92DCC40F9B2C7402A7C9EE7849955BA9FB35543427701F4C9267F65CD37640265192EB085AA5F02DBEB7125D77145E9B1BDD330E2E687E50789F9D814F4587C3030A5FF95724E62AA84490ACA3C2C76AEC24C29C82385597A9A4395506B21160BF5360133BF709F016817AA5CA266A9556BAA4CA71050B0A71400B97AF4C07782711EC290ED3799C91967AA5E9000BC670F295B53DA415EF8BA631F178F98C747AFC5673D61FC6C280FEB37467D09C80257FBCC02C6D14A48AFB72C7499AF802614D24352750CFD7956B9C77BF92B561AD4365E3666DCBE8033793BEFCC9C5AB572838B4BF459CB1A9822D410B0C6CFB5CA55723FFA555A197657E9A7DE72BCB76995D2E0BAA71409301B07AAAD1A092C3020C1032628109D11C1D46F50A739CB63497BA48BBA556E5A17F629E1D965C356809A3456BEF572234064EE79B9D68169628D8AF01DB25B138B27C6129F493522E40B81A91632CCC41B772CDC2211C10D07422272DD0967C9BB52C52832BA807C7642587C608A0748A32B8766A2C3345AAB527700C49AF887582A049D490B053D34B9A9B038C63AD829969FA706C93B906736A897C9C7187430CFC980116B73E018C7F3FB6420C8046EA86977FAA904597313555C4700594225CA3C9B61F789A59CC350DEEE23D37D5A585672446560C6F38278C0C595B61258BA9430393B1171AA24A530BA37999ED395FE2050A15D9AE74751177890137333B01850BD1535788946817EC1FC604AC2C01C6E23720236BB329172AEFE096B5F93252DC6BB6D82C369AA14822AA92667578CA1238958DA72188D0BBA63DD7B6C4A019A8941B1C639C0C6698AAA051E3B9C78BF7A15005A92AB3C6AB30AE974682F517B96F743889696F6F75BDDF6C9A588963AE04477FD52396C3B904459A3DAA39D5939F33817E8F20CD70860915F3B59FB088FFF98C0AFAAEFE352344681A249BCD0529B3578B4123D35C88E14F67616B1E19B28D027AB7988680CB3B1C257257D36FC3A2B81E18B1F918AB9EB650874135AAD478E3F5B34526856F81A3C32541781127F82304FE86BE29A70D489177FA5B9292882BDC58B5756043C558CC50D666D888C70762C71FAA5A0014A1E573B080016BFB17172D8B1B563C64AC39B536D568DA1853D00968334C412A26AE9272B0606A98C6199E96417A946B8780988445BC867050B5CA9904B6322DC059993068B02C09C9C9C2B00E719F45FBAF183B02CA258C95239E5A4993376B7BC47A8D2751C75C59B3AAA90640379ACB0A66B1ECA226D95E377CBC47B7210422BE338283404496D8A29C8553417E38818547ACB6213D7892248BA7746626B562CB1209871A058A92E85248B37185DD3393D7C95C9C36159CD646A7713B47A60EF33825F4F7CCBBC07B4AF88C25A553D11C3D637859818387013806D5A24914FBC7E6D58977674598CC57CF632148C6BFBE24878F318E1471B08EBC90DB01978A837A86C36C3ED14E69F7C771C32939B7AAA28498A038B558F75779D5C2C0736003C91864206E52A296F949058069ADC15033251890309A3F94D97A2716992C7745F8A991D10653E6F480F7A912C6619B0BD85926F8A2A9885112ABB1C3604EFA6B84301A2ABD0A5D6FC29C8B16C98AFA817B41ACF90C9776D603FC7A6B8DF22377E26105D159D35C1089ACAE7B7427DDB6B01E1CAE79FB8AFAA6917C16BB4DCA544B3CB121D00F4921CDF10BBF4437588351623153C916908BD5824684DCAA5B4C44EE9B1063405F723CA60EB52E0B75B7BF67BFD6D34F5AA94657B3AD1BD4CC8D0566BA35C501A78BCF8183D5A52D2E5C4E606AC09C29ABE5A539A280AB838B66A261BADE2028C1D1A9C352B4C6F1919BDA72C2C213D3EA9586C73E0E2C3486D9B199FAA0EA8B039EE9C3EE3B8E1380CE3C0E2BA2E81C9745BD63054616AD78EC8AC8C44B08CC4A217CA320DE7476805EA1CBE5BF3592B77207A8C0C8E3FAA7EF66DEB7C18CE8CCF387A76B39CB4ECB723764A9B01F8C411BEB6DACF298CC30841FEB65A10D6DEBA9780338B4970B983E",
},
{
3,
"99683B23ACDA10B8FE4A877FFDAFA3974CA82812119B26FBC3CFD8D13268BCE951DA028C3ED5E25860B2F5C7334317DFB9F263FBA3C4AA9CF579F98F33706AF4",
"08C9A217A9BB0BB90955E2A5513488D9675316D1086C7774218649373C5EF425003EFCA50CE8B2A9349847C011CC421968F990010969BB879FD0D91A28074E9FF06988521EDC12B3AA1A466B955D481A095BBB15AD0130B11953176B5573E379D4E42609C6967A339C3B7453498CBBD4489F54DA0B8ED42A24DC6AA00515F7586703F1C612C6A57AF2B6CABB1991ACAF980104B17A5E1C097A67C46637E380DB91CE6FB612EA35C194200EFB96029B980FDF2B3D36A0561392A89C788676B48A771CA6A47229C0907355317E9EB88903F17792048FAAD182E2C065E30B63FFDA51B69554B0344E27895C4D924CA5FA80BED6AC0A372877454F98C77C4C699D9259BBE30A810BF163CB5817E9339C17151F9678BDA7E00BA1C965F1FB6193753CFC964D82EC36528490DE2539D830CA20FCB232FA3973511D40B1334FF2AC016CCB271CB06432BFD3BA5C7060785D2C3A32AAA4C0762EE873A91955657F49C7B2972106EBBCA39442A3C9490D7A4805F39DAB8A29E08B89A2F80EBE678B200A3DBB376511F62F1A77383F32B6EAB75F462030F75C95719517A4311FD25977B31537C804904B2C0297B63499A0965009B926237965158E9B7963F4A41574306EBD66C80BA4C3B5BB2BD77131C79794985B0EBF0CC351CCBE5BF92611E793C8308F0A8B5CD544556FA0C4DF25656554A1C5D43E79751200B3546929B7975538493B71B2FA40EA0747FD784D6177554D18340A940C89A40E36C84186E9748E1B478C16252E729F84536050E7C448B14FB8687696497412A5A2F8929EA6FB67FF9119331908BB24195D03ABA2C21439191E2539B0DAB826082572521181E69575AA31000FA627D3E80C5EB8BFBA688F69595AAE845AB9AA1955C01CE84674EE16682A1816725A3A8C884532BB9DBA6CACADF9C48446C2D1AA94B46930A180109D3197CC7398A7659C20ECCA63462AC508687314859C08038B5BB7FAE5C2E03AA7F348629CF423D491A5B45791A8A33BDAF101CE05A40C48CFD27930BE98762D79017E109040CB5E7CD66E49F5BFC84744627643E6EA2BEC647FE2D216663352E7D90067DB55732D97E0668D8B44A04821F740E4A04265E2A7AAA4EAB8734262008F55",
"1ABC8DB637C626CB70D4CA58323140DEFABBCE522D4F55614B512B041C98DCDA87781770279A2A63E985538CB6E1EB800637269CA0AE0AF075FE91AD25A5C264C51AA3245B987C679EFB92BD0CA6FAB6543E04513DB5777FA98FE495C8695B91BC123F86C55F9632017DC82D4AB79A67DA61B167044979CDD8C4CB57749733CC8B5C4C344F475AA949386A97C8EE666C13C53F43296AC7D76837C6C20EC28D6A550848EC67648284A479646821A66F0358B80A85C73009045C9A17F2ABC556676F838DFB250A35D1073DA307AC83B20DD7A6E3099A2CB423FD07C25619405E86C2D6C3B447EC8201572099ABC17476A2E67B4C878918FFC0A59D21175A32096247A1FBE922050A029B5A88D11430B5A02DA8864B5C637204075DE7986AEB3089F007CA3784331FF33715DB9D436C8A81B203310900192718F8E2342376C042AC92E51C86BAF22A6467332789AC7C4424E619668C57876E053EA8E0B19B78714C22B4E4F32D0F0917ECB64E8DCCB25BC5379B60A43B1AC81CB763429B0F6C89C01BB44F5B184EAED62720CBB8823C3B80A6AC4CF8047D3C625D24B36CE7C8A87A637FFC4704E7181F341477FA139314A5EC91329829C80A09C2D965108A8CAB974A297B495E0C9779E2740F94E361C9D1C4E81185EFA37BB745566797CEFD8B0834ACA9F774A13E799E61694C14EC9CEE903FEC595C4DC853740379485B8F28F04EA2304423B3C74530840F3041DF684846A89B5B8C1619F04356EB24ADB79803D0110114BE9EA962B84A0D936500B9DAC99E1A924FA1515C2CA7F3C745B922BA58458FFF71A18A990B33923C40D2359FE58ACCD6A548B62A8D26A5A50CC439E07BAEF230D2161367C3AB46619497BC5F9DA7430969BA48D9CD1DE500B9A76B017600B999CBC2A828298B94A88AB6CB3738CD6BAF3C299AC6AC6029B8289F4A276F6C6FAA20B7393940B10B7650FB430430AB12BB29EBFA6AB263A2AF1AA880C730B2D655C2C67066D7A06064B91ED90F7BBB559D0B7B20C4721EB907F469A0AC9B975816A0F3038AC53040637A9FB8276F33C93097B579E8B7CDCAF1214F175108C9A217A9BB0BB90955E2A5513488D9675316D1086C7774218649373C5EF425003EFCA50CE8B2A9349847C011CC421968F990010969BB879FD0D91A28074E9FF06988521EDC12B3AA1A466B955D481A095BBB15AD0130B11953176B5573E379D4E42609C6967A339C3B7453498CBBD4489F54DA0B8ED42A24DC6AA00515F7586703F1C612C6A57AF2B6CABB1991ACAF980104B17A5E1C097A67C46637E380DB91CE6FB612EA35C194200EFB96029B980FDF2B3D36A0561392A89C788676B48A771CA6A47229C0907355317E9EB88903F17792048FAAD182E2C065E30B63FFDA51B69554B0344E27895C4D924CA5FA80BED6AC0A372877454F98C77C4C699D9259BBE30A810BF163CB5817E9339C17151F9678BDA7E00BA1C965F1FB6193753CFC964D82EC36528490DE2539D830CA20FCB232FA3973511D40B1334FF2AC016CCB271CB06432BFD3BA5C7060785D2C3A32AAA4C0762EE873A91955657F49C7B2972106EBBCA39442A3C9490D7A4805F39DAB8A29E08B89A2F80EBE678B200A3DBB376511F62F1A77383F32B6EAB75F462030F75C95719517A4311FD25977B31537C804904B2C0297B63499A0965009B926237965158E9B7963F4A41574306EBD66C80BA4C3B5BB2BD77131C79794985B0EBF0CC351CCBE5BF92611E793C8308F0A8B5CD544556FA0C4DF25656554A1C5D43E79751200B3546929B7975538493B71B2FA40EA0747FD784D6177554D18340A940C89A40E36C84186E9748E1B478C16252E729F84536050E7C448B14FB8687696497412A5A2F8929EA6FB67FF9119331908BB24195D03ABA2C21439191E2539B0DAB826082572521181E69575AA31000FA627D3E80C5EB8BFBA688F69595AAE845AB9AA1955C01CE84674EE16682A1816725A3A8C884532BB9DBA6CACADF9C48446C2D1AA94B46930A180109D3197CC7398A7659C20ECCA63462AC508687314859C08038B5BB7FAE5C2E03AA7F348629CF423D491A5B45791A8A33BDAF101CE05A40C48CFD27930BE98762D79017E109040CB5E7CD66E49F5BFC84744627643E6EA2BEC647FE2D216663352E7D90067DB55732D97E0668D8B44A04821F740E4A04265E2A7AAA4EAB8734262008F55BA5847B144C55CB6F43370E75F26C97B32E62B786D7F0E68D590846B65A9D85551DA028C3ED5E25860B2F5C7334317DFB9F263FBA3C4AA9CF579F98F33706AF4",
},
}
func TestKeyGen512ACVP(t *testing.T) {
for i, tc := range kenGen512InternalProjectionCases {
seed, _ := hex.DecodeString(tc.seed)
ek, _ := hex.DecodeString(tc.ek)
dk, _ := hex.DecodeString(tc.dk)
dk1, err := NewDecapsulationKeyFromSeed512(seed)
if err != nil {
t.Fatalf("case %d: NewDecapsulationKeyFromSeed512: %v", i, err)
}
if !bytes.Equal(dk1.Bytes(), dk) {
t.Fatalf("case %d: decapsulation key mismatch", i)
}
ek1, err := NewEncapsulationKey512(ek)
if err != nil {
t.Fatalf("case %d: NewEncapsulationKey512: %v", i, err)
}
if !bytes.Equal(ek1.Bytes(), ek) {
t.Fatalf("case %d: encapsulation key mismatch", i)
}
dk2, err := NewDecapsulationKey512(dk)
if err != nil {
t.Fatalf("case %d: NewDecapsulationKey512: %v", i, err)
}
if !bytes.Equal(dk2.Bytes(), dk) {
t.Fatalf("case %d: decapsulation key mismatch", i)
}
if !bytes.Equal(dk2.EncapsulationKey().Bytes(), ek) {
t.Fatalf("case %d: encapsulation key mismatch", i)
}
}
}
func TestGenerateKey512_Success(t *testing.T) {
// Provide enough random bytes for d and z (64 bytes)
randBytes := make([]byte, 64)
for i := range randBytes {
randBytes[i] = byte(i)
}
r := &mockRand{data: randBytes}
key, err := GenerateKey512(r)
if err != nil {
t.Fatalf("expected success, got error: %v", err)
}
if key == nil {
t.Fatal("expected non-nil key")
}
// Check that the key's seed matches the input
seed := key.Seed()
if !bytes.Equal(seed[:32], randBytes[:32]) || !bytes.Equal(seed[32:], randBytes[32:]) {
t.Errorf("key.Seed() does not match input random bytes")
}
}
func TestGenerateKey512_ErrorOnD(t *testing.T) {
// Simulate error when reading d
r := &mockRand{err: errors.New("fail on d")}
_, err := GenerateKey512(r)
if err == nil || err.Error() != "fail on d" {
t.Fatalf("expected error 'fail on d', got: %v", err)
}
}
func TestGenerateKey512_ErrorOnZ(t *testing.T) {
// Simulate error when reading z (first read ok, second fails)
r := &mockRand{data: make([]byte, 32), err: errors.New("fail on z")}
// The first 32 bytes will be read for d, then error for z
_, err := GenerateKey512(io.MultiReader(
bytes.NewReader(r.data),
&mockRand{err: r.err},
))
if err == nil || err.Error() != "fail on z" {
t.Fatalf("expected error 'fail on z', got: %v", err)
}
}
func TestNewDecapsulationKey512_InvalidLength(t *testing.T) {
// Too short
short := make([]byte, DecapsulationKeySize512-1)
_, err := NewDecapsulationKey512(short)
if err == nil || err.Error() != "mlkem: invalid decapsulation key length" {
t.Fatalf("expected invalid decapsulation key length error, got: %v", err)
}
// Too long
long := make([]byte, DecapsulationKeySize512+1)
_, err = NewDecapsulationKey512(long)
if err == nil || err.Error() != "mlkem: invalid decapsulation key length" {
t.Fatalf("expected invalid decapsulation key length error, got: %v", err)
}
}
// https://github.com/usnistgov/ACVP-Server/blob/master/gen-val/json-files/ML-KEM-encapDecap-FIPS203/internalProjection.json
var encap512InternalProjectionCases = []struct {
tcId int
ek string
dk string
c string
k string
m string
}{
{
1,
"ADB031A018722F19C25829150A8B94297C9519173A2C908AEBF76F86C9724A0354300C6AB58A90C7B18A2E828B5FD2CDEACA9810EC00FD8CBB22AA6AE641B5824055A91B27C1F73518953913FA2037D295F42B7E34AABE90D72A2453B215D886EBE28779D76F4830B01A73291B5A7186454A91D665B9E6C04FE808F76AC25E298B97195999F866DBFABD571B59549787F5E316A0C65F3E9132089B219E11712D245AF955ACBFA36D37BB2DFD570ECF90941BD369E8023B2FF65F04D5408FA84531604A5EACCF3D62221429A1D6B1BE5FEB04EBA0BB698B6B6AE4CF72317D96E99B0A840AB55C275B9979BB231926D7140FC9B8C8124B87532E854113532A809C714D492746BEA7C30AA869DD780B77D0BADBBA9D9FE6A09780B1EE7076F5E3CAF5F470D004CB53098BFA340248835EC782B34D612C53701259D2583360935D8B5F25051BF196214D1CC6B33A8A47F41A65B5A143DB3651885214307B0D938F9D253672A4587EBC6D9743A3AFB35A3098149B27C3EA0BAAC5942D9A92856EB0447D1709ED70A673AA1FEBA5398A821FA21B215FD78866C29B1E75C50815CC3F093B7CA70717A10CCF8C1880072230163008AA675A17759937CA672A56BBA772C527A5F9F12D53267419559A7A1A0A3003B64D34ABC8F4294210B140F517BEE86F393BB577E6A41EB64A4EF633C8BA941314528B67A24F4829E99C96BF92022307A763A9086F7C597340C8FBBB0689DC1D28800BAD710422A9334A406B203101A6C97A3D00AC6C095735E22CBC60B3A0760C8B0268FB5BB3D7D0543BAB599FD326608264EA477EE8F8C178898FE7387F15A6B40B13B069D3B574967F8487309495420F20B23456CF6D010AB19CABA9B27CAE79B09D7084D1863359B40F205556456AAD5F92A5A36B49B737866901CF6FB47B59A9C5783C2C5FD95087DA417F7410708290B619B701852B051272AE0428263C28CB025E1C1103B2718A0DDA5FC30394600879AF509B62C57B88A018FEDB09642872591582ABB4AC1408A5750902589406E2479D3BC5AD8016610D7BA18D984EBD951393FC2B83446D474AC8E2A634F66F181976B8C14F6078DE84113D8E728FAC101A23C86300D795CAE9875436CC",
"C1C9276205D0DAD6447DC94A5E2C36E754499B42595E75BFBFC15B8AA2615204A33EA62DA190398B341384C1BDD7B9BC547A976594BFA20C20BA9754302A0FF17616C83A3997C9CBF6F7031D9A5977BC58C1058FE15C3101981578B48B09DB07B035C220753C0766992C035FFF0836B3120B06D40200C6484DEA3618491FC446A2C95B94332512AEC61A8453B2251794A0929859E03925A31B0DABC9E9F88E30B2C364F9858CDA1D7A525F913B51BCDA41BB8635F9202253EA4EC1B7882E541A9A1411B66034212209D7F7B08B960832395280628742728B3BB0037AE07FABBC7CB89289DC9996B5894E203C5F24E77EF33B77AF513D3203B32F7258D663BA48A49B0249CC837AA35966C4CFB5774E96AB689613B6565C17DB0273268CFF2A2F391A018FD972BE165C1FA3A6B6587830EAB75D6B4FD3750EF7820727E9CC5D3869219A690FA58A966C80715AB23D7B042111733B8A3AD70674415277BF0C70F225B7BD775E639CB88FC06005CB135F752E02C66C0A197AFF56544EE13A0F8C2119C4B410168F16D779CD7590B77CADC18269B1AB84F1C562FAA94342279BBFFA58961032F794562D288D2F9683F00C06CD5A7B923002729947814811397487C4972579604288695DE054576F872501F02D98399A4369B636AAA84C04A9C87B1B3A3A7DE79B6ECBD49AAB705652CBABA6A1C91153277726203784BBDAE16703FC77F5AB273AB7376A033A15F3CB19872AA113633291416A85A5ADF9BC164BA9E32C991D85CFFE9B391EC06055B7BAA5A59053546EC6DA129896BE628820089B31A1ECB6AC91C5184428D4C582FA9A4841A6B66D500657A456D378BF6EBA41F9EB57CBE8227DE06751FB9AE058981A105604095E0F0943E79C715ABA8ADE8A2250D600BED71B42E7CCC676909CA78EF9823B60C14B4FE565C63237E9E10EE3761D5B677F9AD809E3E13301C601E1F36B5860C3828B9E7634C3ECC53541CBAA5460AC94270C530C617E9866097C20BFF5B879F642BAD352A2E6254CA4184C1022DD8297CF2CBCDC6292FAF5BB9051226D489D8A5979F5C810DC9819210B309E3A71ADB031A018722F19C25829150A8B94297C9519173A2C908AEBF76F86C9724A0354300C6AB58A90C7B18A2E828B5FD2CDEACA9810EC00FD8CBB22AA6AE641B5824055A91B27C1F73518953913FA2037D295F42B7E34AABE90D72A2453B215D886EBE28779D76F4830B01A73291B5A7186454A91D665B9E6C04FE808F76AC25E298B97195999F866DBFABD571B59549787F5E316A0C65F3E9132089B219E11712D245AF955ACBFA36D37BB2DFD570ECF90941BD369E8023B2FF65F04D5408FA84531604A5EACCF3D62221429A1D6B1BE5FEB04EBA0BB698B6B6AE4CF72317D96E99B0A840AB55C275B9979BB231926D7140FC9B8C8124B87532E854113532A809C714D492746BEA7C30AA869DD780B77D0BADBBA9D9FE6A09780B1EE7076F5E3CAF5F470D004CB53098BFA340248835EC782B34D612C53701259D2583360935D8B5F25051BF196214D1CC6B33A8A47F41A65B5A143DB3651885214307B0D938F9D253672A4587EBC6D9743A3AFB35A3098149B27C3EA0BAAC5942D9A92856EB0447D1709ED70A673AA1FEBA5398A821FA21B215FD78866C29B1E75C50815CC3F093B7CA70717A10CCF8C1880072230163008AA675A17759937CA672A56BBA772C527A5F9F12D53267419559A7A1A0A3003B64D34ABC8F4294210B140F517BEE86F393BB577E6A41EB64A4EF633C8BA941314528B67A24F4829E99C96BF92022307A763A9086F7C597340C8FBBB0689DC1D28800BAD710422A9334A406B203101A6C97A3D00AC6C095735E22CBC60B3A0760C8B0268FB5BB3D7D0543BAB599FD326608264EA477EE8F8C178898FE7387F15A6B40B13B069D3B574967F8487309495420F20B23456CF6D010AB19CABA9B27CAE79B09D7084D1863359B40F205556456AAD5F92A5A36B49B737866901CF6FB47B59A9C5783C2C5FD95087DA417F7410708290B619B701852B051272AE0428263C28CB025E1C1103B2718A0DDA5FC30394600879AF509B62C57B88A018FEDB09642872591582ABB4AC1408A5750902589406E2479D3BC5AD8016610D7BA18D984EBD951393FC2B83446D474AC8E2A634F66F181976B8C14F6078DE84113D8E728FAC101A23C86300D795CAE9875436CC17073137259AE58DA42855C429CB69DE93930C35FA796F80C774DC812AD0B9F6E2FC8C99012BB954AB3FDCBD6F6522CF7A0A59C511B330C6B72C0493BA70AA3C",
"3244E86669E69F0F238E3CD7F03EF31C4D3CF48CEF726955F06EB5099367310D5D9FC70D48A573458837319BD1691D1A699A68F7A9A8DB73D03620E9E4BC4B088E5E9C5E3638EB3354F6EF3C5E7AE5D57D0571F078E174CFBD6EAE2FD76DC2BED5A907EBA531E89B1BA8D2A8EBE7B4CA0DE96BFF28D278A70549AA0635BE50096F297F7BEF92C6AE9C11C4204CFF07E0598F14495AEFBD207B760DAD34FC0AD8F4000A1911F89FA3B59410C8151B9A8914AA71269EB7E2C329586D3C08F3F10939A497717CCFA3EC5082D46750905CEB703106C2D3E5CD71F138704A20898B5F80F5FDA03C08F8894C2874DE32DFF5C27EA0437A44663C0D6F6B85332AD0F5A0E48D1638BBD281797AF1ADED5C5F1EB87D4723E17BCA439EC469489A371A402EEEAADF1A1BD7C7DA409E9A6414E744167DF13AA1ED9EBDB354BC0DD04190DBA3EC48E5D1DB61C54FE881F8A1DA32EB512F2423EA7F9015DC8C2C3D5B5FEA438A88E6C877A6F4ED17FAB8918E53887996D23956502ED9D3D07BBE8EC899AF55813D39CCF6C2700AC8805517317338655A221268E654839C49D83344A1DE0E75FDD63549B7D57258601C1C74B0FDEF80CAB109C54393A7669E4BDB5CDD3BC21731C1E467784DC6A165194487A94FDAA9C177A0BD4AB009B7D7BBD9EEBDA386492F7903CA7C4345A41271D8B6816B1AC0841B8DB7E2D518B3A2B70386CB5BA159A11FC50420F94C001E1F8F0268A2E0A4A12485C08D0BB696CAC92C8866DE78F18BA7C0E5C4C2F450EAB9E2B126DBA80EF70FFB611A010EC3AA9FBCFB2058C2491B331E63AE27321C0098B49C9F7BD409C70DA376A338317217AF310788772E2A95D1BCC29355B486E3B1FA11753C7D39802D183AAE86C3CAD2EB4E70B3C679E47F01D7FDA48B629E5B8AF315847D20BE7A64EA4A16AB9B237F00A9DC659E01735290902F243E866129F120CF3EC01CD668A9827AB419B7F9994A305782C6CB82801C4DA0B9032034B890A761182E4108EF016AE48AE32ED05544EFC7AADC9D219B4E2F7E892EE58130B7413AD2CD6B5E04CEB2593E06165E37BC8BE981EEE1C638",
"6C832560DFE97BECADFBB340EE31AE868A73120806EED02839518E5627D32968",
"E8D6BAC09B25469BEE582A7DEE9BD21890CD3F0AF4D7E19E30B3E24E657C149C",
},
{
2,
"CE22B227E25D5B5422E53ABD78D6B80AF94A4BFC15AC6A39C56602C1B29934F456E23C9FB9BA568E4C2B3E7B8D6AF7A8AEB4A7AC94A57453CE6E05AC505B1F6785BB024B6EA9744E6C7874472AAFFF7B0F58A5ABFD2424F9E3B8AB9A4813A19FCCD2CE35E1C45829BB5888A9D6C14E351618F72B9135FA0677B91FD0EB84F997C5FFE7C45FB03067238FB5C880469079CB13620DEBB9A4E5247E08247B1C588666CE43EB6377C33741F2372CD14FC9D6BD9F53997FD92A1059AD5FC261EE89561AD26EB7C88A95370CFEA4A76A9CB5DF32996E5C060AA1CB8F39B8AC9956BD037AE3C750F255AED4B56E44317ABAC0442BF484F43896B2493A53568A6123444FC50E6A3B81A6223BE973902CD64C03F233B0B638538B57BE5A43F11BA31B93CF15D32844E48AAFEA0DB277A19E9A395496366D9C9AD2341BE34C58941692A1DC7570626202A5185903466CEA91B7078C357787967493569760C348ABF7C223EAB1365F455C85306ECF8BB951C0727FB94B89790A75D03782B568589B194A80C049DA498347C50B26447F5C8334B70C9EF74EB65C1DA2429B11942D0D57BB14415C6442973F079B1881AD9D5C71657757AB2A2650EC252292ADD1AC2967B9CA1158A6D2E5BBD55211D24874753CC673A8A689B8021010BFA2A8938F3B6F68549C326A221EB86BF7D98A8ED708BBC95AA6D51F8CF94ED374A1C0585F36BC7F22CBA513449942363F37D167CFCA6A38588147F101E26B5F818C2C67B515D7802DF57437BE9567D77A5164B4A061AA0EF019CF1E9024FAC61F43812B47846185C4BA2B4A7A3CD51CDACB558DF8101C2326EA8B4313C91C043542D7B53EF8B83AE02AAEDA2749B2913CC65487D408C463233750A4CF3913957F270753745CA8450BBD113877C3A9D370643D5BC13D0B4D6D979C9BC197BCA91EA0DC004575C7F8CCC08DA501356A4197AB34F34554DD461FD9C3A94A37C90FB864BAEC31D26B7E0D83853C48C896018D67113C4BD723362B87DA964C56027E820B6412282BA7A5819E7A9E4DD27E8C778B8EB8AC7C21BEFEA4192A9468BFC13BC08B079042152012250A0E9261D5B0B540A09464A54EF02AD0F1255ADC57F034529127DA186DCE9527",
"D910660105C412B3698D043171C1CC9AF2CC65AA019765034FD94AB6F11613DBB80223371970AB05EB3F325686B6A771EE3324DB5BCD32726B0BC760FFDC486AE473D31521E3EB8B5B5A9E0E7A1DA8104E39752D2A32BC08130F2902C8ED33C8A9E6A670AAB329D170A171AE7450686A0CA980BB8C4203AFCC3985C5E5130AE598EFBA572C316149FC9AD4774FC154A7E12662389849C27A64B0B4A53193A83F50AD6A3A4BEC9A5707F09FBEAA360DD1837E217E1AF335DBC120B5C61FC5260B81408AB9793C431CCB0C9624FDBB687B0699DBC93445363E7A4BA9A644630E4B9B1D03BFB7DCC18AD3182E6891D33927FB9188739043D774C06830C48E84286C817F4259340A366D4EE0141917924551C822ACBEBE57BBDFF58774E780F82B9E4F375CA1D14C344A401759A0D8277494EBCA2955753D7B4A01B3B864E66ED2B644EBA073F8805F8E07208799871E7777EFF5A539AA57D3C55AA9844C3EEA456EF5877A5C1F637993C1021307F8C97CD1165AC837078877691B0B8B7B05295C8F7E7C15406636E18B9E3E98C1F0C522A292BE59B974939C293158290A503BD84456E73351C6495284F46FDA0544D9BCBB54189658975AE1E5BBF4F0410FE3355A33AAABD6335026B55CB2CF2B21CA581BB8A2055EDC918BA3570128E392BF10C55A0BCB97C977ABDB8784253908900D6CEC33B2428FEBE6A426274120C27ABF1AC0FB81C622DA0DF7972E201A28D788A761D9242E63B68A7A7B2E67840BF76382F2159E2C425CA69BB1FAB1FEE66AA0B89E4AB8A2781649676124301CAB6BC4B790B1C26AF36C90B2691C50157D153424AC22444B13BF297AEFFCA74196B2F6A7456A80213B381C6D776296A7173B6A28CE16C41AFA657C7911EAD7354F2770C8FB1E06878841738B51C95371D690A8BBA1D5AB098B9041F2A3B9EAF07DF6DC315DA273BF0503DAC3190B27A0CEC78E3FC4456E51C9DCB65C702A777FB0727266AEF47B2A7EF61BA475B60CB2CC30C039D3CC87A05AA72A252EE043CBFB173BA13015BF08C382CAAAC1367CEE779D0AE6BA0F5435B9241496A581ACB36C3ED212CE22B227E25D5B5422E53ABD78D6B80AF94A4BFC15AC6A39C56602C1B29934F456E23C9FB9BA568E4C2B3E7B8D6AF7A8AEB4A7AC94A57453CE6E05AC505B1F6785BB024B6EA9744E6C7874472AAFFF7B0F58A5ABFD2424F9E3B8AB9A4813A19FCCD2CE35E1C45829BB5888A9D6C14E351618F72B9135FA0677B91FD0EB84F997C5FFE7C45FB03067238FB5C880469079CB13620DEBB9A4E5247E08247B1C588666CE43EB6377C33741F2372CD14FC9D6BD9F53997FD92A1059AD5FC261EE89561AD26EB7C88A95370CFEA4A76A9CB5DF32996E5C060AA1CB8F39B8AC9956BD037AE3C750F255AED4B56E44317ABAC0442BF484F43896B2493A53568A6123444FC50E6A3B81A6223BE973902CD64C03F233B0B638538B57BE5A43F11BA31B93CF15D32844E48AAFEA0DB277A19E9A395496366D9C9AD2341BE34C58941692A1DC7570626202A5185903466CEA91B7078C357787967493569760C348ABF7C223EAB1365F455C85306ECF8BB951C0727FB94B89790A75D03782B568589B194A80C049DA498347C50B26447F5C8334B70C9EF74EB65C1DA2429B11942D0D57BB14415C6442973F079B1881AD9D5C71657757AB2A2650EC252292ADD1AC2967B9CA1158A6D2E5BBD55211D24874753CC673A8A689B8021010BFA2A8938F3B6F68549C326A221EB86BF7D98A8ED708BBC95AA6D51F8CF94ED374A1C0585F36BC7F22CBA513449942363F37D167CFCA6A38588147F101E26B5F818C2C67B515D7802DF57437BE9567D77A5164B4A061AA0EF019CF1E9024FAC61F43812B47846185C4BA2B4A7A3CD51CDACB558DF8101C2326EA8B4313C91C043542D7B53EF8B83AE02AAEDA2749B2913CC65487D408C463233750A4CF3913957F270753745CA8450BBD113877C3A9D370643D5BC13D0B4D6D979C9BC197BCA91EA0DC004575C7F8CCC08DA501356A4197AB34F34554DD461FD9C3A94A37C90FB864BAEC31D26B7E0D83853C48C896018D67113C4BD723362B87DA964C56027E820B6412282BA7A5819E7A9E4DD27E8C778B8EB8AC7C21BEFEA4192A9468BFC13BC08B079042152012250A0E9261D5B0B540A09464A54EF02AD0F1255ADC57F034529127DA186DCE95274FF27A9AF1C9074D3439797A96CC512AEE5D09BEA36A6BAE4C5D1A75943D02C56290C092088A99E4C5A6ED16C739BCBF33E640CE33D7DE20714305EF61BA2B96",
"C3D565942112A5B216850124DF528E6792119D688EC12BB9438F83AAF57DD05B1AD9DBDDF482949BB880E4F76FE77AAEB0946B4A5F5A2BBCC8E5C055360B765049D57411E2D3DC201611BEB7B665B7F92453245A668147D1308DE2991F57581E207FA8860890FE3CDB97E35482C38C2761C1CFBF1075F2DA1EEF3B93EBB98B448780183D61E1A70E6EC407669B3734907C5212C6915A368535F6D0DD5C31B0C0800E3374B69B53D2E497BCA88EA5E8A4266A31DDA6D263F7888A85E5E648E79862F0C5B4CDBBD4DAD72D758532553569E16EA6C73FC2F82B65D074F710663E5D17A5FAD1B05152F05E9005714CB395918E59B275BD90B6B9AE588C7984B481E459CDBFBC0E00F0422C7C8EECC783EA6CA1BEAF970E6BBCD54061210FF24FE504D9756C79BF746531EC958244623F89ED87AB48B6CCF28BA18E43298B7E5C3F3EC2E3B669F427762375DA779D206CC889337429DF1A1AD02E0268B8F9F479A573067C9493C1A65CDFA7E7DD2FFA7001423D39C0AFF53910C404E2334420493395EF2C8C2E1F01D2D2F82F7DB8D2FCD30ACD1679D943A9E705AC35F9D10BA9464D6EC52FF86610DE36C79B639B5634776F68203A1D6FC8FD892BDE9F59978C35446C0D4A684108ECCFFC631FD09031932C7435C5EA2E89A25FC08F0196980F2B940CD4D4429AE195ACF14AD8042C09D39A3EE7DC1D1344A8BF5A530BF7C7270482E408FE33E6584C826D2495A5379948F4E90CEACA48757572B086A02AE005EB238C28EFA1D3E9343866C2B5865565FED01CC54D1B1C16148435B0B39F73676FBA06D0FD57B287CA05C7FD0F97B69E62B1A8B2457EBBC8CC4CAAC82EE1A7FDC30649DEDC7129146C6E44E1EF1CCE2BE004E13A276F3E06E8D2801D3EC2616C81CEC6439C9A3827337E20705BAF6F30941673CC8E773188333A76C1C2B04F2D259BB61AEC2B72F846F1C7B2D50582D641F49E61AB4F0828DC732676C3208123F990B9384364A9607905FF155E0107B51624ABACF1DCF48EB93A39E117D9B802EAFD59732D6D7E94E9C7F33AB68908DC87ACAF80EF4BEEA4CCB535C3559519A7E81C",
"F833AEC5841D7F3CA0B188221245745D66B374ED8C3C04AE3522ADE7F973F8D5",
"971B2D3905A306927C18F0F72D9F58CD3FAC6238C902C3AE679449F6CDB91235",
},
{
3,
"F5496665F95ED5240696B112B542863122ABC8E23D1F647E1FD74464F167A58B69BDC21A4AF7991290292B43B6EF692541C144B8E72E004A5C1BBC02528B3F02BCB6F2751B06454C9EF7324C051243268C936CB19FE1CCFB29C85D50AA963B4137484823753A5037128D00BE20302796F2920E0948BF9559EF9CA2E2240F40A01CFB4B0C0C54A476FC75980369CBE976A6AC423C8087B94417B926B706B0B5573B16A14B2BB06A167F75A050D200CF20AA3B6B91A9C9893D08A9264599E6C0563F031EFC250B0137983257B80BAB1C43A010E7C53B52A095D9A19F3FA64D2B6C181B580E14669FA05C4E18BB2924D221F36AB92DE8BAAB514C1788CA5AF83A90929784506AB8205765433D7F1693873631E3605FE72A4B50211D807A4EF3D80110B6009046258B97A5DDDB9D1FD15A0346118C7290FD07760A54C83092C806FAB456467CC862682DC5906ABC53DD0AA0BCA5A23D2B85DC711A88AAB092E47C2CB3B69D85938B3C4A262168A3741B5E4CB8DC227DF7C71EA83230A05A2625D04F9CD774A76BBD9E9BA3099C4462F97E30B56942EA48B8566225A45549C21004C89B66900B6A7898232A385839396338A773651F72060D04B1994C282B6CE733C946A97D6B202BE92458A0AC9EF092AF1336EBF46CC1A99D735C4B8AF04AB7607093122C54764A3EDA4676062A35261BBC67C688E9A053F830BAD186FDCB10BCB42E1AEA2AF3D390B0568882246646003CAC4C291D494F14649C778A293803640BB2A59343A114C13407C06AE68665F4414747A19782440C49B6C814B91FE03019576440C8F361FE256F2AF70EF807ADBFB275304606A793A2CDB984BF043703F71C233C6B92257D66916B52C41EFCF115E03100C292055F0BC89D2102E9755203065836E963F0058E52C18CF8190D97829B2661AAB25A2AE89993B8F1756A86370B4884F0C70F60CB73D74C98BE394396E97427650493EBA03ECC2C1A6BB638488BAFF015D5D0CE17403B664517BE6B19F0B17A4DE2B2976415307334BC715B74B8A9EC5BC41A0A8A0C6CC4EF6420D1551C260026E6A58A80434FF58776044492E6A9DD1B70197DF7A3701EE36CBC3EE64CD5646DDEFC65E8B3AB813F85297148",
"FA17500FF65A5BA64AA1796700C2C6F5ECAEA31C7446F35A3FC1659440A554D85CCDE8A0BD2075ABAC60A708B423AB62DA6C18411B6FF1E25C66A92F0DDA925471AF9E95CAB8877B4F6A6F7887CA1CF84F76A9CB7B28052A20C112C88277A57D8F3731D85CC2B31050632240A4C435C09C81409B6CB73CAD79F2B9CD2085A8FB4F3B9862F6205E82501C7D964CA1AB1FFF9A9585D67636906AA5242C6E342522BC3FFCDC744780299FECC8C62C930AAC34CCD55FC617A5D42A63BFF1CC8D50BC60662A9DF4B6B96183F02B95693236564782B4C7CFFC2A8938A132D1C45AC4313E2D775A882864EEAC9C6142AAF4955DEB67304F96C77D1CAB886858457A19CF03235351922DD65E94607085D4C32868AF3966B0B1C541A0412EA113AD360513C4B5014AE20CB3B6311D07A4A4323FED5C650307856B7578C64211A8C259A29AA52ED869D9D74EF318CB10F485F7769247D3B7B4D000E41967C3C7140FAA37C7C79C927BA7B5042F13F674EC1B9C61A929DD59BA88BA3F25AB9C3AF3C38056A23B35854AE4246C3167F4317BAEF0C53B385B2F45616F363E02B9492D064A0C67430383047E18B550F79B4EA996FFC76669DC4EF604B7FAFB9B0D6C54FFB658C740459DFB21CB984D9B336111A9AE82C0CF1D0321D9809AE9E0AEF1CA0F68B1A8607C678CFB4695122C5988C3EEA38DBAA864A8DBBFEAF32A96216AD1CA7560A34D1F3A55203B5E9F847045481203FB40C6136D2D630ADCD9B17A056F07713F4D34421922C05FB96E6E577D90D5B62D6B0960603B569647CF385C7B333680012876C0A49C9853C953BBF8B483839B483D211C340035CCB99969323852F05F03729474F90BCDF44F52FA0399AC66CA811DF1776541B686639119E956203A369DA8D9958D9187FEF8C99BAB0B40E277D256856C45BE55C0BEF6C699245C42BC1050E32C76B335454EEA94692223A1DA8955D1359AD2C69441924098C074F9CD32932A6793359C9A6CC0F7340E798CA3DC046FAA9BDA791CB0E5A80C1414C0E21E94A290BA01CB87981791ECCD4F0610E9792789D16CD26AC1FB7A312E636F95B06BF5496665F95ED5240696B112B542863122ABC8E23D1F647E1FD74464F167A58B69BDC21A4AF7991290292B43B6EF692541C144B8E72E004A5C1BBC02528B3F02BCB6F2751B06454C9EF7324C051243268C936CB19FE1CCFB29C85D50AA963B4137484823753A5037128D00BE20302796F2920E0948BF9559EF9CA2E2240F40A01CFB4B0C0C54A476FC75980369CBE976A6AC423C8087B94417B926B706B0B5573B16A14B2BB06A167F75A050D200CF20AA3B6B91A9C9893D08A9264599E6C0563F031EFC250B0137983257B80BAB1C43A010E7C53B52A095D9A19F3FA64D2B6C181B580E14669FA05C4E18BB2924D221F36AB92DE8BAAB514C1788CA5AF83A90929784506AB8205765433D7F1693873631E3605FE72A4B50211D807A4EF3D80110B6009046258B97A5DDDB9D1FD15A0346118C7290FD07760A54C83092C806FAB456467CC862682DC5906ABC53DD0AA0BCA5A23D2B85DC711A88AAB092E47C2CB3B69D85938B3C4A262168A3741B5E4CB8DC227DF7C71EA83230A05A2625D04F9CD774A76BBD9E9BA3099C4462F97E30B56942EA48B8566225A45549C21004C89B66900B6A7898232A385839396338A773651F72060D04B1994C282B6CE733C946A97D6B202BE92458A0AC9EF092AF1336EBF46CC1A99D735C4B8AF04AB7607093122C54764A3EDA4676062A35261BBC67C688E9A053F830BAD186FDCB10BCB42E1AEA2AF3D390B0568882246646003CAC4C291D494F14649C778A293803640BB2A59343A114C13407C06AE68665F4414747A19782440C49B6C814B91FE03019576440C8F361FE256F2AF70EF807ADBFB275304606A793A2CDB984BF043703F71C233C6B92257D66916B52C41EFCF115E03100C292055F0BC89D2102E9755203065836E963F0058E52C18CF8190D97829B2661AAB25A2AE89993B8F1756A86370B4884F0C70F60CB73D74C98BE394396E97427650493EBA03ECC2C1A6BB638488BAFF015D5D0CE17403B664517BE6B19F0B17A4DE2B2976415307334BC715B74B8A9EC5BC41A0A8A0C6CC4EF6420D1551C260026E6A58A80434FF58776044492E6A9DD1B70197DF7A3701EE36CBC3EE64CD5646DDEFC65E8B3AB813F85297148937D2E5BC317BA84AE3F9C11E41AD14F26504C8C010F2F71E5532767E255E3452E61FE4FA73C922F49DB415D0543153DF506CEC47659F7C1187210C669F25186",
"573CED7759FA816716C2B6E4A3E0089F25CD5A8F3972932C5EC8C501BB948D7A2A126192DBBE683C64A0D8605F36100A7B4B30D54ECBA0C849FF10AE4304CC41337045E60A003AE14280235CBB0866FD0F60F7B832142A9FD2B11A884B53B144E2E4F9C8F5F95A8C19DE0E6A5413FE1CE157FCC638C02A1ACDBFF56301FBCA71F3C8EED4203E649B7764C69B9E4FBA2782F00C7DFF8E0E09E9443F3C9C48E13B4010619C570895D3870C91E87CC74792CCEC7A9463E231D01ABCC1D63A5092F59129A1393D44D811C6CCCD9084565EF031E4B30DC56F849F8F3641AB824F1A598BD7963070B334A0E1A81DE64008577E28348D3E452EA14815D52EAC8ADE4E1F1C2FA5F3B95EBCDCDAC0EFF04BE97843B130443870EEF5B4F5A11F6FC048FA7507862B4C872B133484CA639D34A27BD0C2CF9DCC63D760E27EB50B7890EDB74F8BDCB64B4AC252BFE5B4F74106823134DBB7CEF4CF29D8812B15BC82035804D7ABD0B5D88870B59337EA720035123FB5D3471C96FC8D7B386095D828D4C71D1588080242657BDF6789A7CDC227FFDF5462B59D76D8CC29B5FAFE9099638532E1FE5D3C73E1A6C0A37DD36E00CC2DAAE2EAED9EA6D3D39A7AC6522F66C27207887A447199C98A6B80E9822F0CF23F29BBC402C5C3533A0DC3DCD181613FE1367F734D25C5EEF731D069302584CFFF7DBA2F7023A216E0946EFA4ACC3969E99B022B3C56FCE869C746E0D9F4CC528306056EEB7E32CDF523C63CAA84B6E543F49791ED6A0867A7D6C62C64AE560EEFA3BE94CA3FA7F6118C6D35958E29CBD44E0AD682DFFA302EC398B1ED9D72DB649B1518A50116C70314CE4590B8004205EAB8B6AC68AF5CD932C24CFD02BF9414C3B3727E4FB138E984D0BB1E7E4CBAE823294E7DEFFA4D8CC075D2A8F9A891A31FA3D8665D029872DF083DF75D7E47BA24FB3EF7CEFD4A6B09E496661903E784C450BCAE25C15DC1BC91F75146839E884F564F5233BB5CCA8C2F723037B68F596A9DC509D40A33AB192207D53CDF22F592D7F516524A2FD474AA9D14855C4FAE1E028DEAF78237BDC8420B91035D60273385",
"4161D690B5985FF27B6C385CD3810477523EC7BF1943B743224DB59F0277EF6E",
"A9E1CAAAB831808A51837DFEAB3669CC6C6E5C8C44AB3ADAB32D245C13CC812E",
},
{
4,
"B449808E533DB80176A324BCA4DC33E161CC79DABD92E8667149CB23721C2A8A1A251755D3F879D744B13A2C14E685ADAFA298786B40D0559D1BC50C3B82BAF860BDD004AC5825759C6596E45BB46B4647EFC4C7D0321A8149CC6A71323C05330BC984E0C703F23437603076228BBC4B7182263A1DA83B9EDEFC7584D2326E973A1978C0F046801F884E1DC0498583B5BD098E9C49BBA5C7A6630C412D02966C2A80C63587BB5A438A45BBA9621A071ACDB4C91118038F78932A552417DD43821CE7C995B95FBF295482F2905637C5217970C7F1B8BE0B87471C4146467102F08549EA266D8A8536898C7538440DFA60FFA9B91A3B3097655891573DD93A8CCBF81C2D4C10D6B0CAC0B92ABD918428A66DF9A2B7DD440101D83DD88150E4FA6B66AA5FC1A1CA9854245FA72B8C7980546C380A68C84DBBA2F08621FF8727095B0711F9307C876766FC95724CC4558741AE6A23595CA94CD4B9CE303E25846BDBF3192DA867816B1F12E62BFB7977712101CAB11A7F90C9F6820CFD07412F254F8E8B2A1E51C5F4806630C764A04C70D8D56DD2C072610B6333F58E46D782C52B7B44C4A17EC45B1ED03E17CAB6D0F203A7379EE0615EA2E48553231CA6C88D7398908205D038950AFEA34C727917C5F2ABE4AB4DCDF28AB6811E50D07930FB292CA3048442A8C45B37B66C653239A9EEBA2C0D9462C5114D577515C0D6663FCBAC93C3B3E91610FDF4242B506F5815839C929CEED957D0E45D2597BADE830990C9362D9C2B4C08AF4640757D0B954A142FC0058168BB8BAAD6A47250C7A1B1CE9187674D614D0712548D90C5237B0F740A800A015CA9B303CC4416CC8A4DBF84A0CAA49D36A76A747A42D1CB12036817CED21E3F487152A29509F6B4CAD80145322F1EE07D91917282B63E79419B659590AC62481F76161D996DFAC02290100D51249879C1443CD786A37C9A16611C980880C80124A6D493E6F35C7D4B9BC996090ED3482BE37E1F4637B5C57BF295605E949392883AE845CA143CBEC523BAAF09B27EB84A1C57798EB2BD884217B91887BB88C5A561B91CD4A3150806DEB20CC37A81F190693D16F71B6F62EA0CE9A3DBAA109888F67A0DBAA6809811E5EB26",
"5DDA60E497BCE1B357AF952F87EB170CF7CADCB452250382AFA60BC2B83C4A94CD1CE1CFB2DA011D93793DD0907BE8CAA121A585C20A1B1253025B8974E78AD297814A7523A6D7CF25478FA46141C22C1ADD5834A164575153784486AC46D48F9DF19650E0CA0594523CCA83C09CCB61808032FB7FD06B899A1BB02C978E1D565E144B0FF0E598514775CCC98C730309B82A9947B60DED9A74D9D20696971979C8449F31AA4C3B32D3A682FD1C5217059261169A1613789AC38FE371825EC910239A11682ACCC0A239FAF3159630A1B7D95B647686606100088B246473BD216184D4B97E3CD717E72B370E769346431B4D2A3632B133D394B7C3A3A3AF7871BA091B52027D5EF935B2A2771DB352DD34C959C0C83A22514EFBB99C639301E4C9B6792CA220B43AF14370C1CA8C9814AD839EEE629397E9C102EA6E716C0757604E9D229AE2D93D93BA69C10325A67404DE7C857C492D14A16DBD383314785C2A572566A067F613816ED044A857B310A601C9B6698900498F603ED15C33B6F30535548BBA2B6CD22146800952477469E9CC404383A53013487D9985C293617AE97FB1C33E90B229865620E746B9B7D699565C57ED0ABAADF88BD6D4B6F3B39C458C30EC77AB5E9188AE63245D5942531A043FE297336315102AA715BC014A2A21992AB8511248435ABBC408B54DB4583EF1133AD2A16779190D6807C3B46CDED9CBDCCB069EF576B98804BFF92F2752281C268908465B0CE3B169E4A03DD036485138C8A4157B0B2F463BC458D3A1EEAB82864C01160631DB973456AA431C055A4AA2208CE300B7F2BFAFBC6EA7A1C53E729348444E445571A6FB1A6EFC1A01318CD3C3505D74C86C2667C8C262BB527646C170AC9751513701890BCDCE6B179C721BBBE4C71A528B7C294D5E634E80A523F812631EC55702A1649F02283FD071C771647661B92AF7C227C133997169C3AA31CC078588000F0AC397F9D47F39F9557D92CCD2676AF80072BF5225A4AA0D3C8733F9B133061CA93857291658ACAB204884D900700CB1E1886FC9F5746FAA0C68D08C1B77B278869F12CC8ACC8A85B449808E533DB80176A324BCA4DC33E161CC79DABD92E8667149CB23721C2A8A1A251755D3F879D744B13A2C14E685ADAFA298786B40D0559D1BC50C3B82BAF860BDD004AC5825759C6596E45BB46B4647EFC4C7D0321A8149CC6A71323C05330BC984E0C703F23437603076228BBC4B7182263A1DA83B9EDEFC7584D2326E973A1978C0F046801F884E1DC0498583B5BD098E9C49BBA5C7A6630C412D02966C2A80C63587BB5A438A45BBA9621A071ACDB4C91118038F78932A552417DD43821CE7C995B95FBF295482F2905637C5217970C7F1B8BE0B87471C4146467102F08549EA266D8A8536898C7538440DFA60FFA9B91A3B3097655891573DD93A8CCBF81C2D4C10D6B0CAC0B92ABD918428A66DF9A2B7DD440101D83DD88150E4FA6B66AA5FC1A1CA9854245FA72B8C7980546C380A68C84DBBA2F08621FF8727095B0711F9307C876766FC95724CC4558741AE6A23595CA94CD4B9CE303E25846BDBF3192DA867816B1F12E62BFB7977712101CAB11A7F90C9F6820CFD07412F254F8E8B2A1E51C5F4806630C764A04C70D8D56DD2C072610B6333F58E46D782C52B7B44C4A17EC45B1ED03E17CAB6D0F203A7379EE0615EA2E48553231CA6C88D7398908205D038950AFEA34C727917C5F2ABE4AB4DCDF28AB6811E50D07930FB292CA3048442A8C45B37B66C653239A9EEBA2C0D9462C5114D577515C0D6663FCBAC93C3B3E91610FDF4242B506F5815839C929CEED957D0E45D2597BADE830990C9362D9C2B4C08AF4640757D0B954A142FC0058168BB8BAAD6A47250C7A1B1CE9187674D614D0712548D90C5237B0F740A800A015CA9B303CC4416CC8A4DBF84A0CAA49D36A76A747A42D1CB12036817CED21E3F487152A29509F6B4CAD80145322F1EE07D91917282B63E79419B659590AC62481F76161D996DFAC02290100D51249879C1443CD786A37C9A16611C980880C80124A6D493E6F35C7D4B9BC996090ED3482BE37E1F4637B5C57BF295605E949392883AE845CA143CBEC523BAAF09B27EB84A1C57798EB2BD884217B91887BB88C5A561B91CD4A3150806DEB20CC37A81F190693D16F71B6F62EA0CE9A3DBAA109888F67A0DBAA6809811E5EB26F1A56A1BE44CD860B6AB94C5A96A136A642EE8AC85A139AEE1DEBC92F7C415797F6828F70EC49463EEB056EE33762A2209E588FA1843B235FF7C77AE0A3A6C02",
"D2EA52F54453BCBF2DE9BC50A06B67FEE98090961FC5BCBFE683C371B5B8902DB0F4A64B309C87609562D42E04DDEF4196F0339ECB2AE2224D70FAD4134F696B538DC3FAC029C7E7F7423A0B72D65B66B1C350AE0E0F5263944E5B117B62A0AD9F55C301EA46EAD5B0F568548F4C67DB306C2DD9D7D390E60DEDABF330FF230793F18B1E8C1AB3F54B299E75F6ABB6119A38685F4C31B34559731419D978C85A8B40182C53BD0D9C26830F0EF765BD80DDD30BA2DE9CB26A7E41B94EDB69F40442371B54D35D891852B723BE176F43FE8B59E5D8EA7D7C7ED0638414D5CCE5F990D746F45331E1D80C2EF2E58086AD3D855ED717AA53C37DB52C253C124A1DC9D04AD9F126B4AF2FDED47926019B49E96842D41E77121BF977DC8728D3638FCE43BAEA29D485CD0CB6062F4EA8547E760781538523745E4477F22E4D346F07D26A5E445C55451F8440370FE2362741CBA3818B779AA5415CE934EA3D96C3A139CB76355DC84299D6795BB36402A7B964A5310B1B80A35D01CD14B7B5BC885A217D66FA94D829C724BD8939337F3FCFD899045F4C4A2AA4E3A2BED4B76436F7492C633B48F2440315B5AAD00C338D6E854B46C01D87741ADC07FF0C2E72F95FD8484CAB327F504F3FD7292070C0EBC0C4099129CBE2239B66AD4CF6A5CBD8689CD1F6C8A486BF2FDE9AC1A97FEEA82A27DF9ED44E8CBD2E727E845FDD0DFA48EE6CCD62BCB1603E48E5EC3756566EDBD1023AAF453C63053D647D77D984CC6D37FEB793B3C0602D2BD2A4ACAF67CEA9618C62ED0D70934CA63C830230D41D0D68A8FFBCB3D50330F9B0871846066F3E53846EB023E115485B3B5EB9F354191C9C310FB77D28E23FAF43EEE86DF8EECAEC1CC6DBF6E7C62DA537D2FAB0E43B21DDCF57829151FAA7F5D2004D40750DF420A96CE55DB30200FE63655777F0F6B6011B58FDD232A6B31195D367699CBFA3AA40FFEB742A8816FC83DC21379DBC001432634DD7D40F6356F2093F184E610AA6E64500D976B1FE1EF1F49DEA5B50063ADA2814840D101D3933E23AD6CD8E8910191CA4242AA91D5EB06046C7A671B19C",
"7528672FF512CE81FF014D5C96834AF516FE383FA424D4F7F143310808CC7E91",
"4DCF56F1BD29253C98117410BA20609FA9F95749986751D68E9AB639F4F78D80",
},
}
func TestEncapsulate512ACVP(t *testing.T) {
for i, tc := range encap512InternalProjectionCases {
ek, _ := hex.DecodeString(tc.ek)
dk, _ := hex.DecodeString(tc.dk)
c, _ := hex.DecodeString(tc.c)
k, _ := hex.DecodeString(tc.k)
m, _ := hex.DecodeString(tc.m)
ek1, err := NewEncapsulationKey512(ek)
if err != nil {
t.Fatalf("case %d: NewEncapsulationKey512: %v", i, err)
}
if !bytes.Equal(ek1.Bytes(), ek) {
t.Fatalf("case %d: encapsulation key mismatch", i)
}
k1, c1 := ek1.EncapsulateInternal((*[32]byte)(m))
if !bytes.Equal(c1, c) {
t.Fatalf("case %d: ciphertext mismatch", i)
}
if !bytes.Equal(k1, k) {
t.Fatalf("case %d: shared secret mismatch", i)
}
dk1, err := NewDecapsulationKey512(dk)
if err != nil {
t.Fatalf("case %d: NewDecapsulationKey512: %v", i, err)
}
if !bytes.Equal(dk1.Bytes(), dk) {
t.Fatalf("case %d: decapsulation key mismatch", i)
}
k2, err := dk1.Decapsulate(c)
if err != nil {
t.Fatalf("case %d: Decapsulate: %v", i, err)
}
if !bytes.Equal(k2, k) {
t.Fatalf("case %d: shared secret mismatch", i)
}
}
}
// https://github.com/usnistgov/ACVP-Server/blob/master/gen-val/json-files/ML-KEM-encapDecap-FIPS203/internalProjection.json
var decap512InternalProjectionCases = []struct {
tcId int
ek string
dk string
c string
k string
success bool
}{
{
76,
"70EC19B39348974173A550A5C52A248E191D46640799A4365F3C254757350B65764984180A9ABC9048679D6A84C61B7405EC82A403B79569C024CACA55D79BE23C943C159DDADB17011820C7D88D54071FC8AB142727BE747BBD253A26E92071DC34716F5037D1988A889302621A8465D08ABFD2215D97575D730C9495617EF3B69D0C7AA79965CA985BC147797D9688116A20F9626BAB1997FCEAACBFB439D655A566B0A4BD08472265439C00CE487955EBEA094AD00A6A5AC6FB9359F3C11A6E4B3B6C714F70F8A7B8B6524572B34B758DA270753B697415A964170374548B9D1FE43FD80C62A4D951E28182F2848B044A8352E11F5198547B71215E6287DFF13A18287148277883926396D9A07C0B0139577E4923AC41C9C31F0B6067C88B94CBB9921513ACF0AE80D7779D72C666B256B72A777B56A2D12007797B7BE6657650EB42B1060AADC5157FB819EBF707E51637CD8469645196765A2EBFE8483D62C5E2422C27BCA84E5A0F69F45609928A7E51948A9464D5093CF463A39C26447126C684160F3A4298EA0B5B0973A15403CDDF286BEBFA587FFBB5BFA7692A404ABE3BB14014AEAC418900E4588676A5E7A21553F50037262E3DD6253A8BBD985A679F638F709545AB322F6DE71192FB60C0A368A3B06C8CF5267D792D6C2518EA0A27855635E3E68891C141123A1F8C80AA5300B151AC9AE4342334265C457CA8809891EFF12B398A8465F25508836EE3075C898822BA7675AC359D80E85FF84112C8502932016E24531FB24AA0F744B8252B3D89B4A41721BFD779A826AA46F00720B9592A12307B27EB2B5502987AB477161B72F31BB8EF2C2F4EA83823B72CB16532768508835852A701C3522A7B71DA1CD8B5CCA512117990709797C8AAEA3B300B79A28460D22A2C3527CBB8529AA667064FA2039E22AD5ED740BFA353EB04B74A9C9328266561A76A12EC2C33766697DABBDE92A712B81712D2C4E1F335AA642774441E917650F8D92278A8C0444214A774B7996463527756935171D9FA61D0B50454F74ED50831EB3138DB7374A35387BBCB23E40388BB9228C3A66CDD2222524D7CB8DAE2E70FE3D97847AC35824F5D58B54DD943A440DBFF421642",
"54301038DA5911366D16C417BFD96AEB85C5DA4AA45AF32F88A700BB9A973AB62684A052D793379B3C2B253B01A4E512AB34C8D8A76F5EBA5F1B28451A66632872C489F3CA606C6B36336895C032386BB35E98B43C8136350616CCF82A4C24816F4354B7C197940A62537BB36F2B8DE32A6AF6CAA100845FB62184B82B29DCE2662CA94D93FB027DB3C8EF858D4223540E79AD5D204C99637FB66718CD04782E149A07354D6FB2C742A9849506BDDECC0548367421FA2B8599443C74192D6B4B67CC5E16F8880087AC578ABCADB5492CC1AC6916CE73AB2858797134676260B22B28B4A8917C5ABD876EDA706CE381AA4985827D492A736652DD6C1DADD10ADF045DBF416158B0384A991D8501BAA9A714B82788C263C16858C81B978FD353126222A46E1587718872BB11513CDA3A88B6547BC464CD612548E581DFE106382428BA8452A86AC6ECB50B7B3C1CBEA571513C63B8741A2CB82C5055CDB2CB00CE9036C220A25C1BA21891B520D435342136D0C15AAFC12DBCC810E9C256D397A3D23A6287282AAEC038649151886A19F9B583806839EE86A12D131FB3E6A1CA1C9CC48626037B5F3DA74C8A025CC61A76078B07D00AA6DAD32C4147CDAADB4DF644A8DBF4222C47AEEF774BDAFA5A48258BDEA84E7B8B6A5CA09243589EF7F1C249A2B344068FC8D874C33B6C4C2782EA86AADE7C10EFDCC93FB993147A3B636127711195C121C7506759389373F896843991125D5A0AB8FB34595166A9109DC2D19AE2738444716C9C21BD06DC8145458ACBA30981A95F8E141BD17B17A3F645E9B63747E370E8D873937A858048614F0645F4B461EF769D2A696706C2811E756163E4746BF00CFFC556AD7A2F0804A6BEDC6A59B1546727C602A99397C50FF818721D5319F63B058D03BC9DE57C1DB74FE14A0D083C25B17886200633D230946DE0A148781735555CCE797040BB479FA733C2A808EE1CB9A285CF863CBDB47172F3A68EEA614736C73C71FA4AD82C6CF13C5CD3179AD296BF3BD6815D13CBFF75A3A99B4824B7560227BE0BD809BD43AED7D951ECDB7273719560DCC0E8C13F70EC19B39348974173A550A5C52A248E191D46640799A4365F3C254757350B65764984180A9ABC9048679D6A84C61B7405EC82A403B79569C024CACA55D79BE23C943C159DDADB17011820C7D88D54071FC8AB142727BE747BBD253A26E92071DC34716F5037D1988A889302621A8465D08ABFD2215D97575D730C9495617EF3B69D0C7AA79965CA985BC147797D9688116A20F9626BAB1997FCEAACBFB439D655A566B0A4BD08472265439C00CE487955EBEA094AD00A6A5AC6FB9359F3C11A6E4B3B6C714F70F8A7B8B6524572B34B758DA270753B697415A964170374548B9D1FE43FD80C62A4D951E28182F2848B044A8352E11F5198547B71215E6287DFF13A18287148277883926396D9A07C0B0139577E4923AC41C9C31F0B6067C88B94CBB9921513ACF0AE80D7779D72C666B256B72A777B56A2D12007797B7BE6657650EB42B1060AADC5157FB819EBF707E51637CD8469645196765A2EBFE8483D62C5E2422C27BCA84E5A0F69F45609928A7E51948A9464D5093CF463A39C26447126C684160F3A4298EA0B5B0973A15403CDDF286BEBFA587FFBB5BFA7692A404ABE3BB14014AEAC418900E4588676A5E7A21553F50037262E3DD6253A8BBD985A679F638F709545AB322F6DE71192FB60C0A368A3B06C8CF5267D792D6C2518EA0A27855635E3E68891C141123A1F8C80AA5300B151AC9AE4342334265C457CA8809891EFF12B398A8465F25508836EE3075C898822BA7675AC359D80E85FF84112C8502932016E24531FB24AA0F744B8252B3D89B4A41721BFD779A826AA46F00720B9592A12307B27EB2B5502987AB477161B72F31BB8EF2C2F4EA83823B72CB16532768508835852A701C3522A7B71DA1CD8B5CCA512117990709797C8AAEA3B300B79A28460D22A2C3527CBB8529AA667064FA2039E22AD5ED740BFA353EB04B74A9C9328266561A76A12EC2C33766697DABBDE92A712B81712D2C4E1F335AA642774441E917650F8D92278A8C0444214A774B7996463527756935171D9FA61D0B50454F74ED50831EB3138DB7374A35387BBCB23E40388BB9228C3A66CDD2222524D7CB8DAE2E70FE3D97847AC35824F5D58B54DD943A440DBFF4216429146E2AC9383962420545163D6F82456E1B93E22A1B2E6875ADA12D4E194AE93EF5C3485EEBBE1BB13C560480DC3471CD950EB300CF2D18F38CAE7575B133526",
"9068502093766BB27635F12F3569794C54227CB1828128AEFC5B715CDCD1E9080D59FB218D17EA0D212D158DDB5ED0FFDB4FA9401F4F23387D32AC8B788CFB7A319114425138744002648B07D5216A3EFB4964BC72E98A6EA2939FAF372CAB44CD5D8A929F66C41D644118ACDE5DA2F09B87F8A1F41F55924A7784D8552790CDF256958E35324381902D9A006FAE02933B017A8E55931B6A0CC8CE3B5723D85DE4C4585FAEC0BD80986224CDAEA443556EBF8BCFDE162C258B9E0AB00C2B9DE0190384C61988BCF362BD0493D40D276FFE4873811EF2851204626342921BFB6A75EB6079F58C030AB1D9C1844078E61C29DB88B5FDC463B7AD3F770E1CB8B526BD9B9A5AFADADAED0368BEE0FFABD9ADFEB0FBF6E6DC7A36115BA47A292D454D7A31F5601BD8BD5435B2EF464A474E37B12B7794F356F905FDBEB248B44003F2B43B925CDB98017A68A15B8B90E2D6DAB1B72AC2921CA92F55B3453C2865DECC094E77EC1E70F99A14CE22BBBF7D3C25F1ECBF96478D84DB4EB1F5E077777214CDA31165C2790172EF778435B56B712E3C5C6B2FDFA3B40B45F7065731EC1E33A8FB300F9FD1EAB14A77E5D8367329E0F834A76E889EC2C8F80E5C1098055F2D517EC381A01F37B1AA3923894D90E1A25A8F55D3DB782ADCD644A1B8A168BBF263C77F34B1A3388E76528FD4F91BFDD7D6499EF99CF663964421FFBB6C17CA9456A2E6A3681298628FA728D3FCFB3BDB65A22E7CFC962FB83007F249D543696A8EFBD9A3DBC7C090F2C82B38E76ACB653F18E78407EFDEA120AE61CDCC8C28CAD984D776B69FB201BA3E154F3C87F53CF84DEF777E50BE420DDFB9734065B8D541F983E69E7FB2B48A186BF8338F3234A0B785B2BA63AA875B28EEE98843C48F60BA500E93067F283155A21905836AC33CA8B06790DD800DD000CC42171775A07F704229FB6F9E5123ED032148DD0EC616530B98A68BE3DBAD2A5D24FFABEFD6D78F4484C8A9969DB7480F54A3DDAB445D3C6C489A9E296B612591A027D624032CD1B11452FEA69A178006E8429BEAB1FC089098BE7EA3D73518F3F5E7B59843",
"32FE0534E517EC8F87A25578EA047417EC479EECE897D2BA5F9D41A521FAEDCC",
false,
},
{
77,
"770AB5FCCA728F659556C212F9925F28493CD3C2A60AD743830769F9B387422AC46385C88F4A10D8C43764F5200E810D20AB9A7AEB5C8B100CB751C55B301976D7BD4F0A1DE7D7CFBF0379CC6B9844B16749B8C6659824B65C2659A430914B322289B88D51324772C4A507CBAF240436AAC23950088E41973FCC487F57BD1D14321664AFC6EA2B66403C881509BE445933528A4F97C2A5B86F1CBC08816484F9432241A09E16D6B6C7068F0356505227216127AF9506250E59ADA3AB4611D7BA4A999621241A3D8C4FE0E7CBAE2492B6F44E6AFCA27F33940E3233F5A382549B9DA2C52B9BC99A8BDC1E541B274987A5BC4A272F330F725856220961C659CD9BA534716C5A113B53CD243D5C907FD6E1B2CDE69090B40314B7CA85F2185F9401FA758C3FD8AD91441A6DCB88B7350B753CC06AE5A1FBCB4DF61CAE1DFC7E60C28C7787654A068DD06821983AAED658C110BC19C2FC61E76CAA65D9C0914887A77571B3E63CD63A437028BC03DC8F69346585D023F01465E430220607948619975FAC993703CF60055D9AF28EAA1A2CE412322D11497DF22137380714B701DAE205EF308E2EB8A1B0B09ADB896BB8AB3F34F9BA2695056B7785FD51ACD043CDC1919C6B0335D7E7BDD1C43693582ED5E71D534163A48C45796B43E98BCB3DF47E075B8AE3E96A640CA659747B287C4714113DDCCBC83D37C54022CD321409BE74C331900CB17A72DC27BB6D4401D974B4E236B82F894EF5DC9A7A29091AB475D584B52D9672DDBC8D63B0BDB51554709041CC07CDEE435F39463C04BA0DC2B4C085AAC7822AA4BA50CD470A75C53A7C1318839DF4086D8A8D3510780081112453134F15601F810895B287195866FC237669F5B212C002F62B2130952B99BAC4E0AB002FA915520A715A41B1D541CB54CB7DD0291655F14FD2D0B3D802C9D6CB569FC815B69B1A0787463104A30AB34E7BD732FEEA3C8CC8764FE199947513889942B7C110482C9A1477348C3C3B491060A78B8299490E4DBABD22B054929BA77EE31922E1439D15B530A0C307E72C2F9C568622301DFA261C885A6F66399DC79E593486B11FF236B8367BF6864A1A596448FC251898A3C89CCD0B551131182654",
"3B5879284A33A6204C06F84BF91843CF9B23CD8256E3D23BD1012325686138F40E435275298A614D30950D98B00F59AE6A04BBC37510D4DCBE738B90530B455B048DF4F4AF191B59DB8A3D37C83190D425D40014775B507D43A2E2204B9AA6B6241057663A782A411419F0A0E1E8A4D7F5995B197114E832C7FAB5F2D69923D53A46F07C403038C29219EF228DA1746ED27978D9723D09EA6D6F32856D8B5589382AF4F32D2DDA0EADF342ED3248EB0CCB7B9424FCE6432F8A3892A24D610B9F35B7A4D63B918203BEF239C07277433D8122EDA503C3D596B7C670893051286044EA919BB4863AB6A7CD8D43255C099CE1DB832B109CC24C1B15BCA2F5383F03CC7263775AD39A90DE6A1E1CBB4EE8683295353FDE05478CFBB4C5249500FAA9D35B264E36494F009D8CEA06AC096FF3965DE5980B8E8485149B6912BA7B8E935341755AC67499647391A181158F3AC719F3B36CA0624B6C6F26800904609759B0C5D4270ACCAA01159C4235685D1B079624576C73F498A3F9A37B5090FD6010960C3EC9D7A1D95C3749DC3E225B800D2B8F3B597090F0B83CB315B7A43FB69151AD2B2EF21C8E3D6028A650716BD96F466BAEC316A230232B59A97D371C3DF6D2476C51C64F48271EA38AAE9C8EACD1A0F9318DFBC273D382CDFC0043B0C47B35834EB2069A0E306A53826C49C7A69AE3442947C37ED01F55E9411146870DA50194E778CAF71A7561429D1AC02AC362FAD196CE1331BF2A00001DA290F2B136B92B576C2831717908682412462AF101C3ED3685180112D41A73BB164553F9B79CA71F0932693A630E4209BEBE7BAA7AEA295150B1B827716F47464204258F414BDB6C5FFFC42249C782494A4268F60BC5C195AE9C1EFD778CBC15AF2003B3DAB7336AF5037BFB4EED702EC887AF43EBA616414914B08493D53ED9F89EC2805EA1B40B634610B458236A2ACA1610565350234E9B23BE27166FB8ABDB441138F44E79D8541C3AAE85FC553FB884CCA95E6C84325DF29E112B6D863444A52721F5A5A6D0DB5A65564A545633CB121A927136408C16763191EB10270E6A1604B486770AB5FCCA728F659556C212F9925F28493CD3C2A60AD743830769F9B387422AC46385C88F4A10D8C43764F5200E810D20AB9A7AEB5C8B100CB751C55B301976D7BD4F0A1DE7D7CFBF0379CC6B9844B16749B8C6659824B65C2659A430914B322289B88D51324772C4A507CBAF240436AAC23950088E41973FCC487F57BD1D14321664AFC6EA2B66403C881509BE445933528A4F97C2A5B86F1CBC08816484F9432241A09E16D6B6C7068F0356505227216127AF9506250E59ADA3AB4611D7BA4A999621241A3D8C4FE0E7CBAE2492B6F44E6AFCA27F33940E3233F5A382549B9DA2C52B9BC99A8BDC1E541B274987A5BC4A272F330F725856220961C659CD9BA534716C5A113B53CD243D5C907FD6E1B2CDE69090B40314B7CA85F2185F9401FA758C3FD8AD91441A6DCB88B7350B753CC06AE5A1FBCB4DF61CAE1DFC7E60C28C7787654A068DD06821983AAED658C110BC19C2FC61E76CAA65D9C0914887A77571B3E63CD63A437028BC03DC8F69346585D023F01465E430220607948619975FAC993703CF60055D9AF28EAA1A2CE412322D11497DF22137380714B701DAE205EF308E2EB8A1B0B09ADB896BB8AB3F34F9BA2695056B7785FD51ACD043CDC1919C6B0335D7E7BDD1C43693582ED5E71D534163A48C45796B43E98BCB3DF47E075B8AE3E96A640CA659747B287C4714113DDCCBC83D37C54022CD321409BE74C331900CB17A72DC27BB6D4401D974B4E236B82F894EF5DC9A7A29091AB475D584B52D9672DDBC8D63B0BDB51554709041CC07CDEE435F39463C04BA0DC2B4C085AAC7822AA4BA50CD470A75C53A7C1318839DF4086D8A8D3510780081112453134F15601F810895B287195866FC237669F5B212C002F62B2130952B99BAC4E0AB002FA915520A715A41B1D541CB54CB7DD0291655F14FD2D0B3D802C9D6CB569FC815B69B1A0787463104A30AB34E7BD732FEEA3C8CC8764FE199947513889942B7C110482C9A1477348C3C3B491060A78B8299490E4DBABD22B054929BA77EE31922E1439D15B530A0C307E72C2F9C568622301DFA261C885A6F66399DC79E593486B11FF236B8367BF6864A1A596448FC251898A3C89CCD0B5511311826546E56B6967EE923E5733561D5A4BF940CAAC4960BF60CB769A40E396BFC370F094A00986D708AC731B420FDC11FCB071BDA0786A23F80269341AE270B8ED6844B",
"30991222B8EA47530F7C703D85BF4357F61F47615539781920EFFDF067172E32EF1BA77B21670ECA074C4B2401BB591B21CA0F4BFBA9F8BE4A26A9DE2ECEAA8303A91073C0C91205DAF6DDB17D35104969C5036BA722B176F6A3E6D92E1E5EDDAD9A6A3561F7E5338BA2B163702E297F9C6F27C5BCB7975139DFF287B739D2053BBC4307946B89DF3D9C963379B932DDBA015A6EA396E729996F7FF573A0C24040DE323E60B95B2197C89127661DB35D44588E132742B62949EA45D3E8527F0B2B71295E0943F1FA1F87D3B3EF11F840B59E2BBB10AA22B687FF23D22CDA109D5CE33F3527FEA041579793530226009D48CAE3E499FD0ECCD036D04B8DA21F939908E53F5BBBE41DBACAF3A7F9F5839D479BA0909F0DF0B2C8CD7AE8B11F160B16EBA19656744AC38D9AEE3A31E698380B3B9483E3A5F3C3B3767C519ACBB515706B1F192B16AA7B1E0B8178F28C65CAB578368DE5BD0DD5691B659293B3B212A5547E60727F69B33D3938A301572FDD931F5F71E7C647BF9CB4B3A8B294E2A17CF504319278648E59DA78F0FC5BBAD5ABC37551C30AAB853CC50DF796F308EC99D56A2348954EDAF7AF6E4D62FA6B1BB6FAC370226F47F1A91E2BC6731875C09CCBF8E635745DEF1A607F15BA774E7A1FCE8822C07916D352BF24DE6218350C5356D627411F884623496620500337654DBB8048D58DB94BCD8BF18ADFF7EAFE9DC8687156F426379FF0D57B880B8F86FD94861CF865DB231B9ADF9FCC53A7D8E5BEC45EF2EDEEAF2109F35A365C1287AC81D18EF302C9313B357870DB914E2E8300440A0C44E3940FAB6B35F1BC4BDF9B7A54EEC634897F1F715A334E553F2AEF6ECCD13966364CB942CA7C91A90EE2ED924DAD7F7A0907A56323BA787967F687E1C8BAB45976E20AE14301139E989E4257EC9F87728F4AC56A5F0588D96908FF7DD901AC4FBD8AB336EAC865377DCE7C22B4E8193F17769E1C1D6A2365D21715F014E9634834EEC80E4F6C97FDFDA6559BA2F88F81CA57A03AED25A0D818E7823BD08713E1667815A5E4776ACE6FB5658053E6DD38A01AA0AA9819802BD83E",
"6621D11567D58EAC3CDFBEB9C69DB0E7AFC4C97C252D98B4770C5F6AF98C83DB",
true,
},
{
78,
"22664886862835E6188D53C21FDC5EAF7849E078832E004CE79A7BBF122E6E59885608002C170077E98440039870E03FCB890D94001A98482EE6644097FB2BF39A93DA8811B951C6B905229A40BB97727EFAC92D266C4AAEC5623C17C1982A25D4859E362A030D191BD9E11D5CEB145E7482FFDC38ED17AAD859BE642072F55B4EDAFA4AC438B3DFB793A910BEA792780A801E70D2AF76283B60238DEE9A63011C343A586BA54CBB0C77CBBB3C8470C09F1A9C57A42436D3ECB89DC0CD711591FC674878A8317BB833D8DB10D217CC02883A1FBA2CFE3770F46721A7C9AC0045BE9F14487CE6992CC0CB1871CEADC3BA0627CFEBEB974B457D3B7953922CB0F5134918B006CAC669FB0B180BA00FEF56912B99A2C23B095E0A1F65F5611C879D4B519FB7E27153284725749C8D321178BB83C33AA9B547129E780B6C958E69192090FB3E2D69AF3B44A923276B4D5998A3349E5E291291B613B579800B12BE0805063755032A219916A5B9807A7A74A0A833F14F2F940465D970EFC7B7F8D93AE6D554A61085BE277DB5709AF4F1AE3F331B6C8900B24697978B7F69F1B3800B3606F23D90A683E44995F4A1451FA4322E03BA4E32120C5B6E6F8218B67A42D2A54467D672297B4F5CF51131180261276548F1ADD6C985415C15C3D00D83108BF34A6077EACCF7789865341B9594AC3C3781D15336696325C811842335AA43E2146B9176EA251ECCEC7F3E18C8E7F11CA7B09AF0CC14995515D80AB090711520D9BC8CD7353187BCD7D2BC4FD19911E11D904959617B4A30EA844E6292CDE42E46D2A013635C1C38C2D42BCFA68C928B6196B9EA75E6626DC7B17849205838B4C794511DED5B19CDB76CCFBC175F6B94E4E5CC5FC3C940C836C7F86BCAB3BAA860CFC3F1C8C088ABC684A243DCA306B27C2200AD1A31261B4C3C163B99E3022D8F79C9B4989AFDC32F5D93134FD57AE2A7B8381319E9FC2266F457CEE24440307417429AA259CF7DF5865A290404D73FB638BA6341316D8AA69FF605FD23453C34BC015B915D723815285FC200966C03CA84828A37579C86418D5433748669A56C447FCAF3F7A27F8BE433449CF232282A0FC0F55F6387EC0CDBAF615987A153",
"65BAA3F5C74319F488D378CD416C312E8B5FB189A3991741B4035E1E15B261E350004A4DA438725888AC54BBAA2C9406E303CDB2D9765A0352A22A28BF80CE51CB4234397119B3C5AAE2324BCC0FF6620605373366A474621A949B90888A12BA91FCB68CC9C42070B2AFCC54095236497583DEE7947A3258A6D33672C2B1FE8A02EA9CC34A045C91C5AD3AB72973888C46B8CC383015DC12476551BADDE250D2D84E7B06B7D5984B55A6918023C41EC9648CBC706BC61EF3C041C96822265C092DF204BFA25A9A16754B165AEE58607F2CB9BAFC05F548164C96483A846C3892A6553422E99B1D0099B946FBAA4C320D8187BA9928C574B448613B18EC7BA7AD5C4042642FD04260F5E5600E22AA69051642D0A2AC2BBF5142B69A69B4865AC9FC8B25F71B93F8CCC2C601717D85AE5267116EEA467F54656999CDB365076CEB052D4B4698B361C0B9B02B7BC10129972AC64B1CC65EE0AAB59D401AB41A245BF10F0D58393587CED798786EA87A56F48121E3CF0420BDB438A4E292CB33B6B371D8850D290C8C93627D2B428566014A82AAFF496E809BAC64538A2A52B6FFAA0852574D8A648A5CE81A17471EABF3CBE2F34B6E54C01CE079CFF4AF0CC60F820C64BA30755B20CD06420BCB9156055624599C1F8B8292A668468BE0836FC47383EB8B74E2118E918FC499C64E146276B17E5E015BA85863D9920D8A299F90CB09C178018B895CE6F0828246247CD0B9C86B4F885350CA6167E90953E9397B5EDC0A71866C087A9A8C1A6A3E895BAA78303337479AC256BAD692FC0A9ADB58C2A152A9E382B11956AE30263E74AA7BF1D79B3B98800B7C82E81A0C3AA2CBF4A8CC1D13B3ACE8B3502361ADC694E7684278164C810642771B04085122DD408228606B939550892B01A05B347B2135B5568B4E13C250BC1CD14396A3B756450BC864D7C9346CA4879178DE1A0D5DD82E09F9A938B40C37C4407DA787DC7149875C3E927BA166528054001FF103BFCFD2C1AB933C17E10F1F12779AA44207C960BCF7330D415832050713B438C0482651A5B10B850A828964EEB26196A84AF4AC2922664886862835E6188D53C21FDC5EAF7849E078832E004CE79A7BBF122E6E59885608002C170077E98440039870E03FCB890D94001A98482EE6644097FB2BF39A93DA8811B951C6B905229A40BB97727EFAC92D266C4AAEC5623C17C1982A25D4859E362A030D191BD9E11D5CEB145E7482FFDC38ED17AAD859BE642072F55B4EDAFA4AC438B3DFB793A910BEA792780A801E70D2AF76283B60238DEE9A63011C343A586BA54CBB0C77CBBB3C8470C09F1A9C57A42436D3ECB89DC0CD711591FC674878A8317BB833D8DB10D217CC02883A1FBA2CFE3770F46721A7C9AC0045BE9F14487CE6992CC0CB1871CEADC3BA0627CFEBEB974B457D3B7953922CB0F5134918B006CAC669FB0B180BA00FEF56912B99A2C23B095E0A1F65F5611C879D4B519FB7E27153284725749C8D321178BB83C33AA9B547129E780B6C958E69192090FB3E2D69AF3B44A923276B4D5998A3349E5E291291B613B579800B12BE0805063755032A219916A5B9807A7A74A0A833F14F2F940465D970EFC7B7F8D93AE6D554A61085BE277DB5709AF4F1AE3F331B6C8900B24697978B7F69F1B3800B3606F23D90A683E44995F4A1451FA4322E03BA4E32120C5B6E6F8218B67A42D2A54467D672297B4F5CF51131180261276548F1ADD6C985415C15C3D00D83108BF34A6077EACCF7789865341B9594AC3C3781D15336696325C811842335AA43E2146B9176EA251ECCEC7F3E18C8E7F11CA7B09AF0CC14995515D80AB090711520D9BC8CD7353187BCD7D2BC4FD19911E11D904959617B4A30EA844E6292CDE42E46D2A013635C1C38C2D42BCFA68C928B6196B9EA75E6626DC7B17849205838B4C794511DED5B19CDB76CCFBC175F6B94E4E5CC5FC3C940C836C7F86BCAB3BAA860CFC3F1C8C088ABC684A243DCA306B27C2200AD1A31261B4C3C163B99E3022D8F79C9B4989AFDC32F5D93134FD57AE2A7B8381319E9FC2266F457CEE24440307417429AA259CF7DF5865A290404D73FB638BA6341316D8AA69FF605FD23453C34BC015B915D723815285FC200966C03CA84828A37579C86418D5433748669A56C447FCAF3F7A27F8BE433449CF232282A0FC0F55F6387EC0CDBAF615987A1537E35FD4ECF80F07D398BD1A4F057647C17838F8427212A33DC3D3E7052AD61DB62ECC47A3A06302A8383E1A465EDCF1BF3523A84F5549859A8CA5C0905DEBA3E",
"596D8F70598FC6837434DBC18E9891D67735460FE00248E49E07EEDCD2A36C07B37ADB63AB0DD98294B799CD8CE664D09F567A7B52C2BAC89F32366101983529D97586951B9EE52A1B48B51D87F47444D6D3A0F3F5A7063B621C6152ED5FD7A1B06903CB88D2817CC000ACD3C81A6F236CF4A268FEA9388E61EFE62FCFE21D93B8D872E31AC4C84AA8F6A66C419BD9D03EBD11A00BBB3AC07DC806A32783AADDE4B41FA8743A330CA590F5E2076F738A147999D8AA983E67E8D8CB663EEC7A693CE9E48016BDE8511484EEB22232142F6778B0AC3096F14EE5C0131C966171B3CDA96F815D8A6A4668B20F65593543B19656E3C7315523E2FBF3936D050DAFF6E260CF196A2CC83D1C5A8949D1B38E331083565E8683CFB4485D256B7E5CD128FDB516745DE86E402A67DF21FABB2B64E804225ACC7D0435D83261DB47EDC234BE5497469740C2160C793E84EB061D8612093B242D0396588333F4A3CAAE8A456F7D8F29A790CF7569530EDAA4FD2A93F9CAAE4FC4C6CD1D873153351D082B3C9FDF7C644C36D168485CB8C71E96258A3750A89BC3E4EFCB2C81130D7B2CEA9A3277F3919C193B69677DC2BD290F473DE11562974D4AD9E4CA19598E63CF0442763B1A17E00E58207FF2403FBBA79B393C885BCFADAF31AE41FD124CEBCD1AFE38A05CD7B03CE692CC4984C5EC72EEDA9ED85F8575E96CB06569B938AD6E8E78316B3FD099504D1B254D8BC1379B77D61A83D47270FEA6E2455CBAE336A2AAE8FDE479FC405D2F1AD2F54ADEC49B9C2999BA2694C42F88E8AED706DDB9CFD9E9A560FEFB52ABBEA30A09128ABC1780D8099736AF4D4F208EADEA47A1700F2D8C7765C497ED9E23E3A73EA0159F4F7BFB137ED5E6239737743323CACD84E172CD0B451D7F3232BBB6A61AA267D7F5A06A285A2FEEBB13705C824AF5E760017604AB15FB2D68E21A71198B78A6A7969012403AC2DCABED2DE26D65FC5877878EB1456F9F66DC09D66F7F66C127828E1C6E92D8BBD50D2F15AA16AAE3F38759250AF9E02EBBE9DDBEB16F7523FBD8B1473F1D2A3AC7C7FF8EBE0A5D8B764B00D190",
"0F138749C455FE4615FF58200C7D4CE24FFD8709C305C53C26AA9E340E8A73EE",
false,
},
{
79,
"2F29C94A9C9351A321F262343BB7777A8B46CAB624E3F4BCB5704258B462F9EA711146AB34E748A1F08D000249FD73655CE748552909B3AA5546B54A72EA5980B957636B05EB14AA616C1B8B5AA78A5279A46B23B513132AFB85C963409E40CEFCB74F71C75298A670F7C0632C302444C7CE74F643E27B03AF93A76490374632BBFAD0C2AC84BA2BE4579C32237EC701177312B68458AF3B039F431C2658BD54041398D94F39848199C8763A2AB170C421853C7FA19C0A9ED89B665B13CE3553F6C8BA4C745327B3B10B0CABBEEC2D2C11277F359E86547D1E901F0BC44126F3242850AA7A3A00E4FB2923049205EAC160C24CA1B32280B0C0CB788857A54D223548C7505A5DCC5D29D7189595BB5CC070AA23149D376AADD75DE42A611E157C00B797735A3FEA3B59E0EC46E58A0FCB48606D033CF8D75E6592CC89448732D78B30B754F3AB7066F85C57F45E7FC035A7F08496225171373818F765FC02817BAB6FAE432CF0EC38C0779ACE7231041B8047869227DC01202419B83A7B8B87A74468036D9A2CF0C5892EE9CC85F89A32039A0D3A219D0365C600125BCC15CF607C737732D7AB5A27367ACA464571B0839DF379A79880F5B7BFF1FCC4AB69A047166800204C733B3A72FC566C2C280788CFE36A1FA9F63189B0382E683A4ED417D755A20B9895652C1E26B628BF19915D06B8320AA997531E298926F0F268C97C936B1896CC51050411338AC8088CF4A333C847384C9DC766CDB1BA531199C08B0266F1D24331E941224B2617EA9D1EAC33024939041007B5F840100B7E5437306D2A72A3B439E3D355817C78EF28332123797466A0F873A33AA76BC0B42E33C109F3EC8733785C2D03B4E64C3A5A1988C1C4947142CAE75965A610AF5D9849D6056DD9A45E8A8705C04306850B13FA295D36164F486B3440F62951F79BBA12747497C31167BE94D1A9D424373B4B377AE18299C85EE375B0312004D71C107E3ABB12CCA8AA50935ED1AA64477D866BA940C6441D44B006D22AF62960F62478BF978222DCB90E454CCD33BD9AE06F3EB34F5B576C4C9146A4514DD33258A0B6562A5EBC6A8FC1B5F15C9CDDF7EE64417FB722AE52086868BC807BF19B472AF32A",
"D01B6395019BCB1318A6670DBA709588C0A734256B3CCB44E6F2A002B91B9DFBC68E18C1957B3EE8C5464C00215E41907C7B6C1E0C20F62B294E8686627CA3181AA1377C25B5F79355B31BC0C14776621A014302DB2119F9BA4F0AD653F9B4AD562BB14760802AEC8B10348403289C9ADA8C1F39A4CBDA9648589ECFD09DE6AA0BE97AA8F0A13644F23D8E505E1076B415DC078B659E63A50D04A53E680980B2E90241435AA0810CC76016F0010E7CF8B2A9A0B1F0A75CC068CAFB4A5AFCD74CBADA6456D83A4D460D978025A89B379F2294D61BBF0A344611635335CC05DD24BC800C48845930F90538C5854D9862B059F952A25B3D2D6BB3E70141EEA769BDB31F42467C16E6509DF8A0A24477916A28B623A555E47079C61EB7B7A5431085AE7457F696812CC49D0DB242FB42B3A58A6B405289974BC34DF24C8E09C63BB81F109468B112668CBB408AA13AA1F2B4EB79A419ACC2B3C05807679E8EC60951B266D621319EBC289F8709E903478D150448FB00B142BEAC93BADAB7703D5CC4ECD78A05121B4182501CE62E4A3BBA65CA6C57156622CB624F844172B0CD3B376E1E008A25E0A8BF982927E154C55A82EC276DA312C2721570F835C51C131E7A011D26F52A90E5BAB0B813EA41C7BB3BC7FAC789775286B1D115CBB865BF96324FA99A3180B7D1A8B7C2B539411302EA62020611359659C2AE0062B1C52C83B7B94A831EC9036A79025689A70C14C44BF590A914A3325392827F6820B96961E7CB2E88B56A1F706C6027A18BD3AB8998124D8C73251A8CCAB2771A630BA448318562061755B6F271063100C4DF788030113F5A8768EEAC11B31A1F0A81C5D14002242409F35B2725AA68FC4087A22321F122B672E101052C3EE59571A9B71C17976C3220C070C0A4641B73B007CD51A5561BF0AC24B58A1DE1443EB38B794822C4148843746C44E6458FC92F1BF4289E3178CBA74521D792DD297D93D15FED878F9021B8F1DAB90D6259C354CC9B4A383A58800C42547F9A13A4F809F5C05EED58C6C98A878FF432ADBAAE218A9C283CBF45D527ECF8A4B867ACD7576957D1C12F29C94A9C9351A321F262343BB7777A8B46CAB624E3F4BCB5704258B462F9EA711146AB34E748A1F08D000249FD73655CE748552909B3AA5546B54A72EA5980B957636B05EB14AA616C1B8B5AA78A5279A46B23B513132AFB85C963409E40CEFCB74F71C75298A670F7C0632C302444C7CE74F643E27B03AF93A76490374632BBFAD0C2AC84BA2BE4579C32237EC701177312B68458AF3B039F431C2658BD54041398D94F39848199C8763A2AB170C421853C7FA19C0A9ED89B665B13CE3553F6C8BA4C745327B3B10B0CABBEEC2D2C11277F359E86547D1E901F0BC44126F3242850AA7A3A00E4FB2923049205EAC160C24CA1B32280B0C0CB788857A54D223548C7505A5DCC5D29D7189595BB5CC070AA23149D376AADD75DE42A611E157C00B797735A3FEA3B59E0EC46E58A0FCB48606D033CF8D75E6592CC89448732D78B30B754F3AB7066F85C57F45E7FC035A7F08496225171373818F765FC02817BAB6FAE432CF0EC38C0779ACE7231041B8047869227DC01202419B83A7B8B87A74468036D9A2CF0C5892EE9CC85F89A32039A0D3A219D0365C600125BCC15CF607C737732D7AB5A27367ACA464571B0839DF379A79880F5B7BFF1FCC4AB69A047166800204C733B3A72FC566C2C280788CFE36A1FA9F63189B0382E683A4ED417D755A20B9895652C1E26B628BF19915D06B8320AA997531E298926F0F268C97C936B1896CC51050411338AC8088CF4A333C847384C9DC766CDB1BA531199C08B0266F1D24331E941224B2617EA9D1EAC33024939041007B5F840100B7E5437306D2A72A3B439E3D355817C78EF28332123797466A0F873A33AA76BC0B42E33C109F3EC8733785C2D03B4E64C3A5A1988C1C4947142CAE75965A610AF5D9849D6056DD9A45E8A8705C04306850B13FA295D36164F486B3440F62951F79BBA12747497C31167BE94D1A9D424373B4B377AE18299C85EE375B0312004D71C107E3ABB12CCA8AA50935ED1AA64477D866BA940C6441D44B006D22AF62960F62478BF978222DCB90E454CCD33BD9AE06F3EB34F5B576C4C9146A4514DD33258A0B6562A5EBC6A8FC1B5F15C9CDDF7EE64417FB722AE52086868BC807BF19B472AF32AE511FAA0E231976722B8C8DA3A15116AB0407F3C7209D421D97969800A933F9742B5A904C6C1477F268EDD8106D88618B002F3A2D0FBB72682CD37B51F9BEC47",
"3856C757D2A5FCCD231A1669ECE3832AF80E5AE832F3B1314ABFF54CDBB94ECBE156D3E93FC4705C46D0E662468EFFBB514DEAA24C384DF4F0BB2B3442D6C67926B5D4EBC6DE170AE0A420EF7319F3A52B6F7726CD47F743B86CB5AE06610FE485932D9B6EA9CDE8023A978DBD0DB5C5DD30AEC898A042C825F0143A32DE320EA97CC36B1625D652342F716F61446EE2355435A9FC043DCD68C6BA0C15AF81A50EE394CFAF9558C6247A6E83826FB48ACAA574F26FF137676348EF1FD80EACE7A20EF6A5150CA1F094A9C31794E3C20CE6CFA71AAC394072432CB4442C6BC7D9AACDF493949CB4E9F33B1946ACFAB8ED5C7D978E43DF907848996F9CDF2CEAEDCF4CFFDA1F18AB30EE1F68F505B4C3A1CCFAF492944506101FD2432667B4D1DBA381C3401BCEB2FCD93CEE7D506E63D97081D4721A453BB96009CD58122AA3B2BADC079EC0358C6C8051D58DBBAE2DB9EA7A28668A2B2FB35D90A542212C7ED4C149416B5CA79B9CCA8B608062A0F3E8E6801D86C8295BD1BA1A078935ACEF1C9DC52F126E83B79927A361167C4DA101FE8C42C20E3AD167D28A73E22093E12EABC39A1C0B3A295C3049104E1E9772D3A4A76D829D9BAB22958C14C301488287936EADE7FCBF43744E71B35A23DF0BD07D2D89C468CE3F8E1BE589B202D74B2D4DECC09FB919EFEA56166CF385C40E113FFFC570178044ABADE35172614DEDF9FA93D91AD8218655C8519D5871986C16320D845D5A5231DC1E04335A26AAD213341A5946680FE9F22CC7BBEB660EEEC1CE9BBC92D497A9ACB21642F9CB52D19AC26B774FCF8817350E301E77CD294ADDA779672597BAD395F4913A45E0346A41C14C0A473928F89B92A7075B63E7929E1FD45077D0401356705DD9B6B75D5044605017A9139B19559DB18C3B931DD71A532C861AF40D18D15C63531F1545D337BA1A30841CDA6AB7D6EAFAA4798E4E6980F7718EAE92775DD8460569B05440DCE3789E6D743E695B5B1BAB0C9DE9C666C1595BBEDF69E80445DD53DBAEBEA126E45479CD6472D5F97840475EB1E52F7984ED651C07B82D584A07D9099C353DDA",
"ACB0CD384DA7C8A0E5187025297286AD154E9E37448D9D0E798BAE24FA7A6727",
true,
},
}
func TestDecapsulate512ACVP(t *testing.T) {
for i, tc := range decap512InternalProjectionCases {
//ek, _ := hex.DecodeString(tc.ek)
dk, _ := hex.DecodeString(tc.dk)
c, _ := hex.DecodeString(tc.c)
k, _ := hex.DecodeString(tc.k)
dk1, err := NewDecapsulationKey512(dk)
if err != nil {
t.Fatalf("case %d: NewDecapsulationKey512: %v", i, err)
}
if !tc.success {
c[0] ^= 0xFF // Corrupt the ciphertext to force failure
}
k1, err := dk1.Decapsulate(c)
if tc.success {
if err != nil {
t.Fatalf("case %d: Decapsulate: %v", i, err)
}
if !bytes.Equal(k1, k) {
t.Fatalf("case %d: shared secret mismatch", i)
}
} else {
if bytes.Equal(k1, k) {
t.Fatalf("case %d: decapsulation should have failed", i)
}
}
}
}
func BenchmarkKeyGen512(b *testing.B) {
var seed [64]byte
rand.Read(seed[:])
b.ResetTimer()
for b.Loop() {
if _, err := NewDecapsulationKeyFromSeed512(seed[:]); err != nil {
b.Fatalf("NewDecapsulationKeyFromSeed512 failed: %v", err)
}
}
}
func BenchmarkEncapsulateInternal512(b *testing.B) {
tc := encap512InternalProjectionCases[0]
ek, _ := hex.DecodeString(tc.ek)
m, _ := hex.DecodeString(tc.m)
ek1, err := NewEncapsulationKey512(ek)
if err != nil {
b.Fatalf("NewEncapsulationKey512: %v", err)
}
b.ResetTimer()
for b.Loop() {
ek1.EncapsulateInternal((*[32]byte)(m))
}
}
func BenchmarkDecapsulate512(b *testing.B) {
tc := decap512InternalProjectionCases[0]
dk, _ := hex.DecodeString(tc.dk)
c, _ := hex.DecodeString(tc.c)
dk1, err := NewDecapsulationKey512(dk)
if err != nil {
b.Fatalf("NewDecapsulationKey512: %v", err)
}
b.ResetTimer()
for b.Loop() {
if _, err := dk1.Decapsulate(c); err != nil {
b.Fatalf("Decapsulate: %v", err)
}
}
}