///|
fn hex_char_to_int(c : Char) -> Int {
  match c {
    '0'..='9' => c.to_int() - '0'.to_int()
    'a'..='f' => c.to_int() - 'a'.to_int() + 10
    'A'..='F' => c.to_int() - 'A'.to_int() + 10
    _ => 0
  }
}

///|
fn int_to_hex_char(n : Int) -> String {
  match n {
    0..=9 => (n + '0'.to_int()).unsafe_to_char().to_string()
    10..=15 => (n - 10 + 'A'.to_int()).unsafe_to_char().to_string()
    _ => ""
  }
}

///|
fn hex_str_to_bytes(str : String) -> Array[Byte] {
  let bytes : Array[Byte] = Array::new()
  let chars = str.to_array()
  for i in 0..<(chars.length() / 2) {
    let byte : Byte = (hex_char_to_int(chars[i * 2]) * 16 +
    hex_char_to_int(chars[i * 2 + 1])).to_byte()
    bytes.push(byte)
  }
  bytes
}

///|
fn print_bytes(bytes : Array[Byte]) -> Unit {
  let mut str = ""
  for i in 0..> 4)
    str += int_to_hex_char(hex & 0x0F)
  }
  println(str)
}

///|
test "kat-Dilithium3 keypair_gen" {
  dilithium_context.set_level(SecurityLevel::Dilithium3)
  let seed = hex_str_to_bytes(
    "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D",
  )
  let _pk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEFD9FDE3A496F75819F0A20D0441DC7830B4AA1CB8ECFC91BA0EEC3AFB6744E477B4E6EC3FDAE75048FFEBAABEA8E822117D5787F79070EA88287CE3CD5011FD8D93AB7E8B51F26116BF9B6D21C03F88BFEC488876F4D075A142D4E784D734407511F992069353F1DB67ACF73034A468A118588062111D320E00BCFF6DC63573FCED1E96AAEBA6452E3C7ACD19181F9B814BA19D39B4BAB5496DC055426E7EA461AF55D5B9FE97F9DF7E253203C1F9E152E96D75F9D9A84F5C263EC8C250440ADC986F4E36414C703B3E05426B28B7065950DA6D0E0B2C60AC3672DB6F3C78447DB7C20915770EA6FCE81DAB5339C1D5AF82A5D3324099DF56516A07DB7C0FC64383805C65F2B02FBCFCE63E93C4BF09409F9F0F77E73DA3B0019F2057E4CD7CFF0E5745EF18C3FD766E01747A64D415FC9789ABFA62284E11C7FF05D0548D973F679559A6A3AAD77ED5132D0150C014C3EC3A395F017E7ACFE3EABFCA44910CA06FF33542ECCE6241974742357D37F5C284BF0FE1A74B50C073551372133AF2DD41E21BAFC9C590EE6EBC4ACE731EF566156CA03755DC493C137028AF3B3DE5B00BD6CB3D9A87D0151F887C6768BC6CA02A94FB2086551A0F89BA26154E9D4506AD9FAF39F5723E234E06CFDED69D4EE4146B73E5DC1E4152A2A3159D73DBC833D3D417CD5CF7FB3DC7745CEED4DC0F5B1C6D6B69C1764157EA43DF9DBB442EFA39D1D0162E87C2D30C5012FD16D869C8A1FCBB45EDCC8E1813B2B190A961F9FC86591D3ABC5388AF678FF03DA78B7CC0F6185721C0DF33CC906435225DF2611002DF120E83566532292DEA3D8ACD109A0DFFAB3B0B43012796DB5B50683FB4C2D250DAB76AAE35A48E8C8D4A5CC154759745F0A1230F6CA9DD9C99E2F80EDC83304CE01E98F6C9489529A822F90033C228315EB2FCC8DBA382ED4301E07607A5B076C725F124994F18A997D2C5BBF9A324605265108ACBF4610FA1C3374408850A0864E2B61017EBEC1FBAB89DE3AB1B93CE4918B9E2C9E3FE456758062A9F882B283318271F4B9552FCF32624A9FDAA44C65C60E2B3648BEF1F17D0B7C74869EE0B53C4A62A24845DCEA5BCBF93B92E4C26648584E33479282E6C8B1D8FE21181BD9CF75F8A961724D4C4309779F1F1B775D254F70BD1769CC7C0EDD2A95FE5C9D84B16F7C54D85CCE4C8A182810809ED81E97D074884EEDF401CCACDAEAD82C14D06B68AEA6CE14B861B0CFD16090CBBF469C5E084314C0D8D3960EA06A3426D8B3FE762E00D09BDA374F3AE2CBEDE2838FF89D81DEB3013090E44199AED604963EAF919914CE04F207AC82CD4351FEF7B2D94393066FE4D44E3CC5952E75EB6F3714058915DE0EE184D8C55300F576A8B82A863E81AF33417BD4CFC94E7A61263B39F01F6E2E70748B6E5E59CF6CA01B0028C93BBBCEBC548F987F10755BF33CA585CB41CF578DF5FFE37924E3C2C072ED1DAC9162176972971E79B62FB208F1A73BF0361E2993DCCCD3110C34D839D18DD43A5E8F0D941E99ADCF441405F32107671B2D8B2244F7BA92DCED587A210FE8FF43C616ACB5E766E6AF2CEB03599BA3DE376EB5735EF16143953D1FDDB7E9F2874B0D6083DD7EC4386AE003F51CCF2D21EF6059163C5152174423F57119D0FCE627D763D81C10AA1329F74C8D445437BA6718A33DB6E79375172B2AE3591821978D520824E2D2FF898B7F4C867FF462722BC07EADAD389A910B6F65429DA129735FE049E3ECB3889F6047CF2BD2A88D50A651B3235D2480E1DA5A35247FA76C831736399D37E8D033C1D051C9B6A99AB80B1313FA24C5C59766E6C51A38FE9F1186A767EEBD0D88001AE0246CD4EBE2C979DE82C30BBDB98B4744F11F9E639EDDD8C194D7911201A8FA745991B4D8A5709B62A21B63B9762913D36CE995C2D6B79151E8D83838CD1F38840A9417255DD166B7A3584499003FB625611404C95B960DF0DB1BCF1574B0965DBD834EE148117D5E05A7CC7CC1A865618A2BE4854DB8935CDA1E68BD8D09E72F0AC9053C882C4ABA4004A614D10505300B6176CA1F324E22E7824299F9C40755B71D82B679547F06AD48BE66D68072C9390233C933F80A14F8D4A6B0B4E1970E1ACC1BEA7F5D3BE224448F857BAB68AEFA6D8CB819B64294A12997916CDBF56E9A8D002DD065F12C61823F4FC214508232E431F0B6898475BB5DD0D7D528E840C22809AF7E15363724A613ACCFBE2B37438C159CE14CB0C98BFD499C08DAC0CF45D821CC2FA47319B6FB4CED7E5985EC8274DE09071D3C10DA5BF9E522B01CE91D66B91795D3D22C00483454275DD2BBDD7C2DCC4A167E5D7FCDBB9F6208CD4C9A485FAAEB809A7711DAC2865CED4306474B22B4448F85DF33417F3FACE1C05D42703ED313042A05DE0362740130188ECB445BB255DC76EE8443F733117F8351F17603175554FEB00B7FF54D80786F305CDE18CD5EC56EC0962A3E04482DCE3622D040D24C40F2E8A14A447659D6C561F2FFEE68F8D3DE511B23E8B172A01A3EDA4D3780E74C677244330E9AEFF019FE07BE3D33F322F9CE2214B9D9CFF99D05A59E47551432AE76F4CD4F8DD51520FFE811B4B93CD6219C81B63B1D627785C2A0FC22E3AEA86CEEE1F7FBC4EFCB46DDFBCD88A02F3B4E67C5FF2E8DC68BF16C74699BBB628902F72C3DEBC8BF5DF706D47A605A107DAA0014139CE40F0D46D8D6DC7",
  )
  let _sk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEF394D1695059DFF40AE256C5D5EDABFB69F5F40F37A588F50532CA408A8168AB1E64F146427543D8C36B3B65226769A22911A5A313EAC17C4ABA25284514FC61335780833022316433765807578714524810173154483652641333022302614737052210781265061858507754618580548533018706647518267737733500270312878821580714026734320616250617371010311453681523024650348143708371825508406086017625831312827001718481667317861073723557447151010112110662742120835462285131388164886833510476026118315742500742440642515861365613777118478050862437064068527631150135623216841417724084830878575438508636854268450568437024007161784543800612705826206765211121483880678147555021222855231084503701364318005376837650246531507600625331251200541606324235241507731457033476564312318033365167587141304111715546812605373423882432783371222817481812013632764751028032268650876553563338104474858543012431808386438538308412704646463346461068070602375516825741152882201577858333134315582840316360106481480464368461757213631657465221517713205106646831646714728313555147332818260731554368708032843262416053205202367725828181085426785155280007282271831120868377244420548647205350861738627124677510852763340373432115424065402345080041772846273616868078152467106825545816362764180571244255708045106636115858630465207053275021822428371023852752844203300172311140215768838476231851352521084382555567411445467278546586170430758800684551353478138120800843156221466031560016368563673618080045554337312584031148042036733018271556065603440514434554851122376451064337325382338062451617081541167173200853260404371068037376070864087000352457148262203505356660372180137103710365278432824642320476423840000674364565226217665212413887347650843121701647146540387244177741376785521641117316050482604148474663803351558017351262133622227106345601657207785483272483156167834564057686734583525352081556548103205334016607423715016325334667270811118243732131154424082613775046710080261386850712837526672242308021005015520483744377116420123167107823808071011246825824018158518742085382583106675131252852765256031478162138153470422610571556744682005455051484113038302414747156272021653210303873603486751766527214217262576653612111216874845403342683544406813605031081743567506346184755758586544840762318670343367586667732075171036052737241220173887544032263062135418368155773200100365185741860214443341023755635875026188641851762415850711803541515742425854563545155707638677240017678386862588177508612360606507333506605275024724336451354552554148604216431563331655676070342677080760553063501337707701374572745128728364747780273036442310552415431163146533631211846312638837626748351386351783125814478856084801427164775364735466055660523700464031105550453648423406611175526158521573573156158778744503872054561166220446141461830006866406004737442250560104577350748702663748684802632852635811304428683261106188260700733862552715534532142573231221878655672567467472814454641577410780605613161540446347533077616250133841474266705206708125431777701522218250013173169DB8086B122701706AE49B99305EE6D016F16F9FACC1F835298B41E21664206005CEB981A35F18651CDB90E68C1F950B059F73D6D3143A1F47AA21D80A05FAF5D3A40F67148D3A89A9FDA80364D57C7B8F68058A25D08498D9A9C378C98185DB13259159CAC4769C34A08023A3388C3505406FB21C69EEC12DAC95A3C9BA61185237F0FF1E0E05F1A6F5A0C09090100665A1AD3AFB1076847B232EEEA78409BD9055DB57C1B31E28A01D09999035BDFC657A61040103ECEBDC793409733734D9342CC5A069E070C2421DDE11C49E172DBE7FEAF9DEDDFB3DA5DAA6B3DD13200B09042E144EEA951B43DA48153C1F1D5C07FCF473FA7F321E72534577C895151B46E48331DDE61DA45F8609AC59581814666E1658B49114524BA3840C6BC5596551AEF42412C8AACCDD8EF69E46380E6DEF60FD91228B99CB511D68EF6631748A0548083A215445EC54693471A831042CF41D09AF898119B0FC646E484539C8C32D5DC24F9439D33EEEA033A4081550FDB0B08923DBA5D44A1A876FE7EE4320BF02F9BE26F418F309FA11FCD0C864A7AA34115083C1EA775345AC0548C877C685EA8C91B924AF4F607EF37A0208E21309AB6D0F2F8A4EAA0451FF4A47E6F482958D81A166A6A08A6A10FC8F9ADA42B64A12B9357D598A3664E9DF13755C10FFD7177E594DFCBCFB5D11B6ADB1607445479A5DB1AD8CA6D915F89795D240CBEDFAD2539D10518E53CC450D6FC5385AD6D76B7830F13828120645E3A0A5DCDEAF15F1968E64B3B1CEAF536CAA2953D161C75528C3FA8493E0C177AE807CED37648A82C9BE8BA970296D543F6FBD6724A99A68D2F68C1FD333F9DEF8526DB7836455B313E6BC366178C9C57721601EC0335054F067B78E663A058DBDA1C12D80A392F89C0AD9E2A3B2EA17E9C9A3B14D176822EEAC5FB5FF7D4C87D76080D2D42D9AA4C951F4CAF11A244EDA711D120A2EA321D1551D86CA9265E9CD5FA9591D880E403B6844F051DC04879972C863B97C72B409C19D5EBEE8AB58C6E7B3938A68A9CAD75D80C6FFC4F22254FF4420C606AD120CC20346A7E7324E78C862E0DEE161A64F44917DB0C38C1F79C969220D202F8802D0F9D7ABFB2DE434B1C53DABB57575EEBBBF31CFB2924872FA01473B3976AEADC99699B13820FA0868F2C9FD0D352E2593273CD621B1974FFA6187FA05C4118D4517C934151C1FA34BEC3ED3639598CBA24E28229CE9FD3B1DB4969C12EE49E18B36CE2B9145AAC75428DFFA145302F41D9E3394F38D3F3C0334C4774F1E94296DE36DC6E430E4C0A537E68BDD41AF0421193B16AB1891FA836CBC367B403705ABA5D2F9F2A4C2F275EC010B2EAB84095A569DBAE4457CC2AC1CFEB1EDA43C3E2819273C487ACBEBFA0A0ED1CC4667A6F577F62DFB1BC8FEAFD86D90108E16B8B0E6C2678686C928A668BB9857FFB28DE90545CD4437DD32CCCCC6ED58FB46FBF85E0AEC0C814E536245252B8029F0A2AB44B9027A7E35A941FA113C8D82974EA22DF02D84E5328CEA83D12D399C7F0259055F4B3AD707E7B3E537B93DEA1A066BDC775FC7D1A6F0FE29DDAFA9A7DA630A467EF6CBF5CCDFFD79F1C8BB6BB3882035C73CDF7ECFFB53C712A7C7EAA59765EFA960BF21E25A6703FB304F07739FEBC63F496B13CCAA077338A0B9A976A9F0FC5742D85C4AF401A4CE341B47BE2594FF7E3019A0E064535F9D9395CC74A6A6F00E0C4E3530A7FE9310CE30B6922D04FDE0AA749CC3FDEDB4D8708C1F6968BBEDDDD5833B299D79D61428180099B0A946A5D79085DF7F872CBDD219E6B8EF8B8AB5C1A149E6E15EF2828654FABEC249AFAAC4DC0B3B542334162FB09800B6C36CC90F2A106558BAE2198FA7D1E2D730DE46E355AEA93248E53AB21B518EC99D5F3B021196A0F614A46B9475621234733A28A465CC5A7FD432C3625812AABBB42D2D9CBEF16CBED9367202B02894D06BB801BDA8472B9918B7D724E36557DBE6B7633A5FD22D0E336E5557AFC018C812E9E6A35BFD8C60AB382E14FF51142B2D2C75A767F32413BA38487558F9345CBE6FD1D6B78C2E622F3B976230F99D6CBAF0BBD14949510A52644EF3F3078865037A1C10F47B59546699E1BD539C7DDCC03F71A0158EA9F0178E187BB6D49440DF2B10630FBE2FEB5097E47F285711CA6F835A10D3AA75C03C4184C03EF3075D49DCB2177ABD53AD7399D290EA691D647329056340E8C836E9750FD881DCE309D309A95B82492D4BDC15ECF8C7F5D3B9DD275548512DB5EF80CD409ED32B5148B82BF240A7DC72A18523D808B7A4F9E254799E17278FA88DAEBC944632E83F8609D681AB463513023D67CD51B153F0962912DD64AB8F6529DC22AA89E572A7F89CB97A8F4509319D223BB29974951716FD3177140A31EA20048BAF0FCA230CEF21967ABD83309A4FF7E35E88784DCA77AC079020EC0CA6DDEFBCBB7E317329314665D7C51F631F681B600364E47574F252BAD6396B3F5B17ADC220966A93CE8F315A2F83068D2EA06952E6EBD802473A2264EFA405B3E491BE776C50406E1150C56B894CF864546B0C7A65E3F1A2BEFEF2A9990BAFE70B6CA9F91A8F3DD21307A39A2AFBDFBDE9B7CA3D7828B13F49DECD729C0039E94EBB7B4BDA09B3505529A12CB1E2FD79B9E5087CD7C3BC05F7CFFBBA932A7BFF8E67555FEE0304D890313F86E1892569E2D6F14A89938717AAA3A32AD1167150299C21820ABD70FF902B004C6DE91C1C0B40706442AF531EC490B012750BCB4877935A7E54031702BB988EB3F92914CDBD42979AD7D27B2233EC1279D05493B12D3F5FBB7757536021B5F4CD932B480E40CBAE50D232E0A2EFFE0E8CB58808669199F0830872F369738682F846F6DEAD095BFFCD670A4A9CD142396C58506EA7A68B21ABDCC19CCC06F6DA55C885A855C456680CD4477BCA2BBA9153DCAEE682655B74ECA6F7E44C3BFE1E2D457491ED1BC64E1CF6CE18CF44A0166D1B244480882C1B35CEA703158E18C7EC6E0CF827D5504A45AE61152309BC8A18A52C0E7699A87C4E31C6911A8305351555B2971C94602B70E670AA30B90734EC1DAAD03A30A96F5847C5C3F7973CF4572D166C51D1E94A50A4C1C894A205F8ECB34E80F84CA8DC31A429D5600596179D1093E2A389CCFE9C0402EE49551710FFC25BDBE478F39F2063F31F75D7432ECA1C59EBD8F46D86A092DB12F810FA911C20D4CC1E425C543DC64577E44D84F422D9661E3D35921350D6F7099C5425E509E1458A0500AE5EB4CC6BB50626D0130F09361717A95919AED35592FA4ABE7B2BD4F999422151E63D4ED00CC751A5867977F15E482EFA01E5CCC44064F5B9FFE29AFFE626C4D5170ADA1DF027AB4179608C4093CCE2C409308CD898371A49FBEA2A2F2BA13BDEBAC1F4159F4B0368FB21D70A9D7931D7EFF934E6C544E13B7B73D465576C6E81FD6D5FD94393E80242F9420ACC0ED353EF18CA070F5E9A285AC4BCBAB19A38356F557B070E17AE5CF1F1BED42601E89C8C4C",
  )
  // print_bytes(seed)
  let (_pk2, _sk2) = keypair_gen(Ok(seed))
  // rho, (tr, key, t1, t0, s1, s2) wrong
  inspect(_pk2, content=_pk.to_string())
  inspect(_sk2, content=_sk.to_string())
}

///|
test "kat-Dilithium3 sig" {
  dilithium_context.set_level(SecurityLevel::Dilithium3)
  let _seed = hex_str_to_bytes(
    "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D",
  )
  let _pk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEFD9FDE3A496F75819F0A20D0441DC7830B4AA1CB8ECFC91BA0EEC3AFB6744E477B4E6EC3FDAE75048FFEBAABEA8E822117D5787F79070EA88287CE3CD5011FD8D93AB7E8B51F26116BF9B6D21C03F88BFEC488876F4D075A142D4E784D734407511F992069353F1DB67ACF73034A468A118588062111D320E00BCFF6DC63573FCED1E96AAEBA6452E3C7ACD19181F9B814BA19D39B4BAB5496DC055426E7EA461AF55D5B9FE97F9DF7E253203C1F9E152E96D75F9D9A84F5C263EC8C250440ADC986F4E36414C703B3E05426B28B7065950DA6D0E0B2C60AC3672DB6F3C78447DB7C20915770EA6FCE81DAB5339C1D5AF82A5D3324099DF56516A07DB7C0FC64383805C65F2B02FBCFCE63E93C4BF09409F9F0F77E73DA3B0019F2057E4CD7CFF0E5745EF18C3FD766E01747A64D415FC9789ABFA62284E11C7FF05D0548D973F679559A6A3AAD77ED5132D0150C014C3EC3A395F017E7ACFE3EABFCA44910CA06FF33542ECCE6241974742357D37F5C284BF0FE1A74B50C073551372133AF2DD41E21BAFC9C590EE6EBC4ACE731EF566156CA03755DC493C137028AF3B3DE5B00BD6CB3D9A87D0151F887C6768BC6CA02A94FB2086551A0F89BA26154E9D4506AD9FAF39F5723E234E06CFDED69D4EE4146B73E5DC1E4152A2A3159D73DBC833D3D417CD5CF7FB3DC7745CEED4DC0F5B1C6D6B69C1764157EA43DF9DBB442EFA39D1D0162E87C2D30C5012FD16D869C8A1FCBB45EDCC8E1813B2B190A961F9FC86591D3ABC5388AF678FF03DA78B7CC0F6185721C0DF33CC906435225DF2611002DF120E83566532292DEA3D8ACD109A0DFFAB3B0B43012796DB5B50683FB4C2D250DAB76AAE35A48E8C8D4A5CC154759745F0A1230F6CA9DD9C99E2F80EDC83304CE01E98F6C9489529A822F90033C228315EB2FCC8DBA382ED4301E07607A5B076C725F124994F18A997D2C5BBF9A324605265108ACBF4610FA1C3374408850A0864E2B61017EBEC1FBAB89DE3AB1B93CE4918B9E2C9E3FE456758062A9F882B283318271F4B9552FCF32624A9FDAA44C65C60E2B3648BEF1F17D0B7C74869EE0B53C4A62A24845DCEA5BCBF93B92E4C26648584E33479282E6C8B1D8FE21181BD9CF75F8A961724D4C4309779F1F1B775D254F70BD1769CC7C0EDD2A95FE5C9D84B16F7C54D85CCE4C8A182810809ED81E97D074884EEDF401CCACDAEAD82C14D06B68AEA6CE14B861B0CFD16090CBBF469C5E084314C0D8D3960EA06A3426D8B3FE762E00D09BDA374F3AE2CBEDE2838FF89D81DEB3013090E44199AED604963EAF919914CE04F207AC82CD4351FEF7B2D94393066FE4D44E3CC5952E75EB6F3714058915DE0EE184D8C55300F576A8B82A863E81AF33417BD4CFC94E7A61263B39F01F6E2E70748B6E5E59CF6CA01B0028C93BBBCEBC548F987F10755BF33CA585CB41CF578DF5FFE37924E3C2C072ED1DAC9162176972971E79B62FB208F1A73BF0361E2993DCCCD3110C34D839D18DD43A5E8F0D941E99ADCF441405F32107671B2D8B2244F7BA92DCED587A210FE8FF43C616ACB5E766E6AF2CEB03599BA3DE376EB5735EF16143953D1FDDB7E9F2874B0D6083DD7EC4386AE003F51CCF2D21EF6059163C5152174423F57119D0FCE627D763D81C10AA1329F74C8D445437BA6718A33DB6E79375172B2AE3591821978D520824E2D2FF898B7F4C867FF462722BC07EADAD389A910B6F65429DA129735FE049E3ECB3889F6047CF2BD2A88D50A651B3235D2480E1DA5A35247FA76C831736399D37E8D033C1D051C9B6A99AB80B1313FA24C5C59766E6C51A38FE9F1186A767EEBD0D88001AE0246CD4EBE2C979DE82C30BBDB98B4744F11F9E639EDDD8C194D7911201A8FA745991B4D8A5709B62A21B63B9762913D36CE995C2D6B79151E8D83838CD1F38840A9417255DD166B7A3584499003FB625611404C95B960DF0DB1BCF1574B0965DBD834EE148117D5E05A7CC7CC1A865618A2BE4854DB8935CDA1E68BD8D09E72F0AC9053C882C4ABA4004A614D10505300B6176CA1F324E22E7824299F9C40755B71D82B679547F06AD48BE66D68072C9390233C933F80A14F8D4A6B0B4E1970E1ACC1BEA7F5D3BE224448F857BAB68AEFA6D8CB819B64294A12997916CDBF56E9A8D002DD065F12C61823F4FC214508232E431F0B6898475BB5DD0D7D528E840C22809AF7E15363724A613ACCFBE2B37438C159CE14CB0C98BFD499C08DAC0CF45D821CC2FA47319B6FB4CED7E5985EC8274DE09071D3C10DA5BF9E522B01CE91D66B91795D3D22C00483454275DD2BBDD7C2DCC4A167E5D7FCDBB9F6208CD4C9A485FAAEB809A7711DAC2865CED4306474B22B4448F85DF33417F3FACE1C05D42703ED313042A05DE0362740130188ECB445BB255DC76EE8443F733117F8351F17603175554FEB00B7FF54D80786F305CDE18CD5EC56EC0962A3E04482DCE3622D040D24C40F2E8A14A447659D6C561F2FFEE68F8D3DE511B23E8B172A01A3EDA4D3780E74C677244330E9AEFF019FE07BE3D33F322F9CE2214B9D9CFF99D05A59E47551432AE76F4CD4F8DD51520FFE811B4B93CD6219C81B63B1D627785C2A0FC22E3AEA86CEEE1F7FBC4EFCB46DDFBCD88A02F3B4E67C5FF2E8DC68BF16C74699BBB628902F72C3DEBC8BF5DF706D47A605A107DAA0014139CE40F0D46D8D6DC7",
  )
  let sk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEF394D1695059DFF40AE256C5D5EDABFB69F5F40F37A588F50532CA408A8168AB1E64F146427543D8C36B3B65226769A22911A5A313EAC17C4ABA25284514FC61335780833022316433765807578714524810173154483652641333022302614737052210781265061858507754618580548533018706647518267737733500270312878821580714026734320616250617371010311453681523024650348143708371825508406086017625831312827001718481667317861073723557447151010112110662742120835462285131388164886833510476026118315742500742440642515861365613777118478050862437064068527631150135623216841417724084830878575438508636854268450568437024007161784543800612705826206765211121483880678147555021222855231084503701364318005376837650246531507600625331251200541606324235241507731457033476564312318033365167587141304111715546812605373423882432783371222817481812013632764751028032268650876553563338104474858543012431808386438538308412704646463346461068070602375516825741152882201577858333134315582840316360106481480464368461757213631657465221517713205106646831646714728313555147332818260731554368708032843262416053205202367725828181085426785155280007282271831120868377244420548647205350861738627124677510852763340373432115424065402345080041772846273616868078152467106825545816362764180571244255708045106636115858630465207053275021822428371023852752844203300172311140215768838476231851352521084382555567411445467278546586170430758800684551353478138120800843156221466031560016368563673618080045554337312584031148042036733018271556065603440514434554851122376451064337325382338062451617081541167173200853260404371068037376070864087000352457148262203505356660372180137103710365278432824642320476423840000674364565226217665212413887347650843121701647146540387244177741376785521641117316050482604148474663803351558017351262133622227106345601657207785483272483156167834564057686734583525352081556548103205334016607423715016325334667270811118243732131154424082613775046710080261386850712837526672242308021005015520483744377116420123167107823808071011246825824018158518742085382583106675131252852765256031478162138153470422610571556744682005455051484113038302414747156272021653210303873603486751766527214217262576653612111216874845403342683544406813605031081743567506346184755758586544840762318670343367586667732075171036052737241220173887544032263062135418368155773200100365185741860214443341023755635875026188641851762415850711803541515742425854563545155707638677240017678386862588177508612360606507333506605275024724336451354552554148604216431563331655676070342677080760553063501337707701374572745128728364747780273036442310552415431163146533631211846312638837626748351386351783125814478856084801427164775364735466055660523700464031105550453648423406611175526158521573573156158778744503872054561166220446141461830006866406004737442250560104577350748702663748684802632852635811304428683261106188260700733862552715534532142573231221878655672567467472814454641577410780605613161540446347533077616250133841474266705206708125431777701522218250013173169DB8086B122701706AE49B99305EE6D016F16F9FACC1F835298B41E21664206005CEB981A35F18651CDB90E68C1F950B059F73D6D3143A1F47AA21D80A05FAF5D3A40F67148D3A89A9FDA80364D57C7B8F68058A25D08498D9A9C378C98185DB13259159CAC4769C34A08023A3388C3505406FB21C69EEC12DAC95A3C9BA61185237F0FF1E0E05F1A6F5A0C09090100665A1AD3AFB1076847B232EEEA78409BD9055DB57C1B31E28A01D09999035BDFC657A61040103ECEBDC793409733734D9342CC5A069E070C2421DDE11C49E172DBE7FEAF9DEDDFB3DA5DAA6B3DD13200B09042E144EEA951B43DA48153C1F1D5C07FCF473FA7F321E72534577C895151B46E48331DDE61DA45F8609AC59581814666E1658B49114524BA3840C6BC5596551AEF42412C8AACCDD8EF69E46380E6DEF60FD91228B99CB511D68EF6631748A0548083A215445EC54693471A831042CF41D09AF898119B0FC646E484539C8C32D5DC24F9439D33EEEA033A4081550FDB0B08923DBA5D44A1A876FE7EE4320BF02F9BE26F418F309FA11FCD0C864A7AA34115083C1EA775345AC0548C877C685EA8C91B924AF4F607EF37A0208E21309AB6D0F2F8A4EAA0451FF4A47E6F482958D81A166A6A08A6A10FC8F9ADA42B64A12B9357D598A3664E9DF13755C10FFD7177E594DFCBCFB5D11B6ADB1607445479A5DB1AD8CA6D915F89795D240CBEDFAD2539D10518E53CC450D6FC5385AD6D76B7830F13828120645E3A0A5DCDEAF15F1968E64B3B1CEAF536CAA2953D161C75528C3FA8493E0C177AE807CED37648A82C9BE8BA970296D543F6FBD6724A99A68D2F68C1FD333F9DEF8526DB7836455B313E6BC366178C9C57721601EC0335054F067B78E663A058DBDA1C12D80A392F89C0AD9E2A3B2EA17E9C9A3B14D176822EEAC5FB5FF7D4C87D76080D2D42D9AA4C951F4CAF11A244EDA711D120A2EA321D1551D86CA9265E9CD5FA9591D880E403B6844F051DC04879972C863B97C72B409C19D5EBEE8AB58C6E7B3938A68A9CAD75D80C6FFC4F22254FF4420C606AD120CC20346A7E7324E78C862E0DEE161A64F44917DB0C38C1F79C969220D202F8802D0F9D7ABFB2DE434B1C53DABB57575EEBBBF31CFB2924872FA01473B3976AEADC99699B13820FA0868F2C9FD0D352E2593273CD621B1974FFA6187FA05C4118D4517C934151C1FA34BEC3ED3639598CBA24E28229CE9FD3B1DB4969C12EE49E18B36CE2B9145AAC75428DFFA145302F41D9E3394F38D3F3C0334C4774F1E94296DE36DC6E430E4C0A537E68BDD41AF0421193B16AB1891FA836CBC367B403705ABA5D2F9F2A4C2F275EC010B2EAB84095A569DBAE4457CC2AC1CFEB1EDA43C3E2819273C487ACBEBFA0A0ED1CC4667A6F577F62DFB1BC8FEAFD86D90108E16B8B0E6C2678686C928A668BB9857FFB28DE90545CD4437DD32CCCCC6ED58FB46FBF85E0AEC0C814E536245252B8029F0A2AB44B9027A7E35A941FA113C8D82974EA22DF02D84E5328CEA83D12D399C7F0259055F4B3AD707E7B3E537B93DEA1A066BDC775FC7D1A6F0FE29DDAFA9A7DA630A467EF6CBF5CCDFFD79F1C8BB6BB3882035C73CDF7ECFFB53C712A7C7EAA59765EFA960BF21E25A6703FB304F07739FEBC63F496B13CCAA077338A0B9A976A9F0FC5742D85C4AF401A4CE341B47BE2594FF7E3019A0E064535F9D9395CC74A6A6F00E0C4E3530A7FE9310CE30B6922D04FDE0AA749CC3FDEDB4D8708C1F6968BBEDDDD5833B299D79D61428180099B0A946A5D79085DF7F872CBDD219E6B8EF8B8AB5C1A149E6E15EF2828654FABEC249AFAAC4DC0B3B542334162FB09800B6C36CC90F2A106558BAE2198FA7D1E2D730DE46E355AEA93248E53AB21B518EC99D5F3B021196A0F614A46B9475621234733A28A465CC5A7FD432C3625812AABBB42D2D9CBEF16CBED9367202B02894D06BB801BDA8472B9918B7D724E36557DBE6B7633A5FD22D0E336E5557AFC018C812E9E6A35BFD8C60AB382E14FF51142B2D2C75A767F32413BA38487558F9345CBE6FD1D6B78C2E622F3B976230F99D6CBAF0BBD14949510A52644EF3F3078865037A1C10F47B59546699E1BD539C7DDCC03F71A0158EA9F0178E187BB6D49440DF2B10630FBE2FEB5097E47F285711CA6F835A10D3AA75C03C4184C03EF3075D49DCB2177ABD53AD7399D290EA691D647329056340E8C836E9750FD881DCE309D309A95B82492D4BDC15ECF8C7F5D3B9DD275548512DB5EF80CD409ED32B5148B82BF240A7DC72A18523D808B7A4F9E254799E17278FA88DAEBC944632E83F8609D681AB463513023D67CD51B153F0962912DD64AB8F6529DC22AA89E572A7F89CB97A8F4509319D223BB29974951716FD3177140A31EA20048BAF0FCA230CEF21967ABD83309A4FF7E35E88784DCA77AC079020EC0CA6DDEFBCBB7E317329314665D7C51F631F681B600364E47574F252BAD6396B3F5B17ADC220966A93CE8F315A2F83068D2EA06952E6EBD802473A2264EFA405B3E491BE776C50406E1150C56B894CF864546B0C7A65E3F1A2BEFEF2A9990BAFE70B6CA9F91A8F3DD21307A39A2AFBDFBDE9B7CA3D7828B13F49DECD729C0039E94EBB7B4BDA09B3505529A12CB1E2FD79B9E5087CD7C3BC05F7CFFBBA932A7BFF8E67555FEE0304D890313F86E1892569E2D6F14A89938717AAA3A32AD1167150299C21820ABD70FF902B004C6DE91C1C0B40706442AF531EC490B012750BCB4877935A7E54031702BB988EB3F92914CDBD42979AD7D27B2233EC1279D05493B12D3F5FBB7757536021B5F4CD932B480E40CBAE50D232E0A2EFFE0E8CB58808669199F0830872F369738682F846F6DEAD095BFFCD670A4A9CD142396C58506EA7A68B21ABDCC19CCC06F6DA55C885A855C456680CD4477BCA2BBA9153DCAEE682655B74ECA6F7E44C3BFE1E2D457491ED1BC64E1CF6CE18CF44A0166D1B244480882C1B35CEA703158E18C7EC6E0CF827D5504A45AE61152309BC8A18A52C0E7699A87C4E31C6911A8305351555B2971C94602B70E670AA30B90734EC1DAAD03A30A96F5847C5C3F7973CF4572D166C51D1E94A50A4C1C894A205F8ECB34E80F84CA8DC31A429D5600596179D1093E2A389CCFE9C0402EE49551710FFC25BDBE478F39F2063F31F75D7432ECA1C59EBD8F46D86A092DB12F810FA911C20D4CC1E425C543DC64577E44D84F422D9661E3D35921350D6F7099C5425E509E1458A0500AE5EB4CC6BB50626D0130F09361717A95919AED35592FA4ABE7B2BD4F999422151E63D4ED00CC751A5867977F15E482EFA01E5CCC44064F5B9FFE29AFFE626C4D5170ADA1DF027AB4179608C4093CCE2C409308CD898371A49FBEA2A2F2BA13BDEBAC1F4159F4B0368FB21D70A9D7931D7EFF934E6C544E13B7B73D465576C6E81FD6D5FD94393E80242F9420ACC0ED353EF18CA070F5E9A285AC4BCBAB19A38356F557B070E17AE5CF1F1BED42601E89C8C4C",
  )
  let msg = hex_str_to_bytes(
    "D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8",
  )
  let sig = sign(msg, sk)
  let sm = hex_str_to_bytes(
    "B055B0E17610BF54B33B96098D796E98F7899F4856CBC8D704F9D7778C1877F1E124BF62A0D17F013BE4340FD57B4FA6222D9CDB9028E8B02B926E1554D145F44798AAC2FAA2033C4AEFB6CCB6CFE5C2A6238EE79C5CC2F0E804BED17F75C1F3994DD7E7A0F2A7034C0C8C9864804057E2E557673FDFD664356FABD051F9075B3400A0C7E84559553EDF989BFFD2112B29602203066BDEA78435EBC6E3818CC92D61BCC125A8575B5A8AEE4225FB9C62483F3ED1185A6A96822E5EFC1BA7CD8D5FD8CC187D2A2669CADF58FAD66289794C96485B2C4645C7D3D35684B7429B5EF315457699BE8030BC3DEB8166602AC54819824883A246C8A1A34FC89B2FE0329B5CA05D4E14B6DFFC2144606AB360BB3B8AC5A178998B46218181CAC8DE4C294830D49D8F00EC12C3D3AC7B4A2C301758E68A5681177FF2A75D1D4BF1C926880B34B728F7C32E406099D95AB44892F748AAFEB55B26BE317512B0377DBE891AC5456A924C36839BC801DB2AC5B7110A9BAF4C3C49D005393CDFFAD4F9686120F4FDE0168A9E458E729F4B0AE1A4C4124CA34DF5B63BC2E7CBEE01A38D31A0ED8D3C4C3803C3C24C5CADEBE3E91A8D2E1BFCF0508A2788D89DFEA20FD63818B83960A6CF930872B95785575088CF7E8B63A1895A8C1C77A84CB9CC6BD1D5FA939677AF17EEBE2D2EE684C66015F1BB142A727779580DA1BC5E975AA56EF5D77A8407E506A5DEEEA5E8B0797F10646005648022213CCB86A77DF5D7B316E85D55B9DA0FDFD5F23552DD47CCFA964AC39EE684BD63793BB7DCAB69BE7ED94D8DDBA185E80A7AAEE74E878F50A213F3B4FFB66E6D34A39C0AAE2B1D61366FE403539C69A088751F56901A10BC442313A35C2D835476D0FAD447C770080FA41BF38D685FB31B11A7D2E6FB52673D168723E68908C0672A0F36E25A199E17A6FE5B8B825B96EAB7AB4B7D8381DBC50031A5F2E09E4BE871533ADC5D08D009429BBF5C86F8120D095C8EECBEF3E099DE618D4377241B50369EDE51AA74AB966589E2C687D6C09FAC9C6D6C5461F5A63008E9835FF4B5BD4265F1128C092C27D4DA508FD4F50EFA74A73157059A4B2F41FE8BF967167969B93BF5204584269032429E3577704BDF689800DD8BDE826B74CEF510A1E087023F0926E97F37926B16EF786C37EC21F2407104D3954A7A07C30DE2D6788402D71A562EA54C79B4197D202C97725D2D8B7E7332F3FF1A6FAD49A4C00CD1A447651B8E08D8506BCA823E10EF4116E6CF49675C4330A1DE1908DDB59F7EA5F89C94CE500F82B43CE789158473B9E07905D8E8615EDEF021383FC31D618C5CE625653B40C21BD7E0BC783D93BEC1B7A5B4BBC6C281B7775547390EF3D30E277399369308D8A1CDC2E1DBD6F158970AC2AC5C2C9481975B809580C0EA89912C0766F45830A8963FBB7E17D84385175A6E0754683CBFBBA6364594F6B5005C15BD5F85732B5A63F26267AB17048C6199200019ADD6A4D1ACD0405C387666E87111B9825AFB9751CD3F9D8A45C6B208D2D333B6C59F98BCF284C854CF7D4F6754FD75EE068C88678EE7565B47B36E68A1FD7BB60E2A8E0DF7127020F5C6277B3EE058773F9BBF1DC2E398BC301202121C699C00379D8350099626F9092365924008B1A9CD9F8787822BEE961ABA239CDCB418E93860EF348A5E9645389A0A878D394F365AEBFE280BEE6874A3054CD98CBD8716662804729FD46FCEA9C4CF929F2F120006CEBCC0BF75692D63C044635D1A1DB61AD1789415E5F2242B7400A8A79368ED602C336492F270345BE98B2DD6EA8E4C53ACA36E3C9BA288F27586134CF0B5CA9BA1EEDF20D1AB4F2D08F3B042DB89DECFFDD23854F35120ADDE1603335D568DA95891CF3AB21D9AFAF66C286C1300019CA9BAF2FF3F6725230C4B269892F7A3DFD6EAB74C314A86F8B47EAE49F419E4A2917B984FE9A00332AFB7A56E5E675223AECC503420AF8B39FAA920E3ADA1A43CE7BD1F7DF2301C9027CC1CE5666EB0936210AFA59E10F307CA1F7863EDD6C3BB8F5D63C0CF0EA8F06EF08CCC24C14F295DD286FD9F4E7102109D53FF5EFF4A01DCAAD5FB6055A0703CD471B20B5FA4560BDEAA1313C7647AE756AE8591579EA5120E09D6794840629B9FEFEFC20DB594BADCD129EC491C3CF75AB40C472AD22C2DEDBC77BA2671C843486560DC765231BF5FDCDBCC77C8300F9D2B53EC3446D82F087B89BD992F7AB0A780B5388118BBF17CCBEC2D196F3EDC478FB947D8302B040A60D0BAB85C1C5C474EAB41E064410695C60E1ACEE79E137D702E4A313968A557B97CE64331888B5289CCB37A6625E52273711B846458D5D8BA1AE4965378CBE918BF0F4BEEE1BD08FECC6606D2F3970C874B0A09C410E0C7D3D6004D93F06FBC258F964A9619B2C6CA28A3A2529BF44FB9F244382CBEF993C418A3880F8D5FBA41F05824F4F33B24B886D115B819816C9B7DB51F2AA0CC6B01B6AB211FAD55284CDC045247859059BD36887F3AE2B6CF7F87EC2DF3C89D43D27E5E4888BAE65B6924FA5DF0B2ED44E3E3794B6890F933F9FBA7A789FC63CEB74360D4AC9C64F10CFC0AB374C712A3CC6C876B22F6D9FEF1C387BF6BDE75792AF9094EC17EB8B55D355FF0AE9D62111AD8A3CBA4F5663D94A38A43E352979DB3DFDF32988534CD45FD436E699C467F6DDD5076B4E5F7F382AF45D3170F25B54150D64D35A81855F4B22BAC9FA17DEFAD73B14B15840E0870DAF5B92A30D237BF0C08CB8C9EBD4159D3BB2D474E3E106CC468E6A24335124810F486A6473C26A5D783264FD8A3685C09D4EF77BD9A9A5C0B578C95E7CAA34ECE46F8483747EE584DBB2D972076D763B0B550E2CAE8349E0609F14F0A8F5110CAA4CDABDD4440AD169C2ABE86EE1C680D6E94882964D870CFEF70A4F4C04B49CC4A4FF6D4B9E36918C18A6D5C4AF47CCF09FF64C77AE3BFBCFA504E169EABB306951A28AFF2FAB7A5BA476F5650BC7DA192D4B0EBFAABABE772EDE2A1071D5C4FC33C2525E40D082FA935BD32FF2506B3A131E31581B6C944C25F2D81755C39D3BFC0C6DE93E35557AB1CF3472B4A32980986A31F882873521938D8BFFE97369FE29746ACFC8F12DEEE0E9AC3E167602022434358F9DC33B2D4408FD08954F9745A0BD65BC77EE8BEA71BFA7640C135ED19CC2F1C22E0D6B02DA6DF24DB05A6480DB45227DCC97ADCECB3917F086C6E98083A212D54DC4B810F689C4F9843D2FB9F5726B87664CD322C28B6F1E01FA91AB3502FAC01AFCF52C9B3D2AA20E1B385EF470CB33078198B5C4395A0329CB10F9A4E96F43E51161FAAE190EB8C3969CEC2977B08F68D24EFCE566511FEB654CC5FA1FE67571F58D848BE7C564AF566390639F81692A7B7C0F9F5AD85B82F6A832C9DA52B6A47D23F9ECFAD449983C939654658B10ADDC0B4AADBB7B85EA602DA7617D1B4A45D86B8D09D2C5A402A6758E06AAA154AD096678CBDD9CA6F5D92B0D738501E18C1DCD268DE01120059482DFCD12B9BF26E1CF3B09970C43CF5620CA8D4E2FD31E5A89EF8DD9317E6CF55B3FB19C072E9D5DDB974EF6082711E9915D3434E7D34E7C325A8D92B66B083DFD6CFD162FD6665DF9ABF188F2DC583FDFABC997D7870E911D3C5EB5BDF80BA8DE6C46C88E049D39E2FA296CBE069CA69494F890887679CB3B0E6043D02B8F24A3F1483C94781B6B01AF801606399C3AC62603D86F7D52955C3125958C04D572A34634CD2367358A86AD2B481B326F2F89D4B4DC094E98918B5AED8F4EBA49C56172B1651B660B87047BA652A640CA7B069971FA2A66C019567C38B7F5D2621E7CB4BAA4140EF5BB491960D80F50101A004E079F5B51F394B029E3EBFBDFC33594E95F6A37BC4F6A329B5C1D8E04145403D33A5C704B343518231B08646E4DA9D5A4ECABCF50F2B3921E85A84C409A1F627EE0F6EB1B1B9A9FCCA9CBD65CEA90088797DF7510B861B86CA4E998AF075949B167CBD66BCBE4C5130347D877CE5A8479F4D56D398146CE2F1A785428DDDEDAD66AAB287CAAE59142435561A401B50934392D4329C3C21AE48328653E3AE575E181DB389BE439716F6E3F3E2DC61E4ECCFE548AB7D715EAB49CFD7641DC37F5C0C0C34965C06A156705F986958791A59CD5B4890D9A1B1CF08541A7A93D065DCF3B9F6C513C0279437D4BDBE627140D294632639B746891CA970DF6D7321F1A913AD9BED3FE0BC02AFBB8720B742EB409EB82C66967F60EBF4CEE2508EF7F7035B7FC7D9178E73EDA0529BCC9EB20B9CD774C564882DD57CCFB54663CFA81B914E14C4D7D74BCE139B7EC53EA61B0BF0DB61C73A7A95F596E128ECA7A8C9EB92C2944EF564943EDACFD48A5A8BDC7D0FABFAB6DAD3C5FEEEB139818C8573A7BD7506B18BFCE2BA15105B7CEC83096C8CAE99FBE5EA2C10F1BCF3F15826A0D8ECA97C42BB17CB9BED219A8CDA9A5762857EFBA43B7F34157AEB492F81D2EA156FF49912A4049BE93E12A226295D8F685C89BDA3831EB73BE4657DBE3B09C09D1DAF944C2664E9BDE9174198FE3DBAE4DE0945229EDDF5961B2F3D719FABAEB9BBD0D63F6B74F147709CB2C5CDDD253541A2D4DBFE2F619FB6C0D80D1D3D849398BDF1FBFE000000000000000000000B0F161D232DD81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8",
  )
  let sign_bytes = dilithium_context.params_set.sign_bytes
  let sm = sm[:sign_bytes].to_array()
  inspect(sig, content=sm.to_string())
}

///| 
///
test "kat-Dilithium5 keypair_gen" {
  dilithium_context.set_level(SecurityLevel::Dilithium5)
  let seed = hex_str_to_bytes(
    "7C9935A0B07694AA0C6D10E4DB6B1ADD2FD81A25CCB148032DCD739936737F2D",
  )
  let _pk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEF032369A2CE572FD08BFC304B4848E78D752D77E97A28B99B9BB6FB5C7C6337514B321ECDC1FB669F26D4171AB42B72720EE70E0519A6E1D3D6D9914EC1B21CDE38B41AAC1D3ABEE6F2B7495C4C820C1FC0CC9E71E24CFB5C9C0D8EEF4264AF484FAE4D6E5DDE65D4DF72B61C6DBD26F861A5E0B853AC5413226FEBBABA5EB474C6FB25A82678EA1606B452A23112221017B8C073C10378F9145641A8C078C0ED9E421650F748892522AB9FB7D1FF8CF1CC71B8566E8DA33CD7361770C044349AC440CCCDC6BBE35E6C55782766F38E688BF47821037299E344ECDECA17AD5D15CD27A4F7B070661138EDE8ED72A8959C5AE36B1C46094A53CB21A7A42673F1401C2B259494090E2F53D7EE7063431EE5858002D850AF909C3783436010F7EA88625A36A0F0189FDE75B7E8C7E4B19D8527008328ADBC929BBC86E964CFC48B8CF1DA5D7ED3333AB55C15072832214A779A5FD10CC04005F46C1AA8884A161992472FD535B95ED18BDE1C6D8CE678D2817D69F90571103E8520E7313CE7B930C5EBFAF2F4EC758B626B5543A068CDE0FD0E94E6A64475B23268BF0380D075508F85128CA26F31A90C4A7D28440D54D4066B404588588B4CCF850B975C73AFE68CBCD102755F61EB3E60323C576E529EC0BF23BFA5BEA39CB73C37E8395D8DBD4C8DC8AB2F70A0BFC3A78C0D413F08D14D632BC0403B0383DBBB22BD9B113C89452AEAB11210097947FEAAA3C9F05D1D300C33A55E3FBC81259E862705C3A13B9EE35F6B23ED10F4EDEA9519FA91B7BCD0D501B5ED57D9049FAB91AA779C725FF8E9F78017EA7807FA254B7105E826D096C01ADAE2C5D138251A92A478A33373F4DE912B83B6FB4B0D0DE6BC1118BB2FCFB07BD227A5F7F991439A13DE1238180CDC55119E65C418584D807A926E4A9C0F70155EE196FB07656D9AA7982B8795DBAD43D1059CA7F580D3320C0438A5ED5A7032B2E959678410F11AD98BE8826A44262615645D759A862B2AC52D3B014A25E8473F1F1EA4CFA819930AB3A34D710DEEE70CA13E88FD71AA064E6CB4697DE0E463B1370A6A3BFE98FDFE7B5471FF8DF6A6879FBEF9AFB3519D780757D67440AC36E837BAC3833EEAA980BD82B7936436A0307D164B6438869AE606E980518E913D0EE302396EF4EB25D9866E4BAFA101E5992931361C4A982253D58ABE3BD57107635A46F09512085F4ADA08EC8B1B3910B0153B2AAFCAE5033EDD4153248DCD85B02C9A25D8BDC4068BB85741726297A25AEC55C44AA28059B71BB9F34067887ADE4C1CA4908B19B3D78123453876DB4DCEB42773069572CD8777E62CFBAF7203F020F281A6678F790720EAA20E34327D7A63688B09A01F4D7088F7B5059EDDEB45C0CE39321C79521D79A59ECDD468CED0EA82CA484928702F57D6FC18D347AF3ED22AAF45ABB0F20BAB9E01557607AE3ED9CF0E26D34D305449669EC6FC1BECEADCE183F7A594CEA196D059A1E550E547866CC087333F030E628F2CF1147925410ED0421DC7506138B1D19099C695E1AFDACE4153825B66A8ECF55A021D21EB9F848FE55C21769A755FA9807EF73A6C5BA15A06347D3F1C5C619A315598629106AC0B86AE0D8E55578292517258AE85F72E737AF5638D096B76A3C57F1B9C80E770A2D4EA4E42FE469AD421285241960A8A86355EF22F583FE3BACADF8DA31D5C2DE254161BC6D10F9841DD27ED462A6B94B6DEEA90CBAB687FB84B56395DA763AB4B7FE3095D572D77EFF3FF0D8F9D19AA5AF7B676053DBEF64E61DD0A41D402318E3308669106259BF7A4CE31B346A9E983EDABA05180149AB057F9972977DA7C6F46E0CDF86F3091F04FD4E83C6022E18CE4382B54D5DABA82E4DF1E53BF31FE4BB65A8524EDA83FD29D07E49747B75291CBC8F8EE1415EC921E19022ADE2C047E4DF3507289E9D79A8E6992B48B8864204A416B769CC787D6DF4407E93D121F7FBEE0E408963E0609A9C75CB3117CA583DF6E79F31C635BF0F1BE98DF550727A45D3CA337D79DE5DCDB0B91CABBC30D7EF0AE1CA1E94904F78C1FD8FBA87545FDC174AD8190F9B5ED7B5869494FFA91033FDC6117BF662EC5F2AF2634BA3F8C02210F1C9BCDDA9BB39760E00F25A7270C345666FB6DF85C919AA150CA7FC80FC0EACFE242EF55F4298063628E61056C966DB9964428D9CE99108271E29A12328E23999734E036F18A0EB8F030E88062C56717E7A36314E44ECF357FF56EEDF90D3FB11B22A1B25905B379FCCA5CA1ACB956E178AD3F51D535AD119813B1E70F7317651BC75CAC64276BB98110B54EA0EF34541D73910721D657387677E332E9C8811C3FC1B923B2EE9C512F6D09DF372A5F97FAD7123389CEE197B5C269E221D7EED3160A521E56FF8AAFAB686179D09D78FC387B3EA6A672034D24AC7999D196B2316475F37DB8E9ED431DF58341FA88003D3C6489E78053D8E44CE7E16AEF416859B3D2AECE09086A748B7BCFD10F73E3CF8B31F0CC44DA059C69ABA5BC8EFAD45D3F376AF3A0DE6E169878BD842E28798E4743F843844BCDF8506F136391EC8E721DC2B6282D9C50FAB653A6ABF28947420E8C22A9A487D76A938933B34E497DA95394176B2774C09EF0BB1ED8C3B131A21957B31A0B47CBFBFF0533CAF33125221DB6BA4A518864892CF21D3D4D58B599A37A08F344AA7EF98E7D7D9D3316A6B115D9B8F20F93BC6865734699EB54C888D7E5A0ACAFD1915352B294243712CFE82F85248B00045CF3D090C0C00D7CA0E3A1F147703FD94F717E49C81A7C3A76946E20A63F3B7C3EABA9225ABE0B34CB0CF235063967D16BC8A69C130CCE287615CC053114167EAC4E95BBABDFBBCF96BC0C0D65EA000AEAF490D723955BD1B4D69154D262F6A6D3534BB0BC397C29ECC6B1447B75C953AF441DE2E7133A7AC98988A7EF9E6EE63558AAADA0603BD529776F05558D2DF5641C412E7347440F65EB823AFC7CCAE6B97108B857287A0486DBBE689D770CA92471309E73AD390ABF56912B2B7C49242CEC157BDBBD493553735CB1D9B40AFC214DA153359C9DF576135901C2FDA58C0095B6FCE3FD0731DF34863AF2882D53773CE7C182473722AA79A6B37D3EDDDE38FA71DF8C0EDC081EFED8CE606E48299180EC6FE35FAB649910C48A6A29F9D0F85557E10BC5AE2ECF028AE399F55CD7976028935CC03C0CAFD5003C9EAED247FBE30A284CC4470A5525A6498E1DBBD3085C3F9D77C6064D0181BC5A829561560AA9A4EA8173D7937A9428109CB3A66B2B3DE11F88F55AB21EB49B77A39762CA9264E0156566765E2D3626B72B80BD1411E4EC53552828A24BC8CDC47F465FDDF4772C7BC02066854011287F739ABA6047596747F4234AE227DBFFABF0E13153E2E069F0B790251BE877FE5A198E808258639F5E79D3D5CD16F1A573724DD6A9F6990C4502334DC66F65493490673AB30DCA7C031F0C212C0D8BC9D0C874B319A97AD1CE9395D3D154203156C51CC3B9CB13D0BA1BDF618BC8EECA9DDD9412050CFA09235727AA50D46F79AD6F3C5A1BB6B284C8311DCF93756859704DF8FC3BB8D2F5E094E04502354942E9C852B208D4901834332EBC603270CB57ED418C34CE48AA",
  )
  let _sk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEF394D1695059DFF40AE256C5D5EDABFB69F5F40F37A588F50532CA408A8168AB185F684AEB401B9AAAF812A00E124FF56FEE51BA7C11282617F0572CC791DC81CC0A6711A966C11312AD9A821D8086542A600A4B42C1940720242628106210A43852331709308108B188C022492C1B28412C4218B042181C8610248059C9201C0348819326C582046891868A2C28D82346A1C094200A28CE3A6491C112CC24812E0902191985062C084622451CA062C64240E1BB3312496854B4606DB2668C38268441046C9B6211404811445502442084422710B92459AA0811A91709C241003957004C504C82692D29200C0B260C0A26809190AA2300E188969E0008DD84862DA14712018051907440412409B1240118010D142819928508B1091022464A0206D1246211C838C1B4769010690CC062481846920982C24120521B15041360298446ED1A63111056AD3A840CAA84C62B00003134A53344614194004C54CE306695AB08961168ECB10808B168ED990640B94602483851AB30454262251B8251C424A0B814842C4445A102023808409B7254CC64814854D19380E601651D8326A0A918908C170E0964D18468C01328D91C4054A0061230868A2104210A8611306218A248E620689C9B24508278451200D980466DC42054424852426282221612016090BA62C0A1144E0928158480D422210A006098B246E81288CC0248090308D8436404CA68450042494B68DA2926D18B344A00085E3B805140504A4C290842281C3262D0B2066CC903198382810166CC13445C0102224C688034632D840901C20680415289A188144988D9C206E9C302CC1B820614221080310A0C28C58128553204C0330814CA48D44C08D51404C1CA72C440865A03840DA20808106858C260DE2A88C9C4411594228C42604441426A1426408C0851101869B483199B20C80464459A88C0042089882900AB54562244812960544124600C88813A061E1284D0AB9914B962099B84400314E98128500B60183A00D14150E1881101901224A06681A498DE1A28411C63121262591A06D030524A1B6089444724334125BB42041B650D0888D0B074D1C94644C208E8B8808E0300944200549864D03134E19C9840937611A43684A80900204311C1742184080C8308EE1A241C33404A328225124718284011BC0642347728214665B3868E1C6299B904060388683A0408420044C940110258D82024D9AB26920151060462DC2142E0CA82C5416220346899206600807820B474448980909430EE4320A1AC065C0A42144B29158C604114520C4A42102A07021222623B2684B08400103918B34811A04040CB005C29269901468044649148349A2348919C72894447100C94958387202029042C64C0C173248C68C59283109B728CB480E9A22851CB911E3C630C34828CCB82803C808A4B604D0188C601872D0209282022E591889081932C9065260908C098029A4B48C8C348208421002000813015083B60841944D1B496C193911CB324102C0654888919B986108B50449B445D3300198046D5300894232608CB090648868D43245481471149805810022DB4469D9248911411209195092A084C034224A2410DAC809D2A80D2285218BC890C100665CC02599A4611AA4110A24285BC44813148963926120300C40022521882824018C10816D4C424901222DC1960C08489001C13023C189A1C464129709CC90916020661B964882A87191C065DBC20184360A09242952104EDB240A610210203825983460822430C41249C0A2050C088593280963B20523962042120DD1C01008C540C182651B1592A4145184042653425224236D9C284E5014058C208024266561444C021120C8C04C18A00D003870991612A11640C418450993884C8221CBB281212661D1A82441308408807100C620524292892412A42689E3B08821988C11962CE1962051C28120918094166E14946020C9459B2245A23820C0360860908D4106025B066EE1400A89346C1AB269A4161003330E1A422803196E1144840B244A1C166A19984003A28541C08CD222610C82105AB00D2114725A82800286100C27265C486EC9406C1B4904E4B849DB328A9C242C40388022A9451229A4E65ED31C793ECB5B89C55DC333A277BF5C4128A21401AFA8D428C821E97AEA05B3AD2923BD9710871CE8B3B11A711C9AACBA108CAF43A172D6599401DB89681D0B874EC357A5295C0A08D589C4539F9C59F33F06446441204984E1F9873C1F9775B97ED400C998B05162B6189861F28DAE36C2133765711176CAAF5A1DCB2A0E223A5F079B0741A5E6D510E58732DC0359D79A7741A3791CA6504F07CA8A2C031271184520EB76A00B9B4626DB37341C718065ED95FE4CB054BFE71E80260D21907B9BFAEC86AC83A48563C0B9B2EF4B9B4ECBCB2F1291984E89E84C55690647E26547D73E4CB7F0E06EFFC3C479E2568E7464EABF1D1C4EFE211112E62BEA8B855F50D71651329C00EF619F537E454B095A9DF6A8590E5BBAA15C9E64E701E37469749462A2119541E75549D056A25BBCEE11CD9FC672422AD2AE97913D30BE3CD85F58CFA904F443AC3A8DFDBC2CC9C8C39B244EE7E0D95BEC6927A2B0B94E973F9812244643146E19013B7FE17114A0F39F92286BE0F0EE396FB74C76C91004B827D218951C77BDB81590AEDFEA9E62BE0F22AFF55E36AB572DF13AB9F5EAFCBC34DF266FE160C6B635B0C3B63C892920185F112B96998B5B5BB973B39008B2F0434035D43BD2E49F2C174520D3A89854CD8250D6200A1EB51079224656D0B334CEE3430B87E1FF904D1034C2D8A7047B2D225633190410012C161C768C1FF8FC179A446864DF93E09D1E6C29487CAB044EF868D431B1763184ADCB39516DD1276BD841EC492A8451774EDA106E7321ED5A6225C35324C510663B9BEA05F1DBC8D5DB69A77ECE3E4265C5E81069864580B528CC2CBBFBDE625AF2C1C5CB06DD80585404964D21114B8B13CAFB6DBE1B428EBC8717CCD11BFB347260AA701BF22835B3F1062EAD36ACB96D7496F72AA5FF1A1304BC02E358E60B1C8230BF8FFAFD36E0F6B2E3D8582FD3A43811AC24D06008103542878CB5CE99F8920CC802DA4ED2183956834DA4C719550DB24795ACE09D88CA3043AFCCC9AB0F0306671FD1F250957CC62464C9EA5E444C6EB476D092465608FEB6B7D5398A029E1EEAE50DB5F9F99550A9668343EF2970F22531678E36713B81CB3633F1DDD46769826E4360DE19A56318D9EB59F97A9B3ED22BFD89501126295E89FC735C3619D77F6FB935C2FB46EDD0A4D2921777B0EFCD58BEDCEB9EA5666B18DFACF9BF76333C5EDAC72B04E657E4E0865E043A6468C5E69D5BCBE5842BF45BEE77915F0571D150D606A6F2AC373792908891BA85F45CB409D963E49B5B96978A1939160A8DB9D63C4EA0D6A7D09370AC1C24498D21A8D5B764A39A412E5B54BD1C964D244A4555645F1F9053F8BB33F6F75146807B4E9E07B23C9806FF7572469C094399BA9779B962B4C8A957F869911EB13F140224AC4EE76201C02F24C7EDC3A980899A30BAD2B12D5728F097176D0017F3473D2FBBD43CC23A501E81E381BE0179BF68CA50FD2355CA7B64F53E0C7D5BCA4E7BE69163E316FEBB49A9340F157BAC3B0BD84A3B027A2FE44EC266A8CE4A171B91828F454302AA9B664967E67DB38AA4E3BC353D1518A7FEC1188B7D5B7E19521F1A2877006989B0FE918946B7593ED15120BF7D23F99210DDB76DAF86E237B2379CA12E55636C83408E6D2B3585FABCBC0F6C48767E363AC847CCC67EB7C937BBD941100D78774AE1F44339DCDCB0E700AC108DAA92CD9EA19F8238F28676FEE7BD1B9F37A6CA17D7CF4042FE39DD9377826C4CAB2932E12DE53B081A6C25C0F47DA3D916831E4247D097811E1A0870CB61F4ACA127EAF85A9CA666FA6C36398F0E7420CA9895C63A1AC4DB49A1D75F56464C1E0CF9283A45445650F95FADF6C88DB3CE7C0E5D0E7261E804C03A419E4CC2501099CA536344607B07E825323AD30BE75F84E6C5BE238EC78617A0A23414C7F8CD60913031BC9301786D5C19D930B506C495983223EC1BF787C33D228A110E57428773E34F12663D11C155DFCE380D65764C2659EAA0A1A2E764EBB5A9E5A7192E9086A6DE4A38FCFD0412424260620C1E567A2D8B1AF3554819A00D5C7E5666D0E656F8D45C67C5448DAB5EB6E6029379C47A24D011F56E5FAA49FC6BB2D750ED4C95F835384F2FAAB13C1CCA71A1EBD2299E9632E529CE77149F5FAC31AB28DCC70670BBAB9F7B6FFEAABC7DC4513D8FAC4BCF7E5E7297DB69E4B62538F9CABD902B1007E3BAF67F943DFDC6AA7562FABB1E8FACF811C76335790A16F21ECB72FC1BA94276B209807EA52E74F2B6CA0B3FDC30501F6310EC9955B051818DAE1080FD4DD24C722D68DE33EA769B4E637007CFDCE1804AC2A771F88F59BACEDB4DFB79A41EA70F14ACCE6A5A8A8843B59589E4528BA85210421D1E595F84C2759047DB47222673868C0027EEFD996EF8C8C4F367A91DECF17943227D4D00447FFC6CC8665E08D293A4DE4EE11569B95BB4DAE758150E55783255E2F32227B45A9D2619771CED512D5CD89018C99E2F05233EF5860FECB3791B53AD2C228ABABB9FD1F50438E9B0C6EA61E20BB5AC0AAD30509FEA9A441D555CDD34509CFC6062E6B81DCACFD5F5C9C526B38D704C1F0F28B4FB7C1AC69AA196CF812E4446EF68028744D2A540FA7A69CF87A1F96824E4C6878235F0CCA3E97B2B22B093D95EE18DBFE6761DFAF834475186075602313EE2A299BCCCC6531EDA5410CCFA09ECB8A60D28337AA556586D784849380F02EBB837CB0BDE57BBA907B67C7AD866E1DDB1C79D961D70F55D059ACFD39F5BD30374B4845E04EC26E8B5B93FC4544F24AE99C9E51E435775D22080E19E3AC225C7E1EE0A56B952307F44BACF4C8785355C09DBD0D86057F0A6A988C36574202519DEBA045698D72427770C3731C9B7535FAAF0CCA9D13C4212B762945752E7A6539B47BEA966482318A9CFE3BAEC6A83FB34F0B68EE97797420FADC3F025EE9F18BEA38FBEC0C5DEAAC7A52F7EB8D94FE4C662541457A153824BE60D7DB833890F3AC3F7BD6D73F80C672B76A5267DF22CFB5E1B92B0CD68E9A9209243A42A30F7AA1F03D0D9113F04B76EB5AA69BC9B8FE798E77501B0563029F502F7794DD390747AED085C22B21611A9C76238EF6584AEFBB357F8362586C59FCA8E092610115F4DC2930D7224285EB8FD992F8217AE9470A74AE3E806010C8D021948BE57AB1D62C0412EA5C969D0566841F2E2568E013364D87CAF33229D2AA6C56B9FB4C136A13F5E733A91EFF21DCB290D8EC6DC0A50E57C1F65EB2BA1C39DDB1C095424E6F41F9E86567F911400D85C90D64FC7E6ECC28804F2704240249EFC8FEC69E366F3687A76205C0D1DD6483912A8F68EAE2CB3520A8B172CF2CD2B03802E5FA7B1F1EF8CA0A6080BF9DA3782D2BDE4B3A3C65CFB9F1B3905B9361D1E0C8FEB5AB40A3FFEB3AE95F57562A07CD24318C0E7EE6EBE570CB7DC1C621A849213E7139242758128C16CFE52F8E2EDA5BA2323156F853ABC61B139041A4B834037AA19DCEE7606AE84C1A74D0EEB6A4DABD5908DAE2C23A63876E7E9F8E90366A1FD89F2283D753009E056DD5AB953DB3D8F4830A4D09379395F21ED03B6CCD5D7F8F81F400B3E3BC696088D58177521110B6C8474F3E449D8EC7F466C2EB343659FF53397587BC6300DEEBDC2BE674B783090EACCB93B6AE94956A333E858376473CA67AF0543E599941EB4E8C6D95D479FEEE05E3E8BF5F0AACD3451C0ED481F526D38EB3B26A4FD98E11BAF67EDEAB2ECC7D397E968F8D103E80144A4CDB700C41A42834B07FD7E91F3C52409C6882CF415A42F71E21FE70017D62B1FE43A2A32D815E3F1A44E7267B1BBF552F38E889775ECD85C4BF4650222F330FAE4B61765525403FBDE0A18F973657CABEB05FE6B9729D3B3730AEFDF3C1896997A949B603C43FECC3EACCBF00C03765941800CE42FD0384E1C1C6117316CBA1A81A209033C5B53AE3B60BC1AFC6E7C95C5CB99C26A4C881F626A219A619BC35CF4EF0A3B6725349D2C13D89DE65D9F7A3551CCCFC5611DC9C8737B0EF0FADF865A65339F464CB065BA8FE4810646A3445B702F51D6A91349FD70A35649FD4DAEE61310A3CCA5ED3ABDBFF8355B5114835FDE73C9F52AC229B15E84D3F59DCB1302551EA4DD6F415D013911D65315C8E59B12204AAAF525754E96EC3CB13E1972621F9C86F5DE4ADAB980CF8369127C2B3E4EF1A82B7AC959AB45D97EEE7A14E4145B349B533DD92DD2C177C77ABA325DD75C77B31A6AB3AABE54A6CFA2DCA35E209935EF9D947A37E83597B94FCAF58A56D14A056912C22A54A6FF2FE825BAAD8ABF1DD87FB0FA1519A5B7B42F4BB2F757EFF7C12A2CD1B91FAEBF8086516DCDD55F6384188F53C6A781862FB5CC3CC61ADE2F1108D15163C38C4CA01BF7F2C81B8C79AD694A01617BC04F8470C2C771BEE29A666BE85142CB967EC569A4022A64FC5D95A55776AC732755B23929F25986D93C019BBBFB154C26BB47A2BA4B3297DCE447C561A1C49F7535A7A14C9830186AA0DDFA001AEA0D94C40AC8A8418E8D578D8421413FB7E820237EF3B5CBF6081C442C13B4985EE639E8F86DB2873BC2C9D3A9E517AD7031DA3CC92FC15F502FAD3FC5FDBBCD2C9550A89525F0067CC3EA22D8D5B61AFAA4B553AC303920F25D6D58F61F6356685E43509A0062F837BCB9A1A22CFF08108018D6D24BDC2B096D2E",
  )
  // print_bytes(seed)
  let (_pk2, _sk2) = keypair_gen(Ok(seed))
  // rho, (tr, key, t1, t0, s1, s2) wrong
  inspect(_pk2, content=_pk.to_string())
  inspect(_sk2, content=_sk.to_string())
  let (_rho, _key, _tr, _s1, _s2, _t0) = unpack_sk(_sk2)

}

///|
test "kat-Dilithium5 sign-verify" {
  dilithium_context.set_level(SecurityLevel::Dilithium5)
  let _seed = hex_str_to_bytes(
    "061550234D158C5EC95595FE04EF7A25767F2E24CC2BC479D09D86DC9ABCFDE7056A8C266F9EF97ED08541DBD2E1FFA1",
  )
  let pk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEF032369A2CE572FD08BFC304B4848E78D752D77E97A28B99B9BB6FB5C7C6337514B321ECDC1FB669F26D4171AB42B72720EE70E0519A6E1D3D6D9914EC1B21CDE38B41AAC1D3ABEE6F2B7495C4C820C1FC0CC9E71E24CFB5C9C0D8EEF4264AF484FAE4D6E5DDE65D4DF72B61C6DBD26F861A5E0B853AC5413226FEBBABA5EB474C6FB25A82678EA1606B452A23112221017B8C073C10378F9145641A8C078C0ED9E421650F748892522AB9FB7D1FF8CF1CC71B8566E8DA33CD7361770C044349AC440CCCDC6BBE35E6C55782766F38E688BF47821037299E344ECDECA17AD5D15CD27A4F7B070661138EDE8ED72A8959C5AE36B1C46094A53CB21A7A42673F1401C2B259494090E2F53D7EE7063431EE5858002D850AF909C3783436010F7EA88625A36A0F0189FDE75B7E8C7E4B19D8527008328ADBC929BBC86E964CFC48B8CF1DA5D7ED3333AB55C15072832214A779A5FD10CC04005F46C1AA8884A161992472FD535B95ED18BDE1C6D8CE678D2817D69F90571103E8520E7313CE7B930C5EBFAF2F4EC758B626B5543A068CDE0FD0E94E6A64475B23268BF0380D075508F85128CA26F31A90C4A7D28440D54D4066B404588588B4CCF850B975C73AFE68CBCD102755F61EB3E60323C576E529EC0BF23BFA5BEA39CB73C37E8395D8DBD4C8DC8AB2F70A0BFC3A78C0D413F08D14D632BC0403B0383DBBB22BD9B113C89452AEAB11210097947FEAAA3C9F05D1D300C33A55E3FBC81259E862705C3A13B9EE35F6B23ED10F4EDEA9519FA91B7BCD0D501B5ED57D9049FAB91AA779C725FF8E9F78017EA7807FA254B7105E826D096C01ADAE2C5D138251A92A478A33373F4DE912B83B6FB4B0D0DE6BC1118BB2FCFB07BD227A5F7F991439A13DE1238180CDC55119E65C418584D807A926E4A9C0F70155EE196FB07656D9AA7982B8795DBAD43D1059CA7F580D3320C0438A5ED5A7032B2E959678410F11AD98BE8826A44262615645D759A862B2AC52D3B014A25E8473F1F1EA4CFA819930AB3A34D710DEEE70CA13E88FD71AA064E6CB4697DE0E463B1370A6A3BFE98FDFE7B5471FF8DF6A6879FBEF9AFB3519D780757D67440AC36E837BAC3833EEAA980BD82B7936436A0307D164B6438869AE606E980518E913D0EE302396EF4EB25D9866E4BAFA101E5992931361C4A982253D58ABE3BD57107635A46F09512085F4ADA08EC8B1B3910B0153B2AAFCAE5033EDD4153248DCD85B02C9A25D8BDC4068BB85741726297A25AEC55C44AA28059B71BB9F34067887ADE4C1CA4908B19B3D78123453876DB4DCEB42773069572CD8777E62CFBAF7203F020F281A6678F790720EAA20E34327D7A63688B09A01F4D7088F7B5059EDDEB45C0CE39321C79521D79A59ECDD468CED0EA82CA484928702F57D6FC18D347AF3ED22AAF45ABB0F20BAB9E01557607AE3ED9CF0E26D34D305449669EC6FC1BECEADCE183F7A594CEA196D059A1E550E547866CC087333F030E628F2CF1147925410ED0421DC7506138B1D19099C695E1AFDACE4153825B66A8ECF55A021D21EB9F848FE55C21769A755FA9807EF73A6C5BA15A06347D3F1C5C619A315598629106AC0B86AE0D8E55578292517258AE85F72E737AF5638D096B76A3C57F1B9C80E770A2D4EA4E42FE469AD421285241960A8A86355EF22F583FE3BACADF8DA31D5C2DE254161BC6D10F9841DD27ED462A6B94B6DEEA90CBAB687FB84B56395DA763AB4B7FE3095D572D77EFF3FF0D8F9D19AA5AF7B676053DBEF64E61DD0A41D402318E3308669106259BF7A4CE31B346A9E983EDABA05180149AB057F9972977DA7C6F46E0CDF86F3091F04FD4E83C6022E18CE4382B54D5DABA82E4DF1E53BF31FE4BB65A8524EDA83FD29D07E49747B75291CBC8F8EE1415EC921E19022ADE2C047E4DF3507289E9D79A8E6992B48B8864204A416B769CC787D6DF4407E93D121F7FBEE0E408963E0609A9C75CB3117CA583DF6E79F31C635BF0F1BE98DF550727A45D3CA337D79DE5DCDB0B91CABBC30D7EF0AE1CA1E94904F78C1FD8FBA87545FDC174AD8190F9B5ED7B5869494FFA91033FDC6117BF662EC5F2AF2634BA3F8C02210F1C9BCDDA9BB39760E00F25A7270C345666FB6DF85C919AA150CA7FC80FC0EACFE242EF55F4298063628E61056C966DB9964428D9CE99108271E29A12328E23999734E036F18A0EB8F030E88062C56717E7A36314E44ECF357FF56EEDF90D3FB11B22A1B25905B379FCCA5CA1ACB956E178AD3F51D535AD119813B1E70F7317651BC75CAC64276BB98110B54EA0EF34541D73910721D657387677E332E9C8811C3FC1B923B2EE9C512F6D09DF372A5F97FAD7123389CEE197B5C269E221D7EED3160A521E56FF8AAFAB686179D09D78FC387B3EA6A672034D24AC7999D196B2316475F37DB8E9ED431DF58341FA88003D3C6489E78053D8E44CE7E16AEF416859B3D2AECE09086A748B7BCFD10F73E3CF8B31F0CC44DA059C69ABA5BC8EFAD45D3F376AF3A0DE6E169878BD842E28798E4743F843844BCDF8506F136391EC8E721DC2B6282D9C50FAB653A6ABF28947420E8C22A9A487D76A938933B34E497DA95394176B2774C09EF0BB1ED8C3B131A21957B31A0B47CBFBFF0533CAF33125221DB6BA4A518864892CF21D3D4D58B599A37A08F344AA7EF98E7D7D9D3316A6B115D9B8F20F93BC6865734699EB54C888D7E5A0ACAFD1915352B294243712CFE82F85248B00045CF3D090C0C00D7CA0E3A1F147703FD94F717E49C81A7C3A76946E20A63F3B7C3EABA9225ABE0B34CB0CF235063967D16BC8A69C130CCE287615CC053114167EAC4E95BBABDFBBCF96BC0C0D65EA000AEAF490D723955BD1B4D69154D262F6A6D3534BB0BC397C29ECC6B1447B75C953AF441DE2E7133A7AC98988A7EF9E6EE63558AAADA0603BD529776F05558D2DF5641C412E7347440F65EB823AFC7CCAE6B97108B857287A0486DBBE689D770CA92471309E73AD390ABF56912B2B7C49242CEC157BDBBD493553735CB1D9B40AFC214DA153359C9DF576135901C2FDA58C0095B6FCE3FD0731DF34863AF2882D53773CE7C182473722AA79A6B37D3EDDDE38FA71DF8C0EDC081EFED8CE606E48299180EC6FE35FAB649910C48A6A29F9D0F85557E10BC5AE2ECF028AE399F55CD7976028935CC03C0CAFD5003C9EAED247FBE30A284CC4470A5525A6498E1DBBD3085C3F9D77C6064D0181BC5A829561560AA9A4EA8173D7937A9428109CB3A66B2B3DE11F88F55AB21EB49B77A39762CA9264E0156566765E2D3626B72B80BD1411E4EC53552828A24BC8CDC47F465FDDF4772C7BC02066854011287F739ABA6047596747F4234AE227DBFFABF0E13153E2E069F0B790251BE877FE5A198E808258639F5E79D3D5CD16F1A573724DD6A9F6990C4502334DC66F65493490673AB30DCA7C031F0C212C0D8BC9D0C874B319A97AD1CE9395D3D154203156C51CC3B9CB13D0BA1BDF618BC8EECA9DDD9412050CFA09235727AA50D46F79AD6F3C5A1BB6B284C8311DCF93756859704DF8FC3BB8D2F5E094E04502354942E9C852B208D4901834332EBC603270CB57ED418C34CE48AA",
  )
  let sk = hex_str_to_bytes(
    "1C0EE1111B08003F28E65E8B3BDEB037CF8F221DFCDAF5950EDB38D506D85BEF394D1695059DFF40AE256C5D5EDABFB69F5F40F37A588F50532CA408A8168AB185F684AEB401B9AAAF812A00E124FF56FEE51BA7C11282617F0572CC791DC81CC0A6711A966C11312AD9A821D8086542A600A4B42C1940720242628106210A43852331709308108B188C022492C1B28412C4218B042181C8610248059C9201C0348819326C582046891868A2C28D82346A1C094200A28CE3A6491C112CC24812E0902191985062C084622451CA062C64240E1BB3312496854B4606DB2668C38268441046C9B6211404811445502442084422710B92459AA0811A91709C241003957004C504C82692D29200C0B260C0A26809190AA2300E188969E0008DD84862DA14712018051907440412409B1240118010D142819928508B1091022464A0206D1246211C838C1B4769010690CC062481846920982C24120521B15041360298446ED1A63111056AD3A840CAA84C62B00003134A53344614194004C54CE306695AB08961168ECB10808B168ED990640B94602483851AB30454262251B8251C424A0B814842C4445A102023808409B7254CC64814854D19380E601651D8326A0A918908C170E0964D18468C01328D91C4054A0061230868A2104210A8611306218A248E620689C9B24508278451200D980466DC42054424852426282221612016090BA62C0A1144E0928158480D422210A006098B246E81288CC0248090308D8436404CA68450042494B68DA2926D18B344A00085E3B805140504A4C290842281C3262D0B2066CC903198382810166CC13445C0102224C688034632D840901C20680415289A188144988D9C206E9C302CC1B820614221080310A0C28C58128553204C0330814CA48D44C08D51404C1CA72C440865A03840DA20808106858C260DE2A88C9C4411594228C42604441426A1426408C0851101869B483199B20C80464459A88C0042089882900AB54562244812960544124600C88813A061E1284D0AB9914B962099B84400314E98128500B60183A00D14150E1881101901224A06681A498DE1A28411C63121262591A06D030524A1B6089444724334125BB42041B650D0888D0B074D1C94644C208E8B8808E0300944200549864D03134E19C9840937611A43684A80900204311C1742184080C8308EE1A241C33404A328225124718284011BC0642347728214665B3868E1C6299B904060388683A0408420044C940110258D82024D9AB26920151060462DC2142E0CA82C5416220346899206600807820B474448980909430EE4320A1AC065C0A42144B29158C604114520C4A42102A07021222623B2684B08400103918B34811A04040CB005C29269901468044649148349A2348919C72894447100C94958387202029042C64C0C173248C68C59283109B728CB480E9A22851CB911E3C630C34828CCB82803C808A4B604D0188C601872D0209282022E591889081932C9065260908C098029A4B48C8C348208421002000813015083B60841944D1B496C193911CB324102C0654888919B986108B50449B445D3300198046D5300894232608CB090648868D43245481471149805810022DB4469D9248911411209195092A084C034224A2410DAC809D2A80D2285218BC890C100665CC02599A4611AA4110A24285BC44813148963926120300C40022521882824018C10816D4C424901222DC1960C08489001C13023C189A1C464129709CC90916020661B964882A87191C065DBC20184360A09242952104EDB240A610210203825983460822430C41249C0A2050C088593280963B20523962042120DD1C01008C540C182651B1592A4145184042653425224236D9C284E5014058C208024266561444C021120C8C04C18A00D003870991612A11640C418450993884C8221CBB281212661D1A82441308408807100C620524292892412A42689E3B08821988C11962CE1962051C28120918094166E14946020C9459B2245A23820C0360860908D4106025B066EE1400A89346C1AB269A4161003330E1A422803196E1144840B244A1C166A19984003A28541C08CD222610C82105AB00D2114725A82800286100C27265C486EC9406C1B4904E4B849DB328A9C242C40388022A9451229A4E65ED31C793ECB5B89C55DC333A277BF5C4128A21401AFA8D428C821E97AEA05B3AD2923BD9710871CE8B3B11A711C9AACBA108CAF43A172D6599401DB89681D0B874EC357A5295C0A08D589C4539F9C59F33F06446441204984E1F9873C1F9775B97ED400C998B05162B6189861F28DAE36C2133765711176CAAF5A1DCB2A0E223A5F079B0741A5E6D510E58732DC0359D79A7741A3791CA6504F07CA8A2C031271184520EB76A00B9B4626DB37341C718065ED95FE4CB054BFE71E80260D21907B9BFAEC86AC83A48563C0B9B2EF4B9B4ECBCB2F1291984E89E84C55690647E26547D73E4CB7F0E06EFFC3C479E2568E7464EABF1D1C4EFE211112E62BEA8B855F50D71651329C00EF619F537E454B095A9DF6A8590E5BBAA15C9E64E701E37469749462A2119541E75549D056A25BBCEE11CD9FC672422AD2AE97913D30BE3CD85F58CFA904F443AC3A8DFDBC2CC9C8C39B244EE7E0D95BEC6927A2B0B94E973F9812244643146E19013B7FE17114A0F39F92286BE0F0EE396FB74C76C91004B827D218951C77BDB81590AEDFEA9E62BE0F22AFF55E36AB572DF13AB9F5EAFCBC34DF266FE160C6B635B0C3B63C892920185F112B96998B5B5BB973B39008B2F0434035D43BD2E49F2C174520D3A89854CD8250D6200A1EB51079224656D0B334CEE3430B87E1FF904D1034C2D8A7047B2D225633190410012C161C768C1FF8FC179A446864DF93E09D1E6C29487CAB044EF868D431B1763184ADCB39516DD1276BD841EC492A8451774EDA106E7321ED5A6225C35324C510663B9BEA05F1DBC8D5DB69A77ECE3E4265C5E81069864580B528CC2CBBFBDE625AF2C1C5CB06DD80585404964D21114B8B13CAFB6DBE1B428EBC8717CCD11BFB347260AA701BF22835B3F1062EAD36ACB96D7496F72AA5FF1A1304BC02E358E60B1C8230BF8FFAFD36E0F6B2E3D8582FD3A43811AC24D06008103542878CB5CE99F8920CC802DA4ED2183956834DA4C719550DB24795ACE09D88CA3043AFCCC9AB0F0306671FD1F250957CC62464C9EA5E444C6EB476D092465608FEB6B7D5398A029E1EEAE50DB5F9F99550A9668343EF2970F22531678E36713B81CB3633F1DDD46769826E4360DE19A56318D9EB59F97A9B3ED22BFD89501126295E89FC735C3619D77F6FB935C2FB46EDD0A4D2921777B0EFCD58BEDCEB9EA5666B18DFACF9BF76333C5EDAC72B04E657E4E0865E043A6468C5E69D5BCBE5842BF45BEE77915F0571D150D606A6F2AC373792908891BA85F45CB409D963E49B5B96978A1939160A8DB9D63C4EA0D6A7D09370AC1C24498D21A8D5B764A39A412E5B54BD1C964D244A4555645F1F9053F8BB33F6F75146807B4E9E07B23C9806FF7572469C094399BA9779B962B4C8A957F869911EB13F140224AC4EE76201C02F24C7EDC3A980899A30BAD2B12D5728F097176D0017F3473D2FBBD43CC23A501E81E381BE0179BF68CA50FD2355CA7B64F53E0C7D5BCA4E7BE69163E316FEBB49A9340F157BAC3B0BD84A3B027A2FE44EC266A8CE4A171B91828F454302AA9B664967E67DB38AA4E3BC353D1518A7FEC1188B7D5B7E19521F1A2877006989B0FE918946B7593ED15120BF7D23F99210DDB76DAF86E237B2379CA12E55636C83408E6D2B3585FABCBC0F6C48767E363AC847CCC67EB7C937BBD941100D78774AE1F44339DCDCB0E700AC108DAA92CD9EA19F8238F28676FEE7BD1B9F37A6CA17D7CF4042FE39DD9377826C4CAB2932E12DE53B081A6C25C0F47DA3D916831E4247D097811E1A0870CB61F4ACA127EAF85A9CA666FA6C36398F0E7420CA9895C63A1AC4DB49A1D75F56464C1E0CF9283A45445650F95FADF6C88DB3CE7C0E5D0E7261E804C03A419E4CC2501099CA536344607B07E825323AD30BE75F84E6C5BE238EC78617A0A23414C7F8CD60913031BC9301786D5C19D930B506C495983223EC1BF787C33D228A110E57428773E34F12663D11C155DFCE380D65764C2659EAA0A1A2E764EBB5A9E5A7192E9086A6DE4A38FCFD0412424260620C1E567A2D8B1AF3554819A00D5C7E5666D0E656F8D45C67C5448DAB5EB6E6029379C47A24D011F56E5FAA49FC6BB2D750ED4C95F835384F2FAAB13C1CCA71A1EBD2299E9632E529CE77149F5FAC31AB28DCC70670BBAB9F7B6FFEAABC7DC4513D8FAC4BCF7E5E7297DB69E4B62538F9CABD902B1007E3BAF67F943DFDC6AA7562FABB1E8FACF811C76335790A16F21ECB72FC1BA94276B209807EA52E74F2B6CA0B3FDC30501F6310EC9955B051818DAE1080FD4DD24C722D68DE33EA769B4E637007CFDCE1804AC2A771F88F59BACEDB4DFB79A41EA70F14ACCE6A5A8A8843B59589E4528BA85210421D1E595F84C2759047DB47222673868C0027EEFD996EF8C8C4F367A91DECF17943227D4D00447FFC6CC8665E08D293A4DE4EE11569B95BB4DAE758150E55783255E2F32227B45A9D2619771CED512D5CD89018C99E2F05233EF5860FECB3791B53AD2C228ABABB9FD1F50438E9B0C6EA61E20BB5AC0AAD30509FEA9A441D555CDD34509CFC6062E6B81DCACFD5F5C9C526B38D704C1F0F28B4FB7C1AC69AA196CF812E4446EF68028744D2A540FA7A69CF87A1F96824E4C6878235F0CCA3E97B2B22B093D95EE18DBFE6761DFAF834475186075602313EE2A299BCCCC6531EDA5410CCFA09ECB8A60D28337AA556586D784849380F02EBB837CB0BDE57BBA907B67C7AD866E1DDB1C79D961D70F55D059ACFD39F5BD30374B4845E04EC26E8B5B93FC4544F24AE99C9E51E435775D22080E19E3AC225C7E1EE0A56B952307F44BACF4C8785355C09DBD0D86057F0A6A988C36574202519DEBA045698D72427770C3731C9B7535FAAF0CCA9D13C4212B762945752E7A6539B47BEA966482318A9CFE3BAEC6A83FB34F0B68EE97797420FADC3F025EE9F18BEA38FBEC0C5DEAAC7A52F7EB8D94FE4C662541457A153824BE60D7DB833890F3AC3F7BD6D73F80C672B76A5267DF22CFB5E1B92B0CD68E9A9209243A42A30F7AA1F03D0D9113F04B76EB5AA69BC9B8FE798E77501B0563029F502F7794DD390747AED085C22B21611A9C76238EF6584AEFBB357F8362586C59FCA8E092610115F4DC2930D7224285EB8FD992F8217AE9470A74AE3E806010C8D021948BE57AB1D62C0412EA5C969D0566841F2E2568E013364D87CAF33229D2AA6C56B9FB4C136A13F5E733A91EFF21DCB290D8EC6DC0A50E57C1F65EB2BA1C39DDB1C095424E6F41F9E86567F911400D85C90D64FC7E6ECC28804F2704240249EFC8FEC69E366F3687A76205C0D1DD6483912A8F68EAE2CB3520A8B172CF2CD2B03802E5FA7B1F1EF8CA0A6080BF9DA3782D2BDE4B3A3C65CFB9F1B3905B9361D1E0C8FEB5AB40A3FFEB3AE95F57562A07CD24318C0E7EE6EBE570CB7DC1C621A849213E7139242758128C16CFE52F8E2EDA5BA2323156F853ABC61B139041A4B834037AA19DCEE7606AE84C1A74D0EEB6A4DABD5908DAE2C23A63876E7E9F8E90366A1FD89F2283D753009E056DD5AB953DB3D8F4830A4D09379395F21ED03B6CCD5D7F8F81F400B3E3BC696088D58177521110B6C8474F3E449D8EC7F466C2EB343659FF53397587BC6300DEEBDC2BE674B783090EACCB93B6AE94956A333E858376473CA67AF0543E599941EB4E8C6D95D479FEEE05E3E8BF5F0AACD3451C0ED481F526D38EB3B26A4FD98E11BAF67EDEAB2ECC7D397E968F8D103E80144A4CDB700C41A42834B07FD7E91F3C52409C6882CF415A42F71E21FE70017D62B1FE43A2A32D815E3F1A44E7267B1BBF552F38E889775ECD85C4BF4650222F330FAE4B61765525403FBDE0A18F973657CABEB05FE6B9729D3B3730AEFDF3C1896997A949B603C43FECC3EACCBF00C03765941800CE42FD0384E1C1C6117316CBA1A81A209033C5B53AE3B60BC1AFC6E7C95C5CB99C26A4C881F626A219A619BC35CF4EF0A3B6725349D2C13D89DE65D9F7A3551CCCFC5611DC9C8737B0EF0FADF865A65339F464CB065BA8FE4810646A3445B702F51D6A91349FD70A35649FD4DAEE61310A3CCA5ED3ABDBFF8355B5114835FDE73C9F52AC229B15E84D3F59DCB1302551EA4DD6F415D013911D65315C8E59B12204AAAF525754E96EC3CB13E1972621F9C86F5DE4ADAB980CF8369127C2B3E4EF1A82B7AC959AB45D97EEE7A14E4145B349B533DD92DD2C177C77ABA325DD75C77B31A6AB3AABE54A6CFA2DCA35E209935EF9D947A37E83597B94FCAF58A56D14A056912C22A54A6FF2FE825BAAD8ABF1DD87FB0FA1519A5B7B42F4BB2F757EFF7C12A2CD1B91FAEBF8086516DCDD55F6384188F53C6A781862FB5CC3CC61ADE2F1108D15163C38C4CA01BF7F2C81B8C79AD694A01617BC04F8470C2C771BEE29A666BE85142CB967EC569A4022A64FC5D95A55776AC732755B23929F25986D93C019BBBFB154C26BB47A2BA4B3297DCE447C561A1C49F7535A7A14C9830186AA0DDFA001AEA0D94C40AC8A8418E8D578D8421413FB7E820237EF3B5CBF6081C442C13B4985EE639E8F86DB2873BC2C9D3A9E517AD7031DA3CC92FC15F502FAD3FC5FDBBCD2C9550A89525F0067CC3EA22D8D5B61AFAA4B553AC303920F25D6D58F61F6356685E43509A0062F837BCB9A1A22CFF08108018D6D24BDC2B096D2E",
  )
  let msg = hex_str_to_bytes(
    "D81C4D8D734FCBFBEADE3D3F8A039FAA2A2C9957E835AD55B22E75BF57BB556AC8",
  )
  let sig = sign(msg, sk)
  let _sm = hex_str_to_bytes(
    "997020124F9448A8747BF383EC6032E986962153388D4E90889BB9613542A71712792B07F19100CCB745A96F550878C0E7B831086222F7E34643C8618A8D90BCC7035E5ADAA1CCCFCDAF8AB212F29D681A38FF25D595CFBF1A367F1796C145DF361035055C2EB1AE59E24B5661BCD68693F69B38C06016CD6389F7E49C0075C03B538FD7BA43B001C7F070C7639A4DC4F3BF0B1B2143C548925283B368FCFA7231FAA4B1AD0C7A3BB521217C1AA98CB40D01C8B1CFFD7B60D04C1F668B34056D55989D3F3A0C8D274FF23ECF9320882ECC5F6A28EB3EC5C161F68C10A296ED2C17CA2B234625B4458CE86D8A34BB07A5A5AA8926E48EE3D39396D65187B089F55FB7D62FC57F9132C5A401EAB5ED058E12D682F1272F3E72A2A67DE53707A2C71497CD37343548DF81B562AA17783D712E83C9E1699F66F42A95119BBC36E6C32B3C8BF16E7B1EEEBF1EEBCED2603281DF7F5FADF31C6B52441F351F2D9908F2CF931D37080D53227036747F76C1D53F66A4C3924666FFA49BDABD699489EB21AA26AAD27057E97A02F55259BF1EB5D90E22F98D031D23FC4D640FAEC8FC85D2451732AD827E546623CDDD516CAAE371D7DD0E4F1606ACE6CB8E35D818C103DB7C5E7463F50D5C3020F23AB2F49A622A4E998B2470B90A62C339246E6882A739BB0BDEED0127DBC2CA7947C59B8C1603AA9E3BD3DF60665020B10D73787B1320C95C6798C58C5C837AC99CCDC001506F48CFC97996B7622500455CEF0A7BC50A26FAB06F7ABB871CCDFAA9E479F17B3918D2A9E0BBF0AE7D52119C948D6DE663075CB3A232EC24A64C56B724919B9A3649B3E5175BC3162816DD68AD1839819563E2A986458D9CA14B15D3346DEC7E0607FE4844EB55D6457C0863C6B18086D25B1B0109910CC03978A4CA46EA0F40897429532B5F4FC3291578D8998AEF87BF0DC12B2DFC4B349F4026D36224CC8AD161D12E13E4F0D6945ADA6E7A149D687B0B71C39CC5A44451EF8A0292EF3296D6AA1232E9B99DBD4B65CCEFD5811800FB5A567FEEBDAA69CF077A78EABA8A52F27E95BB1E884C0143475C2F3CA424469DAACEC115C6D5585B10C02AB01020F92EFD1CE000D6EFEF9CF04A67379FD2E3AF8FBCB70479DB120695E5CAFB27E3E02AB8DD2D7F44666658F16525F47773C1FB6DF3A570D843300399138645EAE195D36A7FBB531DE8B38DAAD50339F969D33E66174212C63289A0253F88CC46D7F13566ADB866892570234D4B00C1F8998B04CB5D3E62248716606DF9BB547176721DFB95F5A63E3295A88988709378747076D3B3327058C915D9B2C0E4DF91C9FA015CDB61065A1DBD27C1906116BC16360129B07B9FC5E94EA4047F975A7F312FDE7910029516624C2D91E01F8AF6BC83A1E37F5F94E0BA80F9F142E64EBA2CBC256A55E2F525F5DE6F9C4BA996109F7C2FC144D6015D96895FAC5FAA6148428F8662B5461AF3B876A48D0F6EB00107DDE4EB5E96B18A67133D47DC19123D25EABAE1AAE5FAEE6FC6751422604E66619B728B978D0BAEA14F6F7CF13DE25BC8D19DE4637B05097454E9E6FEE4E24EA2AF463DBAEFBEAB2038BAAF54999ACD450676BF10C9CEE79EEB41493F4693EFA82076E70765A34847D14B853E0EF9A28BB438BBD271E8AE911C8C5CD6BB86E2E718920DB17E74598C30E2A1177C26B69AC8C0AF417C1F1B6AF52E9FB72AC9632B0B364CF0D54633EA808172A21DF19F6B5C83BD4A7E731488A0D2D3BD592D6B8731112B80F3B389E36EEA6D679131C2B8459CE5B83BAC40D615E54FCF68B1AF353EBCEB634825305D7AEEAAB53F09F90A9986EA13B05055D38537116FC601EB612BE58EF5B1D3F296CACE14FC4585A3DF32CA60C61DE55693D80F01CFE44081366C780DDDD4FCD2E03DEFCE7E6C32B98D2E0798FCED42A63076D6734488F8365B3755BEAC4EFF845183864453A463B3E4718C4163CB17BA09D9C434BD97ACDBF24F4679EFBFAE881ECD375B1133C7C4EAA784DCD27F0976A5A36124726BC2D2F4583A0797C466EEF1ABFD1F5A912B4E6F73C3242D0CE7857D881351883820FC50BE5ED83C65463B61BEC37A73F1C3AF739B0B800CCB74147A7CB83C7578443AA46B9C2AD52AEEB7C215BD0C3872D536779A1DF6BBD42F66463F558BCF18521AF651EFF8AD37B13F1D7F0EFD12FFA2990A48016261695DF6B195730AF691652F5C2D81139A7F2C1F3435E2C5CDD58E39AED0EF6B7B230B34B9C09207158250A3E269EFC01C21EAAD7917E79E0927BC626D9131943620273E17F3F40B3B81972E347195DFEFAC59FADBD254E8FF70384918E4545C79CBFA8983317AAB424EE4750A7795771BD17A2E26F2AF5087645E2D88ED6ADCFC13C6AFF678FA0AF4C2F5F5EC3E38E4B633C28AD3CC92A6C7276D0A5846CC3167F1C7C0BE8950E54B9A16E93C430C418146AA0A09A9F7D5F139E570F00A7795540DE886FDA8760E5F8F494C7747823FF3759016E40AABB29A0E0D782237DDB9ED3DD7F9DE04992D16D4C9A80997A6318578A94CAE2130C0FDB72E091FC7482A3AD86CAF5888CAC4C6BEE99CBFAF0E362302CECABFCBCBA6BCA993CA4885EB8CB963707D51B173F3E908AE31D7C7B307D8DFED2171E4B9F702A9857FB8DA8E332D14BE3251AD0302C75A8FEFF01E6A12D48D16C6A3BE50AB9749BA0345D0710ED0546C7E856404A19D05222FC9AB5A5223FFAEBF97209B5E9D231EB508693B235042438716E029553756028D2222EEDD58466F70DDB1D54606237A5731018C30E1F430E0B250FAA6571746D0ECC4A65350E5CFF3DF15C0514A723DE2B6BFD4A32CD374BB871B57B830D6C7E3BD02D7499AB3757C1FF8023566C8C91E54E700F233329987540775EAAF308F2942E8D970934E9CB9058ADA14741811A1E07A11393F7C7CAFEB0AA6E8CE34E81397B23EFCAD00DD47CE300F7B8250D59059A063DADAD60F4EF322B0A031A776F46C0F2287F6AE48BA11FB0B6A15F9A6B7A7E41DE599BB55ECD33F8CCB7CDA6CB02F33DF95321A98FB391F8B75CC6B0721D273E9B987C765B6AAF1F6118FA3129D4FA22D591BB19721112AC479633E5196DF112AA49147EA28BF6E6A91B7F57DA108E523C9068A3788CEF2F13C5A2015759F2A4F11DFA872ECD3D1209A09DBABCBBB3C6464F1A58DFD2CBB1304ACE495AC890C74E2BA6430B5A12ABF6C5B39E1CD0139CCA337860973C2898AD6A8B40B3742707583E3DA9A0C63A5736C0D235925FFDEA626D6AC72927D81174AAB80EAD9036CC4A8FDAB7DFCE9A732E703E96B731FFB945AEE9035D68C1188E39EEBD0DED51CD0DF3E346C21B03604CF4BA49023CCAA482C47D4C3DD315E0B741029ED4D9DC8D8202FF09D1DB849827370BDB3C98CA4804BA65401255C867FAA47C9B6B09BBD5D65E4DC20CED5CE9DA3208BA279486AD7BB7E869A9C8EC1EAEAD68151EEDA2FE83FC8265825B330F070FE8F1902E5A7F6E584E3FAB3D68912D933DEC3EEEAF59DF843614A9814E2E8BAC1F576D037A5CE07977C9705B2831699C99BF82E8D5D19AFBDFBCDDC94C44D49692B122232CE08673F15DE6BE5DD2D883228F9715A43F19C238668282DF7C8B12DEB1007C8A28080BDDA0CB866E108A904F9CC85A10F362C960E386BAFA8FB4AB44E43F02530BCA55C4374E72288B6B7EA33694AAA27D06D6ECA3BFC69A7E11D57769A4C30C8CD62540AD746DD5D23F6F726C2E98E000BDAAE453D74D192CE951E1D56AA06238148139C319D6C26BDE36EC9E9C876B9B343F2089B262A1AE0EFF16CE560391F9BDDD8AC5B64C0372E814275BE8A45F6370B6CB6D2F8F87C364FE2F7F5BBDF45960C32D6FF5BCF8AF16198C6B2DC0D15C01E76CABB1DAB0E4BC96F7B7B6E9C51C221F7F1CDFF68B370B6FD60CE8E3D2ABAEDC2557B1F425CA59280CD202E14685FED6DBE159D0657620DEA124E67877F93A7E5890F27FB7613F15A941B948D11F389ECD81CC1574394DA093E00B99AED319CBD89087C989E95995A052BE7EEAF35FE8F553ED9D59500696A1FD6006D5E35CCF1684E85C775B8CEAE48DD8A253B29D7D32491161ED0549A0D4324CC2C7E0656219B6F7152983CEC2BDC145B905AA20C46977534BE80943DC62B3FD3541F5AB641107A329997EC3CBDD185FEA543EE69A313C97FCD96CBD9525496A1F5F0A7A1391CB9DBED2E2000BF0228AD0DFD6E808481FE8A9F46975714A2011FD75178609B94D0ADA17EDC5A65E3D4AD1AA6C42773387B28F1D5403652FA034ED338B7C46ED47EB87789C5433A63C631C7BE85A265D8461758252E5B4242C9BA1627D657D5ACFFA912351DEE5EB8BB6ED9C09295F3AFFCD9F2FDF0A5CB999F4053963960B5AC8A23977A810AB007A24C00DAFC54E534312A70CE4EAD1E7C46B03AAED63D0868D605DBA64517BFB4227E2444123C0D42AD301E758E3931B0FB608DA8119E9BC2A3820B3D1F302AF177B056EEFC6AF3E3F579FF92F07947277AE75269FECED8B7547D42BB4D8206DAA2A6A9CD4C985AC1EF82A46D8BC37A1E71A2610D5EB44E97646E97F6557D4814A016B86BE56954D7CBBA4534813ECE8891B37B9F588BC341FD4EC0F8FBE3C417F3973FDC26AEE189F985937E0D50E7AF6E7614742662D1F13E868678C74B015F192C786D1043D97270E65FD1E1F1A9C00B1DB5C1F5E0F7E4713FBF1D153E5A5532CD18CEF1085AFC73BC46DB63870B61189FD858B961E69394498A716FF388221655E2D381112A8E404AC1562B956D22D29A96DC8F2895FAF690ABECEE2A8FDE3B06BB1707AF9DEB417E111B0714A3709BDB3412887FEB0126B2D8F3342E349B334D55368AB27681EF4C6C071581ABD136C014E4FE9F7C343E0C3006B053B331113689C55439F9DB09E98A32BAD4883BFF70AE5DF878047F687DE6911D3910A0EB38EC6D46130849ABC334AF5A45BCE69F7B72979B61E409084793AA9CD9249754874CC4BE5633877FAC537A4248E2D7B8D6512B58D258B91929CEF8A13502FFCC5C14511569AA48F899CF880F96B25123C857E0AB8712B9531E4F711AF339030BD5BD7AC5CB524702DD46516E47111EA8D208313F7ED2B09C22AD2B4177D7340EA44654C155E837574EDA7F73E8D24F6C30315656AEF71383685C243A332BD2DC465D215658FEE22D1B44DD7F2AFC75FDB52C51854AC6D255702883E1F21F79B1E0F3E10C8ACD93924343BB8D9F9CF7088EF71126812C16C495597FF9629C5943732B8ABA66CEBA2B1A0C32F199A6A22914710B3DD3BCCDB8EBF025E9E323D9F0421A4179BD2DCD7A6403540DD6F8441723F02FBD13B271763AF2EEF97468C1AD628D728A2BF618502F6A79296771944121683B613B35EA29CC6449559A5D438803506C56A28FCAB7E2EB8CE0505D14684734DA44F9EC324AF8236D65126D890C643AAA62B62C3753F75316696EAEBD4257B8A69B51B6EE2F9087EB3EF9F33236B12E29F12D55B86BF6DA60E9182B2CD4DE38DFF73922A28BF44E9E184D27E53342F9397094E6BE1B8579440150B66C42F20FCD3BE2F7DF6BFCA3252724C3E3A1A70CADCCF484E847AB6F97220546B5CA95822BEBDE91543C9A896398F8A92E5B9B7C8B4D81B8AB3795925C3DC607171BE4F4731DB87E511BFFD21E3DE91F88479A8B12EEB649864D101918B7BB621888D55A41B365B0ACD26DB1F1D1D93E117ABD6E8CF785792ABF0DE977ED6B47E8A2784369827DFE2EEE68511C294E2522E4757162C7B2F59B0464BC72764F79F8CDE89EF56E25F4292C505E3C0460F73012AC6BC6744EE3C780B30C7BB4BF3E25026915C74EEA805D065B58052700519BFEDBE027535C30D89921037A98BBF8C1590A9632B4C04B8FA3DEEFEC2FD4A62BF29A204008FBA0EDD705A0AAA4F890EEFEAD78B518A662843D53244011814201A84BBC3A39DB80A8E198C6A171E27558CC3DBAD43D22AF6C72BE6DB213E0751891CADFDE9C90F5E5747E2860A3F412EBC8F345F7297C6BC01D16598AE2C9CBFA00371DF9B1790EF951238A1990A47D911A46493CE43943AAF6433F4C04CA2687D2F37281C0490A68A8158092B5851CC56C10BA2DDCB4BCD5DCF7DD4CE05AD87AA9D711C242000BB6C6FB156CE6CEE0FED1CB1529DA173D372F1475D6A545141FA490B7332770E9FF3D0185047EAA55DC62487131EA65E322FF8FD2B03CF18F31A7531976AA9A9962FC33D187B0A18E569F67C08DCAE0B59E75B25F8FBE628CB104D7890880133D455D546716C3D9AC7F1C5A8D1B77B3CFF2330294CCF331170FA3A0EB28E735A796633E20B6B533751B47CFDF343DE219B238168D9FED4485183B760D893D9A01F89558C1426D87C67890812F5163FED1A0F03D3C1553D1DA24A513BFBB540226627689C68EA4B4D78D94E3E7EEF11E3140445C646776819DA5B9D2E5E60943626D797B86939CB0DFE2FC061C2568809E9FAEC2CDD51E507C8CCEE0EF0206484D5FCBF2000000000000060A101F2C373E459366ED7B3B623C411448B634446F1A3FAABDD163A6CC1E2BCAE4A98703CD8CEE441405892FBA051BE2A586A6950A5EF73A255E5F86B0D7212E0C51C3BC79BE4B88E76ED6F043FEF3204FAF044BFB1ED722D61EB5D0B74C66A257E8AC3A2206273C80D2EC2123A4DBB715D60118D99ED7322E38F1562F82379138DA3DDB8BAA7CE61AB729AFC3748C0134633CF45A9973C05C75D04E82F631845427626B5799DC07DDF830BA01E8BC6236BB6D03B37D949DBB29EEC7DFE60FBC17EA590956D251539792016E2A8B01E70476961BC9ADA43CDA682D0CAA4FCC58810BBA1A673EF8F6BC90BAEE701E8E4F7C04A346CA56C7B2862FF57756CE6CD1EE22D677BCDAA896EAE96F87870E032C18B6C6A0C1A191FAE2ED487CE55296CC4B6339EAC9E8A742BD0A44C3525CC750",
  )
  let _sign_bytes = dilithium_context.params_set.sign_bytes
  // println("sig length: \{sig.length()}")
  // println("sm length: \{sm.length()}")
  // print_bytes(sig)
  // print_bytes(sm[:sign_bytes].to_array())
  let result = verify(sig, msg, pk)
  match result {
    Ok(_) =>
      // println("signature verified")
      ()
    Err(SignError(e)) => {
      println(e)
      panic()
    }
  }
}