From dbf6670ab417c45cf228406e63cdc755338cb3ab Mon Sep 17 00:00:00 2001 From: Marcella Hastings Date: Tue, 7 Jan 2025 16:33:53 -0500 Subject: [PATCH] mldsa: add third parameter set and KATs --- .../ML_DSA/Instantiations/ML_DSA_87.cry | 22 ++++ .../Signature/ML_DSA/Tests/ML_DSA_87.cry | 109 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 Primitive/Asymmetric/Signature/ML_DSA/Instantiations/ML_DSA_87.cry create mode 100644 Primitive/Asymmetric/Signature/ML_DSA/Tests/ML_DSA_87.cry diff --git a/Primitive/Asymmetric/Signature/ML_DSA/Instantiations/ML_DSA_87.cry b/Primitive/Asymmetric/Signature/ML_DSA/Instantiations/ML_DSA_87.cry new file mode 100644 index 0000000..eaec03b --- /dev/null +++ b/Primitive/Asymmetric/Signature/ML_DSA/Instantiations/ML_DSA_87.cry @@ -0,0 +1,22 @@ +/** + * Instantiation of the ML-DSA-87 parameter set. + * [FIPS-204] Section 4, Table 1. + * + * This is in security strength category 5. + * + * @copyright Galois Inc + * @author Marcella Hastings + */ +module Primitive::Asymmetric::Signature::ML_DSA::Instantiations::ML_DSA_87 = + Primitive::Asymmetric::Signature::ML_DSA::ML_DSA where + + type q = 8380417 + type τ = 60 + type λ = 256 + type γ1 = 2 ^^ 19 + type γ2 = (q - 1) / 32 + type k = 8 + type ell = 7 + type η = 2 + type ω = 75 + diff --git a/Primitive/Asymmetric/Signature/ML_DSA/Tests/ML_DSA_87.cry b/Primitive/Asymmetric/Signature/ML_DSA/Tests/ML_DSA_87.cry new file mode 100644 index 0000000..5d82879 --- /dev/null +++ b/Primitive/Asymmetric/Signature/ML_DSA/Tests/ML_DSA_87.cry @@ -0,0 +1,109 @@ +/** + * Known answer tests for ML_DSA_87. + * + * These can be drawn from several trusted sources, including + * [PQC-KAT]: Kris Kwiatkowski and Roderick Chapman. Post-quantum-cryptography. + * GitHub repo "KAT". + * @see https://github.com/post-quantum-cryptography/KAT + * [ACVP]: NIST. usnistgov. GitHub repo "ACVP-Server". + * @see https://github.com/usnistgov/ACVP-Server/tree/master/gen-val/json-files/ML-DSA-keyGen-FIPS204 + * + * @copyright Galois, Inc + * @author Marcella Hastings + */ +import Primitive::Asymmetric::Signature::ML_DSA::Instantiations::ML_DSA_87 as ML_DSA_87 +import submodule ML_DSA_87::TestAPI as ML_DSA_Raw + +/** + * Test function for running a `keyGen` test vector from [ACVP]. + */ +tryACVPKeyGenKAT seed expected_pk expected_sk = keygenWorks where + (pk, sk) = ML_DSA_Raw::KeyGen_internal seed + keygenWorks = (pk == expected_pk) && (sk == expected_sk) + +/** + * Test the [ACVP] keyGen KAT with `tcID = 51`. + * ```repl + * :prove keyGen51 + * ``` + */ +keyGen51 = tryACVPKeyGenKAT seed pk sk where + seed = split 0x38359FBCD79582CFFE609E137EE2EFE8A8DBCBAD18BA92BB433AB4F09B49299D + pk = split 0x6924BB4257A7B9AFF095C30BB35C6AE4198263120F8039AA4E78E174A786CE008301E666F59D3EC5044DE456788FDE19EB39677B5F9FE14150DA463A706F3BAF715B95336B2D685A7CD7880713E4587BF7D857BF7E315696B8D0D9D49E142918BF0974E7F43237D4BE3AD394599E3D39BB7649932553447E5D5ACC3499930176ECD3A844A425F50D0511C9226C4B9A24F2A011CD88D32308E0312A0C87CC34A995823C65F4F0F98E50C37788CE38DC28FB8B9BFAAFA904B541EE712F6A041E0611374F6BF17EAC0BD56F3B6BF336DA9242070C2469A20C4D1616149A6159252011D299F93F986D875DD30B38A22549174570138C2BB3AA9CBEA91974F3D89BF5AE32BE9E58B854A2F8E86FF76780C03490F467DB0651C20B1DF60EB97A3C99D9BD664BE6A5E4C8A8AD4CC36390D7004E4BB421DAED654C357DA4D68498933EC71777AD64C2AE013C73EB457C68EF9A745ADEEB4FDFC879E774D03FAF6B14AAB10752E24B52D0F2D94D540A1EBE10F597E514442D6C13C2E2498E8AF3017C52DB233A90717DF25B4D072B7D88EE8731D16824C95D1FB983C449DEB466276060FEE4C7EE381451F232C29C7C3220850C61D1C3C00DB1CD9726A02A56609F3A65D3D164604588CD9B431412F1ADD914C5C2DABBC90467C0C4EA5F76E24AA618765F8B0636D7B065E1F4E6F622EAE17152458C766586772D363FA99214F472B0DB8A1E49D82D0278F2958B0AAA1586DB134BDFD2438742495007E2FE5B60E246399226947A12EA17631CAA534687CB75C060B4797EAB8277CC4F8A7A20387606EFE2DBD3E736249277D90FCAB992A8C99E85AB03EB4CAC5D88553958528AF92974718135F1D0C793EB000EA0AEC3EC1858FDD18688D1DA27278DEBF2CA8110BA4A204F7930E1C8CEECAFB73F75DDB34C5C55968A7933058426B55D039F7292AC43F64584F6DF187A1D6B003F514CC13B26C2F348195AA321DE6A27EC11348DE50D825A2964C631992E4B0B425B1BEB4F9600E3ADC4431CF2E88B4223D2DB663C3CE70EF85DDD56A9BAF138A9D7EDD894131C3A8F41A04EF9F86752B72181FABB37C86B877E61D60EED95EEFFABE6376E14ACA817C5F41961AF8A7849BAC094917B2D132276B6B3486AFF950D23D4AADC24CE98A5269E1C69917960A31EE09A527C358175CAA0CB1B018E9526D93534EADBACB52B273D735E22DD0D5C28FA3E47CFE90B5215AE24F146C3464BFEAF01D28DAA553C1E94428A104A9D78AEC762591E8879F76851CFB4648566721B0CAC1F14FE16149A9D8210CC8F2F50DEF7B46C843BE93BD8D55602493350AB560EA5BA17716423BE0EB8360AB109D8FB18BFEA040847B7335145D4F200D19CF6FE7BAC917F426C9B3D39A9CA4329818F240E7DA382761072F4A6505EA8E76C1E446FEB6625E38DDBCD3CDA81E83BF768F3E01D9D263B367303AE156C0B7183364A1E7941A09298A3ADF7BD231E6114B9DCE7952B113F78163138B9266F843F1ED97D9C2B163A6E8BD4C1AB4E179367C5AC96CECF5050FE821FDFA44E9E680B61C6018932DF717811459AF2542E2CDE77178C2E9880F011E405EAFA59C8CBBED76E5A1941104B1B9D3A60491C954755E02E894103F1F4977475E9EA36609FD67C9DE318EDA2370DCCDBB9CEF7AE6360905EC220838C9769823441CDD0DA8EF0ABE5F2D1D76E2FE08FEF53DE1D6166AB1A92B1AC093E5ABF7658C4B57287F2D1FD7B82DEDAF8D5A4FBAC4B35D58231694E162497578ABD7AA7C8FE7B3541A7F18E54E8B7F08764C5E68449DF655901549832D628FA63D2B2C5A150933994A9863317AD40D778D9D2C05C7898850B90173223C7A0AF890FD7E66221B6F06318B2ED5E199CB424885AB841E7A4726FABA2F9BB53BC3236434C35FBBE4B1A0F93F50C37896C29F8E302AD31ED3331D620E3B629455101A1F1CC7BA5E46E68ED4A8CCC87B4DC75BC0162B6330F833FBA2575DFAF5B5F28BC54FF2BA81E7A47313C15482B605E66BB38C6198F1392104080FBE78B86B1BC9A6FB881F5C7820147E6BA14B81ACCF20CAE96641094C216902EA5C125F6C935A150D7C9ACC5D9E2E5D90E38C0503AA9426017C76AAFCD5261B506274EC13A9679FB09796027A4BB759D928279B94D841A097393BF7E5BD69A496CC3DECD2B0F07F83392AADE33DC51B2A84F6A07635DC0EF57A9AD5959B6A50B7BA509AD5B11FAD26B419F9F1E3F9C7329B5A953D7CC87B2DE210611CF52A639EF2B3908012CB88E1D6F57625079CB103D6C98101A11BD2233B65602CA3049BD320520419F76B061E3598DE38152C88767D1A24FBD02BB10C38EACAE317DE6BB287B4D2CAE5DA0214965D8773778626E9B972859D8482B8D0547E4F56DFF87681D5BC5120F613FBBD91E1F14E6DEFE672E2A7EABCBBB9B11082C5E700AA0B1F7C1785FCED19A93AFE7C59FA2519BCDEB494C3D13B2125F385323B816C68F8F5628C7C2ABFD0278A337073DA74D16099698C4B114E8A8CE344E0A15D0FC7ED497B001D53D4C96DC3954D3B4B956CB9D2A272C51F1559B22904B40CC8531E40CC412C68CB6EEA4A4090B38E2797329985467E818A524D3228EACAE7825D3DAD2EAA422FDC77AED71A205DA7838D945E7FEC37E4DCA67E504CE35E5B045F56F1E8D7529EBD6F1AF7B6E939E2B7AB4027D37A5135D172DA1AF9CA2F728A6F37DE60DD23D97D11E75AB1FD51F8E9A1397E5822159DB583802B32EEBB4567ECE3746D1AE33314785643DD2A0741E7F1BF2D261F22124E8DDD08C640A48B54717517C21CD325328BC239CA028B2630D063C8CC20BE9BDB48502DADDE73FFED5963816533E020AED1208536255B1CCE985433127FF4F04D5B1E2F2108704B8B966588C0156AFC2AE192986FBEC443BAEF6CB85A6F29C7792405A24114710AE1C746444FDF5FB659E5E346826207B8C54463A0617CE17FF33E40F931FE576715C932EF29FD76B04A69B58E0303D8EF25678C8B70AF12E9045591C04E8B77106940415177E868593A09C7E14619A4B332F9ADC3A658B86017F32656C5429C115E110037A8CC7E544677D2DD239A59D54D0F3C7460EC15208346BA56DF5086C5DBCC41E0C95FCB6861C2C0C32AAF3454EFEE2FFBA214B430EF248A59B32444D8D0D3DB87C9D4B1536D157728EE7585EF532776A003A023C0AB0E9FF557108C390684D565A665063266AE6670ED53B0FAF8FF67829BB737825B153A9338CBE3DF1A462849B93A81F84ED07BE6D6240003274737F618DCB26E48252CE4204DD3139FF6876F43B305D835620FEDF79AA67433DC25287320E9917967B70B2D866D17B698BFFF2B3AB9514949E58B57C68A45412C1FC421C768BF5EE8A10C8AEF56926F51EC62C11569F31AA517868E5CAD89E958066EB9EDD7271B31CB4B1D6CE211225AEB5B57F749719DA07ECBEFE03881DDE3D81E4135F2DC81AF779776C1B8057162A6C982FBB4DA6A9AD284AB10C70022044F46D400BF6AD7182D197789983BE99227979A1334BA149D869BA1C4088123435BF978541356DAF171F33ADB1C97907A0FB5845074A85D26F546135AED0F91BE4539C12BF9411E4B556F687D069DB6B21FE2B7F321887448CEA55DB19FBB8B0482A55AEC16738D74CD265093836BE99D4FB53E9B014B037CDBFE9 + sk = split 0x6924BB4257A7B9AFF095C30BB35C6AE4198263120F8039AA4E78E174A786CE003B9AC2C1422A1AE802DDD7464D3F32729A3C7DE894D506ACAD25CEB372EA3149C98780DCD1314BAA29B9B807754C47DE5DCA954064F28528B815FE27B79AC506B3AD7629D2C971AB8F282E0C6E7E5548EE0E113242B7A0E064A6DBCE30C5619B19800889A04404B50013C088C1302962124CD3B4910A352C43123119996522185202C38523440D90244A1A30224428618106291897680A200908326A44A44C4490218A16689AA8511AA52C62468D04C340D3862860A46013187084948C63C04404A92820082043162A23292D1AB12948B60921883100C53000C48CD98268E1304C6332450C328618083191980D10B8709B302264040893A48C21C9700C35715B000D143122CC98102104809B28641C308021307118335024254408178CC00848844490489830CA440009195119230C52200E4906321C154E194885132549A3000408156D20410CDA4252C1348C00316943822464946D1C81110196214B0200CA2884CC466451186A181000A4982160B06803946C94485180404692222C23446998264D1C01085202208AA6080A316193400E9CC81181322E21158484C24100227254226258069248484411270404C011928245A1C68CE33266C138725A86010CC99084340858A86080C070D026629B302A04296904108D0BB904504628504824D04805A24802C3208CA014004138214B240104B5494200000C2428124084A220449B069063C0888C14214912105416242087445010850CB564DB2441D042299A168A21B44C13B77010C085190269CC40611C4846980625601446E4226224272262242944C62D08318420322104B4610A3812D92844A40820CCA8290B21310A3429032140C1A26C8A161252A664A3B251042951C4049163B02D1444308C40660C400C01A52C09942D62C61103985019104D19A828D38640C0306554A671E0B4859B8610043669D0462918A371402249004385CB4028893666412269A42851D98029140721DA80911B26505BA0609942715088491023095A902122278E43B2700CC94CA402709240100A397002360E113041D8402D1B246DC392614C868D21B800D3242212C82112998509160C5AA22409344210A22403428CC0B28D12B66963340DCCB065A112114A3869CC148158440954A6800CA805C4388A8406019B322D831290090260A1288858104124400219344818A04D001062132250E338219A962153088051260199C4281BB97104978404052CA0C210D3428181424D61846C5A30491BC224C02028CA922D4A90100427864C962109194514822C11A69113B80403187001A2515214495A0230CB302C94102C00498609A025C2124C1B026940A444411662022528DCA22D0016425830665B8624D42448DB260C4C088501904921244154068402434A244205401448CA4484C0420C9826049CA205D1C2511301861CA150D902500C39868C0031220548D31081124805D1086962382C0A23709B4472E3486E22967014336CD8902903004963208A039125088921C0820C994032C2344E4B9869098044E4046994200999246D09A96001292DC842288A3402E408700C236E0A054964442A82C800024831CB90501C056812122CD0800C594861CBA6099CC08142B80024418A94204042144D19466218050924336AD400611248328A047293B46962C27141A68944963162304683426C00192209464D8B0649E1B070424431C180659C002411A83113212C4B46281B180D884270D1B00D90C845DAC248591426224400C2944150C804180000CBA62419021010890C18222162A881C89248D3942082067209A8900C498A41862819C5809A184D14102E2212520008120C334563C63010934C60C631DC400E98825060022AD22240E4062DDB320ECA324ED4182408C3284AC268E28040A1C86451C265CB166023094C820468D9222E1C499242242100370EC812726408250A202A58240459164C08173000460512904003072152C0641C836D9C322E11158A1035885AA08DD9804803B64C0110651086401101420AC164DB224D64B25102360D93463114B668638429C8102494300819370214824588284054A8299014126136120B098CA49828C292454C006063C481C03625CA882D244030D3A82DC9C825D2844800329250A271D3440D223460121312868C5F8620794A050E20D0E1011786240EA664F2F69BB1B7E30EC66B1A4A0BE59B79F2198AD9804483E475E53B3C49CB0CE5EF92912AF440F23B995813D11B59F798E93C9D13539817C7AC68CAD1AA1AC27656BD0C4797E9C8EC17784C1A327A9DFEAF4D6191EECDAFE049B733FE39D5EB4000936FEEFCF82928E9F94CFD5CF4C1E3DEB1433A47F6D328B5E83DD156D0182DC692347591AA6F732CFBE982935FD1846CACF4CB8515C55AB85EE5AD44CB09D3269E2E6D11780961FD131D5E6FBF89849F47F2B71D8283FF25385E52B07DBB266C674CEE3D0B5DF5A56D8BDCDCFAAEE6A248E71DB1345AFC597CA830A1A35B4396EF4C1ADF9ED01BCE9B6EB637FA24AA160B9076BAE30559F8B29DEDB3D25B79064AB0CF8B8D70ADDDEB8B174248D5AEA4D18DE43B8938CDD2ACBA5477BD4AACC3CE595E5D269FE675210D23152B04710F368428794A75F49B683ED20DD647515777955A8CB38A36AFCD2CE0ACEC4F0DFE807702D1EB3BDE72E9E085AA4E09EB1B0947413852EC3C0AC52F06CB959C85394EB3748119EDBE6C80D2D8F792CE0D915E4F4B151EFB135E7F4DC97D858141C57F70417B43A6A126956978D78EFB9F037243B4CB41DF968B7EE5B52087F05AA9FE487BD16C0347CF1335760BD2398AD54DDA00A5AAC446D80B1C7998C602192ADAFCB809D14EE328641BA3AA00F8D29C3A848ACBDC1946BC0D35E0BE0F8F7E3DA3F68D9FA9768F5CF275534A0ECA9E60FCEA38F1E042C316143A767B33ACCAD8C8D66C70C75FD1F0B2586B653AD4AF54E56EF06933EAD31DE365D110B9C4A2A98BCBA165CAFE386F887C72156EB14FF0DAD665616CE3CE65C1904F2C1747B2EC2B5C9D6776BCD79E5AC64B7933BDDEDEDDBBC725BFDBCCDE2FB375AE2BE3537BDF89BF4C25F83A49D6A6A8D0761CF39D620C53ED837D198255CF5B910A6DB57877DF92D8BB6E9C526B8C4EC93100DEE0500A210C984583E1538160EDAC2C6F866E7F5D99D7B1B81582F5D0EBBF2786E3F556013BA9B6F656EB798838EA0579201A95D56BBC3BCDB9511AFBD4D81288896F87108C077F1A81A3BD297BB124A80086890242995E03CF42A0C21E272A9AFA1DC103463D2AB494F7D017686D31894DD2F6EBB0C3CB6223EC79C65D45C1B0D4EF1961F16D653FCF25977B651EC51A13AE8D4A3472EE71969A7A936F5DBBB9396A46D97642358CAF4894C9A6DF84A59C5962A6990A76F0614890169F001870D49CF2E75008CC4A5D85E72DE2D6CF3FA71852253522FE8B0E423CB417A38EB78C8763C3720C04E67FF88979EBA09E34538BB523B99B8E34167412F77AEA894D83ACF946FC054D0AF47295E51ED83F7486940A4D41C04AD7EBEE610BF1D03FA54071D51A1509E4F49163A25081BE8790D087F5F4F05C88550FCA9BF99C9BE5953D51DD0845C93E41EEEF62E0794B2927C4F5ED9BD3E34EA9200A79DDEB4B2D8F305FE05F827C7E2ED186341CB5D1152FC80104E0E13683D941294C778417164B684A976E56E78DA4D17C3C73229314870B85C455C23B830B9A28A3D8C0B566426DC169F326ABCE2EFFF39E9B199AE5C1292B6F2EF37AF1DEA9272C8D5423DF8A5632F991E14DCA2514788B62BE164828E9ACB893DDA602A5E2FB9EFCBEFD95ABFB82D2B02D49CC53084A49AB1BEC23E5B4C8E714CB03405F1BCF7E11BB59729DDC0B7BEFB291276DCEDACAAD39A2F01C7DC98B9E065EAFED1CC8CE3E848080A2FC5B98C9F6BF5040273342F0312F8B9844594A503DD3E6AF1C9E35C1032A4A8A5E7BF33A82F35E16EDF8C60C90021D8C0BA4C386245DFEF09448431D8C00D1E26EE4D8C77DAA1A705ED4792ACB4EA27C1566FB56683C43BF67842E67534CB3F9677C8AB9D0EEE7827CDEFC223AC948B880B5F1CE9537272932002C1A4DD218F527166EBFB2B2FA2BF37246ECDFDFA72B6DA11C30D1C7D248AD64818F691D59B755DAF71BED9AB5FB52E03622A900D66B4C6384169BDF9EB61C02DF45FB76B1A26F34E938B190861745C021FA876200C7FC8E222DDBFAD8BE781B185424AAAFC65862DB132BEC6D18837A1F58A876C99E63F51420B83F459675612F7ACF80B4EB1DD0721CAA1B4970DA608679C6383E817FE16B66B19181EDFC39270C7E917B1F10EB7A011997E967853B78E00CFD58D224D933CC5A995532DCD4E532E4030515F4A05B331D575DDAC29BAB069F09AF0D173373DB1EC2B6366BB371008A2386FD88BE77F5ED5E198CBE88DF24BC6E393FEBC10C470A72D47C0F834653C9AE800E893C6BA68EA28A838FCBB69C3E964A5FAFC2067DD406B257C98DD3979EC7C7ECBE96A33D85515DA2CB6AA5E1FFF204AF62DD4119A0E48C04A3F2B38660F52964D8D4AEE146A9C53C31906DAD0FD90B5D83B3E31B690A4C4935249981BE1F1A85EC6E0FEE4C88F2D89E2969AB8CBBEB501916558D29EA7C3ECF1C9EF1A04350633B4CDA737DFB151CB5E7361173F3AEDDDF527D73F2F9D5B6213AA68F883E9A2633785EC6BE642A9FD0F21A42F6B9DAABDCD1E6ADBEF64841B59686EAE3EC88EEF0A9CBC12BC012622DF2DD93A86229044AF2F260D2183F51E833EE92D98F0251E3F85FAB74CE367B8B7AA63D3CF8C8BF4D78358BAE0A0241E210AC69353087CC7331357EB4450F9509CFE595F54032EE057754A8EDD746CB9282E768DC6B830C5B4A219343AD124EDB3BBC42505566A7038C959BC35585B6055F1968DA243F778F4E46DB462ABEB93B81243C31EB59622EDF81F06CCC61D2A6EA73E109C387915F277BCF1FC11105BBA70293C0FAB5C065F23BAA19290A302F08091107A4B1D568852622098383427760EF8F2928625BDDA5F514C5ADE959891EF2959F248A3532BF9D30E714059EBDEC958708F8A83C268BEF2682D603CA886347E198FD68233999C77D30D7455DE6BCFD0144277062B304BEF0E34C5A9D8D780D29EC2321E07340771C46360483ADCAF12D5B79FDBFE2856ACE8859F6B12414B3F7E8BB5813498960F34FDC64FC848579CAF9DCCF19B4FB825ED5716DCCCD6872CBDE3831D67384942CD8A9EC4BBFEF5706B8F9F05FE1E8FE69D3EA6A8621C22144177B1C1259E1A79DFDF89728887BEF1A70482556831B672440E13FE3E3FC8204A02EA1EFF19D95253887285BFBEA16A0F219EFBCEC30A8AE86589A5703103A8A393FA6F6B657704AC677C14CD10D3D62D13FBD378C2DDA325B61B85952D51293871E1FCDC948C77BEAE9A6F0E87CE1A8051C8F8087685C12624BDF58380ED66F55B43DDD6D362173A5BD389859C17D95ECE3AB732639FFE451CD103EE4854DB2F39614F658BAA384BC9948D0714EB48A887143E7A1FA4B690C22B492A70C612B59FFD2D6B3B5E99C2003E2C359B1E62DCB620C7A246A7B9B3246131556F2F3D513A23C6A9FD2280ED686D767CCD01754EB4C99692F2B380C36081344C1D35EE1949736B6976F4852CFBE64FABCF11B9AFB828576B4F9787AA7D03E84598A7143EF7311FAF2970E23ED4C173F985D6450165AE3E241A18234E74FF3DDB921A5300B1C4FB6E432E698F53F66E38C07BCD6E77605DF4624D579076292DE1CE6FC6F0081A38BD92D39B24B73BAC1C52BD68E9181D3DCD0AC7534DB48901E5984F9902557BFA231B2EA28C3183262A1B2221F7426EA88A5816093A5CAE2CD5D59A9390FC93A2956944B064CF013BCDB67FB423D1328D2C6D7BA329013FA2D30EFD69FDCA1A95EA6D06C7363534B2F3F7DAAFA296EAA09B3668E9CF82D9BA959B32F3CAD3C10C6EA48611554539C37DF6BCA3385EAD3FCFF96D372B42393B73C8DAAAA31506EE0527B7FB3E593DCCCA57C8FBBD4A3C7F8A53899869132FBC3E4050607BBFE29C675E3945E74A31CD531BA7AEB2E2F0CD990B8F983A90DFEA0568F0677EA9563F7C479DE968940CF242992692865CFDA89FA078BBEF49CE4575BDFB380366011C8435F12B42D9AB99AB6A31912C4354149D723101D1365A65E7CC68D82E30517773902FB38DDA2B324E7208E987ED287D092E7662A430241BFCA552D314127E38C8597A89519D4F1E62A79465AD5F4EAA3FA77CD98326D2F92CE9852055CECCF62D63CB9D7F198AE085E4D45C8E48FCFFE593AD652D9154167BF3E6195810A445AE158F1F9A6793363AFC1F22CA882FEED3A5F5727CA76477C5F23F0FC8700CDC6A5BCB2B20B4F9266351D304A96A82BF5F314AF685C1C707C92E3E847B7047D689C70B25E5501CAEC9919626F4A0FC81586AF1EC88889B423387D5D95482618A650E80B53B07CACE3228940602E3DB47466CE9BCCB6E4D8AA61C8912583E810B3B2E7E9CB48BD403ECF08D28C70AE0B620859C1F09B61131404C3D5BFFCD860E0F42AB299006230B2876D77DDA91C8C62BD93A844E4B344E3255EEA531C6C458D04ABDB0FAEF2D1C0B4C55F570A5A51023F4D4EFFF59F9ABE17922FE732CA71BCD434AD7710B84CD4AC9F2507A06826562AD7F647826F9DBBE4EDD23F124369DB8526FC2B4D52F0741415F972BEF6A935BD812A56C8221B7DEF0F5106BC01E913E3D43DB86C2BB4C7E0762663C6DE788721C2AA07F8954887E2142F2E914A099EFC0AEE1339210D3E53DA3ECF88624B1119BE34010B886C80F51D1850838F2150E72B042AF32899C0D3D7B02A57F8CF263A369562E4E945A31282A502A95EE9BB0316C6861006DAC17F936F54C4C7 + +/** + * The `rnd` parameter for signing provides randomness to prevent side-channel + * and fault attacks against deterministic signatures. + * + * [FIPS-204] allows two types of signatures: + * - Deterministic signatures set `rnd` to zero. + * - Hedged signatures use 32 bytes of suitably-generated randomness. + */ +enum Rnd = Deterministic | Hedged ([32][8]) + +rndValue : Rnd -> [32][8] +rndValue rnd = case rnd of + Deterministic -> zero + Hedged v -> v + +/** + * Test function for running a `sigGen` test vector from [ACVP]. + */ +tryACVPSigGenKAT sk msg rnd expected_sig = signWorks where + signWorks = expected_sig == ML_DSA_Raw::Sign_internal sk msg (rndValue rnd) + +/** + * Test the [ACVP] sigGen KAT with `tcID = 41`. + * This takes about XX min to prove. + * ```repl + * :prove sign41 + * ``` + */ +sign41 = tryACVPSigGenKAT sk message Deterministic sig where + sk = split 0x13FAAC5CAA1C92AF31DE6C25B147014BD7FE589A649FA0089AF0D606E4B869EC1E4519E3AEB57924B329B085EE7C80501241FEE198F3F41A94AEED9BFFCFC9F7250182F2FB7F56C145635D81FD4981B541AAF62A572520FE29FCC0AD050545BCD377EDA950D1DF476FD2B85C8C9E749807ECA53A51D6D0F4F42A339AA7C48181C83851A0A830D080651C3741E1A805D4324624272D21366D403652024250188488CA24804C842892360462109258844503326E13390E02928CA038044C348A52A46054082DCC329204822D5C9869E2246918914462A86560080A0C372010B9890CB92D63126D13986C21B02D20C52560340918C641A20872048684824026DCC26418165219223158928940A8408A3646491061E396690A2690CC042D41302119C06510872141400C83120D831205109905A42844DA06201AA30502150C04282521A430E03601CB804C1AA2618AB621610410649450E3C630C4226880343210C09021944589248118C7458B904402126250B400E2866800A2041BA68558080ECB228E59803192847159262A04216D13A00C0C452D518845834402C42846199345630069E2060E084528CB1271239484E2386E93446D1CA26D21C60561B228DC1406D19870DA9211CAB48DE1A20503376262B6014A284259948D80225010108C18354D13982912474DD3B8209A40120A398A88026A8B2280D99460E0A80491246D5B060D02012D13272D04154240860520948D9182215890688084115C0248C12012D0B68DE438666306258A884C9B0801DC087083445222404109252AC988851AB7491B899114244A8A043103408ADB3680593488410690DC084AA04830C9441198142E1B038124B06464209223B484A49631CB82648A9669A1C230C9A484A18420D9226A99A26513C168234404CB224940926C61066E83C8418332254AB48002067102007213A57123842908326E54828101920D83344A5020251B84718A182C64B064E31049E4C090243592A196308CB89109C3109336812399415402101C196153A68000022C8B10011018914318705AC20C1801665B341109836811B78998C6618C40910A430683204421284E41368C94202ADAA66541141213B9605B442901102499904C41342E24C28DC9082E11382E00018A9334455810009090316348610C2860D4262981280DDA10519C140C1B2308D29208C8464E10322E44A848633490810022501845DA420E24097162A04908194453C06144482622C42188320A01C00952046A1B25511BB185243809C2A86C603689608684448065D1226223C98DE400468CA0504800804A283044084A220640D800724A0062810425E2A22804C04C0A408E891089E0868DC2B4850C274843167291220C498061640488D1B605121721D1C231D4C2811B8271A4422A414212D9982589069110220C99886002B7219A1262D2C0219BC28412496A4B089022824011106603A749C1448063A65160380D84460CA4A28C9B162A09A388522426C3A25119A6802410860BB3888BC66C20A028D2A664A416721B05119CA42113932C1C86491CA30953380C92A67020C7244216280492714332221440406492514C448C8AB40188308611346560100CD0302D24B460A03870A0968920842924A88D58002010286EE1204C14286DD3402DDB38251C1381E4B465CBA645E082015A022CA01612C3322A14A36480124A01042A0895250C8440809051A1282524B86D08318AE0220E210692DB966C83124ADCA0692127065B1828C1882D133209434411C9462049C48481146C18956948C4480C492603080D18942000130901436118A60120474819111018A50023019022882818054213069191062509480E11456E8A00449914010020122092480B8320E4321210B429C290512139049BC411129890DA14661245048322049B442A942291C9A845CC408203C77181429223B670D924218BB08422392C4B2860A012905A807113462992C068CBB68D1C8064840482D9B82152202A1B0565018545D4462DC8B620D3404003C42051380AE3228541086C04C62C8B20051B091008A420E0906851B685083825E4428C504866CC98281B1171D2208E4C324E13424E02044984B20513B9059AC86500472E9220710A300CC13620DB8808803840188810A1A84D043582E404320B048061345208C5201B92401032121C426A231904949090CB9810B0D16BC03B32C91F22E9DC32FD1369B126053CEB625567AEBEA42D32F861AE27857C24814177623EE402427442714970674EA84BD573741F3ED9C297758E0666F718D5E61117BF138734FB56E3348CA54F05492294F52FC90C243BD836DE2D5B9797A189C7D38E6E35AD95E1533A32B5B589AB56941904BDE66124FA6CDFAB90C80A05A4EE8E50A5DE061DA6E11D3B40F218664631444651497AC3AC3E9A9114C9BA1E92D2FCEEEC9168E27296AF943472C8B4E251F753EF79F80948F2ED5BF690E0C0A074E8E0E4503410E8FAC6D8B022BCE3FAAD1C29681FE2223125F43FCE56DE461BA8264DC83CA1E690BA638E49052D0D05EC5176D12458159F2FABCA6556F15914598E014A4582C678C0F6ADD2F2AEAA330E816B0AC0BD5457948FA49FC4C954020070451143D8B4B4602BF9616BBD1D9F76B0EDD63F186BACCA0C0F861822E6AB56F771C6742106314D54EA9D0F1BDE66F4A504C6902D86B815F46F47E6D69A9DC16F290A8A9EFB06695670196D17E096543CFBB6927E25191B9538BDF5858B54EE4F69D35CFD511FAA422B6955F0EA87EBE5506DB4E7871C7FC5A2F974C736FF12AD545CE507AF4E430270E47EAD8663361CEFC3FFA2E3CD85982ADF648DE6F899056672D6CDC6841B1F2668CCEE9CC630AE9A91CEE7648AAABAFB09E4AC7ED0D7ED8165D851627A01919AF56FAD39CDFE838B5CF60E8FF5A2A7C91EE43F1AA3F81CC853B178E3481C32C2D6FD40B0EC924CC1887FC6DA4039FA0BA82D0A57472C9D6003BB3D819A0533D3FDBDE2CB06BE052AD7E56B92B431652D6D5991BBA6B564C15C1BAE95360A07DD76F0ECE8532376D0B71EB865933D3520EE7B3B35B7656ED684FBE914D01502EC4BD7FF39FADF06F6BB002B882213C4D42E6CA651BEEBA228BA93D825D618084917ABD3130C31B3B935A253D8D28BD45C5FAC4B05A42BD815B9CBFB6198DA4FAAB4DA6E9E95194E8084D66CD6B52BE2DE2A86DFEB25C254F59C4CB168185E00074E9CBF060639CA6ADDB7DE514CAFD5D1D3C74777C11957416932E8745C2B01AB7DEBE2E20FBA37476C0626140FCA24D3EF4F53148C51CA78C935C6C89233A6D4C57C317A19712A8040C1C4D3AAD221C1D375DB372FE07250FC3C1BEA8ECBA24D781492425702F35CEDE709AB063EC0804E71B8669B87DAD1563606E89EE0DD2A0B11B8836F5A2D375AC4B7F85FC5F80268FE26121210A4E1CD24BE3FF9E6D92A5437BF9019002140A42C317906D61D862200117FF0F8B8EE8D4C289C3950D083B5E5670D4ED32DA5C691F20CB648DDB715977ED6AC69F64DF8D5C99B4177E8B98876E7A5D29ED0C0F972CAE6256528233E15B13C69AB592C3AA260C77BA41BC608A57CAAE46AD240DDD5C2232E2297ECC90CE628DE5B83A551B06BB68FFCB152785B5AA6D1702DEAA8E92F704B0D31498692C537249D71DC6B1247948CC07413726DFAA43F53058807B77C4C73874EAA526EFDDFDD9116C98B0E2C5B7CAF9A25278761E2EC3B34B766877319243E138DFE6A3A03038D357516D9BF64955EB8B0A4975E026D0915BCB8637C769530458F242F65A68DCC78157CB30C4632938AC32781259BAA48F11B3949616E06C4D4E63F15B96E203D4B4A8110307D5CB3552810B9E1F3F4DA4209CF1BA98359F40E7055C7538ADD0AFB326E5F865B3F69E3D6C9F9F18358C0F6A47777B455B8CCE6C514CEB2235A7B376EF92482E2E86F42331511FB94A9038FF41FCFACBF353F3A43F3A79997167306DDC94A6D0628FC346B06166EE9D857D4B0C63990259AF271CDD8479F4B08633139663A1155340109B5FDAE255D1E4E21539C07249AECFE8E6AAC44A772B39596946BC8080D84453DBABF1E62843D179C1C38F1AEA5CF15BEC4A61810299632A2F3B9422DA99CB13C852B1CC6933DD52EA336A5A09D7D9F568CEDEF14CE1AECA48D92996CDB2CDA36A3C8E95F62DEE742CFF293037273E51F77BC208D5B345331E72C26BDCD0F51C9711BD899EE82128F834BB0B2A3DE473358F47EB2F98FBCEB2624A5D2697B86C7559FF40D14744C93AA2DD6570CC799C4B5669ECA0463AB0B4E1228032DC19A42E4F6C64D9EFB26E1B4E622AC06FD0C47B5A39123FF8F1085E4EADF768FBE9D5E12CBC5F380DBB414775E2836AB19CDEB19A0F653E7CCA9DE567D18020D19D24364E03C762EB54701E1893FFECA6D23A2163AA5CA9FC2DB681DD6E8AE2F42985C2D7E477225AC2F9C5274A5584E0FD90579B32D2143B89F9AD9576DF10A8E82D91C4987AF05F3E720D8557093A1DEC1D2699C2305651CAA0FD621EB48190751D74478381A499A61732B917E84B749A0465408014D249DC7D5C247AC0BF404B4311A25A55B2EC1301350B76E3F953EA2E67C90F1D5B9FC29BAAD30D07946AE1C2976A4FD32BEF26A2E93818913B36B237BE40EB7A907595B27E7BC80039683B3D28323F53B5521D244E3C87798478A8F9ACB55EC09E97BC5220F955057A889E7003B9DE288ACD5594AE65777F36D6C73FF5A17C7A8FAF039F60BC9E3EC54284384429C62EBCABCAE2E78F5B58DC7132994DFB16602A54B444B9A9C0FBA6F7AC3E357308CE2570743B8D2B5DE5F9FEA05A46307623E579195D6B5C946C47C57A14D5A6177636025FA555F700BD61FAE9822ED336AB21DA9E67F9E81CD815F2EB79F25AB194E8AFC564C43CB4CD8D681CD8F1BE41D9376668E45EA7E707EFE2E58BAF0CBC091DD427009B0716B819B857FE9841EC48248AA49EBCFAE706E5F8FC65076E6E871D6958EB1C7A357019950146CA8AB3821317C289C744450C293D3DB4B3006EDD727B5BFE7541F6817CF5467AF94232BAFE06E5AFB845C0216491DCEC3D603B32EA59AE651739D0E26138408A5E37A6E0BEBEE2956269A722AC36D7A3D2732486EAE6F8100C9A278988554895424EC080E282EAC6401129F51148DA16ACD7BFF0C1CAD9516F189AE1D1F4EC79110B942C026C6995A0AF85445AB9DADB1B2FBCA7BFCAAFE884AB6BA0717D3D7BAEF75D9A4507FDBBBBDBEA858EA7975118B94AF78E250F494205715B0EBC31755A38C1AA944F0D80452AD54639B2701462B2D82E522F8752110F44BD381E23C1EA52C15BF9A7DDEC0AB0AFE725B5993A0351737C1DB72989F48FB41AC479C777FD2E7808FDA72790640F9F741D643CCD0C1ADFDE90B9ACC84345E0B0739768ED8265455AF008BC09970B18D52D188AC387CC1DB7E47EF83A0108D39F7057BBC02E611DC34F9DE364B7ED9664A9C5C9D691DEF8E8FDE6C61484A097CF8A937FA55F353D439C380357BBD108933B6CC49CC5C5042D6E5FDF8F85BE9E4315E094EE569C5E3F38CBBED68948FC95226CE06ACF6D0C88408F3AC265B6B10BE10EF0467E011A5EF8F10026C7C54F8466E9E574FBAFF13FE9988E783BDCCD4B02BE46EECD77443F4CFE8969BF3551F2829FF2C0F8630DCF7B088C5BF1FDEAE2E81143D1573854D0D6D6F70FBB5ECB7C6E60F91B241E5543BD4F316C66A7F3C91491320587DA5CAA6345FC0D2240530BFC19AF88B43773FBB4A6369F540486BF74E3DC4DCDC4CD265C7C0D37213037CCCC1FA81D21EB4081C254C4096E044EB6BE48D07CCE2F460718164AE3B68B7298BB1B267FCC0AC3D0365437ED45C742A3FDD746910C1610E6CFEA9A17225DF2B577E790EB870F5A2190ECC166EBA09C171BD825D5E8EFFB3703746817908D299426DE95D605B368AF04D27B01FF5CAB91515096DE2986A0C575D14CF4224AA9523B661128740F19DF8072C917483746547EA422F8A3B40CB67FA87A7989A13C49262089A80B1E4113BB1EB9B469275D8BD336DE344318EB3310B3ACF8201A6F5F613CE0F2290AF5A8B9DD9A5B64AC8BB94AB56C36157C8EC8DBA4125321F30F753D489FA42C4881A3450DB8720892A8D3F52431B960A2404A748220A7305109A2E80EAD78B8D5C1F79D265B00C771129A2117DAFF0D24BDCEC32D53DF76A56CA24B6CFA0775F67614186D7513528FCBF2F7CC47D60C52580BE1797A62C17778DEE9FDC0B6D32585BD35C86276B363915D3D2E5A4BF58AA483891025522B572F4B635CBE94FF014ED19A017EFE0088CA05C54BBB6953BFCCD8D6F867769CFB02280ADE6C39BEE714EBBE252AE5AD84027F8F9C2CFF3FD01ECA4F051591B7FD9164C3C64386D177A74E17181CDD3C55C98AE89CC2C1A26B88D6FBD16DFB76742B631DD8F8D78B308D606B486071C30E81C25AEB864A822402CDDE0CF27FAE8B6CA16500775AD44733FEC8F10AE6677114A330E59FD52747B992113C53EC9A09AAC1C3646FC3760CA6024BF39B7DA597F8902CD605599779509E3F8CD8B03AB66C1993AD4B3317949578351B74055C7BAED3D7555B315765F1065414F39A7848DBACEA596C51D10BB0081381F7D5601DCD07D719BB9CA9A294E092376F6D4CC32B26A9A8FB5297CBE32CF4356EA70225CB302693A6DBD36C816AAD475815E9543F7DC8064C34870A799C32A6BF76D472797F1DCF908FC994604407B59C824AA76BAB6334CDDFE8D0227A383B0CFA2158CBC79DEFA98BC93A38DC0A0420C99B920BBA64DA16819A78F8BAD42355EFB42B4BF17C68AF75F7428B687334746245F7C5145B5272B9C504A9A0A3A985A9738BB1B42FAEEBDCE7E7962CF0AC6EC80F77CC5C9733E49DD1552812957E1FE30C4129A702E23DDEC09FD + message = 0x67D7F4FE3CC57FC8BE9A3D06BCA0FE4A39F39E3A6158D3E4ADA9CCBABEB542CA67CAC48167928336993C569AB5AE55BF95C8291AE1A1AB2B595C90C0FB19041435F3B411609412630D80DB0C832D413D69C8D3C3CA78BD1BDC24167AF590B67449DAC7F6ECBF87698BF3929FBC874F6FD68551B28E4EEEFDE9A0D0E7FE9E569F1F9893D39C17C3BA7A6211B875A7BCAD0C14194C30D60CDDAD640EAF7A02CC9DAC074779345B83F0D282899B2B9B61F8504BEACA3C02A76611C82F2007953D04FD3C54D7A00DF8F6DE554FD83D1EA5DC841645B706C9D900DEE7862D526245215AC6B9D178E60F9602F1931503864D97F582834DB797CAB60DCDBDAFA3FAE8726B525E8BB69B5E0763FC4ED17FE7CD9C9629273AD5B073B9516F6CD7EE729351C213FDD122E3C11DBC58FD2A501B267AA4AB21364BAA856823816E77B81B6061279FEDA6617247B86073E55B19973BC0E725F34ED4BAF0AFB95E436A9B2290A2B316C18CDC0D9F98F9F6F13C5A3FC767EC0A9A49BE1378E92BC9B3010B41AE52AF409AE0FE27CB816EB2614DA41C796D5F4FAC4A743FE34EF7C0B3A78E0E4A5B439659D4AC27B698550E89A1626FAADF71420F559DF2E808144707B5C02090F754C3BD4EFCEBAF6FA4493C5D48F895FE7674C81F069E1F00E455BF5C965BE2926BD19AF76E20533A6115F4BCF2CC5DD3A49E10A2B3FCC9EEBB2B6E4F25118599062F2AA6CC3A9D86167B1BD08DDB2C53A5E46E1BF4E8C1967866320BA66AB67CE581981F2003B812BA058B75924254EE3715BADB8E6B1B9E4F4AA9844D578CA2F0AD12E1C964685FBFFC87108711E022EA7F63330CA72AF86262838863780F4115138672643E6D9B48C782B8637E01D3D20CFD5C98A1B57720762037FFB12742B4EA8E89E4B32EE7DBFCD5C11E4A6E839A83398ABBC32BA39C6A25922649971D88A102D1019B560C96B820C44551E14509468196CEAFE3B7BC8F253ABFC59FFBC01A13008F77C91B19083A9E7BE733C1A5E558C64557389CA19249CAB77014D0569BAC7812862A610DC6EE074C844A055ADCAAD496F6976C932587BAD9D7E2080F8623C5ED8D9D4FB9EFBDDCC4CCC1284D22A2997824577A619905B0D6E451CAA3B2D30DAD9728FC7623F9ED71F80599D65D9F2AA285BAE393D05C15891472B2DD2ED5CA669785EC4D441F3308EB4BBDAE8FC449962EF9787C39A533847540965601D8BCB6B4299AA636589BFE371D3904E18BC9AAC9B3B6EB8B7E8F322C22A6E01E6B26244F9E39586F124AE4E504FBC9D860A61B20B4C127FD0C55EE810AB9803D810233E6126488A6E95F8ADBB3F8E06D113DE6A3E361209E0D36B326E042CE9D2698DEE469DA15464AFF82D5603434C07CCFC4D956A7D55FE79CC127AAD2A56B34EB10E8B85C3CD5163C4BB8C1083BCE5E5EF986AE028837809641A6AF2B8295B743DD9B03931E755673DBDEDE56F6294270532D685DAF1187137CD7D29248F21B290EB8317E3EB28B62E45E140F4AFC6D1438F81E9EBFC6FC0F1A4146AAD83AD1F0EE2952643E7B6872CB2823AB21A155C281ABCD19E20A52611C6FFAA724578A070935B1A0BFEFBF061101A81227187E14E96B016242DA269FC91253FD827A73743A4BC49FB63E2D830D0FF409AA1C73706D7C2297CBC552CED567DFED72CD15060A522F9B88EC910B03CD2794A9FC07A8FFC5CB97817DC769E64D8C474A305035A49D05B1C572363913A315932E391B62AF291DC203B9A40F04F40EBF26A4AE186056CEC45EB7D21D88CF50258DCB5EF40CB2ECF949B18C72626469978FBE0964C8A25E8C2D27149C2266748F2B06746E8C9E7E2F0977BBBFE3FBEC7353F583FD5F7C2B0139EA928AE1F67004706F6D4ED7BD8D13BC68E0F4A49877C0B2F692936BE5FF99544B2B19B23A97EA6B5F585ABC9E69E689EFE25E15804C650444C479E0DC63C9CA2AEC41A316039EC7F675F1FD7C0476707370CFAEC9C3418CCF30B5D85FE0E15056D6C015DA59F9BE9028D9C2D93434F99DD8C1BDB41FA1EB021BFD0FC12EF0D038CA32B0FE1449342D83CD6BAE43A8CC4077074FB1191A8887BF29238D27415D93880682017470A42872D6CFA729AA2B3F8B37038C83583E4C33256FB871A704527594596FE858777A93D3095767BCAD2FE295352C93D227E1766A59ECEB38FB7C2E3664D6DA0DD4C063975FAB3AB4B68D125AF16D233389D96A337DBC18DA11F37F430C1E49BF8AD30258601CAC9215F32771C6FC2B7BC03B55AE9664E0D719C3B40C3E4FA7DEFED8571CE8E46FDE8701975D94319DC5FFBE93B4FC4898E2EFEB3CCFFB3494AC50BBA364C22A3953F052F62E46D0C35692AF40D2FBF899A23C1A4721375F307E2FDE2E588830753F908FAD96EBD5FC360D742E2CB2C38A7E142C95376ACAE29DE8E1034207D1CBC1DBF2968677AECED152B1EC1AFC195F3320352953F2503227152444BAA74EE8F98F2B4512F7ABB43D7F87889CF1F8C12D9BAB91EFCA5AED21058E322CEB4E59DB4DDE13BE46FBDFB225F4AEDF7137B548503008002A36D7A3E98C0ED65ED9322D66FAD4A741125EA4ABBB26A2FDD7AD136590061E7BC0D5228555D1A59F8A6E4B97ABB61F4B1AD9564E84C000585DF8BB31AE61CD25C9D91D1A1FC21A69AD286CBC7E00F592DFC1C65E2BE755DDF041486F3B52C8F72ACA97A149FE0CE1378236D99EF099A668F6847659F7EF617B66192CA452ECE3010AAC18A65D8964381F561B48D044096DECC22736C902D7E23EFFD26245018D9D7EA9E2F907932A1EBB405BCFD29F7A397C71A5E08962ABEDA5203988A81F787B25EDE84A7D85DE92A2B19974EF7D0378877B82BD7CB28B67F45F7EE625CCD054B44B4CD51802B4FE2E219315CA9F4C24065F5578732DC671C3004D31830DB435C763143CA209D7DDF3F5EA42244E68429102F4D90297B7C987EEDFF0DFA7F31964B76432E1DE27FA38570F2BF64D5FA3F12DD9772618ED2B95F51AC90410350320E19084F1596F6B791AF1EFC24DBFA2B7E30015AB14FAF43B568C5149A1152A47D278B5F01786F242858C210D28812147646A1A3A7CD69996809B784BB2F0053CFE18446F060622FE3B9181AE9175D6CFD8033AA752296016E7BBF639842DD4073AB282FF50F94B9E116C63DDED805277D4FD7987F740EF8118946851A5336A9F6F6E2FE3ECABCC518B31E741AA79AB500D9C6DEFCC437569966EAB1D4BD6CFF8AD0E5698D15F1342ED46CB6DA986F0C4B2B427752C18ADC5070043FFEEBA98569E90C79A3D5E0434119A077A097D69DA6E9AD7E32C6E8875A893F6D69424DCF4C0D4EA12605E5E8A9853E4B58E5659FED6D724CBAF582A89A228F99BE89D88F55095D0627B40B29365863C57F82B9EA22FDE731D1A2D8A9037665213F2C410D4AADCE12CF888DD4AF53FF839E962F0F53BEC60F97133D131C2C8EB588AA7D25EC025B9E821DA8E8FD8E550EC5E4D5923BFDDBAC522D1FA64C503078618B52F452B57874285AFD3F6B182CA6C979734C94F040EBAEDFEB547683E98F4D13F12A252E8839317A827CD97A7C3D81962A25DF7D8C62B57812EAFEA9EEAAD7D6A9E755AE4CF3AF42CA2152F663C1BADA0E653EB165F6FB56D86212378C0B9BD5733D4C37178FFB58E7357487B98DEA35127AB58A804B13E61E6D3E385C96884EA91C744DF6CD44B3EFBEFC79ED19C406AA6ECE144A44F1E78B33046C33EB17E3BF61A17D849493D08F0FCF8232AF2922D96213647A47A05A9A08D28AADD3B3BF412F29063C9D78CDD3385BFA9F8BF06DCDA23FF79A5912D867EE1B0D526718EAFA6F0E231CE6C51959BDCD8D201838A50634F1C6BEBE2E4F5235FD01A6D27B90C58C12D8210692BF68FEA5B8A8651E64EFC1DFCE07EE670D473F29AFA63E080F7675F23E7D2866E5F2F9A525BB657E8BE5933FBED1E206C7BA9FF097EC95B91E14612E16F0F4082F70A1B01EB6219D47C716455F4C1C60948CF3228557E787A3186B4758AD35922AF28BDB328693BAED15487F7448D1796BB9DB5C931EFABB4BE436B2710EA280368A8E20C5782A7FE986417003236BE9CADC560B3D7C2CA92341536CF67D412E855B92D0229C45B1C518D8BFC82DFC9F413D3FB23D37EBD96AA0CD0B39EF88B23609AE0FC2BD16FA9E934329558759F05C8D4C8F3F8728335B659D3986E44508322E47121E592C9DBC6F49656B473EF7DA53FF8EF7BAE07D1BBC68EF4AC369D7F8BE60948F34444C0C443A100443EFC444E7FCF0BC4DB6A2C2C64662A538D1F68F4DB95B0B83DFD744ABCCBE5DA343621F0E182CB9E915B2097C186F1B98E7D8F297C347B60EC26D04B6D9C1FFC01EDB2551FB8D11D49E52956F69CDE0E49E2E7DCC8E7C8E78C41A9B2A01483BAB11733A0943A9B765A5811451C07A195D87060F157D114358E478FBA2F2B755A2A455E9831B77EA9D33FAEDC1C562E1CFBD8DE156FAEFF10AF655713E36FB508342D9B4A239D6DB786CF9F57E1C39AE65A7329E434AA88C68F82359E6F057873968F9FB63D898F24BC13C0F7748F92E404C6185CE24C98D4E4D8D4B3C129CB46C614E773A89EAD73CF0C30CD7E6C9F6435F7C83A4C3F877E034755EAFC5F30ECE03F6413F4C7DCCD01649B6ACA9C1C3AC3D112F216AB852A27DB3B846CAED86B76FB699AA7623548EADFE6D16AAF5A3ECCC298D5CAA7E84ADA0B75290FC6ACE736051924DAE8FC5BA6DC9AFEF65F369D054A4A18950E71901F4483A4BDDB2584DEDC31A04C5F8916DA2DE33B37078E5DAF3304344A8AC368A6668464FFD7898A18D10685BDE6D0097F95A3587717F6A3A8827B46653D56E461EF861D6908AB7D865B532DAB37E02A7A6A72A06F25572D83ED6DAA540FE56BFFB2BC9D104A74F135127ECE457991152DD0564BA955971E8C9767DDFAE190052A98A63C4C0DFBD1B51BF60643E4C5EBCA678CE5150F03A6EF09AB0B1C2A0D2C19C2B30A645C7DB9B56B5AACFB862837A38407070DA9C7DDA20B99CAC7B03D10C8F28D6B1C686FD26F9A8FDCEDA6B188D472BC593AD51EA62DCF73D32EED5444484853AD0EFCAA60DD42DD2C50F5AD15DEC7B71BF585581B9F9C68C7C94C154CC7E0D19ABC90508C8EB2DE93F0BE4295973C1F443A1B2419E20F3D5F883912BBD5CDEB938A4452FE0BF2361A9E3B2ADDFBF000DB07EA19B2735CDF0E8E5C7EC5CC7CCE1A9C3E869718272E54CD9875C21DCCBB06FEDE38A4E787D111DC6A253A4604B314FE47A9B6F6FEBA3F8F013A456DBB78B497C4CA7F90CC6145F47C96D266BE5507DEE27E968052CAC85EC87049CDC68D723D8CF89B0C91F67CDE2908C0C71808004A070CFA2EB6408F5FD6108749406FFD3D5DEB6FBEA00FEADDAC4CC0E22A9F6F50B9893CC4CAD028FBB73C1B7BD4292AEAEBEB668859BAD444D0C5FEDE3C469CF28C5C726B59E828C473C8787453BAA3AB2BFC29C691FCAC2CF496ADF3949CC42FB16F3677D456E614B1F88406E6C9DA7DB9937B00764D61C3D347C140FDDABDF8CE5E3E2D385C3FA6FD9F13F3BF8073B5D6AACD5294938DEF9C6ED414FDE4B3C5EC43865A7FB02787E50F94033CFE32A85BBE24B09FAA3B55B8BDDE60E325B691A350F2F128CF74FB5B6DFCD0E946AC7BCFB839B3765616DF35AF29F3AC82F4E2DF7D4AE87A016094719A07B5897105E2B08AE3D807960FED396CF38863E69662238541EE295C06B290404985444F4B28388DD942E51867216C734580B3F1D5BB204B05D4993D6F8ACDC8F16FB77B607FEDA67939A2B6AE285ADB2C98E7D37A81AF0101A5CE39CEB2C67CF99441C1FD980C2C542E7284BD21F1D30E68EF3606C65D3230B5146DAB41D4ECBD5FD89FFC68441BCFED9AD8B4E0B616127A7AA39E84DBD1343E2A41B4DB1AEE0627657438034E890C8EBAE19791705BF6C948C630DB1423D310A34BF151AA8ACF3269253BADDF5B40AB7EB3A7AFE2D7891B925F65EA206F4CA121175E8F348B4162917A68FA768928AEB0504A60C4F42802DA25DCECEC60ACD21FB236080AF1FCC9146BA30AD964416F4B524ACC416B5357206980305555CE3485425EB8F87401FB1D8CCC184C486B5B563242BA9531147D6A2E7C0BEC1A56E083F05344BF97A18D0CE0FE56E8BE869C746D4AAB365225D8871D4F99020DDB1CE2B5D7D2E5DFC8A0DE780CBA0A9B9ABAC87F19C73639965AC2382488387F06199A08F283794E1B8D3580E5CCADE811ABA6881908277624D5395021016DFE21C345B9A21B474043E187403E5B0ECFABE43991865A424BD33D233AC4BD30A3CE73DCF49B58CC4A3D2CE25C54FAB3480FFE0D51A43B71FDB7E1126E66856D263DDC3BF1A31DCDB935DECCF858FA2CE5AC89BF32E36D8009657F11691201290A243B5680E060D2CE30F1BF2444D67DC94A24708F8F9261945D1B5275ECFEAAF40311CED5C3770A1C194EC44501DD25B7F5FE67BCF62D1BF31119F8EA7DEC1CF536C1026A8E72C7B2E167BCAA8673AE5506CF6208F3E1B6057B5D488B29EB84D6F94AB8AF322B8657075B9EAD3297505AA521D601C21540EE71349614CACE0E7F14EF42D6CD5377DDD0241E34CF273A1171135A376B98C53B218503A908577C268F6DD46CA9C26DFF5942998851627474DE9E6B46F49DEDE85CEB993A52D01F6AAD6F96439C18B0DD5A4FD559812227BBC0567A28C1299626B171855AA0C74E2F9B1AAA781D34CA58C72C708AC49F5AE1453902A1FFBB8458E8B4786771780ACAD999F8DB036CF4C3F77AE345817EDA2AD8F7D2AA9228C994F6AEE512F7C2D2AB72F2099EC932D818E495CAC8507B06CDC6702944237DBCE338C20EDC84D958C14233C1884BA09A023BF5284F0B0157048B6AEB508415DF337A553F6435140D0CE5D5CAA77F9137B2C1AD5A02B13738772743F192E53E970DDB401983535CB096F7D98644797F487CFCD18F1B22BA7494D892C1E5AA05E66B1A4326C70E348350C97DBC26CB110AE8289C97CCAAB150020827B7D7AC7913B4FF515583677018949D39CD73BC7DBB90696D5EBDBAE6BD6FC78E3826C8218996F079A387A17456875952B268211891404E80F8360F042EA3D9F7F7BEF772E64FA1EE8B4EBE0A1162A46EC1E9899766BF4D3099AF712A847CC86291B3D6FBF51B3B3CFF87D7DE71E73069619480F6056AAACDB9ED8E228BA075622C2FF242CB050342DF8F02118D071D27D1FDCBFADFF49184F5A100F95E1BCB019864E58E0F02672C8F5FEB97EFA06FBAE6EC3D57A10EC712BE0144323292A2CB27F1B1FCC104140F556D09A6074F853AD4328B00E6F2F24A61A7932311BC999805F2E774DB44ED72ED244A945928B9512556EFCB2BA7BE0E668C41AE7601339F0162CEC0A1AA91C3FEB6A8A40158D7A3560924455B9AFBD4B3881F6C08EC2895C84CEC30CB0F5B499B4A66267C719785F94A9B9F96FCEBEE939AD0FCF42D0E65DC241698DED0EDF1A9BB4147898E6E83851499175105BADFE4CB00B9000404DC92EFB4EBF41D9A9262EDA550DBD0B99353D001F90AA05591100BB678634FDE4E0B1C174222C253870DA3B8A797CAEA9B446309DE5210F9A932D6AD48A4A7361A943C1BC66BFDF75CAF5409034A8768BD535B20996A728A26E28340191E03DB17A7032FFF883EF664FD7351DD37DC2D72F0CC4B80BEDD1DC33BA3046162F5D0003140DF78FA588A9FDBDF778836C6CAE7E5A20FEF030C57867B295712DED14474FB87A301C31214FFBB4F8D166498ED93B6E233A669CB88D441A38A0E5846EF68F5DB20245980CA184878BA8BE1992A0638B058CD3A3A501CACFC818D2B5D7876DB6EB08E9F26430FB06EE0B9E834D1C331B66CD0BCCAD7A66ABF4A9D8F7A872932A3C0B25C5BBCA480159711E0BADCF69A1107B286AB199B210CE95BCBC4244780C074C42B6BD43869F27BD666F9B2541B1561B4C207E9A667EB1E31942697FCEBFD0B920EF80CFBC5CABA6F528187403D7E8262C110458B5382BC376799032362CE57ED39F0D29D7822C408923C29242385CA9749FACA43EB4483E095851E89D24CAC7BA5AAC60815CB5C8C5331CFD66352BC8623D5700F49FD98FFF9E869D5AE173961138D76E00CED6DBA09144083437CC8FF5ACDA10BAEC0081C8BD2F5838666A093B412532C521753C4E11ED0521923D1EE6BEF3B4FABED7467B9C8F75FB24FD8D96759A6146B34EF951C4DF92228C2E58231A8D25E3F08ED5A27BF6041AD7011DB41F815FEA503973D4E7B5798489B261A0AA4D0C32A19D17C584B1702713D1174E542BE4EDCEF27016BFC78118445A63FC1D17FBEE5F71DFF46F1EDCD050239C68DDBDEEFDAE7EB8963B5BB4819186D45191C05AA049E50C4319936C8788AB72744912AF28BBF5CC77C835C35BB4F987DBA6657BC2A7E58B7CE69AF37AF680DC0EA7797B29528AC70D92F295C561E2EE0D0E530854AA19EDC43C01A383035F6A5DFB354E9306962EAECA25EC85B9B78E8A1DF6CA50EEC733F60C81BF812981337F784F8CE07D0C03D8B3E72BEE1FFA55FB92DD0446CEE29D8825CBAF1A6ED295E613FC700FA31167224D99338C4F59B1BB9C1E63CF77476BF84F2001D42E4161F7737B47C1A5F219F6AC8B8E3ADAECA827AFCD6BC0CA09615BCE15F1BD0803BDCBD41E68F781517907EF3DD8E8A33A1E30ED09D7EC1D3605DC72C9232EF9F92475743164E92D953177B98906DFE5E414E134EBB63C79220D4907869CB2D93280F60DBECCC81B532CA336510E2A7F1D631F7BFC517AFF223430F9804C4A4877D8B7A385ED48F390ED9666A56EBD62F6C943D0E52AB1EA247BFB07C05908E99358A51E6111486133F4A6BE3BAF6B2D4C01529925ED911CE728B4CE4E8CF8379BD216108BF964496269BE76379912E94A4984B890A4BBB9692107D56AAADAF27ADE475E98A566C0C9E33DD1970A3DFF0E2F79197F6315E320BEB5E2CA3E3C904B557075981118B363042BA687DC682F13D213974B1647FB43DF7FA168C9D4F599C5BDFF2941C111C6C43FC75E69C290601EBC9F23D665F944A9B75932DF7792CB8A005A7CC83DD071376DB11F9C950B38B270E06C907FAA102AC76722325934755F53F3650B42D0FF293FA37086241C00E99B9C03FCE21F8D7555CFA93D09A0EAEE3733A8A5E4C45E74DD5EBFFD2F75EA60942BE34412BC82FC9959CFA155DC87FFA0AFFC1E7CA5057EE016B9751C16DF25610F1981A08B8E3352254AFA433E9B86D3CC13FE9B5B7FBDAD83CFA0FFE511E44412DFF1636BCBB49E9769FC52B302AFC7A96A3DFB233831007CFD6C302CCABC119DAD45EE63303DFA1F11C39C702AAAE00FCDCA913371F158BE5493A9B5C3B06AF66C8D5DE2BF9563FB617D1490FF6510971203DD25B27E1AFB289DF894396B8C26548BD53B320203AAF053B19CFC815C5D37E3115FD6CF8231B88FE4C330545F131A01124BB2487A3363B3E534BFD38B1D5138F8887EA63776D78783AC45675ED598617077AEAD86206B9FF61E3669C93C3C3A3A8F39E7848A88C0F94878E5D359C22BAE891FC7478BC8227FF320B047D0DFFC8218C1110136FA803EF6395E52DB8326CE8E3AA928CE42FBA04B1E7F1AC7B73296CBC1567090B9E92238859A87686D8E623B780F0376B8537F41B1BB102CC8C480C0B6C069F562468D4E1FE111B24D51F63E9BD38C47F35D8C2B5BE2E737274229974CC4CA63BD0E1F0446F6C4448EDB2498F2376EE26BDD8581242703715AD434E425908D61EAF865FAC5E82578EEB0525F54320B6C264F37DA36B55C2308D4FC6C7FB2F4D12A88CAFD93953193B7CC46804A0C464740B4972A71B7EAB5F6098FF78BDD452540AC5BAA894C10CD69A992217B422C88CC7849B4D8357D86234449B452AB4D49EDB1D2769512CF8A797F5FFF4E1E0A3FBDE292D91722D71322F0BD48C68A3CC998D03F7581EA7B5F5150E7AF58A076D09D103E9F64E61A2D375461007210DB511EA89FC4EEA75FFC71F7BF31400E7783F12F69A1EB5B7228952E2CD1D6FD57109237BDC024780006C229EAD71EBF4B543647FDD9216D98DC78B43CFEAE12166CDEDDE09B52BDCBFF089B1F7427EAECC21CCAF3FD5A35EE72C3107DF0670891E1AE12C1FB81581F3A45480F1FE06BECE6A494074FF3C47F90C961E371E8014707AB0FD004D19166140AF7B1C9D6B7E4B6826601AE104CE18E17939CF77C2A31F711D5C7D5126F4CB642178CE542973466696FAC1A0858ED62E4F2741E47B83B97DCF4610B1E4E262E700A06FDBFC6709BB1D4AFA7C20EFB72E0D623389DCCB049054CBBB322E63B09176E2903DBCE49083B01EB07F140D498B793E149573D8CA91DD2BBF8DEABAD9CECA0F896A7B306C22F8A761A65CE2BC1358A6ED07327AA0FF4C0B6E2906882A12C50D61D021A1316646461013D8169C4B54C61614CC9EDB2CE0AB0BAC96B36908BA3ABDF92D11D96EBBB9A60DA780AA58B804DC6F91E54D82068FE2FB10EC1FED54B794836F54503135A7F91921E2BBC2A61C99B6A0BDC04FBD2D4E7E430F16B5D3C7F06243517452BB7D2D51340BAF550D260A26A2F3B5451AD7D4E3A70CAF63F92E25D137C9E9B1433CAA5502DA269211F58AF2720FE3F899282C2C02B78E66D3302C5B9DC04B98197D3685EC4E6D4603D79B357282932689C2928361022E79C197A470212A69AC2BFC7505366CBB2BAB8D2E31314FFD77A04E85076D76948E836CF2A87918D43208CD856FFA33740FCAFFF9F690B2E6B33F1D89F65C71 + sig = split 0x6AE10E0133138AE0D51C77B5667D4C9180E04D0935EB5F282E696BBE794C8B96EB6A21A232C9366518132BD8EDFA9AC38142BB9CDCBA77C729BC4D1127A13933DCD44630D3CC6D1CF0242355A0DE121D15D7D4618F501E509C4E0BA296BC956571AF19BA6C8C2A75110DB6ABC3E7C682E87EB280DC29066E5D45C5D318DC3F14396AD3EE29A772117429E28A7B423B54470508A48D67CB6395190855A0D92B30E71B34CF7F508658E7268A27E2545E6B79E48F7C69ACCB09DCABF5BC5CCDB8CA8CA8CAA2F2869773349C666583702F3BDF94C40204514DA2B43A91443B119EDB0B421100AA587CAF238A87F916281435AA6FBF00BF16AA7BAD080D60B35C53792C438CA39A4BDC72BD7CEFCCFD877F82AD557B176DD5C28E78563D1DE719EBEA1099718B0F4129A493C11CBB2378F989D18A97074A2E0F3338CCB9A8A36C1B3749E7A99E7A765C70E5D60386C71BD4CAB64BFDB815509166D5F55CB4A380C8CF24E6BBF61AF3FE7BA3529D84B11FCD6BA6E18B87121857B00A737B0F3D9665720C38BB54C09C8D3917C5AD646E3D01359724534BC1910AD174761D64AE6F796900655E0B13AA3EF2282DFDCFBFA5B0F6585D33455D7D86DC6BDD252B040B66EC6A03FDFB4C06E54C734145817A20C42E408E7571FFB9D6D258E585D5904BCD45D16CA6E44FDE9A25E06CD3645A302EF8F3589D897181450C178E4DA1663F2F5960B4755A0107CE43A265E6EB0C9C267929CFB1A93ED1881798E9B8A1D91CAC83E63537FE0182D022548B60CF0BA47B6A7F90CBE86E1E5D39101C0D2FB333A82E2E99E9E0C1AD46DF3FE876D144FCD3B1D78424C6C5CF0F6E0BCB447A6E9CC337481F5C14D4FB74D764FB38B8EAA511951A50F41A4CE248E13E4694704A0554853A0AAB9405E2C274A4FCF8B5928667DE041E668B17AC577173B0F4CE34363A7C2AC9C3E0A45A39A46F0248BF3D45DBA806A230DB1DC7B0BEE80EC18BA8F042BD6FEE173177FC0194124AEB21BB06FA079A1BC80758B347E4B129D69EC6E8416BD89062BACE16F2288076469237231B6FF4902FEAC3BA7D884DB747DA6371E792827017778E43708A421931115EAAD9E4CA316814904009F1CCD36763FC63038641BBC4F6F93235E16884F8A12F8D71621354B0AE4A9EED64DC5462917D4B35370AD9EC8057ECBE3A6221FE8C39B11444D4BFC380F1F4D5AD18091059AA5089E109181247DE78DFC231401A3D517E9DB655EBB914385BAC1B2888E3837FDB08A9E7AEC206406B848D045593BB837DFC41DC283CAA753D8CB64CEDA3041B2330BAEBA2F1450F646BE15E0B2A46578B1F54A73FA4DE57FA1D632F3FD410C0E8B17C11E197B7A17C522EAC6FBB78001DF9F96CC5F6116635D404AB454BF4450D536250B80E813C8F397E038590011C66C5164E05FBDE695482185F02C4B6B566BF3FA564E9232F40594AF96C96CAEF18CBEABB292BA546EED3A1AEC1476A8418B25DCE79F12D7B4F89303688539815E05F96BEB3B1818472C7E4DA7435652DEB5FA4277F2A810831F88098899FE2EEE35C1B0E6F74DF159D0631C5683C2D7B86390BCECC534CF69F3AF74FEE59EAB25B634333470A55CC49C28C7252B1CF4C293EF500589805FBE5CC056573A10F188A02D050AA34289A21D8B7D587C0A288114E47F346DA3772FCAC58CBAC669DA616C9976C56D87CC275AD463F2131DF95460A151123C964B01A2B908AEEEB7DB3E2FE12EBA46321D7A3FCAEBDEA0FE11B78605E3C8390486CA5D484E6C413847BCD8C6BA1B00BD2322BE537B173647BB63BEF929223C6AEA687F8ABCC4A8B81C44F0FE24588D2C40BF76590AF7157E2E4409804A28AFD25E36275C34A976D22213D457C162ED9274BF52E20842ABC94B2A1D6A4A3F9C2AC544060974DD687C2BB96AFDF8C27522C0C438E7E0DD4DAD7AD640A4B3ECF50CB6250C0A97FDDF15D8865421E490F84650144AC489AE7920C4941895D7B2F1911513E428127562F9446BB706FC06F07BC6C9922987A970D4FC21937BC09F072BEB132BDF8014281BE75BBE6F8C74E337EABAA16A064EBC956C188787CB34A83D5698438AD22CD4FC80781AA1B66E5A2AE0180B50B77FBC07EB6EA60246DAB074494CC9381F6011C2ECE64F97B2F5CDA92FE91B5533518A7DAC9828FB33ED428890A7FEBD0906095094576CFBA1048665782B07194839CB86719DC91EE8C2F64D4576605C2B55804299F314DE8571D0C58C78F071FE810B2FDCD3D7AF0C635303B6ED0774637B1E563855D54D2A1B0FEB5CBF84E693E512F59A13A20E5FBDB77510E3356CF211DB09CB471DD1043D9940DC1BB6A26CEFFCA03F48BABE03C15226EF29E0DEAB6108BDDEE6462884F8708E79709775AFFB39303D78BC51C8B9EAB5D91A56F8BD1518708EF243AED01A637F525E25F297E0FEDE03F3136EF23C4B33DC1D256CC92E3B6AE64C368542AAF553B1605C94C255012D605D1291098D1F0B855D137BE49D198CDD3EBA0A9D9E7519B8A5BFB4DC3F338219CEA7C97251166B5004CEEC23606421A8F9248359E5346594080FAD04EEC15C56FAC9D55EAF4C399B1FC8D68501B88002212FC0E36DCAF5016371696AEE5EBE4396C36137C535B13F09D490564D38D1E0FFDF13902F7678FD06EBF8E34E81BF712D918348728BE21965F5956EC8AB1F5A8D8276E6A72B4A69FB7C5AF658C5DEE4C8BE285ABAFFE0EF41529AD44B31EA310C3665F2EE61B5817C1191549DA070A2BD4BC790E283BF81C11EA05A6E4652823EB3FA05283E784C4143F4C029A6A7D485A1B892F7462CC26B1879B4668D133DCF6B9827D3A91E069B25DFC72EF00FBD6FBEE4970E26222D81874C748C746DC5564732CABCD0FD99983034E4F5523A43831ACC1E6F3989FDE186D4BD07E15CEECD8E68375A5EC130AD93C0837A27F5EC5810F6C87CFD8E37BE6117496F7C283AEA1DD30A5FE5AF6F8A94867A5A7B336B4070B1B5539608BE8D10BF765F6984FB2D0AF376A7DD4E5E25922078782B77C4E5D5E086669D265C6306CB40BA5755E6D83D93D33C89F548FABB20DABFE7086B9E658F4A8BC22C11C8A12A106C534EAEA38F46FFC84C2A4D96C5DFC31F6F21B3FA32F988FB86A38D7103ACBCE69C5D143C33D1186C1FCA80A13C642487D5B221DC76556249EC81E42AD4DFF51EF86F2ABC45274AACE72A79A7B985412A3E94C92CB824E3B54F328FD2F06B49DB12338284DCCB5E03D063CAB73B939FB59A569E4E693E53B446279281BEF3637B55FA1C77DB77A389F43CA7E00B8711B32F98C9FFB2FA30D66075DA836CB528CDAF3FCF65B6EE3C0355E05A46DD0DF6B3D71E8C705B6C14514A537627FFCAF805F8545A86865D9EC83B243BDD4A444D6E09A7F26F5C30D824C39C65E1596BD506F70E793CD5E703159736F7A7C1B1A08A88E348FE12D0D74A190EE4C8CF1E2FF44B9FF40A28DB611296835E251E8451068C1016A3EDA063242D1DF3DDADE57998C1FCBF7B9F988392916D4D405F82ED894AD693FEB4206E1131911E3617F5A5325701D01AACD591469026E10585C1A73ABDE7ECA706C97F48B125A8E101E55D0262334750AB98A8C4D33F98763684402C16BC7BEDF35AC349AB471E3EEFF92A79AE0F11F3CF17EA1406FB6DB669537CC0E46F0A7C42695C4595FA2F0E604F048357125EEB01AE824FFB63B70F10DA410EB93933398C13B485493E4DD5AC42744B00D2F81BDB3C7030C3DEA36BDA258AD26D4540D1FB83C7E651E31C0A2F7D06A328820D85321B24E4B798153885D80111D17811D5ABB97C69B24E3E82B44649CB8C5E828A3D532DC8EF2C317890BCDEB43571EEFD97780E68E03C1F751F5EB823D75965ED7714397112774934F465F61C25271F1AB2EE80BAAF7049D1E0C78EB59BBC3594202F002E883B7B579B98D0D4865ED783AA0ADC84A4A37E73C3CFDB5F464812AEFC6081EF899B5F4C9F903279E77D39B2DD0939329B3C5060990BF8E0BBA6CCFB6F7BECA77F48585F44F8CE7293D121335939E3AD785BC66AB2C9DC955941EE85DB9D2A4F404B3F45C7A68452E6AD108530A1FAB8E35C9EB0AC7F647DABE0E0D50358A007DB71B6D76B9922797F9CC377D675E70D9E166B750FF457A5D3D649153C81CC1B659ECF3656BD864FDDB3C430AD6FE44B21DF23D0827D56899D8F0544472298FF1E12FDA44466822409222063A8BC27A2C2DF44B1C4F56C47062E7D717705967F8C10E0F1A35B0C4F1EDB14B4E3A2ED44163651179FAADB643E602F2C92DC144FD96871AD3CD194BC83951F18C77B92518F8F3013BCBB49E57A4338FDCEE5000EFB89A3DC2177ABEB2DC34C094476A8844CF072A17FECC8E87F8C3D85B776972CDD5EA7F8ED6DF4A123197F78150A2E9CF2E3CF88617E82FBA29410168DC261EF9516AD01187ABA8E189D59DE5E243CB019E5B7C34F5BD158B5E11E9D7BC75BDFC71B040EBFAEEAEFB7639355AD3BDD27AB9DD799BEDFA24D2AC5566DE15F46CF601E08A702B133D391B0E236951AAB4BBA409C5B8C49EA0D1E2DD2EB9D6EC67F76D12571C002C1E3448FDFD0FD6D5C070E6B749E9C3E6A86DE347E34A72DD2B19C51F405B8A4F4DC04E7A7F3E0BFCB51EDD253EBCF47171E0F57E7DC04C0B1ED1054D06B7DD2E8E6FBEDBB16D086E1975676B0B3D34F3D290495051DD8EDB5C6FD727C8A460668FA7EDDBAA5AC776727EC2A155770B5C98297C45F192C5817C0942C62FD9FF9BBB5085F7B197AAF21173E1B2313FD94DAEFE9B76E068E8D6A46F25D6E81E09F34D0337F22086EB2F32D4917A6B5D685E3FB94D919BD8D513BAADC61643AFCFF3B1DDAE63FD0562C3F60228C951217142269183F4D9BF65F438D86739219161F9C6AEE0F65244E85758C0BF3B137B30536129FF7557E5C52F05AF64883FEDD419DF69DD8B9C9EA6D4A6B018CF676E91855B58B37120D84D3ED06C7173BC3BFC65FA01CA02A01E2893FEFC9E0E708506C84698BE652909F0F9793C443635A032CDEC61C5ABBC097997A62BF2894133BC991A19567C9F4549B30EF4C081FE2FC52724CEA974DC6CDCD4042D3118AFFA2A7EBAB82ACB14BE405FD6A764C8405CCCD0D1BE12410855BDF950747EB26E948C7FADFD2089D26824F7100FE574815B487865090CA8D8307D27276C8C5FE813A22636672026C72B81290AE9917FDD5A314029D02BC37EA1C39B592EECD57883952907C4A2A4203CFD6498C19328E55500BA395947B0CE523836ADD259F92C358026CA86169D73D17044AF5F4B7EB42348764488FFEB8D34237F17BA80D5AEE6F5DB8977898B2BEB745B065FC20DC567CB4090D65D82003B466C21921FCC13C6291CEF5B18E6F6F77B8E07FE9F803F40EB4A015A76E18C03B40CBB8C8095AAD7AE64B52D6A1AAA31EE00C5E4EBD04597377DFF1037A0B12D2585E8C2FF784659F3A57CEF7732CFE93DC4A7F11E5124273A656CA234AAA7503246EE53F430A79A0F9ADA4B6C0A5AD6DF6054883339C013FAA1B6BE863DADD11B5443B5E4686C5CA6CC2BC43415A116D2B908F8949FB594A470B2D6017FAD537F066B8F2BF20AD2F376B33633F90BCB9D262EB23B399E8CC8D7632E17B49C4792B2217BBC020635CE2ABE63B1039463C7D069B2B004D0CB650CB917311A049B97560768EC46A793F19FEC3ECBF9493AE80D16FE24F00953348E522E28B2668FE430454AAAD914C385490786CA7D98E6A1CB345ACD0A67A6B57A175D8A51C2B51F8763861B027D29181655D5548E2B15986DD3835404A9A282DE523A045E5DF42FF092144ED9392D589DE70678FBDCACCE10C956AE96987A266AD001EE70422549F7F27BD92748CC06E7D24483CE0B83C3F2067D522E789D849250E7F7588A2DB9BA9D5F439D9369F04CE59A12474CB5FDFB08C2AD9E0889CB0F2056A7170428778D3BEC8F9084072D6C0FAA922400D8239119E44BD7266A43C55A70CFE0984F60A482D08F9E77426AA875AB50748161B48390A43DFF04534054C2A2D5E4A84C804C03128A0D7134BD3AB8E0A2BC7753F458A38B9B244FB654F9DA3C2784CCE6958DE3DC806DDDD84A8D2AA24A8382AF4D11E52E1F47733FF61B79895A9AA426BD060B4761EE687F1134A23EEC3EA828134C4B8108A6C5B9E3AE6913E955299DFBCE6488FE32036662FFB0CD451A98D97A1538F5BC34D527ACB9CE6D1DFB5862FA889422FF32319E35AB53102E566C710D4884BC3357280112F2C694D957D26BD3372D99CDFD00CF55098238994610D18A247BBA60650EC3AD7FCDB208B15C4AFD35A25735844D66A929037EAE673D66159185E4B2B79B48746BD9F046BA5828595CC6820EB8A860EC9C458E7AB183489C3ADA179C40A386B1F33F2D41C8B1AA5D571D1E7088B0ED0372C95824E870D63A4B95D87222C121766B270A3F5523BB6B69284B676C81F20D0F37418FB0B40240414E95B7CCD6E110658CC41F343F4F56BAD2D31A495D6BB2E9141E374AA7B2B8EFFA3E41434B4C4E6385BD0000000000000000000000000000000000060D161A2228313A + +/** + * Test the [ACVP] sigGen KAT with `tcID = 51`. + * This takes about XX min to prove. + * ```repl + * :prove sign51 + * ``` + */ +sign51 = tryACVPSigGenKAT sk message rnd sig where + sk = split 0xF17916D95C512FEC0CEFA6A15C9FB3BF84FF8D7FA35522EB1C915C4D254E8935248E3C08582B745EB2FD13152B5DAEEAB0728042B00885BB92F844A86B4262035C9F448A2B78EF5DB347E0250415E1015FBB3431912407C85A2F362A85A9AE427723BF62697B77991B3E93A381133F950D40E7C1ACBC17E4F1D10CD1274C8D3C8402020AC5101CC34DD0947024C08994084DC2302063C024E18040D0266810970183C2915A902D44946D10095011A70DE404899B808D40B8454B860DC8B605C0C071020906A2002D0B2486A090112016821B2442CBB670433605DA16259A346CCBB408C4169024296C42900424064684126DC2260088400251C8409C162482182621060C12C2715098914A40284848215A18491BB7015AC648A1902C14182DD22062DCB64900096D40A84D24C8244C060880404ED318881209918B1231C91604641072DA849192C66522104818C90014446224C16040C6104A48289B4466911052D32652D8A60C0AA844D8260C648645442000D24885DC4632C822455B008D20A54501C191A2128420470E98A825D9A04DA4062D5BB00821B0804C102CC49871992424A436714BB649E1920009924C8912491A392AE0226961B25040268EC9A2080A902413350621246260B001E3C6295B2889209070C4A43108421110C071989820C4A8291A1532C4866C18146A024646DCC24C81026D49164810946C0A85909C348454242549A82104A62C610001614692E0A644E20090C8060690B82D0B858520230D83940454265041922909162054C62D81C88C094444E206301392490B1748932886D8A450D1329108B805A40262011582E3184283C644430281538804049831191846DB02891023810390718326891A0105CAB0014C840910118413B12061B8411B028C09986183186108C16D448609CB888D93B441589081043108D1C40419B44C1C8820CA30721CB58513273284B444044220611852509644033886E3483102826898069023280410180D1028454C846C09367182266418C6219018220A3708C49428E2302C92B42463467052960C8BA405D302850932924912211843280132450BA5501416659180650A446613B64C0138711149282243020B340401169180140E129301001180DC2851118785C1342802A211023844521464C2A0011B428CC2B271CB1600CC102104125284242AD34812084408818844012350C0A2098194500289610131881BA261909484912409031822A3466010164D48848911002ECCC0408CC051E44262DA241113194693344C424224C448900035801B98510B41600C25469AA88912864CE3160914272451264D1B0210001728D4A84548884801C70D93C8405B024951024A014210E1089003854811A8688B90085A020C5A18501187519C3892D0448210332188442D24280D22A330498825A1B2015C40201C0372CC968C51A688E3920813B0085C384403478E93124A882048E042208190094B066DD29010018249192891DA202A2085400A168A1C8360CA484AA2C850E4023188868853008960088AA2020A0A34450304421B400989A0694218494AA88C999030CA38910931728B442952A28D08146EA184501C314619B701CC06291109204B406640C449001324D0A284CA1629D0C084C88844E120291A97059042900440719C324E642622933666D30649A326514CA68984368493466D14078D182942523472441090123781D4106404A5088424091C088D02996C1B30500989811930485B144DD920200C012A00904DA102641C0301C2268C140845E312480920094140619044214906914BC08422955123380E5C2870C2402C9418629A304AE2864C5C108DC212219CC44DD996880C29451B456A1A006091300C120069A2A0048100655C388A18058948322481C64D609031832212E1C26C89009014B440D3B84589247009266CD9328A83440E21446199A42044162E1AC20809986C8C188C0C30628B46458010212033325A384C9806451A3309823444022009590041081308DC186812478643B82162028D5C100D609665A2224C83180941084163C28013816522039204A94D1CB04480C62400014422118021956409998CD3144AD1982D19314C0A924013984814892023B30D14986D1298059B14065B26910A380908982C19A0454426000A0521DBA0695142920B4300D1420D81302813C2200327601083910A537EA14F11545E254FCF2803952A580A4B6C9B29103D97436C003E2ECEAE2028017FF1D518B0B5D5E6242664ED337CCA4526ED5DB5EAD8BB3116941CD0C8F0A7ED5A1A5A00B98C336A9BC8EB6B3A308316F117EAA80D4B7756DD4A91DAA58E80D7B577558397AF905B67C59F14E12C158D292CA6B641ED0C75E39A914FFA1A9F24CA28F200C748DE709D15D722E7ED2C918DEF08CFAF9B7E24DEF2D51A4D420E7E8906FACD9A5A98B0D1D5345C8B9AC0BBF4B15EF0B46A8E3B6BAE0C6E9F092EB3EF1D49620B65E7DEDBEF687EBD0EA095972A56A0EAFB2D75F4321B80ACBCA32B1B11AA576FE4E0CCCC205212654296F0608FF38369AF19807568DBE171DB79EB8C1CB76A8EB95B288C9DCC620BEFCE96060F45A6A2DAC22F55E47DC7BAB4A793D9658FE27C662CA637008130F100D965B478177AC6DC35931A5ECC5F933122402C170EB8E0A41CB63FE5602F7B18E1DBB6DB30A76155C6CF030F738DC0916DB180F83F02909311CB6B3B9E553FACA05223B33C69602D0F05A08BEB84809651999A5526E776F3DE39304A5FEF00950A9A810D12E01D15D886DB2675F654CA17FAAEEBD1F561F9D1A95E0BADF7C3315AFABA8D4BEC1F0542A8F10AC666FD8D0C5AF1D6867A9D826BFB6B030B58ECEF6778D2C52BF62CB34B81FF936DA33EDAB31DB39AB76366D094362F046D5078B4223504A12BA0C7B8E883727718509BD47A696EE9880CAFF663612B9586303D6DE0D21F9A21962278EBCE60A6D46844095C5F892DACA48D782822453834B4E42CD3A1FE3987356EAB11EFB8EECD8E9CC8F39A0FF1FFB8069A441F851EB438E9C0B57E8818A322651E60F4B67890E5ED7A0FBF7536C3FD50D0B0658D7CCF275E8A9E9FBB99BE2E5F5E167BE290B7E96732F89E40D785AF25C1BA61A7786D3EF2D0C114D1048E7646DFA3032BFB7A51A63605DCE3E1D8989500D6E58E960519931DAC9F14DDA428F5A2C9C74D916D907707B53EB52C44AD71D727826EB2CA68070A6F0E47FA16E52E9629B7AA8241DAABB19497A5824E58D72675C3A67E10A119B274B84D9BEE2871728ED2F94F8559B97F979AE882EA549928D6B1A9A4E4A229F6EB3FB1A434A0FAEDAD62B70330CFCB24CB3498802A679F8F54BF83EF34472296919831CAAD59EBE83082EAB67D4ABD90229A5E93A0B580977F0813CCB15ECD74FF715FE8DB5B05CEF37D3493BEDA270584944C02098634514DAACE7047E47432F92ADCA491A3E0961A5D9F0144852E46326335E215243DAAE837927FBFDCE691F49859266E9008168C6A5E2F609C80C68E0820E72719E9B5873FA199E197F9C494AA8A3A65269E95B761B67BEC6113C144A56989C5750D450542CCF81B2462092F70715D4914EB2CAA3174BC9EEB20AAB6C640F8B5D9C6A0DCC6F0AEC97B3AF647EBF80034A43BF319BF40ADF79AFEAB5890D2023BAE02C9FD02C5BB65879C1B5EA406029AE77845CB994DB8C35211CA1DC881F7F20A4706505F29D9CD1989AD42B07EF52D9654E28E3DCB830008A1BE3199387E066B28B315CA1902F4BB0EE63FDC4C93E1AB886FD7425261C37AC58762D03DB60706887E72CF745A446DF6C6662F53DD612471A434AC56C4BEDB3C9F3647E6032B3CC0990A3A2E87052B36D4A162424E2D399E1BC237928D0BD77158079CCB208B7195079655BDB76CBAFF447C34C5829FAC199BB027A08006508D56C81D187090E71024DB7FBF3A7D64D8FA4874A8F470377B15380096822FFE465571B50C540558BA50E90EB81452F41275C2515BAE0592D53F6A6A34D2A34D8EAC6E7A03FBDB52494F4B981B56C09626084850C7CF962F9310722515A62AC085A6189ADDEA381291135731B2EE83A4F1EBFA09AF80A91268A87623CB557C9F66DEB454FB2F4FC2648F44415A7BEF29962D5F7C16E78579F526DD20E9209B6CA6DFD130F92EF724645B5B84D8724F3CF6F3A3B2A9CF61247A54BA928F53EACBA7E6D6B812C4CE21A18BA8D11450E70489BA572E5EB9A7722D9DC6AAE4F957936009E26EB3E74D9F9933F3DB4DA0A1F5449399B5E1010311F87D92C187AD2EFABB0A2C86B7D7F9A072ABC0C6606DBCD920177A225720A70576B8E82D7D53C1DFA48EA73181AF0AF086B6AAF80AB24981F275D66D4FBDE2C51AE8E8D45833729F45030130BC85B2BD9A14C813A37F1FA147F815488D7A17C0C039EAF866CEA75F5B2EBE05EF3109472BA5F7CFCE4C358B6080400C5CC085151492D13A5B0096A0631FAA30CB48F2DA873B857DFDB386D9339818073492559A0EC2DAF3738E1588B098751FF0FA1C871B22237E5CD15B0E1728EA267166C38A7197B6CC7DAD39116BE61DF4333CD7C2A413DB3063D7F0228C61FADAC3F8C331F44509B4D608531F995D15FAB119D847E6D8549575B7D850B2600E4D13646CF96B6B9DA6C62F2A80AE0258A8CD6EF4C55EEA7E78D20A464A194CECBB01E73F3276D66E12AD377451BBB94E5C948832595F6B6E382AD142D9F1B8689795E9EBC32A5A101E696CA34ABA005B4CEDA27D1200FE48FD82C17217E508A8484F0388345C9DEDE2A13928FAC32921842F6E6AA5CFBF57FAA28F43E05E9A452312502911EF9C33C811EBE7CAD730623DB7048EC218C7EA9DFC6E1965A9857E9294C4E47F4D9623CB74B65F7BB58622838DC44E16D915D9596555CA3D261C9C2AFCCBAF5AC03DE091F0DBEAE1B4A7E3DEC4390989676577A053684F57868D91FE6A5B7D3D7C7950789E89D83883BC3DAE55CA3078B08D991831BA91502A5A3354B88E159B0AFFD25B0DBB72BCD6F40465DDFC00FF8B6339C067095D6C7CB06F3BE759C52740395DD108296F2BBC2E7A5DDDE3D1C35D18BFBE3968EC59ABF85C1BD2928AB2AA678A7891746E88F439F8B4384031C3EDB73197E52A4E773D2D8B7BADDC5DD0A7E44C808D73B8181D191C3C89FE15EA90D7567E8916A337830305041B1E94B3B406DA4C36BEF05D9100AB992A4D562533730E0D8C052B3A62D3F69A83A0C9B2124F12AE7DACC978C4A0ADCC2EBA2D80F494AA16EC1E8E71C79B02F3261B6F9868B8D57E9D16F42B7CC66406549A276D371437DE88B7F39E74087CBBC5611680312DE8F0C36814E174F91EB600CC96E3CF51BB20258877A2AAEB827F7F5ADA80786B5084C802E606DEF388A39CE4F0D5BC19394CE841E2D2AA7425230580FA6675C51741D175879B4D03C390F652A503A7516A1F075E3082D52C60B8642A8240EE944D5FB427376B40B0B282E19AB908CCF20CA926116490AFED57EAD0DC0C8E296C79A48D088E837AF067DC029EC631F9933EE4D20746E64E5F216755A138974D308293736DC18604276CC418BA69F872B58E7F6E3A8B846EBAAEB383E7F890F54E77F5D7F5D4A58DB783ECA049F186171282BAC2607D51B298B14938EFB1928FC8D07806E8C3E73B4646BCF16890CC1380E7B633502B3EADA4477502E2467CFDB9ACBD1C72BC6AEB4F41E1C23C636839E357135F76BC39C4F9AC1CE8F1BEEFEBFF8759E8F71965D4854BEAAD0AFEDCA9D4D6BD1E63D348A42CEEFFC170D0EE9F136F5BE9901466926122F948BDDE2A9107D2A98BA2DEA6D6F2DA17724702EC518C03753D51EA831E95CB8708D5DEC822DB737E44143C86F47177D85CD098C21B9BC800DFA9DC26FDC261E921DE002D81C159F8EB1FEE67679D621ECE6B36D01C775A1645D52292B4B2B8227318772A8091E9EC017013B195EBF4EF201F4E881C493633C07F27C9790DD8AECC9449CF63BCB11946169ACFF39542266B0C6685BBB080B59F117EEB2A73382B3D187C0680C5AE709070DF03A008A7AD13226F3C3715392052F2441B4A178D7CF70518339CFFBB54A6D9B9CDE3B0B57DBC79F4E47AD6274CE2180C92AC6410E50D05F6665A57D4D4476C2C0E6EE0757A3AFEA2B1BF86A551EF98AA1DFCBA96315959452B2B3A2FCBBB955CB3FA1EEBBB83BD178767C02EFBBEFF6C7EEF94B55DF8831DDFB7B202CE7DE055EAF9928ADAF6ED0E3159CA56C483FA3BA3D2478CA394824CEE6ABD59670953EE80D383AAA608E15851135C1CDEEEB5F6A8897C3C9E066AB4734FDDFABC3BC3BA1206BA5434DCDEDB9D8B3A81A2E638146D83F14F06E56099C0C8A0FCCDB9ECF0F3D88DE3792F2D0B651B619C571B69F4BF8E7CD1910F266A4DADF8C2ABB4AC05BD1FBA058C0394C016DEE60C66401A17D13459547933389A356569ADA532C9F487698855A4D7BCCD0EF69531094DA4086F52BF98CDC9A4B0BC888DC3891A76096C7C483490E952326AE402D8DFD2F3DCCF1AA5D7BD698E2AA88D294813A88FD31866BCA11B3B91C009EEB667601CEEAFAFE97C56FA33F9381F3E4329901AC3B7EA7032C019E5C8A8EFD7044C973644AF2BE420A033C6C2C7CE0CEA3934DC18B42ADFD7A846F42DD406866A390929026ADE5C791B5F61F942B155077D82F2AFCCFFF85B0406647A9627E3695D4BEA3D58A63E1718D184E46B5F4BC8410334A4095D0FAF306FB9DC109425C31652D06FF051A162EE2B7B1C54D6C7DED6E395AAD1A86D03B1B6C800767EC14412EECE134620A61D369AF49E21B0D14BC4230649CDD3E9FD847AE50BE962EFC8CB0F339F9E6D3247533BDED8711D461D4AF2AE3FDD1D7D2A289C78CB19F3CDC2142BF52B23E6A27B39D699543C3D639B9C72CA80B37EA2775B5E2681F0DD01DFF0C05513369062FE + message = 0x9EFF341506D18BCB27A7FC4EAABF5A7C4A593777196F664BCE316C955B835AD4C9F5DE9A2BF89615DACB9C1E618C78E71144CD4B7046F47D9A600E9CE66596C4C55EDA23A66CC118A4A7BD0DED00ABDDCE53FBF2482033A4188506EC113BBD98D9891F0D69463A0D36156BA3EA0D02A14C1FD7A3FE704EE56B446AE179F72E104AA81AF0A2F8FCA6F6F96296059EE8826680E43F4B0740F47AC10566ED310799AC7141D38F6921315F23AB3E64C8A770AA57128090DB828C7BAA59C3295CCAA238C75FAC0F93DA7900741BCD94BB9FD3852EC2B7D33F600B1D51666AE222A57AF140FA049C2C9F6D0FE6C0F1E7A0DDE1143BE5CED7BBE232CBFBD8AE00EA5FC165026D729DB30F6AFD9973B6722C07F600665441E30B7C5FB297B8AB969C06839D331DEE96DE48687DC9DA531A95CA83A76F4B076DFCF483F00450E51C8D34D8ED8E4B3DAFAE664B6DC13ED88E6D63027DD438CB74F412E870CC9DFD29B52ABCA169C17E974758E03AC0FB7FE564508E017A9B4749D641AF0DE384088FA00C6940233DDEFB657C181C82A1B6A31FCCF4D52C9D351E6BDFDF48BCE414607462DB769F9EB15925BA9FAFBAB229B5896BF1F8E47DF17C8208DFD59604B6052CD2CEAB56400F11C4D9521E1AB8274AB5764C73E94132420E32B6AEB0763378D9BA68E1FCDE2BD6DEDA3917C000AF39B78F4CCA7C8FBF94B4CB8A8116EEECFEF0131EC9F2DEDA0140C902A8D6E60E98B3CD9D9C75248BF8845AC0D7E06BA0E18310FECE986207542CC1EE088843EF74A26AECB6D06F0FEFE1B72CF93306C32ED28AECC55BB103A0846D0C84136DB0B054F3DEA39A726C6FD6597F9B038CC23846017638F44368810D86293DDFE54861532F85F53F093048C3E009C4321127ADAAEC6A5CCE03E0D9E91DACCABB2F50E01EB2AC2B396D24B05D453BD51D529FBA51E46D30C56613005ABF6263B98D8DFEB52616D1CB7892181C2FC2E2043B994C816658482E0606348378A3CC8540E020273F10B69E2021A92D9C36CC9B9779FE8CE7A499AEB53EC6DDB4F2EC22BFB452FC5E797D3A2533260006FE6DCCE4E97665C68C3993DC7EA0BD4BDCD24721B02B0902B1840DDEC5182038762D55FC11B9873A0DD2EBBD55ADE3865CFF3D545F76335369DD9E70B0739977F6E98A6127194A1926A697E47F73E04FF5BD525E8F1722008F7C155CD3ADE0A5B66A3136FDD844AE5ECD6C8277C3D07F39721E911950E12820883A6BC8A9E793280FA74FF21AC2134E6BAE713F4389C9E7DD05BB4109B55EB92351C0EB921A0C3FACC5008CB85C3F2D5F9ACEAE9B4B714825FDE2B6263FEE1033074F59F073E9395C0D8BB5D1EFE5BFBBE180F7C591C172AAB05E7C53694C377AD27B9D1CFA0FE09293405DBE1CF8847A351F727768E2AFA56B54FF537CCD9D6A49D1CA745FF5DB54F860A74166DEFFB0B2F92106B7814C9CEFFD11D563D8F33A81C49D1BA83773572629F8B47F9FA27D2A632C70081E2EE7ED73ABD24C027EF11526E1095C2913DF692925E56839109BD05ED8E2C9086163CDF945BC16DC804C0F61EE8F3B72DB0245F6786981FCE0322FC2AFCD4E8E5203B51C7C372C58D5E292A7E2496C3F5D7F2B26701C0C167F49307114EBBE13F4F1AA5ACF98F20729B5128480014611A444AE6DE0437FFD5D84B56E3E550DE86613A9285A10840BED0B69F019699B34B86FC622D325269D1A046B53A4DF1293A52CEE1C35FE816B67819207E09A02C9D8594D51E8B314552FDE26DB7CEB8D80124A8A1C33748E05C1AFD6E87B567C41E0E73F325F25DD2F482190C404421A3D6A0E5D5CDBE2B0188BAC77C6E35D77C0A32B1D9629F88E70A765FEE38C1AB23975B945F2161F6CFE7E682AED96849547051DDEB77B90F6AF00747C47E02E80B69A0D4B78A47DDD81E299271FA78FE423ADDF120DD04D46C132E970F4A04E97A588D27C7BA84326182AAE04C251289971691D9678D409881688F3BCCB950830E65B784841004E404458E6165963CFB4EEB505FDD135F31ED0147CC9E9877FFF4107689106174E7666EECB6CF2DA9C9351DC434A9449384EED7F5F9077B42F0FC5D9F0F5F7219132FF9A470983E19D30A4F37D189744D832FD5FB397494E11ADF74F4E900A4187CFF5DA8F6D7B35AEA016A8DE8862265F1369FB367EF1860C8E07C33F3282B4D9837CDF3EF658422D34DEA41E56DD18703681D044E3C403AF33D1E7AFA96A8C4435FEBBA0D25DE0E4AEDFFB82A0BADE76B66CA9BEC7E9D73F1CB29CD73CF00C2F6044D83453CEDDE03F972EBB032062D0A8239FB699EC890D320F6FAF3D207BDC9AFEA2028B8699562343AA50F70A4E8C62DAF8B8CCA72D024763BAEC250023EAE825C651ACC4AAA0DB6C5EC7EFD071EDFB95AF610B6401614F4FC6362775C3810A9A2169F84A21123B031CCE087D520E99E262E8812E84098EBE9BCED6E6A4F73B674541DE0BCF5E7E318F906D901FEB1D9D1CCB6CFFE850DBFF75C8A89F43CB94895F28696FABB6ADCEE7697E60090387436E19B138819B90AEB18AC27D2C659B0DF17794A72F8BB7CE03EE9A78FE8C8A3745D505DED88500F4CF98FB6285B0BD82E27DED933BCC1873F88ABD828F6047ACEC472DEAE87D8ADE0AD07348FFAF59C17029D84538777F73BFED5C63630BC443E0FA12DE722DABBBC2250ABA3FD86154EE208D53A327A7FF26A01793394D04158BB320600447E2FD7D7C6DE076A513D68195B067204FF6005B1625542B28372F06806053AEE2EA9F88AEA29A2702154BF443BC707D0A96EB06CE43EFE66AAC1F1695E28CF107193D062E71B63AFDCF9E050BBED7484EC5E80C515AC820F0CDF965DD97F7A11B57B21A04BF42F2A33D619764DFB36311FDAD8C83A748BA3442C570645A785E6703E5BF22E846FC516CB49915FD63B63E5DBF56F55EA40116D5034BBB945F58D67695C796F1C1D053A3EB28A95E8F388E8004C3B24FD5FCCA7BB1E3B99A9F3C945EF8A535F137432071A5CA5B6F7DC7B8BCE55AD0F3B6CF1BCBB9CD35E241F86E4697272648F473DBD5B7681EF0C78449E6C5FA930D832C851EED2A651219D7D9C3BB23F3C6AD7EB77868541F3CEE09F51EE04EBA1BBC29698AEDD3C7ACEC4429D7A40CFABDA2293480164F37ECB673F2B5D7515743AF7ED0B6E096F0E2FECEC89F40D6AFE0BFCD70379169998CDF4A20DEB6C67AB4E36AAD53EDB98A1361C5E9B0DC1636D751A87B52053BAD5CD2BD6F6BA951A7E87EA4B677AE00893A1F76723FC56C494FB5CA2F5DAEF8589AE25B5476F4AA89D404AF1C2665ECA181062A4B5ED590B8263364153325AC979ACA1B6450828F656AD447CF7E937DB3CBFE550A469322B546ABD60559145E1BD42DAFA318B7A0D71170DE818BD664FD38BD29924180C44A6D341BF059A0D64855D2A5E291B671F490978B0ADD90EA619B30A62F5DB4EE7A10405989AC306E9C7BBC117538002EDFED874730FBD48AC6BEC720C83D51056748DEE2BF955E7BD7C786DF6857A929BCF8E381621B3758F2FFEEE8280836235B24681E62BD27C26FE9636753C78AB5A7EF29FE60AC29CF67409FE657CE653A2FDAA7F20C5019E6F7432E8CEB9E9992E646B78D4365FD0217746F7BA31E069D754E05ED5A71FC5E7D6D645EAF4144D6BC43055E6CDB8934C7026408AE96535BA2DECD2F7456D6ECA42368CD9AC5057B7D1E12F77AA87C437E7A43315DA081E53AFE23B5BCC2F4CE3A8006E81E08AF0A33C1A9307C8D5AC59389F26924116CAB0B87D549D0383C274E8E85D46E0FCD70E36842CA4C8D6D0F48F3EDF9E9435DBF5575F8EB789372758BF5BDE99DA2B98183DBAC82D1C12003724DDC42AEC81C0C7822772791504C90EA138B6C91DF5D25369CC2064FD5E2CC9D893BC4235D8817624EC9FAC8EF1D45E1FB58B38EBD8DAE12FFA037E07F5B411D4017AF952D8C42C61A2A1E8E7025D6D3A285AA17FF0DB439D0F2AFA04F318D6D576AEDC6F1E767A66FB39B72C67F05AF4087120DC898882DDEA17C9532B27AB59DE40D75D4175BB49273AF873A92DA4D87E253CAE72A5264E0C1DE4C9CF91A1F3AD605A0CC8D919351F9371AFC68EFBCED198E4CD1B58CA285DA0265ABACAECA8EACF02A4FC767162E247F73CDD73EE3278AF94AC4A8CB2B01556834A3C0B8D06D05F23B4C1747E76453F49DE08DF8EE0EA625647D1BD080E73C4197AECB6A23C25F00C6C54C8A4CEF76659528B36742EC17FF0EE37B306DCCB887D663365DC9E81D5147CFE5050DB409DFAD889C386F12A5CD0C95534113A6D0ABCB5A3F56CE23EE32612279E8BA239461258ED63E7883E115BA0581B81A7F73C1B79F29A1162E6E84C715BC50285FD38D4D6DC08768884BF4FB55853DA7B5471E73A1478DB1E1CFE6153EC6C378DD6A3F42296E619DE763FF2DDB83E51584C28DD8342E929E15B7BBCF5D6ECB8779CF7F3A9AC16A431F52A234E6A3699D9E44840A4D3D485DA5D90394B181EF8998E6D14421835909CDDB167C8C3878194B6D514DF8636D4A14A1BEF3CA381E36CF2E6D5FBCB40AF0917D6DBB875CFF64CDCECCCFB8BFB805458DF82C74EB863A969ED98B9C46E7173C090DB068B2D80CCE32DE5172B5D4A8B909A5A4CC47FA9F2ED66E6069CD96AB1F3E848C68720FEA32C5736E8AB51005FE425833F20756C1967623779D0AD242A1690683BAD2EB123D97AB23089015514D0C6A3B0F371525C23E5F53844C81DDE87CFE9F065E11687D686B072C1900F5C9A7C31FE8BABE9F090CE2CB3B687BA89ED83C0885DFF9112B52F6CED71E32A40A9ABCFFF420B62485847FFF703CBB743642255FBD0A9086A7B83F9EDF4324880C5208F7DCB1EAC338F9131665A0CA6BF0D612FBA63FF7139199B1DEE4EE1E989BE4A03AA8AC4A483ECB9EB41D221F5997248CFEDCBF6CAD8DB0A327FA288FD6AE313984FA618F7DD4EEBB13ED85C435C0AB0773C5CDCAD4699B9C382A1F37F9DF8C3AE157DF059F9751CCA693D5492AE9CD4631226E62E8139064FF0027CFA1954EE936AFAD0206DD2AE228B6DD65CD9A9D5FF9C0CC48C8C2E98F5AE6E2C9797A8384F8A3E3C748C706FE6A3625D2A2EB4AE2CAA049241A478C1A77F5C90DDC94184D898050187D670043E4E78F54DC608424F3BF5E92C70C0549BB612F480AEBE5FA8B013327103EA1283311301F91477BA63ED4F9C28FA34EBCA761561F9033541506219C5707C2F8ED81ED3615C8ACAB1280BF7C5E00EC1B27583AE9092B23166926F9CC3C5AFB66BA32F9AFABCBA7F7916A8242A79D7B0ED35DF6526D7D2BE6309901BDC03D1595C26719D90FC0791EABA767351253B06AE4B90A52EFBDCDD40C096F24E9529FF89F959557075FC8DDAFE6103A5138F09FBDEB0F5F36B52A57BE2139D89D2904BCE2B86D03F26D56F41840071A158BF546E10C4DED0E81B00D9888C55D53E11DB70026C6467ED2AB0BD91EE0E7C3C3E0837F8CB9BAE004E2A8FFECD59E792F13F927CADDF50F74D29BC62EF2F02AB0F96E273E8D66DB4482DD1BD5BB516E723ACB0F0B97BC3207C10CF394FF62E2FD7DBB3D4311B3FA2205BF870FFDD181C630C691D4EEA86B37B238F18789E00409ED18A63C189E38CB9FFEB303F4E43FB3947C74036CCF1624F856E24A7E9A21B8C27CF43D851543A5CAFDA305CC638D948270 + rnd = Hedged (split 0x16B82B9B0A905BB3D87B4A1E40AEAD3CDE63B22CB716BD467A7BE84AF19B7CFE) + sig = split 0xE55D625692737213DD3D7F5142F3AA3387122F20C950930A7E7CCC0C6D21B95D6247D5FB3ACCBCB8A15ADF9758BA7E409A76D01CBF0F14C3233B21B05D113B1F70CB21785168E23A294A0DD03250DCBBD1CF80197AC7FC372D5A5ADF3E7E892DC60E759ABBDF698228B6D0F3F4CB4FD5DC5DFE8D01B4939F89531874292036BF34CA712B0114FB66942881F1F17E80B64E0E9E9E60D76AFB59C7969FB49C987206C16CAA8EC748E6C3AD8B4EF7819274C05A2B548D4715ACED4569D07C288018A39FB714C651F9027098D9C109C0D7CE8B817B30994C851CFAAEBF0595BB6E01E4FCE711169028C3C4369F11CDEBEB7115081D432B12A64EB6F935E4370DF749DF734DE35733967B72452F9270BB6FCD908267BB319D9E3875CD5B55106BFC0015C8CBFCE11841E86E92EC1A26886CF62A5C0594D7B8D07852688DC5BDD629F821DFB3284374C70E99D30CDEE90644CD77133482BA36207102B16EBACF9F1536C8F14E3630342D236C77ECCABA7C174F3F224A34A15CB38FD848D58A2C8B1BFB87DABCB6D959D69BF06E8DB152E18A3631A783CEDF36EBBEEAC3C6A6522D890BF95B1D14A9BF3731E01CF52995F0C008E897EE532785817D47E5ACC51B48A5361E8AD7F5C99374CE06EAC32645FFED39C10B7A593C0FEE89EFA4ECD0723495C9C47847B6B7CEA4D9A1B637C1F1FB4E4C38B04AE51363DC44C47E869CAD6929FDA1FEAD3B59242F70AE5F2C00FE0109A31087F0ADFA9B838F48968B9A35E74DAAECA4CD267C3EAC93269D6B8334C471E1C8938809AF00B57FD95A8E36C12E7EF10CC52AB3E448DFFBFF99C966D228467C433996699542ACE0C20C6599C8B0AE76E8183EA91D44811465F7DFD1D17B7C28E0779D799CE41AF1D0FF8EEA5884B347BCA14748B7C3D5D1F3DDA63B154CB3B5FD529D7EF0C7402C34BCCF1C6730C04DA1C75EADAFCDFA21E4B5338B372DCF4D074861B0B68B2705A08C71958402B21E59BCB6E22C3C204CDE1E3524C15B3CB42A8CA72DE3DC45266E29525D248AC21673DB80F291EC053E2E9E39125E118024F5FC864CD9F97059C8C8575D0F68753C7A3D1BF7D0DFE2F9BD44FD2175867725AFD328552A607D799C722F6EAB2F26440CFF52BDA1A907BD9D2A642E0BA1B878D3C4849AE1DBB44A4C457A8ED5A36B098D728E6D1734FFD6ED24197DC62D5B8268AE2533BBCB7DFD001583EABBE7403D80D59E6CE03C7E3E12C7367E4184E8B416CA4AB7EB16ECAB5A69247F5E81867D30614E0F7539EEF2F4DC5E2340E83CC010AD5EE6068E5F55C569655FA36E738682325F36A76B2C26CD64C8571F067AAB8BA7DB53481A068D36F17774E6F518628E8ABFB77F7244ACC89A0E604BABB29E95DF95289878BBA95D8EEEB484F5817EA1533EBB43F6D4B760FDF4F868B61D9AF7DA77FABB7444DE7C322D5C24D84DBFE05C70123C43CC5F00D51FEA5DC93A5C32EDE0F159A0B771DC65D2882020D859532D302DFCA9EA45B0F31E669FF6F15E9B671DBF5E19B32AE8CEE590FE825C197B843E45FF5DC22E496AB12D502D21F72AA239478DB517643E96139053EA574CDB3D43C3E7D65C5489DF6EF9E4C664F0881CD0F69D9ED7CD2CFBCC540E96D74E05D2B38885D860A4F2E4D7FFAF122EBAC45A3A3EC5D7F3604F27EFE035AC4A8B147DC4EF619A692E4980040C18B942C68C8A9943A65ACD7220ADFD9CC4AADF6C6C03EF483EFB4ABCAA44EEC4258FF98AC2247315FA0ECB00EE9B393F601F0095CAFEC22C355FD9D129B54DC166518F173BF4F14942360C5B58F29B5901FB157F21901F56698BE2A544CB84984B75A8CB830DE81C917FE4578116342FCE01AA625444B7D6C7F1689A003B7116F9966A906C2C4E58BCDDE93B60B7A097EED634DD494AD985D1B79514EC6A40E83180F1D85F75F6923A4FCD0A6EBFA12748792704762CAB2506EB43DD1B4B24FC93511C45F6AE77CFC9E620E4A52B3D7DF0EB517CCAFE58BAC4079575620C5068881A8A0D1B5C531A9CA84EFE639BDB05700175A13A08FA51D5F681DE69E540B3F87C4697A64EA851479CB925CD4EEDFCEE036ACD9365B368096FE8006A3FBFE86F09E9F26F442EB1817604DD6EF49361E578D4DABF05A1F49DFD57069C134597F248E61AB5AD091104BBA0A8A3A333CD422C66C29480159D567402EEA7E490DDFB0B3BF07A0244E811C43AFE732A4C923C23378B4F288E1C4E7D0D6BFD20B593B3753028C77E67C4DEDA27A9E3F2F525985F6BBE1180234930C88A63F9C414772AE22142281CEB9F7B70A82BFB2536A6ACFE8EFFB68609157ED9268FDBF22DC2FAAEDA50F62453DBBF929D7E48CC75ACD0D345092F0160BBAECBE6B330DAD9B612CDF511CF2B2AC6619A0559085864ECDB77CF64E24B6EF407685EE931B13867F9292E7AD203A6293F2258666A07D8FDC503EE66D466706DA4C4A1EECD4DFA3C3436C2C51E86B87B7CBC6716F36EF2B7EA961B0DA2C842BF30092A6D9D35B392BA3EE2E9E2AA9070CE0F07FA7C3BF7667F5CFED9721C4EFE7E868E7F628D41467B4317B944ED391B3EF92DC75C9DAC0500C6854EB8BC29DF6D6ACCEBD64486AAC95549A13F595EAFD5C9961984C04D1BE52C428D2CC8830026BF469F2097EC2CA92CF0A711EDE2A257834092F358B74ED63A9DF0DDD45F8258D3720569FF1EBC749087B57AEEF8CE3F59E1C04624F89D93514A44FBEA58A6AC9A7CA311A347442411F5561A3BCFECD92B6CBAA6A267B9E0CB3F8DA8C48A45ABE2101910C9DB0164C00B6F3BA1E9EB749A6393E5743FD37BEA8CD67D66DD906C696705AD70F1FA52BBD53D0E7E87E098AFA6E60E259170CA36E4F8F7951C48F6629A4DE4E73A92C62EAB8A757C45DA54B16D2ECC1346678FFFDA18E14CE46AB6AC65320C63D543B58BB152EE0CBB623430DBF708C6E85B07666D4B39C6942B229E3E45623D05032B1671BB851B6E84D3484D6326609745B8EA439600FE0B85BD2240A4A72FC1EBFDB522D51FB3EA7C6D20FB98A5F28470F7B92A12630C2D976CC276AC32E2B13AB3AB9EBB61B46A5F2D4DCE0DFB9780894A81FBB2723766B908BFCD9F63B2BA54F19EEC116726C798DDA3C5508617D5CF519722652B71F7348455C9D1FE75420A5A3159E88A0DE5771CF5FD270505F728DA54ABBDDC50B8DB2EB42841300440D5F012D7163D8F41E7707682B9C4B21F5710B6C4840DB1B821B27709F6D59CE4A2FA831356943F376D0D7C7EA0E5C8D9420F35B1DCB949D5EDA8900914AE63B5EA620D9E6D93BD3AEA24B5ACC9D17BBCC6C4BA68B165FEAB30D492D9C19484E1204E287C3A3E8B4479C7B5A595C2C9A83F9267069A12D3AE78870E315426DF97EB6CF3C95339ED505AF96A03278EC6795BD4D35797FDF5CB14DBBE39B9648A75AAE34A1959697DF87D8CB82F3257BF849E454EC4A065A40B7336C5D107F81C9107B80B4BE54FE6A1DF2903E768A4328E218F1551576516F055718C28D882DC8AC1E75CF2D5B818169F638921F1A6ED21DAC80A10211898D0F29EDE5AA151C9183B687975E7F4F9BF5FBE6135A902562D99D895FA788A67241DDF1314D0B4B62111B7A4068D1DF6D5502A0A423C7CF11F151C8169DACCAC8FB9084EF84E3E77264A1F7289CA917799BF28D23165303784668A1CC6597D489B4DDC874FD204A08B8B373B1ADBCF633907F337CF0E2FEBE62AA14CE0753FABF7DE4883798930A71BE8738E9D1DF65C914F447C04A707C8CC4A5C81AD487CE5195AC4298014FAC2261C5028B9F67F8D519ADABB8E90BA3BD94D61BEFD33C0CA7B09FF36847011B4BE81FE71EE81D761BB83A6A0DC2004024C1B4DED8AC13870C369C950C21764AD9D446344E5327B90E3EF4528A62392CBA1FCA8B439F1B1001F06D4915DDBAC7D87D4EECD4A063EB48465AA4705417C95473A4980C5AC32416A3A2BB9D92180C7C1D0C9954BC3EA0D3F0EE45AD8BD11D0766D3CA764D8CA4C8F582CDD951FBB768D10FDAD45CE716E2792C4A6174695DBD8EA9A5F0EE00AA2F579C374A770993B23D73EA496B55477718D782ECC0A4EF8A996EEB44B5BDC526DE16136E132D6A27B2ECC7892A18159B8C704113DF0F9F93E473CEAD5302DAEC047C861CC9C2EC04016117313F319AE724472C559512E9FE307B0CA6BB01520B42500EDFDACD6348BCAE8C63BFD0222E6912B4B61DF635C2B5F82072359825E0E21F79C371C7E6FD4FA91408B9868BD602F0AC8C899A1C610F12753D3FB2302E78E95B1F021CB90EE8DE02757DE40A3E78F61C18FC50C0FBA05A0588E868AF572E134B4F68E6EA421754373E73272809BE71D788F0D06479E4DB4AC3E0DB81123FFADB923E0A437A63DC215F464031F0A68ED3737E83E5B4978FCFC1206E8C7CD3AAFD454A7047BFC66A6A81C380C2608E6EE47258059A5398120EE5F499A0137E99618D0052DE373D5083B1846FE9E675B9EF853052F96189C090DA605B39E2F0B5AF393FF29F34F62D59ACE7464D0BCB308F1D322A5BE640AEBA5F51B7E0A443B1DA9489A2FED050F44B36DAD392CBA8E2BDE1738D169EAAE4E97CD61BA7539F281BBA90F6F82D4CBE4938211729AE987ECCC6DA17D476020B6EEC6AAC03C9508A08BFA04F66F6548CAA7A3A8BB3B8091B66D2F9D97BB52E6C424999763ADD2FDB3946DC1FBFA894578803CAA3FC07E8D3700A770D6572AD317B19EDF969840B81CCCC6CDCDB0F32353B64578A6A0886106048E1BCD1229500FD28C8951D1740BE3A7758A6095EF6A98C735A5C0FB4C88A1DACE793D4E4F917588E05F17F5EFF849FEB1DB0DE8B2F7D490BDB06B3A1BB5C6FB93EFF3DD60EA6711FE6ACC2C642A852E2439346BBCF889B349829CC004296D25CB19E153C6107D6207D2838B89047006604FB6102BA092F41A7AD64FDC6C6C27E5EC681B957C1C952CB70A8DC75792004DC05FD4F4883F8D431205E2140EDD2CECD52F1AE697DCFE9680673BD46373FAC84F4C4F2D6876448EC2199944EAF2332383C8B17C27439B67F9DEE1AE03A5A52B96B2EC4A43A76DF4DB325B54D663EA65C2A84B80CC652DCE6F612F58D1E5648A428DBAFA355C9ED5802D5CC347FB0D43207AA437B22F0B43B994D3D9C2D7025D6A1299E7326CF00C73513384A90C66C919889AF1B6F841B1DC60A480730B21F9B8017E660DB42B538D7D0BE1A30C27F62F2734537554F75E051C5A940814DEAA98D9A5A0BE80C1EB3CCF7888A4A203F8791F8484A70E951A85EF4CBEA299AB10DD853F106A9CD5DD7AFBF5D9D9AADF0378AF1DEC18EB00B664B575A500DC3645BD0C66CEA9BBD1F7E46ADA0E810F6A71605C41D2124514EF6FEC22734CA794DD1A422258140C4E6D777FF5C96981A3B86D1C3947A5C4611C912F67C35E871A85817D76F2E0B9D04333F1C1BA486F48D5AEB6DCAACAEB0B6BFEF4F16E5DE49053CF9E1380CEE5DDA401BC1650D078963F2B7A718E86FD1421DF4DD7DD4259B3ED81E3AF7157E704D226A883FC03908C88C4BF745459D8669FE27ACE5B9CC437FADB409ADD739C065A2143FBFA1B41319FF4240905FE5617529CC7E2CAC91FBEE2EB92EED476449AFAFB076298ECA0CFBFFA5E1B8BCD33FB1A97FE506522089EC38788CADD115EA7CFF3070A340E301BC5CEF7A6A431B540B881ACAA07E07D5E6A25858D1D82458276B265693E88FE21FE6A6B97D6707000831839A6913FB1B7ED11D3F97431EC21A2EE6904C0EA4A171AF8DAF152B278694FDFE6B9F3E7488B095F4A7A058EA8F6693D917A6F6CAD0316EAE004FE5471506D31E43776D61BA9EE567A3934240058E32FD497576FD80E8BD3887FE87472F7BA2625E4D586CDA81E8D49CF04925B50D0733CC917C30E6702C5DE48880D2C0D6804D551DF4F23897A2941B27ACA86A5CCC4F5D3E1EFB8CD84B56DB6511B812697AC00FC768D99D9358E4D3EC0C10E8D9BE579F3C7A0A4A6A2E98BCD367976F16AEECF918D91B1AFF2F543F6B23A399FBFDE160352186293B509C4EE279C566F0C1C1242F034BD44524C327E64DF7816D99ED78A11336542EC3607EE3F19979B929D3AE49883DB0C8539FA8D73F5BFE07540509BF2E6B6A533D0C4D6ABFF16DE309C6890E05ED3D5A9B0D96B0A43459A3DE8B666E457058E5B72FE50448CE46843510D9AD336A9C7F6CF6D2C9546986D9E7890871964D5DE1D9B374E52F514AAEE3183557C380FB3F6F21C6071681F06BD99FD4212543EBA4B60FBFB514D02CEE59E59B2E69867BBABC808E4080DF53B477839245680F06A1D33055FF2A238ADDF5CC5EA9CC70A1B5B43E9593D680023325D25FDA7CADAA1FD224E3496E70DFF893BA6560D1113A69D3BBC12979A2BAAE9E2CFD2D3EF95FC40809448805A3F4AD2B57D61A2267BDC32CB842E9B296345740D8554B216779B47516333E91A529DEB26067F97A0A1AA070F1E23ABCCD50F3E88AAC3ED06253A4A62859FA7D3F51C9ACC52879FB8C7DDF1506670ACC62C2E8CC9D9F600000000000000000000000000000000000000000000000000060D131D20272C32 + + +/** + * Test function for running a `sigVer` test vector from [ACVP]. + */ +tryACVPSigVerKAT message sig isValid = verifyWorks where + verifyWorks = isValid == ML_DSA_Raw::Verify_internal pk message sig + pk = split (0x59B2371FE7BACC207FE1FEE88A8B3805A7052865691789BB90542FA47F7EF2B75FCA13DBA5888BEC320514DCB05FD26EB5541F6E572ECEA6C4F1D38AA70259094AA945F19FED0D980E65DBF65DB80F564FE29D836C5479288B55CF07F4E00159B6955DABDECC8C4D66AE688728BA6D5C0442F3C1232C782C465B9B7C5014B1464065CCD8A56D6B1C16510869E014E6933998EF725520B400913D93B0EC75E2FB725DC1AEC0C0CC7343B9E544BAA4D679860E347B2E947D8D2436F09298A7BB8336B9DE9CFD5CDBCD91C7249268CA03EFAC273AF52968D501406CD9C96159D7C15AA2900330C1189CFC2CD8B912C480E458297EF14DB694A3F1E72C1DFA3A3D2A8A69E011602B93020BACD1C2F3AD06C95A7F36EBF5261F6EC106816BB3303CC00BF4E8688D2E8548F10490D9EB23C56793B34B8406CBE443D8356BCD0F4F61D0D017D54831B9BA329F8948F25C3122F9DEDE8CECBA51569EDFFF895FA020862C5DF79F864078486B5FB228FD789C35FDE1C54BFFBF4A025A7FE7D8C3490A5D4E62D04F79F4183CA68379F4648BD5B2416DBE5B845C9F4B7A7E2339C0506D58539EAEA9451C9B2FE2A18C849DCA7EED9DACC058D005FB7375C4EF45B001543FC68E47DDB6D14FF937D1AA0D4D7489DFFA6210679CCCECF9B8551DCF682D2AF1E5BD869F3E8D400D5C861AE51FE7EBBB5457F2EAAFD093A9598EC721C69327C51930F4B9FFB2AA7F1A28436B6D808D75392BC43C1B5B859C66C54FA515C7A615A69E60921434AA9CF9F9E03C3CA35B5EBC6A409E822FE76E0924C6C062F1724C382FF3C8ACB5C1666C2EC26B7628E3D7C13DA8D758890E6CC017B7892582E95EDD04BA9345DF70FAD56EA68BF8875B932C28B32807C86371E17DCC04725CB597B524467963E1D4A61B5FBF9EC504D5DDB61793DD4E34AE082A5990EFCE801E938CCAE738E02E90599D971C2D7C64E5B6F8639F758ED621C1F21073C03EDB782C7A0F5D7C66F5CE161DED55B3E92DC27183AB083DBC1F3930AE56EDB8C53E9A7E020FFF0C4042F518B26F390C96C8183B79B53C7C7BC515187B3DE8CAB08769C5DD6FF5492112E8B0F28D09F4067ADB04194F60250E75ADE331A5C25593BCD92A6D1350439585860BB6FEEDBD2F839F317A01358876C88E898AC0C85378F572F23CDE931D47DE71D3353DAB1F810A61B18D24CD83DDAB8D53BA9C7B8274B0FE82AFF30C57072F643787CA1DF03B99EB57DBDA8C8EE8EB201F2847CBC9D34FD80CE6BC5E1E328EB6EFC83C4BD9D52F324E30EE4B5E86351E5C8C4C5456836D5A452203B3C372C787AE3332C8A5E9DC2197D9C341B9756BB1E63C75BBD5CF3E5CD4BF47BD1FEBC3E3710912D63032F6B97DC19C4DE196ACD9157715E2C14E054A9317BF96A684BB96CEFB7D8FDCA8AA477A2AF6F726D2CAC1A603CF1360EC11CA897E5BC735AB69B8647F30CED4947BA9F635D9CB2D82A662FF17A0E12D4D06D641EE76EB8B45C71EDE38C905C52BE76C6109F2612FEE6C3194465C19BA5D3EBCF1F0B5E534E0F0F1D31CB1E7A36C4303F283DBA8591CC609311A809E444E33A893880CDBAE29119146A368E4D2EDD91FE471647FFE821AA6D31C9FA49695EB9941B08F7BE3F06CDDF2739B8CAD2AB0DA4F5A3C0A26DF6A17B137CAAB3B919AB636D6C89BEDA3058898628721F2770315FEEE881595E24CF48B441660D0B2E9D5B90928C381F2B0FA26342E4C9B88C0887A4687124C012D969E1AFD8532754BA12125E9433DCF6D7BC1A36A83E6A10BA1CB7652A81350899C2DFC6E4FED38D009E6D0F1D44CCCB95E551B3AD54B3AC81E8BA4665EA428B3C861E8677890CF5F625C19A7C5943A9401CB78E7026BAE92B60A8B6807C17745415CD8E030C64C56E822139A35DA423F264336E0AFDF167430DD36E0064B2F6E8D8BB6BE99C5A9FB551CC63E508DB636667DDA53F611F02FCD1F99410F1A7A82882F9623ADDC50EB01E1F39978BF68506C71DBBEE42E4A80069B0E4C7FC4CC1471F4F1028DB25C4687B60DF4255DEC9148197A74796EC760A66AFC7884038651920973A69C203516222632EC5875EA6D838096E7FE9B5B4FB69C5E9407E70D27FA34B0CDBD6E119D87CE38581DF1D3E0DF3AE029042A3B20E923EBCE19A4958755EE2F98FD234C4413E2DBC93559A428DC37F2D1235BD4419B099E0F0DE542C46935991BE0692A6D80B8FD9886E0FA1769B49E8AE6307CB0BC1B49732D26E25CA1CD9D407E0D8864040941611F9333B6367E8300FD646AC5A71AD913EEFD808D5CAFBF1521A3062EC184E52165501E005556DE4DEE46F9E53D7DEF9909F3D5D98CA80D87707F7BC0FF8D879D65D4D783D196F2460693811CDF33358E082D81F4DB8F6C20486183A36D4FBCC8A1C6DA21AA4DD136E19FEF2EA993972BB9989AC1C38A79F31852178004123C46277D38A88FC1589F257332284CD8A873C25A1A6D40265B285DF09370E88F72FF70E434E8F66084CCFEBDBBC4B99EDFBC750CC5DEA63617F647F5F021D57D64D5EFF048634DB2209D7C8B82FB63B8823E4CA057168BAE88D9715291240B3758D7684501F861867B7A241C063B05D5E8CA6B4C79CB2435D7F994CB76915B4A548708B11B29449685941D43E60A8976F9A96072F91041F4C3DF7C73969012AE1B30E4B9C4E133558DABC46C103C0CB1DFB99B585374A54F9BA56B7248B8C3F66F1D55760D6ABB430375774DFBA2059C5DDDB659FD2E1DA9C3F0B80868C92BCAC10403DCD140D6A3D3F35F8EF1A2DD98DE1A4334238599EDAD920DC0AA698E9FE6106A0780C9C245F2C65A0C3E5CD5366110B1760FCD414D450DB9D76A22A9EAEA0C9FB72ED543CE9FA3314BAB17687E9DE5ADAD7561F1A5BEC16339269A87E09ACB29E4C439605E9572AA9B7D0E8371A30E41A0A7BDC02DA3A6121BF261EAA016A2074E4432CF63AF96BE81CEB6E0C2676A8545C66D2F30C98B5424F0FEF04B3C6C7064E2D2E11CBE60F85723FFC0B770D6866FFA589E3F9B2ABF75104019AA69CB58895B474A0ADE2B60A4AB077C3A6DF615334EBBE732E95220213994D3BDC443C8EF94AD515F45418355183314485857AC12BA1D62CF4FD4F4DE2A7FFF1ECF0D290C4CDFFA88D8F48C5B837D3A94CD17B3D169966EB038FE5A6E85DFC60A00233F10731973DC475D53BC7B9E60320BA7905D88519FA325DF5AB02B40F2ABBDB37D2261CB8148277B87AE3297976C80C35134E5F786904564C1469947F620FE09FDF3862C4057A3BCEF70750CB727F031283A1826F1381B3348E3EA4688609ECB193AFAAEE1CD97E4DDAA02C0C30E49F137D08285941528101759A7422AA499C900A379DD73B307284CCDDAF1FA1B0C4B280E3F9F1DB6D38ECF8A841F9D4E40ECA86247D6CD9B31EACD6A46F0E333B9E83D690D7E13467619B46AF9AFCFDC4AA9A049B180260D70D9EEDB8A533051AB83517AADC2CD900B3EA51260F464AFC5D2DC411029779B21CE2CBD160218DF41F661DA1AD95AD40B8C353C7F10FC23F830D117BCAEF8CECEBCBFA49D79D8D9391E8D08281F000A55E92DB331BDECD73183E058FF3FE5839AF50D8C55F22F6AFF5A33DA774BA1B3E643F5877CF549C4F908EA64A37DF3BFA4CD5F70F8CD154476D34BC853C9E8F7979E5F4EBB888AF761) + +/** + * Test the [ACVP] sigVer KAT with `tcID = 31`. + * This takes about 2 min to prove. + * ```repl + * :prove verify31 + * ``` + */ +verify31 = tryACVPSigVerKAT message sig True where + message = 0x4AC4675C96D9117D1EDEB80D7CD284A3E1E1FE038E301205B4C408EB965235AD1C85F8BE3F77CA486FD207F7C75F4121CD3CA2B23D6BCE4382A6D36121815025D5806CBEF452E083933C6E5C7394AC88262A6DE7770B2D8843EC101FFB5E84DE2F7A8B74E7674B3B2319BD6BF4112F92C5CFC0A55F7FA061F45325408D039D51 + sig = split 0x4B3F52F081B3D914BC7C6C073B182B268ADF5189E298A869BFB991B199993C1042DEF5B59270B6CD3FF8F907A1CB0D3B6FEDCA143838F8F81E0C370FFEEE6B25CD07035641A051944EAB516CFBB801536B4F262B16198E7DDB1D61C35A64D90D3948CEAAC8EE580DCEF540ED99D912BBA2BC4F5145BB949C73CCBD582613B10EAAE863ACA34683EB922B3DADFC74F76F47E4978602592402D9154394EB09FBC2EBCCC594732F2D8BC38350E5535A4412A77ADD7916604576FD6A3631E515BAF26A6F9CA4061EBBDD3BEC7179AD58552A5B508F31348A56AD1ADA7A05352C72C004B94C47E7049A10B3A59BF238A8DFC6C7019A17F05D5BFCB9D93D9D1CCBCB47F8C438098FDBDFE23F9F78BC28069908C6B9898B434CBF37787E1AF6A6B827E830E9F7629CD8F51070C4C8A8DEB260D07C3E41D8490484877491B39AA6D9E10D91748B64E33160629D8AE43EFD5F85781E69F76B6895C141EBCDDFEEB485A00BDBA4F7C991F53F2F84933926AF39E6964ABF2DFEBBC19A7E31C50797B8DA2931E10F3DAC493F198DFD785D21ADB2C062B097E889A20737F186008F2928F6B84D6E09E975A8F2AAADC785234234FDA03703A7C21F812D650BD2510B30F0550081047A155C848586A96F100D774F3E39E029B0777CD33E68318A11C1980293FAD3E787D20DFE7EEE7053C05EEB6A159BAAD4020B9EC3F537DA4DADAFB3B1BB1DBEB2D5B8F9D05A019798EAE0ED099DB066D73EE8E9A56DE368E878A7FF39140D8021D50085E6252941AB315309CB53AAA49E86347FBAD54A1F873E0CB4B86A8D5B1B2A95D485F37A9FB6105DF8440FDB8578F2624C079329569A75F36F2C55D8D030FBFEAA8889AD746C323B1AC4EC8C403E775A6FBE596E7E6A5A2863576625149940976F7CC93617B43FB13489074ECAC5BEB1A4DFE58B9AD2E0C6A15B76A7C2D208725A3123CA4E6F2C5847EE5FA8384919EF89011D219B257B3E4DC4F2095160844CAEEAFCF857260F1C63D3B05A67D3D0F2B0EC9DCC2723F13755750BAE62FCC361CFB584F774C09ADF9A0431B23E488C359C0AEF5B1C9787BD8F52B083BC9DBCC9B3039F777C7E8EABC80078050CE6D49C3BB70168FA2177298FB0A8F72C1CD28D662A07DAE6C7ACB7FB8E7FDD01DFB27C62EE683F4E5F88C7C1DDDD5EECC1C3AF853F1FF6B1D9DE672F1BF6473AF0021D8A3D4DD04A2FCA2325C721CF1C821676D0A0D574186625DE831C8411F64179F9167F78BCB22FB41C2CDB63C4DB5E138766D3803589598F114F41BA42CDB1341020449BA99656113990B4E022D8DA20D744491C6EEAB67B918E80FFF343CC5B4C8E58C3484B0125A60C36AEF763894D35148B578F417C3A98A143EDFE9F8C95BCC346C6F5EAF97AAD11DAE01C477C227A88D10ECFDCF450B37F881968027849D9B43E2BFF90C6A34AE41B8BBD743083D3C58786B036671CD6EED94DAE51F7613247EF8607ACF74A3CCE932F1C3869BDB35CA17FC6BA9F9C956FF1D4D88094325CABCE41233FB1D808EF41010396DEB0ECF50734D818DDAB70015A0ABDD1926DFA491F711AA85DA2A8EC60E3255CCF975C23CC4E8DAFDDED9FEC60A6467C45B03CA476499AA331B0E3999576CEC3191A9A62BC1BEAC1EAF20E18CFC3216127DE4AAE2E75201F9E427E39BF921150EAB949559C022D876FA242C2A845BCA7235F721B0056788A44ECC3EB98F0F502B89F8E7410EA5679AE7C0434F13AD816421D2FEE30CBCB2DAA6B851CD1B6E996DA7A757E4C4D8572C8B600DE85DDB65320D1CB71D9378349C0C401AD4F9E91272139228A8DA2F4FD2F48891A4DCB066D501D447483B611BB3C80550A90EA0B732D639D8B3926B6E7C35453ED3CC110BAF556CF46D8FC2177E76FB2663B8BDD171E94C0ACAF25B9153B22BCA749916756FB3ED3018E0944B6C3B9B6BFA15B9BE803AC79333CD2C3A27A26BC17CDA257798AE16B28B463B6DF3FA87C2D742D0F6885BEE0BEC6E20D01E5DADC86823E92D60FEC79B0D240248753E42048384C804289604821A57F4F9F50AE0C38527FE5A34938DDBCDCD9A1D020839BEBB62F9F41FBA08052ABB82FADA884CBE563791103AA585546EBFEB11272CC2E87A3B75B3C6BB1853AE7F9CF5585B2653CF5EEA244D204EB269C56A20985160659CB0725EE13CE35D55EB095A53414F232DF8108B18024EB0DBF345EB5CDAD0BCE7263509A341D54A7D534E553EAEFFE4E242EA23BCFE59A58A60425882CB7E3B0C9E4AFE8698E3DF56AFD6D611E9168747D8735CF9246D94F2126BE727FB42B2241A83B34F0B9EB47938D726502C54E4572766331628FA5CDA893C35376AB4538FF8717C2795B0F51F08E1137612B89B0C1E2CD1F099E88556923AE57A1DAD2AFB1230B5094A1B21BAD7DBBC333A97F179304718F3289B6DE31315B74C1A73AC7756FAA4D7EB568BBC6F7E788CD089B395564D2176B0056DFFE952C7748B048306720F602B67E8F6ADCC91F8E3AA4B8C4D7FAC233AAF93653AD2209E2FF92DA30C2D53FDEF6F4C90EAA0DE60D594ADA3915DB24279D867476EAD757B4C0264A1DB8A1F57A1B5D7173BB1A960CE02FDEFEF160D512667D655268FCC3A153A4314782A0EBFF84F65F14A0E3E12A13250C07D08C225B11A6831BC25C40467B768004DDE0E874A51144C18920BDF286090B59F51564EA4070FBBF61E3696435F28F63332B64496DF3EC8B65D54E1CF4789DDAB122DA6B264D312A711C129E3B07F4C6DA25A56173AF58B90A71B7ACFA3161A81F59D17914C99BBAC4F9A314977A89CEF7696943609BB4827964FB2976403BD4996F1E842BF5AAAE1ECCA11255B9E6001C20F72F1FD5E32CDA32D8A7AC5F62B09A0E615847CA746F489515CF8F183162859F53B97E9E5CA800EE624F729843A0009164A4A9FF76EB34E4704184848A139AD97D909F7A7ED114F087A4B2E1B4A3032391160B6F3A3649FF15AEA2B7107AF8A3B5FCAD61D43D602E6286A900870CC8CE24E39E78F0397A0D7E27E8E2D4776A44CBA218EBCD88B3C28C182A7C9F4DBB2DBB5E981563D66CEEB77E7F9034BD429D27637CF797DE82E01FEBBCE2171EFD016E402A42D78EA1ACE2CB370E75C90ADFA1A793B2169CC26522DB2F546AC1DE34C9087120C42A9F10C00D493C25730166F9D219FBDAD222C8B28115543313210848FB2F04BFDCE15D320C3634A8E4D63755515900C75BFD090AD78DD588659FBF97C96E0D0ACC8E815E608F9E861D79AF3051B942B52570B6292BF48C2BFAA9077DC76FE902683217B8BF809ED7A0050ADDBB65FDDFBD24019C9181B5AC81566113D6694EA6291D7F4A7F56A41EB91F76368DF82B164B4859259D7189240F1D8803F8107296D378BAB4D24FE6D10EF788367BCE16C5AB77FBC168B857F7BA5CDCBE5067C864F879809FE5217DEF0294BFAFDF809ABCE9532DD9DAB3448F4DA68ECA51609476278EB8C4F69EA29673F69418041D26857EBC24A487BB4B0BA63AF848545EE9BE89F139D502099B9D35DB3807B925CBA576E27170EAEC48CC2CC15B043677825D0EE81EB2CEE3A8ED14A798B879530220E50CE8C003A305382A24D23C277B99D1F4C54F9A8D33FA3D1E337E18D7CBBA5E5A47F2D5E096CF4551B23B1B86436E81B4A09D1E3D38492EC8B2A00967016AB76B9A9B1864671421DA56F57D008D5CE1B892A7E9C1F69F6C722CF109DB500E53F6BC07837AD1CD4CF4A64DA763B4A9C4929B0DCDDF7C7E1186BE3FF0C321158437820C81E74FF316AE3254E972FC197A7F0E620242AC05A4E43E987C2A8355B0357745CA79E6AE48AB29ED4FA63D3A1F19B999DE251FDE0640DD87876D55762878AD1DB12D65BAFD14B6A9A7081BF23F9F06D90CE273C5A26E012CA94DD481D32E10938C165163E89BE8A93A63034D345B74E2A94EF643D06AF9E1F5C9F104930DA00E61E061EE8C3BB17C11E05D45C1682E4D593C9198238D2BA289779E7D0F227BCB0B09972B19770FF011BF6C60D9D193CFAB32747A0095E1A4AD32514C782EF3DE7A26EA771F5530D9DE9736D0F6AE1AFB78EC7CE4884A1BB436CFCE459CD99358260906AAC99716A536CC7687A0375FDA11007618E553534E54D5B214F7AA6FC7DBE37C2BD2B64850AE469A9858987F3FA4B1FD26D954BFEC365DBE06DDCD615E1FED58A88676402D1D6B581485498B5ADFFFC42D47D61DF99384E22C5157F0178A6FDAF8F4A9491DAF298B2C3EC88085022C0A7CF245ED0FB5A38CD16F30D37DA5C4959A55501DAD50F1B48BBBDD86AB8BB522A936DDF0003B81BE16231A04E7A589C56FFFB51B07927B4AFA1DB7D48BC6FBC3F3675637184B7ADB9BADF4DE7C085BCA1D428DC9FC8277CBD85884A5921B52BB05B710615508261BB4546BD6E1FC730D16B049EA12798CE2E6DF43F5B8F3EF9AC8FBAE31B011E10C4FC62FFD7F39D16EC32CA8210ED16E041DA43D9274229514054A0F82D462FE080C6FFD7BBDBFBF0BFFC6D5ECC432A3256C0BE0DDFD5D9080C676C7955D66E44D1CE51FCC2382F868D732E85851721B48A01D08C639626EE0509CB581EFF5628FA6CCD1089AC0E12DEBE0851782E64C5049CBD6501013965CC0CA25ACAB176EF7CAB92940985DDB49021DF6C60D6C4A489116311E86BA19EDF00D74797358207CDE50506D007FE03C8804C66451F02A0182D387B759894096F65232952D183DBAAABB6BC0E191DC2C3F75FC72BD61BAB2EF19B6532B231C4AFB1A9C2CB2F3D6C451E8440D6A923CF72A63E2ED8554773887910CA5C671AD4FD5923CB95EC73FFDFBDA4B6655F55DBFD1317D024422301ED66A6E4C672085CED1F4C7B05030A100C4788FEF4CD3E494A853BDE63E9D449AE3BB6BA1083238DA3F4090515D143C67DBE53D8D507A5229FFEB2072D0BD092FC9AE52DEAAACD1F0F14B5AC84752BFD0025E5F55B869350F4B2719C5C05AC1669BB0FD3C614ACE02A270613FD3309706DDCD5B1A6AD26F359ADA80B30E50A7E50BBD3AA45D0654DD7D058B0BBF4D0D92135142214EE70511F3676AE643B5F245063B9419CF6B49FD647F27D7C41C866E6CAD9D5E2E3E331BF6B9F72ACA329BB64259C3E79783A26674B7D38EBDE8318411F4764EBDC4C7E41ACFF85BBB30318D59C42C9203ABD6636BA3F772B6725121C052DE99910D55158C6F3EF8BB7FEDE2F81E58A7AEB25E2E46FD7232302FAFA8FC37FC8B55D594B76EC4A53EB11EB3FD634428AAA5D86F839D089ABE2FEFE2AE5262FEFC7348D836692EDB215D6F8F548B885290C2403C51C3E269D493FBD339B5DFB0A38EEDA7754DAFFA16E5BCA5A9BBDE04B014B7AEA8988F3749D52D2FC1C9F7C7B2C2D692E7896E4C34F57C558CFE8317A8374409D566879A08628F644FB45B818455BCA6042B4E6187C1DD177E9E5146319904B1505F3EE00CD7FEAF0E83C3024956F77659ACC56D8D917A37E8FF7EB88713CCA334EA04B8E258C9345DA9DE26A0A366519451E1012DE6AABF4697C9DE821D70021C3250A106CF4C23A1B1785F549D3C8CD71B05FEA753E0046A3AE0A9B1F40277CF453A2BA14CBA923CC6269706DFFFD517C1E5930079912E05A5571897A06865516C86699F707E00CB38CE193490AEE30BA47DDDF3A5B4FBCEBA73DC13D0A160EA642D30D63A02964EDFDB2F29DCD32CA9974F89C32D1FA9A83C94A2770FCFCF86E64646882BD550DDD65B4E2D287AF6C196F42DBD39B020D7CDFBB6E6E75FFAAB26099EC1D25E3234F70DD972286AEA0C3436595FE49FCA898BFA421604C82D3E94856D186905076D186C684174BF4290DF31769EDC97A1DF2DFED03CF45CE678C8A1429EB978D02A79D4F8CF0168DAAB482C6C612F04B1C93637FE77B302CEFA788C11356C52C54F37A9DCFDA55927A8EF0A0CEA7CC4ADCEE459EB64DF08ED0FC29FDC3C7B762B399332063340D473966219BFC87B4A3C91C80F0E4BA86AA1879C76625C8680A227AB22780659D4B5D30E0E9A0DCE094DAF537679273A9B277ED2A2E250EEA0938204C9E963D338522A3D1A4440E2A12397A5B97D35657307BEC94CC0C72C5C6B09DAF2BAF0020B7D8CA560BF6596929AC8D4E5460F7837B41B4AE6FF12339DB8EBD7028AACFE0B42E02CDE906783ABFF694E7CBE0897ED6ED438ACDB00A4709CFEF7150EBEB08C8FF6C1543815F4B8951C3CACE499586458A73C8572389AFC9703A7FEAF673445FB4B0CCAA511D4A2CF463F57E3A6D72DA04B256699A30212E7C5768EFC151B71744156575A2E9443319232D159C6CC006FDB57C58173AD8D2C866C8887437C223888E21EF67E1A332C1FDFCC15EF17476FE0FB57D4229894725E1474C1BA1216562817F16C53ECE01C7F9E3664EEDBBA94952987431AA2A57D330EB11B28E6BF770E349ECE350C83E90DA6FE0D0A4AB9715DB28BDD397FAFA1428302151E1F222B4469879EB5D0F018606A7594BFC82C394E91B9264495C9063D505262799B9FCBE6316BBCC8D8093053636A74D4FA000000000000000000000000000000000000000000020F161B1F292E36 + +/** + * Test the [ACVP] sigVer KAT with `tcID = 32`. + * This takes about 2 min to prove. + * ```repl + * :prove verify32 + * ``` + */ +verify32 = tryACVPSigVerKAT message sig False where + message = 0x5BD074132560F373C7BA6DF8B31012982EE35DAEF19705A0B46B3C34D474DCCC8B0888E5C2F045BA71D6B6A08C31CA63B9576BCF10B43BE4B536036A1B654A7E5AF9297E74CBF099B26D632D7BBAD7B8D657991EF336C6B486FCB0B28AF828D403315B63E9A0BA52755E06D669C2E066E98E6343394DB0B55C121F2E1D66F8B8 + sig = split 0xCB2F66EFAAFB006C0D60A81B32461B76A31C3A814513444B3312469427395E0B530C67D9CC5D2552AA544C4E2A6E132CA55E187642DD9FC08977FAA7012349E23E537418A90691957B03E8FD435D670F8AC671C0CBBE3ABF6EC28BCD3D66362EC8A13402BD18C7D782C96901EA26235A34EACB04D2949072430B0DE3256B3ED27630EFA915FD1302E1ACEA762B52330E7ACB34F306DF3DE26C98559E362E930E89919D1C2641BD37542C035A7EF25F6B8C29044667ED394F0E3F830876DDC296C880FEBEB30D87876911B1F4FA582D191FC7C274F52C5E53E0DF6F0A5C2C3B6D781E222B72C0A41C5A40F48986EA28A6296BDCFC48FE8FF0A557284A4CB4968059F44DA7FB77A7A5DB8684D6151EE35BF1BC7958C086A1E5C907C64469AF213C3E7866D404508F723787F6A1072914F66279376FBECDC853906E8E806B3D07F06E6355D5F97191E4C55C55AD78273F10650E7018A989542D68EE8073501D331C7B9D80049C94B3F8CF6F0D7E569C53EB76A4861B94DB95AAB1C09BAEE0B998012E72DF702176CE9578F1995B64A4B17FA95DE9EE4AF0C012EA0445D065B87E49DD2C36186630585A414BE4780007866FC3512A8CE80AD1529BE7837D2AD5E0274DFB9ECB0B92F9848FC41695DD25D05C31E3C4A44C75327032065A005A4F2349CA9319A03705FD802BC73D12987095693A60F920103A248340C75F38EDB9068668795C9166351F045CE8560007985F140218B865478DF7A53D57F0802D48C28DF1122FE9A7EBF0D449B361ECEFD2637ED5D7627B184C73C39510F15CCDC35132CD6D5EEF4FE10CA6FF0FCE8BB70FB974D6D6B21CBCB6A972A070AA8DE01D6CA0AE3D937D0FBEA3148DB2695D2B8A14B1533F7A303032A35C71772A272A8786805C3380C4F49C9B5D6136075676F806D4DC83D3164E1E7723DC4F2EF20467DEA7CC1FFF6AC64C9AD71865B63797AE1D6A27E6E2FE2863050271A7A42E77C5A1E3A4C15F2EB8954BC1C6C4A969B997098A8082327E9747FBA569C81201F54C0240EABB105048ED6CF54AC99687B1539466DB4B1DAB99F41738EAE4CC5FEA8E7BC89CC3F9C8A19274E038542182E9D7E0FE0B89514A3B451101039DD65C552A75970A8BE70BEC1B51BF290C2CAD36F94D1569ED58A0E0D9C9D0A722CA8CD5FD73600A219BD20AA4215E914B7D9484DA8482BBCD7961986C211567FA7CEC033C44BAD8E3B2CDA9BF5EF4067BD196D077E9B7200FA54EFD99ABADC8A75F0F49E6E5AF498E7EBD25168193B088DF78C90318970C78748A1AC611760F90C85D190984B29EBE1C50075C3A9BC8C78584EC751BD28AF8C1FC270658DD975F32FFA4AEF96940F7FE4E4664B39CAD9BC72D6F51ABC37A93AFBF5A0238700A0638DBD158153215F5A8F79782803BF9932C70F4F0D51CC71AD32E90B98FD8134939961874884A6C0D372B8F67DB7D9D65789171AB096DF44AF7CB6375D4810B404B5F19E181EEE008043C4E87383055EB6D822B570191FC80B616A52E64640769685266EEF6EB7DEFAC733237DFA83864908D4231CCA0CA7F4C82BDB263B640ED78B7932542B2C1B0D73230B17381B9972F7F999131BA94E44238A2DA2FF4878D306E4AF5E0541435DC6C3C621EB5167FC7EF7FB73E6FCAAEF3B9B595D74F390E5D578BDADC44194E86FB8F39FA546FFB7CC51DBED456E1060BBE5564F5175CEEE910727936AA7A843DE98F7FC36BB1242DA716247227305AFF1A234F267CF09469D5C4EFF8326F0950AB60E57BB8D2BD1EF9782DED7254E291FB4945BF4A5F74AD881028FEAEEAB4841C2E036BCA94B125708B26D50096B0B8A9F08645A25C0CEB634D301972B4B6111AFFE0F3EF5773513ED97468E1CC1ACFE2656E5A4AEBBECFA6D74DA692ADD3289D227E4DC420B4EA3E768CADBF0389F1AF967BE317FEE9874B4406FAD1F0AB9C37E54EB48502F14827B308B146E889EDDD26731571CBEE367403B1EEAB26F0BCE876502852FA3EF2D1C383C322641C51A3BCCB6C706D7CB43DBE3109C569C4F8AC26E75EE844EFA4AF8E2CED85E1875F0B93D17170029C408F65BDB96F5517DF6283A24B19074767A46C0EE54E993048B73D887939A6D956F7B47208BD1963AA580D7932D0845220F59F3F2D57A227EB57AD0D302964E6ADC7461DBED7868C79F0562E0207F542F8B04AD35FF3E3DFE590F8DB991BFC54D7A80CA74985628DC5AE3C75875A34556A9B5B058D433956B0E10607161F0C3ADF653BEB8E694C2E30326D1199B6E68DDF987F9CC4B4F4472C23A7FF546CBF2A22F69C2575566FB57F31719675294B9D5AA9477953D959FF3D538C3EF619E12DD6668156EE016F595F8F675D2A509D73829B24C3856ACE4690C27F804E454BB2F776309CB8B784C5FE3A2C58111D33502BBACE754EB9DDD9C65D29011FC9D601D749B9390F21E5E4BA87037429A3A3CE2E8BE753A40818F3B9B0904408E1157D55A7A3A72857D9D20883FDCAEA9ABFBABE604B8AB95C6A2F4BC90B2E355F9FF5BB02D9516B68D3932F13F759535F59602F2AFD8CE288395E6A5633C9BEF5EA6F88C705C0DF1AD505799085F04B5543D44931D89443789E6C94CD6A325A716BE0BA14A411F0EDD881953388951B8FE937B577A0ED31BB09882DC153AC2C5F9D070874A984CF02D2EC062B6550585B1797B0F62F0D1AFCBA76DE932D8DF2D549FEC75533BBFC60AD7B1DAA59351790107325C3D146A766DF7C8C6377E6F9BAC28736ECCE30663CA37D144ABEBF36E9A6BD7FCD9F4DC3DF055C78F8852316D72AA056922AF21C2DCD7FDAEE0CD8AD3415FA3FED92D8F5697DFAB9FAE2B32FA800E04C7CF6109B4A8C682F5B11B14BDFBD1B96C1C78C36A3F1BB4DB3DA0CE940C917D6A61C2B9FC96546BF6E0D697DDAE3FC38E683CF29ACCB431453129273A1923AA9C70EB0A0DACADD0307C6990FDA42DF9326503C4A6FE72D7F2D81A0797DB6B2399EBC289DC4E3DFB1BA181708528519B378D67CC075D47C3094303267B9AAAFB487E2E93CFCC9D20CD2B0DBD6E29A020337D4D3976E07289CE76185F5448FCFDDF7986CF3ABDA625D0A5A0E0CF6ED779F78F93BE57CF1483D975428DA71BEEAC5D9F02CE9517FA842E9546FB2AD94EEC611CD89686007FDA46A63A5FAC8DCAEC36B569469519FD5951477CC923C29E3B540CB1E19D90BD42EE24F998C0B793C7BA4F31B2DB4135D11E8396E5EC727F57C0C905D6EB4EDFE9BCDC3E671A0AD7ECCC136D3A11CF19B7B3CE54D33AB535E2F99DA800677475C20702963A2546EA43B3E6793EBD9EE59146736946954B5C7A19DB21A0B6880625A540B74E4ABA0C34C12E151B40A2B53F548CBFA101C2F05093BF75246DA04326EA88A282EACC75C5164CD7275AD784F2D6FF37FAC83A7C1C9627DA7F52B407DBBB1F6058C40A20A7377E30CF31C69391EF831FDBA2C09AF1FAA9A97020D0CFCB9B87768D2D0A022F7693B2C6D436FB56809435B576CE887B7233181451C0F76124B84D97DF996D331DC77DED47C63970D852095056BEE43810778C95B96849D4FAEAA090B851D9BD6290703FD7BBE957746B7339B52D4437B9421DD3776B2E6A712BC3301E68FD0C3A2DA9261CC2632C89C9D8564A25D38ABA51D571BE57C53685816536C5038159198DF90E2B4AF9E93CAE5BA948165A46279F1835AF6AD7407DA77AE06645A3711D262B3D37DD8A9D6F419F0A74841C54785AD2F76BDC98B0BDB2CF287BFDEAA9086C459192BCE4D34FD118FE4ED082AD98F67F96798945EE37A2B0CDD0F99A4C92E42851D3D12A496898869D531DBE39097CCFC0A4C232573C9F3646AB622C5968DCFBD149C7EFDF34924C709886A4304C266F4E940E0A7E046DC4E402E80DB82A874E7A5107F3FC9F5D7AD452BAE62A829A4D3B0EB35F81274949C57F9077488CEA9107CA2DFCBCDF020B8101591F4F1B67B3FA981D0821A47673C4F8C2D92A5E1BD2BF46868E1913FF637DF2A00B770D1BAAAAE0D52C3DB5039AF27FEE018BDC96143073157A08A0734477375B7C6BC7465110D4FEA768EBB37761E35E0D9ABF88689F615C147A7BBA2B29F135B13E879DB6921FD041F185AE7997644F46F185C4501963522DB385115E817ADB3FE9FF7B8FEC793B805CF73937F1913031F0C2EA2E5261C7DC13940158F57ACAF3391EBB5912F29F8654F09D10C76ADB04E7EC4AF18B5E5180DE73304E6074B5A7BC3BC6C97C1C7F2123272C0038CFB1EB355674A14C3C5DE5990592DE1D4A86B1BF683B1884D69E741EA9F394D3027004E5A7E2AC7E703FCAED452F78E215AC665142E5B3B5A4D7EEB4B5B08B50857E85385D2E19DCB5A29C16E32DFCB75EF4AA77AE5DB84E5A5F861AC1629C97E4403F4CA948AABCB0FBA0E9F3AF1BADEFBD04DE312018AE989072CB743F353502CE4DDC7665B193177DFB01FD93076641D037AC8316803B9681AFCA01002B0B6A8B3886F959BB71D9912BAF99152118B2A83F214B68ECFB6B836BF0F44C8BF2A8CE7CD81477BC752BF2EDF295FA51C46D1B528D69555FF46CFD0BCC0348BD1799146764CFB0C851BFFBDFE200A0C0B077AAF057C6E483667396F3B7689193F211081E069DDA669A4BEF6D63DAD5D7D23AB6A976AAD27DA67C2ACB9384F1BB9CE1B02E55B1CAC61D6BE4C279F87628CAE6C8FD584893A875E1B1ACF3255437404E30E96376CD091C18E3D4268422852C0A038F1ABC37FD032E27746BF00C4358FEE868A5ACA9D74520955C10CF36258F6162E595A70D3E5D68E4A2BEF6BEED7E04F85411373937500DDBCF88CA8B384199F5E693BD69C0EB9D74674C35EF3D821096B872D0E091B5B4F13115445D286271B20EE2CFD6D2FA21EB45CA8507A71FE7B9D8E481C27D73A927AF82287AB82221B9FFC7139590C55BBD37494B3446229F233FDF74B9396DD89E2AB36ACDFF9A29A1BDB9ABEC9F9912CAEE27EC98F1CA99ED53434F180FF77E8EA9F9FB915227A706FE9CF012D6246F8A44D94A4F54C702B14938FF7E6870D49EB7D7EDA2957E4D0BA4FD1AD6EB645DC0EA96120C4A3C11E469B3189F939F39D9EE8B0B84D10532D1BB0CE358AE06DE63F880A338E9563558B4CF8643058A4D98DC1D508E9BB5338C7A5872BF3BA6F832248E58C3C76CAE350F33D0392BD365CDCA382B044A1711E9A3E2BE45B3662FE0D0E3D5DC18EA4F3FA02DC40B61A7EB1B13E49AAF38426ED5ADDBF693E046DF73A4F0B2E351A67B335CA63B850BAEDB4ACB369104BEFB192A3B5E29A4D7ABD2E27EC436C11C8305E370BB49649B66B7BC20A9C8C8EFB0B6276B7D2E46BE86AFA936C98B10D7B34CE3C025B7B6AADAEFCE6D1084E9266882B40F035D147DF5B169DADFDA674607E91DA77EB639C0C3A6149E0E57E3478CD79DA24FDB42F3C0295E8745A2CFD84DF6E886428001331AB711954B5ADC1FB3F3EA9D00BD8301B2D030A372981EFB155DA2172993FC8C884A2A1B43EFA3884E142CD191EBE56519E0D79FD5417D8ADA61BF7D24C1C12DB5BFEDAE5DC1B14E869C7106E4812B7ECA27C845B4035FEC5487507EC61EC899C010D067A41BFBD9C3182E76C79B2492BF6AF4D78AD413D672236432E243DD87BA8BA26C369D5AACFFE7DA458865A8F596FD24E740063F57E1C5771A648E8BFFA222C33BF137D21B967D69316B3426E4E358A08294E7F13FD129C09A8E424E6B4A0A2E39930CFB5E201802DB7134D0E005808B3BA43ECB843744EACC004CE159456DBC3470142C103B65B0F7F7CED63E662EEF1F7493E65B950C0080ECBDAA56E209CDCA1838FEA248BF98945EC17E3190624F27C5252C05F9DDEC36EC7C013C99C996A68DE737A9E06EA1F263EA3D1EE8F4B959F44C2B74C67BD70A3027E6E5EEA6B4C8027552F29709CE9FE5C9F26964D0DBDFA765261C9A29CABC89F8CDF712679DBC1DD80A4F676EF5B77B219A3E5DD7C9E55EB014002CBA4A66EBFF0467BBA2A7AD6CF696AD8358C0B819FAF7E7A18E896E6777BA299A8C3B20F20D7AAB99C2F524408B6A4264B2062D7C7E6A0DB8DBDD9C0446A4188FBFDB6ED002B2807F0997A68A2BCFF67A49BFD008FD6AA129053CE16907D8AED2896315ABB3683C7D0D8C846658EEF4719E3D763255F3FFAB2602C91CEEE93B698F738FBE3EAE3FF48CB0D48910F503CEF3FC054C006EC9181F0A6942716EB982565B79C9BB03AA05005DEC009C234A69D1F441B63FC803B59E9FC4AC22D93EC01685397F7C4BB6FCAEF590F272DD1B85915065B4E2C6103296D1EA056D843DB35387F3AC32CF2DDEA7710936A692A78095CD01D0CD5C8F0C1FACA6B7495FD1976BCBC5A03AC39F326B4F2877BD47A8AF5A35B1C256196C9C1F7D39C24624CAE958F38ED815B5E1D2979B900A453131DAC0D6C2262D33026A6F9F047DCB0AE1C4A394EDD0C5D899B03DD4D5875768D010D1640418D96ADC7CCD4233741515662646678C8D0EBEF094669878889C1D5151718275E9FBABDC02F3F5B617094AEC716182D3D4E5B82A2D3D7E6EDF123415B98B1E9EA0005101D252E36434A