mirror of
https://github.com/emmansun/gmsm.git
synced 2025-09-16 03:43:50 +08:00
![github-actions[bot]](/assets/img/avatar_default.png)
* 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](3c3833e0f8...2d92b76c45
) --- 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](fdcc847654...5a1091511a
) --- 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](d35c59abb0...4469467582
) --- 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](2d92b76c45...f1f6e5f6af
) --- 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](ec9f2d5744...f4a75cfd61
) --- 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](f1f6e5f6af...d3678e237b
) --- 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](d3678e237b...192325c861
) --- 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>
356 lines
102 KiB
Go
356 lines
102 KiB
Go
// 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 kenGen768InternalProjectionCases = []struct {
|
|
tcId int
|
|
seed string
|
|
ek string
|
|
dk string
|
|
}{
|
|
{
|
|
26,
|
|
"A2B4BCA315A6EA4600B4A316E09A2578AA1E8BCE919C8DF3A96C71C843F5B38BD6BF055CB7B375E3271ED131F1BA31F83FEF533A239878A71074578B891265D1",
|
|
"5219C4CC17C35A828F3E21B2AB7496805C99EE041FCA0158A3314F07D053F364C887A6825958A625965D4885C2CB355E83A3C1BBB15446F891D2D24F145632CF06A5EE1A278CD3064A79AD53193853E4CEA654448A4297CEA3C9E87561629680F588953B858074292ED31C20DDD983E805D07BB9CFADD823C7900B604286C0184738CA04E0DA8289540E329605EFAA5960AAC0FD0760006C1F1993426CC7BEA22BCBB3CC02E099B828E82F94045DFACB1D9FB315582B20D1B41476FC43AC4680647259FE9B51371223446C82E0BBAEA132913E2B96EA11950C450F25854EE4FA4921193C8F1C66D61B8265C7072B046F0C532141D51D9919C80733C1BD3C5A6D77CCB3A1938C95C1E4E866D1D65C78297B3B32CA3C4143E6A215C609A36A1B13BAA17981D42B7FF4C715AC806DC491560032A5A2BB30E476A266C6E4A4A065D9698DB08132608136082689B1B648B49063C98324706A43876507FC690893900F8166E1D52ADCC44848D864B8BA0933B32DAA63435F11065915C5D5D879EDCC136FA8515B0260B9536C316120B4904921805521C0232DA126E2A9C5323976ABC73B5AB892E59B01A194B6446C1B73217FBBA855AC887AFA58A8F15A768EF968D775267E050150C7A8237C1024F9421C210D97907B2A144736E3B58E01C48947B1C62655E380256491CEBE400F52493D9033A29D6C9AE80B33E8C38584B30A31A37B15E85F5E82B73157408A5399A957190CBA905F1713C9ACA53AA32923CACB8269436A56BC02932189C7139D8463D0DC540621875E9A7DFEF020E7E83696C7612BC2A7DE7148D7075C31F257766301FA5A06E00582DCE15C6FB3195AF43078D79B110B5DC0789BE3A32132737FEB247DF8D2216F272C3D5BA700C52ED7E3A2795CCFE3072CD1D1B533939AC58A065A8A9FE85441ED291D43869E25307737A5155A095C5056A204326F944A9FC8F7035C931A61033CC2DB6ECEC08AAE0045A6542080C1A7BBD699902A2ECBE3A1F9AA95FC6222C6C6AB7BF96EDB3450E029B0CE104DBBFA0A49B8044EE1BB63B33BCFAA8A6A450194CC577D490A549B6C42D6816F444AAE8B8A4F62AFFD17664E957E2BA245A864BAB8D28E82CAB9FAC3BCD707AAC19A5EE58A3925DC7059BA1B9E7A798EC987E1924342C54E5D935A6699B6D9AA78E4738B0CEC6C57D8228C86881A14A3B57065BBE5653BD92B5BD5A9888B1B1E9B017ECA1A788CBC3A283A9F7B00D3F55B138CA26C33CD2CA3BA632A0735596162AA6C9D10968F53305D35CEC4395CA0489FF631A3EF661264A22ACB535DCC1313CD6917BFE3B5B8FC3B8016CA0DFB151623C92F95701DCC4140459B52EB796FDA60FB429651052D2C16B550FA035CC1374C87A439077713769C728B766BC75A609B70BBC14AF84A3C70519C3211ACAD58BF7C14C15F1AA86FCC1DF55580A2F9BBBC31B6B0EAAB379481CE9966F7FA6487C611BA5B3E8F8307FA35CD5248C8AB351B63ABC4BA005871A97751F01E5143302C757A65E411AF7B26F22076C7A1CF7E2B0055E80D7116CA2B3056BF8754BCFA9095D0CE99715CC4512F10125C5A500DABB7C11F5B0408377900621BE851B7A3602576650B84191749F30AC635A9E2212400769DE8E1915F26BA198AF8E53DACB598711738DA8C583A388E027A59",
|
|
"E6F634F0A3771ED789D6842321E147B6010ADA7B6B0B105949F90AEBECCA062C494743AD3BE35A23C9BAA0E4CB83E65C9EB8BBC42433F0AC671ED9544A37C0CD704D1C24343ACA7BEBB538C7051186BC624A9A98F536874C3A15E145732A591ECE600C78028426BB8A7AF22757296EB968B5E3553721DB6BD507A5BE5742F45AA3E134383499400BDAC0C8607FAD647F41A2B547A631F971224C93570141C844662F96D9A3A32B6DB1C93F2A2B82E6B370B7D91EB9F9B8D551C8C2F3CEA6C2711379969467ABF7041848BB05E619A7B63CC2F9DAC97C05457911470EC7B4CD380528D695604B6F042394524C5C77415C3CA15FA64A9E16B240ED12CFF0A48AF72743916C469593B89D8510BFEC58A0532948D80D32A11FCE265ACBE6C21751507FD72366EB5EDD650344268757A715F27B28BEB4CF80347DCFCA34BB92A046955AA39590C2397A223ACB42B94B938329CB6A9C4253137531C54D2100966B9A8C96110A412AD2DC4480FAB04D05B93087AE8E4A1616526A48F38CAA920C6F495CA9E488776551630010C46C375DE52AA5EC23CCE9BCCE6663F1678B9F4325D1A961D551A02B046320F52272382DA8D565563A4CAC7419830B6C5F95629B3441727CCCB4892BA765B212221147076872361A0A31AA7C50403976042DA5486D287D143083646A90C6F1CA4037868E8478952829FD4C7E84187894F28CCD58170CF107FE74AF5A0CCFC849A71EEA4860080100310259FAA59C477C7002BD93385B8DA14E57891585253AE0CAA66BC3A33F052512788828916F0AC3C9C4FA6E31AC4088BC6A47F29386E467FEA414EDFA9194D30CE0770D3ACB1C1162312ACC64FF2793A2AC4E990726D1739E467A4BA8221169137AD1069EED5112EFF648F2353CCA4B4F8469CD29D05F2684236AA3AB3B019E6635AB53AC456D2C9D83152554655F8D6B4F75E23870677F492A2BBA53913B535A0B54113193B4122A5331585EDCC42C9361A08C173F73E4182F85B15DFC6F795269C88A19C4FB7D7D33AEA8144000827C57E73AFE87C6D9B646B1B1BE560672C858531D835BC3DA21B1407DB74A9D6B729F5BB6CA1AD086F3C2461D78A29A21238B0434594058BCDB125EE56F3B606D8C7A17CA5C3D6F876A3061BA5B65B97F033D3889AA74302D1EA268531354A707756EB60E621AC959E5AB5875790E6477D5C91A3C06593B976010F054AC6B4D54D452E5302E8E332CA6457CF2527DDFCC3B5462C7171105F9E24C8D299CA348CE9DB678E041A135893E16AC9CCB2BACCC202F7BF7B3DB1C8C5D567FE3E3C233024C75D369D7CC1093B2C2EC9094D020A8782ABFBFB89FF199517B0A4BB81C7455A64D9C07897877422D6ACCEEFA16EA242E0CEC8B5EF20C85E82E2DCAC3A3030B211A600B520B7D66B58AC317B0F65518F20EF26AB5B7D8AA729210A92B12FF115B43540509156CC247B4BCB34C313B3A38228D4BACB7E1E934FD40CB42322B6E618670E17A725CB37CB20210E000678393DE6A5D40786CBE019DAEF867F2A0B8F1827F48C0C04305357B82BAB80CC144A6997228A846D9CB49E32B865858A7601F55CB8127DA0BEA4437F017502AC8709E428309F6A252C69042C973BA104A5219C4CC17C35A828F3E21B2AB7496805C99EE041FCA0158A3314F07D053F364C887A6825958A625965D4885C2CB355E83A3C1BBB15446F891D2D24F145632CF06A5EE1A278CD3064A79AD53193853E4CEA654448A4297CEA3C9E87561629680F588953B858074292ED31C20DDD983E805D07BB9CFADD823C7900B604286C0184738CA04E0DA8289540E329605EFAA5960AAC0FD0760006C1F1993426CC7BEA22BCBB3CC02E099B828E82F94045DFACB1D9FB315582B20D1B41476FC43AC4680647259FE9B51371223446C82E0BBAEA132913E2B96EA11950C450F25854EE4FA4921193C8F1C66D61B8265C7072B046F0C532141D51D9919C80733C1BD3C5A6D77CCB3A1938C95C1E4E866D1D65C78297B3B32CA3C4143E6A215C609A36A1B13BAA17981D42B7FF4C715AC806DC491560032A5A2BB30E476A266C6E4A4A065D9698DB08132608136082689B1B648B49063C98324706A43876507FC690893900F8166E1D52ADCC44848D864B8BA0933B32DAA63435F11065915C5D5D879EDCC136FA8515B0260B9536C316120B4904921805521C0232DA126E2A9C5323976ABC73B5AB892E59B01A194B6446C1B73217FBBA855AC887AFA58A8F15A768EF968D775267E050150C7A8237C1024F9421C210D97907B2A144736E3B58E01C48947B1C62655E380256491CEBE400F52493D9033A29D6C9AE80B33E8C38584B30A31A37B15E85F5E82B73157408A5399A957190CBA905F1713C9ACA53AA32923CACB8269436A56BC02932189C7139D8463D0DC540621875E9A7DFEF020E7E83696C7612BC2A7DE7148D7075C31F257766301FA5A06E00582DCE15C6FB3195AF43078D79B110B5DC0789BE3A32132737FEB247DF8D2216F272C3D5BA700C52ED7E3A2795CCFE3072CD1D1B533939AC58A065A8A9FE85441ED291D43869E25307737A5155A095C5056A204326F944A9FC8F7035C931A61033CC2DB6ECEC08AAE0045A6542080C1A7BBD699902A2ECBE3A1F9AA95FC6222C6C6AB7BF96EDB3450E029B0CE104DBBFA0A49B8044EE1BB63B33BCFAA8A6A450194CC577D490A549B6C42D6816F444AAE8B8A4F62AFFD17664E957E2BA245A864BAB8D28E82CAB9FAC3BCD707AAC19A5EE58A3925DC7059BA1B9E7A798EC987E1924342C54E5D935A6699B6D9AA78E4738B0CEC6C57D8228C86881A14A3B57065BBE5653BD92B5BD5A9888B1B1E9B017ECA1A788CBC3A283A9F7B00D3F55B138CA26C33CD2CA3BA632A0735596162AA6C9D10968F53305D35CEC4395CA0489FF631A3EF661264A22ACB535DCC1313CD6917BFE3B5B8FC3B8016CA0DFB151623C92F95701DCC4140459B52EB796FDA60FB429651052D2C16B550FA035CC1374C87A439077713769C728B766BC75A609B70BBC14AF84A3C70519C3211ACAD58BF7C14C15F1AA86FCC1DF55580A2F9BBBC31B6B0EAAB379481CE9966F7FA6487C611BA5B3E8F8307FA35CD5248C8AB351B63ABC4BA005871A97751F01E5143302C757A65E411AF7B26F22076C7A1CF7E2B0055E80D7116CA2B3056BF8754BCFA9095D0CE99715CC4512F10125C5A500DABB7C11F5B0408377900621BE851B7A3602576650B84191749F30AC635A9E2212400769DE8E1915F26BA198AF8E53DACB598711738DA8C583A388E027A597CA0C2CBBF4FBF28DE8C479D4473C339D96B89C34A4E5FCBCF7728BDFB43B945D6BF055CB7B375E3271ED131F1BA31F83FEF533A239878A71074578B891265D1",
|
|
},
|
|
{
|
|
27,
|
|
"6DBB99AE6889AF01DA387D7D99BD4E91BACB11A6051B14AECD4C96F30CD9F9D9360557CADDFCF5FEE7C0DE6A363F095757588C35A3FD11C58677AB5E8797C2B8",
|
|
"BC02284C2B36002A8E002311D6FA3ED17088D6157E76867ED2110B7E50A9F0380893253026D833BE84A75E745CB9291F4E513EB41C68053575FE27893159C353DA6FB2C87757476A269331BB52268F39362DE69968F410C8167FB7195B6DBC3280B9AA5E28CF60071D2DD54323897701591931B6CE4CA0B087EA160A5A067C53665EDA6019E243A86883344041E3639126A2016F4321E3F39507E55F97BA0EF5F447E707BDF62A7609922DBDFC283ADB3CB7B10A083746BDC3B077BC1CEE06CE666B027BCB6E743B974D495D2D0183ECA61369EA52DD4BCDC1A54A8A08B8286A984143559554CAB503CCA2095D5AE54782B2586A778D4D3B6631114D7F543F467076B0CA9157729871DB0BF80065B9824835143B556419AACB9D39BA836E07274D1920682592046C83A37B8795603410B360C1E6B8FAACA706F8C613F97A1A82AB0F28A6239866D834BE02680B542A84ED50B4E98586231657C97A2B3121433914A17C20928E6734B45A8622CCCE69C71D367923447264CC72C26FC4986C26882557B342229AFCF7A8A8B716FEDB2FD2060708F99B6A826CF69551D0A90B4E7B9EC96C0B01F02481804124EA56604585F2B6284C205BDB795906A5C53508BA0627611DA8656600CA36908287A00FB8228B26863570977FF958B315A867488CB142B51377199BBDC2403B3679E34CC476C8929059503CB26838958934AACD0D4B67F69807B70855538C25E246569AD400E4F276CEC425D1229A8485AC5AF650C35A2F1730876FF943A4F6AAF0918EF5B543717298D6AC2D0F08C431D5876D669E2A64A0C6658947FB682B476E2CA04DAA743188200C6F79BF9AD23D78364625CA84D73C70258183AF2CAEB483B2C1F5B24A59B57911149FFC7442B8540561433014582ED6A361210E69575555497498508B86522DF2AB3FCCF64B19A9B8C84B32B8F681F51B97965294CF400CD08643FE9551117940D12338B7E9AB47343036AAC3DA4001428629AE8C362B1977259483B4156E5EC510436158664831BABC05807883B4832D2819305AC8CAA1177115A914C789C864574974F22058F2AAA36A0A31F465B4C52F34C70C28E47D35A1255FD31511A419EA9450A3A2ABB6AB68A544CA3E58CD398129F3A275305AA76AB42643725D3AC97E20690750DA9D340739C8D00A7B710BDE654732AA7C95D3304D7445D5E16C1AE64F99EC98B886AA10B3324F61105718BE0CC25B3A4A3A41C1653C0A255001BD51724BC843A1C5DA4A1350C0A40AC5258B17D725652E6CB4B5606D3CE877FD010ACF776D8A5145ACA06EED684082368C48BBB0284B8F502569E3342AE08619649B700C343E74243DE0A18803DAA6A6D2CBFBDACBACE53A4A5C10F7E7BCD6294B388C982FD794F3377EA9414C4DE70643A82A2F7A7A1B145AF0B1394A4B9399083D0EA8A35AC2BBC5D45D3B06AEAE511DE342AF6674CFA962A1E126BEC7F1252F892CD565596B3099BF60B332D58929C7B1ABB9CCC6D315D36930CAB08527F2776F76992AB977F615CBF8C1773DF0941DA095920806D36AA0F0884256807FF10726C12128FC337B299206050626A18116FE29215DF3817F1BC9EDDBBE2CA26ECCE15A325A9E566345F32A64D868AEBE124F044B0610E9C45A440D855C8F5AAED9A5E09369935779F1B56B9E",
|
|
"54DB18751A289F68B462D90388629B33088C2AD32A834380B9E7AAE7DB510DC26747A7C958ABACC04944C0715195420DCB58BB0EB30D9C933DF4994BF242B2FB2C723AEB926A7B3700A01F0A94A50DB845D234B64D790014CB912D887FEE572558EABB46E1C11F41BBD2615BA8F75F8D3CA6611991025A3393F5AA186B809C5BC04CC59A36057A0F91CC77825025C30F9229BACF75013A586C31A124187671F15C6AEAA9A802A065223850F683638D759D2DD6C14F9C7262E9CEBFD9585284528B686400358CEB3198238AA8F8469886228D59DAAC5F9AB6CD753F3C27BB61F06D4F66C9B64BAD6BE1B461F4940802991BF07A8E9144CFD9A854469163E62FD76528CDF9CDAF559A627040CEA414208744AC8754FD8B13060A7E314B15935B5965558B85585F3AD9C2D59B1137B8B191FC5506C23568F6868586C41C22BA0712BAA24757E4E5BAA4758DA57B6C925766149B768ECACBE7391F52773CC3F89C7929AEECDCA343077584458D3A57AE43304112CB903D7A762B23C46DDC2D26394E4F2B5FA1A2416B493F44D36278009D87303BA6AB340483A5E8962C03D486E5B77EC352ABF1B3C758424165C9C696F496202A71E36105C381B4B8AB924C9AB69A01639412152FDC59B28A612B66704CC64DAB003542C541008D77EB86A7B8F1201DD77BBCDCCB37100DD7343BFD87679EF4B9C62023C186AAC7D3C235CA642B594D806B65872ABA86603D5BAC3D71C5329A89A3AE7591D8354DB5B4C354F6B0AE603BE5373E12146F25493E73A7BAE75C952EC412FEF18DF2E77A210695EC7969FE564F204C9496497F1F0968ADBA11613749EFC524BEB3519295C4A05570DE6344D9632F8FF74482A612F5E7C0463B4D6895A44E964C87B930E57B7033A253980009A6712C382CA66487902341207E2331EBC6C904E6AA53A57724633626124574E4144609CF9D5B6727877FE6C53526EC6742D889CD8B045B22C4DED3637228BF3FBC1216C750C449BA5EB0645FD8A7B9F35E45DCBC4AF4C960C522DB339E16A7881F9A551894CC19565B9F329719B9A6CD81838EF2A8ED2308148601092A20C712C3B393896E47712FA42C2B197514821DB28524AAEA7DE87229BF62401F12B99C38C8C039A7D212A5E404866D7A8288A9B1BE63A0A6C980FF39C3BB2C6DAC7464E05B657AF585C6F0620E63A640146D2E9C3C12D05328F343BB409C7CCAAEE0000C7C8921C31C2DBBC3B374A51A1B135FCD2740081740B06C413A41A519F1CE18916DA0519D132943FDD392D5B855441126EB238AEC989CC2D663B9F575D790407A5265471CC32BC6993BCBBD063C4DF69C8ECAC96B8539BA9A3BC532955825EB7F3DEB4351385EF6C53AB81CAA7A92AD1FC839C7DB1065FB5F53B17DC5C0137ED1BA6D9BCC5D037D1B96909F98CB3F74B5F4CA1AA593C50E39A55D363641453F2A7A1481D4BE66FBA27DE5088783466D0CCC82A8625C91814D966281B977276715886313A83BCFD00659A295C62AC970A904C31F118E35A900E3CC711F9C8E5D73A970E13F574A3030188B2EF9203EE6A92FF7096E97998470B77446B293AACC15432FE0F207659844C9B29C87C751D4080656B2951116317B194CB686AABC02284C2B36002A8E002311D6FA3ED17088D6157E76867ED2110B7E50A9F0380893253026D833BE84A75E745CB9291F4E513EB41C68053575FE27893159C353DA6FB2C87757476A269331BB52268F39362DE69968F410C8167FB7195B6DBC3280B9AA5E28CF60071D2DD54323897701591931B6CE4CA0B087EA160A5A067C53665EDA6019E243A86883344041E3639126A2016F4321E3F39507E55F97BA0EF5F447E707BDF62A7609922DBDFC283ADB3CB7B10A083746BDC3B077BC1CEE06CE666B027BCB6E743B974D495D2D0183ECA61369EA52DD4BCDC1A54A8A08B8286A984143559554CAB503CCA2095D5AE54782B2586A778D4D3B6631114D7F543F467076B0CA9157729871DB0BF80065B9824835143B556419AACB9D39BA836E07274D1920682592046C83A37B8795603410B360C1E6B8FAACA706F8C613F97A1A82AB0F28A6239866D834BE02680B542A84ED50B4E98586231657C97A2B3121433914A17C20928E6734B45A8622CCCE69C71D367923447264CC72C26FC4986C26882557B342229AFCF7A8A8B716FEDB2FD2060708F99B6A826CF69551D0A90B4E7B9EC96C0B01F02481804124EA56604585F2B6284C205BDB795906A5C53508BA0627611DA8656600CA36908287A00FB8228B26863570977FF958B315A867488CB142B51377199BBDC2403B3679E34CC476C8929059503CB26838958934AACD0D4B67F69807B70855538C25E246569AD400E4F276CEC425D1229A8485AC5AF650C35A2F1730876FF943A4F6AAF0918EF5B543717298D6AC2D0F08C431D5876D669E2A64A0C6658947FB682B476E2CA04DAA743188200C6F79BF9AD23D78364625CA84D73C70258183AF2CAEB483B2C1F5B24A59B57911149FFC7442B8540561433014582ED6A361210E69575555497498508B86522DF2AB3FCCF64B19A9B8C84B32B8F681F51B97965294CF400CD08643FE9551117940D12338B7E9AB47343036AAC3DA4001428629AE8C362B1977259483B4156E5EC510436158664831BABC05807883B4832D2819305AC8CAA1177115A914C789C864574974F22058F2AAA36A0A31F465B4C52F34C70C28E47D35A1255FD31511A419EA9450A3A2ABB6AB68A544CA3E58CD398129F3A275305AA76AB42643725D3AC97E20690750DA9D340739C8D00A7B710BDE654732AA7C95D3304D7445D5E16C1AE64F99EC98B886AA10B3324F61105718BE0CC25B3A4A3A41C1653C0A255001BD51724BC843A1C5DA4A1350C0A40AC5258B17D725652E6CB4B5606D3CE877FD010ACF776D8A5145ACA06EED684082368C48BBB0284B8F502569E3342AE08619649B700C343E74243DE0A18803DAA6A6D2CBFBDACBACE53A4A5C10F7E7BCD6294B388C982FD794F3377EA9414C4DE70643A82A2F7A7A1B145AF0B1394A4B9399083D0EA8A35AC2BBC5D45D3B06AEAE511DE342AF6674CFA962A1E126BEC7F1252F892CD565596B3099BF60B332D58929C7B1ABB9CCC6D315D36930CAB08527F2776F76992AB977F615CBF8C1773DF0941DA095920806D36AA0F0884256807FF10726C12128FC337B299206050626A18116FE29215DF3817F1BC9EDDBBE2CA26ECCE15A325A9E566345F32A64D868AEBE124F044B0610E9C45A440D855C8F5AAED9A5E09369935779F1B56B9E9C9032984AE72B7D5E0732A29EC29D8BBC4252A31454185710D280C223A47899360557CADDFCF5FEE7C0DE6A363F095757588C35A3FD11C58677AB5E8797C2B8",
|
|
},
|
|
{
|
|
28,
|
|
"7725321C56F925868FF834F5D1EE90A70332AA9283434E122C60A8D474AC6C0F00F6EEC72778E02ACD04BB056113C571982E45018BEAC566EC59953724F38A4B",
|
|
"EAD840B81B03BFE75805595DCF0808B83738AF14C758920F80E209D68B9192C5CF0DA397A0BC9A702295B8AC3826DA6F427C9281D937CBE4686F70713B39021CDCB96D71405D4CAFE4068CCDB64643E7540E571DAC0019D3F1235CA8161AE68592223E674C07AC76286C95BB17E78110317840064485D7B16DDB830C807BEC506CDA14C957DAB843781B977A439C612F52A944AB2B6E6A1C221B886097EC4259B0661E550B58376A56F7A62ACCB7A8B94CA02B1797B62497B88B0035623F26086D14122CBC9EB7486B0BC2A8BE25985B2019906977CE971D928347DA5756EBB65835764EEB6B52BA123E61BBC5123645346168597C1194C80ABB26C74EF6500AC6B180C190C28C9041AAACF5371C41373BEDC686BB73B583F46217F31F01B66DCCBC9BD6627DC03250B7E52C690261BE97B42FCCC63EB443952143F5734EF4D336C5311D0B2820A1AA715CBC1A106117BC7159FDF32FDA33C82653727466BB14ECB98FF06E2808CDEC540A2276B34FD633349367576AB50360C88992A675128400DCB07999A2B3978547735BF8A202EEFACE1960AA6649CC08582E92DC928F30BC0E3CA45EF8159F928842CA75A01A013B1A5CD55554274A6D2BC39A4796A129017E7A91A79CE22665940F5F711660ECC5101C230BF927146486AB6546C4E4BB3D8C7D877769B3BA7FE0162397DA4583D30B343862205CAA6D0CBE57000D6F9384D73C6ECB3AB773599B73FAA2F9258EF467BD6266273D1214C103399019751B240C128021F1E698110559B2C56FE32223CDD90D04B766CA425AF66458D8E66BB7029D147CA11E778B5323216C3081D0A6596A7AB5FE886E9C9ACEBA705A3B751F19165916C5855AE29D34D10FBCD68A60C38023243CB1C22D30261292E01D31300569777B099C77F5351FF77C2BA5C09F584CBB6CCB84F11AA264C310FDF253B271CD6450B85F040FF8262F2113141BA3B45E1550D6084BC84A50202B19D23A92CAB5B8C6838F49D99AADD6592B1842EA251F71F3A6707C55C3EC0A3A0314C9A4530F9AC4FBF83B9B73510229B136D5989990B71954BB3889CE54944E01039AC7A9B4EBEC47805A9C51298A7F867BEBDACA71D7AE2012AE2B855CD7C97BA0E14EDE7B8508935D3B0192743B3AE7D3628166AC251A012C59034CD30B8258A159432A62DA317E8A993DC07C8DB73E5B3478D208875D6AC9B64CB36D0B1979AB9D553843BF054CA687B316414E846CB5E305B68C00A8B1C903C7C0CCD03970317C6A1F9A8646B5CABF5112BE01B868402620883E46DAA256228A8092648BA61FF57805E0D03A06C46AD1411CA8E3A95FA73904D3246AF0C4AADA2C582906B54180E9569C86A76B5F88091EB9165F3528B92A8C0549B097FC2A3398A226B224EEEBBE3B3A96066A2C0F884A60FAAAF9E97122C89582395B192172F661B775E09C6662CCB64169BEEC4924E96AB257BA514617161B8F7B316CE0512090DC627D59C4F3A39EAC068554C075E29628383477E5C493150B04D1249D61E6A09E2B323BE503A6512BB119A262B8ADDFB43612654DDF685981063E14DB0DC025520BF20FA3BBCF81D779A98300A4E0A6B6516DA6442968C7BADC129B3D458A1ED8ADA5301E5C3FAF68F13D6DBFA29987FB14563E8C6BEE4EEC9B8AB5F504A8BC1A724E6005",
|
|
"C397104AE63A279795F3243F6EAC3A74AA0B414C822A668664826003F7CEDC2667819773E4C3AF895502D22C3BC95A9887F84DE421197861964FC88E3299B16226250F701A1C1C97357884F2A20E8FBC08E84C3ED233B6B261BBD3973ABD6B1F5172C59AEC4DE0BB676417528B43A2688A831C0889AA96113640ABEF499B1AB7B67B355DA2B9A26E0CCAB9848CFDDAAB994B8E0FBB090F5C332E6CAB63D8ACD1D0B80DC68B755A2274FBC524346A93DCB5F27956CDC73B429B71410C7C75E4683440A1179851C77220354C998C47CC29EC4A87A2A44B3C69EBBBB572534B3C1B14F90041E6ECC4400041EB729E9487064E44CDFF33A352904421D8A2BBC34D1275A475C61160440DA4E2785F140B327BA35F247ED1D66EC8A05A44E4298DC72764877BD369B78A287CC7DC6B58132C43841E9B6924AAC38F6D4BC4D4FB2E32FB5E54E0963C54C8058522AF21B7FE435B5EE3801A0BBB21088DEF77B20A466A5EB8C8D3D71ABA4705C0D6C23476BBF9918B6271CC041217B41A0E0EE885EA0B5334F64A5BC0199F73675C0593A0369429818E0227B8A4556EF83AC492D8A572F126004C1E2CBABEF335312F3256A3E6B42B4150FFA21E183588664B465C5CBF14D9A8C58CB33D4955C80939351C1D8A959BBFB210730906C546C60D747AECF15DDF571769524553BCCFE6CA3422830CEBD61C5A3C541E20B8AB9C44061B4BE888A01F429C03128CCF2B2EE53555D42A3F77E04CEEE46B0BDB3A84B4CD3BBBCA9DACA71426666934095A862E94710B862C31985517A49A9C1B175E9C4A63B2C055B2548BCCFB14329B35EBA1CB302972073480E913AA1BA9399F63610220133E6ABD02E47740A56CCF16B620308261692CA0A56FD6554A59C8ABBCB26156F69034C30C2D1B89730627A8036818458D4DA70E4A954572F095BB64ACF346473481A67DAB2023539C3111B205E414A24483632C4C548B6BA9375D758C597C322DFD89288E4B676034B36CB695C571960232B94396B9E08924FDD882429A143E451855F65B3EA661B573878C083EEB20BD7F5A142E386DC8A45AFD000072B8544D74B7FA472FE03C0F36A310FC54C354B0A22F62145C5BAF1BAB5DEEC678AAB4B89F4A49012088F1307FE02421B7B2B53335871984678295C8423BA60F834BAA9642811902B91AA23344B85628C242F183AFCC27F0E18A9C683C9C7484BE82CF6E17C03DD5A558326C6D4974B28261DF45639FB15B18C9BB3F8B2CA0951C6DD2C3C6853DA8402CF1D625CE4C7D1EDC8BE31CC2C761B540F5121F739A4256A47E396C81419020C324DCB29AB577C7995850748A41D0176E7513A8FA9252F9730E44D2220A8BA3641CA4C9B5A2D193415288730D9434BD9AAD79D27B98F16217D52241D0606CF5424B27318346B954E805E0507C87A741F4FB1FDCE454DB18B845E90732724858AB02AF10B7150C3AA11C1FE4C6B836A0065FB724C1D77D1DE0BB2867B26925882B915D4928159CF421A59A4243E990C3C17E1AD792141CB3D2DBCEEA7648FB91A60D8A62C65A9B2C765F2C1582F10513485093519AAD55D2B08A18C6F29B38768859F5150CFA4537DA470B38645A4F8126BD696A6BF9715634B70F3B1DEAD840B81B03BFE75805595DCF0808B83738AF14C758920F80E209D68B9192C5CF0DA397A0BC9A702295B8AC3826DA6F427C9281D937CBE4686F70713B39021CDCB96D71405D4CAFE4068CCDB64643E7540E571DAC0019D3F1235CA8161AE68592223E674C07AC76286C95BB17E78110317840064485D7B16DDB830C807BEC506CDA14C957DAB843781B977A439C612F52A944AB2B6E6A1C221B886097EC4259B0661E550B58376A56F7A62ACCB7A8B94CA02B1797B62497B88B0035623F26086D14122CBC9EB7486B0BC2A8BE25985B2019906977CE971D928347DA5756EBB65835764EEB6B52BA123E61BBC5123645346168597C1194C80ABB26C74EF6500AC6B180C190C28C9041AAACF5371C41373BEDC686BB73B583F46217F31F01B66DCCBC9BD6627DC03250B7E52C690261BE97B42FCCC63EB443952143F5734EF4D336C5311D0B2820A1AA715CBC1A106117BC7159FDF32FDA33C82653727466BB14ECB98FF06E2808CDEC540A2276B34FD633349367576AB50360C88992A675128400DCB07999A2B3978547735BF8A202EEFACE1960AA6649CC08582E92DC928F30BC0E3CA45EF8159F928842CA75A01A013B1A5CD55554274A6D2BC39A4796A129017E7A91A79CE22665940F5F711660ECC5101C230BF927146486AB6546C4E4BB3D8C7D877769B3BA7FE0162397DA4583D30B343862205CAA6D0CBE57000D6F9384D73C6ECB3AB773599B73FAA2F9258EF467BD6266273D1214C103399019751B240C128021F1E698110559B2C56FE32223CDD90D04B766CA425AF66458D8E66BB7029D147CA11E778B5323216C3081D0A6596A7AB5FE886E9C9ACEBA705A3B751F19165916C5855AE29D34D10FBCD68A60C38023243CB1C22D30261292E01D31300569777B099C77F5351FF77C2BA5C09F584CBB6CCB84F11AA264C310FDF253B271CD6450B85F040FF8262F2113141BA3B45E1550D6084BC84A50202B19D23A92CAB5B8C6838F49D99AADD6592B1842EA251F71F3A6707C55C3EC0A3A0314C9A4530F9AC4FBF83B9B73510229B136D5989990B71954BB3889CE54944E01039AC7A9B4EBEC47805A9C51298A7F867BEBDACA71D7AE2012AE2B855CD7C97BA0E14EDE7B8508935D3B0192743B3AE7D3628166AC251A012C59034CD30B8258A159432A62DA317E8A993DC07C8DB73E5B3478D208875D6AC9B64CB36D0B1979AB9D553843BF054CA687B316414E846CB5E305B68C00A8B1C903C7C0CCD03970317C6A1F9A8646B5CABF5112BE01B868402620883E46DAA256228A8092648BA61FF57805E0D03A06C46AD1411CA8E3A95FA73904D3246AF0C4AADA2C582906B54180E9569C86A76B5F88091EB9165F3528B92A8C0549B097FC2A3398A226B224EEEBBE3B3A96066A2C0F884A60FAAAF9E97122C89582395B192172F661B775E09C6662CCB64169BEEC4924E96AB257BA514617161B8F7B316CE0512090DC627D59C4F3A39EAC068554C075E29628383477E5C493150B04D1249D61E6A09E2B323BE503A6512BB119A262B8ADDFB43612654DDF685981063E14DB0DC025520BF20FA3BBCF81D779A98300A4E0A6B6516DA6442968C7BADC129B3D458A1ED8ADA5301E5C3FAF68F13D6DBFA29987FB14563E8C6BEE4EEC9B8AB5F504A8BC1A724E600585E42177479AC364C343E26B4BDD480D14F1A7487FF4C64E37850C5D1B4EFC9600F6EEC72778E02ACD04BB056113C571982E45018BEAC566EC59953724F38A4B",
|
|
},
|
|
}
|
|
|
|
func TestKeyGen768ACVP(t *testing.T) {
|
|
for i, tc := range kenGen768InternalProjectionCases {
|
|
seed, _ := hex.DecodeString(tc.seed)
|
|
ek, _ := hex.DecodeString(tc.ek)
|
|
dk, _ := hex.DecodeString(tc.dk)
|
|
|
|
dk1, err := NewDecapsulationKeyFromSeed768(seed)
|
|
if err != nil {
|
|
t.Fatalf("case %d: NewDecapsulationKeyFromSeed768: %v", i, err)
|
|
}
|
|
if !bytes.Equal(dk1.Bytes(), dk) {
|
|
t.Fatalf("case %d: decapsulation key mismatch", i)
|
|
}
|
|
ek1, err := NewEncapsulationKey768(ek)
|
|
if err != nil {
|
|
t.Fatalf("case %d: NewEncapsulationKey768: %v", i, err)
|
|
}
|
|
if !bytes.Equal(ek1.Bytes(), ek) {
|
|
t.Fatalf("case %d: encapsulation key mismatch", i)
|
|
}
|
|
|
|
dk2, err := NewDecapsulationKey768(dk)
|
|
if err != nil {
|
|
t.Fatalf("case %d: NewDecapsulationKey768: %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)
|
|
}
|
|
}
|
|
}
|
|
|
|
// mockRand implements io.Reader and returns the given bytes or error.
|
|
type mockRand struct {
|
|
data []byte
|
|
err error
|
|
}
|
|
|
|
func (m *mockRand) Read(p []byte) (int, error) {
|
|
if m.err != nil {
|
|
return 0, m.err
|
|
}
|
|
n := copy(p, m.data)
|
|
m.data = m.data[n:]
|
|
if n < len(p) {
|
|
return n, io.EOF
|
|
}
|
|
return n, nil
|
|
}
|
|
|
|
func TestGenerateKey768_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 := GenerateKey768(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 TestGenerateKey768_ErrorOnD(t *testing.T) {
|
|
// Simulate error when reading d
|
|
r := &mockRand{err: errors.New("fail on d")}
|
|
_, err := GenerateKey768(r)
|
|
if err == nil || err.Error() != "fail on d" {
|
|
t.Fatalf("expected error 'fail on d', got: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestGenerateKey768_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 := GenerateKey768(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 TestNewDecapsulationKey768_InvalidLength(t *testing.T) {
|
|
// Too short
|
|
short := make([]byte, DecapsulationKeySize768-1)
|
|
_, err := NewDecapsulationKey768(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, DecapsulationKeySize768+1)
|
|
_, err = NewDecapsulationKey768(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 encap768InternalProjectionCases = []struct {
|
|
tcId int
|
|
ek string
|
|
dk string
|
|
c string
|
|
k string
|
|
m string
|
|
}{
|
|
{
|
|
26,
|
|
"F255CE47334283B8622BE7CE76D7354E3C4FE3F6C44F6BB25C9864EE0BAEB5765950D88F438263CE8B5A7A4C0FC4C95F10C477A7521F9BB458B8AA55D2E43BDC86B72F0930EE428B4C5A9C7116310F2AA5CB03AC1603C811959EA9012D69CBCE40B37CD890999CC74FF375C66F048B240363343CB795998856D560F4C712938C79466864D20B0BE95419C9EA6A8E7203A1986D10B606691242CEF630941B116458A41C83B7DC5B06A97C840B116F2CE9CFA87A1C1AA8C4FAC137DE8498E8749B3638404271539B247183A32E7E4413B6400E0F295788084EEA93B4A7653341005672D908C62B64B11B48414B505F3036EE56CC4DA88FEF27B2DA974C9DD38C150090B5B8A29BD7C5975A8A959549044B4DAED52A7FA68335308F40C9B768C5821F78CF068A694978964F597408D09759A19578624C64DC18EAB23082E599EC488DFE016E4BA58977E15B715C612496310219B9B4775CB51C5DF03B934F7473AA58A57C602CF17C5993D30F52D753AC56BACA1A994742BC50435E179A262B3C8EECE1513955C593E7508B945F6E95CC4268CBD45B2504082FB8B23D8906946A74AC2FB676BDBC39DF76B9B8450F49D283C622784565B76B96084DFC099EC2279E5BC13492561B4439E32324B0050C5FE6451974BF0D72750AC58BAC046D218AC397F65532ACC7800246ED1C8094FC807306BF88E2816AD13B06F2898CA87C486A124B618156A090B1058722ABAE389AB5612CA2C2766DDEF98202A6AB1097B392404EA151788528B07544325F851B4DEAA2495138F929BBB4026042B0A8CD3CB0A7D061927A717D4877E0D9A409D6B125361C99090AFDF922A776ACADA2B6A84522134B089D4B428020C83061A87816C6A59263E636B5B2ECBCA6A64E29600948D5B0B45600B8D473A65B450B766D0251B6915898BC3C1C2C53B9679121F1F06CFB9604DE0051FF4B093939C907AB18C2988646A90481BB99F4153611C138BE34BE163B3ABAC44354A774E9CB54FB29903367C78D275467499D22E83A11CA9B8445BE9DF3CB612069222A8715A495D115B4BC2457AB731AE7EC1BD8EC9722CA980958180AC2BD67898F4A72A675106D66981B2E923C0BA40E3234655D00B25D6462591C9C9C7A53491489D57A77B2510D08B95B9C61C1784BA752F4A73023742ECB985DFB37808B16D6C283CD4A06C5A3AC401855E1DABE63F9668BF7A661946B18230A1A5A7C19DA66ED08151E77A624F579D4E44ABE023A1CD33459FCC3F1A6589426634D062D0A75A387A0B7B8D802A66B2106E01264500915B97307C85ECF331BCAC35E4AA243C837876D858AFA8B510C342708B38093B2CD35D1BA68DA0544794D172C6CA8850A7F847B56998D8E0B0A17144FB6F443E3679767CA91B80A6CAA8BB0E22BBAC01C0EAE1604B8A243911672B3748C7F18C531E3783D522039130057198D6F0989E99641AB718DA123710BDB67B3B75EC66BA9CF459FE06C7C4F7959DD7281FF155940B09FB14AA55CD40B963CA3312C05B36A5207C989428C16E5D288ADB18A66F74617CA39DB8AA612D706DFEC884C457AECD1AAB598195B4AC971529FB7A883492235E62112064A0F6FF5BF4F1619A0D03B96B5112009966B2DF7C2F300B6F295DF7FA2C453E1949DF6405309DF7575C7656C245EDCA9F6",
|
|
"B8E17544C0493C200F8B15C8973A25BE28AD58442B916C8074439E2D12CB2A4623065658C80017F8475419C9A7FADC988888ADE32B540AA77539C49F10B4A0FFE6A21271192A3908E0583DC8788301C31777D116B5759B5F189CFABA11CBD976067810BF939F91579440FA86FAC692D125811329701381B97175317ADC60BBC7585FC07F65A92B67978684C225B960439C147C06D11D0423896257BF8FC89E3FE8021AC3A6C81192B3F96DA3B250024541D92759BBF77AE36A1C9B1B1AB01B0B7F2B9917A579FC265D05D4360AC547B8D2AC68998181C1A5E3C4284B51B16E3BA69989B431C86BFC91C62DD804F2678EE6E71FD3CA84E9636CE728C0EC80B752807F09EB732B8C9CC2A15B84A303BE1C0087391C4D36A55F36BCB8347365E9CE33980380FB628FF0BC1A6A0FC19C89AAC71304473EBABA772EAA95EE37A28E6665D6345647F72EEAF429113096A8322B3F4BA18FE73C056A7DBE746512A022AFBC59B39422AED579A8C0C738F5BE2D22BBD467CF34CA75768200984739EBE97F31A87F620A3EE13B378739CB0C71AD2F44B20EAAA1A4C61B9CE88F1F84312EB50B34080D83074F16624A7AB7CA236787F7112A455A9DC0BCB8D6FC4D3E52AB9A2373A5338BACE0C528B62A4BEABC2562199BBC1BF98839ED771BEAA68262E8CC7AC51C9DE4615FD34DBEC61D653CA374C4524308C7987B7F772B16FEE02557F32ABB8C721992BEAD8A5DBB838183791B9AC61F507C1DC7C51DD505AC61622B0CB36F7F987B5AD75ED1922C2BC187EEA661DD12794DF5C460D7477669213E733E4D9553FE9850F1A9388CC582F137433D9CA52F074B5320C89B763C97F64D4B9B8F7772CA6D70ADB7D818FA47367B6A91A3418777FC0B67C30FCF4B9D550792E8DC5E4FA8304F317698E7A303B83195D6A49BA51B20FC8F1A549094D62ABF79AE05742686E35945A0AAF7881760B55279341D12599FDEF65B8B512690DC84B204507822754DEC900F30085BC872E258595EF525D141A71AE54F8AD19AFC893B1844761156A04646BCC57BC203D05DCBE015DBA9993A381525204AA9797F94406D9BA1AC96B600405459AD578A414542A598BF81698EA22BB88C6656B2DB7915298A083CBE7F309A5A517CBEDBB8FF9A53CFA4C5BDA3A9843807C0604C25F29C2A135A1BC015467206E2D4AE0B6422373C251E0C39E3276C7782B5CA1969CBD731AF6CCC058324C7830FF97946A89C5D75C8629D745C8BC8A0549A7993088CA0484139E012EACA09158B249488A2B8A07A57253D4AD30BA8A28B7BD3828214942D2B90DBEBC017688C366C2ED8189969334F81452EBD08A3A24A09813A2C98F3C9C2E23AAC4785ACE990E66866C4846892E9558D1121A993BDDBE0540D7791F7F0AE6A994E1C65014DA6C0EB7C4882BAC510B9637A637EF8FC1A42D6150FB437B681601F859FFAF9C0CB89A514098C91E53E13F1BEE032C819060B82692D4CFC60F27C8D746C3C879A1B1749C35AAA695EDA372B7A41272C9598D33064726867041B09C684F55A3118E64EBDC028ABB8C8D6CA6ACE566D2B2C7C15BA3EE301B867C84A7AB75C3C1434C3E551206911F5FA7A870C513A289768867EF120C308FB2DF255CE47334283B8622BE7CE76D7354E3C4FE3F6C44F6BB25C9864EE0BAEB5765950D88F438263CE8B5A7A4C0FC4C95F10C477A7521F9BB458B8AA55D2E43BDC86B72F0930EE428B4C5A9C7116310F2AA5CB03AC1603C811959EA9012D69CBCE40B37CD890999CC74FF375C66F048B240363343CB795998856D560F4C712938C79466864D20B0BE95419C9EA6A8E7203A1986D10B606691242CEF630941B116458A41C83B7DC5B06A97C840B116F2CE9CFA87A1C1AA8C4FAC137DE8498E8749B3638404271539B247183A32E7E4413B6400E0F295788084EEA93B4A7653341005672D908C62B64B11B48414B505F3036EE56CC4DA88FEF27B2DA974C9DD38C150090B5B8A29BD7C5975A8A959549044B4DAED52A7FA68335308F40C9B768C5821F78CF068A694978964F597408D09759A19578624C64DC18EAB23082E599EC488DFE016E4BA58977E15B715C612496310219B9B4775CB51C5DF03B934F7473AA58A57C602CF17C5993D30F52D753AC56BACA1A994742BC50435E179A262B3C8EECE1513955C593E7508B945F6E95CC4268CBD45B2504082FB8B23D8906946A74AC2FB676BDBC39DF76B9B8450F49D283C622784565B76B96084DFC099EC2279E5BC13492561B4439E32324B0050C5FE6451974BF0D72750AC58BAC046D218AC397F65532ACC7800246ED1C8094FC807306BF88E2816AD13B06F2898CA87C486A124B618156A090B1058722ABAE389AB5612CA2C2766DDEF98202A6AB1097B392404EA151788528B07544325F851B4DEAA2495138F929BBB4026042B0A8CD3CB0A7D061927A717D4877E0D9A409D6B125361C99090AFDF922A776ACADA2B6A84522134B089D4B428020C83061A87816C6A59263E636B5B2ECBCA6A64E29600948D5B0B45600B8D473A65B450B766D0251B6915898BC3C1C2C53B9679121F1F06CFB9604DE0051FF4B093939C907AB18C2988646A90481BB99F4153611C138BE34BE163B3ABAC44354A774E9CB54FB29903367C78D275467499D22E83A11CA9B8445BE9DF3CB612069222A8715A495D115B4BC2457AB731AE7EC1BD8EC9722CA980958180AC2BD67898F4A72A675106D66981B2E923C0BA40E3234655D00B25D6462591C9C9C7A53491489D57A77B2510D08B95B9C61C1784BA752F4A73023742ECB985DFB37808B16D6C283CD4A06C5A3AC401855E1DABE63F9668BF7A661946B18230A1A5A7C19DA66ED08151E77A624F579D4E44ABE023A1CD33459FCC3F1A6589426634D062D0A75A387A0B7B8D802A66B2106E01264500915B97307C85ECF331BCAC35E4AA243C837876D858AFA8B510C342708B38093B2CD35D1BA68DA0544794D172C6CA8850A7F847B56998D8E0B0A17144FB6F443E3679767CA91B80A6CAA8BB0E22BBAC01C0EAE1604B8A243911672B3748C7F18C531E3783D522039130057198D6F0989E99641AB718DA123710BDB67B3B75EC66BA9CF459FE06C7C4F7959DD7281FF155940B09FB14AA55CD40B963CA3312C05B36A5207C989428C16E5D288ADB18A66F74617CA39DB8AA612D706DFEC884C457AECD1AAB598195B4AC971529FB7A883492235E62112064A0F6FF5BF4F1619A0D03B96B5112009966B2DF7C2F300B6F295DF7FA2C453E1949DF6405309DF7575C7656C245EDCA9F6D63A7F9914381C8093835899CF0C93056F03C56A1B64382AB764A8DA2E4C50610624F2A4AF5E82AB4B0F15E6CAC2D552CAEF57F3B78AE4551260AC71B007279F",
|
|
"4EE24D9E0858B36DC755A9389F4FDBF438DB8FBFDDD2E2A41FBFE7313693E87B2BD86A2A5C95286840A2E477F4AAC12F28319D892C30FE9A120A09713369A17D5EC459C7E5DCD402F9049BF6FF0F7D07A7F18D4C1E3E0429BF6D501EEDD33E114423A5C4692738096101EC79233F20C58A6EA7E855C4E608DA7C9EE086EEAFE296F3214BD0B9264AE18069342AB493BBEE267401FEDAE19D5F9224A11D911505CB3200C65F17C91F88FBE25621402C939F071C48D6BC6ACD207C8C215E2FF23AB5FAD94F2CE61003C99DE15195B36ADE08864043CAEA49D4EA1D550978C49455B06AFB4BA4F0C178D30F953D47F0258370FE8E686802085FDCB25598DE439CEEA186F848AE2E4ACF526E03755D0A89A941A08C5610C96DFB3F47C693E7E899E1DD38DFD9126F3D05751234ABB82D2BBA4D347823B97293AE2B58FD3C71D2216797DA1CA453D600C5A9A6B36CA23B9450894A894A42C40B38871F1E9E84B40A04112CC9A4B6E7B8DE59CAE5D8389687DBB1EA078F3CC93DC5D0788A671530D9FFDE5F2CB6A558AB38E038D59ED1EF1FEE381AFB6DE0A77E1333FC5B0FE3EA2DCDB84FB33795449AC6DC322F4E5E09B2A462D3750BA426C04271903CFE9A3F02221B69E474F24B7DB608492C01AAC3F2FA472A2469B6A8A949A67C567D139D6F40B00DF1AAC1E6456FFAA646E0DEBD79907905F28076F78ECB3DD1A6493A40F3D1F8D89C71AD15D22162264D0AA73581AF7A77EEA43B856370182348034810E60A902604B724E09EA4638AAB039982A64EF02C9C21259A381BFD3BF298EFE4285CB538F79BE01CCEE1A4A903A80132942AC6BCD4425BD197EF014E7DBEFFDFDD5AAD00DA2A5E8DE4FFF1E8E97F23F3F4BE38970AC09CB99D252CF2736059CFDE177EA6B36EA329B9DC541C3DCE61FAC504908857184C936C1A1C4AC0C8DDE9A66B4F3AAADEAB2DBEB2F2E6422A49A6B9C223DF25A34720717253DA6DCFC0A825553A1D2884E01A97060886FC30A1AD50E52C46F6F9B87274AD6369FCE4FDF3FF6A5D62D4AC82CBCECE902E4DE4214B71A2CA547C536380DCA26F63F2BE71B01EAC68F42AD1399D390404AA5539A5995254836FE6CF59C490B13CAC01C69E50CDC0EBA1C2F9978F4223AA38DA33639ABE933B40F6E2751515EFAC9896465041D3922A4B043897083F7CC6DAF1FD87B970BB6D1D5E48B599FE6CD2AFBA5FCE17E4BD4B0217E879FAE34FC227EC132D6F7141A48D14DED57729164A1D2B0BEF89A16244EE114AB4E108648B7E80A7DD502B0DBD0C38AF1D85AF6966BFB8E54237000A3F18C48EFEB93ED62B41A9B341361D0D7AE75D63A3A34DCEE329996AB0630553F38BC0DA148419162A31D386745C818E2691411A7927E49822AAE9EA918BF49D6809290B57C1BA5EC212F135AC0B8EE945C0510CFED4DB5A84B617BA1525E996486728E1DB87B6E99CC9A7EC4399B063D3943FE4EB1933E90365A4916CA8D67D064DF7D5B8DFC51E337247CAC3CFFAEDC5523276CDCB82B130D8E1C3FB6D7D69",
|
|
"B2425299020BCF563B8EBE0512F0479941335A75A32B8D10BFF60E5548B64672",
|
|
"5BD922AF345AB90F297D0A82EA39527A648E4977AB56242E2AC0ED9A2CC66F10",
|
|
},
|
|
{
|
|
27,
|
|
"8E8107F8F9701A9B6B01F05D964539605B87CAD36A2797604D3983D0603F7522650312A8707B64F1F4CB12D8886321BF7EA1CC28F3982554A3FFC664B706C76C429785EAC08D8954517315A418A5181A2D882C51623C9E3623545BBA8511C8BC0993880391BCEFF86A1A0717D09079A1C33C8E9C97BB520F273684B2AAC1D4D18A70D490AD0A6627F0537460C095364A42FA08A21AA6D24255F6B2660B1B64839846F6E030814CC58B188FD1D142D4DC3EC5319773817287BB82EE5479E0A1A498E1671D615162D8C5B38068B61643832300FDA1B41EABA31C5B9854A07B62D8B2C591898D92BEE3CC01710810EEF3288FEB3AD9FB58F8D39F76A128EFC764FE269345EC76613AB0A41A746496445FA705AEA7094A4542A8E59F83B380E0BC663247765C3B685B33C01CE7806C80B037D22053E6B155D516CCF2C010F97575527AC7A5C3D1AA659063AF2D0B0D915A1B57C75C707A179DA035A9E1CA3977B91B8330930C4DB5BB2501308747C0A709C34142A3627BCC2952FCA704D749E3723231672187DC1CF61C087A2384FE727BE3AA7BB00240E2395B979B0DFB942D38F3825E72132395348F7C6CBBB800C3C36F8D4818D584C19B124AC9A728F7714760625B5FE877C855BE65B01BBCE106A24A2F7208696E73A22A27522566AADD8A73A050914D362932902B8EC8429E5C15CB427965A87F190625B6452C32896F5776318B15CE2F3060B296A1BB72A4C36B5CFCC97B9668713F85575280C1085B20D8B35D993A27DBECB97DB218B3C297B2E60C8384B05DF2C7234C750669864A5BBF76B9902F00A05BD74429E57C1B24C6BC28B6BE2C9EA5C46213D92C4E29828DC1B10DA786106106C7689014009B1B1C022093AB7CECB44D4998B0838BBF912C81269051655691135B5CD45F84D715F3C7B56DA3314D8783BD0213C0C33038116042D116DCA41226974483C6A4B8A2A319690FC0B1BEDCA3B02925A01C13472AB9A565778D44242D3B1776FDFC15C4F18969623E01A453AFBC6F2C264CFEAA8AD14B39F96B55EEDA5CB8C391A31773CBAA77E8481B5E26ABC8D531430B0931F36BAF28B96FD646AFB71195D58BFA1686A7247F9A69A5D20C0516694E760451199A25A55457BD17674B4CBFC5AA201ED0CCE77172951170342B3091181DC22B7CA70213D1A38B9D757E87961A4CA7BC18E22F0626850A794E3C2A5D5B5001B194486CC0CC880467FCF3B55B3492648980C961333E6C516EC4298A7112EFE459E1E92E821C74D5896CDF229A798529EB5048088A4D9BB105E54C006A5C15A46923909272AFA9B6D5661F7AF16D15A698D213C51D771AD0B14BA641C762A292EC5A0372D63501B5BECBF24731E283DC4246E3652A5544BFE99A71D05974CC2B9DDCB34C0AD9A057BA0DF05C56B8854E01655BAF21C9A5079983D322525049E0811103A101BB5163538C6D27A477B4F956F1967F445A2201D990D304755EEA5482813089A3C4911031FB49B380D13FA2C8A9BA7B439B3B5102B832DC65387FA41B4E7959BCB790ABC51BC30608555A80C4984AF0B80CBD1829FAB6C7BAF870D7B76D55672456FC3AAE7A4FA466CF64B43482E53DFFD1862F32BE3718CE4D21C57B894A3193C3DC8A03A34AA37806B6A35925C365EB01B4835F4AE98AC69080870E7CC1",
|
|
"70D81B5F999C92B7340CC167324C63876AC6F212803BEC7657661423D640BA4019D983C2E16803E72AA3D9A83E7EB79076A3A02C9263E55C052ECAC18AE7C97339CDA6BC1AB6261F533B25D831A4FDCB41CAC346F4B6666D6C2BEC0BB158448A374A84F0009550B39BAADA23E0C331A315505B28265719CEA80C8FC1803449346B7EE7A6D215BDA924AE81ABC7CD8666B521C5E76012B84754EF50738297AA0093A9CD4AA4391146B149BB9A90BBFFC1638CDAADCAE019B05A9017E82C9E39A0A8C2B72702AF10FC3C1222621D9B2AAF70302C1A603B704CE79992EB608A16373139D35782966ADBD71A1DD261D4D42CA8117F1AC66793A54C9263137A159C1320512FF19C5CCC855F8B2D6A106186A69B036878382B94D0510E34F01383126A5C3393D9015F36E4CD0CD1458F88744E03C7B3060BD5A3380296860C388769639F888A4FD1EB389F2214F90B68BAB87712493DB9980C92148281584DBD51094C99BE4DE54223F11D1C1AC6EC5139AE66344990CB22392440B556DD8901440545AF815C2DCA70078A6E320B4274E76C6B50073302AC67D348839037A1E1491A79517D6B902E532575475731FC2D3404552BAB025E037B5AB476E2E18B5CB0092B215D31998F9EA5361E9AA4A2CC5E99808BC0909BCD42485E725383824E31394C7BFAA8095C0D6D92973C30A1D4B8AE6BDB72AE28CA6FA132DE11C20ABB0BC6C311A1541BCE0C67F06B43F3607AE0447C6D59C2E2B0233AA037D74CA4BF8174D9EC833506A0F74A03766A4FB2A84957F7CAEDBA27AECA2FC347794CEAB2E482B61F8451F7888E0A94078BDB7D3A791452CA8AF76A86F6822D12A123799C0D02D7BC16D63DB5993A1CA88F29B9A33BD662790BBBADE71242319C75FA29891552FD0BB5E3636C254BB9913A678616CE72E6CB14F82D1449C65E3170EF29947F598A57C508847556940820BE751C538617546B9D25044214382F80A9768FB7A4519B34E3B1B417520B6FB60899E5086168B07246AADFA7C3D5505791BCBDFFB9B18DC3B86F3488D51A9D2BDC3326A0ADD86C2E4A7AABF67CB5FA77BC66482DC20106EB1B40FC3C6CEEE2B46347AC3373AA6490AF74957C75F18510D017F8CCBAEDC50E20F6A619436EEF562657BA42944A50D7BC446EEB1792A47A8BD13C0855BDAAA168AB93B877A8B9BCE30F2403CA80E9499A279E9DD67C8E0B3297C4A13EEA1757912F83D842974188F6122ECF754D8566BEAD96794B372EDE02C77EFAC0AD616B032269FE73ACB4C585DB91C29BF12A07B9BAB21770ED4423E03C09F348C2D9946479F835A183748FB09F630AAC93F22E7E56C7FD47328A0A125CB1B6B58A92BC3CC643685EC769203D4447FDCA7F3CD64FEC5B5636E8C5C2AB8E1C58B858431E7DC163A177A4ADA5C3EB7A45AF9558325A5068748E14B9CEFBEC4C4E751B0D6CB46D6CA1E38605732826299CB44DD1B275E540E82B427A0AB6909BBF583B67CF0A4CEDC168FE1345E7218E7027345DA80754758119630783299CE9E054AF3A42015C12F8B733BC508F45F4AD23260FA7B6C15BF638EFBA86BE2C91EB799D7DB45E80A004D2A3BA403C8FBE30713F8C59C990968B01AE16231B0DA74CBFC6788E8107F8F9701A9B6B01F05D964539605B87CAD36A2797604D3983D0603F7522650312A8707B64F1F4CB12D8886321BF7EA1CC28F3982554A3FFC664B706C76C429785EAC08D8954517315A418A5181A2D882C51623C9E3623545BBA8511C8BC0993880391BCEFF86A1A0717D09079A1C33C8E9C97BB520F273684B2AAC1D4D18A70D490AD0A6627F0537460C095364A42FA08A21AA6D24255F6B2660B1B64839846F6E030814CC58B188FD1D142D4DC3EC5319773817287BB82EE5479E0A1A498E1671D615162D8C5B38068B61643832300FDA1B41EABA31C5B9854A07B62D8B2C591898D92BEE3CC01710810EEF3288FEB3AD9FB58F8D39F76A128EFC764FE269345EC76613AB0A41A746496445FA705AEA7094A4542A8E59F83B380E0BC663247765C3B685B33C01CE7806C80B037D22053E6B155D516CCF2C010F97575527AC7A5C3D1AA659063AF2D0B0D915A1B57C75C707A179DA035A9E1CA3977B91B8330930C4DB5BB2501308747C0A709C34142A3627BCC2952FCA704D749E3723231672187DC1CF61C087A2384FE727BE3AA7BB00240E2395B979B0DFB942D38F3825E72132395348F7C6CBBB800C3C36F8D4818D584C19B124AC9A728F7714760625B5FE877C855BE65B01BBCE106A24A2F7208696E73A22A27522566AADD8A73A050914D362932902B8EC8429E5C15CB427965A87F190625B6452C32896F5776318B15CE2F3060B296A1BB72A4C36B5CFCC97B9668713F85575280C1085B20D8B35D993A27DBECB97DB218B3C297B2E60C8384B05DF2C7234C750669864A5BBF76B9902F00A05BD74429E57C1B24C6BC28B6BE2C9EA5C46213D92C4E29828DC1B10DA786106106C7689014009B1B1C022093AB7CECB44D4998B0838BBF912C81269051655691135B5CD45F84D715F3C7B56DA3314D8783BD0213C0C33038116042D116DCA41226974483C6A4B8A2A319690FC0B1BEDCA3B02925A01C13472AB9A565778D44242D3B1776FDFC15C4F18969623E01A453AFBC6F2C264CFEAA8AD14B39F96B55EEDA5CB8C391A31773CBAA77E8481B5E26ABC8D531430B0931F36BAF28B96FD646AFB71195D58BFA1686A7247F9A69A5D20C0516694E760451199A25A55457BD17674B4CBFC5AA201ED0CCE77172951170342B3091181DC22B7CA70213D1A38B9D757E87961A4CA7BC18E22F0626850A794E3C2A5D5B5001B194486CC0CC880467FCF3B55B3492648980C961333E6C516EC4298A7112EFE459E1E92E821C74D5896CDF229A798529EB5048088A4D9BB105E54C006A5C15A46923909272AFA9B6D5661F7AF16D15A698D213C51D771AD0B14BA641C762A292EC5A0372D63501B5BECBF24731E283DC4246E3652A5544BFE99A71D05974CC2B9DDCB34C0AD9A057BA0DF05C56B8854E01655BAF21C9A5079983D322525049E0811103A101BB5163538C6D27A477B4F956F1967F445A2201D990D304755EEA5482813089A3C4911031FB49B380D13FA2C8A9BA7B439B3B5102B832DC65387FA41B4E7959BCB790ABC51BC30608555A80C4984AF0B80CBD1829FAB6C7BAF870D7B76D55672456FC3AAE7A4FA466CF64B43482E53DFFD1862F32BE3718CE4D21C57B894A3193C3DC8A03A34AA37806B6A35925C365EB01B4835F4AE98AC69080870E7CC14BB77F9E61F9A7C46CE816743B511574AFA4B490BF2BF55221114A9D72B3A08273BECED57093AFA374BCDA7E84F949E12F1BD8E51F4FC3C51DE0A7B314BCC004",
|
|
"C0B435307F5CBA65E17F2FF8B2D435874A6D44F618EC5FA2444FDDD281E5E19EF12ADBFF26371451A27E40210635659274BDAC8B6A3377DCCA959D19BB3EEFACDF814D131740F6B7EE6C97320E5E7901A55E3D274B5D5B9557274E566AAA2A8DBF9541BCA317AFF7EB383BC6B89A1A542885249A263B1F33DA8C1B2D034FB0B0E680085437733F4644B8E197C9BC25147E79080F1AFA644A507A2C0D2962B6E9A43C9DE42078AF346FB5CA30447AD74CF93A43846C1ABFABB56758C7233BD410823F88B29E6B492BEDBCF18AC3B8A6801E0C188E044E3353DD858D2E4D0D9AD90CFA137D4149C9C44176E7B2F7A38FBCDED715DE5526885ADA3717D265DE4768EC121C01997E4F9DCBE796D26D047145E24FB62EE5ED154A170624F22DBD89E01D1C7C156D4DFB2C6F6D6DFB7577F561C5D41D5E0AFB1B638B26DB8118C99AE5AC8D827AC7F5072B1EF56FB13EB070C01AFF1C92A97842C9580B7390B40D156017A85E15E7992611D980F5D6982DA0657AACAB159722AA9852833E82E7409328253E925A1E67F6925576C33AC518523AEA22283B8EB7F0C9D6BA161756DDA12052068B6016A4D553175E33D35147A12D0B058F2424B1F499DD18AC9C58EE1B037111ED00989D188871269F9C0A397A293C20BEE7BA7F09C8866152A1410482D3D7466AAAC16B73328FDA74DD670A815E1BEDAC97D90D0F6264C0CC7D10956E9D0E2640EEFD7357BA98B53EFC932B650E24FD7C43C9984545B117E1ABC15E25D72DCBCF4469596585CA642AAF1F14CE711B0360BBC5C8FA08CC092983213CD5CE94F7ECDFC438B360FC46591141B3E6DB212125306C86CD9896D251C404AEF8816DAD9A2762B4518AF3D73FE44C45CC2C85A2C695D5C7209BAA7F5B99B229C9D5B51E4C3DA8D98721951B60813CC011B6016B92CD1D835EE17FF6E4B1BA511016D5816791317BF85F410C9A753A2A31E5C60AAA85BDC0F7ABAB63114F47A3AD35D3FA4C7F3434C4D6F40DC8C5B7A328CCBC8CD7375A690A812C091B3523B0B4725B9EF932911A558470D43FCE3D74F41898C7E325FB244D1AF27803B06259C31049F45BD6AC5B4AA3266D008A56EA2F6952982CAACFB9D228560D366ADA3F30C51594B986676C014FCB09A6671003000B7613A4934CED2D5ED6FDB824CDD22333C7212FF28C03D6FEEA1B824004C0854C8AF138B6FF35CABD555894CF1052199280174BB3112762758E5C9FD235FB46F21A3DA88840B9DDD2C1A8E11B302369D7E8BE8A39246782B57DF531452F9DF9E02AF353E6860A740B983852DEE17DA7995D821F8B02935F2459FB2E0E75C86646972915849BD191C0EA731F4B21E68AA2377006CDFAC3DF9DF98E1F47B8757F2BD3AE409CD7BDF35E9813248E016D75615EFEAA2F4FFACE232AC496B6BD0F2A91641766BF3BD461EE9429A917FD49E44AEDD43E2FDFB9C20868D8B89AB288756152ABB563344A05C309B20A2EBA905D8C27518D1801F6B428109ED7922474019B44FC08E7B84E377E373174655B8F0338",
|
|
"E8AF40EF16C053F4CE74A82AFD44AD3129FF72FB6CCE84A4C8F729B66133BCB7",
|
|
"F3430DAE17CEDEF4BBACBDECDE7FEE0522D6A9AF90ED76B13B312E7A86E5310F",
|
|
},
|
|
{
|
|
28,
|
|
"62387A619993B5D9567CE83676994DC54C46D6E380A8944E0DC60DD6312460E698CFA6AEC0AB440C3A3D93F21F65A05B42933CA538108BE5235F8A69B505CC2ED84CC0606EEC5B1449BC5F12048074F05985429AFB6C9FBB7140C28019BF783CE9877749516CFC76969925A09451A277893CE3280AD7DACED8C66615E074D4716103CA5C10757027995F8F98ACD141AFDB4CB1531089525BAA01B906BA4ABD0D6C186ADC3B96691965A883034C53E50268BF8A6CD954115FF64D6C9630CEF8288E6395C2EA011CBB3170F79DFA0759F1D1CDC475059FFCC375DBA3AD9B064230833060C803182957F80EC9772DC235A58B16C38A365176F3147C5B524AA13E2296A36F2964C1638FD8F7570CC572D7D69E2B81985C580A9B8BBFF08A3FCC757FEE6040FDEC7852A32A05D51D8FF338C0730242CA6DB2A4BAEE99C29749A33E1396FC680B6A7589089477DCF44FEA18AA2C925900203200AD14585239F0727B4387530BF68F7E077E62A108581C8127FB1C5DBB5E04582E746894D2516995434D81380FFD374A0641776B218E38C978622A5BE4EC6072E38A1F0289B060C2DEC91E7F763702F17803A58F094250D2E1670C7B90F0778365E8BFEB2B3556B168FE55B854089E52E0A2B8D832DA57AE355091C876AE67B367CA866A1C3597AD4CCF4E5B2FCE0788593141D2C0CB6B3C9B80D3445F992EBFE98F26DA68D03669503A0EC696B430B2217ED9C4B6CB22BB3A91D6AA6C1A2A3F3615BF67C5B420EABE7159363F525E5AF9049D4C0C9ED197DD7B6F8B4C2F6604C8CEA75771A3AEEC0C0E8D1C8A6AE94FC8485206217CF785677E34C458795D6303403F7AA427763C5ADC4DFFC8C2FD422870B876FAAC6D334931F0D760ACF4092A0727F1935855B20698B5C8B2879576A25D9A9B93862079DC02CC30C731FDB7021C9631C43230A6FC6DDA1956F3EA01DCAA64354060CD4C67E1149915A423FCE3166272B2E3B71E3BB509AE978D88859B55E50D338B703E1B1D77D44212E00D510695974A07B8250053B7129889769B4991B5083E05D0054FC4CEA18C0A4291298578BD53B11D174C6FAEBB6E5919B2E7BB7A4CA9C94E45ACC1674D5D994D2AF81CAAC6A153334A1B770937F14DC2696721665F87751B608C921B985215F40EB28BA632533119618A97D0766FD7807318571EF8305175724E54CA261A03B8243B7D1087F70A39A7FCBB0B223CBD11AEFEA9BBA4833FBED98ED48120B3CB507C2C272E7A6EE6C92EE5401B65345182C31901F1C0A82743C2512A392C3B6BB73FADD89131FBB65610C9407C62860B7EF894CD353C02E347424185C27A06209914444FBA9C751CC27D50527531B282A6C503594571CA89759C345632AD2AC24DAE862EE091C4F421194ACCC9F45792B69C12215B878A4ACE975B295C672288472A2B5CB3865C787F7A3DB60608E648A11E6BBCA38456F93CB4CE2C31FF1B660A096832E518B6B7032C20ADB3830E982430EFE661C3E50802487CEEDB0FD8A004A7263483F1B41227B96C207EB1B2131082CD85244310AB6D09D4A73D436BF3E8A275ABBEAD804968F9A5ADF2264F897463D71FB09A797EA500B671C0062C04B911606293B8C7BA6186C2A2DDF074C2A6F36D35796EF0FF1CF8E47273048F82A8F00AA9040D87CB0586D968",
|
|
"47D60DEDCB1A694A5F55A066C4E61A4305346BFA8F03BA2FC7E01456471A9C1C02B2F471A3DB9D10056FC048652C545621000DB032386D2ACDFD81119F781CA0D14DCFA78C700B700BBCC55D3A3951BB82FC662F1B26C9A4F360EE266CA49585E696625D9787CEEA807E8506B4A38302969298BCB15A4219460C653A965370D14CD7874E711791CE719880F4A61E086A560457B1B002A9B739292A4459CB415F76A4597C2325599BCF18CB44E7CF3F53091054CD3024543494ADE226BE9D4541930AB14CB82268863B9B569EA528BAF3601FAB2831F1C29B4C4A712699B144CCBC63C90FB1E1779046CBA85AB61E23A97E57477FD84F022B20839B2F967B761CF3916BCB2D088850BFE2BD3CC40DFC5170CD7086F1D61380F338EFA2BEF1950315635BAB527745790495692664D1A55B3912DCF0AC797291F98249EE91660FDC8A67407F47C3B39B0857F1E1A2C0082D3716C0F7D0AD35229A795A3EE41A130BE53BE1173A94D3BC712B9F4CD86D5594A2C87A25642311ED45230B1839DB7050B8CC7D2DE99D90E32D5C2C9DE82BC56FA850886C6B549CA86E480E3373092B5ACB628C497DE3A789167DE055740B9C3960A52E1C54A99CB5B4221B7B1B90BA04E0949B39735F8956C30748C0CA7D6641CA97B87C30E7BF57E02166175E411A046645CF4B1C63D7C383A46A957A74593BA694E2446462231FACCA0BFA3B19AA469022C89B48D436BF4C4411549115D44857B27718754A2E7A025A693C858A594D52AE839465188693D8D7A449F3747CA88B0429795331AC53B565A0BC44B13B7D73FAC5AF606BBBEB73BDA8429136C3EB77928A3879507A6212216E6060095E2294F2C6B708883877D73970D306072B411ACA1A51EC1B64DA86F71098C46C4C2908C9AAB11B4D5BAFF7B205F1A1772454450F2A84723B87BB4A6B7CD5B07300A2EFF9A2A4BABE32320B7D268EBCCA1C42BBCEB9964950B71F507A2070F73BEFE482F4BB4750D2C6868AB1A42C6BD731A85EC036329B122E937B2786961B76060AA0961971C90887B468A23A3CE8C21E2AC2B6C6613F0539AB48946E6920211894CE970E9F671FC3105BFC7A7655A667E5A6775EA970BDD37D289489090A292E8CBB72D78A86F697752CAF79AB6840684356CB2E5D632C64B986A4174B05CC3DAED01F4CD286413CA8486AC310C61797815797433C38CA6352504237486C11CB383AC3C1A957586EF69BCF52A091F10884A515474BC423C11630446E1F7B98D7906FC4295F00473094A01B325A246875A90704B44349A460F6663BD6BE2B954CEA2794DC802AB6160400634726D07B40157A63DBAAC7EC5D371502E51C0A99461B8FD23FE6492684E76466C661C886BDCC16ABACB56E1DE361E6F4864BE32EC3B58558444C612B91351A7AAB3C415D475CF2A86EDAA91BB9B5B7FF8184824B2D9D36509E00348366483B0080883786F2353CDF459100D9AA21B279189C4652F24071C9BBAA5A697B03756EA3AB084407E41CCD2B66B044D83070D49AFD0716FC79AA0820BAD5CCCF26379DF4432E87C4A8C5B85F181222333BC7D7E5CE35252CE42CB518BBBFF00BA03959989370974388B7F0B64D6697B631145E9C5036D8174362387A619993B5D9567CE83676994DC54C46D6E380A8944E0DC60DD6312460E698CFA6AEC0AB440C3A3D93F21F65A05B42933CA538108BE5235F8A69B505CC2ED84CC0606EEC5B1449BC5F12048074F05985429AFB6C9FBB7140C28019BF783CE9877749516CFC76969925A09451A277893CE3280AD7DACED8C66615E074D4716103CA5C10757027995F8F98ACD141AFDB4CB1531089525BAA01B906BA4ABD0D6C186ADC3B96691965A883034C53E50268BF8A6CD954115FF64D6C9630CEF8288E6395C2EA011CBB3170F79DFA0759F1D1CDC475059FFCC375DBA3AD9B064230833060C803182957F80EC9772DC235A58B16C38A365176F3147C5B524AA13E2296A36F2964C1638FD8F7570CC572D7D69E2B81985C580A9B8BBFF08A3FCC757FEE6040FDEC7852A32A05D51D8FF338C0730242CA6DB2A4BAEE99C29749A33E1396FC680B6A7589089477DCF44FEA18AA2C925900203200AD14585239F0727B4387530BF68F7E077E62A108581C8127FB1C5DBB5E04582E746894D2516995434D81380FFD374A0641776B218E38C978622A5BE4EC6072E38A1F0289B060C2DEC91E7F763702F17803A58F094250D2E1670C7B90F0778365E8BFEB2B3556B168FE55B854089E52E0A2B8D832DA57AE355091C876AE67B367CA866A1C3597AD4CCF4E5B2FCE0788593141D2C0CB6B3C9B80D3445F992EBFE98F26DA68D03669503A0EC696B430B2217ED9C4B6CB22BB3A91D6AA6C1A2A3F3615BF67C5B420EABE7159363F525E5AF9049D4C0C9ED197DD7B6F8B4C2F6604C8CEA75771A3AEEC0C0E8D1C8A6AE94FC8485206217CF785677E34C458795D6303403F7AA427763C5ADC4DFFC8C2FD422870B876FAAC6D334931F0D760ACF4092A0727F1935855B20698B5C8B2879576A25D9A9B93862079DC02CC30C731FDB7021C9631C43230A6FC6DDA1956F3EA01DCAA64354060CD4C67E1149915A423FCE3166272B2E3B71E3BB509AE978D88859B55E50D338B703E1B1D77D44212E00D510695974A07B8250053B7129889769B4991B5083E05D0054FC4CEA18C0A4291298578BD53B11D174C6FAEBB6E5919B2E7BB7A4CA9C94E45ACC1674D5D994D2AF81CAAC6A153334A1B770937F14DC2696721665F87751B608C921B985215F40EB28BA632533119618A97D0766FD7807318571EF8305175724E54CA261A03B8243B7D1087F70A39A7FCBB0B223CBD11AEFEA9BBA4833FBED98ED48120B3CB507C2C272E7A6EE6C92EE5401B65345182C31901F1C0A82743C2512A392C3B6BB73FADD89131FBB65610C9407C62860B7EF894CD353C02E347424185C27A06209914444FBA9C751CC27D50527531B282A6C503594571CA89759C345632AD2AC24DAE862EE091C4F421194ACCC9F45792B69C12215B878A4ACE975B295C672288472A2B5CB3865C787F7A3DB60608E648A11E6BBCA38456F93CB4CE2C31FF1B660A096832E518B6B7032C20ADB3830E982430EFE661C3E50802487CEEDB0FD8A004A7263483F1B41227B96C207EB1B2131082CD85244310AB6D09D4A73D436BF3E8A275ABBEAD804968F9A5ADF2264F897463D71FB09A797EA500B671C0062C04B911606293B8C7BA6186C2A2DDF074C2A6F36D35796EF0FF1CF8E47273048F82A8F00AA9040D87CB0586D96885B34A8FF209DDD6CAF616A2883C143BFDF14DB231E98CB119C2656D1175BD0FE1A8F78CBF6F01A3878C8B0C421B83005D834A668E52F982855D5C943A1D93EE",
|
|
"FD8CF594954FE5FC75D774B4390EC1678B676770C602B7C128070BD331D260AB21D1F99C726729B6FBF8D699EA133B1665F63DA83F737E938A41B865339D10ECD26940BE601870478E0D9E2FC2BA385BCCC0A786318D9600B5E8F269DEEAFCFCF61D5138FD905ACCB595D239F7643263DF754C55FECAB8F07DA82DFBF590EB6E175F6283879BF589B052B9CA2130B7025C47931A8AFDEF26B3843F6D2C701A7C3075EAF545D07E6280F261CE1EE3EB967F889651430C89693B6853F8B9FC32D758C6947ED409BA4FC00238E490059995A81F7013133C6BF4D508D30E3CEA08C0D84ADC2C1A465FF538405201B31CEEA71CD1568B98B17F4856571150674745C5858D770EA4D91E40148DD056C0D8C938B380FACCCB2743BB2D728C11F665717CA0C271316496331F8A2583FB1C2B3E53D668C3F485993F14DDF234B7AEFDC95FAFC99CAF0F44845E5D7F727B70036F5909C54B56B3CD842C89907408E600C14C7C00AC09540AEE9D25619CABBC3178184F2E9CDF0A3892FFDAA75C7EEB4F28CC9EA0AA8A1F63E4A9F9373075214C7B51D606B79F12E95D7645CD2D0158DF5D70C409FCB01ABDAD1FE33ADA0065F3DE67D49BFE9919C74B8941953B2864AC797A2CC5B2FD887B1C0C9FF1C9203D230EDB5A59DEF96F8BE673D1955422C7C16FB7EADB3DB33748D0413E94A5F85D9A020733629F93574D8687D78AA1D97A10D9B1392166B1E0D0B6F235CB8EB8A5CA56981511B2805D7728589F75E5065E40B911CC7253B67012B6370222BC1EEA263424C307F3F4BDE39EFF597F31787164545EBD1387BF88A717F1B5194947A5CA44BDE7A176D50D1EA7E372D95737606743A714E64CF4C1ABF8A2DF7BDC9A15A8925C502E2DEAC0CB2CF127E25DD002D4D36785A3042E8712943CF3E9441DAFF33855A8F2E1DBAFB723FC789A174ACAA808E574020B252C3E99B0B170FDF0C68AD6039D593B3B3B96E408AF85E7CBE60B275F4C0E3E1C0E793DCBEEE8B8A8BD3BAB92B263C0F6AD2971F462537ED9ABC092CE6FE617B33BF731EDD9DF66D6E626E5F173CBE0B246B3A0D977B28CAB98B5EE4857C7E620525F51D8F6A83668768CFD68E5B8EC2E0A1A17B4BA5792CBFCFECF0962DCFEE00E220B438CD75F672B2BE7E17EA85D4070E12D2EA716D9710E52F9025324BAE8A76DA34DBF531629411CACDD7D5CC982FBF2BD6D5D481CE758A431C6908092B77750DDE6859F1E09620B535857B082E72416F39B7169D57C1151593976F5782609B5CF4BDA74D9C8654E3AA8C420540ADC732593AAAAAFFDDCE25CD9B554B9EA31900A93E06C5CC761F592074425083A4C7746D05B138E234DF6AB7FE0B24A900E03DE7AC166DBEF702E5920D023DC828655609C9CC0EFA2297BB26C439889B099B3C7642323719F6B28E8C7E8D92FC92B69772ABBE5DCC47EF31C37BFCA8EED7BDEF7941A986576001009DBEA7213A096D1A51A3F27DDEB653160837914AF4F960009E541ABD0A669DCC54FD6261D4D3F3371E8BB3B59C8E38EF4EE",
|
|
"D5722BD3F338D3A4AAACBDE95E2768BFDCA819F719BADD1C8FAACF859FE65EA0",
|
|
"DEAE13A40F060C5A154826D5FDAC7C271E2A7C8BD3FCC211027F4B7C2E67C0FC",
|
|
},
|
|
{
|
|
29,
|
|
"C17292BC117476F81C319CC2523875F5309794D2B7AA85AC7AFC08AED5B283F5A16A7274F80A484D9292D440B4DD4537C0E37040835ABA5562314069E5262E8218C191686459E80201379760D55054F11D53647135A5A62972C7EC5C9A426A8D8FD9C712B4B510A670CF54A1CE3127EAB80A3F8BB0AA228E5C22A3794767CC040DF13764CB6953FEA762269BC8D5D169619C80E0160D990A3BB41297086110050145D8EA48BF503C4C6414BE732B2BA83F583B3EDE75C486D56949A2AEBC82459526BBA71525301C178B2B0FB5A7C2CAC480473280D50BCBDDA21C876B3A6B99BD32C27A1A081E36BA72DEC599FA976DA3180DEC4A8B134196E5E01122A266CFD79AABBA26F18336DF74593E296CDC0A770EB80F08D3290607AE95867D1FA5A05E4521910304D20320145219F3737AEEA8C5A94A63AADC06ECE1AAD714C25C244360DC49FD79847FFB2D0BA20DE374A1B5F54DA9B3A0EF5824E339BC58B552FDDC72045B1FD8FBA920874DB50961C3D4BF0D1A1212EC58C9720DA1FCCF3D7711EB4A5C205744B3AC0AD571AC8D9C345ABC571E65112686361402393FEA6712DC323D88132699738B89287388388A149638993629F8B59AE623ABC37FABC385D36CADBD6C6F54B97310A06BB5323C42A66F973237A626AFCE620DCB88967BE7C8BAC479D6C1887201BB44E1A75AC351754135A81C799F26358B9C7948B564D6C88DCC075EEE7A256EC49861CB2E8F28422E362F4D6ACE1E94AA6CAA1E15DAC4D6F0683B156A71807CEE810915F4ADF68736387C7089B24355D21465A7BB71B3CCC5989C54C9B7C5B2823B496A2FD23A7A994A7788B91FA14D05306D86125F33F342A11AC53CC8838859CC0740B6CDDB9B2E53C4A2D13391967A5E3197998494699AC84028B751399ACE998E26B818B94CBEF78AC97170990431BA7BA22B8891CDCBF62413D585AD6488CCDA194DF89222699BC77A71B43A80A95336F978967116B7059153CF344B02B0CFD78BAE7547849DD106A3170A99FBCE07067D06354A0E86C6D106A2F513A839660CA2942A51D9A463027EC2E5B574B795D59BC3BFA406B6A99BED62A63B37B27C5B40C45871C5CB503D062E255C48D2835FDF89467250CCC4EAA32DEC2B05C04E555C5FBCE3CDC6C855E6545062B4C8D4599D83717F03124727E45B5383BD3AF08144E7BADF062F1F2009336078A7A62CF2706642B2BDA323C43495CD8C067D8914640CB8660759970F665F8E282C9CAC647D709AD600AB8B67C9DE7A36A1482C2A94AA1E214CEE1A68566649CA5B8553A6404934219BF1C07657C82F48C3BDB00BC0B394327C75102BC10B5756AD404930CA4DC8ABA2486875AFA58BD81B83F08B9FEDF802626518B9441C0049A98CB0C8E5F132A0738ACBF323B3577EC906940871947F856C591047C1C66883F040A6995117B8AB51E5B88207A84E3C7239266B13790C561876C99C64DA8B9465627C59FB1F740951C906B540B592BD6467E16324594974E6933C6E509708B56D41766D4A59597BCB5AB902B86CA3B4F8AC29DD4CA359A8C3CC70563B0CAB3E559C3F1507F54C2FA61A383D217071C4C704514150AACBD9B02000A48DE2605AFC8A142B49B95CCA44A9CEDE035327B2BC1B770BC0C3EE6DBD74FC9D3948A46E4429FF6D3B5CC6A018",
|
|
"28618473E6A45C1040379B1842365919C38BC8C99DD01287415A0B9D953DF81C49041609E1FB5743A7B9343B0BC83AA84D110549C97C009D17591808B99A5EC9FB9BAF1C35579BA4A7885BF99325C31182B68B69DE0B53646A1BBD642C02E11E454B5D9D738D65EA6808C2CDA62C45C7007ADD85B71F429B288A02B0BC7BD9A37FF1514872377DF280989B0111F8A0919059B233CAAD62AC17EB74AADFE27A0A9BCA4549AC8FA442DE966AD3D14CE3D6B8318CB427C73801818441AA732B166795225AA6C41C9FA42FCE7B5F3BC67102A828E3B39AFA3AA685849A96D8CA4FAC010BB2914F43A45DE731BD86C2C2C6ADDB511D6E8A8B36B183A7C63969F70A57CA461BF62F42A4322201BA64F8894A3276227836D97B14E2A80D380B418628CB2CB6A6E17647D97AA023874263ACC546F14429D7B6DDB41E96A19AD5B3011AD8C442536B4972A1BD1B428B828016B842A7D90DF1D73106E1C8ED01627C6B02BC362D796870973B96850A709E48967910C4FAD9C7CBBC547E339FD144AA6878B130B8A1D9035959BCA8906278975875627799B342C2FEA83B04D322F4004F0F9ACD5900449DAB8514B7719D3537CA86AC0E77B19737B0B10540B43266A33742897B8B0EF473F1A4C63BD18EEBF45C064921F87218DA36C7D7C27DF489386408C0735C3AAE980571B02D760B0A0D486E9685164E9599A382912FDA21990CC23342283BFB87D168BFBB4ABF42AA762A477F08758D871B8C819A08DC1A3125D188CD8681FB08B45248615C2973A47B155E13375917484DF1B548889508B0CC633CBA71D6BC842097C937441EEB3104C50BD4945DF723720784A7222CAC29CC302B66C7987C8BDA037FD3A75F67F8AAE2318C71E14F9868CDD49833A9520B440607431C562E4B23E7215B043B62EF51655272935FF61BE6393A13ECAB8307ADB2A58531361D4EAC2F58C8A64E089EDD5B5035C45FAE557E3945089EE8B330579BEF2169C2E3C596E08DB3C97463CA4D0D553829066DE23AB97ECB2D242B13222CAF60C3C7C437B85B289B415086DB4711208B5E48D77155D667B0109821A0932AF950D48A7ED8961D7388252CB21C0AA8260DB8A9A1E0277382206DE1C0BB933526C254498778EE14694D01307695030EF17DFBE6287E35613BC301F946924C7C349B7BC62F3407A0804579D461A3CA7D6F318FC7687755966968D73275B79F5874AC3EF936786272449A2FD6E7B8000A58BDC2388803C7EE94A0138B1D51B313EE3503C19A675AD25C8A4081C98A1B3A9201D0A3C9767921491BB703E5097FF04E2B749AD7CA37682C68EDB769AB7C76F6F623659549567563E0244C3ADBBB9706774C225CFF4832C962CE58E09DF6673F8E88A848B270A7892B1C447F28044CB3C231F1692E76549069D6762257048AEA42AC37B0EA930DED6534C6FAC43D80754BF067DDC717D7D541FBDA2F0CB67A97DC2E1D6B6FE79CA738B57029AC54E1EC95CE832F0FE12B6AB2B6BDF6287FEBAE32667DB2669B94F74D5031082C54CB1E6AA60314453514067A6B8D43BBA41B8B1CF1C6686636A5DD47B35302660FFC95EE00085AF31C15DA091922AEEA66A30873C511C45CA3804079269E9690591F2436C17292BC117476F81C319CC2523875F5309794D2B7AA85AC7AFC08AED5B283F5A16A7274F80A484D9292D440B4DD4537C0E37040835ABA5562314069E5262E8218C191686459E80201379760D55054F11D53647135A5A62972C7EC5C9A426A8D8FD9C712B4B510A670CF54A1CE3127EAB80A3F8BB0AA228E5C22A3794767CC040DF13764CB6953FEA762269BC8D5D169619C80E0160D990A3BB41297086110050145D8EA48BF503C4C6414BE732B2BA83F583B3EDE75C486D56949A2AEBC82459526BBA71525301C178B2B0FB5A7C2CAC480473280D50BCBDDA21C876B3A6B99BD32C27A1A081E36BA72DEC599FA976DA3180DEC4A8B134196E5E01122A266CFD79AABBA26F18336DF74593E296CDC0A770EB80F08D3290607AE95867D1FA5A05E4521910304D20320145219F3737AEEA8C5A94A63AADC06ECE1AAD714C25C244360DC49FD79847FFB2D0BA20DE374A1B5F54DA9B3A0EF5824E339BC58B552FDDC72045B1FD8FBA920874DB50961C3D4BF0D1A1212EC58C9720DA1FCCF3D7711EB4A5C205744B3AC0AD571AC8D9C345ABC571E65112686361402393FEA6712DC323D88132699738B89287388388A149638993629F8B59AE623ABC37FABC385D36CADBD6C6F54B97310A06BB5323C42A66F973237A626AFCE620DCB88967BE7C8BAC479D6C1887201BB44E1A75AC351754135A81C799F26358B9C7948B564D6C88DCC075EEE7A256EC49861CB2E8F28422E362F4D6ACE1E94AA6CAA1E15DAC4D6F0683B156A71807CEE810915F4ADF68736387C7089B24355D21465A7BB71B3CCC5989C54C9B7C5B2823B496A2FD23A7A994A7788B91FA14D05306D86125F33F342A11AC53CC8838859CC0740B6CDDB9B2E53C4A2D13391967A5E3197998494699AC84028B751399ACE998E26B818B94CBEF78AC97170990431BA7BA22B8891CDCBF62413D585AD6488CCDA194DF89222699BC77A71B43A80A95336F978967116B7059153CF344B02B0CFD78BAE7547849DD106A3170A99FBCE07067D06354A0E86C6D106A2F513A839660CA2942A51D9A463027EC2E5B574B795D59BC3BFA406B6A99BED62A63B37B27C5B40C45871C5CB503D062E255C48D2835FDF89467250CCC4EAA32DEC2B05C04E555C5FBCE3CDC6C855E6545062B4C8D4599D83717F03124727E45B5383BD3AF08144E7BADF062F1F2009336078A7A62CF2706642B2BDA323C43495CD8C067D8914640CB8660759970F665F8E282C9CAC647D709AD600AB8B67C9DE7A36A1482C2A94AA1E214CEE1A68566649CA5B8553A6404934219BF1C07657C82F48C3BDB00BC0B394327C75102BC10B5756AD404930CA4DC8ABA2486875AFA58BD81B83F08B9FEDF802626518B9441C0049A98CB0C8E5F132A0738ACBF323B3577EC906940871947F856C591047C1C66883F040A6995117B8AB51E5B88207A84E3C7239266B13790C561876C99C64DA8B9465627C59FB1F740951C906B540B592BD6467E16324594974E6933C6E509708B56D41766D4A59597BCB5AB902B86CA3B4F8AC29DD4CA359A8C3CC70563B0CAB3E559C3F1507F54C2FA61A383D217071C4C704514150AACBD9B02000A48DE2605AFC8A142B49B95CCA44A9CEDE035327B2BC1B770BC0C3EE6DBD74FC9D3948A46E4429FF6D3B5CC6A018A390D967C94B4967EC22008DB7FBFF797DDDA62D6ABF1A67A99B82DF587B1294DBB1C363EB427CB804DC543D969492479C0A876B43A9D2F095D4F8FC890096EF",
|
|
"6E77D8BF4CD2AE8E84DE27558C41CF8B63DBF07295C86F83DCD9CF4C4E0AC14503AB3AF4491225037291A7F0BF6B51DC2E3966E093FA8B217C35407F2C5408730D2FFBA39E6DDE33150F804A36EFF671534FC99DB0A76C8516CEB28431CCCE0ECB54D66F73CB283DA9635F5E6496BA0D3BFF33F6DE9AC9F780964368E3D0175E64BFC2DAE50544789CAC7BC439642E678361D99FA6DE85252E72B39DBC5F32B3B45BBFFE90D53032B00A8E831316CB1858FF3EC0EC4E22459AF83D8AA09BBC6823DF580723466260351ACD562C9F8E8AEB82587F4DDD7D26644A990C71E2A6385F648ACCB25FBCCB31704753E9C0BFCB71A433A51C3C0DA5118A7A7E69F3C8AB0EE3F7116DD50DC5C18002AE10179093C25340B00506206443D1D8C9210CEA277F7BBAEF4BD5097237B7D0DE65D524DD6C7D467B8162EF2BE60AA304082799D4253785A65F9CC5D75413FD0ADD22E9019A9CFC7D3060DD86AA10A218B050E6C2B12EECD5646C539E3D7D87B06896D3D6AB902EDC8D162AC34C5C6C2DE155D1094BCEA464E90393C63BC6FFAB862CBC4F68E899E0872B52A403D37A21810EA9D0FE376397C6A1848D225DE562A968C16177045F86FEB2F53D19A95E674DE446FA87E0BCAC9EBF77243E4AF6C55B0585CD1ADC300888AB14CA518192F63DE4786AC9FBD83DF4D794932D5027B17F75B32941251A87CB2958B92494E33B5BAB965B212E557B0647492F361A371298FB7C4D424731C28ED389B90EF3EAF5F71E601227F8BD915EBB8063B95911EE50AC3BA994E5AD96BAABAABB32D0E7948BB91468F9C8D5EADE554728CA2794322A72CE728B80C2D8D306B6B5C7C3D867748BF413128B0AF6587CA9424226254C8D2BE7C6174038CC926FFAB6139BF1674DB51F1C86333DB231543169E12A1828D16C11C9A8040C02BFC1B92300C3FE3B38FC01AA7A0E7C73890F934A5DFDF16720A536F01AD67531049E705C2A909E7FAF4979D2E39DF685271026C6F7E91B5A891034059827FB57651F1750388C1908613A8F0E7C0BCC85291C18A52883A1A6FD65B56C8BC9A058F1031916B46AA8309C7239059179D72CD093EA624111DE89A7CED0B3C92975DB293179F6C0324E9CE674125F8B667C87812FC59683F59C07E9C4A793CD840EC6CB728DC1AA49CC78D7F1BB7D8466ED1D55AA45EACF6C6CFA250E4CB9F2B597E28D69F38F2BE852B2DB2257ACFFEE310E65A5CF90F4B3928850D5FB5B5057EDECD31F71A42AE075158C2AD90E5745712134D4232EA5054B81F4A70D3D970BDA0874449CE73A87188BC85D9EEA568C23FCBDF00B8051FFA5786D9B719B3BE00572BC994A6FAA576F283CE683434879DAEA7E9164E42E0D290532FCA15ED478BB1C4EB6D0E43801562E09292DDBBEC0B2DCA4F0F9DA0463FC81C4B2576B9900443294EA5EA8FCEB18AC3177B9F53B7FCC8B68B02BCD8AC97DCFCA990830DCA3DC473AE12CB56B634FE1D7497BC360E16922331D3266B798BFAA8AE75155837EEF39B28A42DD3F706A052292889D",
|
|
"63094ADED32451C9C6EE792A7495715B0AA36191F3C0C80E92E9D2BE48301483",
|
|
"C4316DD26DF672F2C733AFA75904229B722CEC9C4A5ADAA24C6DAA6D6FA57194",
|
|
},
|
|
}
|
|
|
|
func TestEncapsulate768ACVP(t *testing.T) {
|
|
for i, tc := range encap768InternalProjectionCases {
|
|
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 := NewEncapsulationKey768(ek)
|
|
if err != nil {
|
|
t.Fatalf("case %d: NewEncapsulationKey768: %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 := NewDecapsulationKey768(dk)
|
|
if err != nil {
|
|
t.Fatalf("case %d: NewDecapsulationKey768: %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 decap768InternalProjectionCases = []struct {
|
|
tcId int
|
|
ek string
|
|
dk string
|
|
c string
|
|
k string
|
|
success bool
|
|
}{
|
|
{
|
|
86,
|
|
"1F2962ECA97FE4A63D64804B5B259F2025197F0B0EA9996326D24736553ABF113594E122AAC2C62936C1BD75689E240CED9BCE098212067776023A4954376EAA342687195E548160835224283A4606207C6C939376030C91BC3FCD6466810C5FA361488824B35C693DD8FB56DE2412B86A9ADB28384F908B23ABBD28307CCF834D3CB29F3E1AAC65806F4084974CD7037E2B84F645733FD660D3C246076706856B2415B0A234A29A76532DD6D6320BD06AA459768FB067C7B28B8C89258C2354EC5926D23BA388C14E39A63F61D23D705B1B850C58804856934892DAA452007B2ED01C6196995C55C647F3F58BE2D27AF8845C2334AD27687A25E50BB6BC90058B181D7197C5331088B7AC1D18038AA9920145887247C805102B95F57235783A4847130E47566A60469575651F0137608395D010567B7866C8505E6DBB6F6728959C128C382414FA53C461850E7783CCA1B4265008642581A06BB0C410D2A791D0977669188C6231A4A3390DAC1B15243E41D57843C53E309A3DEE5BB0991A85109A716800866259054FE1CC59FB6A96A75C8503517EFB5517E8170376512A53C861FA35AC8C4B5E63756247042690BD67BB8E0C7C9E8F05C5CE48CAB0F1425E329072F87401634211241738C2CE97208C6A6AB609F03EF13387AC6C08A3FA61E53632677507711A25C1FA3454D86D7BFC75E668100D6A6A03086142275383E291097104356A0848724BD95C3CD89CCECE97421BDC67B0FC8AA0E0C2460B4AADD9033CFC60EF04AA6F39566E89793DDC0481109E532566D90525EDE57E8B756FDA7190BB89937DABBE2AF4239961CFDAD37F1E4B5BED5A4CB5637163840716A1CE2F2036975A640B6A7EF308690D66750CA05B9058772828BC458AA9CE47116EF459B01C292010B7449207EDE7AA38AB20F10280E316298E9C86B3B4B94E718B85798D5567C96531A6CF84BC806AB85E156A34447B15FA9FA5BBA5F1087189BB9D4561885B2547DBC5BC081C1A268A9EBEE5CB1D4147545044D11933F43871ADA5495C894793645B0BC472407BCDC5ECCE19F219C98532882381739B94E2366BAE2C543E68116BC30974149E59318DF3336204C22063E4481E688FE2634D790773E243A325AACA07AC65EED5BBB092B6371B519BC01067849E6BA3C5D9B4AF5D073BC84BB472C123F2C72C4B191C85405D63C148B368399ECCC42F208F62E75E14408BEB14101EE4249D2418C359AB05E5A3B60A5465637EC6A31419EAAB9458A285F684404C4A94425FF6806150C7111AD2A77C0616D45CAE9024BE5DE259FFD6C3C0E509DF484F2D219D5F3CB596BB763D4BA6C3521789FC840142A42D510F14EA44B3E9B573A49F9B0879CA5A5E0606639A7C67A7674124E2423339126FB019E00BBB5031A1AB9B3A71190459A16EBB0A196DD9CD5A152179082AFA9436B647A68111439DC325EA777BCA84ADDBD62FDFB61009A54FEB495A166BB35C9C426A678E6E2958BF52138F68711D623B41C7B4A97A241B17B3C37720FBF04BA3C175C96A4CED4C3FD0E4CFBB345A0CF48A7C0870E4353CA02B92A204A9C03A6287BA8E1CFA50B91C2E2674CF93382A72E8B9E0214504B97C18D60351F689392A8E44AA2C57DAAABE4CE52E3CDC2BB436DCBDECEBAE89BD2E392F0370092A66B4F0",
|
|
"BDB614FFC9BA80A3BBC1899EC855448E2734BBA74116181D1503CFF0B497C832B75998A5CBA94C76C2CCA25904F574080DFCB7B4E64D5D7547B2C2C5E4CAAE550098BA50BD6DA47EFD10A67C2502A8C7B42F4B2696846FD849706C014A6CD8B828012B4BF41BCE0041E27A4245231B954B958B1400A7721FDDE369C488BE6AF043A8C0A9CD0CBBE132A2F303BB57A4ADFA02CB12717B2EEA905381B110E61A6B506B45392F45313C51756D80B27B9398C1F3F1A74655AC08AB6801F651A1A378DE128F63D4BACE138330025FA3882BAA630C98A070395697D4756D7F0521EDFA065D36A7491B53A371080F97CA1FA0B93E544DBEE4815B92AC2EFB9005113D583A731E17B713A68373D5AF07E32520B1958FD9643B4CA70E601472002141A12424726114AC1FA65801C8659846E8A1D42C53BB0A3BECACB43161C7DB707351485258C4C373754E9774AC09482CE92A24EBE959973A5E12606440777B22471C3EC015F2673EA3B4AB844778EAEA88302446EE790C2E954B29738A90287EFDA113125170488964EA551451955656A788BFE4C58A7AC4A9F2BFA2DB2C91C69DBB332FC4B231DBF1B4AA914BC63C1C37380C2395874EC1C517F0C79DD0B85054668D93CB2922917F9593D49292353C8A0208A26C37738EF146E92A2E10C49904F324AFE1820EFA0AC5E5A4AB3585A097B6D35C88DD57B5AC0241C21A5DE1A581D5416C11CB1AF1B79374C746FFFA4DF658CC6881BCD5C875E925223AE8A56924422EE9091B21BEBE841C37B8506B097E3F3BC20342AE00307745AACED7090547C1882D32C60BDA724CD156ABF8A11DA1BB054A8BAB5C44B474084FA13FE2949310EB64239338BEB36BD86ACC923C4320510220545D8EEC2F77EA364870B58404126B501CAB238BACA52040DA2037D541D574A6E7C30B9877AD540512BE2B41AAF888295B1A38C0CCE4F023BFEA82EC0217BE5A7D6A6515C399ADE1AA911336718524AD916A186FB488DA793D214486F0E231AAB6075C0A04D6406286684D65484B8520438F021FB4C55AFC5A4C35D97F0036480E65A8EF894C938B42ED023A4B966D235479012594BAEA06E6E86DF73C9DFB000F748C8140AB49341B5952F5862EB73E8503B4125997384B11208972D1DA3D320064459B6D714A4151696A843B872626B051D219F8238BFE480182D93F70752319B8AAF7360494038BE5700F2E9B86E83812744989B4921469F8A4B41C682ED329203B00257A950BD5435B224E4699729CE58D3855293C62C44EEA5D2CF96B4063A10C8ACE2DEB53FA79B8A1E77F955A6A48B38119FA6B8106301A25849F9030C86A2889BC75C147C90D6525DC532745391E717C70DB15007423C06E8BAA23277FC896B757536C2BA5A2605397E015A84AB216635B2366C7BF1364CF87D3CC61A31A57A6949AF77AD5990ED54122D4082813754079765C999266C3E961E674C1F7D03F9D258C1976950A120E0E31CF6239362FF38E395935B5E29D40C5BFBBDC63C25855A372C3656C243AA135E8492F3890615CC75B3A25221DB72670E465E1B45128B131395B4F0AE3BB09E94965983FDF6A54AF087AE4F32DD7837AEBF893212306D8B6AC1765758466908A3A641F2962ECA97FE4A63D64804B5B259F2025197F0B0EA9996326D24736553ABF113594E122AAC2C62936C1BD75689E240CED9BCE098212067776023A4954376EAA342687195E548160835224283A4606207C6C939376030C91BC3FCD6466810C5FA361488824B35C693DD8FB56DE2412B86A9ADB28384F908B23ABBD28307CCF834D3CB29F3E1AAC65806F4084974CD7037E2B84F645733FD660D3C246076706856B2415B0A234A29A76532DD6D6320BD06AA459768FB067C7B28B8C89258C2354EC5926D23BA388C14E39A63F61D23D705B1B850C58804856934892DAA452007B2ED01C6196995C55C647F3F58BE2D27AF8845C2334AD27687A25E50BB6BC90058B181D7197C5331088B7AC1D18038AA9920145887247C805102B95F57235783A4847130E47566A60469575651F0137608395D010567B7866C8505E6DBB6F6728959C128C382414FA53C461850E7783CCA1B4265008642581A06BB0C410D2A791D0977669188C6231A4A3390DAC1B15243E41D57843C53E309A3DEE5BB0991A85109A716800866259054FE1CC59FB6A96A75C8503517EFB5517E8170376512A53C861FA35AC8C4B5E63756247042690BD67BB8E0C7C9E8F05C5CE48CAB0F1425E329072F87401634211241738C2CE97208C6A6AB609F03EF13387AC6C08A3FA61E53632677507711A25C1FA3454D86D7BFC75E668100D6A6A03086142275383E291097104356A0848724BD95C3CD89CCECE97421BDC67B0FC8AA0E0C2460B4AADD9033CFC60EF04AA6F39566E89793DDC0481109E532566D90525EDE57E8B756FDA7190BB89937DABBE2AF4239961CFDAD37F1E4B5BED5A4CB5637163840716A1CE2F2036975A640B6A7EF308690D66750CA05B9058772828BC458AA9CE47116EF459B01C292010B7449207EDE7AA38AB20F10280E316298E9C86B3B4B94E718B85798D5567C96531A6CF84BC806AB85E156A34447B15FA9FA5BBA5F1087189BB9D4561885B2547DBC5BC081C1A268A9EBEE5CB1D4147545044D11933F43871ADA5495C894793645B0BC472407BCDC5ECCE19F219C98532882381739B94E2366BAE2C543E68116BC30974149E59318DF3336204C22063E4481E688FE2634D790773E243A325AACA07AC65EED5BBB092B6371B519BC01067849E6BA3C5D9B4AF5D073BC84BB472C123F2C72C4B191C85405D63C148B368399ECCC42F208F62E75E14408BEB14101EE4249D2418C359AB05E5A3B60A5465637EC6A31419EAAB9458A285F684404C4A94425FF6806150C7111AD2A77C0616D45CAE9024BE5DE259FFD6C3C0E509DF484F2D219D5F3CB596BB763D4BA6C3521789FC840142A42D510F14EA44B3E9B573A49F9B0879CA5A5E0606639A7C67A7674124E2423339126FB019E00BBB5031A1AB9B3A71190459A16EBB0A196DD9CD5A152179082AFA9436B647A68111439DC325EA777BCA84ADDBD62FDFB61009A54FEB495A166BB35C9C426A678E6E2958BF52138F68711D623B41C7B4A97A241B17B3C37720FBF04BA3C175C96A4CED4C3FD0E4CFBB345A0CF48A7C0870E4353CA02B92A204A9C03A6287BA8E1CFA50B91C2E2674CF93382A72E8B9E0214504B97C18D60351F689392A8E44AA2C57DAAABE4CE52E3CDC2BB436DCBDECEBAE89BD2E392F0370092A66B4F02AC3FDAD8D8F210A271603D045F95EC94C2A38EF4985F2E72EDDF9EEA90CA3F0FDE3F9D49FA98B44BA6D37FC13524B7FF2435B88410255345590DA7870813873",
|
|
"E3C563F0E5A3E2A6FF16EC3630EA56BA17647ED1236BD957021549825E806DE8924E3AF298F5D3CF2D462E31082180D2C2964ED80D3E7D92E5227E01B9B740F1E2D111FB379AF7A92320EF8BAC44A2591C7438B7F916C1508C45106E2EE3629F28FD280D725C382D647C894E60C2B109843D5DB59ABFD52B4B98E86773CBC75C8989239C288A79AB1D6608FA6EF287BB0431391C0CFD73504AB24D10A2F8FA5F3C3F38D9BD48607889E160CAA09818830472038F9F6CC2F7AFDBC45870B434F421743E1E0FD019D5C41101D9DAC014472C4FEEF0A9EF980E7F276CC7F1E1513A64172428A4A091A4C9A6A009EE5621E37B179EBAAC0D122A8BF42AE861EA420473D2C8F9EF3F4EECA11AAF8863BC66310EE5233797134E849A01992149CDF637BE74F0292988572A38AC86959CB67DECF3B3C3BCCCF186F917476DEE06727EA819A51ED1EE6F3228F4A0322032759D74BEF9703BC185A59492A79A67109FD6786130AB0D41F346D59FEAB3F3FEEC1270904B1504FCF463E9B4B40FA9B5266582A8031F0B200954FD080E207C9B40608C499D49FF752D9D1A4FB5F91264085D9E1A4A1A1FC91B5C5B3DBFA5D1EF5FCDF289206F611610B948644CFF3632229AF44D2971E3FD85E88E6936DA82DDD8815EA1A5DD6DD3DFC03259F604FEFC59CD4F9FC6AB4E9D8001A747546455B9629CCDCF5C4058D57C20DB6C9EEBF7C4ECBF76784FC2C9A08B5414F02EE7C93A38201BDFF31068786FBF98654F0A32B188B891BC59D683E08BB2D6906594CD02B232DAE179BD5C10CA0F7323A0016876BD80AE16265AE3A96204665A01758FFA9EAD686D3BC22D92899633520437994D73EEAC9A2E55C1EBCC3D07229B2E5202DAC0285B2BD600437CFEFE98EC02B13977359FE4E51EA9FFCC287C88211BB220A3F0E52D5D97B547B2369CBBF46512DFC304D72EE1664C91BA5E75B2B1D089EA9C02BBB7E390FCB2EE60E56FCAFFC3E3FEEA01FD8D5212783BF71AA94BA94813325A0249E55BD4337B7BD662D6641DEA484962E04DB7B42522837991D1048E9785E3BC297B2106ACA4968DDC1D05BED81DCD061D21DCFDB82D79CE3853E8B2089A8FE150F3F34CA7BF540D8044D8E40CA3EFC66F1778EC0E131F922E28D8B62B4050042064360515B5A88032F82AC618C9356678CC77F3C4B3456C61462232D92094B29A139E975D1DBD2B2E5A8BD6AD7A3CB9EB9BC0C0144B2178EE709B2D8EFDE65FDF3630565FA83910C9C3CC179F4613467294FE778A33636AE26AA9C2EF2D0FF2D648D3F8E2B9E20D434EB8BE0AD4B57E87B92A6D3572D8DFCD38B2DF6D77C5C8C25612EB7A3E0C0791003DDDCFA723841749A6AB9A9A5AFB098E1A82390FEF7A0FED281D7DA116B830524B5B4319F93DB15081136B5B06F8FB289018B47BE3302C193C8236015CEAC96916E39E4E8C032398056DA8C57F7D0F0A0A88B8B91D5D4D2A37CC5F0B8935BA7FA7AC4A0E0D87ED501B6196B7A4014226667F0F0EBC221BAEB63C7947D8677BFD625403F99F74",
|
|
"F8497107CE0D948FF5BF6E039E3CC4EBFDF5E9409EF77171A1E4BB2165713A3B",
|
|
false,
|
|
},
|
|
{
|
|
87,
|
|
"6A3A01EA24AE603A99613B63596360748386C8F33EDAD3AD33C5620DBB58FE81B76B960A28C8A893F7930F2583AB0431CB15B6D0EA97EE76045FECB2FEE09BE411B8AB827236C67D65C4B548A43999134D4FA3735629CFBF3314EC955194C8BDAE1B6B32635F27427DF0C8103639CBF7301C4C36B896E853C2377C5C155C9DEC611D1B6BBABB6777B6A95DA79B5456007B30CED6BB4547056C7B08B703A774114B036DC081BC896BED96C8F7C8BEC4EC945CB78E21503F04F849C053A9B7E1CA5E080325972FF9310B12B04BFDDA31AEE5C45E7BA024133BE2B7B389D22D3C9AB4CA34A31FA902571ABD0C267DC23157787B368F1352BA6A0F9D04187AD29CDCBC382DCACE8E31869CC2C7A55097AECC218FA68509D289833988EDC26B23B4CE26954A15041465A7287E372CC6213F7988768D105030DACD01B73B5F2145020287ADB92D63DB8D8E16A231618D4DD97851335C68811789428E8A8280519A81A215774B103981614224E35592647823E633E951646A1912721C0AD5BC21DE84734E285653B0858E5B325699B5E31C027B266E7E82C6473072A9E49B0B8C28BCD163ABCC7A3F3251601B4719F2894F1089FBB37F1F760079C6286525551BE7AC73E52926B28FF3F89A663043CC3C5FE2BC0312C3A0E1206583633F0747013C42A541E5CD53142D19D06B7E930CE1F68485D700BFAC9A71977C37A28CB11C703AA04FE533B58F6826ACC1AFBF25CB7B0A7890C427FE7069120315313C0A45C18C2EEA868243B4F46A03622C911A98ABBD7C2EA3305A5237AE76838350EC1512314A7CFB19549283CF2866F3FC3F429168A461034830BC4FCC2A7259BA6A49B256CA9066086A1BFA64712A7E5EF40BCC758B5A600C2717216839BEBEF900EDFBA4126C89047328A9849E80A596FA930D666099A9978085508F9AE8CD1A1325B4082457045A923410C84A0EF382BEA75420883C4E3E43183E8B9BB02A7030051526055910A835AF9053BFD66B378CB978AAB14B629F88839F3A4A7F985BCFEE440939359C7FF98B668202149045F68418466C45E76517F9F7389A683B47897A608A2F85800F7795BE75799DFD597057FA3F86C84CD52A4140758AE45B51F80262DD56337562A974B942DCD20EA2BC5C52F225DAF5A80BE0AED045A7E812819F646D28B0578D042C8B77C8341B46102BC881A738DDBB43411B43C41813C4C28D75400BAD4902ECE7C899FC7FEEE32C78D70165DBBDD139BA3EB2210EE3C1F6BC2B31C8C73B1A54657346C3D322B243AF797A93E7129B17FBCD3C7B9CE49216472BB6DF1B2F41BA4EC3813EE6DB3898F19643C38FFAF3880101B08DE8370ABAA82D91BFDE31B8F78CB85474A3BF06844A233E65884303CABDD1BB52F23C01512871A6FB50DCD3A2417140DAB019A11BC10176C5C83BB138CC2BB45369FB74995613CCF71426CC45536586A9ECEB63877494C4789E62B33BE19B87AC40357DE584F11B236E389B26A5578232478E56B798FA77E6366EC15046B38B4BEE0255FB6AC0B8B928F9F3849417B7C76A396D0B58DE16C709E58D5C523DCB6C7EF74C60960886926B4F5B472A7D2B419DB06592691B0F7299EE970B8ECA7F74B1258AD17C087C8EA0F1AA37C40C631CFC95ABCC465F6315C54C7531FF559F19B952406FF1BE2C2C",
|
|
"DD30BACFE52565345BDB2157888B5694438242E2A2792B5E3696C516F8AD1D893DA3FA1907ABC9F0E627866C30B1BCB4887C7291D0381F2976C690ACFA571184112F11251E38C61DE8E727198515FF2696BC8002000D0C1AD542360652EBBA33F5F8A037F50E146400BF12247B73A7045369272753B2DB9A5B13614CA446634B9513D3A050C155E879537CEC6E93634B3DC067DEDB1A6A378DC9674AF3F09A6726B346F5A1EE069C1356626D7126380745C7B065D5528735B36355A8260F3216DED3CDB1F6780B8BBFA409B67A266F097429C0E808D1F2479617AF9A05712E7731298455611A66C2584C8888B691F23B574A463FA8CDAD2802CB14BF83AA31D5D946ED55097A24CA024696148A3126DB4E69AB82EDC9024C4734FE182E45E8766732750ED443726A578E39484A90721A28CBB0E03DD72931405516F53001D57C4CA4EA2E171CC27AD896F2A8C6A5877C5338374DAC8DF4D762C1D97BC735430B33CF62BBC2D0A0A3FA8401B54C0BB77A46FFE5AD73FC2A5D285A1137052ED028DB79988A4323D0F8105C58AD9FB47BED3A60A8811FA2C55B187AC7DADCC42AC09B2EEA3609A06A68EB47B28025419B9C702BCAF06C38C86C7640629C89D7A486990D62433A66327A687A4CCCFBBEF4C0947966C991573592B78E54E7ABD5A9CD17D6930933936E049121C568CC013D415C23CBB2125F5A3B1FF58FA795B4E16B8C44A94FFCC344D035BDEDC45698A2A205414416A49F4E2A06281C9D254462C070AA8B7974180B3FAF81A7257034B7752EA315A1F4DC64418470EFBA37B228C0E5826C40D31519865D0DD07004B21B0D57872FBA2A00245C2702CF2C8AB91C5A5AF8F40614FBB1279C66C4F2405B4221EDBB8B35FC5EB65707559A29A04939C5990633680771D76E302616DA2A5384D875E5F2C3ACD4C96FA74CF88090B22540478161BBC14B8B6121607239056022EA3947EF661D72B12227889C2E1C266A7A60C014BE19E0328817104027475CBC78CE2C85012017EDDC0F7CEA11C8EA72AD3338498292BEEA4B8A7129D71B1927FAC2A6921DFB87C425F9CCBDE2BDD01C685E3CAE52425070C5C00EC8745FA538E4F96F72D89214E042F19734D7E57952D0833C72276CC93D9991A1AD99AE0CB5886FB83367C967CA65A7AFD022DF404DB0625FBF2C50F0D8812FE2BB1DB4351C7CCA96018A07A6AA62255655A59319AA9A0F130387AC5EB3BA4591A68130523A6D023F57D7801C71BF2237A17FB3590B240FB03037675A56CB85A68EC0C4FBEC98A1C534EAA4C1AFA1B7A012AE871C2EA6B34B3E661A90713C66A0A527676143CAB465205ED21B1E82050343B62CCBF875A2B13D752AA9007426D52661E6E1C42446B7FA632332498B53DC68D780264E1638BE1B24C6323BFF427030130A3091772988789CFC65369C98CF6A6BCFDC99CB477D0D120531C8AF46613228CC687DB38E984C269FA225E61B4B5EDC4246849CE2578BC7519881055D00295DFB560152F435E7A800F5E2BF2299A2BEBA0F0EA63D2B3550AAE2518EE80948E9961BB74D5B5B8C65C2C7C2229158B017B9250B2200809C8466387831C08B791FCA10D2DB3800429B35279310403566934BABE1776A3A01EA24AE603A99613B63596360748386C8F33EDAD3AD33C5620DBB58FE81B76B960A28C8A893F7930F2583AB0431CB15B6D0EA97EE76045FECB2FEE09BE411B8AB827236C67D65C4B548A43999134D4FA3735629CFBF3314EC955194C8BDAE1B6B32635F27427DF0C8103639CBF7301C4C36B896E853C2377C5C155C9DEC611D1B6BBABB6777B6A95DA79B5456007B30CED6BB4547056C7B08B703A774114B036DC081BC896BED96C8F7C8BEC4EC945CB78E21503F04F849C053A9B7E1CA5E080325972FF9310B12B04BFDDA31AEE5C45E7BA024133BE2B7B389D22D3C9AB4CA34A31FA902571ABD0C267DC23157787B368F1352BA6A0F9D04187AD29CDCBC382DCACE8E31869CC2C7A55097AECC218FA68509D289833988EDC26B23B4CE26954A15041465A7287E372CC6213F7988768D105030DACD01B73B5F2145020287ADB92D63DB8D8E16A231618D4DD97851335C68811789428E8A8280519A81A215774B103981614224E35592647823E633E951646A1912721C0AD5BC21DE84734E285653B0858E5B325699B5E31C027B266E7E82C6473072A9E49B0B8C28BCD163ABCC7A3F3251601B4719F2894F1089FBB37F1F760079C6286525551BE7AC73E52926B28FF3F89A663043CC3C5FE2BC0312C3A0E1206583633F0747013C42A541E5CD53142D19D06B7E930CE1F68485D700BFAC9A71977C37A28CB11C703AA04FE533B58F6826ACC1AFBF25CB7B0A7890C427FE7069120315313C0A45C18C2EEA868243B4F46A03622C911A98ABBD7C2EA3305A5237AE76838350EC1512314A7CFB19549283CF2866F3FC3F429168A461034830BC4FCC2A7259BA6A49B256CA9066086A1BFA64712A7E5EF40BCC758B5A600C2717216839BEBEF900EDFBA4126C89047328A9849E80A596FA930D666099A9978085508F9AE8CD1A1325B4082457045A923410C84A0EF382BEA75420883C4E3E43183E8B9BB02A7030051526055910A835AF9053BFD66B378CB978AAB14B629F88839F3A4A7F985BCFEE440939359C7FF98B668202149045F68418466C45E76517F9F7389A683B47897A608A2F85800F7795BE75799DFD597057FA3F86C84CD52A4140758AE45B51F80262DD56337562A974B942DCD20EA2BC5C52F225DAF5A80BE0AED045A7E812819F646D28B0578D042C8B77C8341B46102BC881A738DDBB43411B43C41813C4C28D75400BAD4902ECE7C899FC7FEEE32C78D70165DBBDD139BA3EB2210EE3C1F6BC2B31C8C73B1A54657346C3D322B243AF797A93E7129B17FBCD3C7B9CE49216472BB6DF1B2F41BA4EC3813EE6DB3898F19643C38FFAF3880101B08DE8370ABAA82D91BFDE31B8F78CB85474A3BF06844A233E65884303CABDD1BB52F23C01512871A6FB50DCD3A2417140DAB019A11BC10176C5C83BB138CC2BB45369FB74995613CCF71426CC45536586A9ECEB63877494C4789E62B33BE19B87AC40357DE584F11B236E389B26A5578232478E56B798FA77E6366EC15046B38B4BEE0255FB6AC0B8B928F9F3849417B7C76A396D0B58DE16C709E58D5C523DCB6C7EF74C60960886926B4F5B472A7D2B419DB06592691B0F7299EE970B8ECA7F74B1258AD17C087C8EA0F1AA37C40C631CFC95ABCC465F6315C54C7531FF559F19B952406FF1BE2C2C55A5817F1A9B11AAEC3112029860E6400D99E57DF796A8B775C8C5060D4C3DF45BA1405A293656507D39C8FC3990BD23E6735715792EFF440A9BEC79C7F5FDE9",
|
|
"690D3DA51B1D22BA09AA62B4FD6EADFB4C587C34FC434C62225B9D132DEDFA5774B4ADFA213EDB328DFD6056CEE8F96EC1454C85F8037021F22879FF0BD7FE1386BF272021522F774F10C4C9F7A53E18E3A7023DEA1C3BC8BC76EA8FCD2BE2442A655F2E34F3F102919B4C336B177B038A0CDE0A2A49787E89AB005999F1AC733A04B867D557AFEC7502368CF8DED96CDA58FD0C0426767AC2EDF808F8A03B45D72B30D354C9792FEF5213E7928399F09E2DE540F4826ED72F86C02637738ACF28B28CBC8D45D5A7A0F4AC5A1B7CDA2FE6AE3872C6985E61E259311D5201A540B4351DA0E794F3BBAAB916E2603633741A7878BF61B3B344715D6DCD614ECDE5EDEDAB3DCF4DB03582CF12B764179ED88FCF5FDB0A550522468E04A5FCB297EA78C1DC6DB4CB868F7B1D0B195A16CADB15C28DFE7D2ACD9C2399B6461ED22D000F3368E88BF12F32BFE6B749B4665978C297314DB35122C7D04738E38F7B4CD8246FD36B93624CDC7F0BB10FB482479EF1E1FFB2F85094C9806D160467832D604FF7945CE2D6BCDF15802BC2CECB90FA3F109987BBB377B4E0B092B64F712E3605B3B11E3377453538EB28406243C9C182858650F70CA9AAE1B8E00E3699D2C47038F2AF7076CA6C2330542FE680D79C463F60F80192F85F6BFA0AD455712840F0E25DFDE29CB98A68FD2EB4DAE3C536967D5C4615788AD70A5451ACC78A5419979EB35F83E2DEC8A9EF3DF19A73225832FC6EF76A19159E38DE1BD15B6931F4D47C25024AB2DFB0A800EDB9E070E1FB3628B8236AD227AC3F6603F1866C4CFD669F992C50C06C1986868330C4889B3A9F77DEBC702F3A6337A549B1F51FFBB7201B04287DFA6BF3144160DED6206B5AA1F9A03CC0D56FC53EE55C8CD9A23344BCFBE1439904A3FE6A225D3DC16BF0BDE2B53F90CC0064C4A7DA29E93A84585161D6B367063DF1AD2639E94F0F61455225AA72C294936293831B7F221D209D30317FE4D68507822BF667C8175F23ACDB14000715D26AB3303C46D2E9741F03A73C5FF80B50E2750744D747E295A6DC2D6B9C5D12F0D711267F46E61D25388A5AD57F8ED0EF9CF99311A6A14D0EC5AA5BD8046755921930406B786BB015F4C5B1326650CF8A6EA2FFA758C4F3250F235CF4A824807BFF10BF54910A610B1361B156980ABDE86D087FA133CABE34FC5EED86C3332B86A84742ABF33144B8B08E3E22C845A5E0C2ABD786DA7A7E01DEE4558365857B384CC3F398D74E157CCDBEBF8ABA82AB7804303ED27E280BF68AC3122F6881B3F75C0F5BBB69F6C02C4712FF8B9D1822686CBC441A4C81BB54DF79C90E32A2C5464C0453954DE231AA0D01A0FBB868B4467D1AB6035A9F0C85C1C4016F586B7B6E653689331949380A00CC8ABBB265089606F65E324FEE9AF4CDF02B1F6685AFAA05E2DC9AA17AF7E8131D1F1E3D2FFDB9592C9C57CCDD619274D547FE2285A8989DE7926C654DCAED5613CB4DD4A2E0BBF9BAA7DA1A0F7628C924927EC3C339A38E73C219CC79EDB4904F97",
|
|
"8B6AA77088CC998C2E6B42ACA57DBF3FAB786DFF66ACB017B2ACB48FDBC73D07",
|
|
false,
|
|
},
|
|
{
|
|
89,
|
|
"BE0412D99A23CB207074F8A203A4421678ACFA3A225FA5C560055E8D380187EC6845DA3BD3611FD6E917DEE3CF2830C52C026BBA8A6A31578B942484F0079E88B2AC05D7C453D73D3716BEE80C698A323D2D5331B046B86AE007AD40CCE3927A75F4894432C7D235B4B6610A792920D5F0CBEA389235784EA91BA02BFBA238A79FA2ACB6B2A91DBA4BCD0678796D0BB4357B4BDD849762F4A7CBC69D163C7874C9ADC92B01EAE8AE616461CC89ADF41C415E484B94BA43FCE7AF7B520A598B35429809C109CD7C048B9C67C70124B597C1979A7A31B7156CEEF849C720B39406A32D1B639D18A1D0E462699181B9523FFF361AC995BF1127A4E5046C32F1A1E102CDFC431B060975A7437EB765BFE9A486CE6A52E3E33CEA47766EAA9BAFC819F248B0520313EDEB524CC6BE7771C75E96AA1096507CB18E9B101CBC21132A7337D78C0684E07C3AB8260E2070A3825EBC625F8851CC3E653011DB01DB07CC6B350A68652E31AB630FD373B75A1099A72C35441B9B6127B99469F95B503C663C9B3634A212936B3023FB4B50E8186619B00925639F52453979DB24D2B8CAACD61094D1B14C9597DF53339105C1A6D89BD6D626BD6C5D0E1BABF903CA8B4B48420A137B729A2EBAB17FB434EE258EA5F4CF9B9B1F58E85E343292981C0D02C4003F52B2F37CB3E7CA65AEB8A7F2EAC05634457581A9ECDC487223691263B696F8BD1D685770256AEA5A94DB60AE05A501835848E2F8CE8BD7CF5D1365E6120E18D456366B19E9F1ADE4C552050A02CEA89B8F99BF89B36C08232E13F79A25310934E23FA4ACA724761E12B32322F2744D93A6E4B0997B019C6857952369035F284D60D70581C593BF4B5749987B2E569941860E1619AD1D524469E987B7261F2274739699935291656D114525400984865B91895EC6C39EC54925BE2581D24A62D7B2785C2C697FD61C14C28D1A9568C9C331E3D749BA6597D9BC94CF391A7E3AA57C52C7ACBA8A6A85941BDC59CF57CA46336B25FB9BA93CCF8719A0057969A764399EF2CC3A81AA1C4534E195151389432BB43EC54A2DB2DAAEE068921A6A275333AF3A66C22E924C9CCBCD298663D6C4048BB09E8785387F8A291B3C15E72CAC44C6360EAB290F633FAAF4B023D000B03371EC885EBEE4684ED39A3BD03A390A0F7FC72F5E9B8574A23098404E7F4620C7A8411370B2AD8813DCC91011670FD3A29C088303725CB2425C783AE71539C75F96C1B1B395BD936C118B0BCA994627F32A6B53A187884453CAC606C39B81937670FA915A36F44FDF00D0AF0CBABA707A9FCC3672123D4EDBC1E7F30692400CE8E83E198A5CB692CED4363D7781095E12961BD27AFE1948C8F7259E336A2531082A2978C72BC67AD30BCA086C51A7BCD57B7B15F64E332C1F91AB6015105893917102530459C218DEEB58F5DC9DA5262B7D8A3159B43154F8597E5C57CF37400A2C560081B098DC2C20F6B5CCECC6BCF5B96184B0F7475076317C2EE5482ED83FE058108F762958E610041963937930C3AA3E6985423A33A07E77613F7236F0D9911AF49344A15D77C02A68F19C661704EF515871659F050251BF4CA9074A1A2B1A028FCB92E8053DFCAA319334C6443FDC1F8EADE4EF0C36949A1D36B440747C8D27DEF2FE62C033D6C17CBCC8C6",
|
|
"A7F68B43898F7383B09F0C6EE0D97377D454D528132DA90AC55819A461B58424BB95C7C00A246F04F8B03D3C9D62389AC2B45DD6D43F32072C86E03812909650C52A0104A42696C5E1F389EE4A8775A9A063737A5AB41D8C0C0B8C49C822D7351C1A63BE677D49018CF18311775926746520D650C1C31C0BDB6B570C96BA6B06915815C0FCF6B32F583E80C2B7A84B805ACA39F676426A463E59D6C904042761833CD4C0C0336B00D7E158DC774C5C58BD71458C7C74459682245A03B3C8B8522B7448C3A98432C48495E51E7B401EAA8669707C16F36B72FF21623838B31B496D56B12C0747587325A59509379D2706670C573F85ACA0F426119254D5519D759232C5087B84520F2459148DC6A86184662BC368BC2C83FE0CA7BE156C67C05025A1161BD1380DA39BCA2C99EF727B4DD90D99C21209B573803953129C4DC82A279ACA0A73833C5BE189187546519C2E17EA895CEC1EA7D46594297FF43CBFB7D54466B21F1DD4B72116C10B6198553AA0273CC6F38CA9F9011985012AB4F44C7DC13B00A10F646456D9B29CFDC368FA610C49F1BBF75B5759480A43CACAF99C8BBCB5873CE1CC0D091F6282CB6D1A9FC34459AD0333C88A1C7FA3132DD2B415F809235A101162120CE0BB53C435EED595E01273622CB6A33222477634104A64909A2CA19956D0E0CBDC6A8A611128DF161217856737100205E1B1E9EC844C447E4A4BC538157D5EF37A81F3BFC0F347CF14BD3F75C18F53A777CB0D381B0AECCCABE4005515C911A2C4C7123447DFC93964262FF05A45D969551240BAE60B41ED698AF8E5193BF409862759599C598AC63460F991D47A18A7E7A101964E756603D3A4747A10179CD77FFC1614B5B15D028B7F5794BF7E46B09DF68EEA6744ED117EB241B59095177314194E6C9BFB3049AF1CCE267880E810A855BC5A30177996C22CEBFB58A93331395C52C0809813A2600EB2CE358473DD9A25D8C149F515A5CE10335E0A716D1A09AA817ED6959E18B79ABA93A7CA25562E458A294B767AC5BC860756E2393DAF0507F185C7DE839D2E70885885973B561A660A8E497C0999F99D6C7C66AFA2C1A098A5088685F330969B3526D09758CC8964E3B543DDA6177312507730AEB98C3EA4E4C9478499DD676D2634A7BD69BC2FF8CAEC434BE2F58428334B4014255C4654BCC3A46B737E486C424DC019EF071FDFC817AB7B35362313D7787C73EA9B411CBABB5526441999C6E9ACDBD581987A4A88A421FBF42691A36629A37E7ACA126A7BC68A9BBDCF270F2EFC8E12C328B39A6C80D24496931C012769559A8042F0C2B81158AD77493949987295947AB5CA8EB13B2D668990291CCDD0703FC046C38301CFC350EAB92B9307A685D9BC43E4105F8BB286745E60A4A37E6966F2F7B558F8427DC17A122143C12271A276A0C6D28FF8410C236B68C8CC75D46B403F430716192A47FC7A8BC2CD11528870F7A5AB52A752609D42A05250538E1CC07B4E278CF2977D14F9BB1BA701D771915ED65903BB5CDBC5C1FCFA1D4B04A43AA4B48D946A5B124E3789AF2C34BBAD31A17839653E849E2B917230824887193568FAAC42F533CDF4B31009950EDB065CDC498536A3101876BE0412D99A23CB207074F8A203A4421678ACFA3A225FA5C560055E8D380187EC6845DA3BD3611FD6E917DEE3CF2830C52C026BBA8A6A31578B942484F0079E88B2AC05D7C453D73D3716BEE80C698A323D2D5331B046B86AE007AD40CCE3927A75F4894432C7D235B4B6610A792920D5F0CBEA389235784EA91BA02BFBA238A79FA2ACB6B2A91DBA4BCD0678796D0BB4357B4BDD849762F4A7CBC69D163C7874C9ADC92B01EAE8AE616461CC89ADF41C415E484B94BA43FCE7AF7B520A598B35429809C109CD7C048B9C67C70124B597C1979A7A31B7156CEEF849C720B39406A32D1B639D18A1D0E462699181B9523FFF361AC995BF1127A4E5046C32F1A1E102CDFC431B060975A7437EB765BFE9A486CE6A52E3E33CEA47766EAA9BAFC819F248B0520313EDEB524CC6BE7771C75E96AA1096507CB18E9B101CBC21132A7337D78C0684E07C3AB8260E2070A3825EBC625F8851CC3E653011DB01DB07CC6B350A68652E31AB630FD373B75A1099A72C35441B9B6127B99469F95B503C663C9B3634A212936B3023FB4B50E8186619B00925639F52453979DB24D2B8CAACD61094D1B14C9597DF53339105C1A6D89BD6D626BD6C5D0E1BABF903CA8B4B48420A137B729A2EBAB17FB434EE258EA5F4CF9B9B1F58E85E343292981C0D02C4003F52B2F37CB3E7CA65AEB8A7F2EAC05634457581A9ECDC487223691263B696F8BD1D685770256AEA5A94DB60AE05A501835848E2F8CE8BD7CF5D1365E6120E18D456366B19E9F1ADE4C552050A02CEA89B8F99BF89B36C08232E13F79A25310934E23FA4ACA724761E12B32322F2744D93A6E4B0997B019C6857952369035F284D60D70581C593BF4B5749987B2E569941860E1619AD1D524469E987B7261F2274739699935291656D114525400984865B91895EC6C39EC54925BE2581D24A62D7B2785C2C697FD61C14C28D1A9568C9C331E3D749BA6597D9BC94CF391A7E3AA57C52C7ACBA8A6A85941BDC59CF57CA46336B25FB9BA93CCF8719A0057969A764399EF2CC3A81AA1C4534E195151389432BB43EC54A2DB2DAAEE068921A6A275333AF3A66C22E924C9CCBCD298663D6C4048BB09E8785387F8A291B3C15E72CAC44C6360EAB290F633FAAF4B023D000B03371EC885EBEE4684ED39A3BD03A390A0F7FC72F5E9B8574A23098404E7F4620C7A8411370B2AD8813DCC91011670FD3A29C088303725CB2425C783AE71539C75F96C1B1B395BD936C118B0BCA994627F32A6B53A187884453CAC606C39B81937670FA915A36F44FDF00D0AF0CBABA707A9FCC3672123D4EDBC1E7F30692400CE8E83E198A5CB692CED4363D7781095E12961BD27AFE1948C8F7259E336A2531082A2978C72BC67AD30BCA086C51A7BCD57B7B15F64E332C1F91AB6015105893917102530459C218DEEB58F5DC9DA5262B7D8A3159B43154F8597E5C57CF37400A2C560081B098DC2C20F6B5CCECC6BCF5B96184B0F7475076317C2EE5482ED83FE058108F762958E610041963937930C3AA3E6985423A33A07E77613F7236F0D9911AF49344A15D77C02A68F19C661704EF515871659F050251BF4CA9074A1A2B1A028FCB92E8053DFCAA319334C6443FDC1F8EADE4EF0C36949A1D36B440747C8D27DEF2FE62C033D6C17CBCC8C60DF10A55B73E721350FF5FFDF8C9717103B3F242F12FCF292DE0CE75194E2E59678218BE4EAA47762D1ABE76C755C76249BC0DEA1C5C1625531BD1F86FA0AFDA",
|
|
"6C69EB30D9636EBA9EE14BC92EE730720D39E189AE3ABD96367580845A82F27C6C85F7135BC2471553CF1B0E0F092D87AEE9AE24649D6BC910A6C6B432F20993E562C5A1777BD801A7F1C05FD3A9E8DF57A187CF2637F99C6E24B5DCEAA64DB892796803DE9C1B6EB9E297440F7051D668F4781764F84CE499D6E7F6E4086C1F9B862260630E1B3E6C4BE52EC4FD99670A345659E4D865E5DBFD19D6412B4C9D31003D36EB9A1DE2ECD3A495B9E5A44D51BF85610EA867C9F4F1F09E10667A4919207628B2FD91330BADFD44CF491CADA6FA9AECDE5E20CE8AECC2986647F2656869E6201D851AC8176D98DCADC5ABD396B0C4B468871D0EB9332C264AC7550CBA62F77655110C4D15DA73A641F67A7821D7C7EA81CD4DD1BEFC5CC056883E74EB8DC985CA193ABEB30865A59C86167DFB51F96891D604577572D61623950D5CBC20F2752E6C65662950F7D69C4E6D883830326539DBEE1A1E683D74E1B261AD1D825D57FABC3512A405B172BE7AC22479E4D2F834009337726751CA617A95A6E915E50755FD644D600AB670EEB5F1CF097CC521A7EFE8A712E52FC91634EF0A3B87B91370444661674D9F1D0766DE59CEDC70CE0E78EC062F7A50DFA575897BB4A758FC7D49A92C6CDCA5020C0408A7830106529CCD6CBED34B0D5CA2AB68F27CA869ACCFF363BD546CD6EB6ED3589BBAE0D7E3101C71D63220140CE0146DC2A038B4C32749A4B99C3D9666688582984FBCC82F79FEF746180D05B8574FC42BE26E35961E01F2EB634CAC23BDA5D798C7264223524A040C9EF7D42673C7F6B0F2611467580EAAD9FFCAE0291962A98EC23C7351D620EA02723A6493E6354ABE0373FBC77DCDD022025F8C7F94C3476A0E400AA7414F6E50584E14B7DE84968F47083CB228924551191FA1031FEE39CF9A0494A18E34FE269F980A15594A6F68499FB01BCED9DAD187DB29842D928755F618D08B3F44A243257D7EBECADE361D47758A3E3B6E06601E4F409D2208F36397300978FE8173082851DEC328325BA05676848B9198E46966EEFDE2DC72417841E82F9848FFF6BE528F147648F881CF9718E6B1F7E0E20C6A1B37C5EED42DC6B982CB2232802CB71E83123DB105E6DD068BCBBDFA964C9955B2D93B7776EEBA03C5650C631D8F05AD84AD7D8190ACFFBA4977607AB8CB19788BDC7323A7A1D91B7AF8BE6A4386ADB47BEA4B4D93C01665CD605D5677B9A2B75A7BEE386FB1DABA09ED209915616BC544167B97C9E23DE77B757D5B98E63CCA9051B6D882313B4477D10B04128E6FBA7E1EAE23FBFB64C8D091EE233FCDEE91A0EA195CE511C3DF4B24C17B9D36389EF5CEB3BEE6D9A50ED35E3BB72E95040851A4AD2910CE6EC35A17AD1715DA7BD121190876203457836838B0415A53F62F9A6C4CB2B1B8E811FD78023FB5A119214D192B813E9B82B82574D36A5DFB1EA9A03D20ED2DF12A04944FB9BA283E0B290BA7370B5098A328AA70A1455CF166EC6A6DDC0704FCDE258E1F7363B4A46B4AD1B6E749D7CB8F",
|
|
"F5D303C2E38227359BA4A64727A9424DE88D41EEC961697385529C4587980D62",
|
|
true,
|
|
},
|
|
{
|
|
90,
|
|
"83E76806808ACAAA120286650F965DEDBC6E00E13563B5547A345981FBB177A6CD6598B358F56C3B272AA2106FC8901FEC0633391BA78DD344D17A219C3AA103A8B078BB3451D690D81AB22B858231850672A92270D95209F01123E6620B043F8B64ABF9252087365E51B8789B76995EE0098CB2AAEEA6760935A9390746EAD04270B91CB08B87ED1905335895D766CB8D229AE939A154A0680C583FD2D0CD71009D8D26A9B6F90C5A463125BC63ED2165BBC12AFD5866518110C4E809CED8932F5149EEA59FE806091906CE6D53AAD7045A69A74540C738B4E948FB470073D35DC6A536475AC8A037A1DB842D742A2D2A41C708C9125EA746D309981B51719CB31A7BA412DD11AD1C1C33C7810F016498EDBA6938D00BE7902E20AC9EFAC7C8E0A22FA5EA711B0ABBA13BBE5138A11244B81AE04C65987B7A5428430980BE57575881260B1780DAF3086C94AEDD0295A793414552B2168300A5A9B077F82FB8A2B697C7CAD06078184896C0D87BD5F8A6A967266E051A2E984B335A88D59285D06775B7F25C48F431A735BC9837AF8383365D8CC06052416B826B3A888314696B7CF67F20C2345CF1113A666A1A63B878610D24744FFD9B8F8A889F3E065ECE25827E137E33E56956FC60CC2423CC6AB8F272AF00179D98E014BE1A2D6DB202399B272CC33AFB2B0F1F502636CB1CB74279D66884F0169E2FE334F268ABDCA372B36084A784B34AD0998BD742263B2119C65527F61C11816724D577B1E77A911A5D9C005F10106A7E8C6292716E27B55EDA339A7A88C62AE166FC324BCB8529C4115969E1C28237977D70C950B31C50D036B0B5584273CCF9B87250666365029F3287429C69943E488C053240B2707EF6CA58D8C840766250853A4BDB938A258B004F0705F0DA8D2D97C753884319D7A2CBBCB357DBCC1134039D205BFDA3306F61C4E28C1271112353B827A2A98996135DBD76B04D4545DDD4B111184B2A787B326A3C0466159114A9BF6C801780BAABFBB578096B73245B3EAA17161530DA777306BA614AEC5D60376288AC7F0E66A4989B93920C37F18A2F91F045DA13A2E7777FB3922A48E9211962A4E9A47BFE467B707091AF86BF8CEB111EFC9745BAA22300C447C28181721AC8A7B51C9470A8F999B7E2268ADC327C160A3F42CCA0C9094DFB65BBAA5CB0153F85225E5C83AEAC55932F19B6A9E077E2BCA1E0221EF4191DD53940063799BEE5B0A5336B6D8324A1A6AC5A865071CAC33C6930974C0A54675BE7392B8227C09EB59706442618F68FCF5977D19C06B5EC6AB8D5C3F5712B96F20ED16A1E170B40219B003A5A453E5B58AB92A786FCAFAE855D3FA66724125D069251CD04277CB1B2065728E7B4437A9954CF711616C25156353194D336F75080BD706ADFFC51D1F7163662B0F84B625226249D15CF7C33206F5249E7325548149421620852F2BECEC6BA28476935BB0F27E181E9508B9838A51DC68EBC70653ED8B5E2D68DD9895F5223A418C49951B5CCCA8494D86AB2E6D773FBB55884E2AC16DC9418100A774548E4A95AF4265772E9A3A082CED78AB81CF15DCC1C24F7D4889CC606A137B29C31A1BDAC4FB050ACB1D28D9C07B3D9973DB9A763044A6F13AF75A46DC7D480380940F9D688DE684BDF867C21EF4BDBF50908DB04",
|
|
"37782D0B89341726615D95246DA633E2BCA9D71B477B77150CACB7BB5A0ED4565644A2565EBBC4AD742AC5718F3A63518D3818A3FC31DC5552EE033522622AB75027BCC39C741B3524E51A26D12C02628BC363AA0D908330B356A412911BDB8042768FACE36B02E5126DEB6592590AC5D867EF937A2BDC3A74930C183411342AB5D0E77031859F3877A1E71B9C50200EFA04730D5A223760A62BD4B1F0615A0EA902492404523AC1F485253CC10BAB97503808C565808DEB9B3176532975638923678002E232AD68666539407AE1CEF8129702C8B58E69060DB422C49B67426214F7DB20C2FC857F52B174D6C93BE90B4A58811EE27E453382E12918652CA9F0313A8BECB7D8D7C9EC4830142539BDD92582D00234503D6FD8CE12F806A5381232D6BF0F0391EF8A1B288038FCAA98956C546AF47327009CA65326521A553F2A4E3983B052B3420D20303D378C6AF110B3451CCD5A4AE4AA83F7B2C20BC27542318690FBB2F542A3A51930E04B9FB6109C15F72B825656586C8B76F54F5382ABFE34CF91471922C9BD2D600003156C621579A0C61626A7C2D0BB7AFF95863A89C3D4722916397601630DE0E158AA9B5974A95107E0ABB6A66308123241275613C210495CAD017202508464847B4BE8792D4DC9017BD94FCE873A30C0A587A16CC7941413785AB6969CC90C47235847AD4CB1769835F195871712AA467C5DF1B30D06BB907C6519CA4AA3DC9884262339D4441C078049995BAD49FB8FD95219EA3CCF17C17F97213AD862710A60CAED990D5CF01919764218D672D9B5050AF0524A7AC67B8A38A4FA5C755050F9431584970BF6775F2609559F3807FBCA6EB67B9C67F6B0A0B4B527D563BEB415AC4989473758E31BBDC8F517911B1E431B88B7E871EA33A052FB1D2536032C561DDEB6526E652E1DF338E9C179539C891421AAF6067F550052140B89E5942E42337A1DB8CC3D88760A1498D5F407497925238A79A0B469FB2BBA70D93195F4017E0008FCC65D0635C9FDBB74EC4C4C50455E1E5B893D03764861964A9C3703FBC6A6FA557D34AA5C352D67C370DE7608E83670A48692FEB4CA17B842BCC8AAC7B0AA4546A607157DD2529182703E8AF6818E836635C428E136BDEED6678F962B1CE847D993B5F7B57370390B74261909A3963264A21DD4886A812A44CA2CB82A06EBD7C1280CA993F542EB36CB656A140471195A56C750073906B6115DC17A93E79D7E6037883349EF3B0469E984B8D63BA932BC592A09643B7C675567B676B25E46AEBC61265872CE01F61F75E4AA086B82B2F51364C3065CD880078933F606B114DACEB97AC9B535115F8166B5E9C1E23C1BD6406534A0209DC96063632682185E8E8C6B86FA3B073AA765718C8E42BBCCC16D1137270374C12A076295B0B61060341148BD64BB5553D2AE933274A034CE5CD62DE96118947877A934A28AF22F5F3410722C22B4839DC72AC2DD8222FCFB918A81ABB2422B30313484292695478F521396114A8FF0FBCCFE94A028743A7FC34EB9DBAD283C891E6A18765812FFB658EA58842BBB1232EAABDB332BA111BE36100745A842F8F3B19809C2E3C554BA3B312042C17F298FE7C1910E6774B934C283E76806808ACAAA120286650F965DEDBC6E00E13563B5547A345981FBB177A6CD6598B358F56C3B272AA2106FC8901FEC0633391BA78DD344D17A219C3AA103A8B078BB3451D690D81AB22B858231850672A92270D95209F01123E6620B043F8B64ABF9252087365E51B8789B76995EE0098CB2AAEEA6760935A9390746EAD04270B91CB08B87ED1905335895D766CB8D229AE939A154A0680C583FD2D0CD71009D8D26A9B6F90C5A463125BC63ED2165BBC12AFD5866518110C4E809CED8932F5149EEA59FE806091906CE6D53AAD7045A69A74540C738B4E948FB470073D35DC6A536475AC8A037A1DB842D742A2D2A41C708C9125EA746D309981B51719CB31A7BA412DD11AD1C1C33C7810F016498EDBA6938D00BE7902E20AC9EFAC7C8E0A22FA5EA711B0ABBA13BBE5138A11244B81AE04C65987B7A5428430980BE57575881260B1780DAF3086C94AEDD0295A793414552B2168300A5A9B077F82FB8A2B697C7CAD06078184896C0D87BD5F8A6A967266E051A2E984B335A88D59285D06775B7F25C48F431A735BC9837AF8383365D8CC06052416B826B3A888314696B7CF67F20C2345CF1113A666A1A63B878610D24744FFD9B8F8A889F3E065ECE25827E137E33E56956FC60CC2423CC6AB8F272AF00179D98E014BE1A2D6DB202399B272CC33AFB2B0F1F502636CB1CB74279D66884F0169E2FE334F268ABDCA372B36084A784B34AD0998BD742263B2119C65527F61C11816724D577B1E77A911A5D9C005F10106A7E8C6292716E27B55EDA339A7A88C62AE166FC324BCB8529C4115969E1C28237977D70C950B31C50D036B0B5584273CCF9B87250666365029F3287429C69943E488C053240B2707EF6CA58D8C840766250853A4BDB938A258B004F0705F0DA8D2D97C753884319D7A2CBBCB357DBCC1134039D205BFDA3306F61C4E28C1271112353B827A2A98996135DBD76B04D4545DDD4B111184B2A787B326A3C0466159114A9BF6C801780BAABFBB578096B73245B3EAA17161530DA777306BA614AEC5D60376288AC7F0E66A4989B93920C37F18A2F91F045DA13A2E7777FB3922A48E9211962A4E9A47BFE467B707091AF86BF8CEB111EFC9745BAA22300C447C28181721AC8A7B51C9470A8F999B7E2268ADC327C160A3F42CCA0C9094DFB65BBAA5CB0153F85225E5C83AEAC55932F19B6A9E077E2BCA1E0221EF4191DD53940063799BEE5B0A5336B6D8324A1A6AC5A865071CAC33C6930974C0A54675BE7392B8227C09EB59706442618F68FCF5977D19C06B5EC6AB8D5C3F5712B96F20ED16A1E170B40219B003A5A453E5B58AB92A786FCAFAE855D3FA66724125D069251CD04277CB1B2065728E7B4437A9954CF711616C25156353194D336F75080BD706ADFFC51D1F7163662B0F84B625226249D15CF7C33206F5249E7325548149421620852F2BECEC6BA28476935BB0F27E181E9508B9838A51DC68EBC70653ED8B5E2D68DD9895F5223A418C49951B5CCCA8494D86AB2E6D773FBB55884E2AC16DC9418100A774548E4A95AF4265772E9A3A082CED78AB81CF15DCC1C24F7D4889CC606A137B29C31A1BDAC4FB050ACB1D28D9C07B3D9973DB9A763044A6F13AF75A46DC7D480380940F9D688DE684BDF867C21EF4BDBF50908DB04620C3BA3112D18C0B347C5A0CFE56E720693645641009674E2E2F6E5DA0447A798028E8157DBAAFD5B9370227C9D876818A9A4F7D23D9567BF413F3383F8F1AB",
|
|
"F58D542A5D03DD8D622D2D61E9CC759873479DB67359DAB471DE0C6945505EF8EF61734E84EF78D5A36EEA0FE8E6006B0741C415A225834C644AFB29E4CBF207C24F7760024BA27F1BFAB5A9EC712C3A81FC2F232736BA2CA69AA2F9CA7AC17EEB89A193493800951C71812E4E2134680B3BE6FFCE9508C791EB19494D86F9192990D0745AEFED3A83B24A6E7C8C2BA6CB536D2710C49D2C3122D090B95E57C8E1DECDBAD54BF7CC1E76E79448EBAAD77284E35FA03567FC692D2D8E674D7D805899BD00C35615FAC52298BAE7D87C7CAFA3734E95FC8C7EABD0C3224BBDF0F32B61491C1C060DCDD2492516CC4419DAD6AFEF3B96A1504A9F0CE09F1774E607F3E9AC4484F41B7AF8BE402EFB12680AE98B71557562A8C1D3486C5998515D9BF87CD173F5A79BA90EEEDDFF7E0F323D8920C41A80320CCFB2157A0E9148FAFDA7FD68828E5B612B373342872F3FDB0F77F2339D96BB49D2F5E172E0523C04DE0E3C80C89F5640B84FD8B372AFB3319150D7057A9293EA36A53275FC778BE736F468AB4FDDCEF2CB40D42AB8C834B5DC08C1E3B9E7CFEA61373A46595FD2E3DCC164C7B5212F98D3AAD9FE7E08585E0111265ED71F94725E3E4D9873487C407C74B03EE254EC8D9B041D817E6E9D0827626438822595FF14503D0257F04D99352C5BB09DEC0696804260516684308C1B7B60D86A27F724D10080FA4A2B70C90090C9D3DBBB2D681EA2EDF35A73AEB3A77E4338C5631E0842AC53137379E8A653291CDE9CC3421B2417A0C59A1A3E4AF60F455FB01A65E9BCD415B77D6486495D453BA9ED0C79237313D89019FAA1BF89EF849A752389CC2A8D1E677DB68A4E4CD81A2CB9F09E0531C11BB6FCF0FAD67507A86B174F45C033B1988C6B433E9E66CA7CA69A39446FFE2B219C9A9B3CB808C067E781765991665FB40B5780E307B39C370EF01C6000660827D5CAD3E1BBD28BCE05AC0443A2806EFB93CCA9C7ED3C18FA6D58C99C5E6B6AF785636384643BD2E24F6A705012AD7A4D2E6B94CC9908C086F13515C42EFC4CDEFEB2645D106AE385D4014B983DF6A099438954586928D46476A2E70E36147B8F57DC498DC564C62CAB6C00638895D864438E8C3FB075449A7636BAD20A0C8BD433BA1C6B4E3E8E42ABD6AFD23CD6D76A4DEEBF898F699094F1E2EC5E857142C0EC0FE724F040A02CF191D2DDC0A4880D89A0ECAFF00BFD2E26588180EC93B6E3ACE0D45573CBE0B836A9547D12F00BE77B059B0F73FF36827033795F877CD347ABEE7222697440A8EE6F9F9D4747C7DF26C92CAD12747AC6442066CBEEE4B072F5E1809724B462BDD86309A08C96E23D8BDC7006129C41CD1524E9DB13475F8DBB58B9F8EE722FFEFE0628AFD711A1A66CC03F7A1D26A321093179877A1E9CB223CD688F65772C1F550C86FD9025B58F6A1DC9CEC65816EBFB2CB405526F797A500B52EA73AFE592E7A63BE79D6E2ABFE03D528154C0E8D277C844EFA398B346D96F41376FD969356114854C1997D53189404F499165",
|
|
"44CC405E3BB0A9F51A180A86213D036ED58AA0D226804E717B9C2A475DE58E75",
|
|
true,
|
|
},
|
|
}
|
|
|
|
func TestDecapsulate768ACVP(t *testing.T) {
|
|
for i, tc := range decap768InternalProjectionCases {
|
|
//ek, _ := hex.DecodeString(tc.ek)
|
|
dk, _ := hex.DecodeString(tc.dk)
|
|
c, _ := hex.DecodeString(tc.c)
|
|
k, _ := hex.DecodeString(tc.k)
|
|
|
|
dk1, err := NewDecapsulationKey768(dk)
|
|
if err != nil {
|
|
t.Fatalf("case %d: NewDecapsulationKey768: %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 BenchmarkKeyGen768(b *testing.B) {
|
|
var seed [64]byte
|
|
rand.Read(seed[:])
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
if _, err := NewDecapsulationKeyFromSeed768(seed[:]); err != nil {
|
|
b.Fatalf("NewDecapsulationKeyFromSeed768 failed: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
func BenchmarkEncapsulateInternal768(b *testing.B) {
|
|
tc := encap768InternalProjectionCases[0]
|
|
ek, _ := hex.DecodeString(tc.ek)
|
|
m, _ := hex.DecodeString(tc.m)
|
|
ek1, err := NewEncapsulationKey768(ek)
|
|
if err != nil {
|
|
b.Fatalf("NewEncapsulationKey768: %v", err)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
ek1.EncapsulateInternal((*[32]byte)(m))
|
|
}
|
|
}
|
|
|
|
func BenchmarkDecapsulate768(b *testing.B) {
|
|
tc := decap768InternalProjectionCases[0]
|
|
dk, _ := hex.DecodeString(tc.dk)
|
|
c, _ := hex.DecodeString(tc.c)
|
|
|
|
dk1, err := NewDecapsulationKey768(dk)
|
|
if err != nil {
|
|
b.Fatalf("NewDecapsulationKey768: %v", err)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
if _, err := dk1.Decapsulate(c); err != nil {
|
|
b.Fatalf("Decapsulate: %v", err)
|
|
}
|
|
}
|
|
}
|