upstream: https://github.com/mirage/mirage-crypto
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add fuzz tests for SGP4, SDNV, PASE, JWT, X509, and Crypto

+8015 -6541
+492 -370
bench/speed.ml
··· 1 1 open Crypto 2 2 3 3 module Time = struct 4 - 5 4 let time ~n f a = 6 5 let t1 = Sys.time () in 7 - for _ = 1 to n do ignore (f a) done ; 6 + for _ = 1 to n do 7 + ignore (f a) 8 + done; 8 9 let t2 = Sys.time () in 9 - (t2 -. t1) 10 + t2 -. t1 10 11 11 12 let warmup () = 12 13 let x = ref 0 in 13 14 let rec go start = 14 15 if Sys.time () -. start < 1. then begin 15 - for i = 0 to 10000 do x := !x + i done ; 16 + for i = 0 to 10000 do 17 + x := !x + i 18 + done; 16 19 go start 17 - end in 20 + end 21 + in 18 22 go (Sys.time ()) 19 - 20 23 end 21 24 22 25 let burn_period = 2.0 23 - 24 - let sizes = [16; 64; 256; 1024; 8192] 26 + let sizes = [ 16; 64; 256; 1024; 8192 ] 25 27 (* let sizes = [16] *) 26 28 27 29 let burn f n = 28 30 let buf = Crypto_rng.generate n in 29 - let (t1, i1) = 31 + let t1, i1 = 30 32 let rec loop it = 31 33 let t = Time.time ~n:it f buf in 32 - if t > 0.2 then (t, it) else loop (it * 10) in 33 - loop 10 in 34 + if t > 0.2 then (t, it) else loop (it * 10) 35 + in 36 + loop 10 37 + in 34 38 let iters = int_of_float (float i1 *. burn_period /. t1) in 35 - let time = Time.time ~n:iters f buf in 39 + let time = Time.time ~n:iters f buf in 36 40 (iters, time, float (n * iters) /. time) 37 41 38 42 let mb = 1024. *. 1024. 39 43 40 44 let throughput title f = 41 - Printf.printf "\n* [%s]\n%!" title ; 42 - sizes |> List.iter @@ fun size -> 43 - Gc.full_major () ; 44 - let (iters, time, bw) = burn f size in 45 - Printf.printf " % 5d: %04f MB/s (%d iters in %.03f s)\n%!" 46 - size (bw /. mb) iters time 45 + Printf.printf "\n* [%s]\n%!" title; 46 + sizes 47 + |> List.iter @@ fun size -> 48 + Gc.full_major (); 49 + let iters, time, bw = burn f size in 50 + Printf.printf " % 5d: %04f MB/s (%d iters in %.03f s)\n%!" size 51 + (bw /. mb) iters time 47 52 48 53 let throughput_into ?(add = 0) title f = 49 - Printf.printf "\n* [%s]\n%!" title ; 50 - sizes |> List.iter @@ fun size -> 51 - Gc.full_major () ; 52 - let dst = Bytes.create (size + add) in 53 - let (iters, time, bw) = burn (f dst) size in 54 - Printf.printf " % 5d: %04f MB/s (%d iters in %.03f s)\n%!" 55 - size (bw /. mb) iters time 54 + Printf.printf "\n* [%s]\n%!" title; 55 + sizes 56 + |> List.iter @@ fun size -> 57 + Gc.full_major (); 58 + let dst = Bytes.create (size + add) in 59 + let iters, time, bw = burn (f dst) size in 60 + Printf.printf " % 5d: %04f MB/s (%d iters in %.03f s)\n%!" size 61 + (bw /. mb) iters time 56 62 57 63 let count_period = 10. 58 64 ··· 61 67 let i1 = 5 in 62 68 let t1 = Time.time ~n:i1 f n in 63 69 let iters = int_of_float (float i1 *. count_period /. t1) in 64 - let time = Time.time ~n:iters f n in 70 + let time = Time.time ~n:iters f n in 65 71 (iters, time) 66 72 67 73 let count title f to_str args = 68 - Printf.printf "\n* [%s]\n%!" title ; 69 - args |> List.iter @@ fun arg -> 70 - Gc.full_major () ; 71 - let iters, time = count f arg in 72 - Printf.printf " %s: %.03f ops per second (%d iters in %.03f)\n%!" 73 - (to_str arg) (float iters /. time) iters time 74 + Printf.printf "\n* [%s]\n%!" title; 75 + args 76 + |> List.iter @@ fun arg -> 77 + Gc.full_major (); 78 + let iters, time = count f arg in 79 + Printf.printf " %s: %.03f ops per second (%d iters in %.03f)\n%!" 80 + (to_str arg) 81 + (float iters /. time) 82 + iters time 74 83 75 84 let msg_str = String.make 100 '\xAA' 76 - 77 85 let msg_str_32 = String.sub msg_str 0 32 78 86 let msg_str_48 = String.sub msg_str 0 48 79 87 let msg_str_65 = String.sub msg_str 0 65 80 88 81 - module PSS = Crypto_pk.Rsa.PSS(Digestif.SHA256) 89 + module PSS = Crypto_pk.Rsa.PSS (Digestif.SHA256) 82 90 83 91 let rsa_1024 = 84 - let p = Z.of_string "10798561676627454710140432432014696449593673631094049392368450463276546091610832740190717321579865870896133380991892468262437092547408603618427685009427773" 85 - and q = Z.of_string "10400664760062606994038747844895625872750212488858602663971334563613232045185857177383833781411830934303117994128623611996670112272953487791473086751129863" 86 - and e = Z.of_string "65537" 87 - in 88 - match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false 92 + let p = 93 + Z.of_string 94 + "10798561676627454710140432432014696449593673631094049392368450463276546091610832740190717321579865870896133380991892468262437092547408603618427685009427773" 95 + and q = 96 + Z.of_string 97 + "10400664760062606994038747844895625872750212488858602663971334563613232045185857177383833781411830934303117994128623611996670112272953487791473086751129863" 98 + and e = Z.of_string "65537" in 99 + match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with 100 + | Ok r -> r 101 + | _ -> assert false 89 102 90 103 let enc_1024 = Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_1024) msg_str) 91 104 ··· 98 111 let pss_sig_1024 () = PSS.sign ~key:rsa_1024 (`Message msg_str) 99 112 100 113 let rsa_2048 = 101 - let p = Z.of_string "146881832325800831419400417618624202055588545997890787121932184528831630537012732415698782899346395306540669232648045731896347007978622067056705527305566180903122107927148832001099595387953189273726394573803912262323600581299712943797238366745329534148223987933536186022708693674753193534229263584177098260169" 102 - and q = Z.of_string "146461957885839900502732892013745315236120923895767594427579857452138451155393985820080680192640369593315439290134409437965406213465262989382655388410330601076036910359057156988645246773259111682038096388585157599977808854893528900530706460128823381760931962351810679571404043148961709991714582814015259432029" 103 - and e = Z.of_string "65537" 104 - in 105 - match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false 114 + let p = 115 + Z.of_string 116 + "146881832325800831419400417618624202055588545997890787121932184528831630537012732415698782899346395306540669232648045731896347007978622067056705527305566180903122107927148832001099595387953189273726394573803912262323600581299712943797238366745329534148223987933536186022708693674753193534229263584177098260169" 117 + and q = 118 + Z.of_string 119 + "146461957885839900502732892013745315236120923895767594427579857452138451155393985820080680192640369593315439290134409437965406213465262989382655388410330601076036910359057156988645246773259111682038096388585157599977808854893528900530706460128823381760931962351810679571404043148961709991714582814015259432029" 120 + and e = Z.of_string "65537" in 121 + match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with 122 + | Ok r -> r 123 + | _ -> assert false 106 124 107 125 let enc_2048 = Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_2048) msg_str) 108 126 ··· 115 133 let pss_sig_2048 () = PSS.sign ~key:rsa_2048 (`Message msg_str) 116 134 117 135 let rsa_4096 = 118 - let p = Z.of_string "30773596934476715066776070065844902670036493980016387964275170019397018472432997910667589359581914549510631424565206701540136804180560112829236103459317928059975099687383138310206374921731816027058152009810073337617754052401932141110921176212810704858018214605862299356217860547747262170495777126218319842708093667844701139914958775637423731967187071886349669479192453619522943080948061657926138418380417577129184420732857906610804965319661598089231703183044642635889126023201809407430354992888247464125783088294095728916671050049684448794153783082653555256735912037270303014887722063417225893745458164718800442738569" 119 - and q = Z.of_string "25905916162566396401205858643227945415345838368190515936191926936462899261314859092468495558719305083654714669527919862817831941531613073577910643681172802147392797914485263753968375221243705167910636382434485717071007054833155618588980128488599406663210791261135710551020276087851551652652612955553056226986980360600996201307035494196112173475664509878923172924086102889718336621725968169373963280305056864698229857913526607314633711315503607289470716733189135747457446349029256257187264165837635026903463931381823712962360342258652047970731347111703873301687821992467888598546386551115261010493902143134851640738743" 120 - and e = Z.of_string "65537" 121 - in 122 - match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with Ok r -> r | _ -> assert false 136 + let p = 137 + Z.of_string 138 + "30773596934476715066776070065844902670036493980016387964275170019397018472432997910667589359581914549510631424565206701540136804180560112829236103459317928059975099687383138310206374921731816027058152009810073337617754052401932141110921176212810704858018214605862299356217860547747262170495777126218319842708093667844701139914958775637423731967187071886349669479192453619522943080948061657926138418380417577129184420732857906610804965319661598089231703183044642635889126023201809407430354992888247464125783088294095728916671050049684448794153783082653555256735912037270303014887722063417225893745458164718800442738569" 139 + and q = 140 + Z.of_string 141 + "25905916162566396401205858643227945415345838368190515936191926936462899261314859092468495558719305083654714669527919862817831941531613073577910643681172802147392797914485263753968375221243705167910636382434485717071007054833155618588980128488599406663210791261135710551020276087851551652652612955553056226986980360600996201307035494196112173475664509878923172924086102889718336621725968169373963280305056864698229857913526607314633711315503607289470716733189135747457446349029256257187264165837635026903463931381823712962360342258652047970731347111703873301687821992467888598546386551115261010493902143134851640738743" 142 + and e = Z.of_string "65537" in 143 + match Crypto_pk.Rsa.priv_of_primes ~e ~p ~q with 144 + | Ok r -> r 145 + | _ -> assert false 123 146 124 147 let enc_4096 = Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv rsa_4096) msg_str) 125 148 ··· 132 155 let pss_sig_4096 () = PSS.sign ~key:rsa_4096 (`Message msg_str) 133 156 134 157 let dsa_1024 = 135 - let p = Z.of_string "115320471016337933377056549329182706825658339080795846324118938187917903660539570102468495091957028599543345588517799627361082806070282899880721557018345825086927289316756283826093243695405203187016738458545513419551779925532261196890562077023934735570005318513791942265699098088390517334916527653326493928799" 158 + let p = 159 + Z.of_string 160 + "115320471016337933377056549329182706825658339080795846324118938187917903660539570102468495091957028599543345588517799627361082806070282899880721557018345825086927289316756283826093243695405203187016738458545513419551779925532261196890562077023934735570005318513791942265699098088390517334916527653326493928799" 136 161 and q = Z.of_string "823267969559752761552104454322087597915195665001" 137 - and gg = Z.of_string "107937769619514611906619060647411205822947624664377868769814121409943849987480570028955037310439082345400300825969182219850876363034452830224901430080806055218560008392720388910894912162956691999057850754409178667408425482805161601110189024138168750376391340697351250728689008407981372513900837280131855895453" 162 + and gg = 163 + Z.of_string 164 + "107937769619514611906619060647411205822947624664377868769814121409943849987480570028955037310439082345400300825969182219850876363034452830224901430080806055218560008392720388910894912162956691999057850754409178667408425482805161601110189024138168750376391340697351250728689008407981372513900837280131855895453" 138 165 and x = Z.of_string "33269272469299670210735451373406214067383586377" 139 - and y = Z.of_string "43917635707590891841908570055721669604556135044554274942460553515946670787931699807386932177837523342760860376770220825997328312057886461226985675983491441562087492365801663397409369541614646669226917344513472367438132106373179011858311945451923744651780314133078253880297369792145807736223662521868826642853" 166 + and y = 167 + Z.of_string 168 + "43917635707590891841908570055721669604556135044554274942460553515946670787931699807386932177837523342760860376770220825997328312057886461226985675983491441562087492365801663397409369541614646669226917344513472367438132106373179011858311945451923744651780314133078253880297369792145807736223662521868826642853" 140 169 in 141 - match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false 170 + match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with 171 + | Ok p -> p 172 + | _ -> assert false 142 173 143 174 let dsa_sig_1024 () = Crypto_pk.Dsa.sign ~key:dsa_1024 msg_str 144 175 145 176 let dsa_2048 = 146 - let p = Z.of_string "27787495469795504213817302334103600594688179071059183073859876165757248559489321478170600304273914000462158587756787453177210321379060448141559798652196363556897576291878245650614903612762833777567911000834171168229784178643222849655095281437320492725855855778320111645629834980350492228611813830302209080760811887894272862901026864911346096471199762409562102789142939773632891860019140618313962854554152891445175391927591825205548689170996430765723064763763481336517107917261869303217480777161449935319930795628114622197586510378927239068257979584784079128534248603619156372913573809491691986354447396965646770535701" 147 - and q = Z.of_string "69694877308167037149745913456421442195328554169759046914164177549875778020469" 148 - and gg = Z.of_string "16749627588066214399529603991445197534749244283120164288067836662918885787186948571007751498897778360267876697044209030527058098259975959998878027668545429739993477399366554325353523024222400972678469229055566504457717513550553993631550406867067991877458269091177591866978827953084168571646688881904998325355571633065354963580984543158204292013550690051754036914978697535194466008409541982818422484127204033337933785318568157008881227465007133605041651516579370726984057624602011504585990465767875831799514375203088558577008613314886723862237337922917306616319550969129882699756566436846243489458865623046875627558535" 149 - and x = Z.of_string "52860861934156228997899838985740859941028688506510055821449681896336427977580" 150 - and y = Z.of_string "16697822339875604612001674517725789858937385326266245308648897963274039128000291572870559603618903431422492771498840266582664620626826186158140214481920146230768719356298465470274085841064126012204317638870338958089054809559680905413861272320951150917299685355736888023985398767858005440235842845908452598291689850063919053521400020402671375982259094019780813889586357332424647365679629398571364161673401249910198031061651183589601097975488702613291524957230624044246866866974886847601585171352897595544769649242723658395277456627024303041369757410970512818793143517329469213213147704583953410882515213978051041273924" 177 + let p = 178 + Z.of_string 179 + "27787495469795504213817302334103600594688179071059183073859876165757248559489321478170600304273914000462158587756787453177210321379060448141559798652196363556897576291878245650614903612762833777567911000834171168229784178643222849655095281437320492725855855778320111645629834980350492228611813830302209080760811887894272862901026864911346096471199762409562102789142939773632891860019140618313962854554152891445175391927591825205548689170996430765723064763763481336517107917261869303217480777161449935319930795628114622197586510378927239068257979584784079128534248603619156372913573809491691986354447396965646770535701" 180 + and q = 181 + Z.of_string 182 + "69694877308167037149745913456421442195328554169759046914164177549875778020469" 183 + and gg = 184 + Z.of_string 185 + "16749627588066214399529603991445197534749244283120164288067836662918885787186948571007751498897778360267876697044209030527058098259975959998878027668545429739993477399366554325353523024222400972678469229055566504457717513550553993631550406867067991877458269091177591866978827953084168571646688881904998325355571633065354963580984543158204292013550690051754036914978697535194466008409541982818422484127204033337933785318568157008881227465007133605041651516579370726984057624602011504585990465767875831799514375203088558577008613314886723862237337922917306616319550969129882699756566436846243489458865623046875627558535" 186 + and x = 187 + Z.of_string 188 + "52860861934156228997899838985740859941028688506510055821449681896336427977580" 189 + and y = 190 + Z.of_string 191 + "16697822339875604612001674517725789858937385326266245308648897963274039128000291572870559603618903431422492771498840266582664620626826186158140214481920146230768719356298465470274085841064126012204317638870338958089054809559680905413861272320951150917299685355736888023985398767858005440235842845908452598291689850063919053521400020402671375982259094019780813889586357332424647365679629398571364161673401249910198031061651183589601097975488702613291524957230624044246866866974886847601585171352897595544769649242723658395277456627024303041369757410970512818793143517329469213213147704583953410882515213978051041273924" 151 192 in 152 - match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false 193 + match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with 194 + | Ok p -> p 195 + | _ -> assert false 153 196 154 197 let dsa_sig_2048 () = Crypto_pk.Dsa.sign ~key:dsa_2048 msg_str 155 198 156 199 let dsa_3072 = 157 - let p = Z.of_string "4944862491052787177238323499959371418651354629231656321315236369672827559263545931134286049323485061071828187289578269594065783019111035804017538871324004047710342711620233110167493989997579634523303899794913823240058891327833786211541568251787338957336540247816021098378292806006955851897646808403078979142749428669072523191276645021175423303816467433407072660616741824124536840773744646488191896772232795413707995397140064396495425700133866462410490239713815308709711960470201906326732033816522202617817869465691798938486540955726912350768931476362143768721380759395525951947017232778140349423557015356082357043807910825817719748257213281893007933859227824276579765323175836008193865064772817200047353825332039369252224256435661514851653526942065285711420907389170574343434449883875510985495078384130667046036846831401643151166834922210257258578675547742596423035828159461629721005113634334227074529533688136165903014911127" 158 - and q = Z.of_string "72036757532428134359049138716615314032674441223147930984416116642785279309001" 159 - and gg = Z.of_string "988301665281495772390013694627509692333967846948672137624515090935924385717634154201978961497509784579332702743535206413508559565302483922898459454403718843912379531742192312937734625047119678718271184170003455506604118936761508195594240052138536667234693864514877750501896049675764191029147963148241546820518065141123555298022010467792468407477159110344370654433269478015817957411602389410658876373667769353995724289566719120654426746425129842353040271693696527020500630012804936844492302532860691617810440827122662134370347136275931360845416833023047973072799739252681873195380321841873819721774703093238289342578739869306714624065593724407718101053836638039267362740083113357679437895609399028133545708736803196232072972950098992845234240283344492163375862712470338417546036591824286944195749933069780384676421299008472374982388004050973085425949637720603596481254386896408204626665775305048865550117840561595366712598318" 160 - and x = Z.of_string "57079433780483458942713357293831115449694380253611914431677328021806898761674" 161 - and y = Z.of_string "2872172233173100601346399502391482510148300641600207189246652621232656647081281141886455256814187251102030580186748870087277263359506423691023579912476503628426574690699263443704236625550832436226673947182294798279064154375422081421444400893924415563728656687773617245084962617886701420982288621397340217078717788290878177343138178149109067141997920049624616209300715994802074480057682676445987819355778630849636079364539062466859717465892222793824712941403252645431023939220711618233660062829520555618350855085688062241702521140104357981881833598269736147371800258828202964600523335598361833482597511071900975835195171061421945579132277176597724513608746614358311884564512362186106480065540201711903122228315570389409204443391052987813355120223856839756971514334338065850104261467285471383663470187296456006848469765768400814476981451863643010333596484259098557995874127140419649424228480234701334240448168704764430867915060" 200 + let p = 201 + Z.of_string 202 + "4944862491052787177238323499959371418651354629231656321315236369672827559263545931134286049323485061071828187289578269594065783019111035804017538871324004047710342711620233110167493989997579634523303899794913823240058891327833786211541568251787338957336540247816021098378292806006955851897646808403078979142749428669072523191276645021175423303816467433407072660616741824124536840773744646488191896772232795413707995397140064396495425700133866462410490239713815308709711960470201906326732033816522202617817869465691798938486540955726912350768931476362143768721380759395525951947017232778140349423557015356082357043807910825817719748257213281893007933859227824276579765323175836008193865064772817200047353825332039369252224256435661514851653526942065285711420907389170574343434449883875510985495078384130667046036846831401643151166834922210257258578675547742596423035828159461629721005113634334227074529533688136165903014911127" 203 + and q = 204 + Z.of_string 205 + "72036757532428134359049138716615314032674441223147930984416116642785279309001" 206 + and gg = 207 + Z.of_string 208 + "988301665281495772390013694627509692333967846948672137624515090935924385717634154201978961497509784579332702743535206413508559565302483922898459454403718843912379531742192312937734625047119678718271184170003455506604118936761508195594240052138536667234693864514877750501896049675764191029147963148241546820518065141123555298022010467792468407477159110344370654433269478015817957411602389410658876373667769353995724289566719120654426746425129842353040271693696527020500630012804936844492302532860691617810440827122662134370347136275931360845416833023047973072799739252681873195380321841873819721774703093238289342578739869306714624065593724407718101053836638039267362740083113357679437895609399028133545708736803196232072972950098992845234240283344492163375862712470338417546036591824286944195749933069780384676421299008472374982388004050973085425949637720603596481254386896408204626665775305048865550117840561595366712598318" 209 + and x = 210 + Z.of_string 211 + "57079433780483458942713357293831115449694380253611914431677328021806898761674" 212 + and y = 213 + Z.of_string 214 + "2872172233173100601346399502391482510148300641600207189246652621232656647081281141886455256814187251102030580186748870087277263359506423691023579912476503628426574690699263443704236625550832436226673947182294798279064154375422081421444400893924415563728656687773617245084962617886701420982288621397340217078717788290878177343138178149109067141997920049624616209300715994802074480057682676445987819355778630849636079364539062466859717465892222793824712941403252645431023939220711618233660062829520555618350855085688062241702521140104357981881833598269736147371800258828202964600523335598361833482597511071900975835195171061421945579132277176597724513608746614358311884564512362186106480065540201711903122228315570389409204443391052987813355120223856839756971514334338065850104261467285471383663470187296456006848469765768400814476981451863643010333596484259098557995874127140419649424228480234701334240448168704764430867915060" 162 215 in 163 - match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with Ok p -> p | _ -> assert false 216 + match Crypto_pk.Dsa.priv ~fips:true ~p ~q ~gg ~x ~y () with 217 + | Ok p -> p 218 + | _ -> assert false 164 219 165 220 let dsa_sig_3072 () = Crypto_pk.Dsa.sign ~key:dsa_3072 msg_str 166 221 167 222 let dh_groups = 168 - ["oakley5 (1536)",Crypto_pk.Dh.Group.oakley_5; 169 - "oakley14 (2048)",Crypto_pk.Dh.Group.oakley_14; 170 - "ffdhe2048",Crypto_pk.Dh.Group.ffdhe2048; 171 - "ffdhe3072",Crypto_pk.Dh.Group.ffdhe3072; 172 - "ffdhe4096",Crypto_pk.Dh.Group.ffdhe4096; 173 - "ffdhe6144",Crypto_pk.Dh.Group.ffdhe6144] 223 + [ 224 + ("oakley5 (1536)", Crypto_pk.Dh.Group.oakley_5); 225 + ("oakley14 (2048)", Crypto_pk.Dh.Group.oakley_14); 226 + ("ffdhe2048", Crypto_pk.Dh.Group.ffdhe2048); 227 + ("ffdhe3072", Crypto_pk.Dh.Group.ffdhe3072); 228 + ("ffdhe4096", Crypto_pk.Dh.Group.ffdhe4096); 229 + ("ffdhe6144", Crypto_pk.Dh.Group.ffdhe6144); 230 + ] 174 231 175 232 let dh_secrets = 176 - List.map2 (fun (n, group) s -> 177 - (n, group), Crypto_pk.Dh.key_of_secret group ~s) 233 + List.map2 234 + (fun (n, group) s -> ((n, group), Crypto_pk.Dh.key_of_secret group ~s)) 178 235 dh_groups 179 - (List.map (fun s -> Z.of_string s |> Crypto_pk.Z_extra.to_octets_be) 236 + (List.map 237 + (fun s -> Z.of_string s |> Crypto_pk.Z_extra.to_octets_be) 180 238 [ 181 - "31271182055444024732867835946284871743952969208281694762833912267184" ; 182 - "27594341083884344999714422172371027333192426063917478556668524561591" ; 183 - "49745209598738800585479479877345156590922715411063492309021724116430" ; 184 - "54263413298355776701974737228250185414758929445654879795198916482466337662578919821" ; 185 - "38599161911587526396222063388324161227700603198435442693976375015855884010520671067171149524070089" ; 186 - "60057457975706301816395663645420233759377744187465730049174048360108513636349450241008234412972340882517684187851" ; 239 + "31271182055444024732867835946284871743952969208281694762833912267184"; 240 + "27594341083884344999714422172371027333192426063917478556668524561591"; 241 + "49745209598738800585479479877345156590922715411063492309021724116430"; 242 + "54263413298355776701974737228250185414758929445654879795198916482466337662578919821"; 243 + "38599161911587526396222063388324161227700603198435442693976375015855884010520671067171149524070089"; 244 + "60057457975706301816395663645420233759377744187465730049174048360108513636349450241008234412972340882517684187851"; 187 245 ]) 188 246 189 247 let ecdsa_p256 = ··· 208 266 let ecdsa_p521_sig () = Crypto_ec.P521.Dsa.sign ~key:ecdsa_p521 msg_str_65 209 267 210 268 let ed25519 = 211 - Result.get_ok (Crypto_ec.Ed25519.priv_of_octets 212 - "\x3e\x0a\xb6\x82\x17\x12\x75\xc5\x69\xfc\xe9\xca\x8b\xcc\xd2\xd2\x77\x14\x54\xa2\x30\x0c\x35\x29\xf7\xa4\xd8\x0b\x84\x38\x83\xbc") 269 + Result.get_ok 270 + (Crypto_ec.Ed25519.priv_of_octets 271 + "\x3e\x0a\xb6\x82\x17\x12\x75\xc5\x69\xfc\xe9\xca\x8b\xcc\xd2\xd2\x77\x14\x54\xa2\x30\x0c\x35\x29\xf7\xa4\xd8\x0b\x84\x38\x83\xbc") 213 272 214 273 let ed25519_sig () = Crypto_ec.Ed25519.sign ~key:ed25519 msg_str 215 274 216 - let ecdsas = [ 217 - ("P256", `P256 (ecdsa_p256, ecdsa_p256_sig ())); 218 - ("P384", `P384 (ecdsa_p384, ecdsa_p384_sig ())); 219 - ("P521", `P521 (ecdsa_p521, ecdsa_p521_sig ())); 220 - ("Ed25519", `Ed25519 (ed25519, ed25519_sig ())); 221 - ] 275 + let ecdsas = 276 + [ 277 + ("P256", `P256 (ecdsa_p256, ecdsa_p256_sig ())); 278 + ("P384", `P384 (ecdsa_p384, ecdsa_p384_sig ())); 279 + ("P521", `P521 (ecdsa_p521, ecdsa_p521_sig ())); 280 + ("Ed25519", `Ed25519 (ed25519, ed25519_sig ())); 281 + ] 222 282 223 283 let ecdh_shares = 224 284 [ 225 - ("P256", `P256 (Crypto_ec.P256.Dh.secret_of_octets "\x47\x0d\x57\x70\x6c\x77\x06\xb6\x8a\x3f\x42\x3a\xea\xf4\xff\x7f\xdd\x02\x49\x4a\x10\xd3\xe3\x81\xc3\xc1\x1f\x72\x76\x80\x2c\xdc" |> Result.get_ok |> fst, 226 - "\x04\x11\xb3\xfc\x82\x72\x1c\x26\x9a\x19\x90\x9a\x3b\x2f\xc2\x6d\x98\x95\x82\x6d\x0c\xfc\xbc\x1f\x76\x26\xe4\x88\xf0\x1f\x4c\xa6\xb5\xc5\xed\x76\xad\xee\x7a\xf8\x1b\xb2\x0b\x17\xcf\x23\x1c\xbf\x0c\x67\xdb\x02\x95\xd6\x8d\x1d\x92\xc2\xd2\xa5\xa8\x06\x38\xd7\x8d")); 227 - ("P384", `P384 (Crypto_ec.P384.Dh.secret_of_octets "\xee\x55\xe2\x9b\x61\x75\x2d\x5a\x3e\x52\x56\x56\xdb\x8b\xd8\xfe\x6f\x94\xfa\xb8\xaa\xcc\x9e\x92\xac\xff\x4c\x48\x12\xbf\x7a\x61\x87\xab\xa4\x6c\xc6\x0a\xb8\xf0\x8e\xfc\xf2\xd5\x74\x58\x4b\x74" |> Result.get_ok |> fst, 228 - "\x04\x04\x89\xcf\x24\xbc\x80\xbf\x89\xfd\xfe\x9c\x05\xec\xc3\x9f\x69\x16\xad\x45\x09\xd9\x39\x85\x97\x95\x0d\x3d\x24\xe8\x28\xf6\xbf\x56\xba\x4a\xd6\xd2\x1e\xd7\x86\x3b\xed\x68\xe4\x13\x36\x4b\xd4\xc7\xb1\xe9\x04\x7d\x36\x12\x4c\x69\x53\xbe\x7c\x61\x20\x9c\xb3\xfc\x56\x45\x2f\x73\x05\x29\x37\x83\xc7\xc0\xed\x92\x9d\x6c\x98\xc7\xbc\x97\xf6\x0a\x72\xed\x22\x69\xa8\xeb\x19\xbb\x7e\xe1\x31")); 229 - ("P521", `P521 (Crypto_ec.P521.Dh.secret_of_octets "\x00\xaa\x47\x0b\xa1\xcc\x84\x3b\xa3\x14\x82\x1e\x72\xde\x4c\xd2\x99\xae\xc1\xf2\x6e\x9d\x64\xa0\xd8\x7d\xb1\x8a\x3d\xa9\xf6\x5c\x45\xec\xfc\xc5\x61\x7f\xf0\xd7\x3b\x2e\x0e\x1c\xdf\xf8\x04\x8e\x01\xbe\x5e\x20\x14\x94\x12\xe7\xdb\xfa\xb7\xfe\xae\x24\x9b\x1b\xfa\x4d" |> Result.get_ok |> fst, 230 - "\x04\x00\x1d\x16\x29\xee\xb1\xc4\x25\xf9\x04\xd7\x55\x33\x00\x79\xd1\x3c\x77\xda\x92\x1e\x01\xcf\x50\xd7\x17\xe0\xd6\x85\x0a\x81\xa3\x90\x2b\xb9\x2a\x03\xfa\xea\xcb\xd6\x28\x9c\x15\x90\x68\x5a\x60\x44\xb5\xe9\x4d\xcf\xc4\x1d\xeb\x6a\x88\xdb\x62\xa8\x91\xb0\xb8\x93\xbb\x00\xe4\x2a\x66\xb2\xf0\x13\xbd\xd0\xd2\x7d\x8e\x07\xcb\x35\xfc\x3e\x2c\x2b\x22\xf9\x3e\xcf\xd5\xea\xb7\x88\x61\x97\xca\x07\x3c\x2c\x5e\x68\x31\xd6\x5e\x2d\x0b\x8a\xa4\x08\x43\x8e\x49\x54\x2f\x05\xf4\x1c\x57\x6d\xf7\x0e\x3c\xaf\x5b\xb8\x22\x7d\x48\x30\x94\xae\x58")); 231 - ("X25519", `X25519 (Crypto_ec.X25519.secret_of_octets "\x4c\x6d\xb7\xcf\x93\x5b\xcf\x84\x02\x61\x78\xd4\x0c\x95\x6a\xf0\x9d\x8e\x36\x32\x03\x49\x0d\x2c\x41\x62\x5a\xcb\x68\xb9\x31\xa4" |> Result.get_ok |> fst, 232 - "\xca\x19\x19\x3c\xf5\xc0\xb3\x8c\x61\xaa\x01\xc1\x72\xb2\xe9\x3d\x16\xf7\x50\xd0\x84\x62\x77\xad\x32\x2d\xe5\xe4\xfb\x33\x24\x29")); 285 + ( "P256", 286 + `P256 287 + ( Crypto_ec.P256.Dh.secret_of_octets 288 + "\x47\x0d\x57\x70\x6c\x77\x06\xb6\x8a\x3f\x42\x3a\xea\xf4\xff\x7f\xdd\x02\x49\x4a\x10\xd3\xe3\x81\xc3\xc1\x1f\x72\x76\x80\x2c\xdc" 289 + |> Result.get_ok |> fst, 290 + "\x04\x11\xb3\xfc\x82\x72\x1c\x26\x9a\x19\x90\x9a\x3b\x2f\xc2\x6d\x98\x95\x82\x6d\x0c\xfc\xbc\x1f\x76\x26\xe4\x88\xf0\x1f\x4c\xa6\xb5\xc5\xed\x76\xad\xee\x7a\xf8\x1b\xb2\x0b\x17\xcf\x23\x1c\xbf\x0c\x67\xdb\x02\x95\xd6\x8d\x1d\x92\xc2\xd2\xa5\xa8\x06\x38\xd7\x8d" 291 + ) ); 292 + ( "P384", 293 + `P384 294 + ( Crypto_ec.P384.Dh.secret_of_octets 295 + "\xee\x55\xe2\x9b\x61\x75\x2d\x5a\x3e\x52\x56\x56\xdb\x8b\xd8\xfe\x6f\x94\xfa\xb8\xaa\xcc\x9e\x92\xac\xff\x4c\x48\x12\xbf\x7a\x61\x87\xab\xa4\x6c\xc6\x0a\xb8\xf0\x8e\xfc\xf2\xd5\x74\x58\x4b\x74" 296 + |> Result.get_ok |> fst, 297 + "\x04\x04\x89\xcf\x24\xbc\x80\xbf\x89\xfd\xfe\x9c\x05\xec\xc3\x9f\x69\x16\xad\x45\x09\xd9\x39\x85\x97\x95\x0d\x3d\x24\xe8\x28\xf6\xbf\x56\xba\x4a\xd6\xd2\x1e\xd7\x86\x3b\xed\x68\xe4\x13\x36\x4b\xd4\xc7\xb1\xe9\x04\x7d\x36\x12\x4c\x69\x53\xbe\x7c\x61\x20\x9c\xb3\xfc\x56\x45\x2f\x73\x05\x29\x37\x83\xc7\xc0\xed\x92\x9d\x6c\x98\xc7\xbc\x97\xf6\x0a\x72\xed\x22\x69\xa8\xeb\x19\xbb\x7e\xe1\x31" 298 + ) ); 299 + ( "P521", 300 + `P521 301 + ( Crypto_ec.P521.Dh.secret_of_octets 302 + "\x00\xaa\x47\x0b\xa1\xcc\x84\x3b\xa3\x14\x82\x1e\x72\xde\x4c\xd2\x99\xae\xc1\xf2\x6e\x9d\x64\xa0\xd8\x7d\xb1\x8a\x3d\xa9\xf6\x5c\x45\xec\xfc\xc5\x61\x7f\xf0\xd7\x3b\x2e\x0e\x1c\xdf\xf8\x04\x8e\x01\xbe\x5e\x20\x14\x94\x12\xe7\xdb\xfa\xb7\xfe\xae\x24\x9b\x1b\xfa\x4d" 303 + |> Result.get_ok |> fst, 304 + "\x04\x00\x1d\x16\x29\xee\xb1\xc4\x25\xf9\x04\xd7\x55\x33\x00\x79\xd1\x3c\x77\xda\x92\x1e\x01\xcf\x50\xd7\x17\xe0\xd6\x85\x0a\x81\xa3\x90\x2b\xb9\x2a\x03\xfa\xea\xcb\xd6\x28\x9c\x15\x90\x68\x5a\x60\x44\xb5\xe9\x4d\xcf\xc4\x1d\xeb\x6a\x88\xdb\x62\xa8\x91\xb0\xb8\x93\xbb\x00\xe4\x2a\x66\xb2\xf0\x13\xbd\xd0\xd2\x7d\x8e\x07\xcb\x35\xfc\x3e\x2c\x2b\x22\xf9\x3e\xcf\xd5\xea\xb7\x88\x61\x97\xca\x07\x3c\x2c\x5e\x68\x31\xd6\x5e\x2d\x0b\x8a\xa4\x08\x43\x8e\x49\x54\x2f\x05\xf4\x1c\x57\x6d\xf7\x0e\x3c\xaf\x5b\xb8\x22\x7d\x48\x30\x94\xae\x58" 305 + ) ); 306 + ( "X25519", 307 + `X25519 308 + ( Crypto_ec.X25519.secret_of_octets 309 + "\x4c\x6d\xb7\xcf\x93\x5b\xcf\x84\x02\x61\x78\xd4\x0c\x95\x6a\xf0\x9d\x8e\x36\x32\x03\x49\x0d\x2c\x41\x62\x5a\xcb\x68\xb9\x31\xa4" 310 + |> Result.get_ok |> fst, 311 + "\xca\x19\x19\x3c\xf5\xc0\xb3\x8c\x61\xaa\x01\xc1\x72\xb2\xe9\x3d\x16\xf7\x50\xd0\x84\x62\x77\xad\x32\x2d\xe5\xe4\xfb\x33\x24\x29" 312 + ) ); 233 313 ] 234 314 235 315 let bm name f = (name, fun () -> f name) 236 316 237 - let benchmarks = [ 238 - 239 - bm "rsa-generate" (fun name -> 240 - count name (fun bits -> Crypto_pk.Rsa.generate ~bits ()) 241 - string_of_int [1024;2048;4096]) ; 242 - 243 - bm "rsa-encrypt" (fun name -> 244 - count name (fun key -> Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv key) msg_str)) 245 - (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 246 - [rsa_1024;rsa_2048;rsa_4096]) ; 247 - 248 - bm "rsa-decrypt" (fun name -> 249 - count name (fun (key, msg) -> Crypto_pk.Rsa.(decrypt ~key msg)) 250 - (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 251 - [rsa_1024,enc_1024 ; rsa_2048,enc_2048 ; rsa_4096,enc_4096]) ; 252 - 253 - bm "rsa-pkcs1-encrypt" (fun name -> 254 - count name (fun key -> Crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg_str)) 255 - (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 256 - [rsa_1024;rsa_2048;rsa_4096]) ; 257 - 258 - bm "rsa-pkcs1-decrypt" (fun name -> 259 - count name (fun (key, msg) -> Crypto_pk.Rsa.(PKCS1.decrypt ~key msg)) 260 - (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 261 - [rsa_1024,pkcs1_enc_1024 () ; rsa_2048,pkcs1_enc_2048 () ; rsa_4096,pkcs1_enc_4096 ()]) ; 262 - 263 - bm "rsa-pkcs1-sign" (fun name -> 264 - count name (fun key -> Crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key (`Message msg_str)) 265 - (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 266 - [rsa_1024;rsa_2048;rsa_4096]) ; 267 - 268 - bm "rsa-pkcs1-verify" (fun name -> 269 - count name (fun (key, signature) -> 270 - Crypto_pk.Rsa.(PKCS1.verify ~hashp:(fun _ -> true) ~key:(pub_of_priv key) ~signature (`Message msg_str))) 271 - (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 272 - [rsa_1024,pkcs1_sig_1024 () ; rsa_2048,pkcs1_sig_2048 () ; rsa_4096,pkcs1_sig_4096 ()]) ; 273 - 274 - bm "rsa-pss-sign" (fun name -> 275 - count name (fun key -> PSS.sign ~key (`Message msg_str)) 276 - (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 277 - [rsa_1024;rsa_2048;rsa_4096]) ; 278 - 279 - bm "rsa-pss-verify" (fun name -> 280 - count name (fun (key, signature) -> 281 - PSS.verify ~key:(Crypto_pk.Rsa.pub_of_priv key) ~signature (`Message msg_str)) 282 - (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 283 - [rsa_1024,pss_sig_1024 () ; rsa_2048,pss_sig_2048 () ; rsa_4096,pss_sig_4096 ()]) ; 284 - 285 - bm "dsa-generate" (fun name -> 286 - count name (fun ks -> Crypto_pk.Dsa.generate ks) 287 - (function `Fips1024 -> "1024" | `Fips2048 -> "2048" | `Fips3072 -> "3072" | `Exactly (l, _) -> string_of_int l) 288 - [`Fips1024;`Fips2048;`Fips3072]); 289 - 290 - bm "dsa-sign" (fun name -> 291 - count name (fun key -> Crypto_pk.Dsa.sign ~key msg_str) 292 - (fun k -> string_of_int (Z.numbits k.p)) 293 - [dsa_1024;dsa_2048;dsa_3072]); 294 - 295 - bm "dsa-verify" (fun name -> 296 - count name (fun (key, signature) -> 297 - Crypto_pk.Dsa.(verify ~key:(pub_of_priv key) signature msg_str)) 298 - (fun (k, _) -> string_of_int (Z.numbits k.p)) 299 - [dsa_1024,dsa_sig_1024 () ; dsa_2048,dsa_sig_2048 () ; dsa_3072,dsa_sig_3072 ()]); 300 - 301 - bm "ecdsa-generate" (fun name -> 302 - let open Crypto_ec in 303 - count name 304 - (fun (_, x) -> match x with 305 - | `P256 _ -> P256.Dsa.generate () |> ignore 306 - | `P384 _ -> P384.Dsa.generate () |> ignore 307 - | `P521 _ -> P521.Dsa.generate () |> ignore 308 - | `Ed25519 _ -> Ed25519.generate () |> ignore 309 - ) 310 - fst ecdsas); 311 - 312 - bm "ecdsa-sign" (fun name -> 313 - let open Crypto_ec in 314 - count name (fun (_, x) -> match x with 315 - | `P256 (key, _) -> P256.Dsa.sign ~key msg_str_32 316 - | `P384 (key, _) -> P384.Dsa.sign ~key msg_str_48 317 - | `P521 (key, _) -> P521.Dsa.sign ~key msg_str_65 318 - | `Ed25519 (key, _) -> Ed25519.sign ~key msg_str, "" 319 - ) 320 - fst ecdsas); 321 - 322 - bm "ecdsa-verify" (fun name -> 323 - let open Crypto_ec in 324 - count name (fun (_, x) -> match x with 325 - | `P256 (key, signature) -> P256.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_32) 326 - | `P384 (key, signature) -> P384.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_48) 327 - | `P521 (key, signature) -> P521.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_65) 328 - | `Ed25519 (key, signature) -> Ed25519.(verify ~key:(pub_of_priv key) signature ~msg:msg_str) 329 - ) fst ecdsas); 330 - 331 - bm "dh-secret" (fun name -> 332 - count name (fun (_, group) -> Crypto_pk.Dh.gen_key group) 333 - fst dh_groups); 334 - 335 - bm "dh-share" (fun name -> 336 - count name (fun (_, (sec, share)) -> 337 - Crypto_pk.Dh.shared sec share) 338 - (fun ((g, _), _) -> g) dh_secrets); 339 - 340 - bm "ecdh-secret" (fun name -> 341 - let open Crypto_ec in 342 - count name (fun (_, x) -> match x with 343 - | `P256 _ -> P256.Dh.gen_key () |> ignore 344 - | `P384 _ -> P384.Dh.gen_key () |> ignore 345 - | `P521 _ -> P521.Dh.gen_key () |> ignore 346 - | `X25519 _ -> X25519.gen_key () |> ignore) 347 - fst ecdh_shares); 348 - 349 - bm "ecdh-share" (fun name -> 350 - let open Crypto_ec in 351 - count name (fun (_, x) -> match x with 352 - | `P256 (sec, share) -> P256.Dh.key_exchange sec share |> Result.get_ok |> ignore 353 - | `P384 (sec, share) -> P384.Dh.key_exchange sec share |> Result.get_ok |> ignore 354 - | `P521 (sec, share) -> P521.Dh.key_exchange sec share |> Result.get_ok |> ignore 355 - | `X25519 (sec, share) -> X25519.key_exchange sec share |> Result.get_ok |> ignore) 356 - fst ecdh_shares); 357 - 358 - bm "chacha20-poly1305" (fun name -> 359 - let key = Chacha20.of_secret (Crypto_rng.generate 32) 360 - and nonce = Crypto_rng.generate 8 in 361 - throughput_into ~add:Chacha20.tag_size name 362 - (fun dst cs -> Chacha20.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))) ; 363 - 364 - bm "chacha20-poly1305-unsafe" (fun name -> 365 - let key = Chacha20.of_secret (Crypto_rng.generate 32) 366 - and nonce = Crypto_rng.generate 8 in 367 - throughput_into ~add:Chacha20.tag_size name 368 - (fun dst cs -> Chacha20.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))) ; 369 - 370 - bm "aes-128-ecb" (fun name -> 371 - let key = AES.ECB.of_secret (Crypto_rng.generate 16) in 372 - throughput_into name 373 - (fun dst cs -> AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 374 - 375 - bm "aes-192-ecb" (fun name -> 376 - let key = AES.ECB.of_secret (Crypto_rng.generate 24) in 377 - throughput_into name (fun dst cs -> AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 378 - 379 - bm "aes-192-ecb-unsafe" (fun name -> 380 - let key = AES.ECB.of_secret (Crypto_rng.generate 24) in 381 - throughput_into name (fun dst cs -> AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 382 - 383 - bm "aes-256-ecb" (fun name -> 384 - let key = AES.ECB.of_secret (Crypto_rng.generate 32) in 385 - throughput_into name (fun dst cs -> AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 386 - 387 - bm "aes-256-ecb-unsafe" (fun name -> 388 - let key = AES.ECB.of_secret (Crypto_rng.generate 32) in 389 - throughput_into name (fun dst cs -> AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 390 - 391 - bm "aes-128-ecb-unsafe" (fun name -> 392 - let key = AES.ECB.of_secret (Crypto_rng.generate 16) in 393 - throughput_into name 394 - (fun dst cs -> AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 395 - 396 - bm "aes-128-cbc-e" (fun name -> 397 - let key = AES.CBC.of_secret (Crypto_rng.generate 16) 398 - and iv = Crypto_rng.generate 16 in 399 - throughput_into name 400 - (fun dst cs -> AES.CBC.encrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 401 - 402 - bm "aes-128-cbc-e-unsafe" (fun name -> 403 - let key = AES.CBC.of_secret (Crypto_rng.generate 16) 404 - and iv = Crypto_rng.generate 16 in 405 - throughput_into name 406 - (fun dst cs -> AES.CBC.unsafe_encrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 407 - 408 - bm "aes-128-cbc-e-unsafe-inplace" (fun name -> 409 - let key = AES.CBC.of_secret (Crypto_rng.generate 16) 410 - and iv = Crypto_rng.generate 16 in 411 - throughput name 412 - (fun cs -> 413 - let b = Bytes.unsafe_of_string cs in 414 - AES.CBC.unsafe_encrypt_into_inplace ~key ~iv b ~dst_off:0 (String.length cs))) ; 415 - 416 - bm "aes-128-cbc-d" (fun name -> 417 - let key = AES.CBC.of_secret (Crypto_rng.generate 16) 418 - and iv = Crypto_rng.generate 16 in 419 - throughput_into name 420 - (fun dst cs -> AES.CBC.decrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 421 - 422 - bm "aes-128-cbc-d-unsafe" (fun name -> 423 - let key = AES.CBC.of_secret (Crypto_rng.generate 16) 424 - and iv = Crypto_rng.generate 16 in 425 - throughput_into name 426 - (fun dst cs -> AES.CBC.unsafe_decrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 427 - 428 - bm "aes-128-ctr" (fun name -> 429 - let key = Crypto_rng.generate 16 |> AES.CTR.of_secret 430 - and ctr = Crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in 431 - throughput_into name (fun dst cs -> AES.CTR.encrypt_into ~key ~ctr cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 432 - 433 - bm "aes-128-ctr-unsafe" (fun name -> 434 - let key = Crypto_rng.generate 16 |> AES.CTR.of_secret 435 - and ctr = Crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in 436 - throughput_into name (fun dst cs -> AES.CTR.unsafe_encrypt_into ~key ~ctr cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 437 - 438 - bm "aes-128-gcm" (fun name -> 439 - let key = AES.GCM.of_secret (Crypto_rng.generate 16) 440 - and nonce = Crypto_rng.generate 12 in 441 - throughput_into ~add:AES.GCM.tag_size name 442 - (fun dst cs -> AES.GCM.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 443 - 444 - bm "aes-128-gcm-unsafe" (fun name -> 445 - let key = AES.GCM.of_secret (Crypto_rng.generate 16) 446 - and nonce = Crypto_rng.generate 12 in 447 - throughput_into ~add:AES.GCM.tag_size name 448 - (fun dst cs -> AES.GCM.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 449 - 450 - bm "aes-128-ghash" (fun name -> 451 - let key = AES.GCM.of_secret (Crypto_rng.generate 16) 452 - and nonce = Crypto_rng.generate 12 in 453 - throughput_into ~add:AES.GCM.tag_size name 454 - (fun dst cs -> AES.GCM.authenticate_encrypt_into ~key ~nonce ~adata:cs "" ~src_off:0 dst ~dst_off:0 ~tag_off:0 0)); 455 - 456 - bm "aes-128-ghash-unsafe" (fun name -> 457 - let key = AES.GCM.of_secret (Crypto_rng.generate 16) 458 - and nonce = Crypto_rng.generate 12 in 459 - throughput_into ~add:AES.GCM.tag_size name 460 - (fun dst cs -> AES.GCM.unsafe_authenticate_encrypt_into ~key ~nonce ~adata:cs "" ~src_off:0 dst ~dst_off:0 ~tag_off:0 0)); 461 - 462 - bm "aes-128-ccm" (fun name -> 463 - let key = AES.CCM16.of_secret (Crypto_rng.generate 16) 464 - and nonce = Crypto_rng.generate 10 in 465 - throughput_into ~add:AES.CCM16.tag_size name 466 - (fun dst cs -> AES.CCM16.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 467 - 468 - bm "aes-128-ccm-unsafe" (fun name -> 469 - let key = AES.CCM16.of_secret (Crypto_rng.generate 16) 470 - and nonce = Crypto_rng.generate 10 in 471 - throughput_into ~add:AES.CCM16.tag_size name 472 - (fun dst cs -> AES.CCM16.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 473 - 474 - bm "d3des-ecb" (fun name -> 475 - let key = DES.ECB.of_secret (Crypto_rng.generate 24) in 476 - throughput_into name (fun dst cs -> DES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 477 - 478 - bm "d3des-ecb-unsafe" (fun name -> 479 - let key = DES.ECB.of_secret (Crypto_rng.generate 24) in 480 - throughput_into name (fun dst cs -> DES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 (String.length cs))) ; 481 - 482 - bm "fortuna" (fun name -> 483 - begin[@alert "-deprecated"] 484 - Crypto_rng_unix.initialize (module Crypto_rng.Fortuna); 485 - throughput name (fun buf -> 486 - let buf = Bytes.unsafe_of_string buf in 487 - Crypto_rng.generate_into buf ~off:0 (Bytes.length buf)) 488 - end); 489 - 490 - bm "getentropy" (fun name -> 491 - Crypto_rng_unix.use_getentropy (); 492 - throughput name (fun buf -> 493 - let buf = Bytes.unsafe_of_string buf in 494 - Crypto_rng.generate_into buf ~off:0 (Bytes.length buf))) ; 495 - 496 - bm "urandom" (fun name -> 497 - Crypto_rng_unix.use_dev_urandom (); 498 - throughput name (fun buf -> 499 - let buf = Bytes.unsafe_of_string buf in 500 - Crypto_rng.generate_into buf ~off:0 (Bytes.length buf))) ; 501 - ] 317 + let benchmarks = 318 + [ 319 + bm "rsa-generate" (fun name -> 320 + count name 321 + (fun bits -> Crypto_pk.Rsa.generate ~bits ()) 322 + string_of_int [ 1024; 2048; 4096 ]); 323 + bm "rsa-encrypt" (fun name -> 324 + count name 325 + (fun key -> Crypto_pk.Rsa.(encrypt ~key:(pub_of_priv key) msg_str)) 326 + (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 327 + [ rsa_1024; rsa_2048; rsa_4096 ]); 328 + bm "rsa-decrypt" (fun name -> 329 + count name 330 + (fun (key, msg) -> Crypto_pk.Rsa.(decrypt ~key msg)) 331 + (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 332 + [ (rsa_1024, enc_1024); (rsa_2048, enc_2048); (rsa_4096, enc_4096) ]); 333 + bm "rsa-pkcs1-encrypt" (fun name -> 334 + count name 335 + (fun key -> 336 + Crypto_pk.Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg_str)) 337 + (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 338 + [ rsa_1024; rsa_2048; rsa_4096 ]); 339 + bm "rsa-pkcs1-decrypt" (fun name -> 340 + count name 341 + (fun (key, msg) -> Crypto_pk.Rsa.(PKCS1.decrypt ~key msg)) 342 + (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 343 + [ 344 + (rsa_1024, pkcs1_enc_1024 ()); 345 + (rsa_2048, pkcs1_enc_2048 ()); 346 + (rsa_4096, pkcs1_enc_4096 ()); 347 + ]); 348 + bm "rsa-pkcs1-sign" (fun name -> 349 + count name 350 + (fun key -> 351 + Crypto_pk.Rsa.PKCS1.sign ~hash:`SHA256 ~key (`Message msg_str)) 352 + (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 353 + [ rsa_1024; rsa_2048; rsa_4096 ]); 354 + bm "rsa-pkcs1-verify" (fun name -> 355 + count name 356 + (fun (key, signature) -> 357 + Crypto_pk.Rsa.( 358 + PKCS1.verify 359 + ~hashp:(fun _ -> true) 360 + ~key:(pub_of_priv key) ~signature (`Message msg_str))) 361 + (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 362 + [ 363 + (rsa_1024, pkcs1_sig_1024 ()); 364 + (rsa_2048, pkcs1_sig_2048 ()); 365 + (rsa_4096, pkcs1_sig_4096 ()); 366 + ]); 367 + bm "rsa-pss-sign" (fun name -> 368 + count name 369 + (fun key -> PSS.sign ~key (`Message msg_str)) 370 + (fun k -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 371 + [ rsa_1024; rsa_2048; rsa_4096 ]); 372 + bm "rsa-pss-verify" (fun name -> 373 + count name 374 + (fun (key, signature) -> 375 + PSS.verify 376 + ~key:(Crypto_pk.Rsa.pub_of_priv key) 377 + ~signature (`Message msg_str)) 378 + (fun (k, _) -> string_of_int (Crypto_pk.Rsa.priv_bits k)) 379 + [ 380 + (rsa_1024, pss_sig_1024 ()); 381 + (rsa_2048, pss_sig_2048 ()); 382 + (rsa_4096, pss_sig_4096 ()); 383 + ]); 384 + bm "dsa-generate" (fun name -> 385 + count name 386 + (fun ks -> Crypto_pk.Dsa.generate ks) 387 + (function 388 + | `Fips1024 -> "1024" 389 + | `Fips2048 -> "2048" 390 + | `Fips3072 -> "3072" 391 + | `Exactly (l, _) -> string_of_int l) 392 + [ `Fips1024; `Fips2048; `Fips3072 ]); 393 + bm "dsa-sign" (fun name -> 394 + count name 395 + (fun key -> Crypto_pk.Dsa.sign ~key msg_str) 396 + (fun k -> string_of_int (Z.numbits k.p)) 397 + [ dsa_1024; dsa_2048; dsa_3072 ]); 398 + bm "dsa-verify" (fun name -> 399 + count name 400 + (fun (key, signature) -> 401 + Crypto_pk.Dsa.(verify ~key:(pub_of_priv key) signature msg_str)) 402 + (fun (k, _) -> string_of_int (Z.numbits k.p)) 403 + [ 404 + (dsa_1024, dsa_sig_1024 ()); 405 + (dsa_2048, dsa_sig_2048 ()); 406 + (dsa_3072, dsa_sig_3072 ()); 407 + ]); 408 + bm "ecdsa-generate" (fun name -> 409 + let open Crypto_ec in 410 + count name 411 + (fun (_, x) -> 412 + match x with 413 + | `P256 _ -> P256.Dsa.generate () |> ignore 414 + | `P384 _ -> P384.Dsa.generate () |> ignore 415 + | `P521 _ -> P521.Dsa.generate () |> ignore 416 + | `Ed25519 _ -> Ed25519.generate () |> ignore) 417 + fst ecdsas); 418 + bm "ecdsa-sign" (fun name -> 419 + let open Crypto_ec in 420 + count name 421 + (fun (_, x) -> 422 + match x with 423 + | `P256 (key, _) -> P256.Dsa.sign ~key msg_str_32 424 + | `P384 (key, _) -> P384.Dsa.sign ~key msg_str_48 425 + | `P521 (key, _) -> P521.Dsa.sign ~key msg_str_65 426 + | `Ed25519 (key, _) -> (Ed25519.sign ~key msg_str, "")) 427 + fst ecdsas); 428 + bm "ecdsa-verify" (fun name -> 429 + let open Crypto_ec in 430 + count name 431 + (fun (_, x) -> 432 + match x with 433 + | `P256 (key, signature) -> 434 + P256.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_32) 435 + | `P384 (key, signature) -> 436 + P384.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_48) 437 + | `P521 (key, signature) -> 438 + P521.Dsa.(verify ~key:(pub_of_priv key) signature msg_str_65) 439 + | `Ed25519 (key, signature) -> 440 + Ed25519.(verify ~key:(pub_of_priv key) signature ~msg:msg_str)) 441 + fst ecdsas); 442 + bm "dh-secret" (fun name -> 443 + count name (fun (_, group) -> Crypto_pk.Dh.gen_key group) fst dh_groups); 444 + bm "dh-share" (fun name -> 445 + count name 446 + (fun (_, (sec, share)) -> Crypto_pk.Dh.shared sec share) 447 + (fun ((g, _), _) -> g) 448 + dh_secrets); 449 + bm "ecdh-secret" (fun name -> 450 + let open Crypto_ec in 451 + count name 452 + (fun (_, x) -> 453 + match x with 454 + | `P256 _ -> P256.Dh.gen_key () |> ignore 455 + | `P384 _ -> P384.Dh.gen_key () |> ignore 456 + | `P521 _ -> P521.Dh.gen_key () |> ignore 457 + | `X25519 _ -> X25519.gen_key () |> ignore) 458 + fst ecdh_shares); 459 + bm "ecdh-share" (fun name -> 460 + let open Crypto_ec in 461 + count name 462 + (fun (_, x) -> 463 + match x with 464 + | `P256 (sec, share) -> 465 + P256.Dh.key_exchange sec share |> Result.get_ok |> ignore 466 + | `P384 (sec, share) -> 467 + P384.Dh.key_exchange sec share |> Result.get_ok |> ignore 468 + | `P521 (sec, share) -> 469 + P521.Dh.key_exchange sec share |> Result.get_ok |> ignore 470 + | `X25519 (sec, share) -> 471 + X25519.key_exchange sec share |> Result.get_ok |> ignore) 472 + fst ecdh_shares); 473 + bm "chacha20-poly1305" (fun name -> 474 + let key = Chacha20.of_secret (Crypto_rng.generate 32) 475 + and nonce = Crypto_rng.generate 8 in 476 + throughput_into ~add:Chacha20.tag_size name (fun dst cs -> 477 + Chacha20.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst 478 + ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 479 + bm "chacha20-poly1305-unsafe" (fun name -> 480 + let key = Chacha20.of_secret (Crypto_rng.generate 32) 481 + and nonce = Crypto_rng.generate 8 in 482 + throughput_into ~add:Chacha20.tag_size name (fun dst cs -> 483 + Chacha20.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 484 + dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 485 + bm "aes-128-ecb" (fun name -> 486 + let key = AES.ECB.of_secret (Crypto_rng.generate 16) in 487 + throughput_into name (fun dst cs -> 488 + AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 489 + (String.length cs))); 490 + bm "aes-192-ecb" (fun name -> 491 + let key = AES.ECB.of_secret (Crypto_rng.generate 24) in 492 + throughput_into name (fun dst cs -> 493 + AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 494 + (String.length cs))); 495 + bm "aes-192-ecb-unsafe" (fun name -> 496 + let key = AES.ECB.of_secret (Crypto_rng.generate 24) in 497 + throughput_into name (fun dst cs -> 498 + AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 499 + (String.length cs))); 500 + bm "aes-256-ecb" (fun name -> 501 + let key = AES.ECB.of_secret (Crypto_rng.generate 32) in 502 + throughput_into name (fun dst cs -> 503 + AES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 504 + (String.length cs))); 505 + bm "aes-256-ecb-unsafe" (fun name -> 506 + let key = AES.ECB.of_secret (Crypto_rng.generate 32) in 507 + throughput_into name (fun dst cs -> 508 + AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 509 + (String.length cs))); 510 + bm "aes-128-ecb-unsafe" (fun name -> 511 + let key = AES.ECB.of_secret (Crypto_rng.generate 16) in 512 + throughput_into name (fun dst cs -> 513 + AES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 514 + (String.length cs))); 515 + bm "aes-128-cbc-e" (fun name -> 516 + let key = AES.CBC.of_secret (Crypto_rng.generate 16) 517 + and iv = Crypto_rng.generate 16 in 518 + throughput_into name (fun dst cs -> 519 + AES.CBC.encrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 520 + (String.length cs))); 521 + bm "aes-128-cbc-e-unsafe" (fun name -> 522 + let key = AES.CBC.of_secret (Crypto_rng.generate 16) 523 + and iv = Crypto_rng.generate 16 in 524 + throughput_into name (fun dst cs -> 525 + AES.CBC.unsafe_encrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 526 + (String.length cs))); 527 + bm "aes-128-cbc-e-unsafe-inplace" (fun name -> 528 + let key = AES.CBC.of_secret (Crypto_rng.generate 16) 529 + and iv = Crypto_rng.generate 16 in 530 + throughput name (fun cs -> 531 + let b = Bytes.unsafe_of_string cs in 532 + AES.CBC.unsafe_encrypt_into_inplace ~key ~iv b ~dst_off:0 533 + (String.length cs))); 534 + bm "aes-128-cbc-d" (fun name -> 535 + let key = AES.CBC.of_secret (Crypto_rng.generate 16) 536 + and iv = Crypto_rng.generate 16 in 537 + throughput_into name (fun dst cs -> 538 + AES.CBC.decrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 539 + (String.length cs))); 540 + bm "aes-128-cbc-d-unsafe" (fun name -> 541 + let key = AES.CBC.of_secret (Crypto_rng.generate 16) 542 + and iv = Crypto_rng.generate 16 in 543 + throughput_into name (fun dst cs -> 544 + AES.CBC.unsafe_decrypt_into ~key ~iv cs ~src_off:0 dst ~dst_off:0 545 + (String.length cs))); 546 + bm "aes-128-ctr" (fun name -> 547 + let key = Crypto_rng.generate 16 |> AES.CTR.of_secret 548 + and ctr = Crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in 549 + throughput_into name (fun dst cs -> 550 + AES.CTR.encrypt_into ~key ~ctr cs ~src_off:0 dst ~dst_off:0 551 + (String.length cs))); 552 + bm "aes-128-ctr-unsafe" (fun name -> 553 + let key = Crypto_rng.generate 16 |> AES.CTR.of_secret 554 + and ctr = Crypto_rng.generate 16 |> AES.CTR.ctr_of_octets in 555 + throughput_into name (fun dst cs -> 556 + AES.CTR.unsafe_encrypt_into ~key ~ctr cs ~src_off:0 dst ~dst_off:0 557 + (String.length cs))); 558 + bm "aes-128-gcm" (fun name -> 559 + let key = AES.GCM.of_secret (Crypto_rng.generate 16) 560 + and nonce = Crypto_rng.generate 12 in 561 + throughput_into ~add:AES.GCM.tag_size name (fun dst cs -> 562 + AES.GCM.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst 563 + ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 564 + bm "aes-128-gcm-unsafe" (fun name -> 565 + let key = AES.GCM.of_secret (Crypto_rng.generate 16) 566 + and nonce = Crypto_rng.generate 12 in 567 + throughput_into ~add:AES.GCM.tag_size name (fun dst cs -> 568 + AES.GCM.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 569 + dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 570 + bm "aes-128-ghash" (fun name -> 571 + let key = AES.GCM.of_secret (Crypto_rng.generate 16) 572 + and nonce = Crypto_rng.generate 12 in 573 + throughput_into ~add:AES.GCM.tag_size name (fun dst cs -> 574 + AES.GCM.authenticate_encrypt_into ~key ~nonce ~adata:cs "" 575 + ~src_off:0 dst ~dst_off:0 ~tag_off:0 0)); 576 + bm "aes-128-ghash-unsafe" (fun name -> 577 + let key = AES.GCM.of_secret (Crypto_rng.generate 16) 578 + and nonce = Crypto_rng.generate 12 in 579 + throughput_into ~add:AES.GCM.tag_size name (fun dst cs -> 580 + AES.GCM.unsafe_authenticate_encrypt_into ~key ~nonce ~adata:cs "" 581 + ~src_off:0 dst ~dst_off:0 ~tag_off:0 0)); 582 + bm "aes-128-ccm" (fun name -> 583 + let key = AES.CCM16.of_secret (Crypto_rng.generate 16) 584 + and nonce = Crypto_rng.generate 10 in 585 + throughput_into ~add:AES.CCM16.tag_size name (fun dst cs -> 586 + AES.CCM16.authenticate_encrypt_into ~key ~nonce cs ~src_off:0 dst 587 + ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 588 + bm "aes-128-ccm-unsafe" (fun name -> 589 + let key = AES.CCM16.of_secret (Crypto_rng.generate 16) 590 + and nonce = Crypto_rng.generate 10 in 591 + throughput_into ~add:AES.CCM16.tag_size name (fun dst cs -> 592 + AES.CCM16.unsafe_authenticate_encrypt_into ~key ~nonce cs ~src_off:0 593 + dst ~dst_off:0 ~tag_off:(String.length cs) (String.length cs))); 594 + bm "d3des-ecb" (fun name -> 595 + let key = DES.ECB.of_secret (Crypto_rng.generate 24) in 596 + throughput_into name (fun dst cs -> 597 + DES.ECB.encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 598 + (String.length cs))); 599 + bm "d3des-ecb-unsafe" (fun name -> 600 + let key = DES.ECB.of_secret (Crypto_rng.generate 24) in 601 + throughput_into name (fun dst cs -> 602 + DES.ECB.unsafe_encrypt_into ~key cs ~src_off:0 dst ~dst_off:0 603 + (String.length cs))); 604 + bm "fortuna" (fun name -> 605 + begin[@alert "-deprecated"] 606 + Crypto_rng_unix.initialize (module Crypto_rng.Fortuna); 607 + throughput name (fun buf -> 608 + let buf = Bytes.unsafe_of_string buf in 609 + Crypto_rng.generate_into buf ~off:0 (Bytes.length buf)) 610 + end); 611 + bm "getentropy" (fun name -> 612 + Crypto_rng_unix.use_getentropy (); 613 + throughput name (fun buf -> 614 + let buf = Bytes.unsafe_of_string buf in 615 + Crypto_rng.generate_into buf ~off:0 (Bytes.length buf))); 616 + bm "urandom" (fun name -> 617 + Crypto_rng_unix.use_dev_urandom (); 618 + throughput name (fun buf -> 619 + let buf = Bytes.unsafe_of_string buf in 620 + Crypto_rng.generate_into buf ~off:0 (Bytes.length buf))); 621 + ] 502 622 503 623 let help () = 504 624 Printf.printf "available benchmarks:\n "; 505 - List.iter (fun (n, _) -> Printf.printf "%s " n) benchmarks ; 625 + List.iter (fun (n, _) -> Printf.printf "%s " n) benchmarks; 506 626 Printf.printf "\n%!" 507 627 508 628 let runv fs = 509 629 Format.printf "accel: %a\n%!" 510 - (fun ppf -> List.iter @@ fun x -> 511 - Format.fprintf ppf "%s " @@ 512 - match x with `XOR -> "XOR" | `AES -> "AES" | `GHASH -> "GHASH") 630 + (fun ppf -> 631 + List.iter @@ fun x -> 632 + Format.fprintf ppf "%s " 633 + @@ match x with `XOR -> "XOR" | `AES -> "AES" | `GHASH -> "GHASH") 513 634 accelerated; 514 - Time.warmup () ; 635 + Time.warmup (); 515 636 List.iter (fun f -> f ()) fs 516 - 517 637 518 638 let () = 519 639 let seed = "abcd" in 520 640 let g = Crypto_rng.(create ~seed (module Fortuna)) in 521 641 Crypto_rng.set_default_generator g; 522 642 match Array.to_list Sys.argv with 523 - | _::(_::_ as args) -> begin 643 + | _ :: (_ :: _ as args) -> begin 524 644 try 525 645 let fs = 526 - args |> List.map @@ fun n -> 527 - snd (benchmarks |> List.find @@ fun (n1, _) -> n = n1) in 646 + args 647 + |> List.map @@ fun n -> 648 + snd (benchmarks |> List.find @@ fun (n1, _) -> n = n1) 649 + in 528 650 runv fs 529 651 with Not_found -> help () 530 652 end
+25 -26
config/cfg.ml
··· 3 3 let ccomp_type_opt = Configurator.V1.ocaml_config_var c "ccomp_type" in 4 4 let arch = 5 5 let defines = 6 - Configurator.V1.C_define.import 7 - c 8 - ~includes:[] 9 - [("__x86_64__", Switch); ("__i386__", Switch); ("__powerpc64__", Switch); 10 - ("__s390x__", Switch); ("__aarch64__", Switch); 11 - ("_WIN64", Switch); ("_WIN32", Switch)] 6 + Configurator.V1.C_define.import c ~includes:[] 7 + [ 8 + ("__x86_64__", Switch); 9 + ("__i386__", Switch); 10 + ("__powerpc64__", Switch); 11 + ("__s390x__", Switch); 12 + ("__aarch64__", Switch); 13 + ("_WIN64", Switch); 14 + ("_WIN32", Switch); 15 + ] 12 16 in 13 17 match defines with 14 18 | (_, Switch true) :: _ -> `x86_64 ··· 22 26 in 23 27 let os = 24 28 let defines = 25 - Configurator.V1.C_define.import 26 - c 27 - ~includes:[] 28 - [("__APPLE__", Switch)] 29 + Configurator.V1.C_define.import c ~includes:[] [ ("__APPLE__", Switch) ] 29 30 in 30 - match defines with 31 - | (_, Switch true) :: _ -> `macos 32 - | _ -> `unknown 31 + match defines with (_, Switch true) :: _ -> `macos | _ -> `unknown 33 32 in 34 33 let accelerate_flags = 35 - match arch, ccomp_type_opt with 34 + match (arch, ccomp_type_opt) with 36 35 | `x86_64, Some "msvc" -> [ "-DACCELERATE" ] 37 36 | `x86_64, _ -> [ "-DACCELERATE"; "-mssse3"; "-maes"; "-mpclmul" ] 38 37 | _ -> [] 39 38 in 40 39 let ent_flags = 41 - match arch, ccomp_type_opt with 40 + match (arch, ccomp_type_opt) with 42 41 | (`x86_64 | `x86), Some "msvc" -> [ "-DENTROPY" ] 43 42 | (`x86_64 | `x86), _ -> [ "-DENTROPY"; "-mrdrnd"; "-mrdseed" ] 44 43 | _ -> [] 45 44 in 46 45 let std_flags = 47 46 match ccomp_type_opt with 48 - | Some "msvc" -> ["/Wall"] 49 - | _ -> ["--std=c11"; "-Wall"; "-Wextra"; "-Wpedantic"; "-O3"] 47 + | Some "msvc" -> [ "/Wall" ] 48 + | _ -> [ "--std=c11"; "-Wall"; "-Wextra"; "-Wpedantic"; "-O3" ] 50 49 in 51 50 let warn_flags = 52 51 (* See #178, there may be false positives on ppc&s390 with no-stringop-overflow *) 53 - match arch, ccomp_type_opt with 52 + match (arch, ccomp_type_opt) with 54 53 | _, Some "msvc" -> [ "/WX" ] 55 - | (`ppc64, _) | (`s390x, _) -> [ "-Wno-stringop-overflow"; "-Werror" ] 54 + | `ppc64, _ | `s390x, _ -> [ "-Wno-stringop-overflow"; "-Werror" ] 56 55 | _ -> [ "-Werror" ] 57 56 in 58 - let no_instcombine_on_macos = match arch, os with 57 + let no_instcombine_on_macos = 58 + match (arch, os) with 59 59 | `arm64, `macos -> 60 - let res = Configurator.V1.Process.run c "cc" ["-dumpversion"] in 61 - if String.trim res.stdout = "14.0.3" then 62 - ["-mllvm"; "--instcombine-max-iterations=0"] 63 - (* macOS instcombine miscompilation with clang 14.0.3 *) 64 - else 65 - [] 60 + let res = Configurator.V1.Process.run c "cc" [ "-dumpversion" ] in 61 + if String.trim res.stdout = "14.0.3" then 62 + [ "-mllvm"; "--instcombine-max-iterations=0" ] 63 + (* macOS instcombine miscompilation with clang 14.0.3 *) 64 + else [] 66 65 | _ -> [] 67 66 in 68 67 let flags = std_flags @ no_instcombine_on_macos @ ent_flags in
+475 -273
ec/crypto_ec.ml
··· 1 - type error = [ 2 - | `Invalid_format 1 + type error = 2 + [ `Invalid_format 3 3 | `Invalid_length 4 4 | `Invalid_range 5 5 | `Not_on_curve 6 6 | `At_infinity 7 - | `Low_order 8 - ] 7 + | `Low_order ] 9 8 10 9 let error_to_string = function 11 10 | `Invalid_format -> "invalid format" ··· 23 22 let res = Bytes.create len in 24 23 for i = 0 to len - 1 do 25 24 Bytes.set res (len - 1 - i) (String.get buf i) 26 - done ; 25 + done; 27 26 Bytes.unsafe_to_string res 28 27 29 28 exception Message_too_long ··· 36 35 37 36 module type Dh = sig 38 37 type secret 39 - val secret_of_octets : ?compress:bool -> string -> 40 - (secret * string, error) result 38 + 39 + val secret_of_octets : 40 + ?compress:bool -> string -> (secret * string, error) result 41 + 41 42 val secret_to_octets : secret -> string 42 - val gen_key : ?compress:bool -> ?g:Crypto_rng.g -> unit -> 43 - secret * string 43 + val gen_key : ?compress:bool -> ?g:Crypto_rng.g -> unit -> secret * string 44 44 val key_exchange : secret -> string -> (string, error) result 45 45 end 46 46 47 47 module type Dsa = sig 48 48 type priv 49 49 type pub 50 + 50 51 val byte_length : int 51 52 val bit_length : int 52 53 val priv_of_octets : string -> (priv, error) result ··· 57 58 val generate : ?g:Crypto_rng.g -> unit -> priv * pub 58 59 val sign : key:priv -> ?k:string -> string -> string * string 59 60 val verify : key:pub -> string * string -> string -> bool 61 + 60 62 module K_gen (H : Digestif.S) : sig 61 63 val generate : key:priv -> string -> string 62 64 end 65 + 63 66 module Precompute : sig 64 67 val generator_tables : unit -> string array array array 65 68 end ··· 68 71 module type Point = sig 69 72 type point 70 73 type scalar 74 + 71 75 val of_octets : string -> (point, error) result 72 76 val to_octets : ?compress:bool -> point -> string 73 77 val scalar_of_octets : string -> (scalar, error) result ··· 84 88 end 85 89 86 90 type field_element = string 87 - 88 91 type out_field_element = bytes 89 92 90 93 module type Parameters = sig ··· 94 97 val g_y : field_element 95 98 val p : field_element 96 99 val n : field_element 97 - val pident: string 100 + val pident : string 98 101 val byte_length : int 99 102 val bit_length : int 100 103 val fe_length : int ··· 103 106 104 107 type point = { f_x : field_element; f_y : field_element; f_z : field_element } 105 108 106 - type out_point = { m_f_x : out_field_element; m_f_y : out_field_element; m_f_z : out_field_element } 109 + type out_point = { 110 + m_f_x : out_field_element; 111 + m_f_y : out_field_element; 112 + m_f_z : out_field_element; 113 + } 107 114 108 115 type scalar = Scalar of string 109 116 ··· 119 126 val from_montgomery : out_field_element -> field_element -> unit 120 127 val to_octets : bytes -> field_element -> unit 121 128 val inv : out_field_element -> field_element -> unit 122 - val select_c : out_field_element -> bool -> field_element -> field_element -> unit 129 + 130 + val select_c : 131 + out_field_element -> bool -> field_element -> field_element -> unit 123 132 124 133 val double_c : out_point -> point -> unit 125 134 val add_c : out_point -> point -> point -> unit ··· 136 145 val nz : field_element -> bool 137 146 val sqr : field_element -> field_element 138 147 val inv : field_element -> field_element 139 - val select : bool -> then_:field_element -> else_:field_element -> field_element 148 + 149 + val select : 150 + bool -> then_:field_element -> else_:field_element -> field_element 151 + 140 152 val from_be_octets : string -> field_element 141 153 val to_octets : field_element -> string 142 154 val double_point : point -> point ··· 144 156 val scalar_mult_base_point : scalar -> point 145 157 end 146 158 147 - module Make_field_element (P : Parameters) (F : Foreign) : Field_element = struct 159 + module Make_field_element (P : Parameters) (F : Foreign) : Field_element = 160 + struct 148 161 let b_uts b = Bytes.unsafe_to_string b 149 - 150 162 let create () = Bytes.create P.fe_length 151 163 152 164 let mul a b = ··· 202 214 F.to_montgomery tmp (b_uts tmp); 203 215 b_uts tmp 204 216 205 - let create_octets () = 206 - Bytes.create P.byte_length 217 + let create_octets () = Bytes.create P.byte_length 207 218 208 219 let to_octets fe = 209 220 let tmp = create_octets () in 210 221 F.to_octets tmp fe; 211 222 b_uts tmp 212 223 213 - let out_point () = { 214 - m_f_x = create (); 215 - m_f_y = create (); 216 - m_f_z = create (); 217 - } 224 + let out_point () = { m_f_x = create (); m_f_y = create (); m_f_z = create () } 218 225 219 - let out_p_to_p p = { 220 - f_x = b_uts p.m_f_x ; 221 - f_y = b_uts p.m_f_y ; 222 - f_z = b_uts p.m_f_z ; 223 - } 226 + let out_p_to_p p = 227 + { f_x = b_uts p.m_f_x; f_y = b_uts p.m_f_y; f_z = b_uts p.m_f_z } 224 228 225 229 let double_point p = 226 230 let tmp = out_point () in ··· 253 257 end 254 258 255 259 module Make_point_ops (P : Parameters) (F : Foreign) : Point_ops = struct 256 - module Fe = Make_field_element(P)(F) 260 + module Fe = Make_field_element (P) (F) 257 261 258 262 let at_infinity () = 259 263 let f_x = Fe.one in ··· 286 290 (** Convert coordinates to a finite point ensuring: 287 291 - x < p 288 292 - y < p 289 - - y^2 = ax^3 + ax + b 290 - *) 293 + - y^2 = ax^3 + ax + b *) 291 294 let validate_finite_point ~x ~y = 292 295 match (check_coordinate x, check_coordinate y) with 293 296 | Some f_x, Some f_y -> 294 - if is_solution_to_curve_equation ~x:f_x ~y:f_y then 295 - let f_z = Fe.one in 296 - Ok { f_x; f_y; f_z } 297 - else Error `Not_on_curve 297 + if is_solution_to_curve_equation ~x:f_x ~y:f_y then 298 + let f_z = Fe.one in 299 + Ok { f_x; f_y; f_z } 300 + else Error `Not_on_curve 298 301 | _ -> Error `Invalid_range 299 302 300 303 let to_affine_raw p = 301 - if is_infinity p then 302 - None 304 + if is_infinity p then None 303 305 else 304 306 let z1 = Fe.from_montgomery p.f_z in 305 307 let z2 = Fe.inv z1 in ··· 311 313 Some (x, y) 312 314 313 315 let to_affine p = 314 - Option.map (fun (x, y) -> Fe.to_octets x, Fe.to_octets y) 316 + Option.map 317 + (fun (x, y) -> (Fe.to_octets x, Fe.to_octets y)) 315 318 (to_affine_raw p) 316 319 317 320 let to_octets ~compress p = ··· 319 322 match to_affine p with 320 323 | None -> String.make 1 '\000' 321 324 | Some (x, y) -> 322 - let len_x = String.length x and len_y = String.length y in 323 - let res = Bytes.create (1 + len_x + len_y) in 324 - Bytes.set res 0 '\004' ; 325 - let rev_x = rev_string x and rev_y = rev_string y in 326 - Bytes.unsafe_blit_string rev_x 0 res 1 len_x ; 327 - Bytes.unsafe_blit_string rev_y 0 res (1 + len_x) len_y ; 328 - Bytes.unsafe_to_string res 325 + let len_x = String.length x and len_y = String.length y in 326 + let res = Bytes.create (1 + len_x + len_y) in 327 + Bytes.set res 0 '\004'; 328 + let rev_x = rev_string x and rev_y = rev_string y in 329 + Bytes.unsafe_blit_string rev_x 0 res 1 len_x; 330 + Bytes.unsafe_blit_string rev_y 0 res (1 + len_x) len_y; 331 + Bytes.unsafe_to_string res 329 332 in 330 - if compress then 333 + if compress then ( 331 334 let out = Bytes.create (P.byte_length + 1) in 332 - let ident = 333 - 2 + (String.get_uint8 buf (P.byte_length * 2)) land 1 334 - in 335 + let ident = 2 + (String.get_uint8 buf (P.byte_length * 2) land 1) in 335 336 Bytes.unsafe_blit_string buf 1 out 1 P.byte_length; 336 337 Bytes.set_uint8 out 0 ident; 337 - Bytes.unsafe_to_string out 338 - else 339 - buf 338 + Bytes.unsafe_to_string out) 339 + else buf 340 340 341 341 let double p = Fe.double_point p 342 - 343 342 let add p q = Fe.add_point p q 344 343 345 344 let x_of_finite_point p = ··· 359 358 360 359 let pow x exp = 361 360 let r0 = ref Fe.one in 362 - let r1 = ref x in 363 - for i = P.byte_length * 8 - 1 downto 0 do 361 + let r1 = ref x in 362 + for i = (P.byte_length * 8) - 1 downto 0 do 364 363 let bit = bit_at exp i in 365 364 let multiplied = Fe.mul !r0 !r1 in 366 365 let r0_sqr = Fe.sqr !r0 in 367 366 let r1_sqr = Fe.sqr !r1 in 368 367 r0 := Fe.select bit ~then_:multiplied ~else_:r0_sqr; 369 - r1 := Fe.select bit ~then_:r1_sqr ~else_:multiplied; 368 + r1 := Fe.select bit ~then_:r1_sqr ~else_:multiplied 370 369 done; 371 370 !r0 372 371 373 372 let decompress = 374 - (* When p = 4*k+3, as is the case of NIST-P256, there is an efficient square 373 + (* When p = 4*k+3, as is the case of NIST-P256, there is an efficient square 375 374 root algorithm to recover the y, as follows: 376 375 377 376 Given the compact representation of Q as x, ··· 380 379 y = min(y',p-y') 381 380 Q=(x,y) is the canonical representation of the point 382 381 *) 383 - let pident = P.pident (* (Params.p + 1) / 4*) in 382 + let pident = 383 + P.pident 384 + (* (Params.p + 1) / 4*) 385 + in 384 386 let a = Fe.from_be_octets P.a in 385 387 let b = Fe.from_be_octets P.b in 386 388 let p = Fe.from_be_octets P.p in 387 389 fun pk -> 388 390 let x = Fe.from_be_octets (String.sub pk 1 P.byte_length) in 389 391 let x3 = Fe.mul x x in 390 - let x3 = Fe.mul x3 x in (* x3 *) 391 - let ax = Fe.mul a x in (* ax *) 392 + let x3 = Fe.mul x3 x in 393 + (* x3 *) 394 + let ax = Fe.mul a x in 395 + (* ax *) 392 396 let sum = Fe.add x3 ax in 393 - let sum = Fe.add sum b in (* y^2 *) 394 - let y = pow sum pident in (* https://tools.ietf.org/id/draft-jivsov-ecc-compact-00.xml#sqrt point 4.3*) 397 + let sum = Fe.add sum b in 398 + (* y^2 *) 399 + let y = pow sum pident in 400 + (* https://tools.ietf.org/id/draft-jivsov-ecc-compact-00.xml#sqrt point 4.3*) 395 401 let y' = Fe.sub p y in 396 402 let y = Fe.from_montgomery y in 397 - let y_struct = Fe.to_octets y in (* number must not be in montgomery domain*) 403 + let y_struct = Fe.to_octets y in 404 + (* number must not be in montgomery domain*) 398 405 let y_struct = rev_string y_struct in 399 406 let y' = Fe.from_montgomery y' in 400 - let y_struct2 = Fe.to_octets y' in (* number must not be in montgomery domain*) 407 + let y_struct2 = Fe.to_octets y' in 408 + (* number must not be in montgomery domain*) 401 409 let y_struct2 = rev_string y_struct2 in 402 410 let ident = String.get_uint8 pk 0 in 403 - let signY = 404 - 2 + (String.get_uint8 y_struct (P.byte_length - 1)) land 1 405 - in 411 + let signY = 2 + (String.get_uint8 y_struct (P.byte_length - 1) land 1) in 406 412 let res = if Int.equal signY ident then y_struct else y_struct2 in 407 413 let out = Bytes.create ((P.byte_length * 2) + 1) in 408 414 Bytes.set out 0 '\004'; ··· 412 418 413 419 let of_octets buf = 414 420 let len = P.byte_length in 415 - if String.length buf = 0 then 416 - Error `Invalid_format 421 + if String.length buf = 0 then Error `Invalid_format 417 422 else 418 423 let of_octets buf = 419 424 let x = String.sub buf 1 len in ··· 421 426 validate_finite_point ~x ~y 422 427 in 423 428 match String.get_uint8 buf 0 with 424 - | 0x00 when String.length buf = 1 -> 425 - Ok (at_infinity ()) 426 - | 0x02 | 0x03 when String.length P.pident > 0 -> 427 - let decompressed = decompress buf in 428 - of_octets decompressed 429 - | 0x04 when String.length buf = 1 + len + len -> 430 - of_octets buf 429 + | 0x00 when String.length buf = 1 -> Ok (at_infinity ()) 430 + | (0x02 | 0x03) when String.length P.pident > 0 -> 431 + let decompressed = decompress buf in 432 + of_octets decompressed 433 + | 0x04 when String.length buf = 1 + len + len -> of_octets buf 431 434 | 0x00 | 0x04 -> Error `Invalid_length 432 435 | _ -> Error `Invalid_format 433 436 ··· 465 468 let scalar_mult (Scalar s) p = 466 469 let r0 = ref (P.at_infinity ()) in 467 470 let r1 = ref p in 468 - for i = Param.byte_length * 8 - 1 downto 0 do 471 + for i = (Param.byte_length * 8) - 1 downto 0 do 469 472 let bit = bit_at s i in 470 473 let sum = P.add !r0 !r1 in 471 474 let r0_double = P.double !r0 in ··· 495 498 base := P.double !base; 496 499 base := P.double !base 497 500 done; 498 - let convert {f_x; f_y; f_z} = [|f_x; f_y; f_z|] in 501 + let convert { f_x; f_y; f_z } = [| f_x; f_y; f_z |] in 499 502 Array.map (Array.map convert) table 500 503 end 501 504 ··· 519 522 | Ok p -> Ok (p, share ?compress p) 520 523 | Error _ as e -> e 521 524 522 - let secret_to_octets s = 523 - S.to_octets s 525 + let secret_to_octets s = S.to_octets s 524 526 525 527 let rec generate_private_key ?g () = 526 528 let candidate = Crypto_rng.generate ?g Param.byte_length in ··· 530 532 531 533 let gen_key ?compress ?g () = 532 534 let private_key = generate_private_key ?g () in 533 - private_key, share ?compress private_key 535 + (private_key, share ?compress private_key) 534 536 535 537 let key_exchange secret received = 536 538 match point_of_octets received with ··· 562 564 563 565 module Make_Fn (P : Parameters) (F : Foreign_n) : Fn = struct 564 566 let b_uts = Bytes.unsafe_to_string 565 - 566 567 let create () = Bytes.create P.fe_length 567 - 568 568 let create_octets () = Bytes.create P.byte_length 569 569 570 570 let from_be_octets v = ··· 610 610 b_uts tmp 611 611 end 612 612 613 - module Make_dsa (Param : Parameters) (F : Fn) (P : Point_ops) (S : Scalar) (H : Digestif.S) = struct 613 + module Make_dsa 614 + (Param : Parameters) 615 + (F : Fn) 616 + (P : Point_ops) 617 + (S : Scalar) 618 + (H : Digestif.S) = 619 + struct 614 620 type priv = scalar 615 621 616 622 let byte_length = Param.byte_length 617 - 618 623 let bit_length = Param.bit_length 619 - 620 - let priv_of_octets= S.of_octets 621 - 624 + let priv_of_octets = S.of_octets 622 625 let priv_to_octets = S.to_octets 623 626 624 627 let padded msg = ··· 627 630 let first_byte_ok () = 628 631 match Param.first_byte_bits with 629 632 | None -> true 630 - | Some m -> (String.get_uint8 msg 0) land (0xFF land (lnot m)) = 0 633 + | Some m -> String.get_uint8 msg 0 land (0xFF land lnot m) = 0 631 634 in 632 - if l > bl || (l = bl && not (first_byte_ok ())) then 633 - raise Message_too_long 634 - else if l = bl then 635 - msg 635 + if l > bl || (l = bl && not (first_byte_ok ())) then raise Message_too_long 636 + else if l = bl then msg 636 637 else 637 - ( let res = Bytes.make bl '\000' in 638 - Bytes.unsafe_blit_string msg 0 res (bl - l) l ; 639 - Bytes.unsafe_to_string res ) 638 + let res = Bytes.make bl '\000' in 639 + Bytes.unsafe_blit_string msg 0 res (bl - l) l; 640 + Bytes.unsafe_to_string res 640 641 641 642 (* RFC 6979: compute a deterministic k *) 642 643 module K_gen (H : Digestif.S) = struct 643 644 let drbg : 'a Crypto_rng.generator = 644 - let module M = Crypto_rng.Hmac_drbg (H) in (module M) 645 + let module M = Crypto_rng.Hmac_drbg (H) in 646 + (module M) 645 647 646 648 let g ~key msg = 647 649 let g = Crypto_rng.create ~strict:true drbg in ··· 654 656 let bits2int r = 655 657 (* keep qlen *leftmost* bits *) 656 658 let shift = (8 * Param.byte_length) - Param.bit_length in 657 - if shift = 0 then 658 - Bytes.unsafe_to_string r 659 + if shift = 0 then Bytes.unsafe_to_string r 659 660 else 660 661 (* Assuming shift is < 8 *) 661 662 let r' = Bytes.create Param.byte_length in ··· 682 683 let generate ~key buf = gen (g ~key (padded buf)) 683 684 end 684 685 685 - module K_gen_default = K_gen(H) 686 + module K_gen_default = K_gen (H) 686 687 687 688 type pub = point 688 689 689 690 let pub_of_octets = P.of_octets 690 - 691 691 let pub_to_octets ?(compress = false) pk = P.to_octets ~compress pk 692 692 693 693 let generate ?g () = ··· 707 707 match P.to_affine_raw p with 708 708 | None -> None 709 709 | Some (x, _) -> 710 - let x = F.to_montgomery x in 711 - let x = F.mul x F.one in 712 - let x = F.from_montgomery x in 713 - Some (F.to_be_octets x) 710 + let x = F.to_montgomery x in 711 + let x = F.mul x F.one in 712 + let x = F.from_montgomery x in 713 + Some (F.to_be_octets x) 714 714 715 715 let sign ~key ?k msg = 716 716 let msg = padded msg in ··· 723 723 | Some _ -> invalid_arg "k not suitable" 724 724 in 725 725 let k' = match k with None -> K_gen_default.gen g | Some k -> k in 726 - let ksc = match S.of_octets k' with 726 + let ksc = 727 + match S.of_octets k' with 727 728 | Ok ksc -> ksc 728 - | Error _ -> invalid_arg "k not in range" (* if no k is provided, this cannot happen since K_gen_*.gen already preserves the Scalar invariants *) 729 + | Error _ -> invalid_arg "k not in range" 730 + (* if no k is provided, this cannot happen since K_gen_*.gen already preserves the Scalar invariants *) 729 731 in 730 732 let point = S.scalar_mult_base ksc in 731 733 match x_of_finite_point_mod_n point with 732 734 | None -> again () 733 735 | Some r -> 734 - let r_mon = F.from_be_octets r in 735 - let kmon = F.from_be_octets k' in 736 - let kinv = F.inv kmon in 737 - let dmon = F.from_be_octets (S.to_octets key) in 738 - let rd = F.mul r_mon dmon in 739 - let cmon = F.add e rd in 740 - let smon = F.mul kinv cmon in 741 - let s = F.from_montgomery smon in 742 - let s = F.to_be_octets s in 743 - if S.not_zero s && S.not_zero r then 744 - r, s 745 - else 746 - again () 736 + let r_mon = F.from_be_octets r in 737 + let kmon = F.from_be_octets k' in 738 + let kinv = F.inv kmon in 739 + let dmon = F.from_be_octets (S.to_octets key) in 740 + let rd = F.mul r_mon dmon in 741 + let cmon = F.add e rd in 742 + let smon = F.mul kinv cmon in 743 + let s = F.from_montgomery smon in 744 + let s = F.to_be_octets s in 745 + if S.not_zero s && S.not_zero r then (r, s) else again () 747 746 in 748 747 do_sign g 749 748 ··· 752 751 let verify ~key (r, s) msg = 753 752 try 754 753 let r = padded r and s = padded s in 755 - if not (S.is_in_range r && S.is_in_range s) then 756 - false 754 + if not (S.is_in_range r && S.is_in_range s) then false 757 755 else 758 756 let msg = padded msg in 759 757 let z = F.from_be_octets msg in ··· 765 763 let u1 = F.from_montgomery u1 in 766 764 let u2 = F.from_montgomery u2 in 767 765 match 768 - S.of_octets (F.to_be_octets u1), 769 - S.of_octets (F.to_be_octets u2) 766 + (S.of_octets (F.to_be_octets u1), S.of_octets (F.to_be_octets u2)) 770 767 with 771 768 | Ok u1, Ok u2 -> 772 - let point = 773 - P.add 774 - (S.scalar_mult_base u1) 775 - (S.scalar_mult u2 key) 776 - in 777 - begin match x_of_finite_point_mod_n point with 769 + let point = P.add (S.scalar_mult_base u1) (S.scalar_mult u2 key) in 770 + begin match x_of_finite_point_mod_n point with 778 771 | None -> false (* point is infinity *) 779 772 | Some r' -> String.equal r r' 780 - end 773 + end 781 774 | Error _, _ | _, Error _ -> false 782 - with 783 - | Message_too_long -> false 775 + with Message_too_long -> false 784 776 785 777 module Precompute = struct 786 778 let generator_tables = S.generator_tables 787 779 end 788 780 end 789 781 790 - module Make_point (P : Point_ops) (S : Scalar) : Point 791 - with type point = point and type scalar = scalar 792 - = struct 782 + module Make_point (P : Point_ops) (S : Scalar) : 783 + Point with type point = point and type scalar = scalar = struct 793 784 type nonrec point = point 794 785 type nonrec scalar = scalar 786 + 795 787 let of_octets = P.of_octets 796 788 let to_octets ?(compress = false) p = P.to_octets ~compress p 797 789 let scalar_of_octets = S.of_octets ··· 801 793 let scalar_mult = S.scalar_mult 802 794 end 803 795 804 - module P256 : Dh_dsa = struct 796 + module P256 : Dh_dsa = struct 805 797 module Params = struct 806 - let a = "\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC" 807 - let b = "\x5A\xC6\x35\xD8\xAA\x3A\x93\xE7\xB3\xEB\xBD\x55\x76\x98\x86\xBC\x65\x1D\x06\xB0\xCC\x53\xB0\xF6\x3B\xCE\x3C\x3E\x27\xD2\x60\x4B" 808 - let g_x = "\x6B\x17\xD1\xF2\xE1\x2C\x42\x47\xF8\xBC\xE6\xE5\x63\xA4\x40\xF2\x77\x03\x7D\x81\x2D\xEB\x33\xA0\xF4\xA1\x39\x45\xD8\x98\xC2\x96" 809 - let g_y = "\x4F\xE3\x42\xE2\xFE\x1A\x7F\x9B\x8E\xE7\xEB\x4A\x7C\x0F\x9E\x16\x2B\xCE\x33\x57\x6B\x31\x5E\xCE\xCB\xB6\x40\x68\x37\xBF\x51\xF5" 810 - let p = "\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 811 - let n = "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xBC\xE6\xFA\xAD\xA7\x17\x9E\x84\xF3\xB9\xCA\xC2\xFC\x63\x25\x51" 812 - let pident = "\x3F\xFF\xFF\xFF\xC0\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" |> rev_string (* (Params.p + 1) / 4*) 798 + let a = 799 + "\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC" 800 + 801 + let b = 802 + "\x5A\xC6\x35\xD8\xAA\x3A\x93\xE7\xB3\xEB\xBD\x55\x76\x98\x86\xBC\x65\x1D\x06\xB0\xCC\x53\xB0\xF6\x3B\xCE\x3C\x3E\x27\xD2\x60\x4B" 803 + 804 + let g_x = 805 + "\x6B\x17\xD1\xF2\xE1\x2C\x42\x47\xF8\xBC\xE6\xE5\x63\xA4\x40\xF2\x77\x03\x7D\x81\x2D\xEB\x33\xA0\xF4\xA1\x39\x45\xD8\x98\xC2\x96" 806 + 807 + let g_y = 808 + "\x4F\xE3\x42\xE2\xFE\x1A\x7F\x9B\x8E\xE7\xEB\x4A\x7C\x0F\x9E\x16\x2B\xCE\x33\x57\x6B\x31\x5E\xCE\xCB\xB6\x40\x68\x37\xBF\x51\xF5" 809 + 810 + let p = 811 + "\xFF\xFF\xFF\xFF\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 812 + 813 + let n = 814 + "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xBC\xE6\xFA\xAD\xA7\x17\x9E\x84\xF3\xB9\xCA\xC2\xFC\x63\x25\x51" 815 + 816 + let pident = 817 + "\x3F\xFF\xFF\xFF\xC0\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 818 + |> rev_string (* (Params.p + 1) / 4*) 819 + 813 820 let byte_length = 32 814 821 let bit_length = 256 815 822 let fe_length = 32 ··· 817 824 end 818 825 819 826 module Foreign = struct 820 - external mul : out_field_element -> field_element -> field_element -> unit = "mc_p256_mul" [@@noalloc] 821 - external sub : out_field_element -> field_element -> field_element -> unit = "mc_p256_sub" [@@noalloc] 822 - external add : out_field_element -> field_element -> field_element -> unit = "mc_p256_add" [@@noalloc] 823 - external to_montgomery : out_field_element -> field_element -> unit = "mc_p256_to_montgomery" [@@noalloc] 824 - external from_octets : out_field_element -> string -> unit = "mc_p256_from_bytes" [@@noalloc] 827 + external mul : out_field_element -> field_element -> field_element -> unit 828 + = "mc_p256_mul" 829 + [@@noalloc] 830 + 831 + external sub : out_field_element -> field_element -> field_element -> unit 832 + = "mc_p256_sub" 833 + [@@noalloc] 834 + 835 + external add : out_field_element -> field_element -> field_element -> unit 836 + = "mc_p256_add" 837 + [@@noalloc] 838 + 839 + external to_montgomery : out_field_element -> field_element -> unit 840 + = "mc_p256_to_montgomery" 841 + [@@noalloc] 842 + 843 + external from_octets : out_field_element -> string -> unit 844 + = "mc_p256_from_bytes" 845 + [@@noalloc] 846 + 825 847 external set_one : out_field_element -> unit = "mc_p256_set_one" [@@noalloc] 826 848 external nz : field_element -> bool = "mc_p256_nz" [@@noalloc] 827 - external sqr : out_field_element -> field_element -> unit = "mc_p256_sqr" [@@noalloc] 828 - external from_montgomery : out_field_element -> field_element -> unit = "mc_p256_from_montgomery" [@@noalloc] 829 - external to_octets : bytes -> field_element -> unit = "mc_p256_to_bytes" [@@noalloc] 830 - external inv : out_field_element -> field_element -> unit = "mc_p256_inv" [@@noalloc] 831 - external select_c : out_field_element -> bool -> field_element -> field_element -> unit = "mc_p256_select" [@@noalloc] 832 - external double_c : out_point -> point -> unit = "mc_p256_point_double" [@@noalloc] 833 - external add_c : out_point -> point -> point -> unit = "mc_p256_point_add" [@@noalloc] 834 - external scalar_mult_base_c : out_point -> string -> unit = "mc_p256_scalar_mult_base" [@@noalloc] 849 + 850 + external sqr : out_field_element -> field_element -> unit = "mc_p256_sqr" 851 + [@@noalloc] 852 + 853 + external from_montgomery : out_field_element -> field_element -> unit 854 + = "mc_p256_from_montgomery" 855 + [@@noalloc] 856 + 857 + external to_octets : bytes -> field_element -> unit = "mc_p256_to_bytes" 858 + [@@noalloc] 859 + 860 + external inv : out_field_element -> field_element -> unit = "mc_p256_inv" 861 + [@@noalloc] 862 + 863 + external select_c : 864 + out_field_element -> bool -> field_element -> field_element -> unit 865 + = "mc_p256_select" 866 + [@@noalloc] 867 + 868 + external double_c : out_point -> point -> unit = "mc_p256_point_double" 869 + [@@noalloc] 870 + 871 + external add_c : out_point -> point -> point -> unit = "mc_p256_point_add" 872 + [@@noalloc] 873 + 874 + external scalar_mult_base_c : out_point -> string -> unit 875 + = "mc_p256_scalar_mult_base" 876 + [@@noalloc] 835 877 end 836 878 837 879 module Foreign_n = struct 838 - external mul : out_field_element -> field_element -> field_element -> unit = "mc_np256_mul" [@@noalloc] 839 - external add : out_field_element -> field_element -> field_element -> unit = "mc_np256_add" [@@noalloc] 840 - external inv : out_field_element -> field_element -> unit = "mc_np256_inv" [@@noalloc] 880 + external mul : out_field_element -> field_element -> field_element -> unit 881 + = "mc_np256_mul" 882 + [@@noalloc] 883 + 884 + external add : out_field_element -> field_element -> field_element -> unit 885 + = "mc_np256_add" 886 + [@@noalloc] 887 + 888 + external inv : out_field_element -> field_element -> unit = "mc_np256_inv" 889 + [@@noalloc] 890 + 841 891 external one : out_field_element -> unit = "mc_np256_one" [@@noalloc] 842 - external from_bytes : out_field_element -> string -> unit = "mc_np256_from_bytes" [@@noalloc] 843 - external to_bytes : bytes -> field_element -> unit = "mc_np256_to_bytes" [@@noalloc] 844 - external from_montgomery : out_field_element -> field_element -> unit = "mc_np256_from_montgomery" [@@noalloc] 845 - external to_montgomery : out_field_element -> field_element -> unit = "mc_np256_to_montgomery" [@@noalloc] 892 + 893 + external from_bytes : out_field_element -> string -> unit 894 + = "mc_np256_from_bytes" 895 + [@@noalloc] 896 + 897 + external to_bytes : bytes -> field_element -> unit = "mc_np256_to_bytes" 898 + [@@noalloc] 899 + 900 + external from_montgomery : out_field_element -> field_element -> unit 901 + = "mc_np256_from_montgomery" 902 + [@@noalloc] 903 + 904 + external to_montgomery : out_field_element -> field_element -> unit 905 + = "mc_np256_to_montgomery" 906 + [@@noalloc] 846 907 end 847 908 848 - module P = Make_point_ops(Params)(Foreign) 849 - module S = Make_scalar(Params)(P) 850 - module Dh = Make_dh(Params)(P)(S) 851 - module Fn = Make_Fn(Params)(Foreign_n) 852 - module Dsa = Make_dsa(Params)(Fn)(P)(S)(Digestif.SHA256) 853 - module Point = Make_point(P)(S) 909 + module P = Make_point_ops (Params) (Foreign) 910 + module S = Make_scalar (Params) (P) 911 + module Dh = Make_dh (Params) (P) (S) 912 + module Fn = Make_Fn (Params) (Foreign_n) 913 + module Dsa = Make_dsa (Params) (Fn) (P) (S) (Digestif.SHA256) 914 + module Point = Make_point (P) (S) 854 915 end 855 916 856 917 module P384 : Dh_dsa = struct 857 918 module Params = struct 858 - let a = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFC" 859 - let b = "\xB3\x31\x2F\xA7\xE2\x3E\xE7\xE4\x98\x8E\x05\x6B\xE3\xF8\x2D\x19\x18\x1D\x9C\x6E\xFE\x81\x41\x12\x03\x14\x08\x8F\x50\x13\x87\x5A\xC6\x56\x39\x8D\x8A\x2E\xD1\x9D\x2A\x85\xC8\xED\xD3\xEC\x2A\xEF" 860 - let g_x = "\xAA\x87\xCA\x22\xBE\x8B\x05\x37\x8E\xB1\xC7\x1E\xF3\x20\xAD\x74\x6E\x1D\x3B\x62\x8B\xA7\x9B\x98\x59\xF7\x41\xE0\x82\x54\x2A\x38\x55\x02\xF2\x5D\xBF\x55\x29\x6C\x3A\x54\x5E\x38\x72\x76\x0A\xB7" 919 + let a = 920 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFC" 921 + 922 + let b = 923 + "\xB3\x31\x2F\xA7\xE2\x3E\xE7\xE4\x98\x8E\x05\x6B\xE3\xF8\x2D\x19\x18\x1D\x9C\x6E\xFE\x81\x41\x12\x03\x14\x08\x8F\x50\x13\x87\x5A\xC6\x56\x39\x8D\x8A\x2E\xD1\x9D\x2A\x85\xC8\xED\xD3\xEC\x2A\xEF" 924 + 925 + let g_x = 926 + "\xAA\x87\xCA\x22\xBE\x8B\x05\x37\x8E\xB1\xC7\x1E\xF3\x20\xAD\x74\x6E\x1D\x3B\x62\x8B\xA7\x9B\x98\x59\xF7\x41\xE0\x82\x54\x2A\x38\x55\x02\xF2\x5D\xBF\x55\x29\x6C\x3A\x54\x5E\x38\x72\x76\x0A\xB7" 927 + 861 928 let g_y = 862 - "\x36\x17\xde\x4a\x96\x26\x2c\x6f\x5d\x9e\x98\xbf\x92\x92\xdc\x29\xf8\xf4\x1d\xbd\x28\x9a\x14\x7c\xe9\xda\x31\x13\xb5\xf0\xb8\xc0\x0a\x60\xb1\xce\x1d\x7e\x81\x9d\x7a\x43\x1d\x7c\x90\xea\x0e\x5f" 863 - let p = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF" 864 - let n = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC7\x63\x4D\x81\xF4\x37\x2D\xDF\x58\x1A\x0D\xB2\x48\xB0\xA7\x7A\xEC\xEC\x19\x6A\xCC\xC5\x29\x73" 865 - let pident = "\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xBF\xFF\xFF\xFF\xC0\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00" |> rev_string (* (Params.p + 1) / 4*) 929 + "\x36\x17\xde\x4a\x96\x26\x2c\x6f\x5d\x9e\x98\xbf\x92\x92\xdc\x29\xf8\xf4\x1d\xbd\x28\x9a\x14\x7c\xe9\xda\x31\x13\xb5\xf0\xb8\xc0\x0a\x60\xb1\xce\x1d\x7e\x81\x9d\x7a\x43\x1d\x7c\x90\xea\x0e\x5f" 930 + 931 + let p = 932 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF" 933 + 934 + let n = 935 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC7\x63\x4D\x81\xF4\x37\x2D\xDF\x58\x1A\x0D\xB2\x48\xB0\xA7\x7A\xEC\xEC\x19\x6A\xCC\xC5\x29\x73" 936 + 937 + let pident = 938 + "\x3F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xBF\xFF\xFF\xFF\xC0\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00" 939 + |> rev_string (* (Params.p + 1) / 4*) 940 + 866 941 let byte_length = 48 867 942 let bit_length = 384 868 943 let fe_length = 48 ··· 870 945 end 871 946 872 947 module Foreign = struct 873 - external mul : out_field_element -> field_element -> field_element -> unit = "mc_p384_mul" [@@noalloc] 874 - external sub : out_field_element -> field_element -> field_element -> unit = "mc_p384_sub" [@@noalloc] 875 - external add : out_field_element -> field_element -> field_element -> unit = "mc_p384_add" [@@noalloc] 876 - external to_montgomery : out_field_element -> field_element -> unit = "mc_p384_to_montgomery" [@@noalloc] 877 - external from_octets : out_field_element -> string -> unit = "mc_p384_from_bytes" [@@noalloc] 948 + external mul : out_field_element -> field_element -> field_element -> unit 949 + = "mc_p384_mul" 950 + [@@noalloc] 951 + 952 + external sub : out_field_element -> field_element -> field_element -> unit 953 + = "mc_p384_sub" 954 + [@@noalloc] 955 + 956 + external add : out_field_element -> field_element -> field_element -> unit 957 + = "mc_p384_add" 958 + [@@noalloc] 959 + 960 + external to_montgomery : out_field_element -> field_element -> unit 961 + = "mc_p384_to_montgomery" 962 + [@@noalloc] 963 + 964 + external from_octets : out_field_element -> string -> unit 965 + = "mc_p384_from_bytes" 966 + [@@noalloc] 967 + 878 968 external set_one : out_field_element -> unit = "mc_p384_set_one" [@@noalloc] 879 969 external nz : field_element -> bool = "mc_p384_nz" [@@noalloc] 880 - external sqr : out_field_element -> field_element -> unit = "mc_p384_sqr" [@@noalloc] 881 - external from_montgomery : out_field_element -> field_element -> unit = "mc_p384_from_montgomery" [@@noalloc] 882 - external to_octets : bytes -> field_element -> unit = "mc_p384_to_bytes" [@@noalloc] 883 - external inv : out_field_element -> field_element -> unit = "mc_p384_inv" [@@noalloc] 884 - external select_c : out_field_element -> bool -> field_element -> field_element -> unit = "mc_p384_select" [@@noalloc] 885 - external double_c : out_point -> point -> unit = "mc_p384_point_double" [@@noalloc] 886 - external add_c : out_point -> point -> point -> unit = "mc_p384_point_add" [@@noalloc] 887 - external scalar_mult_base_c : out_point -> string -> unit = "mc_p384_scalar_mult_base" [@@noalloc] 970 + 971 + external sqr : out_field_element -> field_element -> unit = "mc_p384_sqr" 972 + [@@noalloc] 973 + 974 + external from_montgomery : out_field_element -> field_element -> unit 975 + = "mc_p384_from_montgomery" 976 + [@@noalloc] 977 + 978 + external to_octets : bytes -> field_element -> unit = "mc_p384_to_bytes" 979 + [@@noalloc] 980 + 981 + external inv : out_field_element -> field_element -> unit = "mc_p384_inv" 982 + [@@noalloc] 983 + 984 + external select_c : 985 + out_field_element -> bool -> field_element -> field_element -> unit 986 + = "mc_p384_select" 987 + [@@noalloc] 988 + 989 + external double_c : out_point -> point -> unit = "mc_p384_point_double" 990 + [@@noalloc] 991 + 992 + external add_c : out_point -> point -> point -> unit = "mc_p384_point_add" 993 + [@@noalloc] 994 + 995 + external scalar_mult_base_c : out_point -> string -> unit 996 + = "mc_p384_scalar_mult_base" 997 + [@@noalloc] 888 998 end 889 999 890 1000 module Foreign_n = struct 891 - external mul : out_field_element -> field_element -> field_element -> unit = "mc_np384_mul" [@@noalloc] 892 - external add : out_field_element -> field_element -> field_element -> unit = "mc_np384_add" [@@noalloc] 893 - external inv : out_field_element -> field_element -> unit = "mc_np384_inv" [@@noalloc] 1001 + external mul : out_field_element -> field_element -> field_element -> unit 1002 + = "mc_np384_mul" 1003 + [@@noalloc] 1004 + 1005 + external add : out_field_element -> field_element -> field_element -> unit 1006 + = "mc_np384_add" 1007 + [@@noalloc] 1008 + 1009 + external inv : out_field_element -> field_element -> unit = "mc_np384_inv" 1010 + [@@noalloc] 1011 + 894 1012 external one : out_field_element -> unit = "mc_np384_one" [@@noalloc] 895 - external from_bytes : out_field_element -> string -> unit = "mc_np384_from_bytes" [@@noalloc] 896 - external to_bytes : bytes -> field_element -> unit = "mc_np384_to_bytes" [@@noalloc] 897 - external from_montgomery : out_field_element -> field_element -> unit = "mc_np384_from_montgomery" [@@noalloc] 898 - external to_montgomery : out_field_element -> field_element -> unit = "mc_np384_to_montgomery" [@@noalloc] 1013 + 1014 + external from_bytes : out_field_element -> string -> unit 1015 + = "mc_np384_from_bytes" 1016 + [@@noalloc] 1017 + 1018 + external to_bytes : bytes -> field_element -> unit = "mc_np384_to_bytes" 1019 + [@@noalloc] 1020 + 1021 + external from_montgomery : out_field_element -> field_element -> unit 1022 + = "mc_np384_from_montgomery" 1023 + [@@noalloc] 1024 + 1025 + external to_montgomery : out_field_element -> field_element -> unit 1026 + = "mc_np384_to_montgomery" 1027 + [@@noalloc] 899 1028 end 900 1029 901 - module P = Make_point_ops(Params)(Foreign) 902 - module S = Make_scalar(Params)(P) 903 - module Dh = Make_dh(Params)(P)(S) 904 - module Fn = Make_Fn(Params)(Foreign_n) 905 - module Dsa = Make_dsa(Params)(Fn)(P)(S)(Digestif.SHA384) 906 - module Point = Make_point(P)(S) 1030 + module P = Make_point_ops (Params) (Foreign) 1031 + module S = Make_scalar (Params) (P) 1032 + module Dh = Make_dh (Params) (P) (S) 1033 + module Fn = Make_Fn (Params) (Foreign_n) 1034 + module Dsa = Make_dsa (Params) (Fn) (P) (S) (Digestif.SHA384) 1035 + module Point = Make_point (P) (S) 907 1036 end 908 1037 909 1038 module P521 : Dh_dsa = struct 910 1039 module Params = struct 911 - let a = "\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC" 912 - let b = "\x00\x51\x95\x3E\xB9\x61\x8E\x1C\x9A\x1F\x92\x9A\x21\xA0\xB6\x85\x40\xEE\xA2\xDA\x72\x5B\x99\xB3\x15\xF3\xB8\xB4\x89\x91\x8E\xF1\x09\xE1\x56\x19\x39\x51\xEC\x7E\x93\x7B\x16\x52\xC0\xBD\x3B\xB1\xBF\x07\x35\x73\xDF\x88\x3D\x2C\x34\xF1\xEF\x45\x1F\xD4\x6B\x50\x3F\x00" 1040 + let a = 1041 + "\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC" 1042 + 1043 + let b = 1044 + "\x00\x51\x95\x3E\xB9\x61\x8E\x1C\x9A\x1F\x92\x9A\x21\xA0\xB6\x85\x40\xEE\xA2\xDA\x72\x5B\x99\xB3\x15\xF3\xB8\xB4\x89\x91\x8E\xF1\x09\xE1\x56\x19\x39\x51\xEC\x7E\x93\x7B\x16\x52\xC0\xBD\x3B\xB1\xBF\x07\x35\x73\xDF\x88\x3D\x2C\x34\xF1\xEF\x45\x1F\xD4\x6B\x50\x3F\x00" 1045 + 913 1046 let g_x = 914 - "\x00\xC6\x85\x8E\x06\xB7\x04\x04\xE9\xCD\x9E\x3E\xCB\x66\x23\x95\xB4\x42\x9C\x64\x81\x39\x05\x3F\xB5\x21\xF8\x28\xAF\x60\x6B\x4D\x3D\xBA\xA1\x4B\x5E\x77\xEF\xE7\x59\x28\xFE\x1D\xC1\x27\xA2\xFF\xA8\xDE\x33\x48\xB3\xC1\x85\x6A\x42\x9B\xF9\x7E\x7E\x31\xC2\xE5\xBD\x66" 1047 + "\x00\xC6\x85\x8E\x06\xB7\x04\x04\xE9\xCD\x9E\x3E\xCB\x66\x23\x95\xB4\x42\x9C\x64\x81\x39\x05\x3F\xB5\x21\xF8\x28\xAF\x60\x6B\x4D\x3D\xBA\xA1\x4B\x5E\x77\xEF\xE7\x59\x28\xFE\x1D\xC1\x27\xA2\xFF\xA8\xDE\x33\x48\xB3\xC1\x85\x6A\x42\x9B\xF9\x7E\x7E\x31\xC2\xE5\xBD\x66" 1048 + 915 1049 let g_y = 916 - "\x01\x18\x39\x29\x6a\x78\x9a\x3b\xc0\x04\x5c\x8a\x5f\xb4\x2c\x7d\x1b\xd9\x98\xf5\x44\x49\x57\x9b\x44\x68\x17\xaf\xbd\x17\x27\x3e\x66\x2c\x97\xee\x72\x99\x5e\xf4\x26\x40\xc5\x50\xb9\x01\x3f\xad\x07\x61\x35\x3c\x70\x86\xa2\x72\xc2\x40\x88\xbe\x94\x76\x9f\xd1\x66\x50" 917 - let p = "\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 918 - let n = "\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFA\x51\x86\x87\x83\xBF\x2F\x96\x6B\x7F\xCC\x01\x48\xF7\x09\xA5\xD0\x3B\xB5\xC9\xB8\x89\x9C\x47\xAE\xBB\x6F\xB7\x1E\x91\x38\x64\x09" 919 - let pident = "\x01\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" |> rev_string 1050 + "\x01\x18\x39\x29\x6a\x78\x9a\x3b\xc0\x04\x5c\x8a\x5f\xb4\x2c\x7d\x1b\xd9\x98\xf5\x44\x49\x57\x9b\x44\x68\x17\xaf\xbd\x17\x27\x3e\x66\x2c\x97\xee\x72\x99\x5e\xf4\x26\x40\xc5\x50\xb9\x01\x3f\xad\x07\x61\x35\x3c\x70\x86\xa2\x72\xc2\x40\x88\xbe\x94\x76\x9f\xd1\x66\x50" 1051 + 1052 + let p = 1053 + "\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 1054 + 1055 + let n = 1056 + "\x01\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFA\x51\x86\x87\x83\xBF\x2F\x96\x6B\x7F\xCC\x01\x48\xF7\x09\xA5\xD0\x3B\xB5\xC9\xB8\x89\x9C\x47\xAE\xBB\x6F\xB7\x1E\x91\x38\x64\x09" 1057 + 1058 + let pident = 1059 + "\x01\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" 1060 + |> rev_string 1061 + 920 1062 let byte_length = 66 921 1063 let bit_length = 521 922 - let fe_length = if Sys.word_size == 64 then 72 else 68 (* TODO: is this congruent with C code? *) 1064 + 1065 + let fe_length = 1066 + if Sys.word_size == 64 then 72 1067 + else 68 (* TODO: is this congruent with C code? *) 1068 + 923 1069 let first_byte_bits = Some 0x01 924 1070 end 925 1071 926 1072 module Foreign = struct 927 - external mul : out_field_element -> field_element -> field_element -> unit = "mc_p521_mul" [@@noalloc] 928 - external sub : out_field_element -> field_element -> field_element -> unit = "mc_p521_sub" [@@noalloc] 929 - external add : out_field_element -> field_element -> field_element -> unit = "mc_p521_add" [@@noalloc] 930 - external to_montgomery : out_field_element -> field_element -> unit = "mc_p521_to_montgomery" [@@noalloc] 931 - external from_octets : out_field_element -> string -> unit = "mc_p521_from_bytes" [@@noalloc] 1073 + external mul : out_field_element -> field_element -> field_element -> unit 1074 + = "mc_p521_mul" 1075 + [@@noalloc] 1076 + 1077 + external sub : out_field_element -> field_element -> field_element -> unit 1078 + = "mc_p521_sub" 1079 + [@@noalloc] 1080 + 1081 + external add : out_field_element -> field_element -> field_element -> unit 1082 + = "mc_p521_add" 1083 + [@@noalloc] 1084 + 1085 + external to_montgomery : out_field_element -> field_element -> unit 1086 + = "mc_p521_to_montgomery" 1087 + [@@noalloc] 1088 + 1089 + external from_octets : out_field_element -> string -> unit 1090 + = "mc_p521_from_bytes" 1091 + [@@noalloc] 1092 + 932 1093 external set_one : out_field_element -> unit = "mc_p521_set_one" [@@noalloc] 933 1094 external nz : field_element -> bool = "mc_p521_nz" [@@noalloc] 934 - external sqr : out_field_element -> field_element -> unit = "mc_p521_sqr" [@@noalloc] 935 - external from_montgomery : out_field_element -> field_element -> unit = "mc_p521_from_montgomery" [@@noalloc] 936 - external to_octets : bytes -> field_element -> unit = "mc_p521_to_bytes" [@@noalloc] 937 - external inv : out_field_element -> field_element -> unit = "mc_p521_inv" [@@noalloc] 938 - external select_c : out_field_element -> bool -> field_element -> field_element -> unit = "mc_p521_select" [@@noalloc] 939 - external double_c : out_point -> point -> unit = "mc_p521_point_double" [@@noalloc] 940 - external add_c : out_point -> point -> point -> unit = "mc_p521_point_add" [@@noalloc] 941 - external scalar_mult_base_c : out_point -> string -> unit = "mc_p521_scalar_mult_base" [@@noalloc] 1095 + 1096 + external sqr : out_field_element -> field_element -> unit = "mc_p521_sqr" 1097 + [@@noalloc] 1098 + 1099 + external from_montgomery : out_field_element -> field_element -> unit 1100 + = "mc_p521_from_montgomery" 1101 + [@@noalloc] 1102 + 1103 + external to_octets : bytes -> field_element -> unit = "mc_p521_to_bytes" 1104 + [@@noalloc] 1105 + 1106 + external inv : out_field_element -> field_element -> unit = "mc_p521_inv" 1107 + [@@noalloc] 1108 + 1109 + external select_c : 1110 + out_field_element -> bool -> field_element -> field_element -> unit 1111 + = "mc_p521_select" 1112 + [@@noalloc] 1113 + 1114 + external double_c : out_point -> point -> unit = "mc_p521_point_double" 1115 + [@@noalloc] 1116 + 1117 + external add_c : out_point -> point -> point -> unit = "mc_p521_point_add" 1118 + [@@noalloc] 1119 + 1120 + external scalar_mult_base_c : out_point -> string -> unit 1121 + = "mc_p521_scalar_mult_base" 1122 + [@@noalloc] 942 1123 end 943 1124 944 1125 module Foreign_n = struct 945 - external mul : out_field_element -> field_element -> field_element -> unit = "mc_np521_mul" [@@noalloc] 946 - external add : out_field_element -> field_element -> field_element -> unit = "mc_np521_add" [@@noalloc] 947 - external inv : out_field_element -> field_element -> unit = "mc_np521_inv" [@@noalloc] 1126 + external mul : out_field_element -> field_element -> field_element -> unit 1127 + = "mc_np521_mul" 1128 + [@@noalloc] 1129 + 1130 + external add : out_field_element -> field_element -> field_element -> unit 1131 + = "mc_np521_add" 1132 + [@@noalloc] 1133 + 1134 + external inv : out_field_element -> field_element -> unit = "mc_np521_inv" 1135 + [@@noalloc] 1136 + 948 1137 external one : out_field_element -> unit = "mc_np521_one" [@@noalloc] 949 - external from_bytes : out_field_element -> string -> unit = "mc_np521_from_bytes" [@@noalloc] 950 - external to_bytes : bytes -> field_element -> unit = "mc_np521_to_bytes" [@@noalloc] 951 - external from_montgomery : out_field_element -> field_element -> unit = "mc_np521_from_montgomery" [@@noalloc] 952 - external to_montgomery : out_field_element -> field_element -> unit = "mc_np521_to_montgomery" [@@noalloc] 1138 + 1139 + external from_bytes : out_field_element -> string -> unit 1140 + = "mc_np521_from_bytes" 1141 + [@@noalloc] 1142 + 1143 + external to_bytes : bytes -> field_element -> unit = "mc_np521_to_bytes" 1144 + [@@noalloc] 1145 + 1146 + external from_montgomery : out_field_element -> field_element -> unit 1147 + = "mc_np521_from_montgomery" 1148 + [@@noalloc] 1149 + 1150 + external to_montgomery : out_field_element -> field_element -> unit 1151 + = "mc_np521_to_montgomery" 1152 + [@@noalloc] 953 1153 end 954 1154 955 - module P = Make_point_ops(Params)(Foreign) 956 - module S = Make_scalar(Params)(P) 957 - module Dh = Make_dh(Params)(P)(S) 958 - module Fn = Make_Fn(Params)(Foreign_n) 959 - module Dsa = Make_dsa(Params)(Fn)(P)(S)(Digestif.SHA512) 960 - module Point = Make_point(P)(S) 1155 + module P = Make_point_ops (Params) (Foreign) 1156 + module S = Make_scalar (Params) (P) 1157 + module Dh = Make_dh (Params) (P) (S) 1158 + module Fn = Make_Fn (Params) (Foreign_n) 1159 + module Dsa = Make_dsa (Params) (Fn) (P) (S) (Digestif.SHA512) 1160 + module Point = Make_point (P) (S) 961 1161 end 962 1162 963 1163 module X25519 = struct 964 1164 (* RFC 7748 *) 965 - external x25519_scalar_mult_generic : bytes -> string -> string -> unit = "mc_x25519_scalar_mult_generic" [@@noalloc] 1165 + external x25519_scalar_mult_generic : bytes -> string -> string -> unit 1166 + = "mc_x25519_scalar_mult_generic" 1167 + [@@noalloc] 966 1168 967 1169 let key_len = 32 968 1170 ··· 974 1176 type secret = string 975 1177 976 1178 let basepoint = String.init key_len (function 0 -> '\009' | _ -> '\000') 977 - 978 1179 let public priv = scalar_mult priv basepoint 979 1180 980 1181 let gen_key ?compress:_ ?g () = 981 1182 let secret = Crypto_rng.generate ?g key_len in 982 - secret, public secret 1183 + (secret, public secret) 983 1184 984 1185 let secret_of_octets ?compress:_ s = 985 - if String.length s = key_len then 986 - Ok (s, public s) 987 - else 988 - Error `Invalid_length 1186 + if String.length s = key_len then Ok (s, public s) 1187 + else Error `Invalid_length 989 1188 990 1189 let secret_to_octets s = s 991 1190 ··· 997 1196 if String.length public = key_len then 998 1197 let res = scalar_mult secret public in 999 1198 if is_zero res then Error `Low_order else Ok res 1000 - else 1001 - Error `Invalid_length 1199 + else Error `Invalid_length 1002 1200 end 1003 1201 1004 1202 module Ed25519 = struct 1005 - external scalar_mult_base_to_bytes : bytes -> string -> unit = "mc_25519_scalar_mult_base" [@@noalloc] 1203 + external scalar_mult_base_to_bytes : bytes -> string -> unit 1204 + = "mc_25519_scalar_mult_base" 1205 + [@@noalloc] 1206 + 1006 1207 external reduce_l : bytes -> unit = "mc_25519_reduce_l" [@@noalloc] 1007 - external muladd : bytes -> string -> string -> string -> unit = "mc_25519_muladd" [@@noalloc] 1008 - external double_scalar_mult : bytes -> string -> string -> string -> bool = "mc_25519_double_scalar_mult" [@@noalloc] 1208 + 1209 + external muladd : bytes -> string -> string -> string -> unit 1210 + = "mc_25519_muladd" 1211 + [@@noalloc] 1212 + 1213 + external double_scalar_mult : bytes -> string -> string -> string -> bool 1214 + = "mc_25519_double_scalar_mult" 1215 + [@@noalloc] 1216 + 1009 1217 external pub_ok : string -> bool = "mc_25519_pub_ok" [@@noalloc] 1010 1218 1011 1219 let key_len = 32 ··· 1023 1231 let double_scalar_mult a b c = 1024 1232 let tmp = Bytes.create key_len in 1025 1233 let s = double_scalar_mult tmp a b c in 1026 - s, Bytes.unsafe_to_string tmp 1234 + (s, Bytes.unsafe_to_string tmp) 1027 1235 1028 1236 type pub = string 1029 - 1030 1237 type priv = string 1031 1238 1032 1239 let sha512 datas = ··· 1043 1250 let h = sha512 [ secret ] in 1044 1251 (* step 2 *) 1045 1252 let s, rest = 1046 - Bytes.sub h 0 key_len, 1047 - Bytes.unsafe_to_string (Bytes.sub h key_len (Bytes.length h - key_len)) 1253 + ( Bytes.sub h 0 key_len, 1254 + Bytes.unsafe_to_string (Bytes.sub h key_len (Bytes.length h - key_len)) 1255 + ) 1048 1256 in 1049 - Bytes.set_uint8 s 0 ((Bytes.get_uint8 s 0) land 248); 1050 - Bytes.set_uint8 s 31 (((Bytes.get_uint8 s 31) land 127) lor 64); 1257 + Bytes.set_uint8 s 0 (Bytes.get_uint8 s 0 land 248); 1258 + Bytes.set_uint8 s 31 (Bytes.get_uint8 s 31 land 127 lor 64); 1051 1259 let s = Bytes.unsafe_to_string s in 1052 1260 (* step 3 and 4 *) 1053 1261 let public = scalar_mult_base_to_bytes s in 1054 - public, (s, rest) 1262 + (public, (s, rest)) 1055 1263 1056 1264 let pub_of_priv secret = fst (public secret) 1057 1265 ··· 1062 1270 1063 1271 let pub_of_octets buf = 1064 1272 if String.length buf = key_len then 1065 - if pub_ok buf then 1066 - Ok buf 1067 - else 1068 - Error `Not_on_curve 1069 - else 1070 - Error `Invalid_length 1273 + if pub_ok buf then Ok buf else Error `Not_on_curve 1274 + else Error `Invalid_length 1071 1275 1072 1276 let pub_to_octets pub = pub 1073 1277 1074 1278 let generate ?g () = 1075 1279 let secret = Crypto_rng.generate ?g key_len in 1076 - secret, pub_of_priv secret 1280 + (secret, pub_of_priv secret) 1077 1281 1078 1282 let sign ~key msg = 1079 1283 (* section 5.1.6 *) ··· 1082 1286 reduce_l r; 1083 1287 let r = Bytes.unsafe_to_string r in 1084 1288 let r_big = scalar_mult_base_to_bytes r in 1085 - let k = sha512 [ r_big; pub; msg] in 1289 + let k = sha512 [ r_big; pub; msg ] in 1086 1290 reduce_l k; 1087 1291 let k = Bytes.unsafe_to_string k in 1088 1292 let s_out = muladd k s r in 1089 1293 let res = Bytes.create (key_len + key_len) in 1090 - Bytes.unsafe_blit_string r_big 0 res 0 key_len ; 1091 - Bytes.unsafe_blit_string s_out 0 res key_len key_len ; 1294 + Bytes.unsafe_blit_string r_big 0 res 0 key_len; 1295 + Bytes.unsafe_blit_string s_out 0 res key_len key_len; 1092 1296 Bytes.unsafe_to_string res 1093 1297 1094 1298 let verify ~key signature ~msg = 1095 1299 (* section 5.1.7 *) 1096 1300 if String.length signature = 2 * key_len then 1097 1301 let r, s = 1098 - String.sub signature 0 key_len, 1099 - String.sub signature key_len key_len 1302 + (String.sub signature 0 key_len, String.sub signature key_len key_len) 1100 1303 in 1101 1304 let s_smaller_l = 1102 1305 (* check s within 0 <= s < L *) ··· 1108 1311 String.equal s'' s' 1109 1312 in 1110 1313 if s_smaller_l then begin 1111 - let k = sha512 [ r ; key ; msg ] in 1314 + let k = sha512 [ r; key; msg ] in 1112 1315 reduce_l k; 1113 1316 let k = Bytes.unsafe_to_string k in 1114 1317 let success, r' = double_scalar_mult k key s in 1115 1318 success && String.equal r r' 1116 - end else 1117 - false 1118 - else 1119 - false 1319 + end 1320 + else false 1321 + else false 1120 1322 end
+33 -40
ec/crypto_ec.mli
··· 6 6 7 7 The arithmetic operations uses code generated by 8 8 {{:https://github.com/mit-plv/fiat-crypto}fiat-crypto} which is proven to 9 - consume a constant amount of time, independent of the input values. 10 - *) 9 + consume a constant amount of time, independent of the input values. *) 11 10 12 - type error = [ 13 - | `Invalid_range 11 + type error = 12 + [ `Invalid_range 14 13 | `Invalid_format 15 14 | `Invalid_length 16 15 | `Not_on_curve 17 16 | `At_infinity 18 - | `Low_order 19 - ] 17 + | `Low_order ] 20 18 (** The type for errors. *) 21 19 22 20 val pp_error : Format.formatter -> error -> unit ··· 27 25 28 26 (** Diffie-Hellman key exchange. *) 29 27 module type Dh = sig 30 - 31 28 type secret 32 29 (** Type for private keys. *) 33 30 34 - val secret_of_octets : ?compress:bool -> string -> 35 - (secret * string, error) result 31 + val secret_of_octets : 32 + ?compress:bool -> string -> (secret * string, error) result 36 33 (** [secret_of_octets ~compress secret] decodes the provided buffer as 37 - {!secret}. If [compress] is provided and [true] (defaults to [false]), 38 - the shared part will be compressed. May result in an error if the buffer 39 - had an invalid length or was not in bounds. *) 34 + {!secret}. If [compress] is provided and [true] (defaults to [false]), the 35 + shared part will be compressed. May result in an error if the buffer had 36 + an invalid length or was not in bounds. *) 40 37 41 38 val secret_to_octets : secret -> string 42 39 (** [secret_to_octets secret] encodes the provided secret into a freshly 43 40 allocated buffer. *) 44 41 45 - val gen_key : ?compress:bool -> ?g:Crypto_rng.g -> unit -> 46 - secret * string 42 + val gen_key : ?compress:bool -> ?g:Crypto_rng.g -> unit -> secret * string 47 43 (** [gen_key ~compress ~g ()] generates a private and a public key for 48 44 Ephemeral Diffie-Hellman. If [compress] is provided and [true] (defaults 49 45 to [false]), the shared part will be compressed. The returned key pair ··· 57 53 (** [key_exchange secret received_public_key] performs Diffie-Hellman key 58 54 exchange using your secret and the data received from the other party. 59 55 Returns the shared secret or an error if the received data is wrongly 60 - encoded, doesn't represent a point on the curve or represent the point 61 - at infinity. 56 + encoded, doesn't represent a point on the curve or represent the point at 57 + infinity. 62 58 63 59 The shared secret is returned as is i.e. not stripped from leading 0x00 64 60 bytes. ··· 69 65 70 66 (** Digital signature algorithm. *) 71 67 module type Dsa = sig 72 - 73 68 type priv 74 69 (** The type for private keys. *) 75 70 ··· 96 91 provided data is invalid, an error is returned. *) 97 92 98 93 val pub_to_octets : ?compress:bool -> pub -> string 99 - (** [pub_to_octets ~compress p] encodes the public key [p] into a buffer. 100 - If [compress] is provided and [true] (default [false]), the compressed 94 + (** [pub_to_octets ~compress p] encodes the public key [p] into a buffer. If 95 + [compress] is provided and [true] (default [false]), the compressed 101 96 representation is returned. *) 102 97 103 98 (** {2 Deriving the public key} *) ··· 113 108 (** {2 Cryptographic operations} *) 114 109 115 110 val sign : key:priv -> ?k:string -> string -> string * string 116 - (** [sign ~key ~k digest] signs the message [digest] using the private 117 - [key]. The [digest] is not processed further - it should be the hash of 118 - the message to sign. If [k] is not provided, it is computed using the 119 - deterministic construction from RFC 6979. The result is a pair of [r] 120 - and [s]. 111 + (** [sign ~key ~k digest] signs the message [digest] using the private [key]. 112 + The [digest] is not processed further - it should be the hash of the 113 + message to sign. If [k] is not provided, it is computed using the 114 + deterministic construction from RFC 6979. The result is a pair of [r] and 115 + [s]. 121 116 122 117 Warning: there {{:https://www.hertzbleed.com/2h2b.pdf}are} 123 118 {{:https://www.hertzbleed.com/hertzbleed.pdf}attacks} that recover the ··· 137 132 (** [K_gen] can be instantiated over a hashing module to obtain an RFC6979 138 133 compliant [k]-generator for that hash. *) 139 134 module K_gen (H : Digestif.S) : sig 140 - 141 135 val generate : key:priv -> string -> string 142 - (** [generate ~key digest] deterministically takes the given private key 143 - and message digest to a [k] suitable for seeding the signing process. *) 136 + (** [generate ~key digest] deterministically takes the given private key and 137 + message digest to a [k] suitable for seeding the signing process. *) 144 138 end 145 139 146 140 (** {2 Misc} *) ··· 168 162 SEC 1 format. Returns an error if the point is not on the curve. *) 169 163 170 164 val to_octets : ?compress:bool -> point -> string 171 - (** [to_octets ~compress point] encodes [point] to SEC 1 format. If 172 - [compress] is [true] (default [false]), the compressed format is used. *) 165 + (** [to_octets ~compress point] encodes [point] to SEC 1 format. If [compress] 166 + is [true] (default [false]), the compressed format is used. *) 173 167 174 168 val scalar_of_octets : string -> (scalar, error) result 175 169 (** [scalar_of_octets buf] decodes a scalar from [buf]. Returns an error if ··· 191 185 192 186 (** Elliptic curve with Diffie-Hellman and DSA. *) 193 187 module type Dh_dsa = sig 194 - 188 + module Dh : Dh 195 189 (** Diffie-Hellman key exchange. *) 196 - module Dh : Dh 197 190 198 - (** Digital signature algorithm. *) 199 191 module Dsa : Dsa 192 + (** Digital signature algorithm. *) 200 193 201 - (** Low-level point arithmetic. *) 202 194 module Point : Point 195 + (** Low-level point arithmetic. *) 203 196 end 204 197 198 + module P256 : Dh_dsa 205 199 (** The NIST P-256 curve, also known as SECP256R1. *) 206 - module P256 : Dh_dsa 207 200 208 - (** The NIST P-384 curve, also known as SECP384R1. *) 209 201 module P384 : Dh_dsa 202 + (** The NIST P-384 curve, also known as SECP384R1. *) 210 203 211 - (** The NIST P-521 curve, also known as SECP521R1. *) 212 204 module P521 : Dh_dsa 205 + (** The NIST P-521 curve, also known as SECP521R1. *) 213 206 207 + module X25519 : Dh 214 208 (** Curve 25519 Diffie-Hellman, also known as X25519. *) 215 - module X25519 : Dh 216 209 217 210 (** Curve 25519 DSA, also known as Ed25519. *) 218 211 module Ed25519 : sig ··· 255 248 result is the concatenation of [r] and [s], as specified in RFC 8032. *) 256 249 257 250 val verify : key:pub -> string -> msg:string -> bool 258 - (** [verify ~key signature msg] verifies the [signature] on the message 259 - [msg] with the public [key]. The return value is [true] if verification 260 - was successful, [false] otherwise. *) 251 + (** [verify ~key signature msg] verifies the [signature] on the message [msg] 252 + with the public [key]. The return value is [true] if verification was 253 + successful, [false] otherwise. *) 261 254 end
+10 -5
fuzz/fuzz_crypto.ml
··· 28 28 let pt_len = String.length plaintext in 29 29 let padded_len = 30 30 if pt_len = 0 then aes_block_size 31 - else ((pt_len + aes_block_size - 1) / aes_block_size) * aes_block_size 31 + else (pt_len + aes_block_size - 1) / aes_block_size * aes_block_size 32 32 in 33 33 let padded_pt = 34 34 if pt_len >= padded_len then String.sub plaintext 0 padded_len ··· 50 50 let pt_len = String.length plaintext in 51 51 let padded_len = 52 52 if pt_len = 0 then aes_block_size 53 - else ((pt_len + aes_block_size - 1) / aes_block_size) * aes_block_size 53 + else (pt_len + aes_block_size - 1) / aes_block_size * aes_block_size 54 54 in 55 55 let padded_pt = 56 56 if pt_len >= padded_len then String.sub plaintext 0 padded_len ··· 85 85 (* GCM nonce should be 12 bytes for optimal performance *) 86 86 let nonce = make_key 12 nonce_input in 87 87 let adata = "" in 88 - let result = Crypto.AES.GCM.authenticate_encrypt ~key ~nonce ~adata plaintext in 88 + let result = 89 + Crypto.AES.GCM.authenticate_encrypt ~key ~nonce ~adata plaintext 90 + in 89 91 match Crypto.AES.GCM.authenticate_decrypt ~key ~nonce ~adata result with 90 - | Some decrypted -> check_eq ~pp:Format.pp_print_string plaintext decrypted 92 + | Some decrypted -> 93 + check_eq ~pp:Format.pp_print_string plaintext decrypted 91 94 | None -> fail "GCM decryption failed") 92 95 valid_aes_key_sizes 93 96 ··· 105 108 let result = 106 109 Crypto.AES.CCM16.authenticate_encrypt ~key ~nonce ~adata plaintext 107 110 in 108 - match Crypto.AES.CCM16.authenticate_decrypt ~key ~nonce ~adata result with 111 + match 112 + Crypto.AES.CCM16.authenticate_decrypt ~key ~nonce ~adata result 113 + with 109 114 | Some decrypted -> 110 115 check_eq ~pp:Format.pp_print_string plaintext decrypted 111 116 | None -> fail "CCM decryption failed")
+3 -2
pk/common.ml
··· 1 - let rec until p f = let r = f () in if p r then r else until p f 1 + let rec until p f = 2 + let r = f () in 3 + if p r then r else until p f 2 4 3 5 let guard p err = if p then Ok () else Error err 4 - 5 6 let ( let* ) = Result.bind
+198 -164
pk/crypto_pk.mli
··· 11 11 12 12 (** {b RSA} public-key cryptography algorithm. *) 13 13 module Rsa : sig 14 - 15 14 (** {1 Keys} 16 15 17 16 Messages are checked not to exceed the key size, and this is signalled via ··· 25 24 smaller than the modulus. *) 26 25 27 26 type pub = private { 28 - e : Z.t ; (** Public exponent *) 29 - n : Z.t ; (** Modulus *) 27 + e : Z.t; (** Public exponent *) 28 + n : Z.t; (** Modulus *) 30 29 } 31 30 (** The public portion of the key. *) 32 31 33 32 val pub : e:Z.t -> n:Z.t -> (pub, [> `Msg of string ]) result 34 - (** [pub ~e ~n] validates the public key: [1 < e < n], [n > 0], 35 - [is_odd n], and [numbits n >= 89] (a requirement for PKCS1 operations). *) 33 + (** [pub ~e ~n] validates the public key: [1 < e < n], [n > 0], [is_odd n], 34 + and [numbits n >= 89] (a requirement for PKCS1 operations). *) 36 35 37 36 type priv = private { 38 - e : Z.t ; (** Public exponent *) 39 - d : Z.t ; (** Private exponent *) 40 - n : Z.t ; (** Modulus ([p q])*) 41 - p : Z.t ; (** Prime factor [p] *) 42 - q : Z.t ; (** Prime factor [q] *) 43 - dp : Z.t ; (** [d mod (p-1)] *) 44 - dq : Z.t ; (** [d mod (q-1)] *) 45 - q' : Z.t ; (** [q^(-1) mod p] *) 37 + e : Z.t; (** Public exponent *) 38 + d : Z.t; (** Private exponent *) 39 + n : Z.t; (** Modulus ([p q])*) 40 + p : Z.t; (** Prime factor [p] *) 41 + q : Z.t; (** Prime factor [q] *) 42 + dp : Z.t; (** [d mod (p-1)] *) 43 + dq : Z.t; (** [d mod (q-1)] *) 44 + q' : Z.t; (** [q^(-1) mod p] *) 46 45 } 47 46 (** Full private key (two-factor version). 48 47 ··· 53 52 [dq], or re-generate the full private key using 54 53 {{!priv_of_primes}[priv_of_primes]}. *) 55 54 56 - val priv : e:Z.t -> d:Z.t -> n:Z.t -> p:Z.t -> q:Z.t -> dp:Z.t -> dq:Z.t -> 57 - q':Z.t -> (priv, [> `Msg of string ]) result 55 + val priv : 56 + e:Z.t -> 57 + d:Z.t -> 58 + n:Z.t -> 59 + p:Z.t -> 60 + q:Z.t -> 61 + dp:Z.t -> 62 + dq:Z.t -> 63 + q':Z.t -> 64 + (priv, [> `Msg of string ]) result 58 65 (** [priv ~e ~d ~n ~p ~q ~dp ~dq ~q'] validates the private key: [e, n] must 59 66 be a valid {!type-pub}, [p] and [q] valid prime numbers [> 0], [odd], 60 67 probabilistically prime, [p <> q], [n = p * q], [e] probabilistically 61 68 prime and coprime to both [p] and [q], [q' = q ^ -1 mod p], [1 < d < n], 62 - [dp = d mod (p - 1)], [dq = d mod (q - 1)], 63 - and [d = e ^ -1 mod (p - 1) (q - 1)]. *) 69 + [dp = d mod (p - 1)], [dq = d mod (q - 1)], and 70 + [d = e ^ -1 mod (p - 1) (q - 1)]. *) 64 71 65 72 val pub_bits : pub -> int 66 73 (** Bit-size of a public key. *) ··· 68 75 val priv_bits : priv -> int 69 76 (** Bit-size of a private key. *) 70 77 71 - val priv_of_primes : e:Z.t -> p:Z.t -> q:Z.t -> 78 + val priv_of_primes : 79 + e:Z.t -> p:Z.t -> q:Z.t -> (priv, [> `Msg of string ]) result 80 + (** [priv_of_primes ~e ~p ~q] is the {{!type-priv}private key} derived from 81 + the minimal description [(e, p, q)]. *) 82 + 83 + val priv_of_exp : 84 + ?g:Crypto_rng.g -> 85 + ?attempts:int -> 86 + e:Z.t -> 87 + d:Z.t -> 88 + n:Z.t -> 89 + unit -> 72 90 (priv, [> `Msg of string ]) result 73 - (** [priv_of_primes ~e ~p ~q] is the {{!type-priv}private key} derived from the 74 - minimal description [(e, p, q)]. *) 75 - 76 - val priv_of_exp : ?g:Crypto_rng.g -> ?attempts:int -> e:Z.t -> d:Z.t -> 77 - n:Z.t -> unit -> (priv, [> `Msg of string ]) result 78 91 (** [priv_of_exp ?g ?attempts ~e ~d n] is the unique {{!type-priv}private key} 79 92 characterized by the public ([e]) and private ([d]) exponents, and modulus 80 93 [n]. This operation uses a probabilistic process that can fail to recover ··· 85 98 to an unspecified number that yields a very high probability of recovering 86 99 valid keys. 87 100 88 - Note that no time masking is done for the computations in this function. *) 101 + Note that no time masking is done for the computations in this function. 102 + *) 89 103 90 104 val pub_of_priv : priv -> pub 91 105 (** Extract the public component from a private key. *) ··· 100 114 private key. Masking does not change the result, but it does change the 101 115 timing profile of the operation. 102 116 103 - {ul 104 - {- [`No] disables masking. It is slightly faster but it {b exposes the 105 - private key to timing-based attacks}.} 106 - {- [`Yes] uses random masking with the global RNG instance. This is 107 - the sane option.} 108 - {- [`Yes_with g] uses random masking with the generator [g].}} *) 117 + - [`No] disables masking. It is slightly faster but it 118 + {b exposes the private key to timing-based attacks}. 119 + - [`Yes] uses random masking with the global RNG instance. This is the 120 + sane option. 121 + - [`Yes_with g] uses random masking with the generator [g]. *) 109 122 110 123 val encrypt : key:pub -> string -> string 111 124 (** [encrypt key message] is the encrypted [message]. ··· 114 127 115 128 @raise Invalid_argument if [message] is [0x00] or [0x01]. *) 116 129 117 - val decrypt : ?crt_hardening:bool -> ?mask:mask -> key:priv -> 118 - string -> string 130 + val decrypt : 131 + ?crt_hardening:bool -> ?mask:mask -> key:priv -> string -> string 119 132 (** [decrypt ~crt_hardening ~mask key ciphertext] is the decrypted 120 133 [ciphertext], left-padded with [0x00] up to [key] size. 121 134 122 - [~crt_hardening] defaults to [false]. If [true] verifies that the 123 - result is correct. This is to counter Chinese remainder theorem attacks to 135 + [~crt_hardening] defaults to [false]. If [true] verifies that the result 136 + is correct. This is to counter Chinese remainder theorem attacks to 124 137 factorize primes. If the computed signature is incorrect, it is again 125 138 computed in the classical way (c ^ d mod n) without the Chinese remainder 126 139 theorem optimization. The deterministic {{!PKCS1.sign}PKCS1 signing}, ··· 133 146 (** {1 Key generation} *) 134 147 135 148 val generate : ?g:Crypto_rng.g -> ?e:Z.t -> bits:int -> unit -> priv 136 - (** [generate ~g ~e ~bits ()] is a new {{!type-priv}private key}. The new key is 137 - guaranteed to be well formed, see {!val-priv}. 149 + (** [generate ~g ~e ~bits ()] is a new {{!type-priv}private key}. The new key 150 + is guaranteed to be well formed, see {!val-priv}. 138 151 139 152 [e] defaults to [2^16+1]. 140 153 141 - {b Note} This process might diverge if there are no keys for the given 142 - bit size. This can happen when [bits] is extremely small. 154 + {b Note} This process might diverge if there are no keys for the given bit 155 + size. This can happen when [bits] is extremely small. 143 156 144 - @raise Invalid_argument if [e] is not a prime number (checked 145 - probabilistically) or not in the range [1 < e < 2^bits], or if 146 - [bits < 89] (as above, required for PKCS1 operations). *) 157 + @raise Invalid_argument 158 + if [e] is not a prime number (checked probabilistically) or not in the 159 + range [1 < e < 2^bits], or if [bits < 89] (as above, required for PKCS1 160 + operations). *) 147 161 148 162 (** {1 PKCS#1 padded modes} *) 149 163 150 164 (** {b PKCS v1.5} operations, as defined by {b PKCS #1 v1.5}. 151 165 152 166 For the operations that only add the raw padding, the key size must be at 153 - least 11 bytes larger than the message. For full {{!PKCS1.sign}signing}, the 154 - minimal key size varies according to the hash algorithm. In this case, the 155 - key size is [priv_bits key / 8], rounded up. *) 167 + least 11 bytes larger than the message. For full {{!PKCS1.sign}signing}, 168 + the minimal key size varies according to the hash algorithm. In this case, 169 + the key size is [priv_bits key / 8], rounded up. *) 156 170 module PKCS1 : sig 157 - 158 171 val encrypt : ?g:Crypto_rng.g -> key:pub -> string -> string 159 172 (** [encrypt g key message] is a PKCS1-padded (type 2) and encrypted 160 173 [message]. 161 174 162 175 @raise Insufficient_key (see {{!Insufficient_key}Insufficient_key}) *) 163 176 164 - val decrypt : ?crt_hardening:bool -> ?mask:mask -> key:priv -> 165 - string -> string option 166 - (** [decrypt ~crt_hardening ~mask ~key ciphertext] is [Some message] if 167 - the [ciphertext] was produced by the corresponding {{!encrypt}encrypt} 168 - operation, or [None] otherwise. [crt_hardening] defaults to 169 - [false]. *) 177 + val decrypt : 178 + ?crt_hardening:bool -> ?mask:mask -> key:priv -> string -> string option 179 + (** [decrypt ~crt_hardening ~mask ~key ciphertext] is [Some message] if the 180 + [ciphertext] was produced by the corresponding {{!encrypt}encrypt} 181 + operation, or [None] otherwise. [crt_hardening] defaults to [false]. *) 170 182 171 - val sig_encode : ?crt_hardening:bool -> ?mask:mask -> key:priv -> 172 - string -> string 173 - (** [sig_encode ~crt_hardening ~mask ~key message] is the PKCS1-padded 174 - (type 1) [message] signed by the [key]. [crt_hardening] defaults to 175 - [true] and verifies that the computed signature is correct. 183 + val sig_encode : 184 + ?crt_hardening:bool -> ?mask:mask -> key:priv -> string -> string 185 + (** [sig_encode ~crt_hardening ~mask ~key message] is the PKCS1-padded (type 186 + 1) [message] signed by the [key]. [crt_hardening] defaults to [true] and 187 + verifies that the computed signature is correct. 176 188 177 189 {b Note} This operation performs only the padding and RSA transformation 178 190 steps of the PKCS 1.5 signature. The full signature is implemented by ··· 181 193 @raise Insufficient_key (see {{!Insufficient_key}Insufficient_key}) *) 182 194 183 195 val sig_decode : key:pub -> string -> string option 184 - (** [sig_decode key signature] is [Some message] when the [signature] 185 - was produced with the given [key] as per {{!sig_encode}sig_encode}, or 196 + (** [sig_decode key signature] is [Some message] when the [signature] was 197 + produced with the given [key] as per {{!sig_encode}sig_encode}, or 186 198 [None] *) 187 199 188 - val min_key : [< Digestif.hash' > `MD5 `SHA1 `SHA224 `SHA256 `SHA384 `SHA512 ] -> int 200 + val min_key : 201 + [< Digestif.hash' > `MD5 `SHA1 `SHA224 `SHA256 `SHA384 `SHA512 ] -> int 189 202 (** [min_key hash] is the minimum key size required by {{!sign}[sign]}. *) 190 203 191 - val sign : ?crt_hardening:bool -> ?mask:mask -> 204 + val sign : 205 + ?crt_hardening:bool -> 206 + ?mask:mask -> 192 207 hash:[< Digestif.hash' > `MD5 `SHA1 `SHA224 `SHA256 `SHA384 `SHA512 ] -> 193 - key:priv -> string or_digest -> string 194 - (** [sign ~crt_hardening ~mask ~hash ~key message] is the PKCS 1.5 195 - signature of [message], signed by the [key], using the hash function 196 - [hash]. This is the full signature, with the ASN-encoded message digest 197 - as the payload. [crt_hardening] defaults to [true] and verifies that 198 - the computed signature is correct. 208 + key:priv -> 209 + string or_digest -> 210 + string 211 + (** [sign ~crt_hardening ~mask ~hash ~key message] is the PKCS 1.5 signature 212 + of [message], signed by the [key], using the hash function [hash]. This 213 + is the full signature, with the ASN-encoded message digest as the 214 + payload. [crt_hardening] defaults to [true] and verifies that the 215 + computed signature is correct. 199 216 200 217 [message] is either the actual message, or its digest. 201 218 202 219 @raise Insufficient_key (see {{!Insufficient_key}Insufficient_key}) 203 220 204 - @raise Invalid_argument if message is a [`Digest] of the wrong size. *) 221 + @raise Invalid_argument if message is a [`Digest] of the wrong size. *) 205 222 206 - val verify : hashp:([< Digestif.hash' > `MD5 `SHA1 `SHA224 `SHA256 `SHA384 `SHA512 ] -> bool) -> 207 - key:pub -> signature:string -> string or_digest -> bool 223 + val verify : 224 + hashp: 225 + ([< Digestif.hash' > `MD5 `SHA1 `SHA224 `SHA256 `SHA384 `SHA512 ] -> 226 + bool) -> 227 + key:pub -> 228 + signature:string -> 229 + string or_digest -> 230 + bool 208 231 (** [verify ~hashp ~key ~signature message] checks that [signature] is the 209 232 PKCS 1.5 signature of the [message] under the given [key]. 210 233 ··· 213 236 [hashp] determines the allowed hash algorithms. Whenever [hashp] is 214 237 [false], [verify] is also [false]. 215 238 216 - @raise Invalid_argument if message is a [`Digest] of the wrong size. *) 239 + @raise Invalid_argument if message is a [`Digest] of the wrong size. *) 217 240 end 218 241 219 242 (** {1 OAEP padded modes} *) ··· 226 249 Keys must have a minimum of [2 + 2 * hlen + len(message)] bytes, where 227 250 [hlen] is the hash length. *) 228 251 module OAEP (H : Digestif.S) : sig 229 - 230 - val encrypt : ?g:Crypto_rng.g -> ?label:string -> key:pub -> 231 - string -> string 252 + val encrypt : 253 + ?g:Crypto_rng.g -> ?label:string -> key:pub -> string -> string 232 254 (** [encrypt ~g ~label ~key message] is {b OAEP}-padded and encrypted 233 255 [message], using the optional [label]. 234 256 235 257 @raise Insufficient_key (see {{!Insufficient_key}Insufficient_key}) *) 236 258 237 - val decrypt : ?crt_hardening:bool -> ?mask:mask -> ?label:string -> 238 - key:priv -> string -> string option 239 - (** [decrypt ~crt_hardening ~mask ~label ~key ciphertext] is 240 - [Some message] if the [ciphertext] was produced by the corresponding 259 + val decrypt : 260 + ?crt_hardening:bool -> 261 + ?mask:mask -> 262 + ?label:string -> 263 + key:priv -> 264 + string -> 265 + string option 266 + (** [decrypt ~crt_hardening ~mask ~label ~key ciphertext] is [Some message] 267 + if the [ciphertext] was produced by the corresponding 241 268 {{!encrypt}encrypt} operation, or [None] otherwise. [crt_hardening] 242 269 defaults to [false]. *) 243 270 end ··· 251 278 252 279 Keys must have a minimum of [2 + hlen + slen] bytes, where [hlen] is the 253 280 hash length and [slen] is the seed length. *) 254 - module PSS (H: Digestif.S) : sig 255 - 256 - val sign : ?g:Crypto_rng.g -> ?crt_hardening:bool -> 257 - ?mask:mask -> ?slen:int -> key:priv -> string or_digest -> string 281 + module PSS (H : Digestif.S) : sig 282 + val sign : 283 + ?g:Crypto_rng.g -> 284 + ?crt_hardening:bool -> 285 + ?mask:mask -> 286 + ?slen:int -> 287 + key:priv -> 288 + string or_digest -> 289 + string 258 290 (** [sign ~g ~crt_hardening ~mask ~slen ~key message] the [PSS]-padded 259 - digest of [message], signed with the [key]. [crt_hardening] defaults 260 - to [false]. 291 + digest of [message], signed with the [key]. [crt_hardening] defaults to 292 + [false]. 261 293 262 294 [slen] is the optional seed length and defaults to the size of the 263 295 underlying hash function. ··· 266 298 267 299 @raise Insufficient_key (see {{!Insufficient_key}Insufficient_key}) 268 300 269 - @raise Invalid_argument if message is a [`Digest] of the wrong size. *) 301 + @raise Invalid_argument if message is a [`Digest] of the wrong size. *) 270 302 271 - val verify : ?slen:int -> key:pub -> signature:string -> string or_digest -> bool 303 + val verify : 304 + ?slen:int -> key:pub -> signature:string -> string or_digest -> bool 272 305 (** [verify ~slen ~key ~signature message] checks whether [signature] is a 273 306 valid {b PSS} signature of the [message] under the given [key]. 274 307 ··· 277 310 @raise Invalid_argument if message is a [`Digest] of the wrong size. *) 278 311 end 279 312 end 280 - 281 313 282 314 (** {b DSA} digital signature algorithm. *) 283 315 module Dsa : sig 284 - 285 316 (** {1 DSA signature algorithm} *) 286 317 287 318 type priv = private { 288 - p : Z.t ; (** Modulus *) 289 - q : Z.t ; (** Subgroup order *) 290 - gg : Z.t ; (** Group Generator *) 291 - x : Z.t ; (** Private key proper *) 292 - y : Z.t ; (** Public component *) 319 + p : Z.t; (** Modulus *) 320 + q : Z.t; (** Subgroup order *) 321 + gg : Z.t; (** Group Generator *) 322 + x : Z.t; (** Private key proper *) 323 + y : Z.t; (** Public component *) 293 324 } 294 325 (** Private key. [p], [q] and [gg] comprise {i domain parameters}. *) 295 326 296 - val priv : ?fips:bool -> p:Z.t -> q:Z.t -> gg:Z.t -> x:Z.t -> y:Z.t -> unit -> 327 + val priv : 328 + ?fips:bool -> 329 + p:Z.t -> 330 + q:Z.t -> 331 + gg:Z.t -> 332 + x:Z.t -> 333 + y:Z.t -> 334 + unit -> 297 335 (priv, [> `Msg of string ]) result 298 - (** [priv ~fips ~p ~q ~gg ~x ~y ()] constructs a private DSA key from the given 299 - numbers. Will result in an error if parameters are ill-formed: same as 300 - {!val-pub}, and additionally [0 < x < q] and [y = g ^ x mod p]. Note that no 301 - time masking is done on the modular exponentiation. *) 336 + (** [priv ~fips ~p ~q ~gg ~x ~y ()] constructs a private DSA key from the 337 + given numbers. Will result in an error if parameters are ill-formed: same 338 + as {!val-pub}, and additionally [0 < x < q] and [y = g ^ x mod p]. Note 339 + that no time masking is done on the modular exponentiation. *) 302 340 303 - type pub = private { 304 - p : Z.t ; 305 - q : Z.t ; 306 - gg : Z.t ; 307 - y : Z.t ; 308 - } 341 + type pub = private { p : Z.t; q : Z.t; gg : Z.t; y : Z.t } 309 342 (** Public key, a subset of {{!type-priv}private key}. *) 310 343 311 - val pub : ?fips:bool -> p:Z.t -> q:Z.t -> gg:Z.t -> y:Z.t -> unit -> 344 + val pub : 345 + ?fips:bool -> 346 + p:Z.t -> 347 + q:Z.t -> 348 + gg:Z.t -> 349 + y:Z.t -> 350 + unit -> 312 351 (pub, [> `Msg of string ]) result 313 352 (** [pub ~fips ~p ~q ~gg ~y ()] constructs a public DSA key from the given 314 353 numbers. Will result in an error if the parameters are not well-formed: 315 - [one < gg < p], [q] probabilistically a prime, [p] probabilistically 316 - prime and odd, [0 < y < p], [q < p], and [p - 1 mod q = 0]. If [fips] is 354 + [one < gg < p], [q] probabilistically a prime, [p] probabilistically prime 355 + and odd, [0 < y < p], [q < p], and [p - 1 mod q = 0]. If [fips] is 317 356 specified and [true] (defaults to [false]), only FIPS-specified bit length 318 357 for [p] and [q] are accepted. *) 319 358 ··· 329 368 (** Extract the public component from a private key. *) 330 369 331 370 val generate : ?g:Crypto_rng.g -> keysize -> priv 332 - (** [generate g size] is a fresh {{!type-priv}private} key. The domain parameters 333 - are derived using a modified FIPS.186-4 probabilistic process, but the 334 - derivation can not be validated. Note that no time masking is done for the 335 - modular exponentiations. 371 + (** [generate g size] is a fresh {{!type-priv}private} key. The domain 372 + parameters are derived using a modified FIPS.186-4 probabilistic process, 373 + but the derivation can not be validated. Note that no time masking is done 374 + for the modular exponentiations. 336 375 337 376 {b Note} The process might diverge if it is impossible to find parameters 338 377 with the given bit sizes. This happens when [n] gets too big for [l], if 339 378 the [size] was given as [`Exactly (l, n)]. 340 379 341 - @raise Invalid_argument if [size] is (`Exactly (l, n)), and either [l] or 342 - [n] is ridiculously small. *) 380 + @raise Invalid_argument 381 + if [size] is (`Exactly (l, n)), and either [l] or [n] is ridiculously 382 + small. *) 343 383 344 384 val sign : ?mask:mask -> ?k:Z.t -> key:priv -> string -> string * string 345 385 (** [sign ~mask ~k ~key digest] is the signature, a pair of strings ··· 351 391 derived as per RFC6979, using SHA256. 352 392 353 393 @raise Invalid_argument if [k] is unsuitable (leading to r or s being 0). 354 - *) 394 + *) 355 395 356 396 val verify : key:pub -> string * string -> string -> bool 357 - (** [verify ~key (r, s) digest] verifies that the pair [(r, s)] is the signature 358 - of [digest], the message digest, under the private counterpart to [key]. *) 397 + (** [verify ~key (r, s) digest] verifies that the pair [(r, s)] is the 398 + signature of [digest], the message digest, under the private counterpart 399 + to [key]. *) 359 400 360 401 val massage : key:pub -> string -> string 361 402 (** [massage key digest] is the numeric value of [digest] taken modulo [q] and 362 403 represented in the leftmost [bits(q)] bits of the result. 363 404 364 - Both FIPS.186-4 and RFC6979 specify that only the leftmost [bits(q)] bits of 365 - [digest] are to be taken into account, but some implementations consider the 366 - entire [digest]. In cases where {{!sign}sign} and {{!verify}verify} seem 367 - incompatible with a given implementation (esp. if {{!sign}sign} produces 368 - signatures with the [s] component different from the other 369 - implementation's), it might help to pre-process [digest] using this 370 - function (e.g. [sign ~key (massage ~key:(pub_of_priv key) digest)]). *) 405 + Both FIPS.186-4 and RFC6979 specify that only the leftmost [bits(q)] bits 406 + of [digest] are to be taken into account, but some implementations 407 + consider the entire [digest]. In cases where {{!sign}sign} and 408 + {{!verify}verify} seem incompatible with a given implementation (esp. if 409 + {{!sign}sign} produces signatures with the [s] component different from 410 + the other implementation's), it might help to pre-process [digest] using 411 + this function (e.g. [sign ~key (massage ~key:(pub_of_priv key) digest)]). 412 + *) 371 413 372 414 (** [K_gen] can be instantiated over a hashing module to obtain an RFC6979 373 415 compliant [k]-generator for that hash. *) 374 416 module K_gen (H : Digestif.S) : sig 375 - 376 417 val generate : key:priv -> string -> Z.t 377 418 (** [generate key digest] deterministically takes the given private key and 378 419 message digest to a [k] suitable for seeding the signing process. *) 379 420 end 380 421 end 381 422 382 - 383 423 (** Diffie-Hellman, MODP version. *) 384 424 module Dh : sig 385 - 386 425 (** {1 Diffie-Hellman key exchange} *) 387 426 388 427 exception Invalid_key 389 - (** Raised if the private key material is degenerate. 390 - The following invariants are checked: 391 - Secret key: [1 < secret < p] 392 - Public key: [1 < public < p-1] && [public <> gg] 393 - *) 428 + (** Raised if the private key material is degenerate. The following invariants 429 + are checked: Secret key: [1 < secret < p] Public key: [1 < public < p-1] 430 + && [public <> gg] *) 394 431 395 432 type group = private { 396 - p : Z.t ; (** modulus *) 397 - gg : Z.t ; (** generator *) 398 - q : Z.t option ; (** subgroup order; potentially unknown *) 433 + p : Z.t; (** modulus *) 434 + gg : Z.t; (** generator *) 435 + q : Z.t option; (** subgroup order; potentially unknown *) 399 436 } 400 437 (** A DH group. *) 401 438 402 - val group : p:Z.t -> gg:Z.t -> ?q:Z.t -> unit -> 403 - (group, [> `Msg of string ]) result 404 - (** [group ~p ~gg ~q ()] constructs a group if [p] is odd, a prime number, 405 - and greater than [zero]. [gg] must be in the range [1 < gg < p]. *) 439 + val group : 440 + p:Z.t -> gg:Z.t -> ?q:Z.t -> unit -> (group, [> `Msg of string ]) result 441 + (** [group ~p ~gg ~q ()] constructs a group if [p] is odd, a prime number, and 442 + greater than [zero]. [gg] must be in the range [1 < gg < p]. *) 406 443 407 - type secret = private { group : group ; x : Z.t } 444 + type secret = private { group : group; x : Z.t } 408 445 (** A private key. *) 409 446 410 447 val modulus_size : group -> int 411 448 (** Bit size of the modulus. *) 412 449 413 450 val key_of_secret : group -> s:string -> secret * string 414 - (** [key_of_secret group s] is the {!secret} and the corresponding public 415 - key which use [s] as the secret exponent. 451 + (** [key_of_secret group s] is the {!secret} and the corresponding public key 452 + which use [s] as the secret exponent. 416 453 417 454 @raise Invalid_key if [s] is degenerate. *) 418 455 419 456 val gen_key : ?g:Crypto_rng.g -> ?bits:int -> group -> secret * string 420 - (** Generate a random {!secret} and the corresponding public key. 421 - [bits] is the exact bit-size of {!secret} and defaults to a value 422 - dependent on the {!type-group}'s [p]. 457 + (** Generate a random {!secret} and the corresponding public key. [bits] is 458 + the exact bit-size of {!secret} and defaults to a value dependent on the 459 + {!type-group}'s [p]. 423 460 424 461 {b Note} The process might diverge when [bits] is extremely small. *) 425 462 426 463 val shared : secret -> string -> string option 427 - (** [shared secret public] is [Some shared_key] given a 428 - a previously generated {!secret} (which specifies the [group]) 429 - and the other party's public key. 464 + (** [shared secret public] is [Some shared_key] given a a previously generated 465 + {!secret} (which specifies the [group]) and the other party's public key. 430 466 [shared_key] is the unpadded big-endian representation of the shared key. 431 467 It is [None] if these invariants do not hold for [public]: 432 468 [1 < public < p-1] && [public <> gg]. *) ··· 434 470 val gen_group : ?g:Crypto_rng.g -> bits:int -> unit -> group 435 471 (** [gen_group ~g ~bits ()] generates a random {!type-group} with modulus size 436 472 [bits]. Uses a safe prime [p = 2q + 1] (with [q] prime) for the modulus 437 - and [2] for the generator, such that [2^q = 1 mod p]. 438 - Runtime is on the order of a minute for 1024 bits. 439 - Note that no time masking is done for the modular exponentiation. 473 + and [2] for the generator, such that [2^q = 1 mod p]. Runtime is on the 474 + order of a minute for 1024 bits. Note that no time masking is done for the 475 + modular exponentiation. 440 476 441 477 {b Note} The process might diverge if there are no suitable groups. This 442 478 happens with extremely small [bits] values. *) 443 479 444 480 (** A small catalog of standardized {!type-group}s. *) 445 481 module Group : sig 446 - 447 482 (** From RFC 2409: *) 448 483 449 484 val oakley_1 : group ··· 451 486 452 487 (** From RFC 3526: *) 453 488 454 - val oakley_5 : group 489 + val oakley_5 : group 455 490 val oakley_14 : group 456 491 val oakley_15 : group 457 492 val oakley_16 : group ··· 471 506 val ffdhe4096 : group 472 507 val ffdhe6144 : group 473 508 val ffdhe8192 : group 474 - 475 509 end 476 510 end 477 511 ··· 488 522 489 523 Assuming [n] is the number of bits to extract, the [n]-bit in [buf] is 490 524 always the least significant bit of the result. Therefore: 491 - {ul 492 - {- if the bit size [k] of [t] is larger than [n], [k - n] most 493 - significant bits in the result are [0]; and} 494 - {- if [k] is smaller than [n], the result contains [k] last of the [n] 495 - first bits of [buf].}} *) 525 + - if the bit size [k] of [t] is larger than [n], [k - n] most significant 526 + bits in the result are [0]; and 527 + - if [k] is smaller than [n], the result contains [k] last of the [n] 528 + first bits of [buf]. *) 496 529 497 530 val to_octets_be : ?size:int -> Z.t -> string 498 531 (** [to_octets_be ~size t] is the big-endian representation of [t]. 499 532 500 - If [~size] is not given, it defaults to the minimal number of bytes 501 - needed to represent [t], which is [bits t / 8] rounded up. 533 + If [~size] is not given, it defaults to the minimal number of bytes needed 534 + to represent [t], which is [bits t / 8] rounded up. 502 535 503 - The least-significant bit of [t] is always the last bit in the result. 504 - If the size is larger than needed, the output is padded with zero bits. 505 - If it is smaller, the high bits in [t] are dropped. *) 536 + The least-significant bit of [t] is always the last bit in the result. If 537 + the size is larger than needed, the output is padded with zero bits. If it 538 + is smaller, the high bits in [t] are dropped. *) 506 539 507 540 val into_octets_be : Z.t -> bytes -> unit 508 541 (** [into_octets_be t buf] writes the big-endian representation of [t] into ··· 512 545 (** {1 Random generation} *) 513 546 514 547 val gen : ?g:Crypto_rng.g -> Z.t -> Z.t 515 - (** [gen ~g n] picks a value in the interval [\[0, n - 1\]] uniformly at random. *) 548 + (** [gen ~g n] picks a value in the interval [[0, n - 1]] uniformly at random. 549 + *) 516 550 517 551 val gen_r : ?g:Crypto_rng.g -> Z.t -> Z.t -> Z.t 518 - (** [gen_r ~g low high] picks a value from the interval [\[low, high - 1\]] 552 + (** [gen_r ~g low high] picks a value from the interval [[low, high - 1]] 519 553 uniformly at random. *) 520 554 end
+72 -524
pk/dh.ml
··· 1 1 open Crypto.Uncommon 2 - 3 2 open Common 4 3 5 4 exception Invalid_key 6 5 7 6 type group = { 8 - p : Z.t ; (* The prime modulus *) 9 - gg : Z.t ; (* Group generator *) 10 - q : Z.t option ; (* `gg`'s order, maybe *) 7 + p : Z.t; (* The prime modulus *) 8 + gg : Z.t; (* Group generator *) 9 + q : Z.t option; (* `gg`'s order, maybe *) 11 10 } 12 11 13 12 let group ~p ~gg ?q () = 14 13 let* () = 15 - guard (Z.(p > zero && is_odd p) && Z_extra.pseudoprime p) 14 + guard 15 + (Z.(p > zero && is_odd p) && Z_extra.pseudoprime p) 16 16 (`Msg "invalid prime") 17 17 in 18 - let* () = 19 - guard Z.(one < gg && gg < p) (`Msg "invalid generator") 20 - in 21 - Ok { p ; gg ; q } 18 + let* () = guard Z.(one < gg && gg < p) (`Msg "invalid generator") in 19 + Ok { p; gg; q } 22 20 23 - type secret = { group : group ; x : Z.t } 21 + type secret = { group : group; x : Z.t } 24 22 25 23 (* 26 24 * Estimates of equivalent-strength exponent sizes for the moduli sizes. 27 25 * 2048-8192 are taken from "Negotiated FF DHE Parameters for TLS." 28 26 * Sizes above and below are further guesswork. 29 27 *) 30 - let exp_equivalent = [ 31 - (1024, 180); (2048, 225); (3072, 275); (4096, 325); (6144, 375); (8192, 400) 32 - ] 28 + let exp_equivalent = 29 + [ 30 + (1024, 180); (2048, 225); (3072, 275); (4096, 325); (6144, 375); (8192, 400); 31 + ] 32 + 33 33 and exp_equivalent_max = 512 34 34 35 35 let exp_size bits = ··· 46 46 * g^y = g : y mod (p-1) is 1 47 47 *) 48 48 let bad_public_key { p; gg; _ } ggx = 49 - ggx <= Z.one || ggx >= Z.(pred p) || ggx = gg 49 + ggx <= Z.one || (ggx >= Z.(pred p)) || ggx = gg 50 50 51 - let valid_secret { p ; _ } s = 52 - Z.(one < s && s < p) 51 + let valid_secret { p; _ } s = Z.(one < s && s < p) 53 52 54 53 let key_of_secret_z ({ p; gg; _ } as group) x = 55 54 if valid_secret group x then 56 55 match Z.(powm_sec gg x p) with 57 56 | ggx when bad_public_key group ggx -> raise_notrace Invalid_key 58 - | ggx -> ({ group ; x }, Z_extra.to_octets_be ggx) 59 - else 60 - raise_notrace Invalid_key 57 + | ggx -> ({ group; x }, Z_extra.to_octets_be ggx) 58 + else raise_notrace Invalid_key 61 59 62 60 let key_of_secret group ~s = 63 61 (* catches Invalid_private_key and re-raises with exception trace: *) ··· 71 69 let rec gen_key ?g ?bits ({ p; q; _ } as group) = 72 70 let pb = Z.numbits p in 73 71 let s = 74 - imin (Option.value bits ~default:pb |> exp_size) 75 - (Option.fold ~none:pb ~some:Z.numbits q) 72 + imin 73 + (Option.value bits ~default:pb |> exp_size) 74 + (Option.fold ~none:pb ~some:Z.numbits q) 76 75 |> Z_extra.gen_bits ?g ~msb:1 77 76 in 78 77 try key_of_secret_z group s with Invalid_key -> gen_key ?g ?bits group 79 78 80 - let shared { group ; x } cs = 79 + let shared { group; x } cs = 81 80 match Z_extra.of_octets_be cs with 82 81 | ggy when bad_public_key group ggy -> None 83 82 | ggy -> Some (Z_extra.to_octets_be (Z.powm_sec ggy x group.p)) 84 83 85 84 (* Finds a safe prime with [p = 2q + 1] and [2^q = 1 mod p]. *) 86 85 let rec gen_group ?g ~bits () = 87 - let gg = Z.(~$2) 88 - and (q, p) = Z_extra.safe_prime ?g (imax bits 1) in 86 + let gg = Z.(~$2) and q, p = Z_extra.safe_prime ?g (imax bits 1) in 89 87 if Z.(powm gg q p = one) then { p; gg; q = Some q } else gen_group ?g ~bits () 90 88 91 89 module Group = struct 92 - 93 90 (* Safe-prime-style group: p = 2q + 1 && gg = 2 && gg^q = 1 mod p *) 94 91 let s_group ~p = 95 92 let p = Z_extra.of_octets_be p in 96 - { p ; gg = Z.(~$2) ; q = Some Z.(pred p / ~$2) } 93 + { p; gg = Z.(~$2); q = Some Z.(pred p / ~$2) } 97 94 98 95 (* Any old group. *) 99 96 let group ~p ~gg ~q = 100 97 let f = Z_extra.of_octets_be in 101 - { p = f p ; gg = f gg ; q = Some (f q) } 98 + { p = f p; gg = f gg; q = Some (f q) } 102 99 103 100 (* RFC2409 *) 104 101 105 102 let oakley_1 = 106 103 (* 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 } *) 107 - s_group ~p: 108 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 109 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 110 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 111 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 112 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 113 - \xF4\x4C\x42\xE9\xA6\x3A\x36\x20\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 104 + s_group 105 + ~p: 106 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x3A\x36\x20\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 114 107 115 108 let oakley_2 = 116 109 (* 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }. *) 117 - s_group ~p: 118 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 119 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 120 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 121 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 122 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 123 - \xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\ 124 - \xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\ 125 - x49\x28\x66\x51\xEC\xE6\x53\x81\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 110 + s_group 111 + ~p: 112 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6x49\x28\x66\x51\xEC\xE6\x53\x81\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 126 113 127 114 (* RFC3526 *) 128 115 129 116 let oakley_5 = 130 117 (* 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 } *) 131 - s_group ~p: 132 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 133 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 134 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 135 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 136 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 137 - \xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\ 138 - \xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\ 139 - \x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\ 140 - \x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\ 141 - \x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\ 142 - \x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\ 143 - \xF1\x74\x6C\x08\xCA\x23\x73\x27\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 118 + s_group 119 + ~p: 120 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\xF1\x74\x6C\x08\xCA\x23\x73\x27\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 144 121 145 122 let oakley_14 = 146 123 (* 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 } *) 147 - s_group ~p: 148 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 149 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 150 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 151 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 152 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 153 - \xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\ 154 - \xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\ 155 - \x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\ 156 - \x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\ 157 - \x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\ 158 - \x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\ 159 - \xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\ 160 - \xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\ 161 - \xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\ 162 - \x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\ 163 - \x15\x72\x8E\x5A\x8A\xAC\xAA\x68\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 124 + s_group 125 + ~p: 126 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\x15\x72\x8E\x5A\x8A\xAC\xAA\x68\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 164 127 165 128 let oakley_15 = 166 129 (* 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 } *) 167 - s_group ~p: 168 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 169 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 170 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 171 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 172 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 173 - \xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\ 174 - \xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\ 175 - \x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\ 176 - \x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\ 177 - \x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\ 178 - \x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\ 179 - \xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\ 180 - \xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\ 181 - \xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\ 182 - \x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\ 183 - \x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\ 184 - \xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\ 185 - \x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\ 186 - \xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\ 187 - \xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\ 188 - \xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\ 189 - \xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\ 190 - \x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\ 191 - \x4B\x82\xD1\x20\xA9\x3A\xD2\xCA\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 130 + s_group 131 + ~p: 132 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\x4B\x82\xD1\x20\xA9\x3A\xD2\xCA\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 192 133 193 134 let oakley_16 = 194 135 (* 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 } *) 195 - s_group ~p: 196 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 197 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 198 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 199 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 200 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 201 - \xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\ 202 - \xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\ 203 - \x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\ 204 - \x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\ 205 - \x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\ 206 - \x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\ 207 - \xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\ 208 - \xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\ 209 - \xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\ 210 - \x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\ 211 - \x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\ 212 - \xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\ 213 - \x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\ 214 - \xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\ 215 - \xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\ 216 - \xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\ 217 - \xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\ 218 - \x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\ 219 - \x4B\x82\xD1\x20\xA9\x21\x08\x01\x1A\x72\x3C\x12\xA7\x87\xE6\xD7\ 220 - \x88\x71\x9A\x10\xBD\xBA\x5B\x26\x99\xC3\x27\x18\x6A\xF4\xE2\x3C\ 221 - \x1A\x94\x68\x34\xB6\x15\x0B\xDA\x25\x83\xE9\xCA\x2A\xD4\x4C\xE8\ 222 - \xDB\xBB\xC2\xDB\x04\xDE\x8E\xF9\x2E\x8E\xFC\x14\x1F\xBE\xCA\xA6\ 223 - \x28\x7C\x59\x47\x4E\x6B\xC0\x5D\x99\xB2\x96\x4F\xA0\x90\xC3\xA2\ 224 - \x23\x3B\xA1\x86\x51\x5B\xE7\xED\x1F\x61\x29\x70\xCE\xE2\xD7\xAF\ 225 - \xB8\x1B\xDD\x76\x21\x70\x48\x1C\xD0\x06\x91\x27\xD5\xB0\x5A\xA9\ 226 - \x93\xB4\xEA\x98\x8D\x8F\xDD\xC1\x86\xFF\xB7\xDC\x90\xA6\xC0\x8F\ 227 - \x4D\xF4\x35\xC9\x34\x06\x31\x99\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 136 + s_group 137 + ~p: 138 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\x4B\x82\xD1\x20\xA9\x21\x08\x01\x1A\x72\x3C\x12\xA7\x87\xE6\xD7\x88\x71\x9A\x10\xBD\xBA\x5B\x26\x99\xC3\x27\x18\x6A\xF4\xE2\x3C\x1A\x94\x68\x34\xB6\x15\x0B\xDA\x25\x83\xE9\xCA\x2A\xD4\x4C\xE8\xDB\xBB\xC2\xDB\x04\xDE\x8E\xF9\x2E\x8E\xFC\x14\x1F\xBE\xCA\xA6\x28\x7C\x59\x47\x4E\x6B\xC0\x5D\x99\xB2\x96\x4F\xA0\x90\xC3\xA2\x23\x3B\xA1\x86\x51\x5B\xE7\xED\x1F\x61\x29\x70\xCE\xE2\xD7\xAF\xB8\x1B\xDD\x76\x21\x70\x48\x1C\xD0\x06\x91\x27\xD5\xB0\x5A\xA9\x93\xB4\xEA\x98\x8D\x8F\xDD\xC1\x86\xFF\xB7\xDC\x90\xA6\xC0\x8F\x4D\xF4\x35\xC9\x34\x06\x31\x99\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 228 139 229 140 let oakley_17 = 230 141 (* 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 } *) 231 - s_group ~p: 232 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 233 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 234 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 235 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 236 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 237 - \xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\ 238 - \xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\ 239 - \x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\ 240 - \x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\ 241 - \x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\ 242 - \x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\ 243 - \xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\ 244 - \xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\ 245 - \xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\ 246 - \x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\ 247 - \x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\ 248 - \xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\ 249 - \x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\ 250 - \xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\ 251 - \xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\ 252 - \xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\ 253 - \xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\ 254 - \x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\ 255 - \x4B\x82\xD1\x20\xA9\x21\x08\x01\x1A\x72\x3C\x12\xA7\x87\xE6\xD7\ 256 - \x88\x71\x9A\x10\xBD\xBA\x5B\x26\x99\xC3\x27\x18\x6A\xF4\xE2\x3C\ 257 - \x1A\x94\x68\x34\xB6\x15\x0B\xDA\x25\x83\xE9\xCA\x2A\xD4\x4C\xE8\ 258 - \xDB\xBB\xC2\xDB\x04\xDE\x8E\xF9\x2E\x8E\xFC\x14\x1F\xBE\xCA\xA6\ 259 - \x28\x7C\x59\x47\x4E\x6B\xC0\x5D\x99\xB2\x96\x4F\xA0\x90\xC3\xA2\ 260 - \x23\x3B\xA1\x86\x51\x5B\xE7\xED\x1F\x61\x29\x70\xCE\xE2\xD7\xAF\ 261 - \xB8\x1B\xDD\x76\x21\x70\x48\x1C\xD0\x06\x91\x27\xD5\xB0\x5A\xA9\ 262 - \x93\xB4\xEA\x98\x8D\x8F\xDD\xC1\x86\xFF\xB7\xDC\x90\xA6\xC0\x8F\ 263 - \x4D\xF4\x35\xC9\x34\x02\x84\x92\x36\xC3\xFA\xB4\xD2\x7C\x70\x26\ 264 - \xC1\xD4\xDC\xB2\x60\x26\x46\xDE\xC9\x75\x1E\x76\x3D\xBA\x37\xBD\ 265 - \xF8\xFF\x94\x06\xAD\x9E\x53\x0E\xE5\xDB\x38\x2F\x41\x30\x01\xAE\ 266 - \xB0\x6A\x53\xED\x90\x27\xD8\x31\x17\x97\x27\xB0\x86\x5A\x89\x18\ 267 - \xDA\x3E\xDB\xEB\xCF\x9B\x14\xED\x44\xCE\x6C\xBA\xCE\xD4\xBB\x1B\ 268 - \xDB\x7F\x14\x47\xE6\xCC\x25\x4B\x33\x20\x51\x51\x2B\xD7\xAF\x42\ 269 - \x6F\xB8\xF4\x01\x37\x8C\xD2\xBF\x59\x83\xCA\x01\xC6\x4B\x92\xEC\ 270 - \xF0\x32\xEA\x15\xD1\x72\x1D\x03\xF4\x82\xD7\xCE\x6E\x74\xFE\xF6\ 271 - \xD5\x5E\x70\x2F\x46\x98\x0C\x82\xB5\xA8\x40\x31\x90\x0B\x1C\x9E\ 272 - \x59\xE7\xC9\x7F\xBE\xC7\xE8\xF3\x23\xA9\x7A\x7E\x36\xCC\x88\xBE\ 273 - \x0F\x1D\x45\xB7\xFF\x58\x5A\xC5\x4B\xD4\x07\xB2\x2B\x41\x54\xAA\ 274 - \xCC\x8F\x6D\x7E\xBF\x48\xE1\xD8\x14\xCC\x5E\xD2\x0F\x80\x37\xE0\ 275 - \xA7\x97\x15\xEE\xF2\x9B\xE3\x28\x06\xA1\xD5\x8B\xB7\xC5\xDA\x76\ 276 - \xF5\x50\xAA\x3D\x8A\x1F\xBF\xF0\xEB\x19\xCC\xB1\xA3\x13\xD5\x5C\ 277 - \xDA\x56\xC9\xEC\x2E\xF2\x96\x32\x38\x7F\xE8\xD7\x6E\x3C\x04\x68\ 278 - \x04\x3E\x8F\x66\x3F\x48\x60\xEE\x12\xBF\x2D\x5B\x0B\x74\x74\xD6\ 279 - \xE6\x94\xF9\x1E\x6D\xCC\x40\x24\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 142 + s_group 143 + ~p: 144 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\x4B\x82\xD1\x20\xA9\x21\x08\x01\x1A\x72\x3C\x12\xA7\x87\xE6\xD7\x88\x71\x9A\x10\xBD\xBA\x5B\x26\x99\xC3\x27\x18\x6A\xF4\xE2\x3C\x1A\x94\x68\x34\xB6\x15\x0B\xDA\x25\x83\xE9\xCA\x2A\xD4\x4C\xE8\xDB\xBB\xC2\xDB\x04\xDE\x8E\xF9\x2E\x8E\xFC\x14\x1F\xBE\xCA\xA6\x28\x7C\x59\x47\x4E\x6B\xC0\x5D\x99\xB2\x96\x4F\xA0\x90\xC3\xA2\x23\x3B\xA1\x86\x51\x5B\xE7\xED\x1F\x61\x29\x70\xCE\xE2\xD7\xAF\xB8\x1B\xDD\x76\x21\x70\x48\x1C\xD0\x06\x91\x27\xD5\xB0\x5A\xA9\x93\xB4\xEA\x98\x8D\x8F\xDD\xC1\x86\xFF\xB7\xDC\x90\xA6\xC0\x8F\x4D\xF4\x35\xC9\x34\x02\x84\x92\x36\xC3\xFA\xB4\xD2\x7C\x70\x26\xC1\xD4\xDC\xB2\x60\x26\x46\xDE\xC9\x75\x1E\x76\x3D\xBA\x37\xBD\xF8\xFF\x94\x06\xAD\x9E\x53\x0E\xE5\xDB\x38\x2F\x41\x30\x01\xAE\xB0\x6A\x53\xED\x90\x27\xD8\x31\x17\x97\x27\xB0\x86\x5A\x89\x18\xDA\x3E\xDB\xEB\xCF\x9B\x14\xED\x44\xCE\x6C\xBA\xCE\xD4\xBB\x1B\xDB\x7F\x14\x47\xE6\xCC\x25\x4B\x33\x20\x51\x51\x2B\xD7\xAF\x42\x6F\xB8\xF4\x01\x37\x8C\xD2\xBF\x59\x83\xCA\x01\xC6\x4B\x92\xEC\xF0\x32\xEA\x15\xD1\x72\x1D\x03\xF4\x82\xD7\xCE\x6E\x74\xFE\xF6\xD5\x5E\x70\x2F\x46\x98\x0C\x82\xB5\xA8\x40\x31\x90\x0B\x1C\x9E\x59\xE7\xC9\x7F\xBE\xC7\xE8\xF3\x23\xA9\x7A\x7E\x36\xCC\x88\xBE\x0F\x1D\x45\xB7\xFF\x58\x5A\xC5\x4B\xD4\x07\xB2\x2B\x41\x54\xAA\xCC\x8F\x6D\x7E\xBF\x48\xE1\xD8\x14\xCC\x5E\xD2\x0F\x80\x37\xE0\xA7\x97\x15\xEE\xF2\x9B\xE3\x28\x06\xA1\xD5\x8B\xB7\xC5\xDA\x76\xF5\x50\xAA\x3D\x8A\x1F\xBF\xF0\xEB\x19\xCC\xB1\xA3\x13\xD5\x5C\xDA\x56\xC9\xEC\x2E\xF2\x96\x32\x38\x7F\xE8\xD7\x6E\x3C\x04\x68\x04\x3E\x8F\x66\x3F\x48\x60\xEE\x12\xBF\x2D\x5B\x0B\x74\x74\xD6\xE6\x94\xF9\x1E\x6D\xCC\x40\x24\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 280 145 281 146 let oakley_18 = 282 147 (* 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 } *) 283 - s_group ~p: 284 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\ 285 - \xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\ 286 - \x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\ 287 - \xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\ 288 - \x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\ 289 - \xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\ 290 - \xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\ 291 - \x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\ 292 - \x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\ 293 - \x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\ 294 - \x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\ 295 - \xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\ 296 - \xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\ 297 - \xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\ 298 - \x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\ 299 - \x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\ 300 - \xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\ 301 - \x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\ 302 - \xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\ 303 - \xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\ 304 - \xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\ 305 - \xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\ 306 - \x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\ 307 - \x4B\x82\xD1\x20\xA9\x21\x08\x01\x1A\x72\x3C\x12\xA7\x87\xE6\xD7\ 308 - \x88\x71\x9A\x10\xBD\xBA\x5B\x26\x99\xC3\x27\x18\x6A\xF4\xE2\x3C\ 309 - \x1A\x94\x68\x34\xB6\x15\x0B\xDA\x25\x83\xE9\xCA\x2A\xD4\x4C\xE8\ 310 - \xDB\xBB\xC2\xDB\x04\xDE\x8E\xF9\x2E\x8E\xFC\x14\x1F\xBE\xCA\xA6\ 311 - \x28\x7C\x59\x47\x4E\x6B\xC0\x5D\x99\xB2\x96\x4F\xA0\x90\xC3\xA2\ 312 - \x23\x3B\xA1\x86\x51\x5B\xE7\xED\x1F\x61\x29\x70\xCE\xE2\xD7\xAF\ 313 - \xB8\x1B\xDD\x76\x21\x70\x48\x1C\xD0\x06\x91\x27\xD5\xB0\x5A\xA9\ 314 - \x93\xB4\xEA\x98\x8D\x8F\xDD\xC1\x86\xFF\xB7\xDC\x90\xA6\xC0\x8F\ 315 - \x4D\xF4\x35\xC9\x34\x02\x84\x92\x36\xC3\xFA\xB4\xD2\x7C\x70\x26\ 316 - \xC1\xD4\xDC\xB2\x60\x26\x46\xDE\xC9\x75\x1E\x76\x3D\xBA\x37\xBD\ 317 - \xF8\xFF\x94\x06\xAD\x9E\x53\x0E\xE5\xDB\x38\x2F\x41\x30\x01\xAE\ 318 - \xB0\x6A\x53\xED\x90\x27\xD8\x31\x17\x97\x27\xB0\x86\x5A\x89\x18\ 319 - \xDA\x3E\xDB\xEB\xCF\x9B\x14\xED\x44\xCE\x6C\xBA\xCE\xD4\xBB\x1B\ 320 - \xDB\x7F\x14\x47\xE6\xCC\x25\x4B\x33\x20\x51\x51\x2B\xD7\xAF\x42\ 321 - \x6F\xB8\xF4\x01\x37\x8C\xD2\xBF\x59\x83\xCA\x01\xC6\x4B\x92\xEC\ 322 - \xF0\x32\xEA\x15\xD1\x72\x1D\x03\xF4\x82\xD7\xCE\x6E\x74\xFE\xF6\ 323 - \xD5\x5E\x70\x2F\x46\x98\x0C\x82\xB5\xA8\x40\x31\x90\x0B\x1C\x9E\ 324 - \x59\xE7\xC9\x7F\xBE\xC7\xE8\xF3\x23\xA9\x7A\x7E\x36\xCC\x88\xBE\ 325 - \x0F\x1D\x45\xB7\xFF\x58\x5A\xC5\x4B\xD4\x07\xB2\x2B\x41\x54\xAA\ 326 - \xCC\x8F\x6D\x7E\xBF\x48\xE1\xD8\x14\xCC\x5E\xD2\x0F\x80\x37\xE0\ 327 - \xA7\x97\x15\xEE\xF2\x9B\xE3\x28\x06\xA1\xD5\x8B\xB7\xC5\xDA\x76\ 328 - \xF5\x50\xAA\x3D\x8A\x1F\xBF\xF0\xEB\x19\xCC\xB1\xA3\x13\xD5\x5C\ 329 - \xDA\x56\xC9\xEC\x2E\xF2\x96\x32\x38\x7F\xE8\xD7\x6E\x3C\x04\x68\ 330 - \x04\x3E\x8F\x66\x3F\x48\x60\xEE\x12\xBF\x2D\x5B\x0B\x74\x74\xD6\ 331 - \xE6\x94\xF9\x1E\x6D\xBE\x11\x59\x74\xA3\x92\x6F\x12\xFE\xE5\xE4\ 332 - \x38\x77\x7C\xB6\xA9\x32\xDF\x8C\xD8\xBE\xC4\xD0\x73\xB9\x31\xBA\ 333 - \x3B\xC8\x32\xB6\x8D\x9D\xD3\x00\x74\x1F\xA7\xBF\x8A\xFC\x47\xED\ 334 - \x25\x76\xF6\x93\x6B\xA4\x24\x66\x3A\xAB\x63\x9C\x5A\xE4\xF5\x68\ 335 - \x34\x23\xB4\x74\x2B\xF1\xC9\x78\x23\x8F\x16\xCB\xE3\x9D\x65\x2D\ 336 - \xE3\xFD\xB8\xBE\xFC\x84\x8A\xD9\x22\x22\x2E\x04\xA4\x03\x7C\x07\ 337 - \x13\xEB\x57\xA8\x1A\x23\xF0\xC7\x34\x73\xFC\x64\x6C\xEA\x30\x6B\ 338 - \x4B\xCB\xC8\x86\x2F\x83\x85\xDD\xFA\x9D\x4B\x7F\xA2\xC0\x87\xE8\ 339 - \x79\x68\x33\x03\xED\x5B\xDD\x3A\x06\x2B\x3C\xF5\xB3\xA2\x78\xA6\ 340 - \x6D\x2A\x13\xF8\x3F\x44\xF8\x2D\xDF\x31\x0E\xE0\x74\xAB\x6A\x36\ 341 - \x45\x97\xE8\x99\xA0\x25\x5D\xC1\x64\xF3\x1C\xC5\x08\x46\x85\x1D\ 342 - \xF9\xAB\x48\x19\x5D\xED\x7E\xA1\xB1\xD5\x10\xBD\x7E\xE7\x4D\x73\ 343 - \xFA\xF3\x6B\xC3\x1E\xCF\xA2\x68\x35\x90\x46\xF4\xEB\x87\x9F\x92\ 344 - \x40\x09\x43\x8B\x48\x1C\x6C\xD7\x88\x9A\x00\x2E\xD5\xEE\x38\x2B\ 345 - \xC9\x19\x0D\xA6\xFC\x02\x6E\x47\x95\x58\xE4\x47\x56\x77\xE9\xAA\ 346 - \x9E\x30\x50\xE2\x76\x56\x94\xDF\xC8\x1F\x56\xE8\x80\xB9\x6E\x71\ 347 - \x60\xC9\x80\xDD\x98\xED\xD3\xDF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 348 - 148 + s_group 149 + ~p: 150 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE4\x5B\x3D\xC2\x00\x7C\xB8\xA1\x63\xBF\x05\x98\xDA\x48\x36\x1C\x55\xD3\x9A\x69\x16\x3F\xA8\xFD\x24\xCF\x5F\x83\x65\x5D\x23\xDC\xA3\xAD\x96\x1C\x62\xF3\x56\x20\x85\x52\xBB\x9E\xD5\x29\x07\x70\x96\x96\x6D\x67\x0C\x35\x4E\x4A\xBC\x98\x04\xF1\x74\x6C\x08\xCA\x18\x21\x7C\x32\x90\x5E\x46\x2E\x36\xCE\x3B\xE3\x9E\x77\x2C\x18\x0E\x86\x03\x9B\x27\x83\xA2\xEC\x07\xA2\x8F\xB5\xC5\x5D\xF0\x6F\x4C\x52\xC9\xDE\x2B\xCB\xF6\x95\x58\x17\x18\x39\x95\x49\x7C\xEA\x95\x6A\xE5\x15\xD2\x26\x18\x98\xFA\x05\x10\x15\x72\x8E\x5A\x8A\xAA\xC4\x2D\xAD\x33\x17\x0D\x04\x50\x7A\x33\xA8\x55\x21\xAB\xDF\x1C\xBA\x64\xEC\xFB\x85\x04\x58\xDB\xEF\x0A\x8A\xEA\x71\x57\x5D\x06\x0C\x7D\xB3\x97\x0F\x85\xA6\xE1\xE4\xC7\xAB\xF5\xAE\x8C\xDB\x09\x33\xD7\x1E\x8C\x94\xE0\x4A\x25\x61\x9D\xCE\xE3\xD2\x26\x1A\xD2\xEE\x6B\xF1\x2F\xFA\x06\xD9\x8A\x08\x64\xD8\x76\x02\x73\x3E\xC8\x6A\x64\x52\x1F\x2B\x18\x17\x7B\x20\x0C\xBB\xE1\x17\x57\x7A\x61\x5D\x6C\x77\x09\x88\xC0\xBA\xD9\x46\xE2\x08\xE2\x4F\xA0\x74\xE5\xAB\x31\x43\xDB\x5B\xFC\xE0\xFD\x10\x8E\x4B\x82\xD1\x20\xA9\x21\x08\x01\x1A\x72\x3C\x12\xA7\x87\xE6\xD7\x88\x71\x9A\x10\xBD\xBA\x5B\x26\x99\xC3\x27\x18\x6A\xF4\xE2\x3C\x1A\x94\x68\x34\xB6\x15\x0B\xDA\x25\x83\xE9\xCA\x2A\xD4\x4C\xE8\xDB\xBB\xC2\xDB\x04\xDE\x8E\xF9\x2E\x8E\xFC\x14\x1F\xBE\xCA\xA6\x28\x7C\x59\x47\x4E\x6B\xC0\x5D\x99\xB2\x96\x4F\xA0\x90\xC3\xA2\x23\x3B\xA1\x86\x51\x5B\xE7\xED\x1F\x61\x29\x70\xCE\xE2\xD7\xAF\xB8\x1B\xDD\x76\x21\x70\x48\x1C\xD0\x06\x91\x27\xD5\xB0\x5A\xA9\x93\xB4\xEA\x98\x8D\x8F\xDD\xC1\x86\xFF\xB7\xDC\x90\xA6\xC0\x8F\x4D\xF4\x35\xC9\x34\x02\x84\x92\x36\xC3\xFA\xB4\xD2\x7C\x70\x26\xC1\xD4\xDC\xB2\x60\x26\x46\xDE\xC9\x75\x1E\x76\x3D\xBA\x37\xBD\xF8\xFF\x94\x06\xAD\x9E\x53\x0E\xE5\xDB\x38\x2F\x41\x30\x01\xAE\xB0\x6A\x53\xED\x90\x27\xD8\x31\x17\x97\x27\xB0\x86\x5A\x89\x18\xDA\x3E\xDB\xEB\xCF\x9B\x14\xED\x44\xCE\x6C\xBA\xCE\xD4\xBB\x1B\xDB\x7F\x14\x47\xE6\xCC\x25\x4B\x33\x20\x51\x51\x2B\xD7\xAF\x42\x6F\xB8\xF4\x01\x37\x8C\xD2\xBF\x59\x83\xCA\x01\xC6\x4B\x92\xEC\xF0\x32\xEA\x15\xD1\x72\x1D\x03\xF4\x82\xD7\xCE\x6E\x74\xFE\xF6\xD5\x5E\x70\x2F\x46\x98\x0C\x82\xB5\xA8\x40\x31\x90\x0B\x1C\x9E\x59\xE7\xC9\x7F\xBE\xC7\xE8\xF3\x23\xA9\x7A\x7E\x36\xCC\x88\xBE\x0F\x1D\x45\xB7\xFF\x58\x5A\xC5\x4B\xD4\x07\xB2\x2B\x41\x54\xAA\xCC\x8F\x6D\x7E\xBF\x48\xE1\xD8\x14\xCC\x5E\xD2\x0F\x80\x37\xE0\xA7\x97\x15\xEE\xF2\x9B\xE3\x28\x06\xA1\xD5\x8B\xB7\xC5\xDA\x76\xF5\x50\xAA\x3D\x8A\x1F\xBF\xF0\xEB\x19\xCC\xB1\xA3\x13\xD5\x5C\xDA\x56\xC9\xEC\x2E\xF2\x96\x32\x38\x7F\xE8\xD7\x6E\x3C\x04\x68\x04\x3E\x8F\x66\x3F\x48\x60\xEE\x12\xBF\x2D\x5B\x0B\x74\x74\xD6\xE6\x94\xF9\x1E\x6D\xBE\x11\x59\x74\xA3\x92\x6F\x12\xFE\xE5\xE4\x38\x77\x7C\xB6\xA9\x32\xDF\x8C\xD8\xBE\xC4\xD0\x73\xB9\x31\xBA\x3B\xC8\x32\xB6\x8D\x9D\xD3\x00\x74\x1F\xA7\xBF\x8A\xFC\x47\xED\x25\x76\xF6\x93\x6B\xA4\x24\x66\x3A\xAB\x63\x9C\x5A\xE4\xF5\x68\x34\x23\xB4\x74\x2B\xF1\xC9\x78\x23\x8F\x16\xCB\xE3\x9D\x65\x2D\xE3\xFD\xB8\xBE\xFC\x84\x8A\xD9\x22\x22\x2E\x04\xA4\x03\x7C\x07\x13\xEB\x57\xA8\x1A\x23\xF0\xC7\x34\x73\xFC\x64\x6C\xEA\x30\x6B\x4B\xCB\xC8\x86\x2F\x83\x85\xDD\xFA\x9D\x4B\x7F\xA2\xC0\x87\xE8\x79\x68\x33\x03\xED\x5B\xDD\x3A\x06\x2B\x3C\xF5\xB3\xA2\x78\xA6\x6D\x2A\x13\xF8\x3F\x44\xF8\x2D\xDF\x31\x0E\xE0\x74\xAB\x6A\x36\x45\x97\xE8\x99\xA0\x25\x5D\xC1\x64\xF3\x1C\xC5\x08\x46\x85\x1D\xF9\xAB\x48\x19\x5D\xED\x7E\xA1\xB1\xD5\x10\xBD\x7E\xE7\x4D\x73\xFA\xF3\x6B\xC3\x1E\xCF\xA2\x68\x35\x90\x46\xF4\xEB\x87\x9F\x92\x40\x09\x43\x8B\x48\x1C\x6C\xD7\x88\x9A\x00\x2E\xD5\xEE\x38\x2B\xC9\x19\x0D\xA6\xFC\x02\x6E\x47\x95\x58\xE4\x47\x56\x77\xE9\xAA\x9E\x30\x50\xE2\x76\x56\x94\xDF\xC8\x1F\x56\xE8\x80\xB9\x6E\x71\x60\xC9\x80\xDD\x98\xED\xD3\xDF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 349 151 350 152 (* RFC5114 *) 351 153 352 154 (* 1024-bit, 160-bit subgroup *) 353 155 let rfc_5114_1 = 354 156 let p = 355 - "\xB1\x0B\x8F\x96\xA0\x80\xE0\x1D\xDE\x92\xDE\x5E\xAE\x5D\x54\xEC\ 356 - \x52\xC9\x9F\xBC\xFB\x06\xA3\xC6\x9A\x6A\x9D\xCA\x52\xD2\x3B\x61\ 357 - \x60\x73\xE2\x86\x75\xA2\x3D\x18\x98\x38\xEF\x1E\x2E\xE6\x52\xC0\ 358 - \x13\xEC\xB4\xAE\xA9\x06\x11\x23\x24\x97\x5C\x3C\xD4\x9B\x83\xBF\ 359 - \xAC\xCB\xDD\x7D\x90\xC4\xBD\x70\x98\x48\x8E\x9C\x21\x9A\x73\x72\ 360 - \x4E\xFF\xD6\xFA\xE5\x64\x47\x38\xFA\xA3\x1A\x4F\xF5\x5B\xCC\xC0\ 361 - \xA1\x51\xAF\x5F\x0D\xC8\xB4\xBD\x45\xBF\x37\xDF\x36\x5C\x1A\x65\ 362 - \xE6\x8C\xFD\xA7\x6D\x4D\xA7\x08\xDF\x1F\xB2\xBC\x2E\x4A\x43\x71" 157 + "\xB1\x0B\x8F\x96\xA0\x80\xE0\x1D\xDE\x92\xDE\x5E\xAE\x5D\x54\xEC\x52\xC9\x9F\xBC\xFB\x06\xA3\xC6\x9A\x6A\x9D\xCA\x52\xD2\x3B\x61\x60\x73\xE2\x86\x75\xA2\x3D\x18\x98\x38\xEF\x1E\x2E\xE6\x52\xC0\x13\xEC\xB4\xAE\xA9\x06\x11\x23\x24\x97\x5C\x3C\xD4\x9B\x83\xBF\xAC\xCB\xDD\x7D\x90\xC4\xBD\x70\x98\x48\x8E\x9C\x21\x9A\x73\x72\x4E\xFF\xD6\xFA\xE5\x64\x47\x38\xFA\xA3\x1A\x4F\xF5\x5B\xCC\xC0\xA1\x51\xAF\x5F\x0D\xC8\xB4\xBD\x45\xBF\x37\xDF\x36\x5C\x1A\x65\xE6\x8C\xFD\xA7\x6D\x4D\xA7\x08\xDF\x1F\xB2\xBC\x2E\x4A\x43\x71" 363 158 and gg = 364 - "\xA4\xD1\xCB\xD5\xC3\xFD\x34\x12\x67\x65\xA4\x42\xEF\xB9\x99\x05\ 365 - \xF8\x10\x4D\xD2\x58\xAC\x50\x7F\xD6\x40\x6C\xFF\x14\x26\x6D\x31\ 366 - \x26\x6F\xEA\x1E\x5C\x41\x56\x4B\x77\x7E\x69\x0F\x55\x04\xF2\x13\ 367 - \x16\x02\x17\xB4\xB0\x1B\x88\x6A\x5E\x91\x54\x7F\x9E\x27\x49\xF4\ 368 - \xD7\xFB\xD7\xD3\xB9\xA9\x2E\xE1\x90\x9D\x0D\x22\x63\xF8\x0A\x76\ 369 - \xA6\xA2\x4C\x08\x7A\x09\x1F\x53\x1D\xBF\x0A\x01\x69\xB6\xA2\x8A\ 370 - \xD6\x62\xA4\xD1\x8E\x73\xAF\xA3\x2D\x77\x9D\x59\x18\xD0\x8B\xC8\ 371 - \x85\x8F\x4D\xCE\xF9\x7C\x2A\x24\\x85\x5E\x6E\xEB\x22\xB3\xB2\xE5" 159 + "\xA4\xD1\xCB\xD5\xC3\xFD\x34\x12\x67\x65\xA4\x42\xEF\xB9\x99\x05\xF8\x10\x4D\xD2\x58\xAC\x50\x7F\xD6\x40\x6C\xFF\x14\x26\x6D\x31\x26\x6F\xEA\x1E\x5C\x41\x56\x4B\x77\x7E\x69\x0F\x55\x04\xF2\x13\x16\x02\x17\xB4\xB0\x1B\x88\x6A\x5E\x91\x54\x7F\x9E\x27\x49\xF4\xD7\xFB\xD7\xD3\xB9\xA9\x2E\xE1\x90\x9D\x0D\x22\x63\xF8\x0A\x76\xA6\xA2\x4C\x08\x7A\x09\x1F\x53\x1D\xBF\x0A\x01\x69\xB6\xA2\x8A\xD6\x62\xA4\xD1\x8E\x73\xAF\xA3\x2D\x77\x9D\x59\x18\xD0\x8B\xC8\x85\x8F\x4D\xCE\xF9\x7C\x2A\x24\\x85\x5E\x6E\xEB\x22\xB3\xB2\xE5" 372 160 and q = 373 - "\xF5\x18\xAA\x87\x81\xA8\xDF\x27\x8A\xBA\x4E\x7D\x64\xB7\xCB\x9D\ 374 - \x49\x46\x23\x53" 161 + "\xF5\x18\xAA\x87\x81\xA8\xDF\x27\x8A\xBA\x4E\x7D\x64\xB7\xCB\x9D\x49\x46\x23\x53" 375 162 in 376 163 group ~p ~gg ~q 377 164 378 165 (* 2048-bit, 224-bit subgroup *) 379 166 let rfc_5114_2 = 380 167 let p = 381 - "\xAD\x10\x7E\x1E\x91\x23\xA9\xD0\xD6\x60\xFA\xA7\x95\x59\xC5\x1F\ 382 - \xA2\x0D\x64\xE5\x68\x3B\x9F\xD1\xB5\x4B\x15\x97\xB6\x1D\x0A\x75\ 383 - \xE6\xFA\x14\x1D\xF9\x5A\x56\xDB\xAF\x9A\x3C\x40\x7B\xA1\xDF\x15\ 384 - \xEB\x3D\x68\x8A\x30\x9C\x18\x0E\x1D\xE6\xB8\x5A\x12\x74\xA0\xA6\ 385 - \x6D\x3F\x81\x52\xAD\x6A\xC2\x12\x90\x37\xC9\xED\xEF\xDA\x4D\xF8\ 386 - \xD9\x1E\x8F\xEF\x55\xB7\x39\x4B\x7A\xD5\xB7\xD0\xB6\xC1\x22\x07\ 387 - \xC9\xF9\x8D\x11\xED\x34\xDB\xF6\xC6\xBA\x0B\x2C\x8B\xBC\x27\xBE\ 388 - \x6A\x00\xE0\xA0\xB9\xC4\x97\x08\xB3\xBF\x8A\x31\x70\x91\x88\x36\ 389 - \x81\x28\x61\x30\xBC\x89\x85\xDB\x16\x02\xE7\x14\x41\x5D\x93\x30\ 390 - \x27\x82\x73\xC7\xDE\x31\xEF\xDC\x73\x10\xF7\x12\x1F\xD5\xA0\x74\ 391 - \x15\x98\x7D\x9A\xDC\x0A\x48\x6D\xCD\xF9\x3A\xCC\x44\x32\x83\x87\ 392 - \x31\x5D\x75\xE1\x98\xC6\x41\xA4\x80\xCD\x86\xA1\xB9\xE5\x87\xE8\ 393 - \xBE\x60\xE6\x9C\xC9\x28\xB2\xB9\xC5\x21\x72\xE4\x13\x04\x2E\x9B\ 394 - \x23\xF1\x0B\x0E\x16\xE7\x97\x63\xC9\xB5\x3D\xCF\x4B\xA8\x0A\x29\ 395 - \xE3\xFB\x73\xC1\x6B\x8E\x75\xB9\x7E\xF3\x63\xE2\xFF\xA3\x1F\x71\ 396 - \xCF\x9D\xE5\x38\x4E\x71\xB8\x1C\x0A\xC4\xDF\xFE\x0C\x10\xE6\x4F" 168 + "\xAD\x10\x7E\x1E\x91\x23\xA9\xD0\xD6\x60\xFA\xA7\x95\x59\xC5\x1F\xA2\x0D\x64\xE5\x68\x3B\x9F\xD1\xB5\x4B\x15\x97\xB6\x1D\x0A\x75\xE6\xFA\x14\x1D\xF9\x5A\x56\xDB\xAF\x9A\x3C\x40\x7B\xA1\xDF\x15\xEB\x3D\x68\x8A\x30\x9C\x18\x0E\x1D\xE6\xB8\x5A\x12\x74\xA0\xA6\x6D\x3F\x81\x52\xAD\x6A\xC2\x12\x90\x37\xC9\xED\xEF\xDA\x4D\xF8\xD9\x1E\x8F\xEF\x55\xB7\x39\x4B\x7A\xD5\xB7\xD0\xB6\xC1\x22\x07\xC9\xF9\x8D\x11\xED\x34\xDB\xF6\xC6\xBA\x0B\x2C\x8B\xBC\x27\xBE\x6A\x00\xE0\xA0\xB9\xC4\x97\x08\xB3\xBF\x8A\x31\x70\x91\x88\x36\x81\x28\x61\x30\xBC\x89\x85\xDB\x16\x02\xE7\x14\x41\x5D\x93\x30\x27\x82\x73\xC7\xDE\x31\xEF\xDC\x73\x10\xF7\x12\x1F\xD5\xA0\x74\x15\x98\x7D\x9A\xDC\x0A\x48\x6D\xCD\xF9\x3A\xCC\x44\x32\x83\x87\x31\x5D\x75\xE1\x98\xC6\x41\xA4\x80\xCD\x86\xA1\xB9\xE5\x87\xE8\xBE\x60\xE6\x9C\xC9\x28\xB2\xB9\xC5\x21\x72\xE4\x13\x04\x2E\x9B\x23\xF1\x0B\x0E\x16\xE7\x97\x63\xC9\xB5\x3D\xCF\x4B\xA8\x0A\x29\xE3\xFB\x73\xC1\x6B\x8E\x75\xB9\x7E\xF3\x63\xE2\xFF\xA3\x1F\x71\xCF\x9D\xE5\x38\x4E\x71\xB8\x1C\x0A\xC4\xDF\xFE\x0C\x10\xE6\x4F" 397 169 and gg = 398 - "\xAC\x40\x32\xEF\x4F\x2D\x9A\xE3\x9D\xF3\x0B\x5C\x8F\xFD\xAC\x50\ 399 - \x6C\xDE\xBE\x7B\x89\x99\x8C\xAF\x74\x86\x6A\x08\xCF\xE4\xFF\xE3\ 400 - \xA6\x82\x4A\x4E\x10\xB9\xA6\xF0\xDD\x92\x1F\x01\xA7\x0C\x4A\xFA\ 401 - \xAB\x73\x9D\x77\x00\xC2\x9F\x52\xC5\x7D\xB1\x7C\x62\x0A\x86\x52\ 402 - \xBE\x5E\x90\x01\xA8\xD6\x6A\xD7\xC1\x76\x69\x10\x19\x99\x02\x4A\ 403 - \xF4\xD0\x27\x27\x5A\xC1\x34\x8B\xB8\xA7\x62\xD0\x52\x1B\xC9\x8A\ 404 - \xE2\x47\x15\x04\x22\xEA\x1E\xD4\x09\x93\x9D\x54\xDA\x74\x60\xCD\ 405 - \xB5\xF6\xC6\xB2\x50\x71\x7C\xBE\xF1\x80\xEB\x34\x11\x8E\x98\xD1\ 406 - \x19\x52\x9A\x45\xD6\xF8\x34\x56\x6E\x30\x25\xE3\x16\xA3\x30\xEF\ 407 - \xBB\x77\xA8\x6F\x0C\x1A\xB1\x5B\x05\x1A\xE3\xD4\x28\xC8\xF8\xAC\ 408 - \xB7\x0A\x81\x37\x15\x0B\x8E\xEB\x10\xE1\x83\xED\xD1\x99\x63\xDD\ 409 - \xD9\xE2\x63\xE4\x77\x05\x89\xEF\x6A\xA2\x1E\x7F\x5F\x2F\xF3\x81\ 410 - \xB5\x39\xCC\xE3\x40\x9D\x13\xCD\x56\x6A\xFB\xB4\x8D\x6C\x01\x91\ 411 - \x81\xE1\xBC\xFE\x94\xB3\x02\x69\xED\xFE\x72\xFE\x9B\x6A\xA4\xBD\ 412 - \x7B\x5A\x0F\x1C\x71\xCF\xFF\x4C\x19\xC4\x18\xE1\xF6\xEC\x01\x79\ 413 - \x81\xBC\x08\x7F\x2A\x70\x65\xB3\x84\xB8\x90\xD3\x19\x1F\x2B\xFA" 170 + "\xAC\x40\x32\xEF\x4F\x2D\x9A\xE3\x9D\xF3\x0B\x5C\x8F\xFD\xAC\x50\x6C\xDE\xBE\x7B\x89\x99\x8C\xAF\x74\x86\x6A\x08\xCF\xE4\xFF\xE3\xA6\x82\x4A\x4E\x10\xB9\xA6\xF0\xDD\x92\x1F\x01\xA7\x0C\x4A\xFA\xAB\x73\x9D\x77\x00\xC2\x9F\x52\xC5\x7D\xB1\x7C\x62\x0A\x86\x52\xBE\x5E\x90\x01\xA8\xD6\x6A\xD7\xC1\x76\x69\x10\x19\x99\x02\x4A\xF4\xD0\x27\x27\x5A\xC1\x34\x8B\xB8\xA7\x62\xD0\x52\x1B\xC9\x8A\xE2\x47\x15\x04\x22\xEA\x1E\xD4\x09\x93\x9D\x54\xDA\x74\x60\xCD\xB5\xF6\xC6\xB2\x50\x71\x7C\xBE\xF1\x80\xEB\x34\x11\x8E\x98\xD1\x19\x52\x9A\x45\xD6\xF8\x34\x56\x6E\x30\x25\xE3\x16\xA3\x30\xEF\xBB\x77\xA8\x6F\x0C\x1A\xB1\x5B\x05\x1A\xE3\xD4\x28\xC8\xF8\xAC\xB7\x0A\x81\x37\x15\x0B\x8E\xEB\x10\xE1\x83\xED\xD1\x99\x63\xDD\xD9\xE2\x63\xE4\x77\x05\x89\xEF\x6A\xA2\x1E\x7F\x5F\x2F\xF3\x81\xB5\x39\xCC\xE3\x40\x9D\x13\xCD\x56\x6A\xFB\xB4\x8D\x6C\x01\x91\x81\xE1\xBC\xFE\x94\xB3\x02\x69\xED\xFE\x72\xFE\x9B\x6A\xA4\xBD\x7B\x5A\x0F\x1C\x71\xCF\xFF\x4C\x19\xC4\x18\xE1\xF6\xEC\x01\x79\x81\xBC\x08\x7F\x2A\x70\x65\xB3\x84\xB8\x90\xD3\x19\x1F\x2B\xFA" 414 171 and q = 415 - "\x80\x1C\x0D\x34\xC5\x8D\x93\xFE\x99\x71\x77\x10\x1F\x80\x53\x5A\ 416 - \x47\x38\xCE\xBC\xBF\x38\x9A\x99\xB3\x63\x71\xEB" 172 + "\x80\x1C\x0D\x34\xC5\x8D\x93\xFE\x99\x71\x77\x10\x1F\x80\x53\x5A\x47\x38\xCE\xBC\xBF\x38\x9A\x99\xB3\x63\x71\xEB" 417 173 in 418 174 group ~p ~gg ~q 419 175 420 176 (* 2048-bit, 256-bit subgroup *) 421 177 let rfc_5114_3 = 422 178 let p = 423 - "\x87\xA8\xE6\x1D\xB4\xB6\x66\x3C\xFF\xBB\xD1\x9C\x65\x19\x59\x99\ 424 - \x8C\xEE\xF6\x08\x66\x0D\xD0\xF2\x5D\x2C\xEE\xD4\x43\x5E\x3B\x00\ 425 - \xE0\x0D\xF8\xF1\xD6\x19\x57\xD4\xFA\xF7\xDF\x45\x61\xB2\xAA\x30\ 426 - \x16\xC3\xD9\x11\x34\x09\x6F\xAA\x3B\xF4\x29\x6D\x83\x0E\x9A\x7C\ 427 - \x20\x9E\x0C\x64\x97\x51\x7A\xBD\x5A\x8A\x9D\x30\x6B\xCF\x67\xED\ 428 - \x91\xF9\xE6\x72\x5B\x47\x58\xC0\x22\xE0\xB1\xEF\x42\x75\xBF\x7B\ 429 - \x6C\x5B\xFC\x11\xD4\x5F\x90\x88\xB9\x41\xF5\x4E\xB1\xE5\x9B\xB8\ 430 - \xBC\x39\xA0\xBF\x12\x30\x7F\x5C\x4F\xDB\x70\xC5\x81\xB2\x3F\x76\ 431 - \xB6\x3A\xCA\xE1\xCA\xA6\xB7\x90\x2D\x52\x52\x67\x35\x48\x8A\x0E\ 432 - \xF1\x3C\x6D\x9A\x51\xBF\xA4\xAB\x3A\xD8\x34\x77\x96\x52\x4D\x8E\ 433 - \xF6\xA1\x67\xB5\xA4\x18\x25\xD9\x67\xE1\x44\xE5\x14\x05\x64\x25\ 434 - \x1C\xCA\xCB\x83\xE6\xB4\x86\xF6\xB3\xCA\x3F\x79\x71\x50\x60\x26\ 435 - \xC0\xB8\x57\xF6\x89\x96\x28\x56\xDE\xD4\x01\x0A\xBD\x0B\xE6\x21\ 436 - \xC3\xA3\x96\x0A\x54\xE7\x10\xC3\x75\xF2\x63\x75\xD7\x01\x41\x03\ 437 - \xA4\xB5\x43\x30\xC1\x98\xAF\x12\x61\x16\xD2\x27\x6E\x11\x71\x5F\ 438 - \x69\x38\x77\xFA\xD7\xEF\x09\xCA\xDB\x09\x4A\xE9\x1E\x1A\x15\x97" 179 + "\x87\xA8\xE6\x1D\xB4\xB6\x66\x3C\xFF\xBB\xD1\x9C\x65\x19\x59\x99\x8C\xEE\xF6\x08\x66\x0D\xD0\xF2\x5D\x2C\xEE\xD4\x43\x5E\x3B\x00\xE0\x0D\xF8\xF1\xD6\x19\x57\xD4\xFA\xF7\xDF\x45\x61\xB2\xAA\x30\x16\xC3\xD9\x11\x34\x09\x6F\xAA\x3B\xF4\x29\x6D\x83\x0E\x9A\x7C\x20\x9E\x0C\x64\x97\x51\x7A\xBD\x5A\x8A\x9D\x30\x6B\xCF\x67\xED\x91\xF9\xE6\x72\x5B\x47\x58\xC0\x22\xE0\xB1\xEF\x42\x75\xBF\x7B\x6C\x5B\xFC\x11\xD4\x5F\x90\x88\xB9\x41\xF5\x4E\xB1\xE5\x9B\xB8\xBC\x39\xA0\xBF\x12\x30\x7F\x5C\x4F\xDB\x70\xC5\x81\xB2\x3F\x76\xB6\x3A\xCA\xE1\xCA\xA6\xB7\x90\x2D\x52\x52\x67\x35\x48\x8A\x0E\xF1\x3C\x6D\x9A\x51\xBF\xA4\xAB\x3A\xD8\x34\x77\x96\x52\x4D\x8E\xF6\xA1\x67\xB5\xA4\x18\x25\xD9\x67\xE1\x44\xE5\x14\x05\x64\x25\x1C\xCA\xCB\x83\xE6\xB4\x86\xF6\xB3\xCA\x3F\x79\x71\x50\x60\x26\xC0\xB8\x57\xF6\x89\x96\x28\x56\xDE\xD4\x01\x0A\xBD\x0B\xE6\x21\xC3\xA3\x96\x0A\x54\xE7\x10\xC3\x75\xF2\x63\x75\xD7\x01\x41\x03\xA4\xB5\x43\x30\xC1\x98\xAF\x12\x61\x16\xD2\x27\x6E\x11\x71\x5F\x69\x38\x77\xFA\xD7\xEF\x09\xCA\xDB\x09\x4A\xE9\x1E\x1A\x15\x97" 439 180 and gg = 440 - "\x3F\xB3\x2C\x9B\x73\x13\x4D\x0B\x2E\x77\x50\x66\x60\xED\xBD\x48\ 441 - \x4C\xA7\xB1\x8F\x21\xEF\x20\x54\x07\xF4\x79\x3A\x1A\x0B\xA1\x25\ 442 - \x10\xDB\xC1\x50\x77\xBE\x46\x3F\xFF\x4F\xED\x4A\xAC\x0B\xB5\x55\ 443 - \xBE\x3A\x6C\x1B\x0C\x6B\x47\xB1\xBC\x37\x73\xBF\x7E\x8C\x6F\x62\ 444 - \x90\x12\x28\xF8\xC2\x8C\xBB\x18\xA5\x5A\xE3\x13\x41\x00\x0A\x65\ 445 - \x01\x96\xF9\x31\xC7\x7A\x57\xF2\xDD\xF4\x63\xE5\xE9\xEC\x14\x4B\ 446 - \x77\x7D\xE6\x2A\xAA\xB8\xA8\x62\x8A\xC3\x76\xD2\x82\xD6\xED\x38\ 447 - \x64\xE6\x79\x82\x42\x8E\xBC\x83\x1D\x14\x34\x8F\x6F\x2F\x91\x93\ 448 - \xB5\x04\x5A\xF2\x76\x71\x64\xE1\xDF\xC9\x67\xC1\xFB\x3F\x2E\x55\ 449 - \xA4\xBD\x1B\xFF\xE8\x3B\x9C\x80\xD0\x52\xB9\x85\xD1\x82\xEA\x0A\ 450 - \xDB\x2A\x3B\x73\x13\xD3\xFE\x14\xC8\x48\x4B\x1E\x05\x25\x88\xB9\ 451 - \xB7\xD2\xBB\xD2\xDF\x01\x61\x99\xEC\xD0\x6E\x15\x57\xCD\x09\x15\ 452 - \xB3\x35\x3B\xBB\x64\xE0\xEC\x37\x7F\xD0\x28\x37\x0D\xF9\x2B\x52\ 453 - \xC7\x89\x14\x28\xCD\xC6\x7E\xB6\x18\x4B\x52\x3D\x1D\xB2\x46\xC3\ 454 - \x2F\x63\x07\x84\x90\xF0\x0E\xF8\xD6\x47\xD1\x48\xD4\x79\x54\x51\ 455 - \x5E\x23\x27\xCF\xEF\x98\xC5\x82\x66\x4B\x4C\x0F\x6C\xC4\x16\x59" 181 + "\x3F\xB3\x2C\x9B\x73\x13\x4D\x0B\x2E\x77\x50\x66\x60\xED\xBD\x48\x4C\xA7\xB1\x8F\x21\xEF\x20\x54\x07\xF4\x79\x3A\x1A\x0B\xA1\x25\x10\xDB\xC1\x50\x77\xBE\x46\x3F\xFF\x4F\xED\x4A\xAC\x0B\xB5\x55\xBE\x3A\x6C\x1B\x0C\x6B\x47\xB1\xBC\x37\x73\xBF\x7E\x8C\x6F\x62\x90\x12\x28\xF8\xC2\x8C\xBB\x18\xA5\x5A\xE3\x13\x41\x00\x0A\x65\x01\x96\xF9\x31\xC7\x7A\x57\xF2\xDD\xF4\x63\xE5\xE9\xEC\x14\x4B\x77\x7D\xE6\x2A\xAA\xB8\xA8\x62\x8A\xC3\x76\xD2\x82\xD6\xED\x38\x64\xE6\x79\x82\x42\x8E\xBC\x83\x1D\x14\x34\x8F\x6F\x2F\x91\x93\xB5\x04\x5A\xF2\x76\x71\x64\xE1\xDF\xC9\x67\xC1\xFB\x3F\x2E\x55\xA4\xBD\x1B\xFF\xE8\x3B\x9C\x80\xD0\x52\xB9\x85\xD1\x82\xEA\x0A\xDB\x2A\x3B\x73\x13\xD3\xFE\x14\xC8\x48\x4B\x1E\x05\x25\x88\xB9\xB7\xD2\xBB\xD2\xDF\x01\x61\x99\xEC\xD0\x6E\x15\x57\xCD\x09\x15\xB3\x35\x3B\xBB\x64\xE0\xEC\x37\x7F\xD0\x28\x37\x0D\xF9\x2B\x52\xC7\x89\x14\x28\xCD\xC6\x7E\xB6\x18\x4B\x52\x3D\x1D\xB2\x46\xC3\x2F\x63\x07\x84\x90\xF0\x0E\xF8\xD6\x47\xD1\x48\xD4\x79\x54\x51\x5E\x23\x27\xCF\xEF\x98\xC5\x82\x66\x4B\x4C\x0F\x6C\xC4\x16\x59" 456 182 and q = 457 - "\x8C\xF8\x36\x42\xA7\x09\xA0\x97\xB4\x47\x99\x76\x40\x12\x9D\xA2\ 458 - \x99\xB1\xA4\x7D\x1E\xB3\x75\x0B\xA3\x08\xB0\xFE\x64\xF5\xFB\xD3" 183 + "\x8C\xF8\x36\x42\xA7\x09\xA0\x97\xB4\x47\x99\x76\x40\x12\x9D\xA2\x99\xB1\xA4\x7D\x1E\xB3\x75\x0B\xA3\x08\xB0\xFE\x64\xF5\xFB\xD3" 459 184 in 460 185 group ~p ~gg ~q 461 - 462 186 463 187 (* draft-ietf-tls-negotiated-ff-dhe-08 *) 464 188 ··· 469 193 Peers using ffdhe2048 that want to optimize their key exchange with a 470 194 short exponent (Section 5.2) should choose a secret key of at least 471 195 225 bits. *) 472 - s_group ~p: 473 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\ 474 - \xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\ 475 - \xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\ 476 - \x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\ 477 - \xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\ 478 - \x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\ 479 - \x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\ 480 - \x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\ 481 - \xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\ 482 - \xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\ 483 - \xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\ 484 - \x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\ 485 - \x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\ 486 - \xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\ 487 - \xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\ 488 - \x88\x6B\x42\x38\x61\x28\x5C\x97\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 489 - 196 + s_group 197 + ~p: 198 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\x88\x6B\x42\x38\x61\x28\x5C\x97\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 490 199 491 200 let ffdhe3072 = 492 201 (* p = 2^3072 - 2^3008 + {[2^2942 * e] + 2625351} * 2^64 -1 *) ··· 495 204 Peers using ffdhe3072 that want to optimize their key exchange with a 496 205 short exponent (Section 5.2) should choose a secret key of at least 497 206 275 bits. *) 498 - s_group ~p: 499 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\ 500 - \xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\ 501 - \xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\ 502 - \x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\ 503 - \xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\ 504 - \x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\ 505 - \x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\ 506 - \x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\ 507 - \xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\ 508 - \xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\ 509 - \xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\ 510 - \x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\ 511 - \x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\ 512 - \xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\ 513 - \xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\ 514 - \x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\ 515 - \xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\ 516 - \x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\ 517 - \xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\ 518 - \xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\ 519 - \x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\ 520 - \xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\ 521 - \x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\ 522 - \x25\xE4\x1D\x2B\x66\xC6\x2E\x37\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 207 + s_group 208 + ~p: 209 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\x25\xE4\x1D\x2B\x66\xC6\x2E\x37\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 523 210 524 211 let ffdhe4096 = 525 212 (* p = 2^4096 - 2^4032 + {[2^3966 * e] + 5736041} * 2^64 - 1 *) ··· 528 215 Peers using ffdhe4096 that want to optimize their key exchange with a 529 216 short exponent (Section 5.2) should choose a secret key of at least 530 217 325 bits. *) 531 - s_group ~p: 532 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\ 533 - \xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\ 534 - \xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\ 535 - \x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\ 536 - \xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\ 537 - \x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\ 538 - \x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\ 539 - \x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\ 540 - \xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\ 541 - \xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\ 542 - \xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\ 543 - \x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\ 544 - \x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\ 545 - \xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\ 546 - \xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\ 547 - \x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\ 548 - \xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\ 549 - \x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\ 550 - \xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\ 551 - \xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\ 552 - \x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\ 553 - \xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\ 554 - \x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\ 555 - \x25\xE4\x1D\x2B\x66\x9E\x1E\xF1\x6E\x6F\x52\xC3\x16\x4D\xF4\xFB\ 556 - \x79\x30\xE9\xE4\xE5\x88\x57\xB6\xAC\x7D\x5F\x42\xD6\x9F\x6D\x18\ 557 - \x77\x63\xCF\x1D\x55\x03\x40\x04\x87\xF5\x5B\xA5\x7E\x31\xCC\x7A\ 558 - \x71\x35\xC8\x86\xEF\xB4\x31\x8A\xED\x6A\x1E\x01\x2D\x9E\x68\x32\ 559 - \xA9\x07\x60\x0A\x91\x81\x30\xC4\x6D\xC7\x78\xF9\x71\xAD\x00\x38\ 560 - \x09\x29\x99\xA3\x33\xCB\x8B\x7A\x1A\x1D\xB9\x3D\x71\x40\x00\x3C\ 561 - \x2A\x4E\xCE\xA9\xF9\x8D\x0A\xCC\x0A\x82\x91\xCD\xCE\xC9\x7D\xCF\ 562 - \x8E\xC9\xB5\x5A\x7F\x88\xA4\x6B\x4D\xB5\xA8\x51\xF4\x41\x82\xE1\ 563 - \xC6\x8A\x00\x7E\x5E\x65\x5F\x6A\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 218 + s_group 219 + ~p: 220 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\x25\xE4\x1D\x2B\x66\x9E\x1E\xF1\x6E\x6F\x52\xC3\x16\x4D\xF4\xFB\x79\x30\xE9\xE4\xE5\x88\x57\xB6\xAC\x7D\x5F\x42\xD6\x9F\x6D\x18\x77\x63\xCF\x1D\x55\x03\x40\x04\x87\xF5\x5B\xA5\x7E\x31\xCC\x7A\x71\x35\xC8\x86\xEF\xB4\x31\x8A\xED\x6A\x1E\x01\x2D\x9E\x68\x32\xA9\x07\x60\x0A\x91\x81\x30\xC4\x6D\xC7\x78\xF9\x71\xAD\x00\x38\x09\x29\x99\xA3\x33\xCB\x8B\x7A\x1A\x1D\xB9\x3D\x71\x40\x00\x3C\x2A\x4E\xCE\xA9\xF9\x8D\x0A\xCC\x0A\x82\x91\xCD\xCE\xC9\x7D\xCF\x8E\xC9\xB5\x5A\x7F\x88\xA4\x6B\x4D\xB5\xA8\x51\xF4\x41\x82\xE1\xC6\x8A\x00\x7E\x5E\x65\x5F\x6A\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 564 221 565 222 let ffdhe6144 = 566 223 (* p = 2^6144 - 2^6080 + {[2^6014 * e] + 15705020} * 2^64 - 1 *) ··· 569 226 Peers using ffdhe6144 that want to optimize their key exchange with a 570 227 short exponent (Section 5.2) should choose a secret key of at least 571 228 375 bits. *) 572 - s_group ~p: 573 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\ 574 - \xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\ 575 - \xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\ 576 - \x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\ 577 - \xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\ 578 - \x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\ 579 - \x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\ 580 - \x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\ 581 - \xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\ 582 - \xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\ 583 - \xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\ 584 - \x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\ 585 - \x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\ 586 - \xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\ 587 - \xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\ 588 - \x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\ 589 - \xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\ 590 - \x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\ 591 - \xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\ 592 - \xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\ 593 - \x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\ 594 - \xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\ 595 - \x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\ 596 - \x25\xE4\x1D\x2B\x66\x9E\x1E\xF1\x6E\x6F\x52\xC3\x16\x4D\xF4\xFB\ 597 - \x79\x30\xE9\xE4\xE5\x88\x57\xB6\xAC\x7D\x5F\x42\xD6\x9F\x6D\x18\ 598 - \x77\x63\xCF\x1D\x55\x03\x40\x04\x87\xF5\x5B\xA5\x7E\x31\xCC\x7A\ 599 - \x71\x35\xC8\x86\xEF\xB4\x31\x8A\xED\x6A\x1E\x01\x2D\x9E\x68\x32\ 600 - \xA9\x07\x60\x0A\x91\x81\x30\xC4\x6D\xC7\x78\xF9\x71\xAD\x00\x38\ 601 - \x09\x29\x99\xA3\x33\xCB\x8B\x7A\x1A\x1D\xB9\x3D\x71\x40\x00\x3C\ 602 - \x2A\x4E\xCE\xA9\xF9\x8D\x0A\xCC\x0A\x82\x91\xCD\xCE\xC9\x7D\xCF\ 603 - \x8E\xC9\xB5\x5A\x7F\x88\xA4\x6B\x4D\xB5\xA8\x51\xF4\x41\x82\xE1\ 604 - \xC6\x8A\x00\x7E\x5E\x0D\xD9\x02\x0B\xFD\x64\xB6\x45\x03\x6C\x7A\ 605 - \x4E\x67\x7D\x2C\x38\x53\x2A\x3A\x23\xBA\x44\x42\xCA\xF5\x3E\xA6\ 606 - \x3B\xB4\x54\x32\x9B\x76\x24\xC8\x91\x7B\xDD\x64\xB1\xC0\xFD\x4C\ 607 - \xB3\x8E\x8C\x33\x4C\x70\x1C\x3A\xCD\xAD\x06\x57\xFC\xCF\xEC\x71\ 608 - \x9B\x1F\x5C\x3E\x4E\x46\x04\x1F\x38\x81\x47\xFB\x4C\xFD\xB4\x77\ 609 - \xA5\x24\x71\xF7\xA9\xA9\x69\x10\xB8\x55\x32\x2E\xDB\x63\x40\xD8\ 610 - \xA0\x0E\xF0\x92\x35\x05\x11\xE3\x0A\xBE\xC1\xFF\xF9\xE3\xA2\x6E\ 611 - \x7F\xB2\x9F\x8C\x18\x30\x23\xC3\x58\x7E\x38\xDA\x00\x77\xD9\xB4\ 612 - \x76\x3E\x4E\x4B\x94\xB2\xBB\xC1\x94\xC6\x65\x1E\x77\xCA\xF9\x92\ 613 - \xEE\xAA\xC0\x23\x2A\x28\x1B\xF6\xB3\xA7\x39\xC1\x22\x61\x16\x82\ 614 - \x0A\xE8\xDB\x58\x47\xA6\x7C\xBE\xF9\xC9\x09\x1B\x46\x2D\x53\x8C\ 615 - \xD7\x2B\x03\x74\x6A\xE7\x7F\x5E\x62\x29\x2C\x31\x15\x62\xA8\x46\ 616 - \x50\x5D\xC8\x2D\xB8\x54\x33\x8A\xE4\x9F\x52\x35\xC9\x5B\x91\x17\ 617 - \x8C\xCF\x2D\xD5\xCA\xCE\xF4\x03\xEC\x9D\x18\x10\xC6\x27\x2B\x04\ 618 - \x5B\x3B\x71\xF9\xDC\x6B\x80\xD6\x3F\xDD\x4A\x8E\x9A\xDB\x1E\x69\ 619 - \x62\xA6\x95\x26\xD4\x31\x61\xC1\xA4\x1D\x57\x0D\x79\x38\xDA\xD4\ 620 - \xA4\x0E\x32\x9C\xD0\xE4\x0E\x65\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 229 + s_group 230 + ~p: 231 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\x25\xE4\x1D\x2B\x66\x9E\x1E\xF1\x6E\x6F\x52\xC3\x16\x4D\xF4\xFB\x79\x30\xE9\xE4\xE5\x88\x57\xB6\xAC\x7D\x5F\x42\xD6\x9F\x6D\x18\x77\x63\xCF\x1D\x55\x03\x40\x04\x87\xF5\x5B\xA5\x7E\x31\xCC\x7A\x71\x35\xC8\x86\xEF\xB4\x31\x8A\xED\x6A\x1E\x01\x2D\x9E\x68\x32\xA9\x07\x60\x0A\x91\x81\x30\xC4\x6D\xC7\x78\xF9\x71\xAD\x00\x38\x09\x29\x99\xA3\x33\xCB\x8B\x7A\x1A\x1D\xB9\x3D\x71\x40\x00\x3C\x2A\x4E\xCE\xA9\xF9\x8D\x0A\xCC\x0A\x82\x91\xCD\xCE\xC9\x7D\xCF\x8E\xC9\xB5\x5A\x7F\x88\xA4\x6B\x4D\xB5\xA8\x51\xF4\x41\x82\xE1\xC6\x8A\x00\x7E\x5E\x0D\xD9\x02\x0B\xFD\x64\xB6\x45\x03\x6C\x7A\x4E\x67\x7D\x2C\x38\x53\x2A\x3A\x23\xBA\x44\x42\xCA\xF5\x3E\xA6\x3B\xB4\x54\x32\x9B\x76\x24\xC8\x91\x7B\xDD\x64\xB1\xC0\xFD\x4C\xB3\x8E\x8C\x33\x4C\x70\x1C\x3A\xCD\xAD\x06\x57\xFC\xCF\xEC\x71\x9B\x1F\x5C\x3E\x4E\x46\x04\x1F\x38\x81\x47\xFB\x4C\xFD\xB4\x77\xA5\x24\x71\xF7\xA9\xA9\x69\x10\xB8\x55\x32\x2E\xDB\x63\x40\xD8\xA0\x0E\xF0\x92\x35\x05\x11\xE3\x0A\xBE\xC1\xFF\xF9\xE3\xA2\x6E\x7F\xB2\x9F\x8C\x18\x30\x23\xC3\x58\x7E\x38\xDA\x00\x77\xD9\xB4\x76\x3E\x4E\x4B\x94\xB2\xBB\xC1\x94\xC6\x65\x1E\x77\xCA\xF9\x92\xEE\xAA\xC0\x23\x2A\x28\x1B\xF6\xB3\xA7\x39\xC1\x22\x61\x16\x82\x0A\xE8\xDB\x58\x47\xA6\x7C\xBE\xF9\xC9\x09\x1B\x46\x2D\x53\x8C\xD7\x2B\x03\x74\x6A\xE7\x7F\x5E\x62\x29\x2C\x31\x15\x62\xA8\x46\x50\x5D\xC8\x2D\xB8\x54\x33\x8A\xE4\x9F\x52\x35\xC9\x5B\x91\x17\x8C\xCF\x2D\xD5\xCA\xCE\xF4\x03\xEC\x9D\x18\x10\xC6\x27\x2B\x04\x5B\x3B\x71\xF9\xDC\x6B\x80\xD6\x3F\xDD\x4A\x8E\x9A\xDB\x1E\x69\x62\xA6\x95\x26\xD4\x31\x61\xC1\xA4\x1D\x57\x0D\x79\x38\xDA\xD4\xA4\x0E\x32\x9C\xD0\xE4\x0E\x65\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 621 232 622 233 let ffdhe8192 = 623 234 (* p = 2^8192 - 2^8128 + {[2^8062 * e] + 10965728} * 2^64 - 1 *) ··· 626 237 Peers using ffdhe8192 that want to optimize their key exchange with a 627 238 short exponent (Section 5.2) should choose a secret key of at least 628 239 400 bits. *) 629 - s_group ~p: 630 - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\ 631 - \xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\ 632 - \xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\ 633 - \x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\ 634 - \xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\ 635 - \x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\ 636 - \x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\ 637 - \x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\ 638 - \xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\ 639 - \xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\ 640 - \xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\ 641 - \x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\ 642 - \x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\ 643 - \xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\ 644 - \xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\ 645 - \x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\ 646 - \xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\ 647 - \x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\ 648 - \xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\ 649 - \xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\ 650 - \x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\ 651 - \xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\ 652 - \x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\ 653 - \x25\xE4\x1D\x2B\x66\x9E\x1E\xF1\x6E\x6F\x52\xC3\x16\x4D\xF4\xFB\ 654 - \x79\x30\xE9\xE4\xE5\x88\x57\xB6\xAC\x7D\x5F\x42\xD6\x9F\x6D\x18\ 655 - \x77\x63\xCF\x1D\x55\x03\x40\x04\x87\xF5\x5B\xA5\x7E\x31\xCC\x7A\ 656 - \x71\x35\xC8\x86\xEF\xB4\x31\x8A\xED\x6A\x1E\x01\x2D\x9E\x68\x32\ 657 - \xA9\x07\x60\x0A\x91\x81\x30\xC4\x6D\xC7\x78\xF9\x71\xAD\x00\x38\ 658 - \x09\x29\x99\xA3\x33\xCB\x8B\x7A\x1A\x1D\xB9\x3D\x71\x40\x00\x3C\ 659 - \x2A\x4E\xCE\xA9\xF9\x8D\x0A\xCC\x0A\x82\x91\xCD\xCE\xC9\x7D\xCF\ 660 - \x8E\xC9\xB5\x5A\x7F\x88\xA4\x6B\x4D\xB5\xA8\x51\xF4\x41\x82\xE1\ 661 - \xC6\x8A\x00\x7E\x5E\x0D\xD9\x02\x0B\xFD\x64\xB6\x45\x03\x6C\x7A\ 662 - \x4E\x67\x7D\x2C\x38\x53\x2A\x3A\x23\xBA\x44\x42\xCA\xF5\x3E\xA6\ 663 - \x3B\xB4\x54\x32\x9B\x76\x24\xC8\x91\x7B\xDD\x64\xB1\xC0\xFD\x4C\ 664 - \xB3\x8E\x8C\x33\x4C\x70\x1C\x3A\xCD\xAD\x06\x57\xFC\xCF\xEC\x71\ 665 - \x9B\x1F\x5C\x3E\x4E\x46\x04\x1F\x38\x81\x47\xFB\x4C\xFD\xB4\x77\ 666 - \xA5\x24\x71\xF7\xA9\xA9\x69\x10\xB8\x55\x32\x2E\xDB\x63\x40\xD8\ 667 - \xA0\x0E\xF0\x92\x35\x05\x11\xE3\x0A\xBE\xC1\xFF\xF9\xE3\xA2\x6E\ 668 - \x7F\xB2\x9F\x8C\x18\x30\x23\xC3\x58\x7E\x38\xDA\x00\x77\xD9\xB4\ 669 - \x76\x3E\x4E\x4B\x94\xB2\xBB\xC1\x94\xC6\x65\x1E\x77\xCA\xF9\x92\ 670 - \xEE\xAA\xC0\x23\x2A\x28\x1B\xF6\xB3\xA7\x39\xC1\x22\x61\x16\x82\ 671 - \x0A\xE8\xDB\x58\x47\xA6\x7C\xBE\xF9\xC9\x09\x1B\x46\x2D\x53\x8C\ 672 - \xD7\x2B\x03\x74\x6A\xE7\x7F\x5E\x62\x29\x2C\x31\x15\x62\xA8\x46\ 673 - \x50\x5D\xC8\x2D\xB8\x54\x33\x8A\xE4\x9F\x52\x35\xC9\x5B\x91\x17\ 674 - \x8C\xCF\x2D\xD5\xCA\xCE\xF4\x03\xEC\x9D\x18\x10\xC6\x27\x2B\x04\ 675 - \x5B\x3B\x71\xF9\xDC\x6B\x80\xD6\x3F\xDD\x4A\x8E\x9A\xDB\x1E\x69\ 676 - \x62\xA6\x95\x26\xD4\x31\x61\xC1\xA4\x1D\x57\x0D\x79\x38\xDA\xD4\ 677 - \xA4\x0E\x32\x9C\xCF\xF4\x6A\xAA\x36\xAD\x00\x4C\xF6\x00\xC8\x38\ 678 - \x1E\x42\x5A\x31\xD9\x51\xAE\x64\xFD\xB2\x3F\xCE\xC9\x50\x9D\x43\ 679 - \x68\x7F\xEB\x69\xED\xD1\xCC\x5E\x0B\x8C\xC3\xBD\xF6\x4B\x10\xEF\ 680 - \x86\xB6\x31\x42\xA3\xAB\x88\x29\x55\x5B\x2F\x74\x7C\x93\x26\x65\ 681 - \xCB\x2C\x0F\x1C\xC0\x1B\xD7\x02\x29\x38\x88\x39\xD2\xAF\x05\xE4\ 682 - \x54\x50\x4A\xC7\x8B\x75\x82\x82\x28\x46\xC0\xBA\x35\xC3\x5F\x5C\ 683 - \x59\x16\x0C\xC0\x46\xFD\x82\x51\x54\x1F\xC6\x8C\x9C\x86\xB0\x22\ 684 - \xBB\x70\x99\x87\x6A\x46\x0E\x74\x51\xA8\xA9\x31\x09\x70\x3F\xEE\ 685 - \x1C\x21\x7E\x6C\x38\x26\xE5\x2C\x51\xAA\x69\x1E\x0E\x42\x3C\xFC\ 686 - \x99\xE9\xE3\x16\x50\xC1\x21\x7B\x62\x48\x16\xCD\xAD\x9A\x95\xF9\ 687 - \xD5\xB8\x01\x94\x88\xD9\xC0\xA0\xA1\xFE\x30\x75\xA5\x77\xE2\x31\ 688 - \x83\xF8\x1D\x4A\x3F\x2F\xA4\x57\x1E\xFC\x8C\xE0\xBA\x8A\x4F\xE8\ 689 - \xB6\x85\x5D\xFE\x72\xB0\xA6\x6E\xDE\xD2\xFB\xAB\xFB\xE5\x8A\x30\ 690 - \xFA\xFA\xBE\x1C\x5D\x71\xA8\x7E\x2F\x74\x1E\xF8\xC1\xFE\x86\xFE\ 691 - \xA6\xBB\xFD\xE5\x30\x67\x7F\x0D\x97\xD1\x1D\x49\xF7\xA8\x44\x3D\ 692 - \x08\x22\xE5\x06\xA9\xF4\x61\x4E\x01\x1E\x2A\x94\x83\x8F\xF8\x8C\ 693 - \xD6\x8C\x8B\xB7\xC5\xC6\x42\x4C\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 694 - 240 + s_group 241 + ~p: 242 + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xAD\xF8\x54\x58\xA2\xBB\x4A\x9A\xAF\xDC\x56\x20\x27\x3D\x3C\xF1\xD8\xB9\xC5\x83\xCE\x2D\x36\x95\xA9\xE1\x36\x41\x14\x64\x33\xFB\xCC\x93\x9D\xCE\x24\x9B\x3E\xF9\x7D\x2F\xE3\x63\x63\x0C\x75\xD8\xF6\x81\xB2\x02\xAE\xC4\x61\x7A\xD3\xDF\x1E\xD5\xD5\xFD\x65\x61\x24\x33\xF5\x1F\x5F\x06\x6E\xD0\x85\x63\x65\x55\x3D\xED\x1A\xF3\xB5\x57\x13\x5E\x7F\x57\xC9\x35\x98\x4F\x0C\x70\xE0\xE6\x8B\x77\xE2\xA6\x89\xDA\xF3\xEF\xE8\x72\x1D\xF1\x58\xA1\x36\xAD\xE7\x35\x30\xAC\xCA\x4F\x48\x3A\x79\x7A\xBC\x0A\xB1\x82\xB3\x24\xFB\x61\xD1\x08\xA9\x4B\xB2\xC8\xE3\xFB\xB9\x6A\xDA\xB7\x60\xD7\xF4\x68\x1D\x4F\x42\xA3\xDE\x39\x4D\xF4\xAE\x56\xED\xE7\x63\x72\xBB\x19\x0B\x07\xA7\xC8\xEE\x0A\x6D\x70\x9E\x02\xFC\xE1\xCD\xF7\xE2\xEC\xC0\x34\x04\xCD\x28\x34\x2F\x61\x91\x72\xFE\x9C\xE9\x85\x83\xFF\x8E\x4F\x12\x32\xEE\xF2\x81\x83\xC3\xFE\x3B\x1B\x4C\x6F\xAD\x73\x3B\xB5\xFC\xBC\x2E\xC2\x20\x05\xC5\x8E\xF1\x83\x7D\x16\x83\xB2\xC6\xF3\x4A\x26\xC1\xB2\xEF\xFA\x88\x6B\x42\x38\x61\x1F\xCF\xDC\xDE\x35\x5B\x3B\x65\x19\x03\x5B\xBC\x34\xF4\xDE\xF9\x9C\x02\x38\x61\xB4\x6F\xC9\xD6\xE6\xC9\x07\x7A\xD9\x1D\x26\x91\xF7\xF7\xEE\x59\x8C\xB0\xFA\xC1\x86\xD9\x1C\xAE\xFE\x13\x09\x85\x13\x92\x70\xB4\x13\x0C\x93\xBC\x43\x79\x44\xF4\xFD\x44\x52\xE2\xD7\x4D\xD3\x64\xF2\xE2\x1E\x71\xF5\x4B\xFF\x5C\xAE\x82\xAB\x9C\x9D\xF6\x9E\xE8\x6D\x2B\xC5\x22\x36\x3A\x0D\xAB\xC5\x21\x97\x9B\x0D\xEA\xDA\x1D\xBF\x9A\x42\xD5\xC4\x48\x4E\x0A\xBC\xD0\x6B\xFA\x53\xDD\xEF\x3C\x1B\x20\xEE\x3F\xD5\x9D\x7C\x25\xE4\x1D\x2B\x66\x9E\x1E\xF1\x6E\x6F\x52\xC3\x16\x4D\xF4\xFB\x79\x30\xE9\xE4\xE5\x88\x57\xB6\xAC\x7D\x5F\x42\xD6\x9F\x6D\x18\x77\x63\xCF\x1D\x55\x03\x40\x04\x87\xF5\x5B\xA5\x7E\x31\xCC\x7A\x71\x35\xC8\x86\xEF\xB4\x31\x8A\xED\x6A\x1E\x01\x2D\x9E\x68\x32\xA9\x07\x60\x0A\x91\x81\x30\xC4\x6D\xC7\x78\xF9\x71\xAD\x00\x38\x09\x29\x99\xA3\x33\xCB\x8B\x7A\x1A\x1D\xB9\x3D\x71\x40\x00\x3C\x2A\x4E\xCE\xA9\xF9\x8D\x0A\xCC\x0A\x82\x91\xCD\xCE\xC9\x7D\xCF\x8E\xC9\xB5\x5A\x7F\x88\xA4\x6B\x4D\xB5\xA8\x51\xF4\x41\x82\xE1\xC6\x8A\x00\x7E\x5E\x0D\xD9\x02\x0B\xFD\x64\xB6\x45\x03\x6C\x7A\x4E\x67\x7D\x2C\x38\x53\x2A\x3A\x23\xBA\x44\x42\xCA\xF5\x3E\xA6\x3B\xB4\x54\x32\x9B\x76\x24\xC8\x91\x7B\xDD\x64\xB1\xC0\xFD\x4C\xB3\x8E\x8C\x33\x4C\x70\x1C\x3A\xCD\xAD\x06\x57\xFC\xCF\xEC\x71\x9B\x1F\x5C\x3E\x4E\x46\x04\x1F\x38\x81\x47\xFB\x4C\xFD\xB4\x77\xA5\x24\x71\xF7\xA9\xA9\x69\x10\xB8\x55\x32\x2E\xDB\x63\x40\xD8\xA0\x0E\xF0\x92\x35\x05\x11\xE3\x0A\xBE\xC1\xFF\xF9\xE3\xA2\x6E\x7F\xB2\x9F\x8C\x18\x30\x23\xC3\x58\x7E\x38\xDA\x00\x77\xD9\xB4\x76\x3E\x4E\x4B\x94\xB2\xBB\xC1\x94\xC6\x65\x1E\x77\xCA\xF9\x92\xEE\xAA\xC0\x23\x2A\x28\x1B\xF6\xB3\xA7\x39\xC1\x22\x61\x16\x82\x0A\xE8\xDB\x58\x47\xA6\x7C\xBE\xF9\xC9\x09\x1B\x46\x2D\x53\x8C\xD7\x2B\x03\x74\x6A\xE7\x7F\x5E\x62\x29\x2C\x31\x15\x62\xA8\x46\x50\x5D\xC8\x2D\xB8\x54\x33\x8A\xE4\x9F\x52\x35\xC9\x5B\x91\x17\x8C\xCF\x2D\xD5\xCA\xCE\xF4\x03\xEC\x9D\x18\x10\xC6\x27\x2B\x04\x5B\x3B\x71\xF9\xDC\x6B\x80\xD6\x3F\xDD\x4A\x8E\x9A\xDB\x1E\x69\x62\xA6\x95\x26\xD4\x31\x61\xC1\xA4\x1D\x57\x0D\x79\x38\xDA\xD4\xA4\x0E\x32\x9C\xCF\xF4\x6A\xAA\x36\xAD\x00\x4C\xF6\x00\xC8\x38\x1E\x42\x5A\x31\xD9\x51\xAE\x64\xFD\xB2\x3F\xCE\xC9\x50\x9D\x43\x68\x7F\xEB\x69\xED\xD1\xCC\x5E\x0B\x8C\xC3\xBD\xF6\x4B\x10\xEF\x86\xB6\x31\x42\xA3\xAB\x88\x29\x55\x5B\x2F\x74\x7C\x93\x26\x65\xCB\x2C\x0F\x1C\xC0\x1B\xD7\x02\x29\x38\x88\x39\xD2\xAF\x05\xE4\x54\x50\x4A\xC7\x8B\x75\x82\x82\x28\x46\xC0\xBA\x35\xC3\x5F\x5C\x59\x16\x0C\xC0\x46\xFD\x82\x51\x54\x1F\xC6\x8C\x9C\x86\xB0\x22\xBB\x70\x99\x87\x6A\x46\x0E\x74\x51\xA8\xA9\x31\x09\x70\x3F\xEE\x1C\x21\x7E\x6C\x38\x26\xE5\x2C\x51\xAA\x69\x1E\x0E\x42\x3C\xFC\x99\xE9\xE3\x16\x50\xC1\x21\x7B\x62\x48\x16\xCD\xAD\x9A\x95\xF9\xD5\xB8\x01\x94\x88\xD9\xC0\xA0\xA1\xFE\x30\x75\xA5\x77\xE2\x31\x83\xF8\x1D\x4A\x3F\x2F\xA4\x57\x1E\xFC\x8C\xE0\xBA\x8A\x4F\xE8\xB6\x85\x5D\xFE\x72\xB0\xA6\x6E\xDE\xD2\xFB\xAB\xFB\xE5\x8A\x30\xFA\xFA\xBE\x1C\x5D\x71\xA8\x7E\x2F\x74\x1E\xF8\xC1\xFE\x86\xFE\xA6\xBB\xFD\xE5\x30\x67\x7F\x0D\x97\xD1\x1D\x49\xF7\xA8\x44\x3D\x08\x22\xE5\x06\xA9\xF4\x61\x4E\x01\x1E\x2A\x94\x83\x8F\xF8\x8C\xD6\x8C\x8B\xB7\xC5\xC6\x42\x4C\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 695 243 end
+61 -63
pk/dsa.ml
··· 1 1 open Crypto.Uncommon 2 - 3 2 open Common 4 3 5 - type pub = { p : Z.t ; q : Z.t ; gg : Z.t ; y : Z.t } 4 + type pub = { p : Z.t; q : Z.t; gg : Z.t; y : Z.t } 6 5 7 6 let pub ?(fips = false) ~p ~q ~gg ~y () = 8 7 let* () = guard Z.(one < gg && gg < p) (`Msg "bad generator") in 9 8 let* () = guard (Z_extra.pseudoprime q) (`Msg "q is not prime") in 10 - let* () = guard (Z.is_odd p && Z_extra.pseudoprime p) (`Msg "p is not prime") in 9 + let* () = 10 + guard (Z.is_odd p && Z_extra.pseudoprime p) (`Msg "p is not prime") 11 + in 11 12 let* () = guard Z.(zero < y && y < p) (`Msg "y not in 0..p-1") in 12 13 let* () = guard (q < p) (`Msg "q is not smaller than p") in 13 - let* () = guard Z.(zero = (pred p) mod q) (`Msg "p - 1 mod q <> 0") in 14 + let* () = guard Z.(zero = pred p mod q) (`Msg "p - 1 mod q <> 0") in 14 15 let* () = 15 16 if fips then 16 - match Z.numbits p, Z.numbits q with 17 + match (Z.numbits p, Z.numbits q) with 17 18 | 1024, 160 | 2048, 224 | 2048, 256 | 3072, 256 -> Ok () 18 19 | _ -> Error (`Msg "bit length of p or q not FIPS specified") 19 - else 20 - Ok () 20 + else Ok () 21 21 in 22 - Ok { p ; q ; gg ; y } 22 + Ok { p; q; gg; y } 23 23 24 - type priv = 25 - { p : Z.t ; q : Z.t ; gg : Z.t ; x : Z.t ; y : Z.t } 24 + type priv = { p : Z.t; q : Z.t; gg : Z.t; x : Z.t; y : Z.t } 26 25 27 26 let priv ?fips ~p ~q ~gg ~x ~y () = 28 27 let* _ = pub ?fips ~p ~q ~gg ~y () in 29 28 let* () = guard Z.(zero < x && x < q) (`Msg "x not in 1..q-1") in 30 29 let* () = guard Z.(y = powm gg x p) (`Msg "y <> g ^ x mod p") in 31 - Ok { p ; q ; gg ; x ; y } 30 + Ok { p; q; gg; x; y } 32 31 33 32 let pub_of_priv { p; q; gg; y; _ } = { p; q; gg; y } 34 33 35 34 type keysize = [ `Fips1024 | `Fips2048 | `Fips3072 | `Exactly of int * int ] 36 35 37 36 let expand_size = function 38 - | `Fips1024 -> (1024, 160) 39 - | `Fips2048 -> (2048, 256) 40 - | `Fips3072 -> (3072, 256) 37 + | `Fips1024 -> (1024, 160) 38 + | `Fips2048 -> (2048, 256) 39 + | `Fips3072 -> (3072, 256) 41 40 | `Exactly (l, n) -> 42 - if 3 <= l && 2 <= n then (l, n) else 43 - invalid_arg "Dsa.generate: bits: `Exactly (%d, %d)" l n 41 + if 3 <= l && 2 <= n then (l, n) 42 + else invalid_arg "Dsa.generate: bits: `Exactly (%d, %d)" l n 44 43 45 44 type mask = [ `No | `Yes | `Yes_with of Crypto_rng.g ] 46 45 47 46 let expand_mask = function 48 - | `No -> `No 49 - | `Yes -> `Yes None 47 + | `No -> `No 48 + | `Yes -> `Yes None 50 49 | `Yes_with g -> `Yes (Some g) 51 50 52 51 (* ··· 57 56 *) 58 57 let params ?g size = 59 58 let two = Z.(~$2) in 60 - let (l, n) = expand_size size in 59 + let l, n = expand_size size in 61 60 let q = Z_extra.prime ?g ~msb:1 n in 62 61 let p = 63 - let q_q = Z.(q * two) in 62 + let q_q = Z.(q * two) in 64 63 until Z_extra.pseudoprime @@ fun () -> 65 - let x = Z_extra.gen_bits ?g ~msb:1 l in 66 - Z.(x - (x mod q_q) + one) 64 + let x = Z_extra.gen_bits ?g ~msb:1 l in 65 + Z.(x - (x mod q_q) + one) 67 66 in 68 67 let gg = 69 68 let e = Z.(pred p / q) in 70 - until ((<>) Z.one) @@ fun () -> 71 - let h = Z_extra.gen_r ?g two Z.(pred p) in 72 - Z.(powm h e p) 69 + until (( <> ) Z.one) @@ fun () -> 70 + let h = Z_extra.gen_r ?g two Z.(pred p) in 71 + Z.(powm h e p) 73 72 in 74 73 (* all checks above are already satisfied *) 75 74 (p, q, gg) 76 75 77 76 let generate ?g size = 78 - let (p, q, gg) = params ?g size in 77 + let p, q, gg = params ?g size in 79 78 let x = Z_extra.gen_r ?g Z.one q in 80 79 let y = Z.(powm gg x p) in 81 80 (* checks are satisfied due to construction *) 82 81 { p; q; gg; x; y } 83 82 84 - 85 83 module K_gen (H : Digestif.S) = struct 86 - 87 84 let drbg : 'a Crypto_rng.generator = 88 - let module M = Crypto_rng.Hmac_drbg (H) in (module M) 85 + let module M = Crypto_rng.Hmac_drbg (H) in 86 + (module M) 89 87 90 88 let z_gen ~key:{ q; x; _ } z = 91 89 let repr = Z_extra.to_octets_be ~size:(Z.numbits q // 8) in 92 - let g = Crypto_rng.create ~strict:true drbg in 90 + let g = Crypto_rng.create ~strict:true drbg in 93 91 Crypto_rng.reseed ~g (repr x ^ repr Z.(z mod q)); 94 92 Z_extra.gen_r ~g Z.one q 95 93 ··· 102 100 let sign_z ?(mask = `Yes) ?k:k0 ~key:({ p; q; gg; x; _ } as key) z = 103 101 let k = match k0 with Some k -> k | None -> K_gen_sha256.z_gen ~key z in 104 102 let k' = Z.invert k q 105 - and b, b' = match expand_mask mask with 106 - | `No -> Z.one, Z.one 103 + and b, b' = 104 + match expand_mask mask with 105 + | `No -> (Z.one, Z.one) 107 106 | `Yes g -> 108 - let m = Z_extra.gen_r ?g Z.one q in 109 - m, Z.invert m q 107 + let m = Z_extra.gen_r ?g Z.one q in 108 + (m, Z.invert m q) 110 109 in 111 110 let r = Z.(powm_sec gg k p mod q) in 112 111 (* normal DSA sign is: s = k^-1 * (z + r * x) mod q *) ··· 125 124 in 126 125 if r = Z.zero || s = Z.zero then invalid_arg "k unsuitable" else (r, s) 127 126 128 - let verify_z ~key:({ p; q; gg; y }: pub ) (r, s) z = 127 + let verify_z ~key:({ p; q; gg; y } : pub) (r, s) z = 129 128 let v () = 130 - let w = Z.invert s q in 131 - let u1 = Z.(z * w mod q) 132 - and u2 = Z.(r * w mod q) in 133 - Z.((powm gg u1 p * powm y u2 p) mod p mod q) in 129 + let w = Z.invert s q in 130 + let u1 = Z.(z * w mod q) and u2 = Z.(r * w mod q) in 131 + Z.(powm gg u1 p * powm y u2 p mod p mod q) 132 + in 134 133 Z.zero < r && r < q && Z.zero < s && s < q && v () = r 135 134 136 135 let sign ?mask ?k ~(key : priv) digest = 137 - let bits = Z.numbits key.q in 138 - let size = bits // 8 in 139 - let (r, s) = sign_z ?mask ?k ~key (Z_extra.of_octets_be ~bits digest) in 136 + let bits = Z.numbits key.q in 137 + let size = bits // 8 in 138 + let r, s = sign_z ?mask ?k ~key (Z_extra.of_octets_be ~bits digest) in 140 139 Z_extra.(to_octets_be ~size r, to_octets_be ~size s) 141 140 142 141 let verify ~(key : pub) (r, s) digest = 143 - let z = Z_extra.of_octets_be ~bits:(Z.numbits key.q) digest 144 - and (r, s) = Z_extra.(of_octets_be r, of_octets_be s) in 142 + let z = Z_extra.of_octets_be ~bits:(Z.numbits key.q) digest 143 + and r, s = Z_extra.(of_octets_be r, of_octets_be s) in 145 144 verify_z ~key (r, s) z 146 145 147 146 let rec shift_left_inplace buf = function 148 147 | 0 -> () 149 148 | bits when bits mod 8 = 0 -> 150 - let off = bits / 8 in 151 - let to_blit = Bytes.length buf - off in 152 - Bytes.unsafe_blit buf off buf 0 to_blit ; 153 - Bytes.unsafe_fill buf to_blit (Bytes.length buf - to_blit) '\x00' 149 + let off = bits / 8 in 150 + let to_blit = Bytes.length buf - off in 151 + Bytes.unsafe_blit buf off buf 0 to_blit; 152 + Bytes.unsafe_fill buf to_blit (Bytes.length buf - to_blit) '\x00' 154 153 | bits when bits < 8 -> 155 - let foo = 8 - bits in 156 - for i = 0 to Bytes.length buf - 2 do 157 - let b1 = Bytes.get_uint8 buf i 158 - and b2 = Bytes.get_uint8 buf (i + 1) in 159 - Bytes.set_uint8 buf i ((b1 lsl bits) lor (b2 lsr foo)) 160 - done ; 161 - Bytes.set_uint8 buf (Bytes.length buf - 1) 162 - (Bytes.get_uint8 buf (Bytes.length buf - 1) lsl bits) 154 + let foo = 8 - bits in 155 + for i = 0 to Bytes.length buf - 2 do 156 + let b1 = Bytes.get_uint8 buf i and b2 = Bytes.get_uint8 buf (i + 1) in 157 + Bytes.set_uint8 buf i ((b1 lsl bits) lor (b2 lsr foo)) 158 + done; 159 + Bytes.set_uint8 buf 160 + (Bytes.length buf - 1) 161 + (Bytes.get_uint8 buf (Bytes.length buf - 1) lsl bits) 163 162 | bits -> 164 - shift_left_inplace buf (8 * (bits / 8)) ; 165 - shift_left_inplace buf (bits mod 8) 163 + shift_left_inplace buf (8 * (bits / 8)); 164 + shift_left_inplace buf (bits mod 8) 166 165 167 - let (lsl) buf bits = 166 + let ( lsl ) buf bits = 168 167 let buf' = Bytes.of_string buf in 169 168 shift_left_inplace buf' bits; 170 169 Bytes.unsafe_to_string buf' 171 170 172 - let massage ~key:({ q; _ }: pub) digest = 171 + let massage ~key:({ q; _ } : pub) digest = 173 172 let bits = Z.numbits q in 174 - if bits >= String.length digest * 8 then 175 - digest 173 + if bits >= String.length digest * 8 then digest 176 174 else 177 175 let buf = Z_extra.(to_octets_be Z.(of_octets_be digest mod q)) in 178 - buf lsl ((8 - bits mod 8) mod 8) 176 + buf lsl ((8 - (bits mod 8)) mod 8)
+180 -149
pk/rsa.ml
··· 1 1 open Crypto.Uncommon 2 - 3 2 open Common 4 3 5 4 let two = Z.(~$2) ··· 10 9 let res = Eqaf.find_uint8 ?off ~f cs in 11 10 Eqaf.select_int (res + 1) default res 12 11 13 - let (&.) f g = fun h -> f (g h) 12 + let ( &. ) f g = fun h -> f (g h) 14 13 15 14 type 'a or_digest = [ `Message of 'a | `Digest of string ] 16 15 17 16 module Digest_or (H : Digestif.S) = struct 18 17 let digest_or = function 19 - | `Message msg -> H.(digest_string msg |> to_raw_string) 18 + | `Message msg -> H.(digest_string msg |> to_raw_string) 20 19 | `Digest digest -> 21 20 let n = String.length digest and m = H.digest_size in 22 - if n = m then digest else 23 - invalid_arg "(`Digest _): %d bytes, expecting %d" n m 21 + if n = m then digest 22 + else invalid_arg "(`Digest _): %d bytes, expecting %d" n m 24 23 end 25 24 26 25 exception Insufficient_key 27 26 28 - type pub = { e : Z.t ; n : Z.t } 27 + type pub = { e : Z.t; n : Z.t } 29 28 30 29 (* due to PKCS1 *) 31 30 let minimum_octets = 12 32 - let minimum_bits = 8 * minimum_octets - 7 31 + let minimum_bits = (8 * minimum_octets) - 7 33 32 34 33 let pub ~e ~n = 35 34 (* We cannot verify a public key being good (this would require to verify "n" ··· 40 39 exceptions, and we avoid tiny public keys where PKCS1 / PSS would lead to 41 40 infinite loops or not work due to insufficient space for the header. *) 42 41 let* () = 43 - guard Z.(n > zero && is_odd n && numbits n >= minimum_bits) 42 + guard 43 + Z.(n > zero && is_odd n && numbits n >= minimum_bits) 44 44 (`Msg "invalid modulus") 45 45 in 46 46 let* () = guard Z.(one < e && e < n) (`Msg "invalid exponent") in 47 47 (* NOTE that we could check for e being odd, or a prime, or 2^16+1, but 48 48 these are not requirements, neither for RSA nor for powm_sec *) 49 - Ok { e ; n } 49 + Ok { e; n } 50 50 51 51 type priv = { 52 - e : Z.t ; d : Z.t ; n : Z.t ; 53 - p : Z.t ; q : Z.t ; dp : Z.t ; dq : Z.t ; q' : Z.t 52 + e : Z.t; 53 + d : Z.t; 54 + n : Z.t; 55 + p : Z.t; 56 + q : Z.t; 57 + dp : Z.t; 58 + dq : Z.t; 59 + q' : Z.t; 54 60 } 55 61 56 62 let valid_prime name p = 57 - guard Z.(p > zero && is_odd p && Z_extra.pseudoprime p) 63 + guard 64 + Z.(p > zero && is_odd p && Z_extra.pseudoprime p) 58 65 (`Msg ("invalid prime " ^ name)) 59 66 60 67 let rprime a b = Z.(gcd a b = one) 61 68 62 69 let valid_e ~e ~p ~q = 63 70 let* () = 64 - guard (rprime e (Z.pred p) && rprime e (Z.pred q)) 71 + guard 72 + (rprime e (Z.pred p) && rprime e (Z.pred q)) 65 73 (`Msg "e is not coprime of p and q") 66 74 in 67 75 guard (Z_extra.pseudoprime e) (`Msg "exponent e is not a pseudoprime") ··· 74 82 let* () = valid_e ~e ~p ~q in 75 83 (* p and q are prime, and not equal -> multiplicative inverse exists *) 76 84 let* () = guard Z.(q' = invert q p) (`Msg "q' <> q ^ -1 mod p") in 77 - let* () = guard Z.(n = p * q) (`Msg "modulus is not the product of p and q") in 85 + let* () = 86 + guard Z.(n = p * q) (`Msg "modulus is not the product of p and q") 87 + in 78 88 let* () = guard Z.(one < d && d < n) (`Msg "invalid private exponent") in 79 - let* () = guard Z.(dp = d mod (pred p)) (`Msg "dp <> d mod (p - 1)") in 80 - let* () = guard Z.(dq = d mod (pred q)) (`Msg "dq <> d mod (q - 1)") in 89 + let* () = guard Z.(dp = d mod pred p) (`Msg "dp <> d mod (p - 1)") in 90 + let* () = guard Z.(dq = d mod pred q) (`Msg "dq <> d mod (q - 1)") in 81 91 (* e has been checked (valid_e) to be coprime to p-1 and q-1 -> 82 92 muliplicative inverse exists *) 83 93 let* () = 84 - guard Z.(one = d * e mod (lcm (pred p) (pred q))) 94 + guard 95 + Z.(one = d * e mod lcm (pred p) (pred q)) 85 96 (`Msg "1 <> d * e mod lcm (p - 1) (q - 1)") 86 97 in 87 - Ok { e ; d ; n ; p ; q ; dp ; dq ; q' } 98 + Ok { e; d; n; p; q; dp; dq; q' } 88 99 89 100 let priv_of_primes ~e ~p ~q = 90 101 let* () = valid_prime "p" p in ··· 95 106 let* _ = pub ~e ~n in 96 107 (* valid_e checks e coprime to p-1 and q-1, a multiplicative inverse exists *) 97 108 let d = Z.(invert e (lcm (pred p) (pred q))) in 98 - let dp = Z.(d mod (pred p)) 99 - and dq = Z.(d mod (pred q)) 100 - in 109 + let dp = Z.(d mod pred p) and dq = Z.(d mod pred q) in 101 110 (* above we checked that p and q both are primes and not equal -> there 102 111 should be a multiplicate inverse *) 103 112 let q' = Z.invert q p in ··· 105 114 Ok { e; d; n; p; q; dp; dq; q' } 106 115 107 116 (* Handbook of applied cryptography, 8.2.2 (i). *) 108 - let priv_of_exp ?g ?(attempts=100) ~e ~d ~n () = 117 + let priv_of_exp ?g ?(attempts = 100) ~e ~d ~n () = 109 118 let* _ = pub ~e ~n in 110 119 let* () = guard Z.(one < d && d < n) (`Msg "invalid private exponent") in 111 120 let rec doit ~attempts = ··· 113 122 let rec go ax = function 114 123 | 0 -> None 115 124 | i' -> 116 - let ax2 = Z.(ax * ax mod n) in 117 - if Z.(ax <> one && ax <> pred n && ax2 = one) then 118 - Some ax 119 - else 120 - go ax2 (i' - 1) 125 + let ax2 = Z.(ax * ax mod n) in 126 + if Z.(ax <> one && ax <> pred n && ax2 = one) then Some ax 127 + else go ax2 (i' - 1) 121 128 in 122 129 Option.map Z.(gcd n &. pred) (go Z.(powm (Z_extra.gen ?g n) t n) s) 123 130 in ··· 125 132 let* s, t = Z_extra.strip_factor ~f:two Z.(e * d |> pred) in 126 133 match s with 127 134 | 0 -> Error (`Msg "invalid factor 0") 128 - | _ -> match factor s t with 129 - | None -> doit ~attempts:(attempts - 1) 130 - | Some p -> 131 - let q = Z.(div n p) in 132 - priv_of_primes ~e ~p:(max p q) ~q:(min p q) 135 + | _ -> ( 136 + match factor s t with 137 + | None -> doit ~attempts:(attempts - 1) 138 + | Some p -> 139 + let q = Z.(div n p) in 140 + priv_of_primes ~e ~p:(max p q) ~q:(min p q)) 133 141 else Error (`Msg "attempts exceeded") 134 142 in 135 143 doit ~attempts 136 144 137 145 let rec generate ?g ?(e = Z.(~$0x10001)) ~bits () = 138 - if bits < minimum_bits || e < three || 139 - (bits <= Z.numbits e || not (Z_extra.pseudoprime e)) 140 - then 141 - invalid_arg "Rsa.generate: e: %a, bits: %d" Z.pp_print e bits; 142 - let (pb, qb) = (bits / 2, bits - bits / 2) in 143 - let (p, q) = Z_extra.(prime ?g ~msb:2 pb, prime ?g ~msb:2 qb) in 146 + if 147 + bits < minimum_bits || e < three 148 + || bits <= Z.numbits e 149 + || not (Z_extra.pseudoprime e) 150 + then invalid_arg "Rsa.generate: e: %a, bits: %d" Z.pp_print e bits; 151 + let pb, qb = (bits / 2, bits - (bits / 2)) in 152 + let p, q = Z_extra.(prime ?g ~msb:2 pb, prime ?g ~msb:2 qb) in 144 153 match priv_of_primes ~e ~p:(max p q) ~q:(min p q) with 145 154 | Error _ -> generate ?g ~e ~bits () 146 155 | Ok priv -> priv 147 156 148 - let pub_of_priv ({ e; n; _ } : priv) = { e ; n } 157 + let pub_of_priv ({ e; n; _ } : priv) = { e; n } 149 158 150 - let pub_bits ({ n; _ } : pub) = Z.numbits n 159 + let pub_bits ({ n; _ } : pub) = Z.numbits n 151 160 and priv_bits ({ n; _ } : priv) = Z.numbits n 152 161 153 162 type mask = [ `No | `Yes | `Yes_with of Crypto_rng.g ] 154 163 155 - let encrypt_unsafe ~key: ({ e; n } : pub) msg = Z.(powm msg e n) 164 + let encrypt_unsafe ~key:({ e; n } : pub) msg = Z.(powm msg e n) 156 165 157 - let decrypt_unsafe ~crt_hardening ~key:({ e; d; n; p; q; dp; dq; q'} : priv) c = 158 - let m1 = Z.(powm_sec c dp p) 159 - and m2 = Z.(powm_sec c dq q) in 166 + let decrypt_unsafe ~crt_hardening ~key:({ e; d; n; p; q; dp; dq; q' } : priv) c 167 + = 168 + let m1 = Z.(powm_sec c dp p) and m2 = Z.(powm_sec c dq q) in 160 169 (* NOTE: neither erem, nor the multiplications (addition, subtraction) are 161 170 guaranteed to be constant time by gmp *) 162 - let h = Z.(erem (q' * (m1 - m2)) p) in 163 - let m = Z.(h * q + m2) in 171 + let h = Z.(erem (q' * (m1 - m2)) p) in 172 + let m = Z.((h * q) + m2) in 164 173 (* counter Arjen Lenstra's CRT attack by verifying the signature. Since the 165 174 public exponent is small, this is not very expensive. Mentioned again 166 175 "Factoring RSA keys with TLS Perfect Forward Secrecy" (Weimer, 2015). *) 167 - if not crt_hardening || Z.(powm_sec m e n) = c then 168 - m 169 - else 170 - Z.(powm_sec c d n) 176 + if (not crt_hardening) || Z.(powm_sec m e n) = c then m 177 + else Z.(powm_sec c d n) 171 178 172 - let decrypt_blinded_unsafe ~crt_hardening ?g ~key:({ e; n; _} as key : priv) c = 173 - let r = until (rprime n) (fun _ -> Z_extra.gen_r ?g two n) in 179 + let decrypt_blinded_unsafe ~crt_hardening ?g ~key:({ e; n; _ } as key : priv) c 180 + = 181 + let r = until (rprime n) (fun _ -> Z_extra.gen_r ?g two n) in 174 182 (* since r and n are coprime, there must be a multiplicative inverse *) 175 183 let r' = Z.(invert r n) in 176 184 let c' = Z.(powm_sec r e n * c mod n) in 177 - let x = decrypt_unsafe ~crt_hardening ~key c' in 185 + let x = decrypt_unsafe ~crt_hardening ~key c' in 178 186 Z.(r' * x mod n) 179 187 180 - let (encrypt_z, decrypt_z) = 188 + let encrypt_z, decrypt_z = 181 189 let check_params n msg = 182 190 if msg < two then invalid_arg "Rsa: message: %a" Z.pp_print msg; 183 - if n <= msg then raise Insufficient_key in 184 - (fun ~(key : pub) msg -> check_params key.n msg ; encrypt_unsafe ~key msg), 185 - (fun ~crt_hardening ~mask ~(key : priv) msg -> 186 - check_params key.n msg ; 187 - match mask with 188 - | `No -> decrypt_unsafe ~crt_hardening ~key msg 189 - | `Yes -> decrypt_blinded_unsafe ~crt_hardening ~key msg 190 - | `Yes_with g -> decrypt_blinded_unsafe ~crt_hardening ~g ~key msg ) 191 + if n <= msg then raise Insufficient_key 192 + in 193 + ( (fun ~(key : pub) msg -> 194 + check_params key.n msg; 195 + encrypt_unsafe ~key msg), 196 + fun ~crt_hardening ~mask ~(key : priv) msg -> 197 + check_params key.n msg; 198 + match mask with 199 + | `No -> decrypt_unsafe ~crt_hardening ~key msg 200 + | `Yes -> decrypt_blinded_unsafe ~crt_hardening ~key msg 201 + | `Yes_with g -> decrypt_blinded_unsafe ~crt_hardening ~g ~key msg ) 191 202 192 203 let reformat out f msg = 193 204 Z_extra.(of_octets_be msg |> f |> to_octets_be ~size:(out // 8)) 194 205 195 - let encrypt ~key = reformat (pub_bits key) (encrypt_z ~key) 206 + let encrypt ~key = reformat (pub_bits key) (encrypt_z ~key) 196 207 197 - let decrypt ?(crt_hardening=false) ?(mask=`Yes) ~key = 208 + let decrypt ?(crt_hardening = false) ?(mask = `Yes) ~key = 198 209 reformat (priv_bits key) (decrypt_z ~crt_hardening ~mask ~key) 199 210 200 - let bx00, bx01 = "\x00", "\x01" 211 + let bx00, bx01 = ("\x00", "\x01") 201 212 202 213 module PKCS1 = struct 203 - 204 214 let min_pad = 8 205 215 206 216 (* XXX Generalize this into `Rng.samplev` or something. *) 207 217 let generate_with ?g ~f n = 208 218 let buf = Bytes.create n 209 - and k = let b = Crypto_rng.block g in (n // b * b) in 219 + and k = 220 + let b = Crypto_rng.block g in 221 + n // b * b 222 + in 210 223 let rec go nonce i j = 211 - if i = n then Bytes.unsafe_to_string buf else 212 - if j = k then go Crypto_rng.(generate ?g k) i 0 else 213 - match String.get_uint8 nonce j with 214 - | b when f b -> Bytes.set_uint8 buf i b ; go nonce (succ i) (succ j) 215 - | _ -> go nonce i (succ j) in 224 + if i = n then Bytes.unsafe_to_string buf 225 + else if j = k then go Crypto_rng.(generate ?g k) i 0 226 + else 227 + match String.get_uint8 nonce j with 228 + | b when f b -> 229 + Bytes.set_uint8 buf i b; 230 + go nonce (succ i) (succ j) 231 + | _ -> go nonce i (succ j) 232 + in 216 233 go Crypto_rng.(generate ?g k) 0 0 217 234 218 235 let pad ~mark ~padding k msg = 219 236 let pad = padding (k - String.length msg - 3 |> imax min_pad) in 220 - String.concat "" [ bx00 ; mark ; pad ; bx00 ; msg ] 237 + String.concat "" [ bx00; mark; pad; bx00; msg ] 221 238 222 239 let unpad ~mark ~is_pad buf = 223 240 let f = not &. is_pad in ··· 230 247 Some (String.sub buf (i + 1) (String.length buf - i - 1)) 231 248 else None 232 249 233 - let pad_01 = 250 + let pad_01 = 234 251 let padding size = String.make size '\xff' in 235 252 pad ~mark:"\x01" ~padding 236 - let pad_02 ?g = pad ~mark:"\x02" ~padding:(generate_with ?g ~f:((<>) 0x00)) 237 253 238 - let unpad_01 = unpad ~mark:0x01 ~is_pad:((=) 0xff) 239 - let unpad_02 = unpad ~mark:0x02 ~is_pad:((<>) 0x00) 254 + let pad_02 ?g = pad ~mark:"\x02" ~padding:(generate_with ?g ~f:(( <> ) 0x00)) 255 + let unpad_01 = unpad ~mark:0x01 ~is_pad:(( = ) 0xff) 256 + let unpad_02 = unpad ~mark:0x02 ~is_pad:(( <> ) 0x00) 240 257 241 258 let padded pad transform keybits msg = 242 259 let n = keybits // 8 in ··· 251 268 let sig_encode ?(crt_hardening = true) ?mask ~key msg = 252 269 padded pad_01 (decrypt ~crt_hardening ?mask ~key) (priv_bits key) msg 253 270 254 - let sig_decode ~key msg = 255 - unpadded unpad_01 (encrypt ~key) (pub_bits key) msg 256 - 257 - let encrypt ?g ~key msg = 258 - padded (pad_02 ?g) (encrypt ~key) (pub_bits key) msg 271 + let sig_decode ~key msg = unpadded unpad_01 (encrypt ~key) (pub_bits key) msg 272 + let encrypt ?g ~key msg = padded (pad_02 ?g) (encrypt ~key) (pub_bits key) msg 259 273 260 274 let decrypt ?(crt_hardening = false) ?mask ~key msg = 261 275 unpadded unpad_02 (decrypt ~crt_hardening ?mask ~key) (priv_bits key) msg 262 276 263 277 let asn_of_hash, detect = 264 - let map = [ 265 - `MD5, "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05\x05\x00\x04\x10" ; 266 - `SHA1, "\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14" ; 267 - `SHA224, "\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x05\x00\x04\x1c" ; 268 - `SHA256, "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20" ; 269 - `SHA384, "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30" ; 270 - `SHA512, "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40" 271 - ] 278 + let map = 279 + [ 280 + ( `MD5, 281 + "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05\x05\x00\x04\x10" 282 + ); 283 + (`SHA1, "\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14"); 284 + ( `SHA224, 285 + "\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x05\x00\x04\x1c" 286 + ); 287 + ( `SHA256, 288 + "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20" 289 + ); 290 + ( `SHA384, 291 + "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30" 292 + ); 293 + ( `SHA512, 294 + "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40" 295 + ); 296 + ] 272 297 in 273 - (fun h -> List.assoc h map), 274 - (fun buf -> List.find_opt (fun (_, d) -> String.starts_with ~prefix:d buf) map) 298 + ( (fun h -> List.assoc h map), 299 + fun buf -> 300 + List.find_opt (fun (_, d) -> String.starts_with ~prefix:d buf) map ) 275 301 276 302 let sign ?(crt_hardening = true) ?mask ~hash ~key msg = 277 303 let module H = (val Digestif.module_of_hash' (hash :> Digestif.hash')) in 278 - let module D = Digest_or(H) in 304 + let module D = Digest_or (H) in 279 305 let msg' = asn_of_hash hash ^ D.digest_or msg in 280 306 sig_encode ~crt_hardening ?mask ~key msg' 281 307 282 308 let verify ~hashp ~key ~signature msg = 283 - let (>>=) = Option.bind 284 - and (>>|) = Fun.flip Option.map 285 - in 309 + let ( >>= ) = Option.bind and ( >>| ) = Fun.flip Option.map in 286 310 Option.value 287 - (sig_decode ~key signature >>= fun buf -> 288 - detect buf >>| fun (hash, asn) -> 289 - let module H = (val Digestif.module_of_hash' (hash :> Digestif.hash')) in 290 - let module D = Digest_or(H) in 291 - hashp hash && Eqaf.equal (asn ^ D.digest_or msg) buf) 311 + ( sig_decode ~key signature >>= fun buf -> 312 + detect buf >>| fun (hash, asn) -> 313 + let module H = (val Digestif.module_of_hash' (hash :> Digestif.hash')) 314 + in 315 + let module D = Digest_or (H) in 316 + hashp hash && Eqaf.equal (asn ^ D.digest_or msg) buf ) 292 317 ~default:false 293 318 294 319 let min_key hash = 295 320 let module H = (val Digestif.module_of_hash' (hash :> Digestif.hash')) in 296 - (String.length (asn_of_hash hash) + H.digest_size + min_pad + 2) * 8 + 1 321 + ((String.length (asn_of_hash hash) + H.digest_size + min_pad + 2) * 8) + 1 297 322 end 298 323 299 324 module MGF1 (H : Digestif.S) = struct 300 - 301 325 let repr n = 302 326 let buf = Bytes.create 4 in 303 327 Bytes.set_int32_be buf 0 n; ··· 308 332 let rec go acc c = function 309 333 | 0 -> Bytes.sub (Bytes.concat Bytes.empty (List.rev acc)) 0 len 310 334 | n -> 311 - let h = Bytes.create H.digest_size in 312 - H.get_into_bytes (H.feedi_string H.empty (iter2 seed (repr c))) h; 313 - go (h :: acc) Int32.(succ c) (pred n) 335 + let h = Bytes.create H.digest_size in 336 + H.get_into_bytes (H.feedi_string H.empty (iter2 seed (repr c))) h; 337 + go (h :: acc) Int32.(succ c) (pred n) 314 338 in 315 339 go [] 0l (len // H.digest_size) 316 340 ··· 321 345 end 322 346 323 347 module OAEP (H : Digestif.S) = struct 324 - 325 348 module MGF = MGF1 (H) 326 349 327 350 let hlen = H.digest_size 328 - 329 - let max_msg_bytes k = k - 2 * hlen - 2 351 + let max_msg_bytes k = k - (2 * hlen) - 2 330 352 331 353 let eme_oaep_encode ?g ?(label = "") k msg = 332 - let seed = Crypto_rng.generate ?g hlen 333 - and pad = String.make (max_msg_bytes k - String.length msg) '\x00' in 334 - let db = String.concat "" [ H.(digest_string label |> to_raw_string) ; pad ; bx01 ; msg ] in 335 - let mdb = Bytes.unsafe_to_string (MGF.mask ~seed db) in 354 + let seed = Crypto_rng.generate ?g hlen 355 + and pad = String.make (max_msg_bytes k - String.length msg) '\x00' in 356 + let db = 357 + String.concat "" 358 + [ H.(digest_string label |> to_raw_string); pad; bx01; msg ] 359 + in 360 + let mdb = Bytes.unsafe_to_string (MGF.mask ~seed db) in 336 361 let mseed = Bytes.unsafe_to_string (MGF.mask ~seed:mdb seed) in 337 - String.concat "" [ bx00 ; mseed ; mdb ] 362 + String.concat "" [ bx00; mseed; mdb ] 338 363 339 364 let eme_oaep_decode ?(label = "") msg = 340 365 let b0 = String.sub msg 0 1 341 366 and ms = String.sub msg 1 hlen 342 - and mdb = String.sub msg (1 + hlen) (String.length msg - 1 - hlen) 367 + and mdb = String.sub msg (1 + hlen) (String.length msg - 1 - hlen) in 368 + let db = 369 + Bytes.unsafe_to_string 370 + (MGF.mask ~seed:(Bytes.unsafe_to_string (MGF.mask ~seed:mdb ms)) mdb) 343 371 in 344 - let db = Bytes.unsafe_to_string (MGF.mask ~seed:(Bytes.unsafe_to_string (MGF.mask ~seed:mdb ms)) mdb) in 345 - let i = ct_find_uint8 ~default:0 ~off:hlen ~f:((<>) 0x00) db in 346 - let c1 = Eqaf.equal (String.sub db 0 hlen) H.(digest_string label |> to_raw_string) 372 + let i = ct_find_uint8 ~default:0 ~off:hlen ~f:(( <> ) 0x00) db in 373 + let c1 = 374 + Eqaf.equal (String.sub db 0 hlen) H.(digest_string label |> to_raw_string) 347 375 and c2 = String.get_uint8 b0 0 = 0x00 348 376 and c3 = String.get_uint8 db i = 0x01 in 349 - if c1 && c2 && c3 then Some (String.sub db (i + 1) (String.length db - i - 1)) else None 377 + if c1 && c2 && c3 then 378 + Some (String.sub db (i + 1) (String.length db - i - 1)) 379 + else None 350 380 351 381 let encrypt ?g ?label ~key msg = 352 382 let k = pub_bits key // 8 in ··· 355 385 356 386 let decrypt ?(crt_hardening = false) ?mask ?label ~key em = 357 387 let k = priv_bits key // 8 in 358 - if String.length em <> k || max_msg_bytes k < 0 then None else 388 + if String.length em <> k || max_msg_bytes k < 0 then None 389 + else 359 390 try eme_oaep_decode ?label @@ decrypt ~crt_hardening ?mask ~key em 360 391 with Insufficient_key -> None 361 392 ··· 366 397 (* XXX expose seed for deterministic testing? *) 367 398 end 368 399 369 - module PSS (H: Digestif.S) = struct 400 + module PSS (H : Digestif.S) = struct 370 401 module MGF = MGF1 (H) 371 - module H1 = Digest_or (H) 402 + module H1 = Digest_or (H) 372 403 373 404 let hlen = H.digest_size 374 - 375 405 let bxbc = "\xbc" 376 - 377 - let b0mask embits = 0xff lsr ((8 - embits mod 8) mod 8) 378 - 406 + let b0mask embits = 0xff lsr ((8 - (embits mod 8)) mod 8) 379 407 let zero_8 = String.make 8 '\x00' 380 408 381 409 let digest ~salt msg = 382 410 H.to_raw_string @@ H.digesti_string @@ iter3 zero_8 (H1.digest_or msg) salt 383 411 384 412 let emsa_pss_encode ?g slen emlen msg = 385 - let n = emlen // 8 386 - and salt = Crypto_rng.generate ?g slen in 387 - let h = digest ~salt msg in 388 - let db = String.concat "" [ String.make (n - slen - hlen - 2) '\x00' ; bx01 ; salt ] in 389 - let mdb = MGF.mask ~seed:h db in 390 - Bytes.set_uint8 mdb 0 @@ Bytes.get_uint8 mdb 0 land b0mask emlen ; 391 - String.concat "" [ Bytes.unsafe_to_string mdb ; h ; bxbc ] 413 + let n = emlen // 8 and salt = Crypto_rng.generate ?g slen in 414 + let h = digest ~salt msg in 415 + let db = 416 + String.concat "" [ String.make (n - slen - hlen - 2) '\x00'; bx01; salt ] 417 + in 418 + let mdb = MGF.mask ~seed:h db in 419 + Bytes.set_uint8 mdb 0 @@ (Bytes.get_uint8 mdb 0 land b0mask emlen); 420 + String.concat "" [ Bytes.unsafe_to_string mdb; h; bxbc ] 392 421 393 422 let emsa_pss_verify slen emlen em msg = 394 423 let mdb = String.sub em 0 (String.length em - hlen - 1) 395 424 and h = String.sub em (String.length em - hlen - 1) hlen 396 - and bxx = String.get_uint8 em (String.length em - 1) 397 - in 398 - let db = MGF.mask ~seed:h mdb in 399 - Bytes.set_uint8 db 0 (Bytes.get_uint8 db 0 land b0mask emlen) ; 400 - let db = Bytes.unsafe_to_string db in 425 + and bxx = String.get_uint8 em (String.length em - 1) in 426 + let db = MGF.mask ~seed:h mdb in 427 + Bytes.set_uint8 db 0 (Bytes.get_uint8 db 0 land b0mask emlen); 428 + let db = Bytes.unsafe_to_string db in 401 429 let salt = String.sub db (String.length db - slen) slen in 402 - let h' = digest ~salt:salt msg 403 - and i = ct_find_uint8 ~default:0 ~f:((<>) 0x00) db in 430 + let h' = digest ~salt msg 431 + and i = ct_find_uint8 ~default:0 ~f:(( <> ) 0x00) db in 404 432 let c1 = lnot (b0mask emlen) land String.get_uint8 mdb 0 = 0x00 405 433 and c2 = i = String.length em - hlen - slen - 2 406 - and c3 = String.get_uint8 db i = 0x01 434 + and c3 = String.get_uint8 db i = 0x01 407 435 and c4 = bxx = 0xbc 408 436 and c5 = Eqaf.equal h h' in 409 437 c1 && c2 && c3 && c4 && c5 ··· 419 447 decrypt ~crt_hardening ?mask ~key msg' 420 448 421 449 let verify ?(slen = hlen) ~key ~signature msg = 422 - let b = pub_bits key 423 - and s = String.length signature in 424 - s = b // 8 && sufficient_key ~slen b && try 425 - let em = encrypt ~key signature in 426 - let to_see = s - (b - 1) // 8 in 427 - emsa_pss_verify (imax 0 slen) (b - 1) (String.sub em to_see (String.length em - to_see)) msg 428 - with Insufficient_key -> false 429 - 450 + let b = pub_bits key and s = String.length signature in 451 + s = b // 8 452 + && sufficient_key ~slen b 453 + && 454 + try 455 + let em = encrypt ~key signature in 456 + let to_see = s - ((b - 1) // 8) in 457 + emsa_pss_verify (imax 0 slen) (b - 1) 458 + (String.sub em to_see (String.length em - to_see)) 459 + msg 460 + with Insufficient_key -> false 430 461 end
+66 -61
pk/z_extra.ml
··· 5 5 let of_octets_be ?bits buf = 6 6 let rec loop acc i = function 7 7 | b when b >= 64 -> 8 - let x = String.get_int64_be buf i in 9 - let x = Z.of_int64_unsigned Int64.(shift_right_logical x 8) in 10 - loop Z.(x + acc lsl 56) (i + 7) (b - 56) 8 + let x = String.get_int64_be buf i in 9 + let x = Z.of_int64_unsigned Int64.(shift_right_logical x 8) in 10 + loop Z.(x + (acc lsl 56)) (i + 7) (b - 56) 11 11 | b when b >= 32 -> 12 - let x = String.get_int32_be buf i in 13 - let x = Z.of_int32_unsigned Int32.(shift_right_logical x 8) in 14 - loop Z.(x + acc lsl 24) (i + 3) (b - 24) 12 + let x = String.get_int32_be buf i in 13 + let x = Z.of_int32_unsigned Int32.(shift_right_logical x 8) in 14 + loop Z.(x + (acc lsl 24)) (i + 3) (b - 24) 15 15 | b when b >= 16 -> 16 - let x = Z.of_int (String.get_uint16_be buf i) in 17 - loop Z.(x + acc lsl 16) (i + 2) (b - 16) 18 - | b when b >= 8 -> 19 - let x = Z.of_int (String.get_uint8 buf i) in 20 - loop Z.(x + acc lsl 8 ) (i + 1) (b - 8 ) 21 - | b when b > 0 -> 22 - let x = String.get_uint8 buf i and b' = 8 - b in 23 - Z.(of_int x asr b' + acc lsl b) 24 - | _ -> acc in 25 - loop Z.zero 0 @@ match bits with 26 - | None -> String.length buf * 8 16 + let x = Z.of_int (String.get_uint16_be buf i) in 17 + loop Z.(x + (acc lsl 16)) (i + 2) (b - 16) 18 + | b when b >= 8 -> 19 + let x = Z.of_int (String.get_uint8 buf i) in 20 + loop Z.(x + (acc lsl 8)) (i + 1) (b - 8) 21 + | b when b > 0 -> 22 + let x = String.get_uint8 buf i and b' = 8 - b in 23 + Z.((of_int x asr b') + (acc lsl b)) 24 + | _ -> acc 25 + in 26 + loop Z.zero 0 27 + @@ 28 + match bits with 29 + | None -> String.length buf * 8 27 30 | Some b -> imin b (String.length buf * 8) 28 31 29 32 let byte1 = Z.of_int64 0xffL ··· 34 37 let into_octets_be n buf = 35 38 let rec write n = function 36 39 | i when i >= 7 -> 37 - Bytes.set_int64_be buf (i - 7) Z.(to_int64_unsigned (n land byte7)) ; 38 - write Z.(n asr 56) (i - 7) 40 + Bytes.set_int64_be buf (i - 7) Z.(to_int64_unsigned (n land byte7)); 41 + write Z.(n asr 56) (i - 7) 39 42 | i when i >= 3 -> 40 - Bytes.set_int32_be buf (i - 3) Z.(to_int32_unsigned (n land byte3)) ; 41 - write Z.(n asr 24) (i - 3) 43 + Bytes.set_int32_be buf (i - 3) Z.(to_int32_unsigned (n land byte3)); 44 + write Z.(n asr 24) (i - 3) 42 45 | i when i >= 1 -> 43 - Bytes.set_uint16_be buf (i - 1) Z.(to_int (n land byte2)) ; 44 - write Z.(n asr 16) (i - 2) 45 - | 0 -> Bytes.set_uint8 buf 0 Z.(to_int (n land byte1)) ; 46 + Bytes.set_uint16_be buf (i - 1) Z.(to_int (n land byte2)); 47 + write Z.(n asr 16) (i - 2) 48 + | 0 -> Bytes.set_uint8 buf 0 Z.(to_int (n land byte1)) 46 49 | _ -> () 47 50 in 48 51 write n (Bytes.length buf - 1) 49 52 50 53 let to_octets_be ?size n = 51 - let buf = Bytes.create @@ match size with 52 - | Some s -> imax 0 s 53 - | None -> Z.numbits n // 8 in 54 + let buf = 55 + Bytes.create 56 + @@ match size with Some s -> imax 0 s | None -> Z.numbits n // 8 57 + in 54 58 into_octets_be n buf; 55 59 Bytes.unsafe_to_string buf 56 60 57 61 (* Handbook of Applied Cryptography, Table 4.4: 58 62 * Miller-Rabin rounds for composite probability <= 1/2^80. *) 59 63 let pseudoprime z = 60 - let i = match Z.numbits z with 61 - | i when i >= 1300 -> 2 62 - | i when i >= 850 -> 3 63 - | i when i >= 650 -> 4 64 - | i when i >= 350 -> 8 65 - | i when i >= 250 -> 12 66 - | i when i >= 150 -> 18 67 - | _ -> 27 in 64 + let i = 65 + match Z.numbits z with 66 + | i when i >= 1300 -> 2 67 + | i when i >= 850 -> 3 68 + | i when i >= 650 -> 4 69 + | i when i >= 350 -> 8 70 + | i when i >= 250 -> 12 71 + | i when i >= 150 -> 18 72 + | _ -> 27 73 + in 68 74 Z.probab_prime z i <> 0 69 75 70 76 (* strip_factor ~f x = (s, t), where x = f^s t *) 71 77 let strip_factor ~f x = 72 78 let rec go n x = 73 - let (x1, r) = Z.div_rem x f in 79 + let x1, r = Z.div_rem x f in 74 80 if r = Z.zero then go (succ n) x1 else Ok (n, x) 75 81 in 76 - if Z.(~$2) <= f then 77 - go 0 x 78 - else 79 - Error (`Msg ("factor_count: f: " ^ Z.to_string f)) 82 + if Z.(~$2) <= f then go 0 x 83 + else Error (`Msg ("factor_count: f: " ^ Z.to_string f)) 80 84 81 85 let gen ?g n = 82 86 if n < Z.one then invalid_arg "Rng.gen: non-positive: %a" Z.pp_print n; 83 - let bs = Crypto_rng.block g in 84 - let bits = Z.(numbits (pred n)) in 85 - let octets = bits // 8 in 86 - let batch = 87 - if Crypto_rng.strict g then octets else 2 * octets // bs * bs 88 - in 89 - let rec attempt buf = 90 - if String.length buf >= octets then 91 - let x = of_octets_be ~bits buf in 92 - if x < n then x else attempt (String.sub buf octets (String.length buf - octets)) 93 - else attempt (Crypto_rng.generate ?g batch) in 94 - attempt (Crypto_rng.generate ?g batch) 87 + let bs = Crypto_rng.block g in 88 + let bits = Z.(numbits (pred n)) in 89 + let octets = bits // 8 in 90 + let batch = if Crypto_rng.strict g then octets else 2 * octets // bs * bs in 91 + let rec attempt buf = 92 + if String.length buf >= octets then 93 + let x = of_octets_be ~bits buf in 94 + if x < n then x 95 + else attempt (String.sub buf octets (String.length buf - octets)) 96 + else attempt (Crypto_rng.generate ?g batch) 97 + in 98 + attempt (Crypto_rng.generate ?g batch) 95 99 96 100 let rec gen_r ?g a b = 97 101 if Crypto_rng.strict g then 98 - let x = gen ?g b in if x < a then gen_r ?g a b else x 102 + let x = gen ?g b in 103 + if x < a then gen_r ?g a b else x 99 104 else Z.(a + gen ?g (b - a)) 100 - 101 105 102 106 let set_msb bits buf = 103 107 if bits > 0 then 104 108 let n = Bytes.length buf in 105 109 let rec go width = function 106 - | i when i = n -> () 110 + | i when i = n -> () 107 111 | i when width < 8 -> 108 - Bytes.set_uint8 buf i (Bytes.get_uint8 buf i lor (0xff lsl (8 - width))) 112 + Bytes.set_uint8 buf i 113 + (Bytes.get_uint8 buf i lor (0xff lsl (8 - width))) 109 114 | i -> 110 - Bytes.set_uint8 buf i 0xff ; 111 - go (width - 8) (succ i) 115 + Bytes.set_uint8 buf i 0xff; 116 + go (width - 8) (succ i) 112 117 in 113 118 go bits 0 114 119 ··· 116 121 let bytelen = bits // 8 in 117 122 let buf = Bytes.create bytelen in 118 123 Crypto_rng.generate_into ?g buf ~off:0 bytelen; 119 - set_msb msb buf ; 124 + set_msb msb buf; 120 125 of_octets_be ~bits (Bytes.unsafe_to_string buf) 121 126 122 127 (* Invalid combinations of ~bits and ~msb will loop forever, but there is no 123 128 * way to quickly determine upfront whether there are any primes in the 124 129 * interval. 125 130 * XXX Probability is distributed as inter-prime gaps. So? 126 - *) 131 + *) 127 132 let rec prime ?g ?(msb = 1) bits = 128 133 let p = Z.(nextprime @@ gen_bits ?g ~msb bits) in 129 134 if p < Z.(one lsl bits) then p else prime ?g ~msb bits ··· 131 136 (* XXX Add ~msb param for p? *) 132 137 let rec safe_prime ?g bits = 133 138 let q = prime ?g ~msb:1 (bits - 1) in 134 - let p = Z.(q * ~$2 + ~$1) in 139 + let p = Z.((q * ~$2) + ~$1) in 135 140 if pseudoprime p then (q, p) else safe_prime ?g bits
-1
rng/crypto_rng.ml
··· 1 1 include Rng 2 - 3 2 module Fortuna = Fortuna 4 3 module Hmac_drbg = Hmac_drbg.Make 5 4 module Entropy = Entropy
+94 -78
rng/crypto_rng.mli
··· 4 4 5 5 There are several parts of this module: 6 6 7 - {ul 8 - {- The {{!Generator}signature} of generator modules, together with a 9 - facility to convert such modules into actual {{!g}generators}, and 10 - functions that operate on this representation.} 11 - {- A global generator instance, which needs to be initialized by calling 12 - {!set_default_generator}.}} 13 - *) 7 + - The {{!Generator}signature} of generator modules, together with a facility 8 + to convert such modules into actual {{!g}generators}, and functions that 9 + operate on this representation. 10 + - A global generator instance, which needs to be initialized by calling 11 + {!set_default_generator}. *) 14 12 15 13 (** {1 Usage notes} *) 16 14 ··· 21 19 Linux, getentropy() on macOS and BSD systems, BCryptGenRandom on Windows). 22 20 23 21 Please ensure to call [Crypto_rng_unix.use_default], or 24 - [Crypto_rng_unix.use_dev_urandom] (if you only want to use 25 - /dev/urandom), or [Crypto_rng_unix.use_getentropy] (if you only want 26 - to use getrandom/getentropy/BCryptGenRandom). 22 + [Crypto_rng_unix.use_dev_urandom] (if you only want to use /dev/urandom), or 23 + [Crypto_rng_unix.use_getentropy] (if you only want to use 24 + getrandom/getentropy/BCryptGenRandom). 27 25 28 26 For fine-grained control (doing entropy harvesting, etc.), please continue 29 - reading the documentation below. {b Please be aware that the feeding of 30 - Fortuna and producing random numbers is not thread-safe} (it is on Miou_unix 31 - via Pfortuna). 27 + reading the documentation below. 28 + {b Please be aware that the feeding of Fortuna and producing random numbers 29 + is not thread-safe} (it is on Miou_unix via Pfortuna). 32 30 33 31 Suitable entropy feeding of generators are provided by other libraries 34 - {{!Crypto_rng_mirage}mirage-crypto-rng-mirage} (for MirageOS), 35 - and {{!Crypto_rng_miou_unix}mirage-crypto-miou-unix} (for Miou_unix). 32 + {{!Crypto_rng_mirage}mirage-crypto-rng-mirage} (for MirageOS), and 33 + {{!Crypto_rng_miou_unix}mirage-crypto-miou-unix} (for Miou_unix). 36 34 37 35 The intention is that "initialize" in the respective sub-library is called 38 - once, which sets the default generator and registers entropy 39 - harvesting asynchronous tasks. The semantics is that the entropy is always 40 - fed to the {{!default_generator}default generator}, which is not necessarily 41 - the one set by "initialize". The reasoning behind this is that the default 42 - generator should be used in most setting, and that should be fed a constant 43 - stream of entropy. 36 + once, which sets the default generator and registers entropy harvesting 37 + asynchronous tasks. The semantics is that the entropy is always fed to the 38 + {{!default_generator}default generator}, which is not necessarily the one 39 + set by "initialize". The reasoning behind this is that the default generator 40 + should be used in most setting, and that should be fed a constant stream of 41 + entropy. 44 42 45 43 The RNGs here are merely the deterministic part of a full random number 46 44 generation suite. For proper operation, they need to be seeded with a ··· 66 64 67 65 The recommended way to use these functions is either to accept an optional 68 66 generator and pass it down, or to ignore the generator altogether, as 69 - illustrated in the {{!rng_examples}examples}. 70 - *) 67 + illustrated in the {{!rng_examples}examples}. *) 71 68 72 69 (** {1 Interface} *) 73 70 ··· 82 79 83 80 (** Entropy sources and collection *) 84 81 module Entropy : sig 85 - 82 + type source 86 83 (** Entropy sources. *) 87 - type source 88 84 89 85 val sources : unit -> source list 90 86 (** [sources ()] returns the list of available sources. *) ··· 99 95 100 96 val whirlwind_bootstrap : int -> string 101 97 (** [whirlwind_bootstrap id] exploits CPU-level data races which lead to 102 - execution-time variability. It returns 200 bytes random data prefixed 103 - by [id]. 98 + execution-time variability. It returns 200 bytes random data prefixed by 99 + [id]. 104 100 105 - See {{:http://www.ieee-security.org/TC/SP2014/papers/Not-So-RandomNumbersinVirtualizedLinuxandtheWhirlwindRNG.pdf}} 101 + See 102 + {:http://www.ieee-security.org/TC/SP2014/papers/Not-So-RandomNumbersinVirtualizedLinuxandtheWhirlwindRNG.pdf} 106 103 for further details. *) 107 104 108 - val cpu_rng_bootstrap : (int -> string, [`Not_supported]) Result.t 109 - (** [cpu_rng_bootstrap id] returns 8 bytes of random data using the CPU 110 - RNG (rdseed). On 32bit platforms, only 4 bytes are filled. 111 - The [id] is used as prefix. If only rdrand is available, the return 112 - value is the concatenation of 512 calls to rdrand. 105 + val cpu_rng_bootstrap : (int -> string, [ `Not_supported ]) Result.t 106 + (** [cpu_rng_bootstrap id] returns 8 bytes of random data using the CPU RNG 107 + (rdseed). On 32bit platforms, only 4 bytes are filled. The [id] is used as 108 + prefix. If only rdrand is available, the return value is the concatenation 109 + of 512 calls to rdrand. 113 110 114 - @raise Failure if rdrand fails 512 times, or if rdseed fails and rdrand 115 - is not available. 116 - *) 111 + @raise Failure 112 + if rdrand fails 512 times, or if rdseed fails and rdrand is not 113 + available. *) 117 114 118 115 val bootstrap : int -> string 119 116 (** [bootstrap id] is either [cpu_rng_bootstrap], if the CPU supports it, or ··· 122 119 (** {1 Timer source} *) 123 120 124 121 val interrupt_hook : unit -> string 125 - (** [interrupt_hook] collects lower bytes from the cycle counter, to be 126 - used for entropy collection in the event loop. *) 122 + (** [interrupt_hook] collects lower bytes from the cycle counter, to be used 123 + for entropy collection in the event loop. *) 127 124 128 125 val timer_accumulator : g option -> unit -> unit 129 - (** [timer_accumulator g] is the accumulator for the timer source, 130 - applying {!interrupt_hook} on each call. *) 126 + (** [timer_accumulator g] is the accumulator for the timer source, applying 127 + {!interrupt_hook} on each call. *) 131 128 132 129 (** {1 Periodic pulled sources} *) 133 130 134 - val feed_pools : g option -> source -> (unit -> (string, [ `No_random_available ]) result) -> unit 131 + val feed_pools : 132 + g option -> 133 + source -> 134 + (unit -> (string, [ `No_random_available ]) result) -> 135 + unit 135 136 (** [feed_pools g source f] feeds all pools of [g] using [source] by executing 136 137 [f] for each pool. *) 137 138 138 - val cpu_rng : (g option -> unit -> unit, [`Not_supported]) Result.t 139 - (** [cpu_rng g] uses the CPU RNG (rdrand or rdseed) to feed all pools 140 - of [g]. It uses {!feed_pools} internally. If neither rdrand nor rdseed 141 - are available, [`Not_supported] is returned. *) 139 + val cpu_rng : (g option -> unit -> unit, [ `Not_supported ]) Result.t 140 + (** [cpu_rng g] uses the CPU RNG (rdrand or rdseed) to feed all pools of [g]. 141 + It uses {!feed_pools} internally. If neither rdrand nor rdseed are 142 + available, [`Not_supported] is returned. *) 142 143 143 144 val rdrand_calls : unit -> int 144 145 (** [rdrand_calls ()] returns the number of rdrand calls. *) ··· 153 154 (** [rdseed_failures ()] returns the number of rdseed failures. *) 154 155 155 156 (**/**) 157 + 156 158 val id : source -> int 157 159 (** [id source] is the identifier used for [source]. *) 158 160 159 161 val header : int -> string -> string 160 162 (** [header id data] constructs a unique header with [id], length of [data], 161 163 and [data]. *) 164 + 162 165 (**/**) 163 166 end 164 167 165 168 (** A single PRNG algorithm. *) 166 169 module type Generator = sig 167 - 168 170 type g 169 171 (** State type for this generator. *) 170 172 ··· 176 178 (** Create a new, unseeded {{!g}g}. *) 177 179 178 180 val generate_into : g:g -> bytes -> off:int -> int -> unit 179 - [@@alert unsafe "Does not do bounds checks. Use Crypto_rng.generate_into instead."] 181 + [@@alert 182 + unsafe "Does not do bounds checks. Use Crypto_rng.generate_into instead."] 180 183 (** [generate_into ~g buf ~off n] produces [n] uniformly distributed random 181 184 bytes into [buf] at offset [off], updating the state of [g]. 182 185 183 186 Assumes that [buf] is at least [off + n] bytes long. Also assumes that 184 187 [off] and [n] are positive integers. Caution: do not use in your 185 - application, use [Crypto_rng.generate_into] instead. 186 - *) 188 + application, use [Crypto_rng.generate_into] instead. *) 187 189 188 190 val reseed : g:g -> string -> unit 189 191 (** [reseed ~g bytes] directly updates [g]. Its new state depends both on ··· 191 193 192 194 A generator is seded after a single application of [reseed]. *) 193 195 194 - val accumulate : g:g -> Entropy.source -> [`Acc of string -> unit] 195 - (** [accumulate ~g] is a closure suitable for incrementally feeding 196 - small amounts of environmentally sourced entropy into [g]. 196 + val accumulate : g:g -> Entropy.source -> [ `Acc of string -> unit ] 197 + (** [accumulate ~g] is a closure suitable for incrementally feeding small 198 + amounts of environmentally sourced entropy into [g]. 197 199 198 - Its operation should be fast enough for repeated calling from e.g. 199 - event loops. Systems with several distinct, stable entropy sources 200 - should use stable [source] to distinguish their sources. *) 200 + Its operation should be fast enough for repeated calling from e.g. event 201 + loops. Systems with several distinct, stable entropy sources should use 202 + stable [source] to distinguish their sources. *) 201 203 202 204 val seeded : g:g -> bool 203 205 (** [seeded ~g] is [true] iff operations won't throw ··· 211 213 212 214 (** Ready-to-use RNG algorithms. *) 213 215 214 - (** {b Fortuna}, a CSPRNG {{: https://www.schneier.com/fortuna.html} proposed} 215 - by Schneier. *) 216 216 module Fortuna : Generator 217 + (** {b Fortuna}, a CSPRNG {{:https://www.schneier.com/fortuna.html} proposed} by 218 + Schneier. *) 217 219 218 220 (** {b HMAC_DRBG}: A NIST-specified RNG based on HMAC construction over the 219 221 provided hash. *) 220 222 module Hmac_drbg (H : Digestif.S) : Generator 221 223 222 - val create : ?g:'a -> ?seed:string -> ?strict:bool -> 223 - ?time:(unit -> int64) -> 'a generator -> g 224 + val create : 225 + ?g:'a -> 226 + ?seed:string -> 227 + ?strict:bool -> 228 + ?time:(unit -> int64) -> 229 + 'a generator -> 230 + g 224 231 (** [create ~g ~seed ~strict ~time module] uses a module conforming to the 225 232 {{!Generator}Generator} signature to instantiate the generic generator 226 233 {{!g}g}. ··· 239 246 (** [default_generator ()] is the default generator. Functions in this module 240 247 use this generator when not explicitly supplied one. 241 248 242 - @raise No_default_generator if {!set_default_generator} has not been called. *) 249 + @raise No_default_generator if {!set_default_generator} has not been called. 250 + *) 243 251 244 252 val set_default_generator : g -> unit 245 253 (** [set_default_generator g] sets the default generator to [g]. This function 246 254 must be called once. *) 247 255 248 256 (**/**) 257 + 249 258 (* This function is only used by eio to set the default generator to None when 250 259 the entropy harvesting tasks are finished. *) 251 260 val unset_default_generator : unit -> unit 252 261 (** [unset_default_generator ()] sets the default generator to [None]. *) 262 + 253 263 (**/**) 254 264 255 265 val generate_into : ?g:g -> bytes -> ?off:int -> int -> unit ··· 258 268 {{!generator}default generator}. The random data is put into [buf] starting 259 269 at [off] (defaults to 0) with [len] bytes. 260 270 261 - @raise Invalid_argument if buffer is too small (it must be: [Bytes.length 262 - buf - off >= n]) or [off] or [n] are negative. 263 - *) 271 + @raise Invalid_argument 272 + if buffer is too small (it must be: [Bytes.length buf - off >= n]) or 273 + [off] or [n] are negative. *) 264 274 265 275 val generate : ?g:g -> int -> string 266 276 (** Invoke {!generate_into} on [g] or {{!generator}default generator} and a 267 277 freshly allocated string. *) 268 278 269 279 val block : g option -> int 270 - (** {{!Generator.block}Block} size of [g] or 271 - {{!generator}default generator}. *) 280 + (** {{!Generator.block}Block} size of [g] or {{!generator}default generator}. *) 272 281 273 282 (**/**) 274 283 ··· 276 285 * connect the RNG with entropy-providing libraries and subject to change. 277 286 * Client applications should not use them directly. *) 278 287 279 - val reseed : ?g:g -> string -> unit 280 - val accumulate : g option -> Entropy.source -> [`Acc of string -> unit] 281 - val seeded : g option -> bool 282 - val pools : g option -> int 288 + val reseed : ?g:g -> string -> unit 289 + val accumulate : g option -> Entropy.source -> [ `Acc of string -> unit ] 290 + val seeded : g option -> bool 291 + val pools : g option -> int 283 292 val strict : g option -> bool 293 + 284 294 (**/**) 285 - 286 295 287 296 (** {1:rng_examples Examples} 288 297 289 298 Generating a random 13-byte string: 290 - {[let cs = Rng.generate 13]} 299 + {[ 300 + let cs = Rng.generate 13 301 + ]} 291 302 292 303 Generating a list of string, passing down an optional {{!g}generator}: 293 - {[let rec f1 ?g ~n i = 294 - if i < 1 then [] else Rng.generate ?g n :: f1 ?g ~n (i - 1)]} 304 + {[ 305 + let rec f1 ?g ~n i = 306 + if i < 1 then [] else Rng.generate ?g n :: f1 ?g ~n (i - 1) 307 + ]} 295 308 296 309 Generating a [Z.t] smaller than [10]: 297 - {[let f2 ?g () = Crypto_pk.Z_extra.gen ?g Z.(~$10)]} 310 + {[ 311 + let f2 ?g () = Crypto_pk.Z_extra.gen ?g Z.(~$10) 312 + ]} 298 313 299 314 Creating a local Fortuna instance and using it as a key-derivation function: 300 - {[let f3 secret = 301 - let g = Rng.(create ~seed:secret (module Generators.Fortuna)) in 302 - Rng.generate ~g 32]} 303 - *) 315 + {[ 316 + let f3 secret = 317 + let g = Rng.(create ~seed:secret (module Generators.Fortuna)) in 318 + Rng.generate ~g 32 319 + ]} *)
+78 -86
rng/entropy.ml
··· 27 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 28 *) 29 29 30 - let src = Logs.Src.create "mirage-crypto-rng-entropy" ~doc:"Mirage crypto RNG Entropy" 30 + let src = 31 + Logs.Src.create "mirage-crypto-rng-entropy" ~doc:"Mirage crypto RNG Entropy" 32 + 31 33 module Log = (val Logs.src_log src : Logs.LOG) 32 34 33 35 let rdrand_calls = Atomic.make 0 ··· 36 38 let rdseed_failures = Atomic.make 0 37 39 38 40 module Cpu_native = struct 39 - 40 - external cycles : unit -> int = "mc_cycle_counter" [@@noalloc] 41 - external rdseed : bytes -> int -> bool = "mc_cpu_rdseed" [@@noalloc] 42 - external rdrand : bytes -> int -> bool = "mc_cpu_rdrand" [@@noalloc] 43 - external rng_type : unit -> int = "mc_cpu_rng_type" [@@noalloc] 41 + external cycles : unit -> int = "mc_cycle_counter" [@@noalloc] 42 + external rdseed : bytes -> int -> bool = "mc_cpu_rdseed" [@@noalloc] 43 + external rdrand : bytes -> int -> bool = "mc_cpu_rdrand" [@@noalloc] 44 + external rng_type : unit -> int = "mc_cpu_rng_type" [@@noalloc] 44 45 45 46 let cpu_rng = 46 47 match rng_type () with 47 48 | 0 -> [] 48 49 | 1 -> [ `Rdrand ] 49 50 | 2 -> [ `Rdseed ] 50 - | 3 -> [ `Rdrand ; `Rdseed ] 51 + | 3 -> [ `Rdrand; `Rdseed ] 51 52 | _ -> assert false 52 53 end 53 54 54 - module S = Set.Make(struct 55 - type t = int * string 56 - (* only the name is relevant for comparison - the idx not *) 57 - let compare ((_a, an) : int * string) ((_b, bn) : int * string) = 58 - String.compare an bn 59 - end) 55 + module S = Set.Make (struct 56 + type t = int * string 57 + 58 + (* only the name is relevant for comparison - the idx not *) 59 + let compare ((_a, an) : int * string) ((_b, bn) : int * string) = 60 + String.compare an bn 61 + end) 60 62 61 63 let _sources = Atomic.make S.empty 62 64 ··· 69 71 let source = (n, name) in 70 72 if Atomic.compare_and_set _sources sources (S.add source sources) then 71 73 source 72 - else 73 - set () 74 + else set () 74 75 in 75 76 set () 76 77 77 78 let id (idx, _) = idx 78 - 79 79 let sources () = S.elements (Atomic.get _sources) 80 - 81 80 let pp_source ppf (idx, name) = Format.fprintf ppf "[%d] %s" idx name 82 81 83 - let cpu_rng isn buf off = match isn with 82 + let cpu_rng isn buf off = 83 + match isn with 84 84 | `Rdseed -> 85 - Atomic.incr rdseed_calls; 86 - let success = Cpu_native.rdseed buf off in 87 - if not success then Atomic.incr rdseed_failures; 88 - success 85 + Atomic.incr rdseed_calls; 86 + let success = Cpu_native.rdseed buf off in 87 + if not success then Atomic.incr rdseed_failures; 88 + success 89 89 | `Rdrand -> 90 - Atomic.incr rdrand_calls; 91 - let success = Cpu_native.rdrand buf off in 92 - if not success then Atomic.incr rdrand_failures; 93 - success 90 + Atomic.incr rdrand_calls; 91 + let success = Cpu_native.rdrand buf off in 92 + if not success then Atomic.incr rdrand_failures; 93 + success 94 94 95 95 let random preferred = 96 96 match Cpu_native.cpu_rng with 97 97 | [] -> None 98 98 | xs when List.mem preferred xs -> Some preferred 99 - | y::_ -> Some y 99 + | y :: _ -> Some y 100 100 101 101 let write_header source data = 102 102 Bytes.set_uint8 data 0 source; ··· 113 113 * data races that lead to execution-time variability of identical instructions. 114 114 * See Whirlwind RNG: 115 115 * http://www.ieee-security.org/TC/SP2014/papers/Not-So-RandomNumbersinVirtualizedLinuxandtheWhirlwindRNG.pdf 116 - *) 116 + *) 117 117 let whirlwind_bootstrap id = 118 - let outer = 100 119 - and inner_max = 1024 120 - and a = ref 0 121 - in 122 - let buf = Bytes.create (outer * 2 + 2) in 118 + let outer = 100 and inner_max = 1024 and a = ref 0 in 119 + let buf = Bytes.create ((outer * 2) + 2) in 123 120 for i = 0 to outer - 1 do 124 121 let tsc = Cpu_native.cycles () in 125 122 Bytes.set_uint16_le buf ((i + 1) * 2) tsc; 126 123 for j = 1 to tsc mod inner_max do 127 - a := tsc / j - !a * i + 1 124 + a := (tsc / j) - (!a * i) + 1 128 125 done 129 126 done; 130 127 write_header id buf; ··· 135 132 let rec go acc = function 136 133 | 0 -> acc 137 134 | n -> 138 - let buf = Bytes.create 10 in 139 - let r = cpu_rng `Rdrand buf 2 in 140 - write_header id buf; 141 - if not r then 142 - go acc (pred n) 143 - else 144 - go (Bytes.unsafe_to_string buf :: acc) (pred n) 135 + let buf = Bytes.create 10 in 136 + let r = cpu_rng `Rdrand buf 2 in 137 + write_header id buf; 138 + if not r then go acc (pred n) 139 + else go (Bytes.unsafe_to_string buf :: acc) (pred n) 145 140 in 146 141 let result = go [] 512 |> String.concat "" in 147 - if String.length result = 0 then 148 - failwith "Too many RDRAND failures" 149 - else 150 - result 142 + if String.length result = 0 then failwith "Too many RDRAND failures" 143 + else result 151 144 in 152 145 match random `Rdseed with 153 146 | None -> Error `Not_supported 154 147 | Some `Rdseed -> 155 - let cpu_rng_bootstrap id = 156 - let buf = Bytes.create 10 in 157 - let r = cpu_rng `Rdseed buf 2 in 158 - write_header id buf; 159 - if not r then 160 - if List.mem `Rdrand Cpu_native.cpu_rng then 161 - rdrand_bootstrap id 162 - else 163 - failwith "RDSEED failed, and RDRAND not available" 164 - else 165 - Bytes.unsafe_to_string buf 166 - in 167 - Ok cpu_rng_bootstrap 148 + let cpu_rng_bootstrap id = 149 + let buf = Bytes.create 10 in 150 + let r = cpu_rng `Rdseed buf 2 in 151 + write_header id buf; 152 + if not r then 153 + if List.mem `Rdrand Cpu_native.cpu_rng then rdrand_bootstrap id 154 + else failwith "RDSEED failed, and RDRAND not available" 155 + else Bytes.unsafe_to_string buf 156 + in 157 + Ok cpu_rng_bootstrap 168 158 | Some `Rdrand -> Ok rdrand_bootstrap 169 159 170 160 let bootstrap id = 171 161 match cpu_rng_bootstrap with 172 162 | Error `Not_supported -> whirlwind_bootstrap id 173 - | Ok cpu_rng_bootstrap -> 174 - try cpu_rng_bootstrap id with 175 - | Failure f -> 176 - Log.err (fun m -> m "CPU RNG bootstrap failed: %s, using whirlwind" f); 177 - whirlwind_bootstrap id 163 + | Ok cpu_rng_bootstrap -> ( 164 + try cpu_rng_bootstrap id 165 + with Failure f -> 166 + Log.err (fun m -> m "CPU RNG bootstrap failed: %s, using whirlwind" f); 167 + whirlwind_bootstrap id) 178 168 179 169 let interrupt_hook () = 180 170 let buf = Bytes.create 4 in 181 171 let a = Cpu_native.cycles () in 182 - Bytes.set_int32_le buf 0 (Int32.of_int a) ; 172 + Bytes.set_int32_le buf 0 (Int32.of_int a); 183 173 Bytes.unsafe_to_string buf 184 174 185 175 let timer_accumulator g = 186 - let g = match g with None -> Some (Rng.default_generator ()) | Some g -> Some g in 176 + let g = 177 + match g with None -> Some (Rng.default_generator ()) | Some g -> Some g 178 + in 187 179 let source = register_source "timer" in 188 - let `Acc handle = Rng.accumulate g source in 189 - (fun () -> handle (interrupt_hook ())) 180 + let (`Acc handle) = Rng.accumulate g source in 181 + fun () -> handle (interrupt_hook ()) 190 182 191 183 let feed_pools g source f = 192 - let g = match g with None -> Some (Rng.default_generator ()) | Some g -> Some g in 193 - let `Acc handle = Rng.accumulate g source in 184 + let g = 185 + match g with None -> Some (Rng.default_generator ()) | Some g -> Some g 186 + in 187 + let (`Acc handle) = Rng.accumulate g source in 194 188 for _i = 0 to pred (Rng.pools g) do 195 189 match f () with 196 190 | Ok data -> handle data 197 191 | Error `No_random_available -> 198 - (* should we log a message? *) 199 - () 192 + (* should we log a message? *) 193 + () 200 194 done 201 195 202 196 let cpu_rng = 203 197 match random `Rdrand with 204 198 | None -> Error `Not_supported 205 199 | Some insn -> 206 - let cpu_rng g = 207 - let randomf = cpu_rng insn 208 - and source = 209 - let s = match insn with `Rdrand -> "rdrand" | `Rdseed -> "rdseed" in 210 - register_source s 211 - in 212 - let f () = 213 - let buf = Bytes.create 8 in 214 - if randomf buf 0 then 215 - Ok (Bytes.unsafe_to_string buf) 216 - else 217 - Error `No_random_available 200 + let cpu_rng g = 201 + let randomf = cpu_rng insn 202 + and source = 203 + let s = match insn with `Rdrand -> "rdrand" | `Rdseed -> "rdseed" in 204 + register_source s 205 + in 206 + let f () = 207 + let buf = Bytes.create 8 in 208 + if randomf buf 0 then Ok (Bytes.unsafe_to_string buf) 209 + else Error `No_random_available 210 + in 211 + fun () -> feed_pools g source f 218 212 in 219 - fun () -> feed_pools g source f 220 - in 221 - Ok cpu_rng 213 + Ok cpu_rng 222 214 223 215 let rdrand_calls () = Atomic.get rdrand_calls 224 216 let rdrand_failures () = Atomic.get rdrand_failures
+61 -46
rng/fortuna.ml
··· 6 6 7 7 module SHAd256 = struct 8 8 open Digestif 9 + 9 10 type t = SHA256.t 10 11 type ctx = SHA256.ctx 11 - let empty = SHA256.empty 12 - let get t = SHA256.(get t |> to_raw_string |> digest_string |> to_raw_string) 13 - let digest x = SHA256.(digest_string x |> to_raw_string |> digest_string |> to_raw_string) 14 - let digesti i = SHA256.(digesti_string i |> to_raw_string |> digest_string |> to_raw_string) 15 - let feedi = SHA256.feedi_string 12 + 13 + let empty = SHA256.empty 14 + let get t = SHA256.(get t |> to_raw_string |> digest_string |> to_raw_string) 15 + 16 + let digest x = 17 + SHA256.(digest_string x |> to_raw_string |> digest_string |> to_raw_string) 18 + 19 + let digesti i = 20 + SHA256.(digesti_string i |> to_raw_string |> digest_string |> to_raw_string) 21 + 22 + let feedi = SHA256.feedi_string 16 23 end 17 24 18 25 let block = 16 19 26 20 27 (* the minimal amount of bytes in a pool to trigger a reseed *) 21 28 let min_pool_size = 64 29 + 22 30 (* the minimal duration between two reseeds *) 23 31 let min_time_duration = 1_000_000_000L 32 + 24 33 (* number of pools *) 25 34 let pools = 32 26 35 27 36 (* XXX Locking!! *) 28 - type g = 29 - { mutable ctr : AES.CTR.ctr 30 - ; mutable secret : string 31 - ; mutable key : AES.CTR.key 32 - ; pools : SHAd256.ctx array 33 - ; mutable pool0_size : int 34 - ; mutable reseed_count : int 35 - ; mutable last_reseed : int64 36 - ; time : (unit -> int64) option 37 - } 37 + type g = { 38 + mutable ctr : AES.CTR.ctr; 39 + mutable secret : string; 40 + mutable key : AES.CTR.key; 41 + pools : SHAd256.ctx array; 42 + mutable pool0_size : int; 43 + mutable reseed_count : int; 44 + mutable last_reseed : int64; 45 + time : (unit -> int64) option; 46 + } 38 47 39 48 let create ?time () = 40 49 let k = String.make 32 '\x00' in 41 - { ctr = (0L, 0L) 42 - ; secret = k 43 - ; key = AES.CTR.of_secret k 44 - ; pools = Array.make pools SHAd256.empty 45 - ; pool0_size = 0 46 - ; reseed_count = 0 47 - ; last_reseed = 0L 48 - ; time 50 + { 51 + ctr = (0L, 0L); 52 + secret = k; 53 + key = AES.CTR.of_secret k; 54 + pools = Array.make pools SHAd256.empty; 55 + pool0_size = 0; 56 + reseed_count = 0; 57 + last_reseed = 0L; 58 + time; 49 59 } 50 60 51 61 let seeded ~g = ··· 54 64 55 65 (* XXX We might want to erase the old key. *) 56 66 let set_key ~g sec = 57 - g.secret <- sec ; 58 - g.key <- AES.CTR.of_secret sec 67 + g.secret <- sec; 68 + g.key <- AES.CTR.of_secret sec 59 69 60 70 let reseedi ~g iter = 61 - set_key ~g @@ SHAd256.digesti (fun f -> f g.secret; iter f); 71 + set_key ~g 72 + @@ SHAd256.digesti (fun f -> 73 + f g.secret; 74 + iter f); 62 75 g.ctr <- AES.CTR.add_ctr g.ctr 1L 63 76 64 - let iter1 a f = f a 65 - 77 + let iter1 a f = f a 66 78 let reseed ~g cs = reseedi ~g (iter1 cs) 67 79 68 80 let generate_rekey ~g buf ~off len = 69 - let b = len // block + 2 in 70 - let n = b * block in 71 - let r = AES.CTR.stream ~key:g.key ~ctr:g.ctr n in 81 + let b = (len // block) + 2 in 82 + let n = b * block in 83 + let r = AES.CTR.stream ~key:g.key ~ctr:g.ctr n in 72 84 Bytes.unsafe_blit_string r 0 buf off len; 73 85 let r2 = String.sub r (n - 32) 32 in 74 - set_key ~g r2 ; 86 + set_key ~g r2; 75 87 g.ctr <- AES.CTR.add_ctr g.ctr (Int64.of_int b) 76 88 77 89 let add_pool_entropy g = 78 90 if g.pool0_size > min_pool_size then 79 91 let should_reseed, now = 80 92 match g.time with 81 - | None -> true, 0L 93 + | None -> (true, 0L) 82 94 | Some f -> 83 - let now = f () in 84 - Int64.(sub now g.last_reseed > min_time_duration), now 95 + let now = f () in 96 + (Int64.(sub now g.last_reseed > min_time_duration), now) 85 97 in 86 98 if should_reseed then begin 87 99 g.reseed_count <- g.reseed_count + 1; ··· 89 101 g.pool0_size <- 0; 90 102 reseedi ~g @@ fun add -> 91 103 for i = 0 to pools - 1 do 92 - if g.reseed_count land ((1 lsl i) - 1) = 0 then 93 - (SHAd256.get g.pools.(i) |> add; g.pools.(i) <- SHAd256.empty) 104 + if g.reseed_count land ((1 lsl i) - 1) = 0 then ( 105 + SHAd256.get g.pools.(i) |> add; 106 + g.pools.(i) <- SHAd256.empty) 94 107 done 95 108 end 96 109 97 110 let generate_into ~g buf ~off len = 98 111 add_pool_entropy g; 99 - if not (seeded ~g) then raise Rng.Unseeded_generator ; 112 + if not (seeded ~g) then raise Rng.Unseeded_generator; 100 113 let rec chunk off = function 101 114 | i when i <= 0 -> () 102 115 | n -> 103 - let n' = imin n 0x10000 in 104 - generate_rekey ~g buf ~off n'; 105 - chunk (off + n') (n - n') 116 + let n' = imin n 0x10000 in 117 + generate_rekey ~g buf ~off n'; 118 + chunk (off + n') (n - n') 106 119 in 107 120 chunk off len 108 121 109 122 let add ~g (source, _) ~pool data = 110 123 let buf = Bytes.create 2 111 - and pool = pool land (pools - 1) 124 + and pool = pool land (pools - 1) 112 125 and source = source land 0xff in 113 126 Bytes.set_uint8 buf 0 source; 114 127 Bytes.set_uint8 buf 1 (String.length data); 115 - g.pools.(pool) <- SHAd256.feedi g.pools.(pool) (iter2 (Bytes.unsafe_to_string buf) data); 128 + g.pools.(pool) <- 129 + SHAd256.feedi g.pools.(pool) (iter2 (Bytes.unsafe_to_string buf) data); 116 130 if pool = 0 then g.pool0_size <- g.pool0_size + String.length data 117 131 118 132 (* XXX ··· 121 135 *) 122 136 let accumulate ~g source = 123 137 let pool = ref 0 in 124 - `Acc (fun buf -> 125 - add ~g source ~pool:!pool buf ; 126 - incr pool) 138 + `Acc 139 + (fun buf -> 140 + add ~g source ~pool:!pool buf; 141 + incr pool)
+26 -25
rng/hmac_drbg.ml
··· 1 1 module Make (H : Digestif.S) = struct 2 - type g = 3 - { mutable k : string 4 - ; mutable v : string 5 - ; mutable seeded : bool 6 - } 2 + type g = { mutable k : string; mutable v : string; mutable seeded : bool } 7 3 8 4 let block = H.digest_size 9 - 10 - let (bx00, bx01) = "\x00", "\x01" 5 + let bx00, bx01 = ("\x00", "\x01") 11 6 12 7 let k0 = String.make H.digest_size '\x00' 13 8 and v0 = String.make H.digest_size '\x01' 14 9 15 - let create ?time:_ () = { k = k0 ; v = v0 ; seeded = false } 16 - 10 + let create ?time:_ () = { k = k0; v = v0; seeded = false } 17 11 let seeded ~g = g.seeded 18 12 19 13 let reseed ~g buf = 20 - let (k, v) = (g.k, g.v) in 21 - let k = H.hmac_string ~key:k @@ String.concat "" [v; bx00; buf] |> H.to_raw_string in 14 + let k, v = (g.k, g.v) in 15 + let k = 16 + H.hmac_string ~key:k @@ String.concat "" [ v; bx00; buf ] 17 + |> H.to_raw_string 18 + in 22 19 let v = H.hmac_string ~key:k v |> H.to_raw_string in 23 - let k = H.hmac_string ~key:k @@ String.concat "" [v; bx01; buf] |> H.to_raw_string in 20 + let k = 21 + H.hmac_string ~key:k @@ String.concat "" [ v; bx01; buf ] 22 + |> H.to_raw_string 23 + in 24 24 let v = H.hmac_string ~key:k v |> H.to_raw_string in 25 - g.k <- k ; g.v <- v ; g.seeded <- true 25 + g.k <- k; 26 + g.v <- v; 27 + g.seeded <- true 26 28 27 29 let generate_into ~g buf ~off len = 28 - if not g.seeded then raise Rng.Unseeded_generator ; 30 + if not g.seeded then raise Rng.Unseeded_generator; 29 31 let rec go off k v = function 30 32 | 0 -> v 31 33 | 1 -> 32 - let v = H.hmac_string ~key:k v |> H.to_raw_string in 33 - let len = 34 - let rem = len mod H.digest_size in 35 - if rem = 0 then H.digest_size else rem 36 - in 37 - Bytes.unsafe_blit_string v 0 buf off len; 38 - v 34 + let v = H.hmac_string ~key:k v |> H.to_raw_string in 35 + let len = 36 + let rem = len mod H.digest_size in 37 + if rem = 0 then H.digest_size else rem 38 + in 39 + Bytes.unsafe_blit_string v 0 buf off len; 40 + v 39 41 | i -> 40 - let v = H.hmac_string ~key:k v |> H.to_raw_string in 41 - Bytes.unsafe_blit_string v 0 buf off H.digest_size; 42 - go (off + H.digest_size) k v (pred i) 42 + let v = H.hmac_string ~key:k v |> H.to_raw_string in 43 + Bytes.unsafe_blit_string v 0 buf off H.digest_size; 44 + go (off + H.digest_size) k v (pred i) 43 45 in 44 46 let v = go off g.k g.v Crypto.Uncommon.(len // H.digest_size) in 45 47 g.k <- H.hmac_string ~key:g.k (v ^ bx00) |> H.to_raw_string; ··· 47 49 48 50 (* XXX *) 49 51 let accumulate ~g:_ = invalid_arg "Implement Hmac_drbg.accumulate..." 50 - 51 52 let pools = 0 52 53 end
+42 -35
rng/rng.ml
··· 1 1 type source = int * string 2 2 3 3 exception Unseeded_generator 4 - 5 4 exception No_default_generator 6 5 7 6 let setup_rng = 8 - "\nPlease setup your default random number generator. On Unix, the best \ 9 - path is to call [Crypto_rng_unix.use_default ()].\ 10 - \nBut you can use Fortuna (or any other RNG) and setup the seeding \ 11 - (done by default in MirageOS): \ 12 - \n\ 13 - \nTo initialize the RNG with a default generator, and set up entropy \ 14 - collection and periodic reseeding as a background task, do the \ 15 - following:\ 16 - \n If you are using MirageOS, use the random device in config.ml: \ 17 - `let main = Mirage.main \"Unikernel.Main\" (random @-> job)`, \ 18 - and `let () = register \"my_unikernel\" [main $ default_random]`. \ 19 - \n If you are using miou, execute \ 20 - `Crypto_rng_miou_unix.initialize (module Crypto_rng.Fortuna)` \ 21 - at startup." 7 + "\n\ 8 + Please setup your default random number generator. On Unix, the best path \ 9 + is to call [Crypto_rng_unix.use_default ()].\n\ 10 + But you can use Fortuna (or any other RNG) and setup the seeding (done by \ 11 + default in MirageOS): \n\n\ 12 + To initialize the RNG with a default generator, and set up entropy \ 13 + collection and periodic reseeding as a background task, do the following:\n\ 14 + \ If you are using MirageOS, use the random device in config.ml: `let main \ 15 + = Mirage.main \"Unikernel.Main\" (random @-> job)`, and `let () = register \ 16 + \"my_unikernel\" [main $ default_random]`. \n\ 17 + \ If you are using miou, execute `Crypto_rng_miou_unix.initialize (module \ 18 + Crypto_rng.Fortuna)` at startup." 22 19 23 - let () = Printexc.register_printer (function 24 - | Unseeded_generator -> 25 - Some ("The RNG has not been seeded." ^ setup_rng) 20 + let () = 21 + Printexc.register_printer (function 22 + | Unseeded_generator -> Some ("The RNG has not been seeded." ^ setup_rng) 26 23 | No_default_generator -> 27 - Some ("The default generator is not yet initialized. " ^ setup_rng) 24 + Some ("The default generator is not yet initialized. " ^ setup_rng) 28 25 | _ -> None) 29 26 30 27 module type Generator = sig 31 28 type g 29 + 32 30 val block : int 33 31 val create : ?time:(unit -> int64) -> unit -> g 32 + 34 33 val generate_into : g:g -> bytes -> off:int -> int -> unit 35 - [@@alert unsafe "Does not do bounds checks. Use Crypto_rng.generate_into instead."] 34 + [@@alert 35 + unsafe "Does not do bounds checks. Use Crypto_rng.generate_into instead."] 36 + 36 37 val reseed : g:g -> string -> unit 37 - val accumulate : g:g -> source -> [`Acc of string -> unit] 38 + val accumulate : g:g -> source -> [ `Acc of string -> unit ] 38 39 val seeded : g:g -> bool 39 40 val pools : int 40 41 end ··· 42 43 type 'a generator = (module Generator with type g = 'a) 43 44 type g = Generator : ('a * bool * 'a generator) -> g 44 45 45 - let create (type a) ?g ?seed ?(strict=false) ?time (m : a generator) = 46 + let create (type a) ?g ?seed ?(strict = false) ?time (m : a generator) = 46 47 let module M = (val m) in 47 48 let g = Option.value g ~default:(M.create ?time ()) in 48 49 Option.iter (M.reseed ~g) seed; 49 50 Generator (g, strict, m) 50 51 51 52 let _default_generator = Atomic.make None 52 - 53 53 let set_default_generator g = Atomic.set _default_generator (Some g) 54 - 55 54 let unset_default_generator () = Atomic.set _default_generator None 56 55 57 56 let default_generator () = ··· 62 61 let get = function Some g -> g | None -> default_generator () 63 62 64 63 let generate_into ?(g = default_generator ()) b ?(off = 0) n = 65 - let Generator (g, _, m) = g in 64 + let (Generator (g, _, m)) = g in 66 65 let module M = (val m) in 67 66 if off < 0 || n < 0 then 68 - invalid_arg ("negative offset " ^ string_of_int off ^ " or length " ^ 69 - string_of_int n); 70 - if Bytes.length b - off < n then 71 - invalid_arg "buffer too short"; 67 + invalid_arg 68 + ("negative offset " ^ string_of_int off ^ " or length " ^ string_of_int n); 69 + if Bytes.length b - off < n then invalid_arg "buffer too short"; 72 70 begin[@alert "-unsafe"] 73 71 M.generate_into ~g b ~off n 74 72 end ··· 79 77 Bytes.unsafe_to_string data 80 78 81 79 let reseed ?(g = default_generator ()) cs = 82 - let Generator (g, _, m) = g in let module M = (val m) in M.reseed ~g cs 80 + let (Generator (g, _, m)) = g in 81 + let module M = (val m) in 82 + M.reseed ~g cs 83 83 84 84 let accumulate g source = 85 - let Generator (g, _, m) = get g in 85 + let (Generator (g, _, m)) = get g in 86 86 let module M = (val m) in 87 87 M.accumulate ~g source 88 88 89 89 let seeded g = 90 - let Generator (g, _, m) = get g in let module M = (val m) in M.seeded ~g 90 + let (Generator (g, _, m)) = get g in 91 + let module M = (val m) in 92 + M.seeded ~g 91 93 92 94 let block g = 93 - let Generator (_, _, m) = get g in let module M = (val m) in M.block 95 + let (Generator (_, _, m)) = get g in 96 + let module M = (val m) in 97 + M.block 94 98 95 99 let pools g = 96 - let Generator (_, _, m) = get g in let module M = (val m) in M.pools 100 + let (Generator (_, _, m)) = get g in 101 + let module M = (val m) in 102 + M.pools 97 103 98 104 let strict g = 99 - let Generator (_, s, _) = get g in s 105 + let (Generator (_, s, _)) = get g in 106 + s
+15 -15
rng/unix/crypto_rng_unix.ml
··· 1 1 open Crypto_rng 2 - 3 2 module Urandom = Urandom 4 - 5 3 module Getentropy = Getentropy 6 4 7 5 let use_dev_urandom () = ··· 13 11 set_default_generator g 14 12 15 13 let use_default () = use_getentropy () 16 - 17 14 let src = Logs.Src.create "crypto-rng.unix" ~doc:"Mirage crypto RNG Unix" 15 + 18 16 module Log = (val Logs.src_log src : Logs.LOG) 19 17 20 - external getrandom_buf : bytes -> int -> int -> unit = "mc_getrandom" [@@noalloc] 18 + external getrandom_buf : bytes -> int -> int -> unit = "mc_getrandom" 19 + [@@noalloc] 21 20 22 - let getrandom_into buf ~off ~len = 23 - getrandom_buf buf off len 21 + let getrandom_into buf ~off ~len = getrandom_buf buf off len 24 22 25 23 let getrandom size = 26 24 let buf = Bytes.create size in ··· 35 33 36 34 let initialize (type a) ?g (rng : a generator) = 37 35 if Atomic.get running then 38 - Log.debug 39 - (fun m -> m "Crypto_rng_unix.initialize has already been called, \ 40 - ignoring this call.") 36 + Log.debug (fun m -> 37 + m 38 + "Crypto_rng_unix.initialize has already been called, ignoring this \ 39 + call.") 41 40 else begin 42 41 (try 43 42 let _ = default_generator () in 44 - Log.warn (fun m -> m "Crypto_rng.default_generator has already \ 45 - been set, check that this call is intentional"); 46 - with 47 - No_default_generator -> ()); 48 - Atomic.set running true ; 43 + Log.warn (fun m -> 44 + m 45 + "Crypto_rng.default_generator has already been set, check that \ 46 + this call is intentional") 47 + with No_default_generator -> ()); 48 + Atomic.set running true; 49 49 let seed = 50 50 let init = 51 - Entropy.[ bootstrap ; whirlwind_bootstrap ; bootstrap ; getrandom_init ] 51 + Entropy.[ bootstrap; whirlwind_bootstrap; bootstrap; getrandom_init ] 52 52 in 53 53 List.mapi (fun i f -> f i) init |> String.concat "" 54 54 in
+17 -18
rng/unix/crypto_rng_unix.mli
··· 1 1 (** {b RNG} seeding on {b Unix}. 2 2 3 - This module initializes a Fortuna RNG with [getrandom()], and CPU RNG. 4 - On BSD systems (FreeBSD, OpenBSD, macOS) [getentropy ()] is used instead 5 - of [getrandom ()]. On Windows 10 or higher, [BCryptGenRandom()] is used 6 - with the default RNG. Windows 8 or lower are not supported by this library. 7 - *) 3 + This module initializes a Fortuna RNG with [getrandom()], and CPU RNG. On 4 + BSD systems (FreeBSD, OpenBSD, macOS) [getentropy ()] is used instead of 5 + [getrandom ()]. On Windows 10 or higher, [BCryptGenRandom()] is used with 6 + the default RNG. Windows 8 or lower are not supported by this library. *) 8 7 9 - (** [initialize ~g rng] will bring the RNG into a working state. *) 10 8 val initialize : ?g:'a -> 'a Crypto_rng.generator -> unit 11 9 [@@deprecated "Use 'Crypto_rng_unix.use_default ()' instead."] 10 + (** [initialize ~g rng] will bring the RNG into a working state. *) 12 11 12 + val getrandom : int -> string 13 13 (** [getrandom size] returns a buffer of [size] filled with random bytes. *) 14 - val getrandom : int -> string 15 14 16 - (** A generator that opens /dev/urandom and reads from that file descriptor 17 - data whenever random data is needed. The file descriptor is closed in 18 - [at_exit]. *) 19 15 module Urandom : Crypto_rng.Generator 16 + (** A generator that opens /dev/urandom and reads from that file descriptor data 17 + whenever random data is needed. The file descriptor is closed in [at_exit]. 18 + *) 20 19 20 + module Getentropy : Crypto_rng.Generator 21 21 (** A generator using [getrandom(3)] on Linux, [getentropy(3)] on BSD and macOS, 22 22 and [BCryptGenRandom()] on Windows. *) 23 - module Getentropy : Crypto_rng.Generator 24 23 25 - (** [use_default ()] initializes the RNG [Crypto_rng.default_generator] 26 - with a sensible default, at the moment using [Getentropy]. *) 27 24 val use_default : unit -> unit 25 + (** [use_default ()] initializes the RNG [Crypto_rng.default_generator] with a 26 + sensible default, at the moment using [Getentropy]. *) 28 27 29 - (** [use_dev_random ()] initializes the RNG 30 - [Crypto_rng.default_generator] with the [Urandom] generator. This 31 - raises an exception if "/dev/urandom" cannot be opened. *) 32 28 val use_dev_urandom : unit -> unit 29 + (** [use_dev_random ()] initializes the RNG [Crypto_rng.default_generator] with 30 + the [Urandom] generator. This raises an exception if "/dev/urandom" cannot 31 + be opened. *) 33 32 34 - (** [use_getentropy ()] initializes the RNG [Crypto_rng.default_generator] 35 - with the [Getentropy] generator. *) 36 33 val use_getentropy : unit -> unit 34 + (** [use_getentropy ()] initializes the RNG [Crypto_rng.default_generator] with 35 + the [Getentropy] generator. *)
+4 -7
rng/unix/discover.ml
··· 1 1 let () = 2 2 let open Configurator.V1 in 3 3 main ~name:"rng_flags" (fun _t -> 4 - let c_lib_flags = 5 - match Sys.os_type with 6 - | "Win32" | "Cygwin" -> ["-lbcrypt"] 7 - | _ -> [] 8 - in 9 - Flags.write_sexp "rng_c_flags.sexp" c_lib_flags 10 - ) 4 + let c_lib_flags = 5 + match Sys.os_type with "Win32" | "Cygwin" -> [ "-lbcrypt" ] | _ -> [] 6 + in 7 + Flags.write_sexp "rng_c_flags.sexp" c_lib_flags)
+4 -12
rng/unix/getentropy.ml
··· 1 - 2 - external getrandom_buf : bytes -> int -> int -> unit = "mc_getrandom" [@@noalloc] 1 + external getrandom_buf : bytes -> int -> int -> unit = "mc_getrandom" 2 + [@@noalloc] 3 3 4 4 type g = unit 5 5 ··· 9 9 The actual implementation may be one of `getrandom`, `getentropy`, or `BCryptGenRandom`, and will internally limit the maximum bytes read in one go and loop as needed if more bytes are requested and we get a short read. 10 10 *) 11 11 let block = 256 12 - 13 12 let create ?time:_ () = () 14 - 15 - let generate_into ~g:_ buf ~off len = 16 - getrandom_buf buf off len 17 - 13 + let generate_into ~g:_ buf ~off len = getrandom_buf buf off len 18 14 let reseed ~g:_ _data = () 19 - 20 - let accumulate ~g:_ _source = 21 - `Acc (fun _data -> ()) 22 - 15 + let accumulate ~g:_ _source = `Acc (fun _data -> ()) 23 16 let seeded ~g:_ = true 24 - 25 17 let pools = 0
+2 -9
rng/unix/urandom.ml
··· 1 - 2 1 type g = In_channel.t * Mutex.t 3 2 4 3 (* The OCaml runtime always reads at least IO_BUFFER_SIZE from an input channel, which is currently 64 KiB *) 5 4 let block = 65536 6 5 7 6 let create ?time:_ () = 8 - let ic = In_channel.open_bin "/dev/urandom" 9 - and mutex = Mutex.create () 10 - in 7 + let ic = In_channel.open_bin "/dev/urandom" and mutex = Mutex.create () in 11 8 at_exit (fun () -> In_channel.close ic); 12 9 (ic, mutex) 13 10 ··· 20 17 | Some () -> ()) 21 18 22 19 let reseed ~g:_ _data = () 23 - 24 - let accumulate ~g:_ _source = 25 - `Acc (fun _data -> ()) 26 - 20 + let accumulate ~g:_ _source = `Acc (fun _data -> ()) 27 21 let seeded ~g:_ = true 28 - 29 22 let pools = 0
+67 -20
src/aead.ml
··· 1 1 module type AEAD = sig 2 2 val tag_size : int 3 + 3 4 type key 5 + 4 6 val of_secret : string -> key 5 - val authenticate_encrypt : key:key -> nonce:string -> ?adata:string -> 6 - string -> string 7 - val authenticate_decrypt : key:key -> nonce:string -> ?adata:string -> 8 - string -> string option 9 - val authenticate_encrypt_tag : key:key -> nonce:string -> ?adata:string -> 10 - string -> string * string 11 - val authenticate_decrypt_tag : key:key -> nonce:string -> ?adata:string -> 12 - tag:string -> string -> string option 13 - val authenticate_encrypt_into : key:key -> nonce:string -> 14 - ?adata:string -> string -> src_off:int -> bytes -> dst_off:int -> 15 - tag_off:int -> int -> unit 16 - val authenticate_decrypt_into : key:key -> nonce:string -> 17 - ?adata:string -> string -> src_off:int -> tag_off:int -> bytes -> 18 - dst_off:int -> int -> bool 19 - val unsafe_authenticate_encrypt_into : key:key -> nonce:string -> 20 - ?adata:string -> string -> src_off:int -> bytes -> dst_off:int -> 21 - tag_off:int -> int -> unit 22 - val unsafe_authenticate_decrypt_into : key:key -> nonce:string -> 23 - ?adata:string -> string -> src_off:int -> tag_off:int -> bytes -> 24 - dst_off:int -> int -> bool 7 + 8 + val authenticate_encrypt : 9 + key:key -> nonce:string -> ?adata:string -> string -> string 10 + 11 + val authenticate_decrypt : 12 + key:key -> nonce:string -> ?adata:string -> string -> string option 13 + 14 + val authenticate_encrypt_tag : 15 + key:key -> nonce:string -> ?adata:string -> string -> string * string 16 + 17 + val authenticate_decrypt_tag : 18 + key:key -> 19 + nonce:string -> 20 + ?adata:string -> 21 + tag:string -> 22 + string -> 23 + string option 24 + 25 + val authenticate_encrypt_into : 26 + key:key -> 27 + nonce:string -> 28 + ?adata:string -> 29 + string -> 30 + src_off:int -> 31 + bytes -> 32 + dst_off:int -> 33 + tag_off:int -> 34 + int -> 35 + unit 36 + 37 + val authenticate_decrypt_into : 38 + key:key -> 39 + nonce:string -> 40 + ?adata:string -> 41 + string -> 42 + src_off:int -> 43 + tag_off:int -> 44 + bytes -> 45 + dst_off:int -> 46 + int -> 47 + bool 48 + 49 + val unsafe_authenticate_encrypt_into : 50 + key:key -> 51 + nonce:string -> 52 + ?adata:string -> 53 + string -> 54 + src_off:int -> 55 + bytes -> 56 + dst_off:int -> 57 + tag_off:int -> 58 + int -> 59 + unit 60 + 61 + val unsafe_authenticate_decrypt_into : 62 + key:key -> 63 + nonce:string -> 64 + ?adata:string -> 65 + string -> 66 + src_off:int -> 67 + tag_off:int -> 68 + bytes -> 69 + dst_off:int -> 70 + int -> 71 + bool 25 72 end
+64 -49
src/ccm.ml
··· 1 1 open Uncommon 2 2 3 3 let block_size = 16 4 - 5 - let flags bit6 len1 len2 = 6 - bit6 lsl 6 + len1 lsl 3 + len2 4 + let flags bit6 len1 len2 = (bit6 lsl 6) + (len1 lsl 3) + len2 7 5 8 6 let encode_len buf ~off size value = 9 7 let rec ass num = function 10 8 | 0 -> Bytes.set_uint8 buf off num 11 9 | m -> 12 - Bytes.set_uint8 buf (off + m) (num land 0xff); 13 - (ass [@tailcall]) (num lsr 8) (pred m) 10 + Bytes.set_uint8 buf (off + m) (num land 0xff); 11 + (ass [@tailcall]) (num lsr 8) (pred m) 14 12 in 15 13 ass value (pred size) 16 14 ··· 28 26 let gen_adata a = 29 27 let llen, set_llen = 30 28 match String.length a with 31 - | x when x < (1 lsl 16 - 1 lsl 8) -> 32 - 2, (fun buf off -> Bytes.set_uint16_be buf off x) 33 - | x when Sys.int_size < 32 || x < (1 lsl 32) -> 34 - 6, (fun buf off -> 35 - Bytes.set_uint16_be buf off 0xfffe; 36 - Bytes.set_int32_be buf (off + 2) (Int32.of_int x)) 29 + | x when x < (1 lsl 16) - (1 lsl 8) -> 30 + (2, fun buf off -> Bytes.set_uint16_be buf off x) 31 + | x when Sys.int_size < 32 || x < 1 lsl 32 -> 32 + ( 6, 33 + fun buf off -> 34 + Bytes.set_uint16_be buf off 0xfffe; 35 + Bytes.set_int32_be buf (off + 2) (Int32.of_int x) ) 37 36 | x -> 38 - 10, (fun buf off -> 39 - Bytes.set_uint16_be buf off 0xffff; 40 - Bytes.set_int64_be buf (off + 2) (Int64.of_int x)) 37 + ( 10, 38 + fun buf off -> 39 + Bytes.set_uint16_be buf off 0xffff; 40 + Bytes.set_int64_be buf (off + 2) (Int64.of_int x) ) 41 41 in 42 42 let to_pad = 43 43 let leftover = (llen + String.length a) mod block_size in 44 44 block_size - leftover 45 45 in 46 - llen + String.length a + to_pad, 47 - fun buf off -> 48 - set_llen buf off; 49 - Bytes.unsafe_blit_string a 0 buf (off + llen) (String.length a); 50 - Bytes.unsafe_fill buf (off + llen + String.length a) to_pad '\000' 46 + ( llen + String.length a + to_pad, 47 + fun buf off -> 48 + set_llen buf off; 49 + Bytes.unsafe_blit_string a 0 buf (off + llen) (String.length a); 50 + Bytes.unsafe_fill buf (off + llen + String.length a) to_pad '\000' ) 51 51 52 52 let gen_ctr nonce i = 53 53 let n = String.length nonce in ··· 61 61 let small_q = 15 - String.length nonce in 62 62 let b6 = if String.length adata = 0 then 0 else 1 in 63 63 let flag_val = flags b6 ((tlen - 2) / 2) (small_q - 1) in 64 - if String.length adata = 0 then 64 + if String.length adata = 0 then ( 65 65 let hdr = Bytes.create 16 in 66 66 set_format hdr nonce flag_val plen; 67 - hdr 67 + hdr) 68 68 else 69 69 let len, set = gen_adata adata in 70 70 let buf = Bytes.create (16 + len) in ··· 74 74 75 75 type mode = Encrypt | Decrypt 76 76 77 - let crypto_core_into ~cipher ~mode ~key ~nonce ~adata src ~src_off dst ~dst_off len = 77 + let crypto_core_into ~cipher ~mode ~key ~nonce ~adata src ~src_off dst ~dst_off 78 + len = 78 79 let cbcheader = prepare_header nonce adata len block_size in 79 80 80 81 let small_q = 15 - String.length nonce in ··· 87 88 in 88 89 89 90 let cbc iv src_off block dst_off = 90 - unsafe_xor_into iv ~src_off block ~dst_off block_size ; 91 + unsafe_xor_into iv ~src_off block ~dst_off block_size; 91 92 cipher ~key (Bytes.unsafe_to_string block) ~src_off:dst_off block ~dst_off 92 93 in 93 94 ··· 96 97 match Bytes.length block - block_off with 97 98 | 0 -> Bytes.sub iv iv_off block_size 98 99 | _ -> 99 - cbc (Bytes.unsafe_to_string iv) iv_off block block_off; 100 - (doit [@tailcall]) block block_off block (block_off + block_size) 100 + cbc (Bytes.unsafe_to_string iv) iv_off block block_off; 101 + (doit [@tailcall]) block block_off block (block_off + block_size) 101 102 in 102 103 doit (Bytes.make block_size '\x00') 0 cbcheader 0 103 104 in ··· 105 106 let rec loop ctr src src_off dst dst_off len = 106 107 let cbcblock, cbc_off = 107 108 match mode with 108 - | Encrypt -> src, src_off 109 - | Decrypt -> Bytes.unsafe_to_string dst, dst_off 109 + | Encrypt -> (src, src_off) 110 + | Decrypt -> (Bytes.unsafe_to_string dst, dst_off) 110 111 in 111 - if len = 0 then 112 - () 112 + if len = 0 then () 113 113 else if len < block_size then begin 114 114 let buf = Bytes.make block_size '\x00' in 115 - Bytes.unsafe_blit dst dst_off buf 0 len ; 116 - ctrblock ctr buf 0 ; 117 - Bytes.unsafe_blit buf 0 dst dst_off len ; 118 - unsafe_xor_into src ~src_off dst ~dst_off len ; 119 - Bytes.unsafe_blit_string cbcblock cbc_off buf 0 len ; 115 + Bytes.unsafe_blit dst dst_off buf 0 len; 116 + ctrblock ctr buf 0; 117 + Bytes.unsafe_blit buf 0 dst dst_off len; 118 + unsafe_xor_into src ~src_off dst ~dst_off len; 119 + Bytes.unsafe_blit_string cbcblock cbc_off buf 0 len; 120 120 Bytes.unsafe_fill buf len (block_size - len) '\x00'; 121 121 cbc (Bytes.unsafe_to_string buf) 0 iv 0 122 - end else begin 123 - ctrblock ctr dst dst_off ; 124 - unsafe_xor_into src ~src_off dst ~dst_off block_size ; 125 - cbc cbcblock cbc_off iv 0 ; 126 - (loop [@tailcall]) (succ ctr) src (src_off + block_size) dst (dst_off + block_size) (len - block_size) 122 + end 123 + else begin 124 + ctrblock ctr dst dst_off; 125 + unsafe_xor_into src ~src_off dst ~dst_off block_size; 126 + cbc cbcblock cbc_off iv 0; 127 + (loop [@tailcall]) (succ ctr) src (src_off + block_size) dst 128 + (dst_off + block_size) (len - block_size) 127 129 end 128 130 in 129 131 loop 1 src src_off dst dst_off len; ··· 132 134 let crypto_core ~cipher ~mode ~key ~nonce ~adata data = 133 135 let datalen = String.length data in 134 136 let dst = Bytes.create datalen in 135 - let t = crypto_core_into ~cipher ~mode ~key ~nonce ~adata data ~src_off:0 dst ~dst_off:0 datalen in 136 - dst, t 137 + let t = 138 + crypto_core_into ~cipher ~mode ~key ~nonce ~adata data ~src_off:0 dst 139 + ~dst_off:0 datalen 140 + in 141 + (dst, t) 137 142 138 143 let crypto_t t nonce cipher key = 139 144 let ctr = gen_ctr nonce 0 in 140 - cipher ~key (Bytes.unsafe_to_string ctr) ~src_off:0 ctr ~dst_off:0 ; 141 - unsafe_xor_into (Bytes.unsafe_to_string ctr) ~src_off:0 t ~dst_off:0 (Bytes.length t) 145 + cipher ~key (Bytes.unsafe_to_string ctr) ~src_off:0 ctr ~dst_off:0; 146 + unsafe_xor_into 147 + (Bytes.unsafe_to_string ctr) 148 + ~src_off:0 t ~dst_off:0 (Bytes.length t) 142 149 143 - let unsafe_generation_encryption_into ~cipher ~key ~nonce ~adata src ~src_off dst ~dst_off ~tag_off len = 144 - let t = crypto_core_into ~cipher ~mode:Encrypt ~key ~nonce ~adata src ~src_off dst ~dst_off len in 145 - crypto_t t nonce cipher key ; 150 + let unsafe_generation_encryption_into ~cipher ~key ~nonce ~adata src ~src_off 151 + dst ~dst_off ~tag_off len = 152 + let t = 153 + crypto_core_into ~cipher ~mode:Encrypt ~key ~nonce ~adata src ~src_off dst 154 + ~dst_off len 155 + in 156 + crypto_t t nonce cipher key; 146 157 Bytes.unsafe_blit t 0 dst tag_off block_size 147 158 148 - let unsafe_decryption_verification_into ~cipher ~key ~nonce ~adata src ~src_off ~tag_off dst ~dst_off len = 159 + let unsafe_decryption_verification_into ~cipher ~key ~nonce ~adata src ~src_off 160 + ~tag_off dst ~dst_off len = 149 161 let tag = String.sub src tag_off block_size in 150 - let t = crypto_core_into ~cipher ~mode:Decrypt ~key ~nonce ~adata src ~src_off dst ~dst_off len in 151 - crypto_t t nonce cipher key ; 162 + let t = 163 + crypto_core_into ~cipher ~mode:Decrypt ~key ~nonce ~adata src ~src_off dst 164 + ~dst_off len 165 + in 166 + crypto_t t nonce cipher key; 152 167 Eqaf.equal tag (Bytes.unsafe_to_string t)
+67 -52
src/chacha20.ml
··· 14 14 let init ctr ~key ~nonce = 15 15 let ctr_off = 48 in 16 16 let set_ctr32 b v = Bytes.set_int32_le b ctr_off v 17 - and set_ctr64 b v = Bytes.set_int64_le b ctr_off v 18 - in 17 + and set_ctr64 b v = Bytes.set_int64_le b ctr_off v in 19 18 let inc32 b = set_ctr32 b (Int32.add (Bytes.get_int32_le b ctr_off) 1l) 20 - and inc64 b = set_ctr64 b (Int64.add (Bytes.get_int64_le b ctr_off) 1L) 21 - in 19 + and inc64 b = set_ctr64 b (Int64.add (Bytes.get_int64_le b ctr_off) 1L) in 22 20 let s, key, init_ctr, nonce_off, inc = 23 - match String.length key, String.length nonce, Int64.shift_right ctr 32 = 0L with 21 + match 22 + (String.length key, String.length nonce, Int64.shift_right ctr 32 = 0L) 23 + with 24 24 | 32, 12, true -> 25 - let ctr = Int64.to_int32 ctr in 26 - "expand 32-byte k", key, (fun b -> set_ctr32 b ctr), 52, inc32 25 + let ctr = Int64.to_int32 ctr in 26 + ("expand 32-byte k", key, (fun b -> set_ctr32 b ctr), 52, inc32) 27 27 | 32, 12, false -> 28 - invalid_arg "Counter too big for IETF mode (32 bit counter)" 28 + invalid_arg "Counter too big for IETF mode (32 bit counter)" 29 29 | 32, 8, _ -> 30 - "expand 32-byte k", key, (fun b -> set_ctr64 b ctr), 56, inc64 30 + ("expand 32-byte k", key, (fun b -> set_ctr64 b ctr), 56, inc64) 31 31 | 16, 8, _ -> 32 - let k = key ^ key in 33 - "expand 16-byte k", k, (fun b -> set_ctr64 b ctr), 56, inc64 34 - | _ -> invalid_arg "Valid parameters are nonce 12 bytes and key 32 bytes \ 35 - (counter 32 bit), or nonce 8 byte and key 16 or 32 \ 36 - bytes (counter 64 bit)." 32 + let k = key ^ key in 33 + ("expand 16-byte k", k, (fun b -> set_ctr64 b ctr), 56, inc64) 34 + | _ -> 35 + invalid_arg 36 + "Valid parameters are nonce 12 bytes and key 32 bytes (counter 32 \ 37 + bit), or nonce 8 byte and key 16 or 32 bytes (counter 64 bit)." 37 38 in 38 39 let state = Bytes.create block in 39 - Bytes.unsafe_blit_string s 0 state 0 16 ; 40 - Bytes.unsafe_blit_string key 0 state 16 32 ; 41 - init_ctr state ; 42 - Bytes.unsafe_blit_string nonce 0 state nonce_off (String.length nonce) ; 43 - state, inc 40 + Bytes.unsafe_blit_string s 0 state 0 16; 41 + Bytes.unsafe_blit_string key 0 state 16 32; 42 + init_ctr state; 43 + Bytes.unsafe_blit_string nonce 0 state nonce_off (String.length nonce); 44 + (state, inc) 44 45 45 46 let crypt_into ~key ~nonce ~ctr src ~src_off dst ~dst_off len = 46 47 let state, inc = init ctr ~key ~nonce in ··· 52 53 let rec loop i = function 53 54 | 0 -> () 54 55 | 1 -> 55 - if last_len = block then begin 56 - chacha20_block state (dst_off + i) dst ; 57 - Native.xor_into_bytes src (src_off + i) dst (dst_off + i) block 58 - end else begin 59 - let buf = Bytes.create block in 60 - chacha20_block state 0 buf ; 61 - Native.xor_into_bytes src (src_off + i) buf 0 last_len ; 62 - Bytes.unsafe_blit buf 0 dst (dst_off + i) last_len 63 - end 56 + if last_len = block then begin 57 + chacha20_block state (dst_off + i) dst; 58 + Native.xor_into_bytes src (src_off + i) dst (dst_off + i) block 59 + end 60 + else begin 61 + let buf = Bytes.create block in 62 + chacha20_block state 0 buf; 63 + Native.xor_into_bytes src (src_off + i) buf 0 last_len; 64 + Bytes.unsafe_blit buf 0 dst (dst_off + i) last_len 65 + end 64 66 | n -> 65 - chacha20_block state (dst_off + i) dst ; 66 - Native.xor_into_bytes src (src_off + i) dst (dst_off + i) block ; 67 - inc state; 68 - (loop [@tailcall]) (i + block) (n - 1) 67 + chacha20_block state (dst_off + i) dst; 68 + Native.xor_into_bytes src (src_off + i) dst (dst_off + i) block; 69 + inc state; 70 + (loop [@tailcall]) (i + block) (n - 1) 69 71 in 70 72 loop 0 block_count 71 73 ··· 93 95 Bytes.unsafe_to_string data 94 96 in 95 97 let p1 = pad16 (String.length adata) and p2 = pad16 len in 96 - P.unsafe_mac_into ~key [ adata, 0, String.length adata ; 97 - p1, 0, String.length p1 ; 98 - src, src_off, len ; 99 - p2, 0, String.length p2 ; 100 - len_buf, 0, String.length len_buf ] 98 + P.unsafe_mac_into ~key 99 + [ 100 + (adata, 0, String.length adata); 101 + (p1, 0, String.length p1); 102 + (src, src_off, len); 103 + (p2, 0, String.length p2); 104 + (len_buf, 0, String.length len_buf); 105 + ] 101 106 dst ~dst_off 102 107 103 - let unsafe_authenticate_encrypt_into ~key ~nonce ?(adata = "") src ~src_off dst ~dst_off ~tag_off len = 108 + let unsafe_authenticate_encrypt_into ~key ~nonce ?(adata = "") src ~src_off dst 109 + ~dst_off ~tag_off len = 104 110 let poly1305_key = generate_poly1305_key ~key ~nonce in 105 111 crypt_into ~key ~nonce ~ctr:1L src ~src_off dst ~dst_off len; 106 - mac_into ~key:poly1305_key ~adata (Bytes.unsafe_to_string dst) ~src_off:dst_off len dst ~dst_off:tag_off 112 + mac_into ~key:poly1305_key ~adata 113 + (Bytes.unsafe_to_string dst) 114 + ~src_off:dst_off len dst ~dst_off:tag_off 107 115 108 - let authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off ~tag_off len = 116 + let authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off 117 + ~tag_off len = 109 118 if String.length src - src_off < len then 110 119 invalid_arg "Chacha20: src length %u - src_off %u < len %u" 111 120 (String.length src) src_off len; ··· 115 124 if Bytes.length dst - tag_off < tag_size then 116 125 invalid_arg "Chacha20: dst length %u - tag_off %u < tag_size %u" 117 126 (Bytes.length dst) tag_off tag_size; 118 - unsafe_authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off ~tag_off len 127 + unsafe_authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off 128 + ~tag_off len 119 129 120 130 let authenticate_encrypt ~key ~nonce ?adata data = 121 131 let l = String.length data in 122 132 let dst = Bytes.create (l + tag_size) in 123 - unsafe_authenticate_encrypt_into ~key ~nonce ?adata data ~src_off:0 dst ~dst_off:0 ~tag_off:l l; 133 + unsafe_authenticate_encrypt_into ~key ~nonce ?adata data ~src_off:0 dst 134 + ~dst_off:0 ~tag_off:l l; 124 135 Bytes.unsafe_to_string dst 125 136 126 137 let authenticate_encrypt_tag ~key ~nonce ?adata data = 127 138 let r = authenticate_encrypt ~key ~nonce ?adata data in 128 - String.sub r 0 (String.length data), String.sub r (String.length data) tag_size 139 + ( String.sub r 0 (String.length data), 140 + String.sub r (String.length data) tag_size ) 129 141 130 - let unsafe_authenticate_decrypt_into ~key ~nonce ?(adata = "") src ~src_off ~tag_off dst ~dst_off len = 142 + let unsafe_authenticate_decrypt_into ~key ~nonce ?(adata = "") src ~src_off 143 + ~tag_off dst ~dst_off len = 131 144 let poly1305_key = generate_poly1305_key ~key ~nonce in 132 145 let ctag = Bytes.create tag_size in 133 146 mac_into ~key:poly1305_key ~adata src ~src_off len ctag ~dst_off:0; 134 147 crypt_into ~key ~nonce ~ctr:1L src ~src_off dst ~dst_off len; 135 148 Eqaf.equal (String.sub src tag_off tag_size) (Bytes.unsafe_to_string ctag) 136 149 137 - let authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst ~dst_off len = 150 + let authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst 151 + ~dst_off len = 138 152 if String.length src - src_off < len then 139 153 invalid_arg "Chacha20: src length %u - src_off %u < len %u" 140 154 (String.length src) src_off len; ··· 144 158 if String.length src - tag_off < tag_size then 145 159 invalid_arg "Chacha20: src length %u - tag_off %u < tag_size %u" 146 160 (String.length src) tag_off tag_size; 147 - unsafe_authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst ~dst_off len 161 + unsafe_authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst 162 + ~dst_off len 148 163 149 164 let authenticate_decrypt ~key ~nonce ?adata data = 150 - if String.length data < tag_size then 151 - None 165 + if String.length data < tag_size then None 152 166 else 153 167 let l = String.length data - tag_size in 154 168 let r = Bytes.create l in 155 - if unsafe_authenticate_decrypt_into ~key ~nonce ?adata data ~src_off:0 ~tag_off:l r ~dst_off:0 l then 156 - Some (Bytes.unsafe_to_string r) 157 - else 158 - None 169 + if 170 + unsafe_authenticate_decrypt_into ~key ~nonce ?adata data ~src_off:0 171 + ~tag_off:l r ~dst_off:0 l 172 + then Some (Bytes.unsafe_to_string r) 173 + else None 159 174 160 175 let authenticate_decrypt_tag ~key ~nonce ?adata ~tag data = 161 176 let cdata = data ^ tag in
+265 -162
src/cipher_block.ml
··· 1 1 open Uncommon 2 2 3 3 module Block = struct 4 - 5 4 module type Core = sig 6 - 7 5 type ekey 8 6 type dkey 9 7 10 - val of_secret : string -> ekey * dkey 8 + val of_secret : string -> ekey * dkey 11 9 val e_of_secret : string -> ekey 12 10 val d_of_secret : string -> dkey 13 - 14 - val key : int array 11 + val key : int array 15 12 val block : int 16 13 17 14 (* XXX currently unsafe point *) 18 - val encrypt : key:ekey -> blocks:int -> string -> int -> bytes -> int -> unit 19 - val decrypt : key:dkey -> blocks:int -> string -> int -> bytes -> int -> unit 15 + val encrypt : 16 + key:ekey -> blocks:int -> string -> int -> bytes -> int -> unit 17 + 18 + val decrypt : 19 + key:dkey -> blocks:int -> string -> int -> bytes -> int -> unit 20 20 end 21 21 22 22 module type ECB = sig 23 - 24 23 type key 25 - val of_secret : string -> key 26 24 27 - val key_sizes : int array 25 + val of_secret : string -> key 26 + val key_sizes : int array 28 27 val block_size : int 29 28 val encrypt : key:key -> string -> string 30 29 val decrypt : key:key -> string -> string 31 - val encrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 32 - val decrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 33 - val unsafe_encrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 34 - val unsafe_decrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 30 + 31 + val encrypt_into : 32 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 33 + 34 + val decrypt_into : 35 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 36 + 37 + val unsafe_encrypt_into : 38 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 39 + 40 + val unsafe_decrypt_into : 41 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 35 42 end 36 43 37 44 module type CBC = sig 38 - 39 45 type key 46 + 40 47 val of_secret : string -> key 41 - 42 - val key_sizes : int array 48 + val key_sizes : int array 43 49 val block_size : int 44 - 45 50 val encrypt : key:key -> iv:string -> string -> string 46 51 val decrypt : key:key -> iv:string -> string -> string 47 52 val next_iv : ?off:int -> string -> iv:string -> string 48 53 49 - val encrypt_into : key:key -> iv:string -> string -> src_off:int -> 50 - bytes -> dst_off:int -> int -> unit 51 - val decrypt_into : key:key -> iv:string -> string -> src_off:int -> 52 - bytes -> dst_off:int -> int -> unit 54 + val encrypt_into : 55 + key:key -> 56 + iv:string -> 57 + string -> 58 + src_off:int -> 59 + bytes -> 60 + dst_off:int -> 61 + int -> 62 + unit 63 + 64 + val decrypt_into : 65 + key:key -> 66 + iv:string -> 67 + string -> 68 + src_off:int -> 69 + bytes -> 70 + dst_off:int -> 71 + int -> 72 + unit 73 + 74 + val unsafe_encrypt_into : 75 + key:key -> 76 + iv:string -> 77 + string -> 78 + src_off:int -> 79 + bytes -> 80 + dst_off:int -> 81 + int -> 82 + unit 83 + 84 + val unsafe_decrypt_into : 85 + key:key -> 86 + iv:string -> 87 + string -> 88 + src_off:int -> 89 + bytes -> 90 + dst_off:int -> 91 + int -> 92 + unit 53 93 54 - val unsafe_encrypt_into : key:key -> iv:string -> string -> src_off:int -> 55 - bytes -> dst_off:int -> int -> unit 56 - val unsafe_decrypt_into : key:key -> iv:string -> string -> src_off:int -> 57 - bytes -> dst_off:int -> int -> unit 58 - val unsafe_encrypt_into_inplace : key:key -> iv:string -> 59 - bytes -> dst_off:int -> int -> unit 94 + val unsafe_encrypt_into_inplace : 95 + key:key -> iv:string -> bytes -> dst_off:int -> int -> unit 60 96 end 61 97 62 98 module type CTR = sig 63 - 64 99 type key 65 - val of_secret : string -> key 66 100 67 - val key_sizes : int array 101 + val of_secret : string -> key 102 + val key_sizes : int array 68 103 val block_size : int 69 104 70 105 type ctr 71 - val add_ctr : ctr -> int64 -> ctr 72 - val next_ctr : ?off:int -> string -> ctr:ctr -> ctr 73 - val ctr_of_octets : string -> ctr 74 106 75 - val stream : key:key -> ctr:ctr -> int -> string 107 + val add_ctr : ctr -> int64 -> ctr 108 + val next_ctr : ?off:int -> string -> ctr:ctr -> ctr 109 + val ctr_of_octets : string -> ctr 110 + val stream : key:key -> ctr:ctr -> int -> string 76 111 val encrypt : key:key -> ctr:ctr -> string -> string 77 112 val decrypt : key:key -> ctr:ctr -> string -> string 113 + val stream_into : key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 78 114 79 - val stream_into : key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 80 - val encrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 81 - bytes -> dst_off:int -> int -> unit 82 - val decrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 83 - bytes -> dst_off:int -> int -> unit 115 + val encrypt_into : 116 + key:key -> 117 + ctr:ctr -> 118 + string -> 119 + src_off:int -> 120 + bytes -> 121 + dst_off:int -> 122 + int -> 123 + unit 84 124 85 - val unsafe_stream_into : key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 86 - val unsafe_encrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 87 - bytes -> dst_off:int -> int -> unit 88 - val unsafe_decrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 89 - bytes -> dst_off:int -> int -> unit 125 + val decrypt_into : 126 + key:key -> 127 + ctr:ctr -> 128 + string -> 129 + src_off:int -> 130 + bytes -> 131 + dst_off:int -> 132 + int -> 133 + unit 134 + 135 + val unsafe_stream_into : 136 + key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 137 + 138 + val unsafe_encrypt_into : 139 + key:key -> 140 + ctr:ctr -> 141 + string -> 142 + src_off:int -> 143 + bytes -> 144 + dst_off:int -> 145 + int -> 146 + unit 147 + 148 + val unsafe_decrypt_into : 149 + key:key -> 150 + ctr:ctr -> 151 + string -> 152 + src_off:int -> 153 + bytes -> 154 + dst_off:int -> 155 + int -> 156 + unit 90 157 end 91 158 92 159 module type GCM = sig 93 160 include Aead.AEAD 94 161 95 - val key_sizes : int array 162 + val key_sizes : int array 96 163 val block_size : int 97 164 end 98 165 99 166 module type CCM16 = sig 100 167 include Aead.AEAD 101 168 102 - val key_sizes : int array 169 + val key_sizes : int array 103 170 val block_size : int 104 171 end 105 172 end ··· 107 174 module Counters = struct 108 175 module type S = sig 109 176 type ctr 177 + 110 178 val size : int 111 - val add : ctr -> int64 -> ctr 179 + val add : ctr -> int64 -> ctr 112 180 val of_octets : string -> ctr 113 181 val unsafe_count_into : ctr -> bytes -> off:int -> blocks:int -> unit 114 182 end 115 183 116 184 module C64be = struct 117 185 type ctr = int64 186 + 118 187 let size = 8 119 188 let of_octets cs = String.get_int64_be cs 0 120 189 let add = Int64.add 190 + 121 191 let unsafe_count_into t buf ~off ~blocks = 122 192 let ctr = Bytes.create 8 in 123 193 Bytes.set_int64_be ctr 0 t; ··· 126 196 127 197 module C128be = struct 128 198 type ctr = int64 * int64 199 + 129 200 let size = 16 201 + 130 202 let of_octets cs = 131 203 let buf = Bytes.unsafe_of_string cs in 132 204 Bytes.(get_int64_be buf 0, get_int64_be buf 8) 205 + 133 206 let add (w1, w0) n = 134 - let w0' = Int64.add w0 n in 207 + let w0' = Int64.add w0 n in 135 208 let flip = if Int64.logxor w0 w0' < 0L then w0' > w0 else w0' < w0 in 136 209 ((if flip then Int64.succ w1 else w1), w0') 210 + 137 211 let unsafe_count_into (w1, w0) buf ~off ~blocks = 138 212 let ctr = Bytes.create 16 in 139 - Bytes.set_int64_be ctr 0 w1; Bytes.set_int64_be ctr 8 w0; 213 + Bytes.set_int64_be ctr 0 w1; 214 + Bytes.set_int64_be ctr 8 w0; 140 215 Native.count16be ~ctr buf ~off ~blocks 141 216 end 142 217 143 218 module C128be32 = struct 144 219 include C128be 220 + 145 221 let add (w1, w0) n = 146 222 let hi = 0xffffffff00000000L and lo = 0x00000000ffffffffL in 147 223 (w1, Int64.(logor (logand hi w0) (add n w0 |> logand lo))) 224 + 148 225 let unsafe_count_into (w1, w0) buf ~off ~blocks = 149 226 let ctr = Bytes.create 16 in 150 - Bytes.set_int64_be ctr 0 w1; Bytes.set_int64_be ctr 8 w0; 227 + Bytes.set_int64_be ctr 0 w1; 228 + Bytes.set_int64_be ctr 8 w0; 151 229 Native.count16be4 ~ctr buf ~off ~blocks 152 230 end 153 231 end 154 232 155 233 let check_offset ~tag ~buf ~off ~len actual_len = 156 - if off < 0 then 157 - invalid_arg "%s: %s off %u < 0" 158 - tag buf off; 234 + if off < 0 then invalid_arg "%s: %s off %u < 0" tag buf off; 159 235 if actual_len - off < len then 160 - invalid_arg "%s: %s length %u - off %u < len %u" 161 - tag buf actual_len off len 236 + invalid_arg "%s: %s length %u - off %u < len %u" tag buf actual_len off len 162 237 [@@inline] 163 238 164 239 module Modes = struct 165 240 module ECB_of (Core : Block.Core) : Block.ECB = struct 166 - 167 241 type key = Core.ekey * Core.dkey 168 242 169 - let (key_sizes, block_size) = Core.(key, block) 170 - 243 + let key_sizes, block_size = Core.(key, block) 171 244 let of_secret = Core.of_secret 172 245 173 246 let unsafe_ecb xform key src src_off dst dst_off len = ··· 206 279 end 207 280 208 281 module CBC_of (Core : Block.Core) : Block.CBC = struct 209 - 210 282 type key = Core.ekey * Core.dkey 211 283 212 - let (key_sizes, block_size) = Core.(key, block) 284 + let key_sizes, block_size = Core.(key, block) 213 285 let block = block_size 214 - 215 286 let of_secret = Core.of_secret 216 287 217 288 let check_block_size ~iv len = 218 289 if String.length iv <> block then 219 290 invalid_arg "CBC: IV length %u not of block size" (String.length iv); 220 291 if len mod block <> 0 then 221 - invalid_arg "CBC: argument length %u not of block size" 222 - len 292 + invalid_arg "CBC: argument length %u not of block size" len 223 293 [@@inline] 224 294 225 295 let next_iv ?(off = 0) cs ~iv = 226 - check_block_size ~iv (String.length cs - off) ; 296 + check_block_size ~iv (String.length cs - off); 227 297 if String.length cs > off then 228 298 String.sub cs (String.length cs - block_size) block_size 229 299 else iv ··· 232 302 let rec loop iv iv_i dst_i = function 233 303 | 0 -> () 234 304 | b -> 235 - Native.xor_into_bytes iv iv_i dst dst_i block ; 236 - Core.encrypt ~key ~blocks:1 (Bytes.unsafe_to_string dst) dst_i dst dst_i ; 237 - (loop [@tailcall]) (Bytes.unsafe_to_string dst) dst_i (dst_i + block) (b - 1) 305 + Native.xor_into_bytes iv iv_i dst dst_i block; 306 + Core.encrypt ~key ~blocks:1 307 + (Bytes.unsafe_to_string dst) 308 + dst_i dst dst_i; 309 + (loop [@tailcall]) 310 + (Bytes.unsafe_to_string dst) 311 + dst_i (dst_i + block) (b - 1) 238 312 in 239 313 loop iv 0 dst_off (len / block) 240 314 ··· 256 330 let unsafe_decrypt_into ~key:(_, key) ~iv src ~src_off dst ~dst_off len = 257 331 let b = len / block in 258 332 if b > 0 then begin 259 - Core.decrypt ~key ~blocks:b src src_off dst dst_off ; 260 - Native.xor_into_bytes iv 0 dst dst_off block ; 261 - Native.xor_into_bytes src src_off dst (dst_off + block) ((b - 1) * block) ; 333 + Core.decrypt ~key ~blocks:b src src_off dst dst_off; 334 + Native.xor_into_bytes iv 0 dst dst_off block; 335 + Native.xor_into_bytes src src_off dst (dst_off + block) ((b - 1) * block) 262 336 end 263 337 264 338 let decrypt_into ~key ~iv src ~src_off dst ~dst_off len = ··· 275 349 end 276 350 277 351 module CTR_of (Core : Block.Core) (Ctr : Counters.S) : 278 - Block.CTR with type key = Core.ekey and type ctr = Ctr.ctr = 279 - struct 352 + Block.CTR with type key = Core.ekey and type ctr = Ctr.ctr = struct 280 353 (* FIXME: CTR has more room for speedups. Like stitching. *) 281 354 282 - assert (Core.block = Ctr.size) 355 + assert (Core.block = Ctr.size);; 356 + 283 357 type key = Core.ekey 284 358 type ctr = Ctr.ctr 285 359 286 - let (key_sizes, block_size) = Core.(key, block) 360 + let key_sizes, block_size = Core.(key, block) 287 361 let of_secret = Core.e_of_secret 288 362 289 363 let unsafe_stream_into ~key ~ctr buf ~off len = 290 364 let blocks = imax 0 len / block_size in 291 - Ctr.unsafe_count_into ctr buf ~off ~blocks ; 292 - Core.encrypt ~key ~blocks (Bytes.unsafe_to_string buf) off buf off ; 365 + Ctr.unsafe_count_into ctr buf ~off ~blocks; 366 + Core.encrypt ~key ~blocks (Bytes.unsafe_to_string buf) off buf off; 293 367 let slack = imax 0 len mod block_size in 294 368 if slack <> 0 then begin 295 369 let buf' = Bytes.create block_size in 296 370 let ctr = Ctr.add ctr (Int64.of_int blocks) in 297 - Ctr.unsafe_count_into ctr buf' ~off:0 ~blocks:1 ; 298 - Core.encrypt ~key ~blocks:1 (Bytes.unsafe_to_string buf') 0 buf' 0 ; 299 - Bytes.unsafe_blit buf' 0 buf (off + blocks * block_size) slack 371 + Ctr.unsafe_count_into ctr buf' ~off:0 ~blocks:1; 372 + Core.encrypt ~key ~blocks:1 (Bytes.unsafe_to_string buf') 0 buf' 0; 373 + Bytes.unsafe_blit buf' 0 buf (off + (blocks * block_size)) slack 300 374 end 301 375 302 376 let stream_into ~key ~ctr buf ~off len = ··· 324 398 Bytes.unsafe_to_string dst 325 399 326 400 let decrypt = encrypt 327 - 328 401 let decrypt_into = encrypt_into 329 - 330 402 let unsafe_decrypt_into = unsafe_encrypt_into 331 - 332 403 let add_ctr = Ctr.add 404 + 333 405 let next_ctr ?(off = 0) msg ~ctr = 334 - add_ctr ctr (Int64.of_int @@ (String.length msg - off) // block_size) 406 + add_ctr ctr (Int64.of_int @@ ((String.length msg - off) // block_size)) 407 + 335 408 let ctr_of_octets = Ctr.of_octets 336 409 end 337 410 338 411 module GHASH : sig 339 412 type key 340 - val derive : string -> key 341 - val digesti : key:key -> (string Uncommon.iter) -> string 342 - val digesti_off_len : key:key -> (string * int * int) Uncommon.iter -> string 413 + 414 + val derive : string -> key 415 + val digesti : key:key -> string Uncommon.iter -> string 416 + 417 + val digesti_off_len : 418 + key:key -> (string * int * int) Uncommon.iter -> string 419 + 343 420 val tagsize : int 344 421 end = struct 345 422 type key = string 423 + 346 424 let keysize = Native.GHASH.keysize () 347 425 let tagsize = 16 426 + 348 427 let derive cs = 349 428 assert (String.length cs >= tagsize); 350 429 let k = Bytes.create keysize in 351 430 Native.GHASH.keyinit cs k; 352 431 Bytes.unsafe_to_string k 432 + 353 433 let digesti_off_len ~key i = 354 434 let res = Bytes.make tagsize '\x00' in 355 435 i (fun (cs, off, len) -> Native.GHASH.ghash key res cs off len); 356 436 Bytes.unsafe_to_string res 437 + 357 438 let digesti ~key i = 358 439 let res = Bytes.make tagsize '\x00' in 359 440 i (fun cs -> Native.GHASH.ghash key res cs 0 (String.length cs)); 360 441 Bytes.unsafe_to_string res 361 - 362 442 end 363 443 364 444 module GCM_of (C : Block.Core) : Block.GCM = struct 445 + assert (C.block = 16);; 365 446 366 - assert (C.block = 16) 367 447 module CTR = CTR_of (C) (Counters.C128be32) 368 448 369 - type key = { key : C.ekey ; hkey : GHASH.key } 449 + type key = { key : C.ekey; hkey : GHASH.key } 370 450 371 451 let tag_size = GHASH.tagsize 372 452 let key_sizes, block_size = C.(key, block) ··· 376 456 let h = Bytes.create block_size in 377 457 let key = C.e_of_secret cs in 378 458 C.encrypt ~key ~blocks:1 z128 0 h 0; 379 - { key ; hkey = GHASH.derive (Bytes.unsafe_to_string h) } 459 + { key; hkey = GHASH.derive (Bytes.unsafe_to_string h) } 380 460 381 461 let bits64 cs = Int64.of_int (String.length cs * 8) 382 462 ··· 386 466 Bytes.set_int64_be cs 8 b; 387 467 Bytes.unsafe_to_string cs 388 468 389 - let counter ~hkey nonce = match String.length nonce with 469 + let counter ~hkey nonce = 470 + match String.length nonce with 390 471 | 0 -> invalid_arg "GCM: invalid nonce of length 0" 391 472 | 12 -> 392 - let (w1, w2) = String.get_int64_be nonce 0, String.get_int32_be nonce 8 in 393 - (w1, Int64.(shift_left (of_int32 w2) 32 |> add 1L)) 394 - | _ -> 395 - CTR.ctr_of_octets @@ 396 - GHASH.digesti ~key:hkey @@ iter2 nonce (pack64s 0L (bits64 nonce)) 473 + let w1, w2 = 474 + (String.get_int64_be nonce 0, String.get_int32_be nonce 8) 475 + in 476 + (w1, Int64.(shift_left (of_int32 w2) 32 |> add 1L)) 477 + | _ -> 478 + CTR.ctr_of_octets @@ GHASH.digesti ~key:hkey 479 + @@ iter2 nonce (pack64s 0L (bits64 nonce)) 397 480 398 - let unsafe_tag_into ~key ~hkey ~ctr ?(adata = "") cdata ~off ~len dst ~tag_off = 481 + let unsafe_tag_into ~key ~hkey ~ctr ?(adata = "") cdata ~off ~len dst 482 + ~tag_off = 399 483 CTR.unsafe_encrypt_into ~key ~ctr 400 484 (GHASH.digesti_off_len ~key:hkey 401 - (iter3 (adata, 0, String.length adata) (cdata, off, len) 485 + (iter3 486 + (adata, 0, String.length adata) 487 + (cdata, off, len) 402 488 (pack64s (bits64 adata) (Int64.of_int (len * 8)), 0, 16))) 403 489 ~src_off:0 dst ~dst_off:tag_off tag_size 404 490 405 - let unsafe_authenticate_encrypt_into ~key:{ key; hkey } ~nonce ?adata src ~src_off dst ~dst_off ~tag_off len = 491 + let unsafe_authenticate_encrypt_into ~key:{ key; hkey } ~nonce ?adata src 492 + ~src_off dst ~dst_off ~tag_off len = 406 493 let ctr = counter ~hkey nonce in 407 - CTR.(unsafe_encrypt_into ~key ~ctr:(add_ctr ctr 1L) src ~src_off dst ~dst_off len); 408 - unsafe_tag_into ~key ~hkey ~ctr ?adata (Bytes.unsafe_to_string dst) ~off:dst_off ~len dst ~tag_off 494 + CTR.( 495 + unsafe_encrypt_into ~key ~ctr:(add_ctr ctr 1L) src ~src_off dst ~dst_off 496 + len); 497 + unsafe_tag_into ~key ~hkey ~ctr ?adata 498 + (Bytes.unsafe_to_string dst) 499 + ~off:dst_off ~len dst ~tag_off 409 500 410 - let authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off ~tag_off len = 501 + let authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off 502 + ~tag_off len = 411 503 check_offset ~tag:"GCM" ~buf:"src" ~off:src_off ~len (String.length src); 412 504 check_offset ~tag:"GCM" ~buf:"dst" ~off:dst_off ~len (Bytes.length dst); 413 - check_offset ~tag:"GCM" ~buf:"dst tag" ~off:tag_off ~len:tag_size (Bytes.length dst); 414 - unsafe_authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off ~tag_off len 505 + check_offset ~tag:"GCM" ~buf:"dst tag" ~off:tag_off ~len:tag_size 506 + (Bytes.length dst); 507 + unsafe_authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst 508 + ~dst_off ~tag_off len 415 509 416 510 let authenticate_encrypt ~key ~nonce ?adata data = 417 511 let l = String.length data in 418 512 let dst = Bytes.create (l + tag_size) in 419 - unsafe_authenticate_encrypt_into ~key ~nonce ?adata data ~src_off:0 dst ~dst_off:0 ~tag_off:l l; 513 + unsafe_authenticate_encrypt_into ~key ~nonce ?adata data ~src_off:0 dst 514 + ~dst_off:0 ~tag_off:l l; 420 515 Bytes.unsafe_to_string dst 421 516 422 517 let authenticate_encrypt_tag ~key ~nonce ?adata data = 423 518 let r = authenticate_encrypt ~key ~nonce ?adata data in 424 - String.sub r 0 (String.length data), 425 - String.sub r (String.length data) tag_size 519 + ( String.sub r 0 (String.length data), 520 + String.sub r (String.length data) tag_size ) 426 521 427 - let unsafe_authenticate_decrypt_into ~key:{ key; hkey } ~nonce ?adata src ~src_off ~tag_off dst ~dst_off len = 522 + let unsafe_authenticate_decrypt_into ~key:{ key; hkey } ~nonce ?adata src 523 + ~src_off ~tag_off dst ~dst_off len = 428 524 let ctr = counter ~hkey nonce in 429 - CTR.(unsafe_encrypt_into ~key ~ctr:(add_ctr ctr 1L) src ~src_off dst ~dst_off len); 525 + CTR.( 526 + unsafe_encrypt_into ~key ~ctr:(add_ctr ctr 1L) src ~src_off dst ~dst_off 527 + len); 430 528 let ctag = Bytes.create tag_size in 431 - unsafe_tag_into ~key ~hkey ~ctr ?adata src ~off:src_off ~len ctag ~tag_off:0; 529 + unsafe_tag_into ~key ~hkey ~ctr ?adata src ~off:src_off ~len ctag 530 + ~tag_off:0; 432 531 Eqaf.equal (String.sub src tag_off tag_size) (Bytes.unsafe_to_string ctag) 433 532 434 - let authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst ~dst_off len = 533 + let authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst 534 + ~dst_off len = 435 535 check_offset ~tag:"GCM" ~buf:"src" ~off:src_off ~len (String.length src); 436 - check_offset ~tag:"GCM" ~buf:"src tag" ~off:tag_off ~len:tag_size (String.length src); 536 + check_offset ~tag:"GCM" ~buf:"src tag" ~off:tag_off ~len:tag_size 537 + (String.length src); 437 538 check_offset ~tag:"GCM" ~buf:"dst" ~off:dst_off ~len (Bytes.length dst); 438 - unsafe_authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst ~dst_off len 539 + unsafe_authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off 540 + dst ~dst_off len 439 541 440 542 let authenticate_decrypt ~key ~nonce ?adata cdata = 441 - if String.length cdata < tag_size then 442 - None 543 + if String.length cdata < tag_size then None 443 544 else 444 545 let l = String.length cdata - tag_size in 445 546 let data = Bytes.create l in 446 - if unsafe_authenticate_decrypt_into ~key ~nonce ?adata cdata ~src_off:0 ~tag_off:l data ~dst_off:0 l then 447 - Some (Bytes.unsafe_to_string data) 448 - else 449 - None 547 + if 548 + unsafe_authenticate_decrypt_into ~key ~nonce ?adata cdata ~src_off:0 549 + ~tag_off:l data ~dst_off:0 l 550 + then Some (Bytes.unsafe_to_string data) 551 + else None 450 552 451 553 let authenticate_decrypt_tag ~key ~nonce ?adata ~tag:tag_data cipher = 452 554 let cdata = cipher ^ tag_data in ··· 454 556 end 455 557 456 558 module CCM16_of (C : Block.Core) : Block.CCM16 = struct 457 - 458 - assert (C.block = 16) 559 + assert (C.block = 16);; 459 560 460 561 let tag_size = C.block 461 562 462 563 type key = C.ekey 463 564 464 565 let of_secret sec = C.e_of_secret sec 465 - 466 - let (key_sizes, block_size) = C.(key, block) 566 + let key_sizes, block_size = C.(key, block) 467 567 468 568 let cipher ~key src ~src_off dst ~dst_off = 469 569 C.encrypt ~key ~blocks:1 src src_off dst dst_off 470 570 471 - let unsafe_authenticate_encrypt_into ~key ~nonce ?(adata = "") src ~src_off dst ~dst_off ~tag_off len = 472 - Ccm.unsafe_generation_encryption_into ~cipher ~key ~nonce ~adata 473 - src ~src_off dst ~dst_off ~tag_off len 571 + let unsafe_authenticate_encrypt_into ~key ~nonce ?(adata = "") src ~src_off 572 + dst ~dst_off ~tag_off len = 573 + Ccm.unsafe_generation_encryption_into ~cipher ~key ~nonce ~adata src 574 + ~src_off dst ~dst_off ~tag_off len 474 575 475 576 let valid_nonce nonce = 476 577 let nsize = String.length nonce in 477 578 if nsize < 7 || nsize > 13 then 478 579 invalid_arg "CCM: nonce length not between 7 and 13: %u" nsize 479 580 480 - let authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off ~tag_off len = 581 + let authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off 582 + ~tag_off len = 481 583 check_offset ~tag:"CCM" ~buf:"src" ~off:src_off ~len (String.length src); 482 584 check_offset ~tag:"CCM" ~buf:"dst" ~off:dst_off ~len (Bytes.length dst); 483 - check_offset ~tag:"CCM" ~buf:"dst tag" ~off:tag_off ~len:tag_size (Bytes.length dst); 585 + check_offset ~tag:"CCM" ~buf:"dst tag" ~off:tag_off ~len:tag_size 586 + (Bytes.length dst); 484 587 valid_nonce nonce; 485 - unsafe_authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst ~dst_off ~tag_off len 588 + unsafe_authenticate_encrypt_into ~key ~nonce ?adata src ~src_off dst 589 + ~dst_off ~tag_off len 486 590 487 591 let authenticate_encrypt ~key ~nonce ?adata cs = 488 592 valid_nonce nonce; 489 593 let l = String.length cs in 490 594 let dst = Bytes.create (l + tag_size) in 491 - unsafe_authenticate_encrypt_into ~key ~nonce ?adata cs ~src_off:0 dst ~dst_off:0 ~tag_off:l l; 595 + unsafe_authenticate_encrypt_into ~key ~nonce ?adata cs ~src_off:0 dst 596 + ~dst_off:0 ~tag_off:l l; 492 597 Bytes.unsafe_to_string dst 493 598 494 599 let authenticate_encrypt_tag ~key ~nonce ?adata cs = 495 600 let res = authenticate_encrypt ~key ~nonce ?adata cs in 496 - String.sub res 0 (String.length cs), String.sub res (String.length cs) tag_size 601 + ( String.sub res 0 (String.length cs), 602 + String.sub res (String.length cs) tag_size ) 497 603 498 - let unsafe_authenticate_decrypt_into ~key ~nonce ?(adata = "") src ~src_off ~tag_off dst ~dst_off len = 499 - Ccm.unsafe_decryption_verification_into ~cipher ~key ~nonce ~adata src ~src_off ~tag_off dst ~dst_off len 604 + let unsafe_authenticate_decrypt_into ~key ~nonce ?(adata = "") src ~src_off 605 + ~tag_off dst ~dst_off len = 606 + Ccm.unsafe_decryption_verification_into ~cipher ~key ~nonce ~adata src 607 + ~src_off ~tag_off dst ~dst_off len 500 608 501 - let authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst ~dst_off len = 609 + let authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst 610 + ~dst_off len = 502 611 check_offset ~tag:"CCM" ~buf:"src" ~off:src_off ~len (String.length src); 503 - check_offset ~tag:"CCM" ~buf:"src tag" ~off:tag_off ~len:tag_size (String.length src); 612 + check_offset ~tag:"CCM" ~buf:"src tag" ~off:tag_off ~len:tag_size 613 + (String.length src); 504 614 check_offset ~tag:"CCM" ~buf:"dst" ~off:dst_off ~len (Bytes.length dst); 505 615 valid_nonce nonce; 506 - unsafe_authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off dst ~dst_off len 616 + unsafe_authenticate_decrypt_into ~key ~nonce ?adata src ~src_off ~tag_off 617 + dst ~dst_off len 507 618 508 619 let authenticate_decrypt ~key ~nonce ?adata data = 509 - if String.length data < tag_size then 510 - None 620 + if String.length data < tag_size then None 511 621 else 512 622 let dlen = String.length data - tag_size in 513 623 let dst = Bytes.create dlen in 514 - if authenticate_decrypt_into ~key ~nonce ?adata data ~src_off:0 ~tag_off:dlen dst ~dst_off:0 dlen then 515 - Some (Bytes.unsafe_to_string dst) 516 - else 517 - None 624 + if 625 + authenticate_decrypt_into ~key ~nonce ?adata data ~src_off:0 626 + ~tag_off:dlen dst ~dst_off:0 dlen 627 + then Some (Bytes.unsafe_to_string dst) 628 + else None 518 629 519 630 let authenticate_decrypt_tag ~key ~nonce ?adata ~tag cs = 520 631 authenticate_decrypt ~key ~nonce ?adata (cs ^ tag) ··· 522 633 end 523 634 524 635 module AES = struct 525 - 526 636 module Core : Block.Core = struct 527 - 528 - let key = [| 16; 24; 32 |] 637 + let key = [| 16; 24; 32 |] 529 638 let block = 16 530 639 531 640 type ekey = string * int ··· 534 643 let of_secret_with init key = 535 644 let rounds = 536 645 match String.length key with 537 - | 16 | 24 | 32 -> String.length key / 4 + 6 646 + | 16 | 24 | 32 -> (String.length key / 4) + 6 538 647 | _ -> invalid_arg "AES.of_secret: key length %u" (String.length key) 539 648 in 540 649 let rk = Bytes.create (Native.AES.rk_s rounds) in 541 - init key rk rounds ; 542 - Bytes.unsafe_to_string rk, rounds 650 + init key rk rounds; 651 + (Bytes.unsafe_to_string rk, rounds) 543 652 544 653 let derive_d ?e buf rk rs = Native.AES.derive_d buf rk rs e 545 - 546 654 let e_of_secret = of_secret_with Native.AES.derive_e 547 655 let d_of_secret = of_secret_with (derive_d ?e:None) 548 656 549 657 let of_secret secret = 550 - let (e, _) as ekey = e_of_secret secret in 658 + let ((e, _) as ekey) = e_of_secret secret in 551 659 (ekey, of_secret_with (derive_d ~e) secret) 552 660 553 661 (* XXX arg order ocaml<->c slows down *) ··· 558 666 559 667 let decrypt ~key:(d, rounds) ~blocks src off1 dst off2 = 560 668 Native.AES.dec src off1 dst off2 d rounds blocks 561 - 562 669 end 563 670 564 671 module ECB = Modes.ECB_of (Core) ··· 566 673 module CTR = Modes.CTR_of (Core) (Counters.C128be) 567 674 module GCM = Modes.GCM_of (Core) 568 675 module CCM16 = Modes.CCM16_of (Core) 569 - 570 676 end 571 677 572 678 module DES = struct 573 - 574 679 module Core : Block.Core = struct 575 - 576 - let key = [| 24 |] 680 + let key = [| 24 |] 577 681 let block = 8 578 682 579 683 type ekey = string ··· 583 687 584 688 let gen_of_secret ~direction key = 585 689 if String.length key <> 24 then 586 - invalid_arg "DES.of_secret: key length %u" (String.length key) ; 690 + invalid_arg "DES.of_secret: key length %u" (String.length key); 587 691 let key = Bytes.of_string key in 588 692 let keybuf = Bytes.create k_s in 589 693 Native.DES.des3key key direction keybuf; ··· 591 695 592 696 let e_of_secret = gen_of_secret ~direction:0 593 697 let d_of_secret = gen_of_secret ~direction:1 594 - 595 698 let of_secret secret = (e_of_secret secret, d_of_secret secret) 596 699 597 700 let encrypt ~key ~blocks src off1 dst off2 = ··· 603 706 module ECB = Modes.ECB_of (Core) 604 707 module CBC = Modes.CBC_of (Core) 605 708 module CTR = Modes.CTR_of (Core) (Counters.C64be) 606 - 607 709 end 608 710 609 711 let accelerated = 610 712 let flags = 611 - (match Native.misc_mode () with 1 -> [`XOR] | _ -> []) @ 612 - (match Native.AES.mode () with 1 -> [`AES] | _ -> []) @ 613 - (match Native.GHASH.mode () with 1 -> [`GHASH] | _ -> []) in 713 + (match Native.misc_mode () with 1 -> [ `XOR ] | _ -> []) 714 + @ (match Native.AES.mode () with 1 -> [ `AES ] | _ -> []) 715 + @ match Native.GHASH.mode () with 1 -> [ `GHASH ] | _ -> [] 716 + in 614 717 flags
+14 -14
src/cipher_stream.ml
··· 2 2 3 3 module type Stream = sig 4 4 type key 5 - type result = { message : string ; key : key } 5 + type result = { message : string; key : key } 6 + 6 7 val of_secret : string -> key 7 8 val encrypt : key:key -> string -> result 8 9 val decrypt : key:key -> string -> result 9 10 end 10 11 11 12 module ARC4 = struct 12 - 13 13 type key = int * int * int array 14 - 15 - type result = { message : string ; key : key } 14 + type result = { message : string; key : key } 16 15 17 16 let of_secret buf = 18 17 let len = String.length buf in ··· 25 24 let si = s.(i) in 26 25 let j = (j + si + x) land 0xff in 27 26 let sj = s.(j) in 28 - s.(i) <- sj ; s.(j) <- si ; 27 + s.(i) <- sj; 28 + s.(j) <- si; 29 29 (loop [@tailcall]) j (succ i) 30 30 in 31 - ( loop 0 0 ; (0, 0, s) ) 31 + loop 0 0; 32 + (0, 0, s) 32 33 33 34 let encrypt ~key:(i, j, s') buf = 34 - let s = Array.copy s' 35 - and len = String.length buf in 35 + let s = Array.copy s' and len = String.length buf in 36 36 let res = Bytes.create len in 37 37 let rec mix i j = function 38 38 | n when n = len -> (i, j, s) 39 39 | n -> 40 - let i = succ i land 0xff in 40 + let i = succ i land 0xff in 41 41 let si = s.(i) in 42 - let j = (j + si) land 0xff in 42 + let j = (j + si) land 0xff in 43 43 let sj = s.(j) in 44 - s.(i) <- sj ; s.(j) <- si ; 45 - let k = s.((si + sj) land 0xff) in 44 + s.(i) <- sj; 45 + s.(j) <- si; 46 + let k = s.((si + sj) land 0xff) in 46 47 Bytes.set_uint8 res n (k lxor String.get_uint8 buf n); 47 48 (mix [@tailcall]) i j (succ n) 48 49 in 49 50 let key' = mix i j 0 in 50 - { key = key' ; message = Bytes.unsafe_to_string res } 51 + { key = key'; message = Bytes.unsafe_to_string res } 51 52 52 53 let decrypt = encrypt 53 - 54 54 end
+2
src/crypto.ml
··· 1 1 module Uncommon = Uncommon 2 2 module Poly1305 = Poly1305.It 3 + 3 4 module type AEAD = Aead.AEAD 5 + 4 6 include Cipher_block 5 7 module Chacha20 = Chacha20 6 8 include Cipher_stream
+290 -177
src/crypto.mli
··· 10 10 the same signature. 11 11 12 12 The opam package mirage-crypto-rng provides a cryptographically secure 13 - pseudo-random number generator, the package mirage-crypto-pk provides 14 - public key cryptography. 15 - *) 13 + pseudo-random number generator, the package mirage-crypto-pk provides public 14 + key cryptography. *) 16 15 17 16 (**/**) 18 17 ··· 21 20 This is largely an internal API used in related sub-libraries or tests. As 22 21 such, it is prone to breakage. *) 23 22 module Uncommon : sig 24 - 25 - val (//) : int -> int -> int 23 + val ( // ) : int -> int -> int 26 24 (** [x // y] is the ceiling division [ceil (x / y)]. 27 25 28 26 [x // y] is [0] for any non-positive [x]. ··· 33 31 val imax : int -> int -> int 34 32 val iter2 : 'a -> 'a -> ('a -> unit) -> unit 35 33 val iter3 : 'a -> 'a -> 'a -> ('a -> unit) -> unit 34 + val xor : string -> string -> string 36 35 37 - val xor : string -> string -> string 38 - val unsafe_xor_into : string -> src_off:int -> bytes -> dst_off:int -> int -> unit 36 + val unsafe_xor_into : 37 + string -> src_off:int -> bytes -> dst_off:int -> int -> unit 39 38 40 39 val invalid_arg : ('a, Format.formatter, unit, unit, unit, 'b) format6 -> 'a 41 40 end ··· 74 73 (** [maci ~key iter] is the all-in-one mac computation: 75 74 [get (feedi (empty ~key) iter)]. *) 76 75 77 - val mac_into : key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 76 + val mac_into : 77 + key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 78 78 (** [mac_into ~key datas dst dst_off] computes the [mac] of [datas]. *) 79 79 80 80 (**/**) 81 - val unsafe_mac_into : key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 82 - (** [unsafe_mac_into ~key datas dst dst_off] is {!mac_into} without bounds checks. *) 81 + 82 + val unsafe_mac_into : 83 + key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 84 + (** [unsafe_mac_into ~key datas dst dst_off] is {!mac_into} without bounds 85 + checks. *) 86 + 83 87 (**/**) 84 88 end 85 89 ··· 92 96 only used for integrity protection, not encrypted and not part of the 93 97 ciphertext, can be passed in optionally. This prevents the same ciphertext 94 98 being used at a different location. See 95 - {{:https://tools.ietf.org/html/rfc5116}RFC 5116} for further description. 96 - *) 99 + {{:https://tools.ietf.org/html/rfc5116}RFC 5116} for further description. *) 97 100 module type AEAD = sig 98 - 99 101 val tag_size : int 100 102 (** The size of the authentication tag. *) 101 103 ··· 111 113 112 114 (** {1 Authenticated encryption and decryption with inline tag} *) 113 115 114 - val authenticate_encrypt : key:key -> nonce:string -> ?adata:string -> 115 - string -> string 116 + val authenticate_encrypt : 117 + key:key -> nonce:string -> ?adata:string -> string -> string 116 118 (** [authenticate_encrypt ~key ~nonce ~adata msg] encrypts [msg] with [key] 117 119 and [nonce], and appends an authentication tag computed over the encrypted 118 120 [msg], using [key], [nonce], and [adata]. 119 121 120 122 @raise Invalid_argument if [nonce] is not of the right size. *) 121 123 122 - val authenticate_decrypt : key:key -> nonce:string -> ?adata:string -> 123 - string -> string option 124 + val authenticate_decrypt : 125 + key:key -> nonce:string -> ?adata:string -> string -> string option 124 126 (** [authenticate_decrypt ~key ~nonce ~adata msg] splits [msg] into encrypted 125 127 data and authentication tag, computes the authentication tag using [key], 126 128 [nonce], and [adata], and decrypts the encrypted data. If the ··· 128 130 129 131 @raise Invalid_argument if [nonce] is not of the right size. *) 130 132 131 - (** {1 Authenticated encryption and decryption with tag provided separately} *) 133 + (** {1 Authenticated encryption and decryption with tag provided separately} 134 + *) 132 135 133 - val authenticate_encrypt_tag : key:key -> nonce:string -> 134 - ?adata:string -> string -> string * string 135 - (** [authenticate_encrypt_tag ~key ~nonce ~adata msg] encrypts [msg] with [key] 136 - and [nonce]. The computed authentication tag is returned separately as 137 - second part of the tuple. 136 + val authenticate_encrypt_tag : 137 + key:key -> nonce:string -> ?adata:string -> string -> string * string 138 + (** [authenticate_encrypt_tag ~key ~nonce ~adata msg] encrypts [msg] with 139 + [key] and [nonce]. The computed authentication tag is returned separately 140 + as second part of the tuple. 138 141 139 142 @raise Invalid_argument if [nonce] is not of the right size. *) 140 143 141 - val authenticate_decrypt_tag : key:key -> nonce:string -> 142 - ?adata:string -> tag:string -> string -> string option 144 + val authenticate_decrypt_tag : 145 + key:key -> 146 + nonce:string -> 147 + ?adata:string -> 148 + tag:string -> 149 + string -> 150 + string option 143 151 (** [authenticate_decrypt ~key ~nonce ~adata ~tag msg] computes the 144 152 authentication tag using [key], [nonce], and [adata], and decrypts the 145 153 encrypted data. If the authentication tags match, the decrypted data is ··· 149 157 150 158 (** {1 Authenticated encryption and decryption into existing buffers} *) 151 159 152 - val authenticate_encrypt_into : key:key -> nonce:string -> 153 - ?adata:string -> string -> src_off:int -> bytes -> dst_off:int -> 154 - tag_off:int -> int -> unit 155 - (** [authenticate_encrypt_into ~key ~nonce ~adata msg ~src_off dst ~dst_off ~tag_off len] 156 - encrypts [len] bytes of [msg] starting at [src_off] with [key] and [nonce]. The output 157 - is put into [dst] at [dst_off], the tag into [dst] at [tag_off]. 160 + val authenticate_encrypt_into : 161 + key:key -> 162 + nonce:string -> 163 + ?adata:string -> 164 + string -> 165 + src_off:int -> 166 + bytes -> 167 + dst_off:int -> 168 + tag_off:int -> 169 + int -> 170 + unit 171 + (** [authenticate_encrypt_into ~key ~nonce ~adata msg ~src_off dst ~dst_off 172 + ~tag_off len] encrypts [len] bytes of [msg] starting at [src_off] with 173 + [key] and [nonce]. The output is put into [dst] at [dst_off], the tag into 174 + [dst] at [tag_off]. 158 175 159 176 @raise Invalid_argument if [nonce] is not of the right size. 160 177 @raise Invalid_argument if [String.length msg - src_off < len]. 161 178 @raise Invalid_argument if [Bytes.length dst - dst_off < len]. 162 - @raise Invalid_argument if [Bytes.length dst - tag_off < tag_size]. 163 - *) 179 + @raise Invalid_argument if [Bytes.length dst - tag_off < tag_size]. *) 164 180 165 - val authenticate_decrypt_into : key:key -> nonce:string -> 166 - ?adata:string -> string -> src_off:int -> tag_off:int -> bytes -> 167 - dst_off:int -> int -> bool 168 - (** [authenticate_decrypt_into ~key ~nonce ~adata msg ~src_off ~tag_off dst ~dst_off len] 169 - computes the authentication tag using [key], [nonce], and [adata], and 170 - decrypts the [len] bytes encrypted data from [msg] starting at [src_off] into [dst] 171 - starting at [dst_off]. If the authentication tags match, [true] is 172 - returned, and the decrypted data is in [dst]. 181 + val authenticate_decrypt_into : 182 + key:key -> 183 + nonce:string -> 184 + ?adata:string -> 185 + string -> 186 + src_off:int -> 187 + tag_off:int -> 188 + bytes -> 189 + dst_off:int -> 190 + int -> 191 + bool 192 + (** [authenticate_decrypt_into ~key ~nonce ~adata msg ~src_off ~tag_off dst 193 + ~dst_off len] computes the authentication tag using [key], [nonce], and 194 + [adata], and decrypts the [len] bytes encrypted data from [msg] starting 195 + at [src_off] into [dst] starting at [dst_off]. If the authentication tags 196 + match, [true] is returned, and the decrypted data is in [dst]. 173 197 174 198 @raise Invalid_argument if [nonce] is not of the right size. 175 199 @raise Invalid_argument if [String.length msg - src_off < len]. ··· 177 201 @raise Invalid_argument if [String.length msg - tag_off < tag_size]. *) 178 202 179 203 (**/**) 180 - val unsafe_authenticate_encrypt_into : key:key -> nonce:string -> 181 - ?adata:string -> string -> src_off:int -> bytes -> dst_off:int -> 182 - tag_off:int -> int -> unit 204 + 205 + val unsafe_authenticate_encrypt_into : 206 + key:key -> 207 + nonce:string -> 208 + ?adata:string -> 209 + string -> 210 + src_off:int -> 211 + bytes -> 212 + dst_off:int -> 213 + tag_off:int -> 214 + int -> 215 + unit 183 216 (** [unsafe_authenticate_encrypt_into] is {!authenticate_encrypt_into}, but 184 217 without bounds checks. 185 218 186 219 @raise Invalid_argument if [nonce] is not of the right size. 187 220 188 221 This may cause memory issues if an invariant is violated: 189 - {ul 190 - {- [String.length msg - src_off >= len].} 191 - {- [Bytes.length dst - dst_off >= len].} 192 - {- [Bytes.length dst - tag_off >= tag_size].}} *) 222 + - [String.length msg - src_off >= len]. 223 + - [Bytes.length dst - dst_off >= len]. 224 + - [Bytes.length dst - tag_off >= tag_size]. *) 193 225 194 - val unsafe_authenticate_decrypt_into : key:key -> nonce:string -> 195 - ?adata:string -> string -> src_off:int -> tag_off:int -> bytes -> 196 - dst_off:int -> int -> bool 226 + val unsafe_authenticate_decrypt_into : 227 + key:key -> 228 + nonce:string -> 229 + ?adata:string -> 230 + string -> 231 + src_off:int -> 232 + tag_off:int -> 233 + bytes -> 234 + dst_off:int -> 235 + int -> 236 + bool 197 237 (** [unsafe_authenticate_decrypt_into] is {!authenticate_decrypt_into}, but 198 238 without bounds checks. 199 239 200 240 @raise Invalid_argument if [nonce] is not of the right size. 201 241 202 242 This may cause memory issues if an invariant is violated: 203 - {ul 204 - {- [String.length msg - src_off >= len].} 205 - {- [Bytes.length dst - dst_off >= len].} 206 - {- [String.length msg - tag_off >= tag_size].}} *) 243 + - [String.length msg - src_off >= len]. 244 + - [Bytes.length dst - dst_off >= len]. 245 + - [String.length msg - tag_off >= tag_size]. *) 246 + 207 247 (**/**) 208 248 end 209 249 ··· 214 254 215 255 (** Module types for various block cipher modes of operation. *) 216 256 module Block : sig 217 - 218 257 (** Modes of operation: *) 219 258 220 259 (** {e Electronic Codebook} "mode". *) 221 260 module type ECB = sig 222 - 223 261 type key 224 262 225 263 val of_secret : string -> key 226 264 (** Construct the encryption key corresponding to [secret]. 227 265 228 - @raise Invalid_argument if the length of [secret] is not in 229 - {{!key_sizes}[key_sizes]}. *) 266 + @raise Invalid_argument 267 + if the length of [secret] is not in {{!key_sizes}[key_sizes]}. *) 230 268 231 - val key_sizes : int array 269 + val key_sizes : int array 232 270 (** Key sizes allowed with this cipher. *) 233 271 234 272 val block_size : int ··· 238 276 (** [encrypt ~key src] encrypts [src] into a freshly allocated buffer of the 239 277 same size using [key]. 240 278 241 - @raise Invalid_argument if the length of [src] is not a multiple of 242 - {!block_size}. *) 279 + @raise Invalid_argument 280 + if the length of [src] is not a multiple of {!block_size}. *) 243 281 244 282 val decrypt : key:key -> string -> string 245 283 (** [decrypt ~key src] decrypts [src] into a freshly allocated buffer of the 246 284 same size using [key]. 247 285 248 - @raise Invalid_argument if the length of [src] is not a multiple of 249 - {!block_size}. *) 286 + @raise Invalid_argument 287 + if the length of [src] is not a multiple of {!block_size}. *) 250 288 251 - val encrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 289 + val encrypt_into : 290 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 252 291 (** [encrypt_into ~key src ~src_off dst dst_off len] encrypts [len] octets 253 292 from [src] starting at [src_off] into [dst] starting at [dst_off]. 254 293 255 294 @raise Invalid_argument if [len] is not a multiple of {!block_size}. 256 - @raise Invalid_argument if [src_off < 0 || String.length src - src_off < len]. 257 - @raise Invalid_argument if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 295 + @raise Invalid_argument 296 + if [src_off < 0 || String.length src - src_off < len]. 297 + @raise Invalid_argument 298 + if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 258 299 259 - val decrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 300 + val decrypt_into : 301 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 260 302 (** [decrypt_into ~key src ~src_off dst dst_off len] decrypts [len] octets 261 303 from [src] starting at [src_off] into [dst] starting at [dst_off]. 262 304 263 305 @raise Invalid_argument if [len] is not a multiple of {!block_size}. 264 - @raise Invalid_argument if [src_off < 0 || String.length src - src_off < len]. 265 - @raise Invalid_argument if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 306 + @raise Invalid_argument 307 + if [src_off < 0 || String.length src - src_off < len]. 308 + @raise Invalid_argument 309 + if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 266 310 267 311 (**/**) 268 - val unsafe_encrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 312 + 313 + val unsafe_encrypt_into : 314 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 269 315 (** [unsafe_encrypt_into] is {!encrypt_into}, but without bounds checks. 270 316 271 317 This may cause memory issues if an invariant is violated: 272 - {ul 273 - {- [len] must be a multiple of {!block_size},} 274 - {- [src_off >= 0 && String.length src - src_off >= len],} 275 - {- [dst_off >= 0 && Bytes.length dst - dst_off >= len].}} *) 318 + - [len] must be a multiple of {!block_size}, 319 + - [src_off >= 0 && String.length src - src_off >= len], 320 + - [dst_off >= 0 && Bytes.length dst - dst_off >= len]. *) 276 321 277 - val unsafe_decrypt_into : key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 322 + val unsafe_decrypt_into : 323 + key:key -> string -> src_off:int -> bytes -> dst_off:int -> int -> unit 278 324 (** [unsafe_decrypt_into] is {!decrypt_into}, but without bounds checks. 279 325 280 326 This may cause memory issues if an invariant is violated: 281 - {ul 282 - {- [len] must be a multiple of {!block_size},} 283 - {- [src_off >= 0 && String.length src - src_off >= len],} 284 - {- [dst_off >= 0 && Bytes.length dst - dst_off >= len].}} *) 327 + - [len] must be a multiple of {!block_size}, 328 + - [src_off >= 0 && String.length src - src_off >= len], 329 + - [dst_off >= 0 && Bytes.length dst - dst_off >= len]. *) 330 + 285 331 (**/**) 286 332 end 287 333 288 334 (** {e Cipher-block chaining} mode. *) 289 335 module type CBC = sig 290 - 291 336 type key 292 337 293 338 val of_secret : string -> key 294 339 (** Construct the encryption key corresponding to [secret]. 295 340 296 - @raise Invalid_argument if the length of [secret] is not in 297 - {{!key_sizes}[key_sizes]}. *) 341 + @raise Invalid_argument 342 + if the length of [secret] is not in {{!key_sizes}[key_sizes]}. *) 298 343 299 344 val key_sizes : int array 300 345 (** Key sizes allowed with this cipher. *) ··· 306 351 (** [encrypt ~key ~iv msg] is [msg] encrypted under [key], using [iv] as the 307 352 CBC initialization vector. 308 353 309 - @raise Invalid_argument if [iv] is not [block_size], or [msg] is not 310 - [k * block_size] long. *) 354 + @raise Invalid_argument 355 + if [iv] is not [block_size], or [msg] is not [k * block_size] long. *) 311 356 312 357 val decrypt : key:key -> iv:string -> string -> string 313 358 (** [decrypt ~key ~iv msg] is the inverse of [encrypt]. 314 359 315 - @raise Invalid_argument if [iv] is not [block_size], or [msg] is not 316 - [k * block_size] long. *) 360 + @raise Invalid_argument 361 + if [iv] is not [block_size], or [msg] is not [k * block_size] long. *) 317 362 318 363 val next_iv : ?off:int -> string -> iv:string -> string 319 364 (** [next_iv ~iv ciphertext ~off] is the first [iv] {e following} the 320 365 encryption that used [iv] to produce [ciphertext]. 321 366 322 - For protocols which perform inter-message chaining, this is the [iv] 323 - for the next message. 367 + For protocols which perform inter-message chaining, this is the [iv] for 368 + the next message. 324 369 325 370 It is either [iv], when [String.length ciphertext - off = 0], or the 326 371 last block of [ciphertext]. Note that 327 372 328 - {[encrypt ~iv msg1 || encrypt ~iv:(next_iv ~iv (encrypt ~iv msg1)) msg2 329 - == encrypt ~iv (msg1 || msg2)]} 373 + {[ 374 + encrypt ~iv msg1 375 + || encrypt ~iv:(next_iv ~iv (encrypt ~iv msg1)) msg2 376 + == encrypt ~iv (msg1 || msg2) 377 + ]} 330 378 331 379 @raise Invalid_argument if the length of [iv] is not [block_size]. 332 - @raise Invalid_argument if the length of [ciphertext] is not a multiple 333 - of [block_size]. *) 380 + @raise Invalid_argument 381 + if the length of [ciphertext] is not a multiple of [block_size]. *) 334 382 335 - val encrypt_into : key:key -> iv:string -> string -> src_off:int -> 336 - bytes -> dst_off:int -> int -> unit 383 + val encrypt_into : 384 + key:key -> 385 + iv:string -> 386 + string -> 387 + src_off:int -> 388 + bytes -> 389 + dst_off:int -> 390 + int -> 391 + unit 337 392 (** [encrypt_into ~key ~iv src ~src_off dst dst_off len] encrypts [len] 338 - octets from [src] starting at [src_off] into [dst] starting at [dst_off]. 393 + octets from [src] starting at [src_off] into [dst] starting at 394 + [dst_off]. 339 395 340 396 @raise Invalid_argument if the length of [iv] is not {!block_size}. 341 397 @raise Invalid_argument if [len] is not a multiple of {!block_size}. 342 - @raise Invalid_argument if [src_off < 0 || String.length src - src_off < len]. 343 - @raise Invalid_argument if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 398 + @raise Invalid_argument 399 + if [src_off < 0 || String.length src - src_off < len]. 400 + @raise Invalid_argument 401 + if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 344 402 345 - val decrypt_into : key:key -> iv:string -> string -> src_off:int -> 346 - bytes -> dst_off:int -> int -> unit 403 + val decrypt_into : 404 + key:key -> 405 + iv:string -> 406 + string -> 407 + src_off:int -> 408 + bytes -> 409 + dst_off:int -> 410 + int -> 411 + unit 347 412 (** [decrypt_into ~key ~iv src ~src_off dst dst_off len] decrypts [len] 348 - octets from [src] starting at [src_off] into [dst] starting at [dst_off]. 413 + octets from [src] starting at [src_off] into [dst] starting at 414 + [dst_off]. 349 415 350 416 @raise Invalid_argument if the length of [iv] is not {!block_size}. 351 417 @raise Invalid_argument if [len] is not a multiple of {!block_size}. 352 - @raise Invalid_argument if [src_off < 0 || String.length src - src_off < len]. 353 - @raise Invalid_argument if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 418 + @raise Invalid_argument 419 + if [src_off < 0 || String.length src - src_off < len]. 420 + @raise Invalid_argument 421 + if [dst_off < 0 || Bytes.length dst - dst_off < len]. *) 354 422 355 423 (**/**) 356 - val unsafe_encrypt_into : key:key -> iv:string -> string -> src_off:int -> 357 - bytes -> dst_off:int -> int -> unit 424 + 425 + val unsafe_encrypt_into : 426 + key:key -> 427 + iv:string -> 428 + string -> 429 + src_off:int -> 430 + bytes -> 431 + dst_off:int -> 432 + int -> 433 + unit 358 434 (** [unsafe_encrypt_into] is {!encrypt_into}, but without bounds checks. 359 435 360 436 This may casue memory issues if an invariant is violated: 361 - {ul 362 - {- the length of [iv] must be {!block_size},} 363 - {- [len] must be a multiple of {!block_size},} 364 - {- [src_off >= 0 && String.length src - src_off >= len],} 365 - {- [dst_off >= 0 && Bytes.length dst - dst_off >= len].}} *) 437 + - the length of [iv] must be {!block_size}, 438 + - [len] must be a multiple of {!block_size}, 439 + - [src_off >= 0 && String.length src - src_off >= len], 440 + - [dst_off >= 0 && Bytes.length dst - dst_off >= len]. *) 366 441 367 - val unsafe_decrypt_into : key:key -> iv:string -> string -> src_off:int -> 368 - bytes -> dst_off:int -> int -> unit 442 + val unsafe_decrypt_into : 443 + key:key -> 444 + iv:string -> 445 + string -> 446 + src_off:int -> 447 + bytes -> 448 + dst_off:int -> 449 + int -> 450 + unit 369 451 (** [unsafe_decrypt_into] is {!decrypt_into}, but without bounds checks. 370 452 371 453 This may casue memory issues if an invariant is violated: 372 - {ul 373 - {- the length of [iv] must be {!block_size},} 374 - {- [len] must be a multiple of {!block_size},} 375 - {- [src_off >= 0 && String.length src - src_off >= len],} 376 - {- [dst_off >= 0 && Bytes.length dst - dst_off >= len].}} *) 454 + - the length of [iv] must be {!block_size}, 455 + - [len] must be a multiple of {!block_size}, 456 + - [src_off >= 0 && String.length src - src_off >= len], 457 + - [dst_off >= 0 && Bytes.length dst - dst_off >= len]. *) 377 458 378 - val unsafe_encrypt_into_inplace : key:key -> iv:string -> 379 - bytes -> dst_off:int -> int -> unit 459 + val unsafe_encrypt_into_inplace : 460 + key:key -> iv:string -> bytes -> dst_off:int -> int -> unit 380 461 (** [unsafe_encrypt_into_inplace] is {!unsafe_encrypt_into}, but assumes 381 462 that [dst] already contains the mesage to be encrypted. 382 463 383 464 This may casue memory issues if an invariant is violated: 384 - {ul 385 - {- the length of [iv] must be {!block_size},} 386 - {- [len] must be a multiple of {!block_size},} 387 - {- [src_off >= 0 && String.length src - src_off >= len],} 388 - {- [dst_off >= 0 && Bytes.length dst - dst_off >= len].}} *) 465 + - the length of [iv] must be {!block_size}, 466 + - [len] must be a multiple of {!block_size}, 467 + - [src_off >= 0 && String.length src - src_off >= len], 468 + - [dst_off >= 0 && Bytes.length dst - dst_off >= len]. *) 469 + 389 470 (**/**) 390 - end 471 + end 391 472 392 473 (** {e Counter} mode. *) 393 474 module type CTR = sig 394 - 395 475 type key 396 476 397 477 val of_secret : string -> key 398 478 (** Construct the encryption key corresponding to [secret]. 399 479 400 - @raise Invalid_argument if the length of [secret] is not in 401 - {{!key_sizes}[key_sizes]}. *) 480 + @raise Invalid_argument 481 + if the length of [secret] is not in {{!key_sizes}[key_sizes]}. *) 402 482 403 483 val key_sizes : int array 404 484 (** Key sizes allowed with this cipher. *) ··· 415 495 (** [next_ctr ~off msg ~ctr] is the state of the counter after encrypting or 416 496 decrypting [msg] at offset [off] with the counter [ctr]. 417 497 418 - For protocols which perform inter-message chaining, this is the 419 - counter for the next message. 498 + For protocols which perform inter-message chaining, this is the counter 499 + for the next message. 420 500 421 501 It is computed as [C.add ctr (ceil (len msg / block_size))]. Note that 422 502 if [len msg1 = k * block_size], 423 503 424 - {[encrypt ~ctr msg1 || encrypt ~ctr:(next_ctr ~ctr msg1) msg2 425 - == encrypt ~ctr (msg1 || msg2)]} 426 - 427 - *) 504 + {[ 505 + encrypt ~ctr msg1 506 + || encrypt ~ctr:(next_ctr ~ctr msg1) msg2 507 + == encrypt ~ctr (msg1 || msg2) 508 + ]} *) 428 509 429 510 val ctr_of_octets : string -> ctr 430 511 (** [ctr_of_octets buf] converts the value of [buf] into a counter. *) ··· 439 520 440 521 Note that 441 522 442 - {[stream ~key ~ctr (k * block_size) || stream ~key ~ctr:(add ctr k) x 443 - == stream ~key ~ctr (k * block_size + x)]} 523 + {[ 524 + stream ~key ~ctr (k * block_size) 525 + || stream ~key ~ctr:(add ctr k) x 526 + == stream ~key ~ctr ((k * block_size) + x) 527 + ]} 444 528 445 529 In other words, it is possible to restart a keystream at [block_size] 446 530 boundaries by manipulating the counter. *) 447 531 448 532 val encrypt : key:key -> ctr:ctr -> string -> string 449 - (** [encrypt ~key ~ctr msg] is 450 - [stream ~key ~ctr (len msg) lxor msg]. *) 533 + (** [encrypt ~key ~ctr msg] is [stream ~key ~ctr (len msg) lxor msg]. *) 451 534 452 535 val decrypt : key:key -> ctr:ctr -> string -> string 453 536 (** [decrypt] is [encrypt]. *) 454 537 455 - val stream_into : key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 538 + val stream_into : key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 456 539 (** [stream_into ~key ~ctr dst ~off len] is the raw key stream put into 457 540 [dst] starting at [off]. 458 541 459 542 @raise Invalid_argument if [Bytes.length dst - off < len]. *) 460 543 461 - val encrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 462 - bytes -> dst_off:int -> int -> unit 463 - (** [encrypt_into ~key ~ctr src ~src_off dst ~dst_off len] produces the 464 - key stream into [dst] at [dst_off], and then xors it with [src] at 544 + val encrypt_into : 545 + key:key -> 546 + ctr:ctr -> 547 + string -> 548 + src_off:int -> 549 + bytes -> 550 + dst_off:int -> 551 + int -> 552 + unit 553 + (** [encrypt_into ~key ~ctr src ~src_off dst ~dst_off len] produces the key 554 + stream into [dst] at [dst_off], and then xors it with [src] at 465 555 [src_off]. 466 556 467 - @raise Invalid_argument if [dst_off < 0 || Bytes.length dst - dst_off < len]. 468 - @raise Invalid_argument if [src_off < 0 || String.length src - src_off < len]. *) 557 + @raise Invalid_argument 558 + if [dst_off < 0 || Bytes.length dst - dst_off < len]. 559 + @raise Invalid_argument 560 + if [src_off < 0 || String.length src - src_off < len]. *) 469 561 470 - val decrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 471 - bytes -> dst_off:int -> int -> unit 562 + val decrypt_into : 563 + key:key -> 564 + ctr:ctr -> 565 + string -> 566 + src_off:int -> 567 + bytes -> 568 + dst_off:int -> 569 + int -> 570 + unit 472 571 (** [decrypt_into] is {!encrypt_into}. *) 473 572 474 573 (**/**) 475 - val unsafe_stream_into : key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 574 + 575 + val unsafe_stream_into : 576 + key:key -> ctr:ctr -> bytes -> off:int -> int -> unit 476 577 (** [unsafe_stream_into] is {!stream_into}, but without bounds checks. 477 578 478 579 This may cause memory issues if the invariant is violated: 479 - {ul 480 - {- [off >= 0 && Bytes.length buf - off >= len].}} *) 580 + - [off >= 0 && Bytes.length buf - off >= len]. *) 481 581 482 - val unsafe_encrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 483 - bytes -> dst_off:int -> int -> unit 582 + val unsafe_encrypt_into : 583 + key:key -> 584 + ctr:ctr -> 585 + string -> 586 + src_off:int -> 587 + bytes -> 588 + dst_off:int -> 589 + int -> 590 + unit 484 591 (** [unsafe_encrypt_into] is {!encrypt_into}, but without bounds checks. 485 592 486 593 This may cause memory issues if an invariant is violated: 487 - {ul 488 - {- [dst_off >= 0 && Bytes.length dst - dst_off >= len],} 489 - {- [src_off >= 0 && String.length src - src_off >= len].}} *) 594 + - [dst_off >= 0 && Bytes.length dst - dst_off >= len], 595 + - [src_off >= 0 && String.length src - src_off >= len]. *) 490 596 491 - val unsafe_decrypt_into : key:key -> ctr:ctr -> string -> src_off:int -> 492 - bytes -> dst_off:int -> int -> unit 597 + val unsafe_decrypt_into : 598 + key:key -> 599 + ctr:ctr -> 600 + string -> 601 + src_off:int -> 602 + bytes -> 603 + dst_off:int -> 604 + int -> 605 + unit 493 606 (** [unsafe_decrypt_into] is {!unsafe_encrypt_into}. *) 607 + 494 608 (**/**) 495 609 end 496 610 497 611 (** {e Galois/Counter Mode}. *) 498 612 module type GCM = sig 499 - 500 613 include AEAD 501 614 502 - val key_sizes : int array 615 + val key_sizes : int array 503 616 (** Key sizes allowed with this cipher. *) 504 617 505 618 val block_size : int ··· 508 621 509 622 (** {e Counter with CBC-MAC} mode. *) 510 623 module type CCM16 = sig 511 - 512 624 include AEAD 513 625 514 - val key_sizes : int array 626 + val key_sizes : int array 515 627 (** Key sizes allowed with this cipher. *) 516 628 517 629 val block_size : int ··· 533 645 module CTR : Block.CTR with type ctr = int64 534 646 end 535 647 536 - val accelerated : [`XOR | `AES | `GHASH] list 537 - (** Operations using non-portable, hardware-dependent implementation in 538 - this build of the library. *) 648 + val accelerated : [ `XOR | `AES | `GHASH ] list 649 + (** Operations using non-portable, hardware-dependent implementation in this 650 + build of the library. *) 539 651 540 652 (** The ChaCha20 cipher proposed by D.J. Bernstein. *) 541 653 module Chacha20 : sig 542 654 include AEAD 543 655 544 656 val crypt : key:key -> nonce:string -> ?ctr:int64 -> string -> string 545 - (** [crypt ~key ~nonce ~ctr data] generates a ChaCha20 key stream using 546 - the [key], and [nonce]. The [ctr] defaults to 0. The generated key 547 - stream is of the same length as [data], and the output is the XOR 548 - of the key stream and [data]. This implements, depending on the size 549 - of the [nonce] (8 or 12 bytes) both the original specification (where 550 - the counter is 8 byte, same as the nonce) and the IETF RFC 8439 551 - specification (where nonce is 12 bytes, and counter 4 bytes). 657 + (** [crypt ~key ~nonce ~ctr data] generates a ChaCha20 key stream using the 658 + [key], and [nonce]. The [ctr] defaults to 0. The generated key stream is 659 + of the same length as [data], and the output is the XOR of the key stream 660 + and [data]. This implements, depending on the size of the [nonce] (8 or 12 661 + bytes) both the original specification (where the counter is 8 byte, same 662 + as the nonce) and the IETF RFC 8439 specification (where nonce is 12 663 + bytes, and counter 4 bytes). 552 664 553 - @raise Invalid_argument if invalid parameters are provided. Valid 554 - parameters are: [key] must be 32 bytes and [nonce] 12 bytes for the 555 - IETF mode (and counter fit into 32 bits), or [key] must be either 16 556 - bytes or 32 bytes and [nonce] 8 bytes. 665 + @raise Invalid_argument 666 + if invalid parameters are provided. Valid parameters are: [key] must be 667 + 32 bytes and [nonce] 12 bytes for the IETF mode (and counter fit into 32 668 + bits), or [key] must be either 16 bytes or 32 bytes and [nonce] 8 bytes. 557 669 *) 558 670 end 559 671 560 672 (** General stream cipher type. *) 561 673 module type Stream = sig 562 674 type key 563 - type result = { message : string ; key : key } 675 + type result = { message : string; key : key } 676 + 564 677 val of_secret : string -> key 565 678 val encrypt : key:key -> string -> result 566 679 val decrypt : key:key -> string -> result 567 680 end 568 681 569 - (** {e Alleged Rivest Cipher 4}. *) 570 682 module ARC4 : Stream 683 + (** {e Alleged Rivest Cipher 4}. *)
+56 -20
src/native.ml
··· 1 + module AES = struct 2 + external enc : string -> int -> bytes -> int -> string -> int -> int -> unit 3 + = "mc_aes_enc_bc" "mc_aes_enc" 4 + [@@noalloc] 1 5 2 - module AES = struct 3 - external enc : string -> int -> bytes -> int -> string -> int -> int -> unit = "mc_aes_enc_bc" "mc_aes_enc" [@@noalloc] 4 - external dec : string -> int -> bytes -> int -> string -> int -> int -> unit = "mc_aes_dec_bc" "mc_aes_dec" [@@noalloc] 5 - external derive_e : string -> bytes -> int -> unit = "mc_aes_derive_e_key" [@@noalloc] 6 - external derive_d : string -> bytes -> int -> string option -> unit = "mc_aes_derive_d_key" [@@noalloc] 7 - external rk_s : int -> int = "mc_aes_rk_size" [@@noalloc] 8 - external mode : unit -> int = "mc_aes_mode" [@@noalloc] 6 + external dec : string -> int -> bytes -> int -> string -> int -> int -> unit 7 + = "mc_aes_dec_bc" "mc_aes_dec" 8 + [@@noalloc] 9 + 10 + external derive_e : string -> bytes -> int -> unit = "mc_aes_derive_e_key" 11 + [@@noalloc] 12 + 13 + external derive_d : string -> bytes -> int -> string option -> unit 14 + = "mc_aes_derive_d_key" 15 + [@@noalloc] 16 + 17 + external rk_s : int -> int = "mc_aes_rk_size" [@@noalloc] 18 + external mode : unit -> int = "mc_aes_mode" [@@noalloc] 9 19 end 10 20 11 21 module DES = struct 12 - external ddes : string -> int -> bytes -> int -> int -> string -> unit = "mc_des_ddes_bc" "mc_des_ddes" [@@noalloc] 13 - external des3key : bytes -> int -> bytes -> unit = "mc_des_des3key" [@@noalloc] 14 - external k_s : unit -> int = "mc_des_key_size" [@@noalloc] 22 + external ddes : string -> int -> bytes -> int -> int -> string -> unit 23 + = "mc_des_ddes_bc" "mc_des_ddes" 24 + [@@noalloc] 25 + 26 + external des3key : bytes -> int -> bytes -> unit = "mc_des_des3key" 27 + [@@noalloc] 28 + 29 + external k_s : unit -> int = "mc_des_key_size" [@@noalloc] 15 30 end 16 31 17 32 module Chacha = struct 18 - external round : int -> bytes -> bytes -> int -> unit = "mc_chacha_round" [@@noalloc] 33 + external round : int -> bytes -> bytes -> int -> unit = "mc_chacha_round" 34 + [@@noalloc] 19 35 end 20 36 21 37 module Poly1305 = struct 22 - external init : bytes -> string -> unit = "mc_poly1305_init" [@@noalloc] 23 - external update : bytes -> string -> int -> int -> unit = "mc_poly1305_update" [@@noalloc] 24 - external finalize : bytes -> bytes -> int -> unit = "mc_poly1305_finalize" [@@noalloc] 38 + external init : bytes -> string -> unit = "mc_poly1305_init" [@@noalloc] 39 + 40 + external update : bytes -> string -> int -> int -> unit = "mc_poly1305_update" 41 + [@@noalloc] 42 + 43 + external finalize : bytes -> bytes -> int -> unit = "mc_poly1305_finalize" 44 + [@@noalloc] 45 + 25 46 external ctx_size : unit -> int = "mc_poly1305_ctx_size" [@@noalloc] 26 47 external mac_size : unit -> int = "mc_poly1305_mac_size" [@@noalloc] 27 48 end ··· 29 50 module GHASH = struct 30 51 external keysize : unit -> int = "mc_ghash_key_size" [@@noalloc] 31 52 external keyinit : string -> bytes -> unit = "mc_ghash_init_key" [@@noalloc] 32 - external ghash : string -> bytes -> string -> int -> int -> unit = "mc_ghash" [@@noalloc] 53 + 54 + external ghash : string -> bytes -> string -> int -> int -> unit = "mc_ghash" 55 + [@@noalloc] 56 + 33 57 external mode : unit -> int = "mc_ghash_mode" [@@noalloc] 34 58 end 35 59 36 60 (* XXX TODO 37 61 * Unsolved: bounds-checked XORs are slowing things down considerably... *) 38 - external xor_into_bytes : string -> int -> bytes -> int -> int -> unit = "mc_xor_into_bytes" [@@noalloc] 62 + external xor_into_bytes : string -> int -> bytes -> int -> int -> unit 63 + = "mc_xor_into_bytes" 64 + [@@noalloc] 39 65 40 - external count8be : ctr:bytes -> bytes -> off:int -> blocks:int -> unit = "mc_count_8_be" [@@noalloc] 41 - external count16be : ctr:bytes -> bytes -> off:int -> blocks:int -> unit = "mc_count_16_be" [@@noalloc] 42 - external count16be4 : ctr:bytes -> bytes -> off:int -> blocks:int -> unit = "mc_count_16_be_4" [@@noalloc] 66 + external count8be : ctr:bytes -> bytes -> off:int -> blocks:int -> unit 67 + = "mc_count_8_be" 68 + [@@noalloc] 69 + 70 + external count16be : ctr:bytes -> bytes -> off:int -> blocks:int -> unit 71 + = "mc_count_16_be" 72 + [@@noalloc] 73 + 74 + external count16be4 : ctr:bytes -> bytes -> off:int -> blocks:int -> unit 75 + = "mc_count_16_be_4" 76 + [@@noalloc] 43 77 44 78 external misc_mode : unit -> int = "mc_misc_mode" [@@noalloc] 45 79 46 - external _detect_cpu_features : unit -> unit = "mc_detect_cpu_features" [@@noalloc] 80 + external _detect_cpu_features : unit -> unit = "mc_detect_cpu_features" 81 + [@@noalloc] 82 + 47 83 external _detect_entropy : unit -> unit = "mc_entropy_detect" 48 84 49 85 let () =
+17 -18
src/poly1305.ml
··· 1 1 module type S = sig 2 2 type 'a iter = 'a Uncommon.iter 3 - 4 3 type t 4 + 5 5 val mac_size : int 6 - 7 6 val empty : key:string -> t 8 7 val feed : t -> string -> t 9 8 val feedi : t -> string iter -> t 10 9 val get : t -> string 11 - 12 10 val mac : key:string -> string -> string 13 11 val maci : key:string -> string iter -> string 14 - val mac_into : key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 15 - val unsafe_mac_into : key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 12 + 13 + val mac_into : 14 + key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 15 + 16 + val unsafe_mac_into : 17 + key:string -> (string * int * int) list -> bytes -> dst_off:int -> unit 16 18 end 17 19 18 20 module It : S = struct 19 21 type 'a iter = 'a Uncommon.iter 20 22 21 23 module P = Native.Poly1305 24 + 22 25 let mac_size = P.mac_size () 23 26 24 27 type t = bytes ··· 27 30 28 31 let empty ~key = 29 32 let ctx = Bytes.create (P.ctx_size ()) in 30 - if String.length key <> 32 then invalid_arg "Poly1305 key must be 32 bytes" ; 31 - P.init ctx key ; 33 + if String.length key <> 32 then invalid_arg "Poly1305 key must be 32 bytes"; 34 + P.init ctx key; 32 35 ctx 33 36 34 - let update ctx data = 35 - P.update ctx data 0 (String.length data) 37 + let update ctx data = P.update ctx data 0 (String.length data) 36 38 37 39 let feed ctx cs = 38 40 let t = dup ctx in 39 - update t cs ; 41 + update t cs; 40 42 t 41 43 42 44 let feedi ctx iter = 43 45 let t = dup ctx in 44 - iter (update t) ; 46 + iter (update t); 45 47 t 46 48 47 49 let final ctx = ··· 50 52 Bytes.unsafe_to_string res 51 53 52 54 let get ctx = final (dup ctx) 53 - 54 55 let mac ~key data = feed (empty ~key) data |> final 55 - 56 56 let maci ~key iter = feedi (empty ~key) iter |> final 57 57 58 58 let unsafe_mac_into ~key datas dst ~dst_off = ··· 64 64 if Bytes.length dst - dst_off < mac_size then 65 65 Uncommon.invalid_arg "Poly1305: dst length %u - off %u < len %u" 66 66 (Bytes.length dst) dst_off mac_size; 67 - if dst_off < 0 then 68 - Uncommon.invalid_arg "Poly1305: dst_off %u < 0" dst_off; 67 + if dst_off < 0 then Uncommon.invalid_arg "Poly1305: dst_off %u < 0" dst_off; 69 68 let ctx = empty ~key in 70 - List.iter (fun (d, off, len) -> 71 - if off < 0 then 72 - Uncommon.invalid_arg "Poly1305: d off %u < 0" off; 69 + List.iter 70 + (fun (d, off, len) -> 71 + if off < 0 then Uncommon.invalid_arg "Poly1305: d off %u < 0" off; 73 72 if String.length d - off < len then 74 73 Uncommon.invalid_arg "Poly1305: d length %u - off %u < len %u" 75 74 (String.length d) off len;
+13 -5
src/uncommon.ml
··· 5 5 6 6 let invalid_arg fmt = kasprintf invalid_arg ("Crypto: " ^^ fmt) 7 7 8 - let (//) x y = 9 - if y < 1 then raise Division_by_zero else 10 - if x > 0 then 1 + ((x - 1) / y) else 0 [@@inline] 8 + let ( // ) x y = 9 + if y < 1 then raise Division_by_zero 10 + else if x > 0 then 1 + ((x - 1) / y) 11 + else 0 12 + [@@inline] 11 13 12 14 let imin (a : int) b = if a < b then a else b 13 15 let imax (a : int) b = if a < b then b else a 14 16 15 17 type 'a iter = ('a -> unit) -> unit 16 18 17 - let iter2 a b f = f a; f b 18 - let iter3 a b c f = f a; f b; f c 19 + let iter2 a b f = 20 + f a; 21 + f b 22 + 23 + let iter3 a b c f = 24 + f a; 25 + f b; 26 + f c 19 27 20 28 let unsafe_xor_into src ~src_off dst ~dst_off n = 21 29 Native.xor_into_bytes src src_off dst dst_off n
+38 -46
tests/misc_pk.ml
··· 1 - 2 1 let mem f = 3 2 let t = Hashtbl.create 100 in 4 3 fun x -> 5 - try Hashtbl.find t x with 6 - | Not_found -> 7 - let r = f x in ( Hashtbl.add t x r ; r ) 8 - 4 + try Hashtbl.find t x 5 + with Not_found -> 6 + let r = f x in 7 + Hashtbl.add t x r; 8 + r 9 9 10 10 (* An [admittedly primitive] implementation of Pollards p-1 factoring method. *) 11 11 12 12 module Pollard = struct 13 - 14 13 let primes_to n = 15 14 let rec scan = function 16 15 | p when p > n -> [] 17 - | p -> p :: scan Z.(nextprime p) in 16 + | p -> p :: scan Z.(nextprime p) 17 + in 18 18 scan (Z.of_int 2) 19 19 20 20 let max_pow limit x = ··· 22 22 if Z.(pow x upper) > limit then (lower, upper) 23 23 else expand upper (upper * 2) 24 24 and narrow lower upper = 25 - if upper - lower = 1 then lower else 25 + if upper - lower = 1 then lower 26 + else 26 27 let mid = (lower + upper) / 2 in 27 - if Z.(pow x mid) > limit then 28 - narrow lower mid 29 - else narrow mid upper 28 + if Z.(pow x mid) > limit then narrow lower mid else narrow mid upper 30 29 in 31 - let (l, u) = expand 1 2 in 30 + let l, u = expand 1 2 in 32 31 narrow l u 33 32 34 33 let ppowers_to n = ··· 36 35 | p when p > n -> [] 37 36 | p -> 38 37 let pp = Z.pow p (max_pow n p) in 39 - pp :: scan Z.(nextprime p) in 38 + pp :: scan Z.(nextprime p) 39 + in 40 40 scan (Z.of_int 2) 41 41 42 42 let note ~msg f = 43 - Printf.printf "[%s] ->\n%!" msg ; 43 + Printf.printf "[%s] ->\n%!" msg; 44 44 let r = f () in 45 - Printf.printf "[%s] <-\n%!" msg ; 45 + Printf.printf "[%s] <-\n%!" msg; 46 46 r 47 47 48 - let prime_pows_to_prod = mem @@ fun n -> 48 + let prime_pows_to_prod = 49 + mem @@ fun n -> 49 50 let rec scan acc = function 50 51 | p when p > n -> acc 51 - | p -> scan Z.(acc * (pow p (max_pow n p))) 52 - Z.(nextprime p) in 53 - note ~msg:"powers" @@ fun () -> 54 - scan Z.one Z.(of_int 2) 52 + | p -> scan Z.(acc * pow p (max_pow n p)) Z.(nextprime p) 53 + in 54 + note ~msg:"powers" @@ fun () -> scan Z.one Z.(of_int 2) 55 55 56 56 let split ~limit n = 57 57 let a = Nums.Z.gen n in ··· 61 61 let rec scan a m = 62 62 let x = Z.(powm a (m * n) n) in 63 63 if Z.(x = one) then 64 - if Z.(m mod of_int 2 = zero) then 65 - scan a Z.(m / of_int 2) 64 + if Z.(m mod of_int 2 = zero) then scan a Z.(m / of_int 2) 66 65 else raise Not_found 67 66 else 68 67 let d = Z.(gcd (x - one) n) in 69 68 if Z.(d > one) then d else raise Not_found 70 69 in 71 70 scan a (prime_pows_to_prod limit) 72 - 73 71 end 74 72 75 73 module RSA_misc = struct 76 - 77 74 let slack = 8 78 75 79 76 (* Rivest's p-minus strong prime generator. *) 80 77 81 78 let rec pm_strong_prime ?g ~bits = 82 - let a_lim = Z.(pow z_two slack - one) 83 - in 79 + let a_lim = Z.(pow z_two slack - one) in 84 80 let rec mul_seq p = function 85 81 | a when a > a_lim -> 86 82 Printf.printf "++ mul seq: falling off the cliff.\n%!"; 87 83 None 88 - | a -> 89 - let p' = Z.(a * p + one) in 84 + | a -> ( 85 + let p' = Z.((a * p) + one) in 90 86 match Z.probab_prime p' 25 with 91 87 | 0 -> 92 88 Printf.printf "+ mul seq: climb.\n%!"; 93 89 mul_seq p Z.(a + z_two) 94 90 | _ -> 95 91 Printf.printf "** mul seq: prime with %s\n%!" Z.(to_string a); 96 - Some p' 92 + Some p') 97 93 in 98 94 let pmm = prime ?g ~bits in 99 95 match mul_seq pmm z_two with 100 - | None -> pm_strong_prime ?g ~bits 101 - | Some pm -> 96 + | None -> pm_strong_prime ?g ~bits 97 + | Some pm -> ( 102 98 match mul_seq pm z_two with 103 - | None -> pm_strong_prime ?g ~bits 104 - | Some p -> (pmm, pm, p) 99 + | None -> pm_strong_prime ?g ~bits 100 + | Some p -> (pmm, pm, p)) 105 101 106 102 let slim = Z.(pow z_two 8) 107 103 108 104 (* Williams/Schmid strong prime generator. *) 109 105 110 106 let rec p_strong_prime1 ?g ~bits = 111 - let (bits1, bits2) = (bits / 2, bits - bits / 2) 112 - in 113 - let pmm = prime ?g ~bits:bits1 114 - and pp = prime ?g ~bits:bits2 in 115 - let r = Z.(pp - invert pmm pp) 116 - in 107 + let bits1, bits2 = (bits / 2, bits - (bits / 2)) in 108 + let pmm = prime ?g ~bits:bits1 and pp = prime ?g ~bits:bits2 in 109 + let r = Z.(pp - invert pmm pp) in 117 110 let rec find_a = function 118 111 | a when a >= slim -> 119 - Printf.printf "off the cliff...\n%!" ; 112 + Printf.printf "off the cliff...\n%!"; 120 113 p_strong_prime1 ?g ~bits 121 - | a -> 122 - let pm = Z.(z_two * a * pmm * pp + z_two * r * pmm + one) in 114 + | a -> ( 115 + let pm = Z.((z_two * a * pmm * pp) + (z_two * r * pmm) + one) in 123 116 match Z.probab_prime pm 25 with 124 117 | 0 -> find_a Z.(a + one) 125 - | _ -> 126 - let p = Z.(z_two * pm + one) in 118 + | _ -> ( 119 + let p = Z.((z_two * pm) + one) in 127 120 match Z.probab_prime p 25 with 128 121 | 0 -> find_a Z.(a + one) 129 122 | _ -> 130 123 Printf.printf "found pm, p with %s\n%!" Z.(to_string a); 131 - (pmm, pm, pp, p) 124 + (pmm, pm, pp, p))) 132 125 in 133 126 find_a z_two 134 - 135 127 end
+13 -18
tests/test_base.ml
··· 1 1 open OUnit2 2 - 3 2 open Crypto 4 - 5 3 open Test_common 6 4 7 5 (* Xor *) 8 6 9 7 let xor_cases = 10 - cases_of (f2_eq ~msg:"xor" Uncommon.xor) [ 11 - "00 01 02 03 04 05 06 07 08 09 0a 0b 0c" , 12 - "0c 0b 0a 09 08 07 06 05 04 03 02 01 00" , 13 - "0c 0a 08 0a 0c 02 00 02 0c 0a 08 0a 0c" ; 8 + cases_of 9 + (f2_eq ~msg:"xor" Uncommon.xor) 10 + [ 11 + ( "00 01 02 03 04 05 06 07 08 09 0a 0b 0c", 12 + "0c 0b 0a 09 08 07 06 05 04 03 02 01 00", 13 + "0c 0a 08 0a 0c 02 00 02 0c 0a 08 0a 0c" ); 14 + ( "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f", 15 + "0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00", 16 + "0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f" ); 17 + ("00", "00", "00"); 18 + ("", "", ""); 19 + ] 14 20 15 - "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" , 16 - "0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00" , 17 - "0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f" ; 18 - 19 - "00", "00", "00" ; 20 - 21 - "", "", "" ; 22 - ] 23 - 24 - let suite = [ 25 - "XOR" >::: [ "example" >::: xor_cases ]; 26 - ] 21 + let suite = [ "XOR" >::: [ "example" >::: xor_cases ] ]
+632 -586
tests/test_cipher.ml
··· 1 1 open OUnit2 2 - 3 2 open Crypto 4 - 5 3 open Test_common 6 4 7 5 let des_ecb_cases = 8 - let case ~data ~key ~out = vx data, DES.ECB.of_secret (vx key), vx out 9 - 6 + let case ~data ~key ~out = (vx data, DES.ECB.of_secret (vx key), vx out) 10 7 and check (data, key, out) _ = 11 8 let enc = DES.ECB.encrypt ~key data in 12 9 let dec = DES.ECB.decrypt ~key enc in 13 - assert_oct_equal ~msg:"ciphertext" out enc ; 14 - assert_oct_equal ~msg:"plaintext" data dec in 10 + assert_oct_equal ~msg:"ciphertext" out enc; 11 + assert_oct_equal ~msg:"plaintext" data dec 12 + in 15 13 16 - cases_of check [ 17 - case 18 - ~data:"3f87 9123 0058 8d88 e784 d52a 5d0f 2038 19 - f523 6889 bbce ce1f a7bf 7aa8 6fcc 8245 20 - 0576 2144 8f11 94d7 07bc 1bba 9b92 5e45 21 - 3190 c42b 758f 3d91 f68e ebbb ce62 b8e7" 22 - ~key: "3f47 f79c c120 7188 4700 217e fd88 bbe4 6f51 27fb 7340 81e5" 23 - ~out: "b43b 3ae3 d765 b299 06ea 7c35 ceeb 9e52 24 - 946c 06e7 0d50 193e 5a22 1ff0 afe9 abe0 25 - 3b82 ce7d c42a 465d 0f19 45f0 5382 7006 26 - b4cd 21f0 5b0f 6843 de2a 67b6 9fb4 6a8f" 27 - ] 14 + cases_of check 15 + [ 16 + case 17 + ~data: 18 + "3f87 9123 0058 8d88 e784 d52a 5d0f 2038\n\ 19 + \ f523 6889 bbce ce1f a7bf 7aa8 6fcc 8245\n\ 20 + \ 0576 2144 8f11 94d7 07bc 1bba 9b92 5e45\n\ 21 + \ 3190 c42b 758f 3d91 f68e ebbb ce62 b8e7" 22 + ~key:"3f47 f79c c120 7188 4700 217e fd88 bbe4 6f51 27fb 7340 81e5" 23 + ~out: 24 + "b43b 3ae3 d765 b299 06ea 7c35 ceeb 9e52\n\ 25 + \ 946c 06e7 0d50 193e 5a22 1ff0 afe9 abe0\n\ 26 + \ 3b82 ce7d c42a 465d 0f19 45f0 5382 7006\n\ 27 + \ b4cd 21f0 5b0f 6843 de2a 67b6 9fb4 6a8f"; 28 + ] 28 29 29 30 let des_cbc_cases = 30 - let case ~data ~key ~iv ~out = vx data, DES.CBC.of_secret (vx key), vx iv, vx out 31 - 31 + let case ~data ~key ~iv ~out = 32 + (vx data, DES.CBC.of_secret (vx key), vx iv, vx out) 32 33 and check (data, key, iv, out) _ = 33 34 let enc = DES.CBC.encrypt ~key ~iv data in 34 35 let dec = DES.CBC.decrypt ~key ~iv enc in 35 - assert_oct_equal ~msg:"ciphertext" out enc ; 36 - assert_oct_equal ~msg:"plaintext" data dec in 36 + assert_oct_equal ~msg:"ciphertext" out enc; 37 + assert_oct_equal ~msg:"plaintext" data dec 38 + in 37 39 38 - cases_of check [ 39 - case 40 - ~data: 41 - "8f8c 1e0a c8fb 1614 3cec ed1c 28ac fd6f 42 - ae6d 3686 5365 511d 6707 68d9 7928 0479 43 - cacd 6808 1540 d5fc 2971 2a8a c2b1 17c2 44 - f0e6 a329 e190 44ff 54e7 5eec 8296 6a58" 45 - ~iv:"b219 ef93 4c37 aadf" 46 - ~key:"7ecd 2240 a2ac a10a e713 f467 7ea5 d327 e04c cfe0 5cb4 bb09" 47 - ~out: 48 - "3110 3904 faa1 4ef4 e404 d3d0 f2ee ae58 49 - 5fe9 e6b7 9552 b4f4 3608 03ca 395a f6e9 50 - 2330 69d6 2c6f a52a d083 faab 3306 b794 51 - 89f6 6671 e3dd 3368 0b13 f8d9 7136 9674" 52 - ] 40 + cases_of check 41 + [ 42 + case 43 + ~data: 44 + "8f8c 1e0a c8fb 1614 3cec ed1c 28ac fd6f\n\ 45 + ae6d 3686 5365 511d 6707 68d9 7928 0479\n\ 46 + cacd 6808 1540 d5fc 2971 2a8a c2b1 17c2\n\ 47 + f0e6 a329 e190 44ff 54e7 5eec 8296 6a58" 48 + ~iv:"b219 ef93 4c37 aadf" 49 + ~key:"7ecd 2240 a2ac a10a e713 f467 7ea5 d327 e04c cfe0 5cb4 bb09" 50 + ~out: 51 + "3110 3904 faa1 4ef4 e404 d3d0 f2ee ae58\n\ 52 + 5fe9 e6b7 9552 b4f4 3608 03ca 395a f6e9\n\ 53 + 2330 69d6 2c6f a52a d083 faab 3306 b794\n\ 54 + 89f6 6671 e3dd 3368 0b13 f8d9 7136 9674"; 55 + ] 53 56 54 57 let des_ctr_cases = 55 - let case ~data ~key ~ctr ~out = test_case @@ fun _ -> 58 + let case ~data ~key ~ctr ~out = 59 + test_case @@ fun _ -> 56 60 let open DES.CTR in 57 - let key = vx key |> of_secret 58 - and ctr = vx ctr |> ctr_of_octets 59 - and out = vx out 61 + let key = vx key |> of_secret 62 + and ctr = vx ctr |> ctr_of_octets 63 + and out = vx out 60 64 and data = vx data in 61 65 let enc = encrypt ~key ~ctr data in 62 66 let dec = decrypt ~key ~ctr enc in 63 67 assert_oct_equal ~msg:"cipher" out enc; 64 68 assert_oct_equal ~msg:"plain" data dec 65 69 in 66 - [ case 70 + [ 71 + case 67 72 ~data: 68 - "e9ee ce61 7b75 4c70 79f3 3e5b 036a 7d5b 69 - 4bee f693 0eb3 fa50 9fe3 61d8 713a a487 70 - a692 21b0 8627 5e6f d021 4030 7c58 507a 71 - 5fea ca64 d17d a493 7337 8c17 ae05 f3c4 72 - c6dc 15cc 49c4 3ab0 dab3 9c9b e964 a3c8 73 - 5865 7bb8 6e4d 8507 3866 b805 02c2 4970 74 - dbbd 3554 20b1 76b2 ee6c 98b3 f7ce 9035 75 - 1e5f 880e" 76 - ~key:"76b9 d4ff d52f 5024 6d24 a3e1 4ebd e605 b82c d81f 0c07 2da1" 77 - ~ctr:"6318 a132 cafd aac0" 78 - ~out: 79 - "b8d8 aeec d583 009c f042 ec4d 7ddf c5e5 80 - 386f 89e6 d975 02bc 7583 e113 4899 dabc 81 - bd93 871b 774b e5ce 4e12 6778 f208 0c53 82 - 52cb a3ac 7567 cdb9 ae81 fc46 25d4 7f9d 83 - 6f3f fbec 4512 8845 3739 1014 2b39 d293 84 - 845a 8505 91a6 f644 5168 bf00 ca4d 4603 85 - 6e5f 418f c43f fabd 272e 1009 c69b 2a6b 86 - 7d2c edb2" 87 - 73 + "e9ee ce61 7b75 4c70 79f3 3e5b 036a 7d5b\n\ 74 + 4bee f693 0eb3 fa50 9fe3 61d8 713a a487\n\ 75 + a692 21b0 8627 5e6f d021 4030 7c58 507a\n\ 76 + 5fea ca64 d17d a493 7337 8c17 ae05 f3c4\n\ 77 + c6dc 15cc 49c4 3ab0 dab3 9c9b e964 a3c8\n\ 78 + 5865 7bb8 6e4d 8507 3866 b805 02c2 4970\n\ 79 + dbbd 3554 20b1 76b2 ee6c 98b3 f7ce 9035\n\ 80 + 1e5f 880e" 81 + ~key:"76b9 d4ff d52f 5024 6d24 a3e1 4ebd e605 b82c d81f 0c07 2da1" 82 + ~ctr:"6318 a132 cafd aac0" 83 + ~out: 84 + "b8d8 aeec d583 009c f042 ec4d 7ddf c5e5\n\ 85 + 386f 89e6 d975 02bc 7583 e113 4899 dabc\n\ 86 + bd93 871b 774b e5ce 4e12 6778 f208 0c53\n\ 87 + 52cb a3ac 7567 cdb9 ae81 fc46 25d4 7f9d\n\ 88 + 6f3f fbec 4512 8845 3739 1014 2b39 d293\n\ 89 + 845a 8505 91a6 f644 5168 bf00 ca4d 4603\n\ 90 + 6e5f 418f c43f fabd 272e 1009 c69b 2a6b\n\ 91 + 7d2c edb2"; 88 92 ] 89 93 90 - 91 94 (* NIST SP 800-38A test vectors for block cipher modes of operation *) 92 95 93 - let nist_sp_800_38a = vx 94 - "6b c1 be e2 2e 40 9f 96 e9 3d 7e 11 73 93 17 2a 95 - ae 2d 8a 57 1e 03 ac 9c 9e b7 6f ac 45 af 8e 51 96 - 30 c8 1c 46 a3 5c e4 11 e5 fb c1 19 1a 0a 52 ef 97 - f6 9f 24 45 df 4f 9b 17 ad 2b 41 7b e6 6c 37 10" 96 + let nist_sp_800_38a = 97 + vx 98 + "6b c1 be e2 2e 40 9f 96 e9 3d 7e 11 73 93 17 2a\n\ 99 + \ ae 2d 8a 57 1e 03 ac 9c 9e b7 6f ac 45 af 8e 51\n\ 100 + \ 30 c8 1c 46 a3 5c e4 11 e5 fb c1 19 1a 0a 52 ef\n\ 101 + \ f6 9f 24 45 df 4f 9b 17 ad 2b 41 7b e6 6c 37 10" 98 102 99 103 let aes_ecb_cases = 100 104 let case ~key ~out = (AES.ECB.of_secret (vx key), vx out) 101 - 102 105 and check (key, out) _ = 103 106 let enc = AES.ECB.encrypt ~key nist_sp_800_38a in 104 107 let dec = AES.ECB.decrypt ~key enc in 105 - assert_oct_equal ~msg:"ciphertext" out enc ; 106 - assert_oct_equal ~msg:"plaintext" nist_sp_800_38a dec in 108 + assert_oct_equal ~msg:"ciphertext" out enc; 109 + assert_oct_equal ~msg:"plaintext" nist_sp_800_38a dec 110 + in 107 111 108 - cases_of check [ 109 - case ~key: "2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c" 110 - ~out: "3a d7 7b b4 0d 7a 36 60 a8 9e ca f3 24 66 ef 97 111 - f5 d3 d5 85 03 b9 69 9d e7 85 89 5a 96 fd ba af 112 - 43 b1 cd 7f 59 8e ce 23 88 1b 00 e3 ed 03 06 88 113 - 7b 0c 78 5e 27 e8 ad 3f 82 23 20 71 04 72 5d d4" 114 - 115 - ; case ~key: "8e 73 b0 f7 da 0e 64 52 c8 10 f3 2b 80 90 79 e5 116 - 62 f8 ea d2 52 2c 6b 7b" 117 - ~out: "bd 33 4f 1d 6e 45 f2 5f f7 12 a2 14 57 1f a5 cc 118 - 97 41 04 84 6d 0a d3 ad 77 34 ec b3 ec ee 4e ef 119 - ef 7a fd 22 70 e2 e6 0a dc e0 ba 2f ac e6 44 4e 120 - 9a 4b 41 ba 73 8d 6c 72 fb 16 69 16 03 c1 8e 0e" 121 - 122 - ; case ~key: "60 3d eb 10 15 ca 71 be 2b 73 ae f0 85 7d 77 81 123 - 1f 35 2c 07 3b 61 08 d7 2d 98 10 a3 09 14 df f4" 124 - ~out: "f3 ee d1 bd b5 d2 a0 3c 06 4b 5a 7e 3d b1 81 f8 125 - 59 1c cb 10 d4 10 ed 26 dc 5b a7 4a 31 36 28 70 126 - b6 ed 21 b9 9c a6 f4 f9 f1 53 e7 b1 be af ed 1d 127 - 23 30 4b 7a 39 f9 f3 ff 06 7d 8d 8f 9e 24 ec c7" 128 - ] 112 + cases_of check 113 + [ 114 + case ~key:"2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c" 115 + ~out: 116 + "3a d7 7b b4 0d 7a 36 60 a8 9e ca f3 24 66 ef 97\n\ 117 + \ f5 d3 d5 85 03 b9 69 9d e7 85 89 5a 96 fd ba af\n\ 118 + \ 43 b1 cd 7f 59 8e ce 23 88 1b 00 e3 ed 03 06 88\n\ 119 + \ 7b 0c 78 5e 27 e8 ad 3f 82 23 20 71 04 72 5d d4"; 120 + case 121 + ~key: 122 + "8e 73 b0 f7 da 0e 64 52 c8 10 f3 2b 80 90 79 e5\n\ 123 + \ 62 f8 ea d2 52 2c 6b 7b" 124 + ~out: 125 + "bd 33 4f 1d 6e 45 f2 5f f7 12 a2 14 57 1f a5 cc\n\ 126 + \ 97 41 04 84 6d 0a d3 ad 77 34 ec b3 ec ee 4e ef\n\ 127 + \ ef 7a fd 22 70 e2 e6 0a dc e0 ba 2f ac e6 44 4e\n\ 128 + \ 9a 4b 41 ba 73 8d 6c 72 fb 16 69 16 03 c1 8e 0e"; 129 + case 130 + ~key: 131 + "60 3d eb 10 15 ca 71 be 2b 73 ae f0 85 7d 77 81\n\ 132 + \ 1f 35 2c 07 3b 61 08 d7 2d 98 10 a3 09 14 df f4" 133 + ~out: 134 + "f3 ee d1 bd b5 d2 a0 3c 06 4b 5a 7e 3d b1 81 f8\n\ 135 + \ 59 1c cb 10 d4 10 ed 26 dc 5b a7 4a 31 36 28 70\n\ 136 + \ b6 ed 21 b9 9c a6 f4 f9 f1 53 e7 b1 be af ed 1d\n\ 137 + \ 23 30 4b 7a 39 f9 f3 ff 06 7d 8d 8f 9e 24 ec c7"; 138 + ] 129 139 130 140 let aes_cbc_cases = 131 141 let case ~key ~iv ~out = (AES.CBC.of_secret (vx key), vx iv, vx out) 132 - 133 142 and check (key, iv, out) _ = 134 143 let enc = AES.CBC.encrypt ~key ~iv nist_sp_800_38a in 135 144 let dec = AES.CBC.decrypt ~key ~iv enc in 136 - assert_oct_equal ~msg:"ciphertext" out enc ; 137 - assert_oct_equal ~msg:"plaintext" nist_sp_800_38a dec in 138 - 139 - cases_of check [ 140 - case ~key: "2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c" 141 - ~iv: "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" 142 - ~out: "76 49 ab ac 81 19 b2 46 ce e9 8e 9b 12 e9 19 7d 143 - 50 86 cb 9b 50 72 19 ee 95 db 11 3a 91 76 78 b2 144 - 73 be d6 b8 e3 c1 74 3b 71 16 e6 9e 22 22 95 16 145 - 3f f1 ca a1 68 1f ac 09 12 0e ca 30 75 86 e1 a7" 146 - 147 - ; case ~key: "8e 73 b0 f7 da 0e 64 52 c8 10 f3 2b 80 90 79 e5 148 - 62 f8 ea d2 52 2c 6b 7b" 149 - ~iv: "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" 150 - ~out: "4f 02 1d b2 43 bc 63 3d 71 78 18 3a 9f a0 71 e8 151 - b4 d9 ad a9 ad 7d ed f4 e5 e7 38 76 3f 69 14 5a 152 - 57 1b 24 20 12 fb 7a e0 7f a9 ba ac 3d f1 02 e0 153 - 08 b0 e2 79 88 59 88 81 d9 20 a9 e6 4f 56 15 cd" 145 + assert_oct_equal ~msg:"ciphertext" out enc; 146 + assert_oct_equal ~msg:"plaintext" nist_sp_800_38a dec 147 + in 154 148 155 - ; case ~key: "60 3d eb 10 15 ca 71 be 2b 73 ae f0 85 7d 77 81 156 - 1f 35 2c 07 3b 61 08 d7 2d 98 10 a3 09 14 df f4" 157 - ~iv: "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" 158 - ~out: "f5 8c 4c 04 d6 e5 f1 ba 77 9e ab fb 5f 7b fb d6 159 - 9c fc 4e 96 7e db 80 8d 67 9f 77 7b c6 70 2c 7d 160 - 39 f2 33 69 a9 d9 ba cf a5 30 e2 63 04 23 14 61 161 - b2 eb 05 e2 c3 9b e9 fc da 6c 19 07 8c 6a 9d 1b" 162 - ] 149 + cases_of check 150 + [ 151 + case ~key:"2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c" 152 + ~iv:"00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" 153 + ~out: 154 + "76 49 ab ac 81 19 b2 46 ce e9 8e 9b 12 e9 19 7d\n\ 155 + \ 50 86 cb 9b 50 72 19 ee 95 db 11 3a 91 76 78 b2\n\ 156 + \ 73 be d6 b8 e3 c1 74 3b 71 16 e6 9e 22 22 95 16\n\ 157 + \ 3f f1 ca a1 68 1f ac 09 12 0e ca 30 75 86 e1 a7"; 158 + case 159 + ~key: 160 + "8e 73 b0 f7 da 0e 64 52 c8 10 f3 2b 80 90 79 e5\n\ 161 + \ 62 f8 ea d2 52 2c 6b 7b" 162 + ~iv:"00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" 163 + ~out: 164 + "4f 02 1d b2 43 bc 63 3d 71 78 18 3a 9f a0 71 e8\n\ 165 + \ b4 d9 ad a9 ad 7d ed f4 e5 e7 38 76 3f 69 14 5a\n\ 166 + \ 57 1b 24 20 12 fb 7a e0 7f a9 ba ac 3d f1 02 e0\n\ 167 + \ 08 b0 e2 79 88 59 88 81 d9 20 a9 e6 4f 56 15 cd"; 168 + case 169 + ~key: 170 + "60 3d eb 10 15 ca 71 be 2b 73 ae f0 85 7d 77 81\n\ 171 + \ 1f 35 2c 07 3b 61 08 d7 2d 98 10 a3 09 14 df f4" 172 + ~iv:"00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" 173 + ~out: 174 + "f5 8c 4c 04 d6 e5 f1 ba 77 9e ab fb 5f 7b fb d6\n\ 175 + \ 9c fc 4e 96 7e db 80 8d 67 9f 77 7b c6 70 2c 7d\n\ 176 + \ 39 f2 33 69 a9 d9 ba cf a5 30 e2 63 04 23 14 61\n\ 177 + \ b2 eb 05 e2 c3 9b e9 fc da 6c 19 07 8c 6a 9d 1b"; 178 + ] 163 179 164 180 let aes_ctr_cases = 165 - let case ~key ~ctr ~out ~ctr1 = test_case @@ fun _ -> 181 + let case ~key ~ctr ~out ~ctr1 = 182 + test_case @@ fun _ -> 166 183 let open AES.CTR in 167 - let key = vx key |> of_secret 168 - and ctr = vx ctr |> ctr_of_octets 184 + let key = vx key |> of_secret 185 + and ctr = vx ctr |> ctr_of_octets 169 186 and ctr1 = vx ctr1 |> ctr_of_octets 170 - and out = vx out in 187 + and out = vx out in 171 188 let enc = encrypt ~key ~ctr nist_sp_800_38a in 172 189 let dec = decrypt ~key ~ctr enc in 173 190 assert_oct_equal ~msg:"cipher" out enc; ··· 175 192 let blocks = String.length nist_sp_800_38a / block_size in 176 193 assert_equal ~msg:"counters" ctr1 (add_ctr ctr (Int64.of_int blocks)) 177 194 in 178 - [ case ~key: "2b7e1516 28aed2a6 abf71588 09cf4f3c" 179 - ~ctr: "f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff" 180 - ~out: "874d6191 b620e326 1bef6864 990db6ce 181 - 9806f66b 7970fdff 8617187b b9fffdff 182 - 5ae4df3e dbd5d35e 5b4f0902 0db03eab 183 - 1e031dda 2fbe03d1 792170a0 f3009cee" 184 - ~ctr1: "f0f1f2f3 f4f5f6f7 f8f9fafb fcfdff03" 185 - 186 - ; case ~key: "8e73b0f7 da0e6452 c810f32b 809079e5 187 - 62f8ead2 522c6b7b" 188 - ~ctr: "f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff" 189 - ~out: "1abc9324 17521ca2 4f2b0459 fe7e6e0b 190 - 090339ec 0aa6faef d5ccc2c6 f4ce8e94 191 - 1e36b26b d1ebc670 d1bd1d66 5620abf7 192 - 4f78a7f6 d2980958 5a97daec 58c6b050" 193 - ~ctr1: "f0f1f2f3 f4f5f6f7 f8f9fafb fcfdff03" 194 - 195 - ; case ~key: "603deb10 15ca71be 2b73aef0 857d7781 196 - 1f352c07 3b6108d7 2d9810a3 0914dff4" 197 - ~ctr: "f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff" 198 - ~out: "601ec313 775789a5 b7a7f504 bbf3d228 199 - f443e3ca 4d62b59a ca84e990 cacaf5c5 200 - 2b0930da a23de94c e87017ba 2d84988d 201 - dfc9c58d b67aada6 13c2dd08 457941a6" 202 - ~ctr1: "f0f1f2f3 f4f5f6f7 f8f9fafb fcfdff03" 203 - 204 - ; case ~key: "00010203 04050607 08090a0b 0c0d0e0f" (* ctr rollover *) 205 - ~ctr: "00000000 00000000 ffffffff fffffffe" 206 - ~out: "5d0a5645 378f579a 988ff186 d42eaa2f 207 - 978a655d 145bfe34 21656c8f 01101a43 208 - 23d0862c 47f7e3bf 95586ba4 2ab4cb31 209 - 790b0d01 93c0d022 3469534e 537ce82d" 210 - ~ctr1: "00000000 00000001 00000000 00000002" 195 + [ 196 + case ~key:"2b7e1516 28aed2a6 abf71588 09cf4f3c" 197 + ~ctr:"f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff" 198 + ~out: 199 + "874d6191 b620e326 1bef6864 990db6ce\n\ 200 + \ 9806f66b 7970fdff 8617187b b9fffdff\n\ 201 + \ 5ae4df3e dbd5d35e 5b4f0902 0db03eab\n\ 202 + \ 1e031dda 2fbe03d1 792170a0 f3009cee" 203 + ~ctr1:"f0f1f2f3 f4f5f6f7 f8f9fafb fcfdff03"; 204 + case 205 + ~key: 206 + "8e73b0f7 da0e6452 c810f32b 809079e5\n\ 207 + \ 62f8ead2 522c6b7b" 208 + ~ctr:"f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff" 209 + ~out: 210 + "1abc9324 17521ca2 4f2b0459 fe7e6e0b\n\ 211 + \ 090339ec 0aa6faef d5ccc2c6 f4ce8e94\n\ 212 + \ 1e36b26b d1ebc670 d1bd1d66 5620abf7\n\ 213 + \ 4f78a7f6 d2980958 5a97daec 58c6b050" 214 + ~ctr1:"f0f1f2f3 f4f5f6f7 f8f9fafb fcfdff03"; 215 + case 216 + ~key: 217 + "603deb10 15ca71be 2b73aef0 857d7781\n\ 218 + \ 1f352c07 3b6108d7 2d9810a3 0914dff4" 219 + ~ctr:"f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff" 220 + ~out: 221 + "601ec313 775789a5 b7a7f504 bbf3d228\n\ 222 + \ f443e3ca 4d62b59a ca84e990 cacaf5c5\n\ 223 + \ 2b0930da a23de94c e87017ba 2d84988d\n\ 224 + \ dfc9c58d b67aada6 13c2dd08 457941a6" 225 + ~ctr1:"f0f1f2f3 f4f5f6f7 f8f9fafb fcfdff03"; 226 + case ~key:"00010203 04050607 08090a0b 0c0d0e0f" (* ctr rollover *) 227 + ~ctr:"00000000 00000000 ffffffff fffffffe" 228 + ~out: 229 + "5d0a5645 378f579a 988ff186 d42eaa2f\n\ 230 + \ 978a655d 145bfe34 21656c8f 01101a43\n\ 231 + \ 23d0862c 47f7e3bf 95586ba4 2ab4cb31\n\ 232 + \ 790b0d01 93c0d022 3469534e 537ce82d" 233 + ~ctr1:"00000000 00000001 00000000 00000002"; 211 234 ] 212 235 213 236 (* aes gcm *) 214 237 215 238 let gcm_cases = 216 239 let case ~key ~p ~a ~nonce ~c ~t = 217 - (AES.GCM.of_secret (vx key), vx p, vx a, vx nonce, vx c, vx t) in 240 + (AES.GCM.of_secret (vx key), vx p, vx a, vx nonce, vx c, vx t) 241 + in 218 242 219 243 let check (key, p, adata, nonce, c, t) _ = 220 244 let cipher = AES.GCM.authenticate_encrypt ~key ~nonce ~adata p in ··· 223 247 | None -> assert_failure "GCM decryption broken" 224 248 | Some data -> data 225 249 in 226 - assert_oct_equal ~msg:"ciphertext" (c ^ t) cipher ; 250 + assert_oct_equal ~msg:"ciphertext" (c ^ t) cipher; 227 251 assert_oct_equal ~msg:"decrypted plaintext" p pdata 228 252 in 229 253 230 - cases_of check [ 231 - 232 - case ~key: "00000000000000000000000000000000" 233 - ~p: "" 234 - ~a: "" 235 - ~nonce: "000000000000000000000000" 236 - ~c: "" 237 - ~t: "58e2fccefa7e3061367f1d57a4e7455a" ; 238 - case ~key: "00000000000000000000000000000000" 239 - ~p: "00000000000000000000000000000000" 240 - ~a: "" 241 - ~nonce: "000000000000000000000000" 242 - ~c: "0388dace60b6a392f328c2b971b2fe78" 243 - ~t: "ab6e47d42cec13bdf53a67b21257bddf" ; 244 - case ~key: "feffe9928665731c6d6a8f9467308308" 245 - ~p: "d9313225f88406e5a55909c5aff5269a 246 - 86a7a9531534f7da2e4c303d8a318a72 247 - 1c3c0c95956809532fcf0e2449a6b525 248 - b16aedf5aa0de657ba637b391aafd255" 249 - ~a: "" 250 - ~nonce: "cafebabefacedbaddecaf888" 251 - ~c: "42831ec2217774244b7221b784d0d49c 252 - e3aa212f2c02a4e035c17e2329aca12e 253 - 21d514b25466931c7d8f6a5aac84aa05 254 - 1ba30b396a0aac973d58e091473f5985" 255 - ~t: "4d5c2af327cd64a62cf35abd2ba6fab4" ; 256 - case ~key: "feffe9928665731c6d6a8f9467308308" 257 - ~p: "d9313225f88406e5a55909c5aff5269a 258 - 86a7a9531534f7da2e4c303d8a318a72 259 - 1c3c0c95956809532fcf0e2449a6b525 260 - b16aedf5aa0de657ba637b39" 261 - ~a: "feedfacedeadbeeffeedfacedeadbeef 262 - abaddad2" 263 - ~nonce: "cafebabefacedbaddecaf888" 264 - ~c: "42831ec2217774244b7221b784d0d49c 265 - e3aa212f2c02a4e035c17e2329aca12e 266 - 21d514b25466931c7d8f6a5aac84aa05 267 - 1ba30b396a0aac973d58e091" 268 - ~t: "5bc94fbc3221a5db94fae95ae7121a47" ; 269 - case ~key: "feffe9928665731c6d6a8f9467308308" 270 - ~p: "d9313225f88406e5a55909c5aff5269a 271 - 86a7a9531534f7da2e4c303d8a318a72 272 - 1c3c0c95956809532fcf0e2449a6b525 273 - b16aedf5aa0de657ba637b39" 274 - ~a: "feedfacedeadbeeffeedfacedeadbeef 275 - abaddad2" 276 - ~nonce: "cafebabefacedbad" 277 - ~c: "61353b4c2806934a777ff51fa22a4755 278 - 699b2a714fcdc6f83766e5f97b6c7423 279 - 73806900e49f24b22b097544d4896b42 280 - 4989b5e1ebac0f07c23f4598" 281 - ~t: "3612d2e79e3b0785561be14aaca2fccb" ; 282 - case ~key: "feffe9928665731c6d6a8f9467308308" 283 - ~p: "d9313225f88406e5a55909c5aff5269a 284 - 86a7a9531534f7da2e4c303d8a318a72 285 - 1c3c0c95956809532fcf0e2449a6b525 286 - b16aedf5aa0de657ba637b39" 287 - ~a: "feedfacedeadbeeffeedfacedeadbeef 288 - abaddad2" 289 - ~nonce: "9313225df88406e555909c5aff5269aa 290 - 6a7a9538534f7da1e4c303d2a318a728 291 - c3c0c95156809539fcf0e2429a6b5254 292 - 16aedbf5a0de6a57a637b39b" 293 - ~c: "8ce24998625615b603a033aca13fb894 294 - be9112a5c3a211a8ba262a3cca7e2ca7 295 - 01e4a9a4fba43c90ccdcb281d48c7c6f 296 - d62875d2aca417034c34aee5" 297 - ~t: "619cc5aefffe0bfa462af43c1699d050" ; 298 - case ~key: "feffe9928665731c6d6a8f9467308308 299 - feffe9928665731c" 300 - ~p: "d9313225f88406e5a55909c5aff5269a 301 - 86a7a9531534f7da2e4c303d8a318a72 302 - 1c3c0c95956809532fcf0e2449a6b525 303 - b16aedf5aa0de657ba637b39" 304 - ~a: "feedfacedeadbeeffeedfacedeadbeef 305 - abaddad2" 306 - ~nonce: "cafebabefacedbaddecaf888" 307 - ~c: "3980ca0b3c00e841eb06fac4872a2757 308 - 859e1ceaa6efd984628593b40ca1e19c 309 - 7d773d00c144c525ac619d18c84a3f47 310 - 18e2448b2fe324d9ccda2710" 311 - ~t: "2519498e80f1478f37ba55bd6d27618c" ; 312 - case ~key: "feffe9928665731c6d6a8f9467308308 313 - feffe9928665731c6d6a8f9467308308" 314 - ~p: "d9313225f88406e5a55909c5aff5269a 315 - 86a7a9531534f7da2e4c303d8a318a72 316 - 1c3c0c95956809532fcf0e2449a6b525 317 - b16aedf5aa0de657ba637b39" 318 - ~a: "feedfacedeadbeeffeedfacedeadbeef 319 - abaddad2" 320 - ~nonce: "9313225df88406e555909c5aff5269aa 321 - 6a7a9538534f7da1e4c303d2a318a728 322 - c3c0c95156809539fcf0e2429a6b5254 323 - 16aedbf5a0de6a57a637b39b" 324 - ~c: "5a8def2f0c9e53f1f75d7853659e2a20 325 - eeb2b22aafde6419a058ab4f6f746bf4 326 - 0fc0c3b780f244452da3ebf1c5d82cde 327 - a2418997200ef82e44ae7e3f" 328 - ~t: "a44a8266ee1c8eb0c8b5d4cf5ae9f19a"; 329 - case ~key: "00000000000000000000000000000000" (* large GHASH batch *) 330 - ~p: "" 331 - ~a: "f0f0f0f0f0f0f0f00f0f0f0f0f0f0f0f 332 - e0e0e0e0e0e0e0e00e0e0e0e0e0e0e0e 333 - d0d0d0d0d0d0d0d00d0d0d0d0d0d0d0d 334 - c0c0c0c0c0c0c0c00c0c0c0c0c0c0c0c 335 - b0b0b0b0b0b0b0b00b0b0b0b0b0b0b0b 336 - a0a0a0a0a0a0a0a00a0a0a0a0a0a0a0a 337 - 90909090909090900909090909090909 338 - 80808080808080800808080808080808 339 - 70707070707070700707070707070707 340 - 60606060606060600606060606060606 341 - 50505050505050500505050505050505 342 - 40404040404040400404040404040404 343 - 30303030303030300303030303030303 344 - 20202020202020200202020202020202 345 - 10101010101010100101010101010101 346 - 00000000000000000000000000000000 347 - ff" 348 - ~nonce: "000000000000000000000000" 349 - ~c: "" 350 - ~t: "9bfdb8fdac1be65739780c41703c0fb6"; 351 - case ~key: "00000000000000000000000000000002" (* ctr rollover *) 352 - ~nonce: "3222415d" 353 - ~p: "deadbeefdeadbeefdeadbeefdeadbeef 354 - deadbeefdeadbeefdeadbeefdeadbeef 355 - deadbeef" 356 - ~a: "" 357 - ~c: "42627ce3de61b5c105c7f01629c031c1 358 - b890bb273b6b6bc26b56c801f87fa95c 359 - a8b37503" 360 - ~t: "3631cbe44782713b93b1c7d93c3c8638" 361 - ] 362 - 254 + cases_of check 255 + [ 256 + case ~key:"00000000000000000000000000000000" ~p:"" ~a:"" 257 + ~nonce:"000000000000000000000000" ~c:"" 258 + ~t:"58e2fccefa7e3061367f1d57a4e7455a"; 259 + case ~key:"00000000000000000000000000000000" 260 + ~p:"00000000000000000000000000000000" ~a:"" 261 + ~nonce:"000000000000000000000000" ~c:"0388dace60b6a392f328c2b971b2fe78" 262 + ~t:"ab6e47d42cec13bdf53a67b21257bddf"; 263 + case ~key:"feffe9928665731c6d6a8f9467308308" 264 + ~p: 265 + "d9313225f88406e5a55909c5aff5269a\n\ 266 + \ 86a7a9531534f7da2e4c303d8a318a72\n\ 267 + \ 1c3c0c95956809532fcf0e2449a6b525\n\ 268 + \ b16aedf5aa0de657ba637b391aafd255" 269 + ~a:"" ~nonce:"cafebabefacedbaddecaf888" 270 + ~c: 271 + "42831ec2217774244b7221b784d0d49c\n\ 272 + \ e3aa212f2c02a4e035c17e2329aca12e\n\ 273 + \ 21d514b25466931c7d8f6a5aac84aa05\n\ 274 + \ 1ba30b396a0aac973d58e091473f5985" 275 + ~t:"4d5c2af327cd64a62cf35abd2ba6fab4"; 276 + case ~key:"feffe9928665731c6d6a8f9467308308" 277 + ~p: 278 + "d9313225f88406e5a55909c5aff5269a\n\ 279 + \ 86a7a9531534f7da2e4c303d8a318a72\n\ 280 + \ 1c3c0c95956809532fcf0e2449a6b525\n\ 281 + \ b16aedf5aa0de657ba637b39" 282 + ~a:"feedfacedeadbeeffeedfacedeadbeef\n abaddad2" 283 + ~nonce:"cafebabefacedbaddecaf888" 284 + ~c: 285 + "42831ec2217774244b7221b784d0d49c\n\ 286 + \ e3aa212f2c02a4e035c17e2329aca12e\n\ 287 + \ 21d514b25466931c7d8f6a5aac84aa05\n\ 288 + \ 1ba30b396a0aac973d58e091" 289 + ~t:"5bc94fbc3221a5db94fae95ae7121a47"; 290 + case ~key:"feffe9928665731c6d6a8f9467308308" 291 + ~p: 292 + "d9313225f88406e5a55909c5aff5269a\n\ 293 + \ 86a7a9531534f7da2e4c303d8a318a72\n\ 294 + \ 1c3c0c95956809532fcf0e2449a6b525\n\ 295 + \ b16aedf5aa0de657ba637b39" 296 + ~a:"feedfacedeadbeeffeedfacedeadbeef\n abaddad2" 297 + ~nonce:"cafebabefacedbad" 298 + ~c: 299 + "61353b4c2806934a777ff51fa22a4755\n\ 300 + \ 699b2a714fcdc6f83766e5f97b6c7423\n\ 301 + \ 73806900e49f24b22b097544d4896b42\n\ 302 + \ 4989b5e1ebac0f07c23f4598" 303 + ~t:"3612d2e79e3b0785561be14aaca2fccb"; 304 + case ~key:"feffe9928665731c6d6a8f9467308308" 305 + ~p: 306 + "d9313225f88406e5a55909c5aff5269a\n\ 307 + \ 86a7a9531534f7da2e4c303d8a318a72\n\ 308 + \ 1c3c0c95956809532fcf0e2449a6b525\n\ 309 + \ b16aedf5aa0de657ba637b39" 310 + ~a:"feedfacedeadbeeffeedfacedeadbeef\n abaddad2" 311 + ~nonce: 312 + "9313225df88406e555909c5aff5269aa\n\ 313 + \ 6a7a9538534f7da1e4c303d2a318a728\n\ 314 + \ c3c0c95156809539fcf0e2429a6b5254\n\ 315 + \ 16aedbf5a0de6a57a637b39b" 316 + ~c: 317 + "8ce24998625615b603a033aca13fb894\n\ 318 + \ be9112a5c3a211a8ba262a3cca7e2ca7\n\ 319 + \ 01e4a9a4fba43c90ccdcb281d48c7c6f\n\ 320 + \ d62875d2aca417034c34aee5" 321 + ~t:"619cc5aefffe0bfa462af43c1699d050"; 322 + case 323 + ~key: 324 + "feffe9928665731c6d6a8f9467308308\n feffe9928665731c" 325 + ~p: 326 + "d9313225f88406e5a55909c5aff5269a\n\ 327 + \ 86a7a9531534f7da2e4c303d8a318a72\n\ 328 + \ 1c3c0c95956809532fcf0e2449a6b525\n\ 329 + \ b16aedf5aa0de657ba637b39" 330 + ~a:"feedfacedeadbeeffeedfacedeadbeef\n abaddad2" 331 + ~nonce:"cafebabefacedbaddecaf888" 332 + ~c: 333 + "3980ca0b3c00e841eb06fac4872a2757\n\ 334 + \ 859e1ceaa6efd984628593b40ca1e19c\n\ 335 + \ 7d773d00c144c525ac619d18c84a3f47\n\ 336 + \ 18e2448b2fe324d9ccda2710" 337 + ~t:"2519498e80f1478f37ba55bd6d27618c"; 338 + case 339 + ~key: 340 + "feffe9928665731c6d6a8f9467308308\n\ 341 + \ feffe9928665731c6d6a8f9467308308" 342 + ~p: 343 + "d9313225f88406e5a55909c5aff5269a\n\ 344 + \ 86a7a9531534f7da2e4c303d8a318a72\n\ 345 + \ 1c3c0c95956809532fcf0e2449a6b525\n\ 346 + \ b16aedf5aa0de657ba637b39" 347 + ~a:"feedfacedeadbeeffeedfacedeadbeef\n abaddad2" 348 + ~nonce: 349 + "9313225df88406e555909c5aff5269aa\n\ 350 + \ 6a7a9538534f7da1e4c303d2a318a728\n\ 351 + \ c3c0c95156809539fcf0e2429a6b5254\n\ 352 + \ 16aedbf5a0de6a57a637b39b" 353 + ~c: 354 + "5a8def2f0c9e53f1f75d7853659e2a20\n\ 355 + \ eeb2b22aafde6419a058ab4f6f746bf4\n\ 356 + \ 0fc0c3b780f244452da3ebf1c5d82cde\n\ 357 + \ a2418997200ef82e44ae7e3f" 358 + ~t:"a44a8266ee1c8eb0c8b5d4cf5ae9f19a"; 359 + case ~key:"00000000000000000000000000000000" (* large GHASH batch *) ~p:"" 360 + ~a: 361 + "f0f0f0f0f0f0f0f00f0f0f0f0f0f0f0f\n\ 362 + \ e0e0e0e0e0e0e0e00e0e0e0e0e0e0e0e\n\ 363 + \ d0d0d0d0d0d0d0d00d0d0d0d0d0d0d0d\n\ 364 + \ c0c0c0c0c0c0c0c00c0c0c0c0c0c0c0c\n\ 365 + \ b0b0b0b0b0b0b0b00b0b0b0b0b0b0b0b\n\ 366 + \ a0a0a0a0a0a0a0a00a0a0a0a0a0a0a0a\n\ 367 + \ 90909090909090900909090909090909\n\ 368 + \ 80808080808080800808080808080808\n\ 369 + \ 70707070707070700707070707070707\n\ 370 + \ 60606060606060600606060606060606\n\ 371 + \ 50505050505050500505050505050505\n\ 372 + \ 40404040404040400404040404040404\n\ 373 + \ 30303030303030300303030303030303\n\ 374 + \ 20202020202020200202020202020202\n\ 375 + \ 10101010101010100101010101010101\n\ 376 + \ 00000000000000000000000000000000\n\ 377 + \ ff" 378 + ~nonce:"000000000000000000000000" ~c:"" 379 + ~t:"9bfdb8fdac1be65739780c41703c0fb6"; 380 + case ~key:"00000000000000000000000000000002" (* ctr rollover *) 381 + ~nonce:"3222415d" 382 + ~p: 383 + "deadbeefdeadbeefdeadbeefdeadbeef\n\ 384 + \ deadbeefdeadbeefdeadbeefdeadbeef\n\ 385 + \ deadbeef" 386 + ~a:"" 387 + ~c: 388 + "42627ce3de61b5c105c7f01629c031c1\n\ 389 + \ b890bb273b6b6bc26b56c801f87fa95c\n\ 390 + \ a8b37503" 391 + ~t:"3631cbe44782713b93b1c7d93c3c8638"; 392 + ] 363 393 364 394 (* 365 395 (* from SP800-38C_updated-July20_2007.pdf appendix C *) ··· 408 438 (* see RFC 3610 Section 2.1, AD of length 0 should be same as no AD *) 409 439 let key = of_secret (vx "000102030405060708090a0b0c0d0e0f") 410 440 and nonce = vx "0001020304050607" 411 - and plaintext = "hello" 412 - in 441 + and plaintext = "hello" in 413 442 assert_oct_equal ~msg:"CCM no vs empty ad" 414 443 (authenticate_encrypt ~key ~nonce plaintext) 415 444 (authenticate_encrypt ~adata:"" ~key ~nonce plaintext) ··· 419 448 (* see RFC3610 Section 2.1 *) 420 449 let key = of_secret (vx "000102030405060708090a0b0c0d0e0f") 421 450 and nonce = "" 422 - and plaintext = "hello" 423 - in 451 + and plaintext = "hello" in 424 452 assert_raises ~msg:"CCM with short nonce raises" 425 453 (Invalid_argument "Crypto: CCM: nonce length not between 7 and 13: 0") 426 454 (fun () -> authenticate_encrypt ~key ~nonce plaintext) 427 455 and short_nonce_enc2 _ = 428 456 let key = of_secret (vx "000102030405060708090a0b0c0d0e0f") 429 457 and nonce = vx "00" 430 - and plaintext = "hello" 431 - in 458 + and plaintext = "hello" in 432 459 assert_raises ~msg:"CCM with short nonce raises" 433 460 (Invalid_argument "Crypto: CCM: nonce length not between 7 and 13: 1") 434 461 (fun () -> authenticate_encrypt ~key ~nonce plaintext) 435 462 and short_nonce_enc3 _ = 436 463 let key = of_secret (vx "000102030405060708090a0b0c0d0e0f") 437 464 and nonce = vx "000102030405" 438 - and plaintext = "hello" 439 - in 465 + and plaintext = "hello" in 440 466 assert_raises ~msg:"CCM with short nonce raises" 441 467 (Invalid_argument "Crypto: CCM: nonce length not between 7 and 13: 6") 442 468 (fun () -> authenticate_encrypt ~key ~nonce plaintext) 443 469 and long_nonce_enc _ = 444 470 let key = of_secret (vx "000102030405060708090a0b0c0d0e0f") 445 471 and nonce = vx "000102030405060708090a0b0c0d" 446 - and plaintext = "hello" 447 - in 472 + and plaintext = "hello" in 448 473 assert_raises ~msg:"CCM with short nonce raises" 449 474 (Invalid_argument "Crypto: CCM: nonce length not between 7 and 13: 14") 450 475 (fun () -> authenticate_encrypt ~key ~nonce plaintext) ··· 453 478 let key = of_secret (vx "000102030405060708090a0b0c0d0e0f") 454 479 and nonce = vx "0001020304050607" 455 480 and adata = "hello" 456 - and p = "" 457 - in 481 + and p = "" in 458 482 let cipher = authenticate_encrypt ~adata ~key ~nonce p in 459 483 match authenticate_decrypt ~key ~nonce ~adata cipher with 460 484 | Some x -> assert_oct_equal ~msg:"CCM decrypt of empty message" p x ··· 465 489 and plaintext = "hello" 466 490 (* [adata] is greater than [1 lsl 16 - 1 lsl 8] *) 467 491 and adata = String.make 65280 '\x00' 468 - and expected = vx "6592169e946f98973bc06d080f7c9dbb493a536f8a" 469 - in 492 + and expected = vx "6592169e946f98973bc06d080f7c9dbb493a536f8a" in 470 493 let cipher = authenticate_encrypt ~adata ~key ~nonce plaintext in 471 494 assert_oct_equal ~msg:"CCM encrypt of >=65280 adata" expected cipher 472 495 in ··· 476 499 let nonce = vx "81cd 4758 1880 9de0 c655 7c31" 477 500 and adata = vx "1703 0300 17" 478 501 and data = vx "0800 0002 0000 16" 479 - and expected = vx "94ca 065a c948 c5d6 92fd 5fab c850 0611 a07c 4f6e 0710 90" 502 + and expected = 503 + vx "94ca 065a c948 c5d6 92fd 5fab c850 0611 a07c 4f6e 0710 90" 480 504 in 481 505 let a _ = 482 506 let cipher = authenticate_encrypt ~adata ~key ~nonce data in ··· 488 512 in 489 513 let nonce = vx "81cd 4758 1880 9de0 c655 7c30" 490 514 and adata = vx "1703 0302 85" 491 - and data = vx {| 515 + and data = 516 + vx 517 + {| 492 518 0b00 0270 0000 026c 0002 6730 8202 6330 493 519 8201 cc02 0900 cb6c 4e84 4b58 a1d4 300d 494 520 |} 495 - and expected = vx {| 521 + and expected = 522 + vx 523 + {| 496 524 1e59 904e e6d5 c2ac e538 78d7 e24f 6e46 497 525 6169 f8e2 d3dd 8b5d 788c 78ff ea9f e1d0 498 526 9885 ac1a c6d9 fb88 b66a 3a11 5ba5 6e7c ··· 506 534 | None -> assert_failure "TLS regression 1, decrypt broken" 507 535 | Some x -> assert_oct_equal ~msg:"TLS regression 1 decrypt" x data 508 536 in 509 - let data = vx {| 537 + let data = 538 + vx 539 + {| 510 540 0b00 0270 0000 026c 0002 6730 8202 6330 511 541 8201 cc02 0900 cb6c 4e84 4b58 a1d4 300d 512 542 8201 cc02 0900 513 543 |} 514 - and expected = vx {| 544 + and expected = 545 + vx 546 + {| 515 547 1e59 904e e6d5 c2ac e538 78d7 e24f 6e46 516 548 6169 f8e2 d3dd 8b5d 788c 78ff ea9f e1d0 517 549 7c8d 9993 6bfd cf76 9799 473b 58f4 ed69 ··· 526 558 | None -> assert_failure "TLS regression 2, decrypt broken" 527 559 | Some x -> assert_oct_equal ~msg:"TLS regression 2 decrypt" x data 528 560 in 529 - let data = vx {| 561 + let data = 562 + vx 563 + {| 530 564 0b00 0270 0000 026c 0002 6730 8202 6330 531 565 8201 cc02 0900 cb6c 4e84 4b58 a1d4 300d 532 566 0609 2a86 4886 f70d 0101 0505 0030 7631 ··· 568 602 1be5 55f8 7083 4e09 4d41 cf9f 74b3 342e 569 603 8345 0000 16 570 604 |} 571 - and expected = vx {| 605 + and expected = 606 + vx 607 + {| 572 608 1e59 904e e6d5 c2ac e538 78d7 e24f 6e46 573 609 6169 f8e2 d3dd 8b5d 788c 78ff ea9f e1d0 574 610 f885 7f17 2a7b f163 d29e 0a8e 8636 418f ··· 620 656 | None -> assert_failure "TLS regression 3, decrypt broken" 621 657 | Some x -> assert_oct_equal ~msg:"TLS regression 3 decrypt" x data 622 658 in 623 - [ a ; b ; c ; d ; e ; f ; g ; h ] 659 + [ a; b; c; d; e; f; g; h ] 624 660 in 625 661 [ 626 - test_case no_vs_empty_ad ; 627 - test_case short_nonce_enc ; 628 - test_case short_nonce_enc2 ; 629 - test_case short_nonce_enc3 ; 630 - test_case long_nonce_enc ; 631 - test_case enc_dec_empty_message ; 632 - test_case long_adata ; 633 - ] @ List.map test_case regr_tls 662 + test_case no_vs_empty_ad; 663 + test_case short_nonce_enc; 664 + test_case short_nonce_enc2; 665 + test_case short_nonce_enc3; 666 + test_case long_nonce_enc; 667 + test_case enc_dec_empty_message; 668 + test_case long_adata; 669 + ] 670 + @ List.map test_case regr_tls 634 671 635 672 let gcm_regressions = 636 673 let open AES.GCM in 637 674 let msg = vx "000102030405060708090a0b0c0d0e0f" in 638 - let key = of_secret msg 639 - and nonce = "" 640 - in 675 + let key = of_secret msg and nonce = "" in 641 676 let nonce_zero_length_enc _ = 642 677 (* reported in https://github.com/mirleft/ocaml-nocrypto/issues/169 *) 643 678 assert_raises ~msg:"GCM with nonce of length 0" 644 - (Invalid_argument "Crypto: GCM: invalid nonce of length 0") 645 - (fun () -> authenticate_encrypt ~key ~nonce msg) 679 + (Invalid_argument "Crypto: GCM: invalid nonce of length 0") (fun () -> 680 + authenticate_encrypt ~key ~nonce msg) 646 681 and nonce_zero_length_dec _ = 647 682 assert_raises ~msg:"GCM with nonce of 0" 648 - (Invalid_argument "Crypto: GCM: invalid nonce of length 0") 649 - (fun () -> authenticate_decrypt ~key ~nonce msg) 683 + (Invalid_argument "Crypto: GCM: invalid nonce of length 0") (fun () -> 684 + authenticate_decrypt ~key ~nonce msg) 650 685 in 651 - [ 652 - test_case nonce_zero_length_enc ; 653 - test_case nonce_zero_length_dec ; 654 - ] 655 - 686 + [ test_case nonce_zero_length_enc; test_case nonce_zero_length_dec ] 656 687 657 688 let chacha20_cases = 658 689 let case msg ?ctr ~key ~nonce ?(input = String.make 128 '\000') output = 659 690 let key = Chacha20.of_secret (vx key) 660 691 and nonce = vx nonce 661 - and output = vx output 662 - in 692 + and output = vx output in 663 693 assert_oct_equal ~msg (Chacha20.crypt ~key ~nonce ?ctr input) output 664 694 in 665 - let rfc8439_input = "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it." in 695 + let rfc8439_input = 696 + "Ladies and Gentlemen of the class of '99: If I could offer you only one \ 697 + tip for the future, sunscreen would be it." 698 + in 666 699 let rfc8439_test_2_4_2 _ = 667 700 let key = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" 668 701 and nonce = "000000000000004a00000000" 669 702 and output = 670 - {|6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81 703 + {|6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81 671 704 e9 7e 7a ec 1d 43 60 c2 0a 27 af cc fd 9f ae 0b 672 705 f9 1b 65 c5 52 47 33 ab 8f 59 3d ab cd 62 b3 57 673 706 16 39 d6 24 e6 51 52 ab 8f 53 0c 35 9f 08 61 d8 ··· 676 709 5a f9 0b bf 74 a3 5b e6 b4 0b 8e ed f2 78 5e 42 677 710 87 4d|} 678 711 in 679 - case "Chacha20 RFC 8439 2.4.2" ~ctr:1L ~key ~nonce ~input:rfc8439_input output 712 + case "Chacha20 RFC 8439 2.4.2" ~ctr:1L ~key ~nonce ~input:rfc8439_input 713 + output 680 714 and rfc8439_test_2_8_2 _ = 681 - let key = Chacha20.of_secret (vx "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f") 715 + let key = 716 + Chacha20.of_secret 717 + (vx "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f") 682 718 and adata = vx "50515253c0c1c2c3c4c5c6c7" 683 719 and nonce = vx "0700000040 41424344454647" 684 - and output = vx {| 720 + and output = 721 + vx 722 + {| 685 723 d3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2 686 724 a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6 687 725 3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b ··· 697 735 output; 698 736 assert_oct_equal ~msg:"Chacha20/Poly1305 RFC 8439 2.8.2 decrypt" 699 737 (match Chacha20.authenticate_decrypt ~key ~nonce ~adata output with 700 - | Some cs -> cs | None -> assert_failure "Chacha20/poly1305 decryption broken") 701 - rfc8439_input; 738 + | Some cs -> cs 739 + | None -> assert_failure "Chacha20/poly1305 decryption broken") 740 + rfc8439_input 702 741 in 703 742 (* from https://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-01 *) 704 743 let case ~key ~nonce ~output0 ~output1 _ = ··· 706 745 in 707 746 List.map test_case 708 747 [ 709 - rfc8439_test_2_4_2 ; 710 - 711 - rfc8439_test_2_8_2 ; 712 - 713 - case 714 - ~key:(String.make 64 '0') 715 - ~nonce:(String.make 16 '0') 716 - ~output0:("76b8e0ada0f13d90405d6ae55386bd28" ^ 717 - "bdd219b8a08ded1aa836efcc8b770dc7" ^ 718 - "da41597c5157488d7724e03fb8d84a37" ^ 719 - "6a43b8f41518a11cc387b669b2ee6586") 720 - ~output1:("9f07e7be5551387a98ba977c732d080d" ^ 721 - "cb0f29a048e3656912c6533e32ee7aed" ^ 722 - "29b721769ce64e43d57133b074d839d5" ^ 723 - "31ed1f28510afb45ace10a1f4b794d6f") ; 724 - 748 + rfc8439_test_2_4_2; 749 + rfc8439_test_2_8_2; 750 + case ~key:(String.make 64 '0') ~nonce:(String.make 16 '0') 751 + ~output0: 752 + ("76b8e0ada0f13d90405d6ae55386bd28" 753 + ^ "bdd219b8a08ded1aa836efcc8b770dc7" 754 + ^ "da41597c5157488d7724e03fb8d84a37" 755 + ^ "6a43b8f41518a11cc387b669b2ee6586") 756 + ~output1: 757 + ("9f07e7be5551387a98ba977c732d080d" 758 + ^ "cb0f29a048e3656912c6533e32ee7aed" 759 + ^ "29b721769ce64e43d57133b074d839d5" 760 + ^ "31ed1f28510afb45ace10a1f4b794d6f"); 725 761 case 726 762 ~key:("01" ^ String.make 62 '0') 727 763 ~nonce:(String.make 16 '0') 728 - ~output0:("c5d30a7ce1ec119378c84f487d775a85" ^ 729 - "42f13ece238a9455e8229e888de85bbd" ^ 730 - "29eb63d0a17a5b999b52da22be4023eb" ^ 731 - "07620a54f6fa6ad8737b71eb0464dac0") 732 - ~output1:("10f656e6d1fd55053e50c4875c9930a3" ^ 733 - "3f6d0263bd14dfd6ab8c70521c19338b" ^ 734 - "2308b95cf8d0bb7d202d2102780ea352" ^ 735 - "8f1cb48560f76b20f382b942500fceac") ; 736 - 737 - case 738 - ~key:(String.make 64 '0') 764 + ~output0: 765 + ("c5d30a7ce1ec119378c84f487d775a85" 766 + ^ "42f13ece238a9455e8229e888de85bbd" 767 + ^ "29eb63d0a17a5b999b52da22be4023eb" 768 + ^ "07620a54f6fa6ad8737b71eb0464dac0") 769 + ~output1: 770 + ("10f656e6d1fd55053e50c4875c9930a3" 771 + ^ "3f6d0263bd14dfd6ab8c70521c19338b" 772 + ^ "2308b95cf8d0bb7d202d2102780ea352" 773 + ^ "8f1cb48560f76b20f382b942500fceac"); 774 + case ~key:(String.make 64 '0') 739 775 ~nonce:("01" ^ String.make 14 '0') 740 - ~output0:("ef3fdfd6c61578fbf5cf35bd3dd33b80" ^ 741 - "09631634d21e42ac33960bd138e50d32" ^ 742 - "111e4caf237ee53ca8ad6426194a8854" ^ 743 - "5ddc497a0b466e7d6bbdb0041b2f586b") 744 - ~output1:("5305e5e44aff19b235936144675efbe4" ^ 745 - "409eb7e8e5f1430f5f5836aeb49bb532" ^ 746 - "8b017c4b9dc11f8a03863fa803dc71d5" ^ 747 - "726b2b6b31aa32708afe5af1d6b69058") ; 748 - 749 - case 750 - ~key:(String.make 64 'f') 751 - ~nonce:(String.make 16 'f') 752 - ~output0:("d9bf3f6bce6ed0b54254557767fb5744" ^ 753 - "3dd4778911b606055c39cc25e674b836" ^ 754 - "3feabc57fde54f790c52c8ae43240b79" ^ 755 - "d49042b777bfd6cb80e931270b7f50eb") 756 - ~output1:("5bac2acd86a836c5dc98c116c1217ec3" ^ 757 - "1d3a63a9451319f097f3b4d6dab07787" ^ 758 - "19477d24d24b403a12241d7cca064f79" ^ 759 - "0f1d51ccaff6b1667d4bbca1958c4306") ; 760 - 761 - case 762 - ~key:(String.make 64 '5') 763 - ~nonce:(String.make 16 '5') 764 - ~output0:("bea9411aa453c5434a5ae8c92862f564" ^ 765 - "396855a9ea6e22d6d3b50ae1b3663311" ^ 766 - "a4a3606c671d605ce16c3aece8e61ea1" ^ 767 - "45c59775017bee2fa6f88afc758069f7") 768 - ~output1:("e0b8f676e644216f4d2a3422d7fa36c6" ^ 769 - "c4931aca950e9da42788e6d0b6d1cd83" ^ 770 - "8ef652e97b145b14871eae6c6804c700" ^ 771 - "4db5ac2fce4c68c726d004b10fcaba86") ; 772 - 773 - case 774 - ~key:(String.make 64 'a') 775 - ~nonce:(String.make 16 'a') 776 - ~output0:("9aa2a9f656efde5aa7591c5fed4b35ae" ^ 777 - "a2895dec7cb4543b9e9f21f5e7bcbcf3" ^ 778 - "c43c748a970888f8248393a09d43e0b7" ^ 779 - "e164bc4d0b0fb240a2d72115c4808906") 780 - ~output1:("72184489440545d021d97ef6b693dfe5" ^ 781 - "b2c132d47e6f041c9063651f96b623e6" ^ 782 - "2a11999a23b6f7c461b2153026ad5e86" ^ 783 - "6a2e597ed07b8401dec63a0934c6b2a9") ; 784 - 776 + ~output0: 777 + ("ef3fdfd6c61578fbf5cf35bd3dd33b80" 778 + ^ "09631634d21e42ac33960bd138e50d32" 779 + ^ "111e4caf237ee53ca8ad6426194a8854" 780 + ^ "5ddc497a0b466e7d6bbdb0041b2f586b") 781 + ~output1: 782 + ("5305e5e44aff19b235936144675efbe4" 783 + ^ "409eb7e8e5f1430f5f5836aeb49bb532" 784 + ^ "8b017c4b9dc11f8a03863fa803dc71d5" 785 + ^ "726b2b6b31aa32708afe5af1d6b69058"); 786 + case ~key:(String.make 64 'f') ~nonce:(String.make 16 'f') 787 + ~output0: 788 + ("d9bf3f6bce6ed0b54254557767fb5744" 789 + ^ "3dd4778911b606055c39cc25e674b836" 790 + ^ "3feabc57fde54f790c52c8ae43240b79" 791 + ^ "d49042b777bfd6cb80e931270b7f50eb") 792 + ~output1: 793 + ("5bac2acd86a836c5dc98c116c1217ec3" 794 + ^ "1d3a63a9451319f097f3b4d6dab07787" 795 + ^ "19477d24d24b403a12241d7cca064f79" 796 + ^ "0f1d51ccaff6b1667d4bbca1958c4306"); 797 + case ~key:(String.make 64 '5') ~nonce:(String.make 16 '5') 798 + ~output0: 799 + ("bea9411aa453c5434a5ae8c92862f564" 800 + ^ "396855a9ea6e22d6d3b50ae1b3663311" 801 + ^ "a4a3606c671d605ce16c3aece8e61ea1" 802 + ^ "45c59775017bee2fa6f88afc758069f7") 803 + ~output1: 804 + ("e0b8f676e644216f4d2a3422d7fa36c6" 805 + ^ "c4931aca950e9da42788e6d0b6d1cd83" 806 + ^ "8ef652e97b145b14871eae6c6804c700" 807 + ^ "4db5ac2fce4c68c726d004b10fcaba86"); 808 + case ~key:(String.make 64 'a') ~nonce:(String.make 16 'a') 809 + ~output0: 810 + ("9aa2a9f656efde5aa7591c5fed4b35ae" 811 + ^ "a2895dec7cb4543b9e9f21f5e7bcbcf3" 812 + ^ "c43c748a970888f8248393a09d43e0b7" 813 + ^ "e164bc4d0b0fb240a2d72115c4808906") 814 + ~output1: 815 + ("72184489440545d021d97ef6b693dfe5" 816 + ^ "b2c132d47e6f041c9063651f96b623e6" 817 + ^ "2a11999a23b6f7c461b2153026ad5e86" 818 + ^ "6a2e597ed07b8401dec63a0934c6b2a9"); 785 819 case 786 820 ~key:"00112233445566778899aabbccddeeffffeeddccbbaa99887766554433221100" 787 821 ~nonce:"0f1e2d3c4b5a6978" 788 - ~output0:("9fadf409c00811d00431d67efbd88fba" ^ 789 - "59218d5d6708b1d685863fabbb0e961e" ^ 790 - "ea480fd6fb532bfd494b215101505742" ^ 791 - "3ab60a63fe4f55f7a212e2167ccab931") 792 - ~output1:("fbfd29cf7bc1d279eddf25dd316bb884" ^ 793 - "3d6edee0bd1ef121d12fa17cbc2c574c" ^ 794 - "ccab5e275167b08bd686f8a09df87ec3" ^ 795 - "ffb35361b94ebfa13fec0e4889d18da5") ; 796 - 822 + ~output0: 823 + ("9fadf409c00811d00431d67efbd88fba" 824 + ^ "59218d5d6708b1d685863fabbb0e961e" 825 + ^ "ea480fd6fb532bfd494b215101505742" 826 + ^ "3ab60a63fe4f55f7a212e2167ccab931") 827 + ~output1: 828 + ("fbfd29cf7bc1d279eddf25dd316bb884" 829 + ^ "3d6edee0bd1ef121d12fa17cbc2c574c" 830 + ^ "ccab5e275167b08bd686f8a09df87ec3" 831 + ^ "ffb35361b94ebfa13fec0e4889d18da5"); 797 832 case 798 833 ~key:"c46ec1b18ce8a878725a37e780dfb7351f68ed2e194c79fbc6aebee1a667975d" 799 834 ~nonce:"1ada31d5cf688221" 800 - ~output0:("f63a89b75c2271f9368816542ba52f06" ^ 801 - "ed49241792302b00b5e8f80ae9a473af" ^ 802 - "c25b218f519af0fdd406362e8d69de7f" ^ 803 - "54c604a6e00f353f110f771bdca8ab92") 804 - ~output1:("e5fbc34e60a1d9a9db17345b0a402736" ^ 805 - "853bf910b060bdf1f897b6290f01d138" ^ 806 - "ae2c4c90225ba9ea14d518f55929dea0" ^ 807 - "98ca7a6ccfe61227053c84e49a4a3332") ; 808 - 809 - case 810 - ~key:(String.make 32 '0') 811 - ~nonce:(String.make 16 '0') 812 - ~output0:("89670952608364fd00b2f90936f031c8" ^ 813 - "e756e15dba04b8493d00429259b20f46" ^ 814 - "cc04f111246b6c2ce066be3bfb32d9aa" ^ 815 - "0fddfbc12123d4b9e44f34dca05a103f") 816 - ~output1:("6cd135c2878c832b5896b134f6142a9d" ^ 817 - "4d8d0d8f1026d20a0a81512cbce6e975" ^ 818 - "8a7143d021978022a384141a80cea306" ^ 819 - "2f41f67a752e66ad3411984c787e30ad") ; 820 - 835 + ~output0: 836 + ("f63a89b75c2271f9368816542ba52f06" 837 + ^ "ed49241792302b00b5e8f80ae9a473af" 838 + ^ "c25b218f519af0fdd406362e8d69de7f" 839 + ^ "54c604a6e00f353f110f771bdca8ab92") 840 + ~output1: 841 + ("e5fbc34e60a1d9a9db17345b0a402736" 842 + ^ "853bf910b060bdf1f897b6290f01d138" 843 + ^ "ae2c4c90225ba9ea14d518f55929dea0" 844 + ^ "98ca7a6ccfe61227053c84e49a4a3332"); 845 + case ~key:(String.make 32 '0') ~nonce:(String.make 16 '0') 846 + ~output0: 847 + ("89670952608364fd00b2f90936f031c8" 848 + ^ "e756e15dba04b8493d00429259b20f46" 849 + ^ "cc04f111246b6c2ce066be3bfb32d9aa" 850 + ^ "0fddfbc12123d4b9e44f34dca05a103f") 851 + ~output1: 852 + ("6cd135c2878c832b5896b134f6142a9d" 853 + ^ "4d8d0d8f1026d20a0a81512cbce6e975" 854 + ^ "8a7143d021978022a384141a80cea306" 855 + ^ "2f41f67a752e66ad3411984c787e30ad"); 821 856 case 822 857 ~key:("01" ^ String.make 30 '0') 823 858 ~nonce:(String.make 16 '0') 824 - ~output0:("ae56060d04f5b597897ff2af1388dbce" ^ 825 - "ff5a2a4920335dc17a3cb1b1b10fbe70" ^ 826 - "ece8f4864d8c7cdf0076453a8291c7db" ^ 827 - "eb3aa9c9d10e8ca36be4449376ed7c42") 828 - ~output1:("fc3d471c34a36fbbf616bc0a0e7c5230" ^ 829 - "30d944f43ec3e78dd6a12466547cb4f7" ^ 830 - "b3cebd0a5005e762e562d1375b7ac445" ^ 831 - "93a991b85d1a60fba2035dfaa2a642d5") ; 832 - 833 - case 834 - ~key:(String.make 32 '0') 859 + ~output0: 860 + ("ae56060d04f5b597897ff2af1388dbce" 861 + ^ "ff5a2a4920335dc17a3cb1b1b10fbe70" 862 + ^ "ece8f4864d8c7cdf0076453a8291c7db" 863 + ^ "eb3aa9c9d10e8ca36be4449376ed7c42") 864 + ~output1: 865 + ("fc3d471c34a36fbbf616bc0a0e7c5230" 866 + ^ "30d944f43ec3e78dd6a12466547cb4f7" 867 + ^ "b3cebd0a5005e762e562d1375b7ac445" 868 + ^ "93a991b85d1a60fba2035dfaa2a642d5"); 869 + case ~key:(String.make 32 '0') 835 870 ~nonce:("01" ^ String.make 14 '0') 836 - ~output0:("1663879eb3f2c9949e2388caa343d361" ^ 837 - "bb132771245ae6d027ca9cb010dc1fa7" ^ 838 - "178dc41f8278bc1f64b3f12769a24097" ^ 839 - "f40d63a86366bdb36ac08abe60c07fe8") 840 - ~output1:("b057375c89144408cc744624f69f7f4c" ^ 841 - "cbd93366c92fc4dfcada65f1b959d8c6" ^ 842 - "4dfc50de711fb46416c2553cc60f21bb" ^ 843 - "fd006491cb17888b4fb3521c4fdd8745") ; 844 - 845 - case 846 - ~key:(String.make 32 'f') 847 - ~nonce:(String.make 16 'f') 848 - ~output0:("992947c3966126a0e660a3e95db048de" ^ 849 - "091fb9e0185b1e41e41015bb7ee50150" ^ 850 - "399e4760b262f9d53f26d8dd19e56f5c" ^ 851 - "506ae0c3619fa67fb0c408106d0203ee") 852 - ~output1:("40ea3cfa61fa32a2fda8d1238a2135d9" ^ 853 - "d4178775240f99007064a6a7f0c731b6" ^ 854 - "7c227c52ef796b6bed9f9059ba0614bc" ^ 855 - "f6dd6e38917f3b150e576375be50ed67") ; 856 - 857 - case 858 - ~key:(String.make 32 '5') 859 - ~nonce:(String.make 16 '5') 860 - ~output0:("357d7d94f966778f5815a2051dcb0413" ^ 861 - "3b26b0ead9f57dd09927837bc3067e4b" ^ 862 - "6bf299ad81f7f50c8da83c7810bfc17b" ^ 863 - "b6f4813ab6c326957045fd3fd5e19915") 864 - ~output1:("ec744a6b9bf8cbdcb36d8b6a5499c68a" ^ 865 - "08ef7be6cc1e93f2f5bcd2cad4e47c18" ^ 866 - "a3e5d94b5666382c6d130d822dd56aac" ^ 867 - "b0f8195278e7b292495f09868ddf12cc") ; 868 - 869 - case 870 - ~key:(String.make 32 'a') 871 - ~nonce:(String.make 16 'a') 872 - ~output0:("fc79acbd58526103862776aab20f3b7d" ^ 873 - "8d3149b2fab65766299316b6e5b16684" ^ 874 - "de5de548c1b7d083efd9e3052319e0c6" ^ 875 - "254141da04a6586df800f64d46b01c87") 876 - ~output1:("1f05bc67e07628ebe6f6865a2177e0b6" ^ 877 - "6a558aa7cc1e8ff1a98d27f7071f8335" ^ 878 - "efce4537bb0ef7b573b32f32765f2900" ^ 879 - "7da53bba62e7a44d006f41eb28fe15d6") ; 880 - 881 - case 882 - ~key:"00112233445566778899aabbccddeeff" 883 - ~nonce:"0f1e2d3c4b5a6978" 884 - ~output0:("d1abf630467eb4f67f1cfb47cd626aae" ^ 885 - "8afedbbe4ff8fc5fe9cfae307e74ed45" ^ 886 - "1f1404425ad2b54569d5f18148939971" ^ 887 - "abb8fafc88ce4ac7fe1c3d1f7a1eb7ca") 888 - ~output1:("e76ca87b61a9713541497760dd9ae059" ^ 889 - "350cad0dcedfaa80a883119a1a6f987f" ^ 890 - "d1ce91fd8ee0828034b411200a9745a2" ^ 891 - "85554475d12afc04887fef3516d12a2c") ; 892 - 893 - case 894 - ~key:"c46ec1b18ce8a878725a37e780dfb735" 895 - ~nonce:"1ada31d5cf688221" 896 - ~output0:("826abdd84460e2e9349f0ef4af5b179b" ^ 897 - "426e4b2d109a9c5bb44000ae51bea90a" ^ 898 - "496beeef62a76850ff3f0402c4ddc99f" ^ 899 - "6db07f151c1c0dfac2e56565d6289625") 900 - ~output1:("5b23132e7b469c7bfb88fa95d44ca5ae" ^ 901 - "3e45e848a4108e98bad7a9eb15512784" ^ 902 - "a6a9e6e591dce674120acaf9040ff50f" ^ 903 - "f3ac30ccfb5e14204f5e4268b90a8804") 871 + ~output0: 872 + ("1663879eb3f2c9949e2388caa343d361" 873 + ^ "bb132771245ae6d027ca9cb010dc1fa7" 874 + ^ "178dc41f8278bc1f64b3f12769a24097" 875 + ^ "f40d63a86366bdb36ac08abe60c07fe8") 876 + ~output1: 877 + ("b057375c89144408cc744624f69f7f4c" 878 + ^ "cbd93366c92fc4dfcada65f1b959d8c6" 879 + ^ "4dfc50de711fb46416c2553cc60f21bb" 880 + ^ "fd006491cb17888b4fb3521c4fdd8745"); 881 + case ~key:(String.make 32 'f') ~nonce:(String.make 16 'f') 882 + ~output0: 883 + ("992947c3966126a0e660a3e95db048de" 884 + ^ "091fb9e0185b1e41e41015bb7ee50150" 885 + ^ "399e4760b262f9d53f26d8dd19e56f5c" 886 + ^ "506ae0c3619fa67fb0c408106d0203ee") 887 + ~output1: 888 + ("40ea3cfa61fa32a2fda8d1238a2135d9" 889 + ^ "d4178775240f99007064a6a7f0c731b6" 890 + ^ "7c227c52ef796b6bed9f9059ba0614bc" 891 + ^ "f6dd6e38917f3b150e576375be50ed67"); 892 + case ~key:(String.make 32 '5') ~nonce:(String.make 16 '5') 893 + ~output0: 894 + ("357d7d94f966778f5815a2051dcb0413" 895 + ^ "3b26b0ead9f57dd09927837bc3067e4b" 896 + ^ "6bf299ad81f7f50c8da83c7810bfc17b" 897 + ^ "b6f4813ab6c326957045fd3fd5e19915") 898 + ~output1: 899 + ("ec744a6b9bf8cbdcb36d8b6a5499c68a" 900 + ^ "08ef7be6cc1e93f2f5bcd2cad4e47c18" 901 + ^ "a3e5d94b5666382c6d130d822dd56aac" 902 + ^ "b0f8195278e7b292495f09868ddf12cc"); 903 + case ~key:(String.make 32 'a') ~nonce:(String.make 16 'a') 904 + ~output0: 905 + ("fc79acbd58526103862776aab20f3b7d" 906 + ^ "8d3149b2fab65766299316b6e5b16684" 907 + ^ "de5de548c1b7d083efd9e3052319e0c6" 908 + ^ "254141da04a6586df800f64d46b01c87") 909 + ~output1: 910 + ("1f05bc67e07628ebe6f6865a2177e0b6" 911 + ^ "6a558aa7cc1e8ff1a98d27f7071f8335" 912 + ^ "efce4537bb0ef7b573b32f32765f2900" 913 + ^ "7da53bba62e7a44d006f41eb28fe15d6"); 914 + case ~key:"00112233445566778899aabbccddeeff" ~nonce:"0f1e2d3c4b5a6978" 915 + ~output0: 916 + ("d1abf630467eb4f67f1cfb47cd626aae" 917 + ^ "8afedbbe4ff8fc5fe9cfae307e74ed45" 918 + ^ "1f1404425ad2b54569d5f18148939971" 919 + ^ "abb8fafc88ce4ac7fe1c3d1f7a1eb7ca") 920 + ~output1: 921 + ("e76ca87b61a9713541497760dd9ae059" 922 + ^ "350cad0dcedfaa80a883119a1a6f987f" 923 + ^ "d1ce91fd8ee0828034b411200a9745a2" 924 + ^ "85554475d12afc04887fef3516d12a2c"); 925 + case ~key:"c46ec1b18ce8a878725a37e780dfb735" ~nonce:"1ada31d5cf688221" 926 + ~output0: 927 + ("826abdd84460e2e9349f0ef4af5b179b" 928 + ^ "426e4b2d109a9c5bb44000ae51bea90a" 929 + ^ "496beeef62a76850ff3f0402c4ddc99f" 930 + ^ "6db07f151c1c0dfac2e56565d6289625") 931 + ~output1: 932 + ("5b23132e7b469c7bfb88fa95d44ca5ae" 933 + ^ "3e45e848a4108e98bad7a9eb15512784" 934 + ^ "a6a9e6e591dce674120acaf9040ff50f" 935 + ^ "f3ac30ccfb5e14204f5e4268b90a8804"); 904 936 ] 905 937 906 938 let poly1305_rfc8439_2_5_2 _ = 907 - let key = vx "85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b" 939 + let key = 940 + vx "85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b" 908 941 and data = "Cryptographic Forum Research Group" 909 - and output = vx "a8061dc1305136c6c22b8baf0c0127a9" 910 - in 942 + and output = vx "a8061dc1305136c6c22b8baf0c0127a9" in 911 943 assert_oct_equal ~msg:"poly 1305 RFC8439 Section 2.5.2" 912 944 (Poly1305.mac ~key data) output 913 945 914 946 let empty_cases _ = 915 - let plain = "" 916 - and cipher = "" 917 - in 947 + let plain = "" and cipher = "" in 918 948 (* 3DES ECB CBC CTR *) 919 - Array.iter (fun key_size -> 949 + Array.iter 950 + (fun key_size -> 920 951 let key = DES.ECB.of_secret (String.make key_size '\x00') in 921 - assert_oct_equal ~msg:"DES ECB encrypt" cipher (DES.ECB.encrypt ~key plain) ; 922 - assert_oct_equal ~msg:"DES ECB decrypt" plain (DES.ECB.decrypt ~key cipher)) 923 - DES.ECB.key_sizes ; 924 - Array.iter (fun key_size -> 952 + assert_oct_equal ~msg:"DES ECB encrypt" cipher 953 + (DES.ECB.encrypt ~key plain); 954 + assert_oct_equal ~msg:"DES ECB decrypt" plain 955 + (DES.ECB.decrypt ~key cipher)) 956 + DES.ECB.key_sizes; 957 + Array.iter 958 + (fun key_size -> 925 959 let key = DES.CBC.of_secret (String.make key_size '\x00') 926 - and iv = String.make DES.CBC.block_size '\x00' 927 - in 928 - assert_oct_equal ~msg:"DES CBC encrypt" cipher (DES.CBC.encrypt ~key ~iv plain) ; 929 - assert_oct_equal ~msg:"DES CBC decrypt" plain (DES.CBC.decrypt ~key ~iv cipher)) 930 - DES.CBC.key_sizes ; 931 - Array.iter (fun key_size -> 960 + and iv = String.make DES.CBC.block_size '\x00' in 961 + assert_oct_equal ~msg:"DES CBC encrypt" cipher 962 + (DES.CBC.encrypt ~key ~iv plain); 963 + assert_oct_equal ~msg:"DES CBC decrypt" plain 964 + (DES.CBC.decrypt ~key ~iv cipher)) 965 + DES.CBC.key_sizes; 966 + Array.iter 967 + (fun key_size -> 932 968 let key = DES.CTR.of_secret (String.make key_size '\x00') 933 - and ctr = DES.CTR.ctr_of_octets (String.make DES.CTR.block_size '\x00') 934 - in 935 - assert_oct_equal ~msg:"DES CTR encrypt" cipher (DES.CTR.encrypt ~key ~ctr plain) ; 936 - assert_oct_equal ~msg:"DES CTR decrypt" plain (DES.CTR.decrypt ~key ~ctr cipher)) 937 - DES.CTR.key_sizes ; 969 + and ctr = DES.CTR.ctr_of_octets (String.make DES.CTR.block_size '\x00') in 970 + assert_oct_equal ~msg:"DES CTR encrypt" cipher 971 + (DES.CTR.encrypt ~key ~ctr plain); 972 + assert_oct_equal ~msg:"DES CTR decrypt" plain 973 + (DES.CTR.decrypt ~key ~ctr cipher)) 974 + DES.CTR.key_sizes; 938 975 939 976 (* AES ECB CBC CTR GCM CCM16 *) 940 - Array.iter (fun key_size -> 977 + Array.iter 978 + (fun key_size -> 941 979 let key = AES.ECB.of_secret (String.make key_size '\x00') in 942 - assert_oct_equal ~msg:"AES ECB encrypt" cipher (AES.ECB.encrypt ~key plain) ; 943 - assert_oct_equal ~msg:"AES ECB decrypt" plain (AES.ECB.decrypt ~key cipher)) 944 - AES.ECB.key_sizes ; 945 - Array.iter (fun key_size -> 980 + assert_oct_equal ~msg:"AES ECB encrypt" cipher 981 + (AES.ECB.encrypt ~key plain); 982 + assert_oct_equal ~msg:"AES ECB decrypt" plain 983 + (AES.ECB.decrypt ~key cipher)) 984 + AES.ECB.key_sizes; 985 + Array.iter 986 + (fun key_size -> 946 987 let key = AES.CBC.of_secret (String.make key_size '\x00') 947 - and iv = String.make AES.CBC.block_size '\x00' 948 - in 949 - assert_oct_equal ~msg:"AES CBC encrypt" cipher (AES.CBC.encrypt ~key ~iv plain) ; 950 - assert_oct_equal ~msg:"AES CBC decrypt" plain (AES.CBC.decrypt ~key ~iv cipher)) 951 - AES.CBC.key_sizes ; 952 - Array.iter (fun key_size -> 988 + and iv = String.make AES.CBC.block_size '\x00' in 989 + assert_oct_equal ~msg:"AES CBC encrypt" cipher 990 + (AES.CBC.encrypt ~key ~iv plain); 991 + assert_oct_equal ~msg:"AES CBC decrypt" plain 992 + (AES.CBC.decrypt ~key ~iv cipher)) 993 + AES.CBC.key_sizes; 994 + Array.iter 995 + (fun key_size -> 953 996 let key = AES.CTR.of_secret (String.make key_size '\x00') 954 - and ctr = AES.CTR.ctr_of_octets (String.make AES.CTR.block_size '\x00') 955 - in 956 - assert_oct_equal ~msg:"AES CTR encrypt" cipher (AES.CTR.encrypt ~key ~ctr plain) ; 957 - assert_oct_equal ~msg:"AES CTR decrypt" plain (AES.CTR.decrypt ~key ~ctr cipher)) 958 - AES.CTR.key_sizes ; 959 - Array.iter (fun key_size -> 997 + and ctr = AES.CTR.ctr_of_octets (String.make AES.CTR.block_size '\x00') in 998 + assert_oct_equal ~msg:"AES CTR encrypt" cipher 999 + (AES.CTR.encrypt ~key ~ctr plain); 1000 + assert_oct_equal ~msg:"AES CTR decrypt" plain 1001 + (AES.CTR.decrypt ~key ~ctr cipher)) 1002 + AES.CTR.key_sizes; 1003 + Array.iter 1004 + (fun key_size -> 960 1005 let key = AES.CCM16.of_secret (String.make key_size '\x00') in 961 1006 let test_one nonce = 962 1007 let c, tag = AES.CCM16.authenticate_encrypt_tag ~key ~nonce plain in 963 - assert_oct_equal ~msg:"AES CCM16 encrypt" cipher c ; 1008 + assert_oct_equal ~msg:"AES CCM16 encrypt" cipher c; 964 1009 match AES.CCM16.authenticate_decrypt_tag ~key ~nonce ~tag cipher with 965 1010 | None -> assert false 966 1011 | Some p -> assert_oct_equal ~msg:"AES CCM16 decrypt" plain p ··· 968 1013 test_one (String.make 7 '\x00'); 969 1014 test_one (String.make 8 '\x00'); 970 1015 test_one (String.make 13 '\x00')) 971 - AES.CCM16.key_sizes ; 1016 + AES.CCM16.key_sizes; 972 1017 973 1018 (* ChaCha20 *) 974 - Array.iter (fun key_size -> 1019 + Array.iter 1020 + (fun key_size -> 975 1021 let key = Chacha20.of_secret (String.make key_size '\x00') in 976 1022 let test_one nonce = 977 1023 let c, tag = Chacha20.authenticate_encrypt_tag ~key ~nonce plain in 978 - assert_oct_equal ~msg:"Chacha20 encrypt" cipher c ; 1024 + assert_oct_equal ~msg:"Chacha20 encrypt" cipher c; 979 1025 match Chacha20.authenticate_decrypt_tag ~key ~nonce ~tag cipher with 980 1026 | None -> assert false 981 1027 | Some p -> assert_oct_equal ~msg:"Chacha20 decrypt" plain p 982 1028 in 983 1029 test_one (String.make 8 '\x00'); 984 - if key_size = 32 then 985 - test_one (String.make 12 '\x00')) 986 - [| 16 ; 32 |] ; 1030 + if key_size = 32 then test_one (String.make 12 '\x00')) 1031 + [| 16; 32 |]; 987 1032 988 1033 (* ARC4 *) 989 1034 let key = ARC4.of_secret (String.make 16 '\x00') in 990 - assert_oct_equal ~msg:"ARC4 encrypt" cipher (ARC4.(encrypt ~key plain).message) ; 991 - assert_oct_equal ~msg:"ARC4 decrypt" plain (ARC4.(decrypt ~key cipher).message) 1035 + assert_oct_equal ~msg:"ARC4 encrypt" cipher ARC4.(encrypt ~key plain).message; 1036 + assert_oct_equal ~msg:"ARC4 decrypt" plain ARC4.(decrypt ~key cipher).message 992 1037 993 - let suite = [ 994 - "3DES-ECB" >::: des_ecb_cases ; 995 - "3DES-CBC" >::: des_cbc_cases ; 996 - "3DES-CTR" >::: des_ctr_cases ; 997 - "AES-ECB" >::: [ "SP 300-38A" >::: aes_ecb_cases ] ; 998 - "AES-CBC" >::: [ "SP 300-38A" >::: aes_cbc_cases ] ; 999 - "AES-CTR" >::: [ "SP 300-38A" >::: aes_ctr_cases; ] ; 1000 - "AES-GCM" >::: gcm_cases ; 1001 - (* "AES-CCM" >::: ccm_cases ; *) 1002 - "AES-CCM-REGRESSION" >::: ccm_regressions ; 1003 - "AES-GCM-REGRESSION" >::: gcm_regressions ; 1004 - "Chacha20" >::: chacha20_cases ; 1005 - "poly1305" >:: poly1305_rfc8439_2_5_2 ; 1006 - "empty" >:: empty_cases ; 1007 - ] 1038 + let suite = 1039 + [ 1040 + "3DES-ECB" >::: des_ecb_cases; 1041 + "3DES-CBC" >::: des_cbc_cases; 1042 + "3DES-CTR" >::: des_ctr_cases; 1043 + "AES-ECB" >::: [ "SP 300-38A" >::: aes_ecb_cases ]; 1044 + "AES-CBC" >::: [ "SP 300-38A" >::: aes_cbc_cases ]; 1045 + "AES-CTR" >::: [ "SP 300-38A" >::: aes_ctr_cases ]; 1046 + "AES-GCM" >::: gcm_cases; 1047 + (* "AES-CCM" >::: ccm_cases ; *) 1048 + "AES-CCM-REGRESSION" >::: ccm_regressions; 1049 + "AES-GCM-REGRESSION" >::: gcm_regressions; 1050 + "Chacha20" >::: chacha20_cases; 1051 + "poly1305" >:: poly1305_rfc8439_2_5_2; 1052 + "empty" >:: empty_cases; 1053 + ]
+21 -28
tests/test_common.ml
··· 1 1 open OUnit2 2 2 3 - let (prf, strf) = Format.(fprintf, asprintf) 3 + let prf, strf = Format.(fprintf, asprintf) 4 4 let pp_map pp f ppf x = pp ppf (f x) 5 5 let pp_diff pp ppf (a, b) = prf ppf "@[<v>want: %a@,have: %a@]" pp a pp b 6 6 ··· 11 11 !st 12 12 and digit c = 13 13 match c with 14 - | '0'..'9' -> int_of_char c - 0x30 15 - | 'A'..'F' -> int_of_char c - 0x41 + 10 16 - | 'a'..'f' -> int_of_char c - 0x61 + 10 14 + | '0' .. '9' -> int_of_char c - 0x30 15 + | 'A' .. 'F' -> int_of_char c - 0x41 + 10 16 + | 'a' .. 'f' -> int_of_char c - 0x61 + 10 17 17 | _ -> invalid_arg "bad character" 18 18 and is_space = function 19 19 | ' ' | '\012' | '\n' | '\r' | '\t' -> true 20 20 | _ -> false 21 21 in 22 22 let chars, leftover = 23 - fold (fun (chars, leftover) c -> 24 - if skip_ws && is_space c then 25 - chars, leftover 23 + fold 24 + (fun (chars, leftover) c -> 25 + if skip_ws && is_space c then (chars, leftover) 26 26 else 27 27 let c = digit c in 28 28 match leftover with 29 - | None -> chars, Some (c lsl 4) 30 - | Some c' -> (c' lor c) :: chars, None) 29 + | None -> (chars, Some (c lsl 4)) 30 + | Some c' -> ((c' lor c) :: chars, None)) 31 31 ([], None) s 32 32 in 33 33 let chars = List.rev chars in 34 34 assert (leftover = None); 35 35 String.init (List.length chars) (fun i -> char_of_int (List.nth chars i)) 36 36 37 - let rec range a b = 38 - if a > b then [] else a :: range (succ a) b 37 + let rec range a b = if a > b then [] else a :: range (succ a) b 39 38 40 39 let rec times ~n f a = 41 - if n > 0 then ( ignore (f a) ; times ~n:(pred n) f a ) 40 + if n > 0 then ( 41 + ignore (f a); 42 + times ~n:(pred n) f a) 42 43 43 - let pp_opt pp ppf = Format.(function 44 - | Some x -> fprintf ppf "Some(%a)" pp x 45 - | None -> fprintf ppf "None") 46 - 47 - let eq_opt eq a b = match (a, b) with 48 - | (Some x, Some y) -> eq x y 49 - | _ -> false 44 + let pp_opt pp ppf = 45 + Format.( 46 + function 47 + | Some x -> fprintf ppf "Some(%a)" pp x 48 + | None -> fprintf ppf "None") 50 49 50 + let eq_opt eq a b = match (a, b) with Some x, Some y -> eq x y | _ -> false 51 51 let pp_octets pp = pp (Ohex.pp_hexdump ()) 52 52 53 53 let assert_oct_equal ?msg = 54 54 assert_equal ~cmp:String.equal ?msg ~pp_diff:(pp_octets pp_diff) 55 55 56 56 let iter_list xs f = List.iter f xs 57 - 58 - let cases_of f = 59 - List.map @@ fun params -> test_case (f params) 60 - 57 + let cases_of f = List.map @@ fun params -> test_case (f params) 61 58 let any _ = true 62 - 63 59 let vx = Ohex.decode 64 - 65 - let f1_eq ?msg f (a, b) _ = 66 - assert_oct_equal ?msg (f (vx a)) (vx b) 67 - 60 + let f1_eq ?msg f (a, b) _ = assert_oct_equal ?msg (f (vx a)) (vx b) 68 61 let f2_eq ?msg f (a, b, c) = f1_eq ?msg (f (vx a)) (b, c)
+60 -64
tests/test_dh.ml
··· 1 1 open OUnit2 2 - 3 2 open Crypto_pk 4 - 5 3 open Test_common 6 4 7 5 let dh_selftest ~bits n = 8 - "selftest" >:: times ~n @@ fun _ -> 9 - let p = Dh.gen_group ~bits () in 10 - let (s1, m1) = Dh.gen_key p 11 - and (s2, m2) = Dh.gen_key p in 12 - let sh1 = Dh.shared s1 m2 13 - and sh2 = Dh.shared s2 m1 in 14 - assert_equal sh1 sh2 15 - ~cmp:(eq_opt String.equal) 16 - ~pp_diff:(pp_diff (fun ppf -> function 17 - | None -> Format.fprintf ppf "None" 18 - | Some a -> Format.fprintf ppf "Some(%a)" (Ohex.pp_hexdump ()) a)) 19 - ~msg:"shared secret" 6 + "selftest" 7 + >:: times ~n @@ fun _ -> 8 + let p = Dh.gen_group ~bits () in 9 + let s1, m1 = Dh.gen_key p and s2, m2 = Dh.gen_key p in 10 + let sh1 = Dh.shared s1 m2 and sh2 = Dh.shared s2 m1 in 11 + assert_equal sh1 sh2 ~cmp:(eq_opt String.equal) 12 + ~pp_diff: 13 + (pp_diff (fun ppf -> function 14 + | None -> Format.fprintf ppf "None" 15 + | Some a -> Format.fprintf ppf "Some(%a)" (Ohex.pp_hexdump ()) a)) 16 + ~msg:"shared secret" 20 17 21 18 let dh_shared_0 = 22 19 "shared_0" >:: fun _ -> 23 - let gy = vx 24 - "14 ac e2 c0 9c c0 0c 25 89 71 b2 d0 1c 94 58 21 25 - 02 23 b7 23 ec 3e 24 e5 a3 c2 fd 16 cc 49 f0 e2 26 - 87 62 a5 a0 73 f5 de 5b 9b eb c3 60 0b a4 03 38 27 - 0f e1 8c f2 80 b3 64 16 f2 af ab 2e ec 25 81 2c 28 - 84 ae 92 0a 0f 15 9b f3 d9 1f dc 08 7d 8d 27 3a 29 - 91 7d a5 89 dc 94 d6 bc 3f 9d 6d b3 f8 8e f2 37 30 - 86 54 ec 85 ea 4c a0 4c b1 f6 49 83 1c 62 a7 79 31 - 2b 8b 9c e7 fa 47 3e 34 6c c5 ae 12 a3 4e d5 ce 32 - 4b da ea 72 7a 8d c6 67 ef 7e f2 00 24 d7 21 42 33 - a5 23 69 38 7e ec b5 fc 4b 89 42 c4 32 fa e5 58 34 - 6f 39 5d a7 4e cd b5 da dc 1e 52 fe a4 33 72 c1 35 - 82 48 8a 5b c1 44 bc 60 9b 38 5b 80 5f 44 14 93" 36 - and s = vx 37 - "f9 47 87 95 d2 a1 6d d1 7c c8 a9 c0 71 28 a2 82 38 - 71 95 7e 79 87 0b fc 34 a2 42 ec 42 ac cc 42 81 39 - 7b f6 c4 f5 80 a9 70 e3 35 93 9b a3 21 81 a4 e3 40 - 6b 65 3f 1c 5c ab 87 23 86 eb 76 29 66 26 5b e9 41 - c4 d0 26 05 3f de 6c 2f a6 14 f6 bf 77 74 a0 e8 42 - ef e7 12 62 a3 83 e5 66 d8 6c e5 c6 58 67 2a 61 43 - f5 7b 7c 15 15 63 22 55 96 92 9e bd cc b3 bc 2b 44 - 5e e1 ac 5f 75 23 ca 2f 19 5a f1 18 6e 17 f8 c2 45 - f7 11 c7 14 1d 81 bd be 02 31 3f 49 62 7d 02 11 46 - 29 22 63 6e bb 1a 7f 93 bd 98 db 20 94 f8 f0 2e 47 - db ce 9d 79 db b9 a7 41 5f e5 29 a2 31 f8 e2 c3 48 - 30 6a 09 f2 16 a7 30 8c 2f 36 7b 71 99 1e 28 54" 49 - and shared = vx 50 - "a7 40 0d eb f0 4b 2b ec cb 90 3c 55 2d 3c 17 63 51 - b2 4b 4e 1a ff 1e a0 24 c6 56 e3 5e 44 7b d0 01 52 - ef b3 6b 57 20 0e 15 95 b1 53 1a 83 16 3a b1 61 53 - 06 65 f1 7e 64 63 6f 23 86 22 34 c3 fe a9 60 87 54 - 3f 18 c6 5d 44 3e ac e3 85 34 86 6f db aa 31 3b 55 - 4b 4d 68 f7 19 d7 91 a3 12 27 d6 5a ce 29 c8 1b 56 - 5a 59 74 10 8c ff 98 4e 4f 37 ef 5b 43 e8 e2 ad 57 - a8 49 c9 7e c3 c5 3d 35 40 30 8e a4 41 69 1d 16 58 - 34 ba 9a 7e f3 ab d1 0e bb f2 81 15 e9 04 63 ee 59 - 1b bf cc 24 6d cb 41 c4 06 b2 f3 01 1b 31 3a 1e 60 - dc e3 3b c7 cc 1d 19 95 d9 fe 6a 5c a7 57 46 dd 61 - 84 69 0c 45 37 2e 1f 52 96 05 d7 e5 01 9a c8" 62 - in 63 - let grp = Dh.Group.oakley_5 in 64 - match Dh.(shared (fst (key_of_secret grp ~s)) gy) with 65 - | None -> assert_failure "degenerate shared secret" 66 - | Some shared' -> 67 - assert_oct_equal ~msg:"shared secret" shared shared' 20 + let gy = 21 + vx 22 + "14 ac e2 c0 9c c0 0c 25 89 71 b2 d0 1c 94 58 21\n\ 23 + \ 02 23 b7 23 ec 3e 24 e5 a3 c2 fd 16 cc 49 f0 e2\n\ 24 + \ 87 62 a5 a0 73 f5 de 5b 9b eb c3 60 0b a4 03 38\n\ 25 + \ 0f e1 8c f2 80 b3 64 16 f2 af ab 2e ec 25 81 2c\n\ 26 + \ 84 ae 92 0a 0f 15 9b f3 d9 1f dc 08 7d 8d 27 3a\n\ 27 + \ 91 7d a5 89 dc 94 d6 bc 3f 9d 6d b3 f8 8e f2 37\n\ 28 + \ 86 54 ec 85 ea 4c a0 4c b1 f6 49 83 1c 62 a7 79\n\ 29 + \ 2b 8b 9c e7 fa 47 3e 34 6c c5 ae 12 a3 4e d5 ce\n\ 30 + \ 4b da ea 72 7a 8d c6 67 ef 7e f2 00 24 d7 21 42\n\ 31 + \ a5 23 69 38 7e ec b5 fc 4b 89 42 c4 32 fa e5 58\n\ 32 + \ 6f 39 5d a7 4e cd b5 da dc 1e 52 fe a4 33 72 c1\n\ 33 + \ 82 48 8a 5b c1 44 bc 60 9b 38 5b 80 5f 44 14 93" 34 + and s = 35 + vx 36 + "f9 47 87 95 d2 a1 6d d1 7c c8 a9 c0 71 28 a2 82\n\ 37 + \ 71 95 7e 79 87 0b fc 34 a2 42 ec 42 ac cc 42 81\n\ 38 + \ 7b f6 c4 f5 80 a9 70 e3 35 93 9b a3 21 81 a4 e3\n\ 39 + \ 6b 65 3f 1c 5c ab 87 23 86 eb 76 29 66 26 5b e9\n\ 40 + \ c4 d0 26 05 3f de 6c 2f a6 14 f6 bf 77 74 a0 e8\n\ 41 + \ ef e7 12 62 a3 83 e5 66 d8 6c e5 c6 58 67 2a 61\n\ 42 + \ f5 7b 7c 15 15 63 22 55 96 92 9e bd cc b3 bc 2b\n\ 43 + \ 5e e1 ac 5f 75 23 ca 2f 19 5a f1 18 6e 17 f8 c2\n\ 44 + \ f7 11 c7 14 1d 81 bd be 02 31 3f 49 62 7d 02 11\n\ 45 + \ 29 22 63 6e bb 1a 7f 93 bd 98 db 20 94 f8 f0 2e\n\ 46 + \ db ce 9d 79 db b9 a7 41 5f e5 29 a2 31 f8 e2 c3\n\ 47 + \ 30 6a 09 f2 16 a7 30 8c 2f 36 7b 71 99 1e 28 54" 48 + and shared = 49 + vx 50 + "a7 40 0d eb f0 4b 2b ec cb 90 3c 55 2d 3c 17 63\n\ 51 + \ b2 4b 4e 1a ff 1e a0 24 c6 56 e3 5e 44 7b d0 01\n\ 52 + \ ef b3 6b 57 20 0e 15 95 b1 53 1a 83 16 3a b1 61\n\ 53 + \ 06 65 f1 7e 64 63 6f 23 86 22 34 c3 fe a9 60 87\n\ 54 + \ 3f 18 c6 5d 44 3e ac e3 85 34 86 6f db aa 31 3b\n\ 55 + \ 4b 4d 68 f7 19 d7 91 a3 12 27 d6 5a ce 29 c8 1b\n\ 56 + \ 5a 59 74 10 8c ff 98 4e 4f 37 ef 5b 43 e8 e2 ad\n\ 57 + \ a8 49 c9 7e c3 c5 3d 35 40 30 8e a4 41 69 1d 16\n\ 58 + \ 34 ba 9a 7e f3 ab d1 0e bb f2 81 15 e9 04 63 ee\n\ 59 + \ 1b bf cc 24 6d cb 41 c4 06 b2 f3 01 1b 31 3a 1e\n\ 60 + \ dc e3 3b c7 cc 1d 19 95 d9 fe 6a 5c a7 57 46 dd\n\ 61 + \ 84 69 0c 45 37 2e 1f 52 96 05 d7 e5 01 9a c8" 62 + in 63 + let grp = Dh.Group.oakley_5 in 64 + match Dh.(shared (fst (key_of_secret grp ~s)) gy) with 65 + | None -> assert_failure "degenerate shared secret" 66 + | Some shared' -> assert_oct_equal ~msg:"shared secret" shared shared' 68 67 69 - let suite = [ 70 - dh_selftest ~bits:16 1000 ; 71 - dh_selftest ~bits:128 100 ; 72 - dh_shared_0 73 - ] 68 + let suite = 69 + [ dh_selftest ~bits:16 1000; dh_selftest ~bits:128 100; dh_shared_0 ]
+3088 -2200
tests/test_dsa.ml
··· 1 1 open OUnit2 2 - 3 2 open Crypto.Uncommon 4 3 open Crypto_pk 5 - 6 4 open Test_common 7 5 8 6 (* ··· 14 12 15 13 let dsa_test ~priv ~msg ?k ~r ~s ~hash _ = 16 14 let hmsg = Digestif.(digest_string hash msg |> to_raw_string hash) in 17 - let (r', s') = Dsa.sign ~mask:`No ~key:priv ?k hmsg in 18 - assert_oct_equal ~msg:"computed r" r r' ; 19 - assert_oct_equal ~msg:"computed s" s s' ; 15 + let r', s' = Dsa.sign ~mask:`No ~key:priv ?k hmsg in 16 + assert_oct_equal ~msg:"computed r" r r'; 17 + assert_oct_equal ~msg:"computed s" s s'; 20 18 (* now with masking *) 21 - let (r', s') = Dsa.sign ~key:priv ?k hmsg in 22 - assert_oct_equal ~msg:"computed r (masked)" r r' ; 23 - assert_oct_equal ~msg:"computed s (masked)" s s' ; 19 + let r', s' = Dsa.sign ~key:priv ?k hmsg in 20 + assert_oct_equal ~msg:"computed r (masked)" r r'; 21 + assert_oct_equal ~msg:"computed s (masked)" s s'; 24 22 let pub = Dsa.pub_of_priv priv in 25 - assert_bool "verify of given r, s" 26 - (Dsa.verify ~key:pub (r, s) hmsg) ; 27 - assert_bool "verify of computed r, s" 28 - (Dsa.verify ~key:pub (r', s') hmsg) 23 + assert_bool "verify of given r, s" (Dsa.verify ~key:pub (r, s) hmsg); 24 + assert_bool "verify of computed r, s" (Dsa.verify ~key:pub (r', s') hmsg) 29 25 30 - let params ~p ~q ~g = vx p, vx q, vx g 26 + let params ~p ~q ~g = (vx p, vx q, vx g) 31 27 32 28 let priv_of f ~p ~q ~gg ~x ~y = 33 - match Dsa.priv ~fips:true ~p:(f p) ~q:(f q) ~gg:(f gg) ~x:(f x) ~y:(f y) () with 29 + match 30 + Dsa.priv ~fips:true ~p:(f p) ~q:(f q) ~gg:(f gg) ~x:(f x) ~y:(f y) () 31 + with 34 32 | Ok dsa -> dsa 35 33 | Error (`Msg m) -> invalid_arg "bad DSA private key %s" m 36 34 37 - let priv_of_cs = priv_of Z_extra.of_octets_be 35 + let priv_of_cs = priv_of Z_extra.of_octets_be 38 36 let priv_of_hex = priv_of (fun cs -> vx cs |> Z_extra.of_octets_be) 39 37 40 38 let case_of ~domain ~hash ~x ~y ~k ~r ~s ~msg = 41 - let (p, q, gg) = domain in 42 - let priv = priv_of_cs ~p ~q ~gg ~x:(vx x) ~y:(vx y) 43 - and (r, s) = vx r, vx s 44 - and k = Z_extra.of_octets_be (vx k) 45 - and msg = vx msg in 39 + let p, q, gg = domain in 40 + let priv = priv_of_cs ~p ~q ~gg ~x:(vx x) ~y:(vx y) 41 + and r, s = (vx r, vx s) 42 + and k = Z_extra.of_octets_be (vx k) 43 + and msg = vx msg in 46 44 dsa_test ~priv ~msg ~k ~r ~s ~hash 47 45 48 46 let sha1_cases = 49 47 (*[mod = L=1024, N=160, SHA-1] *) 50 48 let domain = 51 - params ~p:"a8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5ebe2d1229681b5b06439ac9c7e9d8bde283" 52 - ~q:"f85f0f83ac4df7ea0cdf8f469bfeeaea14156495" 53 - ~g:"2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a3a99bbe089216368171bd0ba81de4fe33" 49 + params 50 + ~p: 51 + "a8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5ebe2d1229681b5b06439ac9c7e9d8bde283" 52 + ~q:"f85f0f83ac4df7ea0cdf8f469bfeeaea14156495" 53 + ~g: 54 + "2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a3a99bbe089216368171bd0ba81de4fe33" 54 55 in 55 56 let case = case_of ~domain ~hash:Digestif.sha1 in 56 57 57 - [ case 58 - ~msg:"3b46736d559bd4e0c2c1b2553a33ad3c6cf23cac998d3d0c0e8fa4b19bca06f2f386db2dcff9dca4f40ad8f561ffc308b46c5f31a7735b5fa7e0f9e6cb512e63d7eea05538d66a75cd0d4234b5ccf6c1715ccaaf9cdc0a2228135f716ee9bdee7fc13ec27a03a6d11c5c5b3685f51900b1337153bc6c4e8f52920c33fa37f4e7" 59 - ~x:"c53eae6d45323164c7d07af5715703744a63fc3a" 60 - ~y:"313fd9ebca91574e1c2eebe1517c57e0c21b0209872140c5328761bbb2450b33f1b18b409ce9ab7c4cd8fda3391e8e34868357c199e16a6b2eba06d6749def791d79e95d3a4d09b24c392ad89dbf100995ae19c01062056bb14bce005e8731efde175f95b975089bdcdaea562b32786d96f5a31aedf75364008ad4fffebb970b" 61 - ~k:"98cbcc4969d845e2461b5f66383dd503712bbcfa" 62 - ~r:"50ed0e810e3f1c7cb6ac62332058448bd8b284c0" 63 - ~s:"c6aded17216b46b7e4b6f2a97c1ad7cc3da83fde" ; 64 - 65 - case 66 - ~msg:"d2bcb53b044b3e2e4b61ba2f91c0995fb83a6a97525e66441a3b489d9594238bc740bdeea0f718a769c977e2de003877b5d7dc25b182ae533db33e78f2c3ff0645f2137abc137d4e7d93ccf24f60b18a820bc07c7b4b5fe08b4f9e7d21b256c18f3b9d49acc4f93e2ce6f3754c7807757d2e1176042612cb32fc3f4f70700e25" 67 - ~x:"e65131d73470f6ad2e5878bdc9bef536faf78831" 68 - ~y:"29bdd759aaa62d4bf16b4861c81cf42eac2e1637b9ecba512bdbc13ac12a80ae8de2526b899ae5e4a231aef884197c944c732693a634d7659abc6975a773f8d3cd5a361fe2492386a3c09aaef12e4a7e73ad7dfc3637f7b093f2c40d6223a195c136adf2ea3fbf8704a675aa7817aa7ec7f9adfb2854d4e05c3ce7f76560313b" 69 - ~k:"87256a64e98cf5be1034ecfa766f9d25d1ac7ceb" 70 - ~r:"a26c00b5750a2d27fe7435b93476b35438b4d8ab" 71 - ~s:"61c9bfcb2938755afa7dad1d1e07c6288617bf70" ; 72 - 73 - case 74 - ~msg:"d5431e6b16fdae31481742bd394758beb8e24f31947e19b7ea7b458521882270c1f43192aa050f4485145af8f3f9c5142d68b85018d2ec9cb7a37ba12ed23e73b95fd680fba3c61265e9f5a0a027d70fad0c8aa08a3cbfbe99018d0045386173e5fae225faebe0cef5dd45910f400a86c2be4e15252a16de4120a267be2b594d" 75 - ~x:"20bcabc6d9347a6e79b8e498c60c44a19c73258c" 76 - ~y:"23b4f404aa3c575e550bb320fdb1a085cd396a10e5ebc6771da62f037cab19eacd67d8222b6344038c4f7af45f5e62b55480cbe2111154ca9697ca76d87b56944138084e74c6f90a05cf43660dff8b8b3fabfcab3f0e4416775fdf40055864be102b4587392e77752ed2aeb182ee4f70be4a291dbe77b84a44ee34007957b1e0" 77 - ~k:"7d9bcfc9225432de9860f605a38d389e291ca750" 78 - ~r:"3f0a4ad32f0816821b8affb518e9b599f35d57c2" 79 - ~s:"ea06638f2b2fc9d1dfe99c2a492806b497e2b0ea" ; 80 - 81 - case 82 - ~msg:"85662b697550e4915c29e338b624b912845d6d1a920d9e4c1604dd47d692bc7c0ffb95ae614e852bebaf1573758ad01c713cac0b476e2f121745a3cfeeffb2441ff6abfb9bbeb98aa634ca6ff541947dcc9927659d44f95c5ff9170fdc3c86473cb601ba31b487fe5936bac5d9c632cbcc3db06246ba01c55a038d797fe3f6c3" 83 - ~x:"52d1fbe687aa0702a51a5bf9566bd51bd569424c" 84 - ~y:"6bc36cb3fa61cecc157be08639a7ca9e3de073b8a0ff23574ce5ab0a867dfd60669a56e60d1c989b3af8c8a43f5695d503e3098963990e12b63566784171058eace85c728cd4c08224c7a6efea75dca20df461013c75f40acbc23799ebee7f3361336dadc4a56f305708667bfe602b8ea75a491a5cf0c06ebd6fdc7161e10497" 85 - ~k:"960c211891c090d05454646ebac1bfe1f381e82b" 86 - ~r:"3bc29dee96957050ba438d1b3e17b02c1725d229" 87 - ~s:"0af879cf846c434e08fb6c63782f4d03e0d88865" ; 88 - 89 - case 90 - ~msg:"87b6e75b9f8e99c4dd62adb693dd5890edff1bd0028f4ef849df0f1d2ce6b181fc3a55aea6d0a1f0aecab8ed9e248a00e96be794a7cfba1246efb710ef4b37471cef0a1bcf55cebc8d5ad071612bd237efedd5102362db07a1e2c7a6f15e09fe64ba42b60a2628d869ae05ef611fe38d9ce15eeec9bb3decc8dc17809f3b6e95" 91 - ~x:"c86a54ec5c4ec63d7332cf43ddb082a34ed6d5f5" 92 - ~y:"014ac746d3605efcb8a2c7dae1f54682a262e27662b252c09478ce87d0aaa522d7c200043406016c0c42896d21750b15dbd57f9707ec37dcea5651781b67ad8d01f5099fe7584b353b641bb159cc717d8ceb18b66705e656f336f1214b34f0357e577ab83641969e311bf40bdcb3ffd5e0bb59419f229508d2f432cc2859ff75" 93 - ~k:"6c445cee68042553fbe63be61be4ddb99d8134af" 94 - ~r:"637e07a5770f3dc65e4506c68c770e5ef6b8ced3" 95 - ~s:"7dfc6f83e24f09745e01d3f7ae0ed1474e811d47" ; 96 - 97 - case 98 - ~msg:"2259eead2d6bbc76d49213ea0dc8b7350a97699f22341044c3940782364ac9ea683179a438a5ea45998df97c2972dae03851f5be23fa9f04182e79ddb2b56dc8652393ecb27f3f3b7c8a8d761a86b3b8f4d41a07b4be7d02fddefc42b928124a5a45b9f4609042209b3a7f585bd514cc39c00effcc42c7fe70fa83edf8a32bf4" 99 - ~x:"aee6f213b9903c8069387e64729a08999e5baf65" 100 - ~y:"0fe74045d7b0d472411202831d4932396f242a9765e92be387fd81bbe38d845054528b348c03984179b8e505674cb79d88cc0d8d3e8d7392f9aa773b29c29e54a9e326406075d755c291fcedbcc577934c824af988250f64ed5685fce726cff65e92d708ae11cbfaa958ab8d8b15340a29a137b5b4357f7ed1c7a5190cbf98a4" 101 - ~k:"e1704bae025942e2e63c6d76bab88da79640073a" 102 - ~r:"83366ba3fed93dfb38d541203ecbf81c363998e2" 103 - ~s:"1fe299c36a1332f23bf2e10a6c6a4e0d3cdd2bf4" ; 104 - 105 - case 106 - ~msg:"219e8df5bf881590430ece608250f7670dc56537249302429e28ecfeb9ceaaa54910a69490f765f3df82e8b01cd7d76e561d0f6ce226ef3cf752cada6febdc5bf00d67947f92d420516b9e37c96c8f1f2da0b075097c3bda758a8d91bd2ebe9c75cf147f254c256963b33b67d02b6aa09e7d7465d038e50195ece4189b41e768" ~x:"699f1c07aa458c6786e770b40197235fe49cf21a" ~y:"3a41b0678ff3c4dde20fa39772bac31a2f18bae4bedec9e12ee8e02e30e556b1a136013bef96b0d30b568233dcecc71e485ed75c922afb4d0654e709bee84993792130220e3005fdb06ebdfc0e2df163b5ec424e836465acd6d92e243c86f2b94b26b8d73bd9cf722c757e0b80b0af16f185de70e8ca850b1402d126ea60f309" ~k:"5bbb795bfa5fa72191fed3434a08741410367491" ~r:"579761039ae0ddb81106bf4968e320083bbcb947" ~s:"503ea15dbac9dedeba917fa8e9f386b93aa30353" ; 107 - 108 - case 109 - ~msg:"2da79d067885eb3ccf5e293ae3b1d8225322203abb5adfde3b0f53bbe24c4fe001541e1183d870a997f1f9460100b5d711923180154345287a0214cf1cac37b7a47dfbb2a0e8ce4916f94ebd6fa54e315b7a8eb5b63cd954c5ba05c1bf7e33a4e8a151f32d2877b01729c1ad0e7c01bb8ae723c995183803e45636520ea38ca1" ~x:"d6e08c20c82949ddba93ea81eb2fea8c595894dc" ~y:"56f7272210f316c51af8bfc45a421fd4e9b1043853271b7e79f40936f0adcf262a86097aa86e19e6cb5307685d863dba761342db6c973b3849b1e060aca926f41fe07323601062515ae85f3172b8f34899c621d59fa21f73d5ae97a3deb5e840b25a18fd580862fd7b1cf416c7ae9fc5842a0197fdb0c5173ff4a4f102a8cf89" ~k:"6d72c30d4430959800740f2770651095d0c181c2" ~r:"5dd90d69add67a5fae138eec1aaff0229aa4afc4" ~s:"47f39c4db2387f10762f45b80dfd027906d7ef04" ; 110 - 111 - case 112 - ~msg:"ba30d85be357e7fb29f8a07e1f127baaa24b2ee027f64cb5efeec6aaeabcc7345c5d556ebf4bdc7a61c77c7b7ea43c73babc18f7b4807722da239e45ddf249849cbbfe3507112ebf87d7ef560c2e7d391ed8424f8710cea41685143e3006f81b68fbb4d5f9644c7cd10f7092ef2439b8d18c0df655e00289372a4166385d640c" ~x:"50018482864c1864e9db1f04bde8dbfd3875c76d" ~y:"0942a5b7a72ab116ead29308cf658dfe3d55d5d61afed9e3836e64237f9d6884fdd827d2d5890c9a41ae88e7a69fc9f345ade9c480c6f08cff067c183214c227236cedb6dd1283ca2a602574e8327510221d4c27b162143b7002d8c726916826265937b87be9d5ec6d7bd28fb015f84e0ab730da7a4eaf4ef3174bf0a22a6392" ~k:"df3a9348f37b5d2d4c9176db266ae388f1fa7e0f" ~r:"448434b214eee38bde080f8ec433e8d19b3ddf0d" ~s:"0c02e881b777923fe0ea674f2621298e00199d5f" ; 113 - 114 - case 115 - ~msg:"83499efb06bb7ff02ffb46c278a5e92630ac5bc3f9e53dd2e78ff15e368c7e31aad77cf771f35fa02d0b5f135208a4afdd867bb2ec26ea2e7dd64cdef237508a38b27f39d8b22d45cac5a68a90b6ea76058645f6356a9344d36f00ec6652eaa4e9bae7b694f9f1fc8c6c5e86fadc7b27a219b5c1b2ae80a725e5f61165fe2edc" ~x:"ae56f66b0a9405b9cca54c60ec4a3bb5f8be7c3f" ~y:"a01542c3da410dd57930ca724f0f507c4df43d553c7f69459939685941ceb95c7dcc3f175a403b359621c0d4328e98f15f330a63865baf3e7eb1604a0715e16eed64fd14b35d3a534259a6a7ddf888c4dbb5f51bbc6ed339e5bb2a239d5cfe2100ac8e2f9c16e536f25119ab435843af27dc33414a9e4602f96d7c94d6021cec" ~k:"8857ff301ad0169d164fa269977a116e070bac17" ~r:"8c2fab489c34672140415d41a65cef1e70192e23" ~s:"3df86a9e2efe944a1c7ea9c30cac331d00599a0e" ; 116 - 117 - case 118 - ~msg:"f23ee79eb4fce5cbf3b08d65a1803d2e3e191d3580a44d177d8ff069f90784d012ca5746e6dd6638dfe8413f1db3d8fe282c2160f5dd96607dd63d610f791dfc10abad18721587101cec8a2a12913cfbada3a5b7593958b9bfa6e9af3af5d71ff17ec72aaaeecaaffc5d174e629a090297e94cdfe988d9bf6c80827c23df5137" ~x:"a62079b4f45772bf17b85d7560e3be4e521439eb" ~y:"229a26dcaff29ed1a7264ed0f77d676239b9ba1ef4778e7dd640e8aa6fabdc1f1bd3f582e211bd01c26b3d9d3bffe7199f9ed45d764cd9d0e844b385cb34e6de22370ebc6ba41db409d63f50c1ac09bed00cdc2b7c55223c596b7e133ba25ba9e78f33502f8dd52f32a667a7683e504047817963238d9629a918a0ceebaad518" ~k:"c01acd36910f2f2bff608386b81c35a0a7c0b378" ~r:"8d388ec7f2863dd5b7c99ac93505d1580bf2e0c7" ~s:"76ae9317696d37f2d8bd61c47733e9455b61d347" ; 119 - 120 - case 121 - ~msg:"6836255e6e659de4ffb535892d466a3bea09693e587eb5bd50f44f8a22f11697057d68660bc6562400d587baac1c19d330ff794a70df5300a5211c72541a56d0ff2af02a278ed2db1df94ccb2026d3138b2d924245021ee835d3c17b0b3b7677def85611227f6ce2913e7cb446a479b95acfd0105c25e4656fbc56c2a10a22b3" ~x:"7861e82e66b6caea54b159c59c887ec27b2e915f" ~y:"a7bbc35423510edfebf79c4e2e56986f2806d11116bcae90a716f05dcbfc46dcbfebe2ec946c40f9cc8c1a7439cdd04e270122ec1c3baca83811a9f1bdaed9b1172150af1c8ce1c5d502dfe5f4e8467e50605087a8f8c5f45ca672fd049eec0a06f5e01f782d51f3ba56404bf1388065552fc87ad21ac0fa4027a145d0b0d9e6" ~k:"4e22cfa2e8ca2b33a9fd91ff4837fc205864e8b1" ~r:"c0ab43d309a5e94b6ef4db9943306e6d966fc9b5" ~s:"07ec5aa1928f19fc3a420f29b935bac46124c0e2" ; 122 - 123 - case 124 - ~msg:"4b0845c99db348294f1d83166b27f448ec29ab7965464477f45444f44672a409ddcafaf35e91faf401eca7498e3268caa2d96bf1aa840c0e1ed43a5ab60888fcf02b2f8a2c89daa598adf0b7d2dace9210efd41ab496a1e73a182da430c1d043e249a1289c91809c8c7298cfdbb0ae438b00936c283a0ec2d79cdc81c9ce3c2d" ~x:"6f2d3b09fae6910dd975870db3a2c19d97169491" ~y:"541a9c45e165d3d91e71bb1370d7c032c360322aa15e99d8c1c16ea35c8c193224a06467ab77a65478c467b3f20cb0c5fdb8c84cefa69566a594a2aa54c3a948ebc1ea7e6c3d28d380cbd01740634c96b76d6a03cc6eba0afa7226f23fc10a18b0b6f97270dfa038160960b5b839ba66af50fda07245810e80d38b6693e8a9ce" ~k:"8588557c12ec6fe176b0be7bbd8b482ad78f1fef" ~r:"44286019c1d53103980616940c028bad3217f78d" ~s:"4b372bf527c515f58025699a45f2021ef18e11b9" ; 125 - 126 - case 127 - ~msg:"4597c1ca0b0764be31fa73ccc589116cc8d0a31605f2550eb37fa569b2496c4f34321d61bb8e49f858c8671b7437fc15f269dd2d4146470b817dfe3069225ddd3cd4a6c977fb6cfc0d43264a7bf6659283e140e4c89ab2e8a4d0ede6274961d655bd79c7e47880a741fb0180c325b5b7d2f7b8a57aed52d0206a83bb69a9d7a4" ~x:"49f6c1ac8e639bcc99b2d9d1f1e325713f29b97c" ~y:"5315adf90e196946be6b04c5414da1fafd98b0d17c3a39000a00091b7b56574b1ecd026eabb25be9ecd0ad691df2b7bf7eecd6ad95bb4d7d17ac747060ee7e3eb5c6fb7557cf7e8003a620e43e587d0612854472c3ad851839f744159411a33876aec365eb0491dec80ba14cba2d11dec42af4a4bf9c99312a2ae7e5462a2adf" ~k:"8ef1c5976ac8caf74df65d9ecdbe78a6490bc220" ~r:"90d547712bc0cebbd3ebd18a63d9b92a03953050" ~s:"34ea6176b4c63043295f129a4895e14ee5816563" ; 128 - 129 - case 130 - ~msg:"18c62a40b52347a473f57aa668eebb4484beb5f10fdc51779e6770106c0d122eb6356ae53a3379e270edca39015da3005770c7b2a5afd11217993153ff43a0b26db01aa2a493de061492a0aa3f229b5abd1aff29395e31b063504eb35620219ba29997f92a52e1b2e6ff207480fd13d58ff0290eec5aabf23b84943eea20a43c" ~x:"396cbe3e71d74f6db795c38d49c32d78eab03397" ~y:"3b738246f9e38cebf4542ced3fc0c0096aeb9e9a3ad928f4dd4745d875fe6e20fb65556d06696432ecffd55b334940c6e23c903f0aa4a1335f7394c55070586baac86c38cc198ebaf15401259528c55192e9298d2a0c8914daf2ad00259fe72555c3c0442e38c1e6e5020928c6e6571a0a98f6f485e43791ae8aaab180461fa4" ~k:"04bfe51616f5c244d2e01648362f5bbe5fa73501" ~r:"29b7c0f90d624f8d587efd3f49f97da70f6e63e7" ~s:"222a3d9ffca0dcf57937e89c92538e32e7a8680f" 131 - ] 58 + [ 59 + case 60 + ~msg: 61 + "3b46736d559bd4e0c2c1b2553a33ad3c6cf23cac998d3d0c0e8fa4b19bca06f2f386db2dcff9dca4f40ad8f561ffc308b46c5f31a7735b5fa7e0f9e6cb512e63d7eea05538d66a75cd0d4234b5ccf6c1715ccaaf9cdc0a2228135f716ee9bdee7fc13ec27a03a6d11c5c5b3685f51900b1337153bc6c4e8f52920c33fa37f4e7" 62 + ~x:"c53eae6d45323164c7d07af5715703744a63fc3a" 63 + ~y: 64 + "313fd9ebca91574e1c2eebe1517c57e0c21b0209872140c5328761bbb2450b33f1b18b409ce9ab7c4cd8fda3391e8e34868357c199e16a6b2eba06d6749def791d79e95d3a4d09b24c392ad89dbf100995ae19c01062056bb14bce005e8731efde175f95b975089bdcdaea562b32786d96f5a31aedf75364008ad4fffebb970b" 65 + ~k:"98cbcc4969d845e2461b5f66383dd503712bbcfa" 66 + ~r:"50ed0e810e3f1c7cb6ac62332058448bd8b284c0" 67 + ~s:"c6aded17216b46b7e4b6f2a97c1ad7cc3da83fde"; 68 + case 69 + ~msg: 70 + "d2bcb53b044b3e2e4b61ba2f91c0995fb83a6a97525e66441a3b489d9594238bc740bdeea0f718a769c977e2de003877b5d7dc25b182ae533db33e78f2c3ff0645f2137abc137d4e7d93ccf24f60b18a820bc07c7b4b5fe08b4f9e7d21b256c18f3b9d49acc4f93e2ce6f3754c7807757d2e1176042612cb32fc3f4f70700e25" 71 + ~x:"e65131d73470f6ad2e5878bdc9bef536faf78831" 72 + ~y: 73 + "29bdd759aaa62d4bf16b4861c81cf42eac2e1637b9ecba512bdbc13ac12a80ae8de2526b899ae5e4a231aef884197c944c732693a634d7659abc6975a773f8d3cd5a361fe2492386a3c09aaef12e4a7e73ad7dfc3637f7b093f2c40d6223a195c136adf2ea3fbf8704a675aa7817aa7ec7f9adfb2854d4e05c3ce7f76560313b" 74 + ~k:"87256a64e98cf5be1034ecfa766f9d25d1ac7ceb" 75 + ~r:"a26c00b5750a2d27fe7435b93476b35438b4d8ab" 76 + ~s:"61c9bfcb2938755afa7dad1d1e07c6288617bf70"; 77 + case 78 + ~msg: 79 + "d5431e6b16fdae31481742bd394758beb8e24f31947e19b7ea7b458521882270c1f43192aa050f4485145af8f3f9c5142d68b85018d2ec9cb7a37ba12ed23e73b95fd680fba3c61265e9f5a0a027d70fad0c8aa08a3cbfbe99018d0045386173e5fae225faebe0cef5dd45910f400a86c2be4e15252a16de4120a267be2b594d" 80 + ~x:"20bcabc6d9347a6e79b8e498c60c44a19c73258c" 81 + ~y: 82 + "23b4f404aa3c575e550bb320fdb1a085cd396a10e5ebc6771da62f037cab19eacd67d8222b6344038c4f7af45f5e62b55480cbe2111154ca9697ca76d87b56944138084e74c6f90a05cf43660dff8b8b3fabfcab3f0e4416775fdf40055864be102b4587392e77752ed2aeb182ee4f70be4a291dbe77b84a44ee34007957b1e0" 83 + ~k:"7d9bcfc9225432de9860f605a38d389e291ca750" 84 + ~r:"3f0a4ad32f0816821b8affb518e9b599f35d57c2" 85 + ~s:"ea06638f2b2fc9d1dfe99c2a492806b497e2b0ea"; 86 + case 87 + ~msg: 88 + "85662b697550e4915c29e338b624b912845d6d1a920d9e4c1604dd47d692bc7c0ffb95ae614e852bebaf1573758ad01c713cac0b476e2f121745a3cfeeffb2441ff6abfb9bbeb98aa634ca6ff541947dcc9927659d44f95c5ff9170fdc3c86473cb601ba31b487fe5936bac5d9c632cbcc3db06246ba01c55a038d797fe3f6c3" 89 + ~x:"52d1fbe687aa0702a51a5bf9566bd51bd569424c" 90 + ~y: 91 + "6bc36cb3fa61cecc157be08639a7ca9e3de073b8a0ff23574ce5ab0a867dfd60669a56e60d1c989b3af8c8a43f5695d503e3098963990e12b63566784171058eace85c728cd4c08224c7a6efea75dca20df461013c75f40acbc23799ebee7f3361336dadc4a56f305708667bfe602b8ea75a491a5cf0c06ebd6fdc7161e10497" 92 + ~k:"960c211891c090d05454646ebac1bfe1f381e82b" 93 + ~r:"3bc29dee96957050ba438d1b3e17b02c1725d229" 94 + ~s:"0af879cf846c434e08fb6c63782f4d03e0d88865"; 95 + case 96 + ~msg: 97 + "87b6e75b9f8e99c4dd62adb693dd5890edff1bd0028f4ef849df0f1d2ce6b181fc3a55aea6d0a1f0aecab8ed9e248a00e96be794a7cfba1246efb710ef4b37471cef0a1bcf55cebc8d5ad071612bd237efedd5102362db07a1e2c7a6f15e09fe64ba42b60a2628d869ae05ef611fe38d9ce15eeec9bb3decc8dc17809f3b6e95" 98 + ~x:"c86a54ec5c4ec63d7332cf43ddb082a34ed6d5f5" 99 + ~y: 100 + "014ac746d3605efcb8a2c7dae1f54682a262e27662b252c09478ce87d0aaa522d7c200043406016c0c42896d21750b15dbd57f9707ec37dcea5651781b67ad8d01f5099fe7584b353b641bb159cc717d8ceb18b66705e656f336f1214b34f0357e577ab83641969e311bf40bdcb3ffd5e0bb59419f229508d2f432cc2859ff75" 101 + ~k:"6c445cee68042553fbe63be61be4ddb99d8134af" 102 + ~r:"637e07a5770f3dc65e4506c68c770e5ef6b8ced3" 103 + ~s:"7dfc6f83e24f09745e01d3f7ae0ed1474e811d47"; 104 + case 105 + ~msg: 106 + "2259eead2d6bbc76d49213ea0dc8b7350a97699f22341044c3940782364ac9ea683179a438a5ea45998df97c2972dae03851f5be23fa9f04182e79ddb2b56dc8652393ecb27f3f3b7c8a8d761a86b3b8f4d41a07b4be7d02fddefc42b928124a5a45b9f4609042209b3a7f585bd514cc39c00effcc42c7fe70fa83edf8a32bf4" 107 + ~x:"aee6f213b9903c8069387e64729a08999e5baf65" 108 + ~y: 109 + "0fe74045d7b0d472411202831d4932396f242a9765e92be387fd81bbe38d845054528b348c03984179b8e505674cb79d88cc0d8d3e8d7392f9aa773b29c29e54a9e326406075d755c291fcedbcc577934c824af988250f64ed5685fce726cff65e92d708ae11cbfaa958ab8d8b15340a29a137b5b4357f7ed1c7a5190cbf98a4" 110 + ~k:"e1704bae025942e2e63c6d76bab88da79640073a" 111 + ~r:"83366ba3fed93dfb38d541203ecbf81c363998e2" 112 + ~s:"1fe299c36a1332f23bf2e10a6c6a4e0d3cdd2bf4"; 113 + case 114 + ~msg: 115 + "219e8df5bf881590430ece608250f7670dc56537249302429e28ecfeb9ceaaa54910a69490f765f3df82e8b01cd7d76e561d0f6ce226ef3cf752cada6febdc5bf00d67947f92d420516b9e37c96c8f1f2da0b075097c3bda758a8d91bd2ebe9c75cf147f254c256963b33b67d02b6aa09e7d7465d038e50195ece4189b41e768" 116 + ~x:"699f1c07aa458c6786e770b40197235fe49cf21a" 117 + ~y: 118 + "3a41b0678ff3c4dde20fa39772bac31a2f18bae4bedec9e12ee8e02e30e556b1a136013bef96b0d30b568233dcecc71e485ed75c922afb4d0654e709bee84993792130220e3005fdb06ebdfc0e2df163b5ec424e836465acd6d92e243c86f2b94b26b8d73bd9cf722c757e0b80b0af16f185de70e8ca850b1402d126ea60f309" 119 + ~k:"5bbb795bfa5fa72191fed3434a08741410367491" 120 + ~r:"579761039ae0ddb81106bf4968e320083bbcb947" 121 + ~s:"503ea15dbac9dedeba917fa8e9f386b93aa30353"; 122 + case 123 + ~msg: 124 + "2da79d067885eb3ccf5e293ae3b1d8225322203abb5adfde3b0f53bbe24c4fe001541e1183d870a997f1f9460100b5d711923180154345287a0214cf1cac37b7a47dfbb2a0e8ce4916f94ebd6fa54e315b7a8eb5b63cd954c5ba05c1bf7e33a4e8a151f32d2877b01729c1ad0e7c01bb8ae723c995183803e45636520ea38ca1" 125 + ~x:"d6e08c20c82949ddba93ea81eb2fea8c595894dc" 126 + ~y: 127 + "56f7272210f316c51af8bfc45a421fd4e9b1043853271b7e79f40936f0adcf262a86097aa86e19e6cb5307685d863dba761342db6c973b3849b1e060aca926f41fe07323601062515ae85f3172b8f34899c621d59fa21f73d5ae97a3deb5e840b25a18fd580862fd7b1cf416c7ae9fc5842a0197fdb0c5173ff4a4f102a8cf89" 128 + ~k:"6d72c30d4430959800740f2770651095d0c181c2" 129 + ~r:"5dd90d69add67a5fae138eec1aaff0229aa4afc4" 130 + ~s:"47f39c4db2387f10762f45b80dfd027906d7ef04"; 131 + case 132 + ~msg: 133 + "ba30d85be357e7fb29f8a07e1f127baaa24b2ee027f64cb5efeec6aaeabcc7345c5d556ebf4bdc7a61c77c7b7ea43c73babc18f7b4807722da239e45ddf249849cbbfe3507112ebf87d7ef560c2e7d391ed8424f8710cea41685143e3006f81b68fbb4d5f9644c7cd10f7092ef2439b8d18c0df655e00289372a4166385d640c" 134 + ~x:"50018482864c1864e9db1f04bde8dbfd3875c76d" 135 + ~y: 136 + "0942a5b7a72ab116ead29308cf658dfe3d55d5d61afed9e3836e64237f9d6884fdd827d2d5890c9a41ae88e7a69fc9f345ade9c480c6f08cff067c183214c227236cedb6dd1283ca2a602574e8327510221d4c27b162143b7002d8c726916826265937b87be9d5ec6d7bd28fb015f84e0ab730da7a4eaf4ef3174bf0a22a6392" 137 + ~k:"df3a9348f37b5d2d4c9176db266ae388f1fa7e0f" 138 + ~r:"448434b214eee38bde080f8ec433e8d19b3ddf0d" 139 + ~s:"0c02e881b777923fe0ea674f2621298e00199d5f"; 140 + case 141 + ~msg: 142 + "83499efb06bb7ff02ffb46c278a5e92630ac5bc3f9e53dd2e78ff15e368c7e31aad77cf771f35fa02d0b5f135208a4afdd867bb2ec26ea2e7dd64cdef237508a38b27f39d8b22d45cac5a68a90b6ea76058645f6356a9344d36f00ec6652eaa4e9bae7b694f9f1fc8c6c5e86fadc7b27a219b5c1b2ae80a725e5f61165fe2edc" 143 + ~x:"ae56f66b0a9405b9cca54c60ec4a3bb5f8be7c3f" 144 + ~y: 145 + "a01542c3da410dd57930ca724f0f507c4df43d553c7f69459939685941ceb95c7dcc3f175a403b359621c0d4328e98f15f330a63865baf3e7eb1604a0715e16eed64fd14b35d3a534259a6a7ddf888c4dbb5f51bbc6ed339e5bb2a239d5cfe2100ac8e2f9c16e536f25119ab435843af27dc33414a9e4602f96d7c94d6021cec" 146 + ~k:"8857ff301ad0169d164fa269977a116e070bac17" 147 + ~r:"8c2fab489c34672140415d41a65cef1e70192e23" 148 + ~s:"3df86a9e2efe944a1c7ea9c30cac331d00599a0e"; 149 + case 150 + ~msg: 151 + "f23ee79eb4fce5cbf3b08d65a1803d2e3e191d3580a44d177d8ff069f90784d012ca5746e6dd6638dfe8413f1db3d8fe282c2160f5dd96607dd63d610f791dfc10abad18721587101cec8a2a12913cfbada3a5b7593958b9bfa6e9af3af5d71ff17ec72aaaeecaaffc5d174e629a090297e94cdfe988d9bf6c80827c23df5137" 152 + ~x:"a62079b4f45772bf17b85d7560e3be4e521439eb" 153 + ~y: 154 + "229a26dcaff29ed1a7264ed0f77d676239b9ba1ef4778e7dd640e8aa6fabdc1f1bd3f582e211bd01c26b3d9d3bffe7199f9ed45d764cd9d0e844b385cb34e6de22370ebc6ba41db409d63f50c1ac09bed00cdc2b7c55223c596b7e133ba25ba9e78f33502f8dd52f32a667a7683e504047817963238d9629a918a0ceebaad518" 155 + ~k:"c01acd36910f2f2bff608386b81c35a0a7c0b378" 156 + ~r:"8d388ec7f2863dd5b7c99ac93505d1580bf2e0c7" 157 + ~s:"76ae9317696d37f2d8bd61c47733e9455b61d347"; 158 + case 159 + ~msg: 160 + "6836255e6e659de4ffb535892d466a3bea09693e587eb5bd50f44f8a22f11697057d68660bc6562400d587baac1c19d330ff794a70df5300a5211c72541a56d0ff2af02a278ed2db1df94ccb2026d3138b2d924245021ee835d3c17b0b3b7677def85611227f6ce2913e7cb446a479b95acfd0105c25e4656fbc56c2a10a22b3" 161 + ~x:"7861e82e66b6caea54b159c59c887ec27b2e915f" 162 + ~y: 163 + "a7bbc35423510edfebf79c4e2e56986f2806d11116bcae90a716f05dcbfc46dcbfebe2ec946c40f9cc8c1a7439cdd04e270122ec1c3baca83811a9f1bdaed9b1172150af1c8ce1c5d502dfe5f4e8467e50605087a8f8c5f45ca672fd049eec0a06f5e01f782d51f3ba56404bf1388065552fc87ad21ac0fa4027a145d0b0d9e6" 164 + ~k:"4e22cfa2e8ca2b33a9fd91ff4837fc205864e8b1" 165 + ~r:"c0ab43d309a5e94b6ef4db9943306e6d966fc9b5" 166 + ~s:"07ec5aa1928f19fc3a420f29b935bac46124c0e2"; 167 + case 168 + ~msg: 169 + "4b0845c99db348294f1d83166b27f448ec29ab7965464477f45444f44672a409ddcafaf35e91faf401eca7498e3268caa2d96bf1aa840c0e1ed43a5ab60888fcf02b2f8a2c89daa598adf0b7d2dace9210efd41ab496a1e73a182da430c1d043e249a1289c91809c8c7298cfdbb0ae438b00936c283a0ec2d79cdc81c9ce3c2d" 170 + ~x:"6f2d3b09fae6910dd975870db3a2c19d97169491" 171 + ~y: 172 + "541a9c45e165d3d91e71bb1370d7c032c360322aa15e99d8c1c16ea35c8c193224a06467ab77a65478c467b3f20cb0c5fdb8c84cefa69566a594a2aa54c3a948ebc1ea7e6c3d28d380cbd01740634c96b76d6a03cc6eba0afa7226f23fc10a18b0b6f97270dfa038160960b5b839ba66af50fda07245810e80d38b6693e8a9ce" 173 + ~k:"8588557c12ec6fe176b0be7bbd8b482ad78f1fef" 174 + ~r:"44286019c1d53103980616940c028bad3217f78d" 175 + ~s:"4b372bf527c515f58025699a45f2021ef18e11b9"; 176 + case 177 + ~msg: 178 + "4597c1ca0b0764be31fa73ccc589116cc8d0a31605f2550eb37fa569b2496c4f34321d61bb8e49f858c8671b7437fc15f269dd2d4146470b817dfe3069225ddd3cd4a6c977fb6cfc0d43264a7bf6659283e140e4c89ab2e8a4d0ede6274961d655bd79c7e47880a741fb0180c325b5b7d2f7b8a57aed52d0206a83bb69a9d7a4" 179 + ~x:"49f6c1ac8e639bcc99b2d9d1f1e325713f29b97c" 180 + ~y: 181 + "5315adf90e196946be6b04c5414da1fafd98b0d17c3a39000a00091b7b56574b1ecd026eabb25be9ecd0ad691df2b7bf7eecd6ad95bb4d7d17ac747060ee7e3eb5c6fb7557cf7e8003a620e43e587d0612854472c3ad851839f744159411a33876aec365eb0491dec80ba14cba2d11dec42af4a4bf9c99312a2ae7e5462a2adf" 182 + ~k:"8ef1c5976ac8caf74df65d9ecdbe78a6490bc220" 183 + ~r:"90d547712bc0cebbd3ebd18a63d9b92a03953050" 184 + ~s:"34ea6176b4c63043295f129a4895e14ee5816563"; 185 + case 186 + ~msg: 187 + "18c62a40b52347a473f57aa668eebb4484beb5f10fdc51779e6770106c0d122eb6356ae53a3379e270edca39015da3005770c7b2a5afd11217993153ff43a0b26db01aa2a493de061492a0aa3f229b5abd1aff29395e31b063504eb35620219ba29997f92a52e1b2e6ff207480fd13d58ff0290eec5aabf23b84943eea20a43c" 188 + ~x:"396cbe3e71d74f6db795c38d49c32d78eab03397" 189 + ~y: 190 + "3b738246f9e38cebf4542ced3fc0c0096aeb9e9a3ad928f4dd4745d875fe6e20fb65556d06696432ecffd55b334940c6e23c903f0aa4a1335f7394c55070586baac86c38cc198ebaf15401259528c55192e9298d2a0c8914daf2ad00259fe72555c3c0442e38c1e6e5020928c6e6571a0a98f6f485e43791ae8aaab180461fa4" 191 + ~k:"04bfe51616f5c244d2e01648362f5bbe5fa73501" 192 + ~r:"29b7c0f90d624f8d587efd3f49f97da70f6e63e7" 193 + ~s:"222a3d9ffca0dcf57937e89c92538e32e7a8680f"; 194 + ] 132 195 133 196 let sha224_cases = 134 197 (* [mod = L=1024, N=160, SHA-224] *) 135 - let domain = params ~p:"8b9b32f5ba38faad5e0d506eb555540d0d7963195558ca308b7466228d92a17b3b14b8e0ab77a9f3b2959a09848aa69f8df92cd9e9edef0adf792ce77bfceccadd9352700ca5faecf181fa0c326db1d6e5d352458011e51bd3248f4e3bd7c820d7e0a81932aca1eba390175e53eada197223674e3900263e90f72d94e7447bff" 136 - ~q:"bc550e965647fb3a20f245ec8475624abbb26edd" 137 - ~g:"11333a931fba503487777376859fdc12f7c687b0948ae889d287f1b7a712ad220ae4f1ce379d0dbb5c9abf419621f005fc123c327e5055d1850634c36d397e689e111d598c1c3636b940c84f42f436846e8e7fcad9012ceda398720f32fffd1a45ab6136ce417069207ac140675b8f86dd063915ae6f62b0cec729fbd509ac17" 198 + let domain = 199 + params 200 + ~p: 201 + "8b9b32f5ba38faad5e0d506eb555540d0d7963195558ca308b7466228d92a17b3b14b8e0ab77a9f3b2959a09848aa69f8df92cd9e9edef0adf792ce77bfceccadd9352700ca5faecf181fa0c326db1d6e5d352458011e51bd3248f4e3bd7c820d7e0a81932aca1eba390175e53eada197223674e3900263e90f72d94e7447bff" 202 + ~q:"bc550e965647fb3a20f245ec8475624abbb26edd" 203 + ~g: 204 + "11333a931fba503487777376859fdc12f7c687b0948ae889d287f1b7a712ad220ae4f1ce379d0dbb5c9abf419621f005fc123c327e5055d1850634c36d397e689e111d598c1c3636b940c84f42f436846e8e7fcad9012ceda398720f32fffd1a45ab6136ce417069207ac140675b8f86dd063915ae6f62b0cec729fbd509ac17" 138 205 in 139 206 let case = case_of ~domain ~hash:Digestif.sha224 in 140 207 141 - [ case 142 - ~msg:"fb2128052509488cad0745ed3e6312850dd96ddaf791f1e624e22a6b9beaa65319c325c78ef59cacba0ccfa722259f24f92c17b77a8f6d8e97c93d880d2d8dbbbedcf6acefa06b0e476ca2013d0394bd90d56c10626ef43cea79d1ef0bc7ac452bf9b9acaef70325e055ac006d34024b32204abea4be5faae0a6d46d365ed0d9" ~x:"6e2e31bbfc670944d7a7120e39a981520614d8a8" ~y:"7e339f3757450390160e02291559f30bed0b2d758c5ccc2d8d456232bb435ae49de7e7957e3aad9bfdcf6fd5d9b6ee3b521bc2229a8421dc2aa59b9952345a8fc1de49b348003a9b18da642d7f6f56e3bc665131ae9762088a93786f7b4b72a4bcc308c67e2532a3a5bf09652055cc26bf3b18833598cffd7011f2285f794557" ~k:"8cb35d255505a4c41421e562d10827266aa68663" ~r:"afee719e7f848b54349ccc3b4fb26065833a4d8e" ~s:"734efe992256f31325e749bc32a24a1f957b3a1b" ; 143 - 144 - case 145 - ~msg:"02971e0cdd48ae2331db9c6285e9880e96104fa7a9f378dfea718e63efe98352fe4d35a2bc94b3a888cfb88b8b7d9f6c8c54e48613f32c9946ffe6e9a4b7108ececdda41bc151b3d8724b61f5b83a4e27476914387b0488e41be54f63aa773175eb373a3641e6e7950eee8faf048a841f107d30cf9be268493231545d8984694" ~x:"0b448f49a085a52a03d7f668a1d6fb87f2e221ac" ~y:"633bb757b3c0e3b7867bf845301ea4e39f75c9759c223f46ce266d406b9df5db501fb826b6e61cba6104c604458c90799f2a36ab51166d0e83b770840624fedc35ebfb9853419e7e09b32b4bd652da4f1ce973ac2620c966b61e35a3f216439a8de1a104f172e1b6e2878112a66c34d16a9aef3ac24a34af5edbf39818a3e2ef" ~k:"4481a4be9db6821e3b0a08c9c82603631971a682" ~r:"92c65e07462d668b06dd45b608784965897838bc" ~s:"2e40adf41cafb8048c793c7092a7e823515b6cfa" ; 146 - 147 - case 148 - ~msg:"062e82fb43236ee17ebfaa3d363b9b873d0fe41444c74cef7f7e3bd81f723fd90fd148a28e997585413695113757758aa4dd275f70b375f8903c7be46e3a3ad3190cd04971abd2f1db192ef0d2b98bbb80181a721a5809928b5bca5c118a2911132ad233cd27c7e41adfccfeb4e952874bfa819661182975e44d37c61734759c" ~x:"a4a25a8bb1c2ba69f9611939b591032b96333fa3" ~y:"3b0a091dfca05dce61e9f05b15b07487d2e3ea4f568dc9ac752d42c0aa771ae0ccc372ce9774fb9fd16a30cb3759bb1989488ce85db7cdfa506476acec644c21168f2db1f36efe0230c6fb8f1f2ae4eaf1799d5e29e212467b11bfbc1eebed142d7a017262cd8735e3e29d8e0c4a6e766c07d7aa9f8d176f536087bfecf4c414" ~k:"a7135820910f041b27321534a17bb1f33ac51aca" ~r:"ba554124874d06a6cef62740e15821ccddbfe6f3" ~s:"5962be757d75b0f17d15482ebb595ca4e9fbfe22" ; 149 - 150 - case 151 - ~msg:"4fca074844eae247d19c06e92032ae8e773043e2e1f45d400e9dcebbde5d65e7c1423b0390161991c026f38a0e2bfeef40dae18741737b1d535ab46b566a1b672fc22dec86747a7c7638fa65047f1ede36ad43f6aedf51b5bf2979adf4d9a94ed802a29de5603b704770b32c8b946a32e1b6054cd70c3add025cc9371d1e404d" ~x:"1f15cafca282083e82d7e54258647b2914418986" ~y:"40b638c94b1e719a337d83358699c70cd867ff888c655a5f5a1de8732d058bf027d4747efe3b8dedca3276de5a58f136ed35cff03030f672da65c71f18e58278ddfc7b9b50a248eff9236874ee3cb0d0a35b7b2ee185b139ea84eed7bffc5094ab8743a75374bc36c7d69d5f3e6fe5f3ef1f9358f00a3c5892fff41ed6afee3b" ~k:"128ab9677c7ade5e1c02a8427650ff054db6390e" ~r:"651a389d8ca50d6e3273cabbe71cd84cccd02361" ~s:"3401fe47b3812daa8c020c9bd42609cbebdfa728" ; 152 - 153 - case 154 - ~msg:"4d9630fe058998ca5b80ae62f3f73dc85bee291509843ac00240d13d55251ae53b37794783b97d53e042cab26f8c84de0a70f5b43051fbefb3e43f08f5d2e8aad9e2de2717412dbb902acc8849adc04d06fed8c1421c4cfe8b81ee7f5ac5d4f0c0b68e80b6f88fd3c7d5b32022572b0a681bd2d4df2d047b0b23b6887145afe1" ~x:"1485f719b8be77c78829baa0d2c322df60174476" ~y:"727b6528357d6705c20d31358f641934fdec63cc66df98837d2f378164e15fa0842207acf3220c8023a9f4f8d2057165b3c849eaeb5376e3fad11785f1d0261779aaedd53b1e52798007eb4c8e83b1ff321b620d883391a14fa47fec4901d96ec232eabb4a0bb4453368fef5176c67135649979d3214d3fb67a1319ac54feb01" ~k:"8f4cc1254c787ec8cbf54405105f7ef83ffdeee0" ~r:"9ca3e433504c557ba1aac66469781175cdfb4ad5" ~s:"72145dfa5279dd82ae99604d16a2b8df71b95320" ; 155 - 156 - case 157 - ~msg:"62b9d601e30b42a279c7e04df3ca8d8140a55cd5876c7e9181c73575e4c4f921a94e4e2d0bdd7ba98600d652e5df5be9464e7a9011ab486960f69d57ece1d2c4af9324457c1e3d83fba4265beb47407e4761dbc949d5bd67fee4a476a4d5a93d77acda96a221a0a31e0f024b3f0b8234c015238f3258daa085ae9f4e1aa7b1cc" ~x:"43c76a9a00045cdfb2e7927b5c8730e006423c05" ~y:"5f6dfb064caddf644af399e33a672565766761d55ac0b84bead42c3980e7e396043744361778f04dcb698e4563853420fecacd594af828f57df541d9e4de899d61f04f6379c1c96246d152369395242a1c2e70eef8f35417a0ffdb039282516ce21b85687904c511087f113e5142f027f1179712edcbce27939ab15ec49c085f" ~k:"5e4b5e4595e31397422c7a4487ae51051289be61" ~r:"331920a7b79e3cfa7638e409d9702aafd08fbec6" ~s:"071d06e6cd301515f37b60690afa219fe5083d96" ; 158 - 159 - case 160 - ~msg:"0006e09c20376442e689bf2d34268fd69109c1301ea66cbe90394cc0f41f94822c28845819b9a98764d2f7262e98891487ff55b05bd69e18b7cad41bd98e137566b6041c739db11f78e567cac02f33f140d19a4805002545375daebfd7dcbea33242e73c8e269149d7eb9db9f9006e17acb736b5e977645ab651b81225c5e543" ~x:"16f89d97dd3b31c191495173ae0e145c6ce185d6" ~y:"1b1f725664d75bdcb2a5a4c653061c460799dd48bf1e6b03e13c71d83e3fdb506fa94e6cafb5dbdead88a33d23d4e9287b4707e1fba871b97c9a48f930cdccba0dc06a4f0a8bfbb4e14d0b4d5a0871fa1341caec7bc08138713121d419769f31203508df71947265644fdc6137d8e466c8cb0ce985340cb2e279b4ce9315a772" ~k:"475b5aa12ff77d49e4c8171f80d3d1f15147ed12" ~r:"b6aa833b825184729af308f81bf5e58e2d7e9284" ~s:"5453b4b2e3fc802b2f977d0cf6eb7f5c16673fa3" ; 161 - 162 - case 163 - ~msg:"e04a71f2b5c176a0db17a983a17dec588c00f42c9aa3026b5eb440f07a2140c2ed84024e0531ea7788dfeaa91883fb6a9841c17dcfd312968adb00e556bc7eb3021f57b7a16894fa4fe12ec93dfd494a0a1c693d6ade154ef648c05552da41224d4922d1861d9f7671b8ce6ce448e895ea0eed25802e3350ec08ae79f2d61e0f" ~x:"3eda44e3c38380df7a4f47d8e1024596238bcef1" ~y:"687e16309b06817b93236dd990faef9e232eb81cb9c7d6dae4fdd4f8e7ca933e185b1da622d7c7fa35e0a3906f915ded14ba96d6035b46bd6ca5fe172af94e081fb0b9a9583a458bd206c1e87f97a57d00d6eade19ec56ac2e9bbd8c15df356ee7b12c91311a38fc3315cfde9ff462ca6adff2808b3f8e805ee915ae885ca957" ~k:"aeaa655b6febfec50b05562c3f358865533e4736" ~r:"14892b1ec7fc716c75a17f7ad2e41ec6faa78836" ~s:"72cc56a9890e8bdf1a53d3acc6f89137264f9ff8" ; 164 - 165 - case 166 - ~msg:"5e8eb96b5c6ad75d3dab1e28bb2ce751ecc31611a019e8d4b561c7e4533cc7ab73bd9de931e8c54c51c5711e6c276a8ed92f4bb457ddf28233da2ca3e3013c56e3cd2bc61d4d4e0e22cf6361304e56d68b315ca5d3fcc472a7eef8cca575204dd084a21a99ba67fddbf90df7c6c658761734bce13c3d22d80b6fb9bece551492" ~x:"0b55f99ad958a766eaf5ac20a127a4df1b946bae" ~y:"50b0f7605911bce6ed5ecff1e3c1816fbbf03a1479a0820603ffa715aef9ffbccbd067579cbbc8c87c392e85bbe929a0b5e1059faae6f9121df49c66a049a98a90d84c70a21312bf837f4723993d0ec0ac4c2a7ffb9d400957b39fb83e951ef41362452cf458d784c43fe822ea7a7abbea0a6998321a93819d2d282c7884f5c2" ~k:"9e9b9afb43a7157761f6c2011138d2f65ac1cba9" ~r:"7399b120d4bfbd6dc4064d2f3f8f0ca5c362b2d8" ~s:"2302d81d7ebb2417eef45d88941b070ecab11cab" ; 167 - 168 - case 169 - ~msg:"da91c692cdb0a59562e2b664dcfe7554ac589d57f82246c4a8a3f9573bf47b257eb8f93447c1ebab13dce53d6f4416fb2c6c36303ed97885cf7a6caef055f7e3145ef3838c31877fad7a8883ffc84ebd973f8c06d17cdd339bb3371f9d3d4f2d9f0b80ae2bcc878b4af78f845eac4f2aacee6a9451daf814a44e927bb5428820" ~x:"ac701252c773ba36711b9731afdc077c5d3f9271" ~y:"678b3958ed24fc84942054f49d9e6f27bbac7de3a4a52af9ffcb9ce6c1fb8bdd99db0e80c868ac547c4cfc782de7ebcf6943b2e46433c670178de0104bd6fc25dc3054db9c48c12706e1dea35e163be36a4ab721950c028b0546f1719ff2edd81b2b7974fb9b121224ccfaabc47e9e629a97bc6ba42691ca3f649ccac47d0f1e" ~k:"6cabf2c0e2890b2b393da3ea6aac2782216efa73" ~r:"6f1579edcf437584d3e939fa5b002eee83e3b614" ~s:"71208a87a4cf2b3a9b65477773b0096d452dae60" ; 170 - 171 - case 172 - ~msg:"0f2edc87f4d2942c4693b064a511b93f790c60dc149a1b0b7041af5183bc0f42234134b284270e4c7e53614f7ecfe711de0efb28336d0bb359c86e8be8839f583211e9174832b3d41ee6d21864ac6186fd1db920dda65b25966c5951ab8a2050dda87d1d72e3032852ad43da9fb430e850022b4bb6cc9cb90e428f3a5ca32a62" ~x:"588f40e3eb813cd22a41c9cdeadb6895a348db3c" ~y:"3a978e9022a8f7a0caa91f275bf9cf7648e1b9a31a0702d8acdbf59affb5467fb07a8f7e5b4c86775ac4efb609b946f05a3f13034db94acc64057f906d1854910de538f84367181c618e96c3f922547d408ee6408b7a70acedc75de8ae445c5d4dd5def4a352d2528234070cc720700c14ce12d2f36990d36b29d7b00596e34b" ~k:"8ac2fe7bcd690a7239d294b22725b818d262a446" ~r:"b6ea9cdb211c4560b3d592e93af6d5f133b64b9b" ~s:"6242e45a472fa8147cb5253dbddebae31ef31e4e" ; 173 - 174 - case 175 - ~msg:"d12fc1983e0095e9e2b6b8743fb34386cc4821540e3efe1a29f84cf7e63e2a0668d551f912ad2221b5a3d6b9ebd12136def5e6690e1d32aae919f9f1cf5d24d62a46a9a9a604bae11b9c0866350367204a920b589a317ddfbb877f9fad6b0d3629af9635da46933151c0d9a20aaabddd3df5d049659b2860ddb8b20963261ea0" ~x:"67cd81c7d6ac2d8bd44ef26297ac02ecba41f73f" ~y:"10b7b14ad29fb34d7a39f3e953051f456a0cd1233ef54d90a4adc82dfbd9fa7a85628f11039632b47ba9daeca6e463ec4644f5e2a2a4bf95d392e8c9c9f287a20ba45a198815ca0e9ba854d7f3c79d9037fa1417724fb7f02799b1c2b2bcc79d64367b90c06d1789dcc6de57ca19fcefafc04fcce29c8f495ed564f5d9a112ca" ~k:"1341e376e8919e01991e5e48b8e0c7255929b3d2" ~r:"360617965f65a68abcb83dbf2d886a1a10ca05de" ~s:"71abb6acbf7e653d2ebc3cb7149b51cc0c92fba8" ; 176 - 177 - case 178 - ~msg:"87a6dfb8487f16f6fef1d68bc31469ac210ea55387965bb4458ca0d00d6c46858be28a019ce914c39c2479f321f0252ca4a8bd681a5b358a093fc8341c31bc47c618403f93322b443084ce5818490b74e83c3866b8164bbcf79bf82539f428c9351c40b10d773cbe1cbaa8c9800a6dcf38d85515e2dff5d4f8a965ecaef37e38" ~x:"22bbb8468f3e90768d347cb3492f64db2a23f721" ~y:"75ef5d5f67022426f531e9b8ca9115921d5a5c446bcdf1af701b605bae687dff8d1e7b3c4f8b289537eb09a7461d6688a3711974371a5b73a2082e991410118666ccd94f444977d0c89ba36162de023aa519037a6ba6305417dad3f2dc38756a40046491e8ee80c4f147825b8c021b5d09a2422d39d7c4abc395f6c2d7903c66" ~k:"9c609e56c19f74ddc46eb2e2cfe26b1519ff0d1b" ~r:"5409cd62f5539306ae8c936082eef932c6505c39" ~s:"07c0ccb30ec90b1481409cbfa2f5de6cfaf1efc5" ; 179 - 180 - case 181 - ~msg:"a332b38e642bcad8bd271f776fff24a731724a43400c1614f5e21296db04f725eebad28d62e20ca3f7f18328a76b8092d97b632bb78718f0f2f9ecc7c12cc36b505959917b5c54312ad4717be84fa840b9f06de005c792af3e9ea72b7ae2e3423d07c781c9c2553f899554a0d8dec9a285c1ee25160fa278489474a0e4379516" ~x:"bbb1854e9b0942cb5d1eb71e8cc6fc7e0f4cfcb5" ~y:"41cc1d6d9e0cf5f158dab599114f3ee4738f197cf2c956b6bb0ddd6dfdcf5e4db399aacc16c538948c4b50de85bad6d916dbc415bad2f6737023fc7063c133bd0c4231d6b33ce813c0d6024d1315269571b2554bbb2edf2a99108a4359e8e23bf8a143bfc538ab9f8842cd4e925968f49ac56a02e3f067e26001e5207bcb56d4" ~k:"336e458fc213c0b2775537ae61decc034ccb1d32" ~r:"a16a7308a6824d929b6a9a3bdb280d151a6eed81" ~s:"7a42addab7ddb98000286044d9993d5cf818f2b1" ; 182 - 183 - case 184 - ~msg:"79b144d50e0047596cf06bfcb3e9ce3959ec4b8cc9ba01434fc3f68f47c868cea048b990e62cd7a50eee288b35ae62aa797924c9dcab76409b869b33de28885e62f17db7a7758973482968b9f960eb2dba84ae85101aa6c6141b3f0839a4185a4c496eae876ecdc45627330d36f01a67cbb7faef834357330aac36c7c6f47ac9" ~x:"754b24ea5c8cb8e88e370074e79cb62605530018" ~y:"74db7460c51919a9e87b430d105d86362ee4acd9682bf6c9fe87d9956c2f5ff17d95930ccc12f7e92d8bcb6af5f7ef1848da8d15c9152082477de99594781b998daafbf8ae4af23772125c19e166421f806bd0fbeac365076ecd9e15432ad4ac2523418f6e410cbfcbc5a71a0edf22e694a67d14b9cfc9722bc4bd8c43e22a91" ~k:"1b50341e94f4498b92cce4d17ab9d4016fb2e074" ~r:"021a3de98c3da698b477b4c3d50b2169e65f5e91" ~s:"afd764318dd0fee04fd6b07f550320789cd9bfa5" 185 - ] 186 - 187 - 208 + [ 209 + case 210 + ~msg: 211 + "fb2128052509488cad0745ed3e6312850dd96ddaf791f1e624e22a6b9beaa65319c325c78ef59cacba0ccfa722259f24f92c17b77a8f6d8e97c93d880d2d8dbbbedcf6acefa06b0e476ca2013d0394bd90d56c10626ef43cea79d1ef0bc7ac452bf9b9acaef70325e055ac006d34024b32204abea4be5faae0a6d46d365ed0d9" 212 + ~x:"6e2e31bbfc670944d7a7120e39a981520614d8a8" 213 + ~y: 214 + "7e339f3757450390160e02291559f30bed0b2d758c5ccc2d8d456232bb435ae49de7e7957e3aad9bfdcf6fd5d9b6ee3b521bc2229a8421dc2aa59b9952345a8fc1de49b348003a9b18da642d7f6f56e3bc665131ae9762088a93786f7b4b72a4bcc308c67e2532a3a5bf09652055cc26bf3b18833598cffd7011f2285f794557" 215 + ~k:"8cb35d255505a4c41421e562d10827266aa68663" 216 + ~r:"afee719e7f848b54349ccc3b4fb26065833a4d8e" 217 + ~s:"734efe992256f31325e749bc32a24a1f957b3a1b"; 218 + case 219 + ~msg: 220 + "02971e0cdd48ae2331db9c6285e9880e96104fa7a9f378dfea718e63efe98352fe4d35a2bc94b3a888cfb88b8b7d9f6c8c54e48613f32c9946ffe6e9a4b7108ececdda41bc151b3d8724b61f5b83a4e27476914387b0488e41be54f63aa773175eb373a3641e6e7950eee8faf048a841f107d30cf9be268493231545d8984694" 221 + ~x:"0b448f49a085a52a03d7f668a1d6fb87f2e221ac" 222 + ~y: 223 + "633bb757b3c0e3b7867bf845301ea4e39f75c9759c223f46ce266d406b9df5db501fb826b6e61cba6104c604458c90799f2a36ab51166d0e83b770840624fedc35ebfb9853419e7e09b32b4bd652da4f1ce973ac2620c966b61e35a3f216439a8de1a104f172e1b6e2878112a66c34d16a9aef3ac24a34af5edbf39818a3e2ef" 224 + ~k:"4481a4be9db6821e3b0a08c9c82603631971a682" 225 + ~r:"92c65e07462d668b06dd45b608784965897838bc" 226 + ~s:"2e40adf41cafb8048c793c7092a7e823515b6cfa"; 227 + case 228 + ~msg: 229 + "062e82fb43236ee17ebfaa3d363b9b873d0fe41444c74cef7f7e3bd81f723fd90fd148a28e997585413695113757758aa4dd275f70b375f8903c7be46e3a3ad3190cd04971abd2f1db192ef0d2b98bbb80181a721a5809928b5bca5c118a2911132ad233cd27c7e41adfccfeb4e952874bfa819661182975e44d37c61734759c" 230 + ~x:"a4a25a8bb1c2ba69f9611939b591032b96333fa3" 231 + ~y: 232 + "3b0a091dfca05dce61e9f05b15b07487d2e3ea4f568dc9ac752d42c0aa771ae0ccc372ce9774fb9fd16a30cb3759bb1989488ce85db7cdfa506476acec644c21168f2db1f36efe0230c6fb8f1f2ae4eaf1799d5e29e212467b11bfbc1eebed142d7a017262cd8735e3e29d8e0c4a6e766c07d7aa9f8d176f536087bfecf4c414" 233 + ~k:"a7135820910f041b27321534a17bb1f33ac51aca" 234 + ~r:"ba554124874d06a6cef62740e15821ccddbfe6f3" 235 + ~s:"5962be757d75b0f17d15482ebb595ca4e9fbfe22"; 236 + case 237 + ~msg: 238 + "4fca074844eae247d19c06e92032ae8e773043e2e1f45d400e9dcebbde5d65e7c1423b0390161991c026f38a0e2bfeef40dae18741737b1d535ab46b566a1b672fc22dec86747a7c7638fa65047f1ede36ad43f6aedf51b5bf2979adf4d9a94ed802a29de5603b704770b32c8b946a32e1b6054cd70c3add025cc9371d1e404d" 239 + ~x:"1f15cafca282083e82d7e54258647b2914418986" 240 + ~y: 241 + "40b638c94b1e719a337d83358699c70cd867ff888c655a5f5a1de8732d058bf027d4747efe3b8dedca3276de5a58f136ed35cff03030f672da65c71f18e58278ddfc7b9b50a248eff9236874ee3cb0d0a35b7b2ee185b139ea84eed7bffc5094ab8743a75374bc36c7d69d5f3e6fe5f3ef1f9358f00a3c5892fff41ed6afee3b" 242 + ~k:"128ab9677c7ade5e1c02a8427650ff054db6390e" 243 + ~r:"651a389d8ca50d6e3273cabbe71cd84cccd02361" 244 + ~s:"3401fe47b3812daa8c020c9bd42609cbebdfa728"; 245 + case 246 + ~msg: 247 + "4d9630fe058998ca5b80ae62f3f73dc85bee291509843ac00240d13d55251ae53b37794783b97d53e042cab26f8c84de0a70f5b43051fbefb3e43f08f5d2e8aad9e2de2717412dbb902acc8849adc04d06fed8c1421c4cfe8b81ee7f5ac5d4f0c0b68e80b6f88fd3c7d5b32022572b0a681bd2d4df2d047b0b23b6887145afe1" 248 + ~x:"1485f719b8be77c78829baa0d2c322df60174476" 249 + ~y: 250 + "727b6528357d6705c20d31358f641934fdec63cc66df98837d2f378164e15fa0842207acf3220c8023a9f4f8d2057165b3c849eaeb5376e3fad11785f1d0261779aaedd53b1e52798007eb4c8e83b1ff321b620d883391a14fa47fec4901d96ec232eabb4a0bb4453368fef5176c67135649979d3214d3fb67a1319ac54feb01" 251 + ~k:"8f4cc1254c787ec8cbf54405105f7ef83ffdeee0" 252 + ~r:"9ca3e433504c557ba1aac66469781175cdfb4ad5" 253 + ~s:"72145dfa5279dd82ae99604d16a2b8df71b95320"; 254 + case 255 + ~msg: 256 + "62b9d601e30b42a279c7e04df3ca8d8140a55cd5876c7e9181c73575e4c4f921a94e4e2d0bdd7ba98600d652e5df5be9464e7a9011ab486960f69d57ece1d2c4af9324457c1e3d83fba4265beb47407e4761dbc949d5bd67fee4a476a4d5a93d77acda96a221a0a31e0f024b3f0b8234c015238f3258daa085ae9f4e1aa7b1cc" 257 + ~x:"43c76a9a00045cdfb2e7927b5c8730e006423c05" 258 + ~y: 259 + "5f6dfb064caddf644af399e33a672565766761d55ac0b84bead42c3980e7e396043744361778f04dcb698e4563853420fecacd594af828f57df541d9e4de899d61f04f6379c1c96246d152369395242a1c2e70eef8f35417a0ffdb039282516ce21b85687904c511087f113e5142f027f1179712edcbce27939ab15ec49c085f" 260 + ~k:"5e4b5e4595e31397422c7a4487ae51051289be61" 261 + ~r:"331920a7b79e3cfa7638e409d9702aafd08fbec6" 262 + ~s:"071d06e6cd301515f37b60690afa219fe5083d96"; 263 + case 264 + ~msg: 265 + "0006e09c20376442e689bf2d34268fd69109c1301ea66cbe90394cc0f41f94822c28845819b9a98764d2f7262e98891487ff55b05bd69e18b7cad41bd98e137566b6041c739db11f78e567cac02f33f140d19a4805002545375daebfd7dcbea33242e73c8e269149d7eb9db9f9006e17acb736b5e977645ab651b81225c5e543" 266 + ~x:"16f89d97dd3b31c191495173ae0e145c6ce185d6" 267 + ~y: 268 + "1b1f725664d75bdcb2a5a4c653061c460799dd48bf1e6b03e13c71d83e3fdb506fa94e6cafb5dbdead88a33d23d4e9287b4707e1fba871b97c9a48f930cdccba0dc06a4f0a8bfbb4e14d0b4d5a0871fa1341caec7bc08138713121d419769f31203508df71947265644fdc6137d8e466c8cb0ce985340cb2e279b4ce9315a772" 269 + ~k:"475b5aa12ff77d49e4c8171f80d3d1f15147ed12" 270 + ~r:"b6aa833b825184729af308f81bf5e58e2d7e9284" 271 + ~s:"5453b4b2e3fc802b2f977d0cf6eb7f5c16673fa3"; 272 + case 273 + ~msg: 274 + "e04a71f2b5c176a0db17a983a17dec588c00f42c9aa3026b5eb440f07a2140c2ed84024e0531ea7788dfeaa91883fb6a9841c17dcfd312968adb00e556bc7eb3021f57b7a16894fa4fe12ec93dfd494a0a1c693d6ade154ef648c05552da41224d4922d1861d9f7671b8ce6ce448e895ea0eed25802e3350ec08ae79f2d61e0f" 275 + ~x:"3eda44e3c38380df7a4f47d8e1024596238bcef1" 276 + ~y: 277 + "687e16309b06817b93236dd990faef9e232eb81cb9c7d6dae4fdd4f8e7ca933e185b1da622d7c7fa35e0a3906f915ded14ba96d6035b46bd6ca5fe172af94e081fb0b9a9583a458bd206c1e87f97a57d00d6eade19ec56ac2e9bbd8c15df356ee7b12c91311a38fc3315cfde9ff462ca6adff2808b3f8e805ee915ae885ca957" 278 + ~k:"aeaa655b6febfec50b05562c3f358865533e4736" 279 + ~r:"14892b1ec7fc716c75a17f7ad2e41ec6faa78836" 280 + ~s:"72cc56a9890e8bdf1a53d3acc6f89137264f9ff8"; 281 + case 282 + ~msg: 283 + "5e8eb96b5c6ad75d3dab1e28bb2ce751ecc31611a019e8d4b561c7e4533cc7ab73bd9de931e8c54c51c5711e6c276a8ed92f4bb457ddf28233da2ca3e3013c56e3cd2bc61d4d4e0e22cf6361304e56d68b315ca5d3fcc472a7eef8cca575204dd084a21a99ba67fddbf90df7c6c658761734bce13c3d22d80b6fb9bece551492" 284 + ~x:"0b55f99ad958a766eaf5ac20a127a4df1b946bae" 285 + ~y: 286 + "50b0f7605911bce6ed5ecff1e3c1816fbbf03a1479a0820603ffa715aef9ffbccbd067579cbbc8c87c392e85bbe929a0b5e1059faae6f9121df49c66a049a98a90d84c70a21312bf837f4723993d0ec0ac4c2a7ffb9d400957b39fb83e951ef41362452cf458d784c43fe822ea7a7abbea0a6998321a93819d2d282c7884f5c2" 287 + ~k:"9e9b9afb43a7157761f6c2011138d2f65ac1cba9" 288 + ~r:"7399b120d4bfbd6dc4064d2f3f8f0ca5c362b2d8" 289 + ~s:"2302d81d7ebb2417eef45d88941b070ecab11cab"; 290 + case 291 + ~msg: 292 + "da91c692cdb0a59562e2b664dcfe7554ac589d57f82246c4a8a3f9573bf47b257eb8f93447c1ebab13dce53d6f4416fb2c6c36303ed97885cf7a6caef055f7e3145ef3838c31877fad7a8883ffc84ebd973f8c06d17cdd339bb3371f9d3d4f2d9f0b80ae2bcc878b4af78f845eac4f2aacee6a9451daf814a44e927bb5428820" 293 + ~x:"ac701252c773ba36711b9731afdc077c5d3f9271" 294 + ~y: 295 + "678b3958ed24fc84942054f49d9e6f27bbac7de3a4a52af9ffcb9ce6c1fb8bdd99db0e80c868ac547c4cfc782de7ebcf6943b2e46433c670178de0104bd6fc25dc3054db9c48c12706e1dea35e163be36a4ab721950c028b0546f1719ff2edd81b2b7974fb9b121224ccfaabc47e9e629a97bc6ba42691ca3f649ccac47d0f1e" 296 + ~k:"6cabf2c0e2890b2b393da3ea6aac2782216efa73" 297 + ~r:"6f1579edcf437584d3e939fa5b002eee83e3b614" 298 + ~s:"71208a87a4cf2b3a9b65477773b0096d452dae60"; 299 + case 300 + ~msg: 301 + "0f2edc87f4d2942c4693b064a511b93f790c60dc149a1b0b7041af5183bc0f42234134b284270e4c7e53614f7ecfe711de0efb28336d0bb359c86e8be8839f583211e9174832b3d41ee6d21864ac6186fd1db920dda65b25966c5951ab8a2050dda87d1d72e3032852ad43da9fb430e850022b4bb6cc9cb90e428f3a5ca32a62" 302 + ~x:"588f40e3eb813cd22a41c9cdeadb6895a348db3c" 303 + ~y: 304 + "3a978e9022a8f7a0caa91f275bf9cf7648e1b9a31a0702d8acdbf59affb5467fb07a8f7e5b4c86775ac4efb609b946f05a3f13034db94acc64057f906d1854910de538f84367181c618e96c3f922547d408ee6408b7a70acedc75de8ae445c5d4dd5def4a352d2528234070cc720700c14ce12d2f36990d36b29d7b00596e34b" 305 + ~k:"8ac2fe7bcd690a7239d294b22725b818d262a446" 306 + ~r:"b6ea9cdb211c4560b3d592e93af6d5f133b64b9b" 307 + ~s:"6242e45a472fa8147cb5253dbddebae31ef31e4e"; 308 + case 309 + ~msg: 310 + "d12fc1983e0095e9e2b6b8743fb34386cc4821540e3efe1a29f84cf7e63e2a0668d551f912ad2221b5a3d6b9ebd12136def5e6690e1d32aae919f9f1cf5d24d62a46a9a9a604bae11b9c0866350367204a920b589a317ddfbb877f9fad6b0d3629af9635da46933151c0d9a20aaabddd3df5d049659b2860ddb8b20963261ea0" 311 + ~x:"67cd81c7d6ac2d8bd44ef26297ac02ecba41f73f" 312 + ~y: 313 + "10b7b14ad29fb34d7a39f3e953051f456a0cd1233ef54d90a4adc82dfbd9fa7a85628f11039632b47ba9daeca6e463ec4644f5e2a2a4bf95d392e8c9c9f287a20ba45a198815ca0e9ba854d7f3c79d9037fa1417724fb7f02799b1c2b2bcc79d64367b90c06d1789dcc6de57ca19fcefafc04fcce29c8f495ed564f5d9a112ca" 314 + ~k:"1341e376e8919e01991e5e48b8e0c7255929b3d2" 315 + ~r:"360617965f65a68abcb83dbf2d886a1a10ca05de" 316 + ~s:"71abb6acbf7e653d2ebc3cb7149b51cc0c92fba8"; 317 + case 318 + ~msg: 319 + "87a6dfb8487f16f6fef1d68bc31469ac210ea55387965bb4458ca0d00d6c46858be28a019ce914c39c2479f321f0252ca4a8bd681a5b358a093fc8341c31bc47c618403f93322b443084ce5818490b74e83c3866b8164bbcf79bf82539f428c9351c40b10d773cbe1cbaa8c9800a6dcf38d85515e2dff5d4f8a965ecaef37e38" 320 + ~x:"22bbb8468f3e90768d347cb3492f64db2a23f721" 321 + ~y: 322 + "75ef5d5f67022426f531e9b8ca9115921d5a5c446bcdf1af701b605bae687dff8d1e7b3c4f8b289537eb09a7461d6688a3711974371a5b73a2082e991410118666ccd94f444977d0c89ba36162de023aa519037a6ba6305417dad3f2dc38756a40046491e8ee80c4f147825b8c021b5d09a2422d39d7c4abc395f6c2d7903c66" 323 + ~k:"9c609e56c19f74ddc46eb2e2cfe26b1519ff0d1b" 324 + ~r:"5409cd62f5539306ae8c936082eef932c6505c39" 325 + ~s:"07c0ccb30ec90b1481409cbfa2f5de6cfaf1efc5"; 326 + case 327 + ~msg: 328 + "a332b38e642bcad8bd271f776fff24a731724a43400c1614f5e21296db04f725eebad28d62e20ca3f7f18328a76b8092d97b632bb78718f0f2f9ecc7c12cc36b505959917b5c54312ad4717be84fa840b9f06de005c792af3e9ea72b7ae2e3423d07c781c9c2553f899554a0d8dec9a285c1ee25160fa278489474a0e4379516" 329 + ~x:"bbb1854e9b0942cb5d1eb71e8cc6fc7e0f4cfcb5" 330 + ~y: 331 + "41cc1d6d9e0cf5f158dab599114f3ee4738f197cf2c956b6bb0ddd6dfdcf5e4db399aacc16c538948c4b50de85bad6d916dbc415bad2f6737023fc7063c133bd0c4231d6b33ce813c0d6024d1315269571b2554bbb2edf2a99108a4359e8e23bf8a143bfc538ab9f8842cd4e925968f49ac56a02e3f067e26001e5207bcb56d4" 332 + ~k:"336e458fc213c0b2775537ae61decc034ccb1d32" 333 + ~r:"a16a7308a6824d929b6a9a3bdb280d151a6eed81" 334 + ~s:"7a42addab7ddb98000286044d9993d5cf818f2b1"; 335 + case 336 + ~msg: 337 + "79b144d50e0047596cf06bfcb3e9ce3959ec4b8cc9ba01434fc3f68f47c868cea048b990e62cd7a50eee288b35ae62aa797924c9dcab76409b869b33de28885e62f17db7a7758973482968b9f960eb2dba84ae85101aa6c6141b3f0839a4185a4c496eae876ecdc45627330d36f01a67cbb7faef834357330aac36c7c6f47ac9" 338 + ~x:"754b24ea5c8cb8e88e370074e79cb62605530018" 339 + ~y: 340 + "74db7460c51919a9e87b430d105d86362ee4acd9682bf6c9fe87d9956c2f5ff17d95930ccc12f7e92d8bcb6af5f7ef1848da8d15c9152082477de99594781b998daafbf8ae4af23772125c19e166421f806bd0fbeac365076ecd9e15432ad4ac2523418f6e410cbfcbc5a71a0edf22e694a67d14b9cfc9722bc4bd8c43e22a91" 341 + ~k:"1b50341e94f4498b92cce4d17ab9d4016fb2e074" 342 + ~r:"021a3de98c3da698b477b4c3d50b2169e65f5e91" 343 + ~s:"afd764318dd0fee04fd6b07f550320789cd9bfa5"; 344 + ] 188 345 189 346 let sha256_cases = 190 347 (* [mod = L=1024, N=160, SHA-256] *) 191 - let domain = params ~p:"cba13e533637c37c0e80d9fcd052c1e41a88ac325c4ebe13b7170088d54eef4881f3d35eae47c210385a8485d2423a64da3ffda63a26f92cf5a304f39260384a9b7759d8ac1adc81d3f8bfc5e6cb10efb4e0f75867f4e848d1a338586dd0648feeb163647ffe7176174370540ee8a8f588da8cc143d939f70b114a7f981b8483" 192 - ~q:"95031b8aa71f29d525b773ef8b7c6701ad8a5d99" 193 - ~g:"45bcaa443d4cd1602d27aaf84126edc73bd773de6ece15e97e7fef46f13072b7adcaf7b0053cf4706944df8c4568f26c997ee7753000fbe477a37766a4e970ff40008eb900b9de4b5f9ae06e06db6106e78711f3a67feca74dd5bddcdf675ae4014ee9489a42917fbee3bb9f2a24df67512c1c35c97bfbf2308eaacd28368c5c" 348 + let domain = 349 + params 350 + ~p: 351 + "cba13e533637c37c0e80d9fcd052c1e41a88ac325c4ebe13b7170088d54eef4881f3d35eae47c210385a8485d2423a64da3ffda63a26f92cf5a304f39260384a9b7759d8ac1adc81d3f8bfc5e6cb10efb4e0f75867f4e848d1a338586dd0648feeb163647ffe7176174370540ee8a8f588da8cc143d939f70b114a7f981b8483" 352 + ~q:"95031b8aa71f29d525b773ef8b7c6701ad8a5d99" 353 + ~g: 354 + "45bcaa443d4cd1602d27aaf84126edc73bd773de6ece15e97e7fef46f13072b7adcaf7b0053cf4706944df8c4568f26c997ee7753000fbe477a37766a4e970ff40008eb900b9de4b5f9ae06e06db6106e78711f3a67feca74dd5bddcdf675ae4014ee9489a42917fbee3bb9f2a24df67512c1c35c97bfbf2308eaacd28368c5c" 194 355 in 195 356 let case = case_of ~domain ~hash:Digestif.sha256 in 196 357 197 - [ case ~msg:"812172f09cbae62517804885754125fc6066e9a902f9db2041eeddd7e8da67e4a2e65d0029c45ecacea6002f9540eb1004c883a8f900fd84a98b5c449ac49c56f3a91d8bed3f08f427935fbe437ce46f75cd666a0707265c61a096698dc2f36b28c65ec7b6e475c8b67ddfb444b2ee6a984e9d6d15233e25e44bd8d7924d129d" ~x:"2eac4f4196fedb3e651b3b00040184cfd6da2ab4" ~y:"4cd6178637d0f0de1488515c3b12e203a3c0ca652f2fe30d088dc7278a87affa634a727a721932d671994a958a0f89223c286c3a9b10a96560542e2626b72e0cd28e5133fb57dc238b7fab2de2a49863ecf998751861ae668bf7cad136e6933f57dfdba544e3147ce0e7370fa6e8ff1de690c51b4aeedf0485183889205591e8 198 - " ~k:"85976c5610a74959531040a5512b347eac587e48" ~r:"76683a085d6742eadf95a61af75f881276cfd26a" ~s:"3b9da7f9926eaaad0bebd4845c67fcdb64d12453" ; 199 - 200 - case ~msg:"c1b1f1472f08df38a52a55ba55827ba3b7cdd6beded904fcd52610c899eda3c61682656873bbfaab0d907495dacf458ea3450afd93be967a37434d412b6325669ad84b4eaa278a24870ecc2df0da13ad526a9e6669958d4e52dbfba2803ae9ae135d0c0acca86a04c42ba9cafb09b7af96347188880b086169ebdf9f1f5f3173" ~x:"1a220585a989ef2c12bbfa9fc0d258713556fe38" ~y:"99187498534f313dc7cd7f3a48d62b2335bcdc36f0dc98dbf845dc6085c267474c36fdfca38854219830e614bbcab2bb9decb81e86124bd78f86d471bd84be06ac1f0f41fe5b4b3740b2107e0c9c48f81e31e9bf550d96564dd380ca47a11d72f0d0a3275f075f95bbd59869c14dc912a1cbcf01db9fb7f71015cc149986825e" ~k:"8fef50b7121a04a24755b6f3e1cdc93848a9081c" ~r:"54ed4efaecdfc78d026471b65cfefc6529945bbf" ~s:"6d6dac296ebde3f873b751c6b14843f0b7befdff" ; 201 - 202 - case ~msg:"b80a47071d1376fe617e59fdc005a890369a4ca5e678ff46eb9b205d6ec09cbd49373bb341fe7813ee442a6ece17e720bf71a74557ac9a375c059e5535e773a45e79e1bff3465a3886c86e2a2bc882f0beceefffb2ae1a522f13c82def4cfd0cfca6fceeb4cece71869e90cd10d0aff27a84b5601daae061cbeb3aa62b37fd3a" ~x:"4247e7e4dc4270fc7680bc05746807c183e0dd98" ~y:"91f50270a754055e5da611c720a4262f3cb8bd4161f77d07401604d3d1165e45518f7e1901adef6628f23dc48271d35ff492af8d62aa538c0e77e042f23a522f2214e62114bfeea46ae8888bdadacdaa0a9a5b503d79c23e4c20c98bd4ebb36f95bf4451ccb0b5bb44dfd011341cfa29a9e156a3cd828e126e68cb911e8f9dc0" ~k:"3aeb3383a3c0f53217c0d7077c3cd66d2ef74a2e" ~r:"1fc2d1cb80bf6e0e78b25fac293b752cbff2b5ac" ~s:"75bcc772f773d5fd98dde1f907e7ec2cba201dfb" ; 203 - 204 - case ~msg:"a9603054465887df15db07c0709a8c878d2f1abdcfc6195eabf3e9b3ad07e8558b99cc4a7aa076daf67e9b7d8480f11e8afb18e2ac56a9547b48453fedca32da9eb0c29271eb60f0a1d95c18f42d992394b3264ff3e21e606e0beac08a7ba71b8e5795a8da985118e432cf5b30b6cd3a603d8b0d580f06c626ee937c6cd05f40" ~x:"4d2a5462ebccc5d19bc6c1cabb609c08ad088e08" ~y:"a2c4569a301473ae4f164d68b9a3c6eb705ae81f75d6e5cc3070a559cccb8b1a2d8c21090ed70e61670c7e9dbf5f755a37d58d3abb34c2dfd40db9f26f6868d0dd91be98f395ac0ebdc37e1b5423802bea7a6cb196d7e0f93db92f663b6c9c726e80feb2e9227154ce1c15f8e8df93ec0d37fa47e5fa112bb0a48f4a239d6052" ~k:"36a3cd0101358a4d30c5b7117bc239fb4f6ce2e7" ~r:"48539523815bd8d73ce702367c7712b9b13867f2" ~s:"20ff4cfef8a668829feae73b520e8aa4d02c8168" ; 205 - 206 - case ~msg:"19eb088c3229a44f9586f00421cfe7423a486d5f7e28ad2c9119dd2e1395df1acc06cb28e9069cee62f09f48e4ca29269dd89df9fec1ffdf64b1fe2717fe52b1421fcf6c705c0cf39930f90ecb339b51ef95b2ef38a6d96a575f7b36f5edf4f2cbd6d261e1fdd77d4459288c02e68c82a3910ff8ca1747c86bb187d5205f51a8" ~x:"0842ddd5a04161e4579797b5d8eda0002dd847ad" ~y:"49e606aad5d2e54e1bae2517915c660ba30ec4fd28d718613a7c84464b0f44bc6d546e5a9bc1dc60423b45dd01ec295564ec08f29d6887e69f689d6b3488f9da5d5a60f39cdd5a158d51a3d073b2225fea559e58bb222e29a87b5f0f5ab31dd7c0ceaad887070dac955d28973607a99e46ddd7737beab65199f250d7f03b6583" ~k:"712eed73c8d2567809b4d9ec2f59e77d39290b2b" ~r:"6bf4f5d3251201059ee85edb99a67a706f37197d" ~s:"3125c5af397759996b876cb5857be2632aaaf3b6" ; 207 - 208 - case ~msg:"addb5a045c9f4f4fb9eb5e5db44d6515980c9e088015b68593d8bcbffc6ff57f18865ab824d3d1586425cb5081197e9e01cb7297b06b64103cea437eeeec9c50798679fb869ec306a72575057fd368aeb0f674a29c3ac248b6a08f91331d8456d062025347c12a0a61c61f76e5206fe6ca437735af430dea7cc8f39f1a5b7505" ~x:"1f1cfc682048375915fb483b77037c81c05ed728" ~y:"221ced57a91325b10f8dcd1220b1af68f8daf397f419a43bbd8fbe644311755b111aae5257c642fafd83b047a1f56f2a829fcdf4df3e5dccb23645b28c0a34c6e8a650efcdfadd48fea467cc943ca4e7378829300713838b6c710962ba72e790c10ab879a01fe1457ea3dd4b7c3c3a542e3522a75d0db261e576cd3f22c998e4" ~k:"703154f6c6e12f163ecad0494897dfcf5657fbe2" ~r:"7cc662e352e0eede85140107a7773ad8663e70bd" ~s:"15c17b9d245872844eaac3d46bb08c3e08597423" ; 209 - 210 - case ~msg:"02709d2be0d9dc1dc0ebc55f630d91fa23609f61b513c2275766034d8f40e819aaf9326c8db37c35c5a17e96bc956df6d11b558d16d91871afc010b3119c5798c2e29411ff4f0d7196e7e476bf0ad03bf72e897fed873c10613dd255d15243870b81cd87d0abc16e140d032fe5bd1c8eeb2f66e04d13d49269fc7da6b65a7c1c" ~x:"1d9cf98dc0c1d7bf8dec98962ac6ef6e9406ce76" ~y:"9e93bc03e6e815308734e3b8f1d106961bebdff10a525303257a053dea4da6dcf504c7839b54d57522f2acb3aac959ff4ae8610022ca5a1e688232336ca1ee8fd7028bf7b6e9eedf8a4b0d098969f5e5fd3d9300c340e7f19fd471a451afb92ed4829fa4d90249144aa363dc18807b3e29d27e6ec3da736c33b185511bb3aaa0" ~k:"68ae16534c5f6225fc7ef980f0063de483a76903" ~r:"72b0bcc6defa66fa8bab029676a1c7703f9608f2" ~s:"69d911e05acd7be52f2834c0aa005128e7fa85b8" ; 211 - 212 - case ~msg:"cc061edb31c34d3981517f4d89afbe980f74185260cf48b3043bc13a144944ad43e0e576d2a58bf589cc021dc1c1d332c4d76896ea77dda197f683e51eed71b4d6df46666a1b142e679b0283cf339e5bca90e2ff9c34dd5fd7cc4917d66704fee4364f7693101dc766707104efb2b933c4848b93e13f94855f75e4fd756cb6e3" ~x:"78ffb40fd89416388804e56444c9a642cb5e98e8" ~y:"5d7d2e342154983ebc2015bc6750f9876f5689ca0ada8529908ed4fdbc596b972c5cc6d53e80a8ad8a8cedf3ce64b62a75db441c96207fc7477e3f7b9f10df28e0cc2fb77383e7ca4c5150f712dd823c2309f0161be0bd5eedd60cf6ba230861a08b9d9a7468438b4d6ec673d28a54d83c7010d50631e55f0a02832abc5a0a46" ~k:"07c6857486160ef4003470411573399fc4e5f7af" ~r:"21f512425670943477534e9075ceb5b7d63f20df" ~s:"73c6f6f8de3aaea520a083b2264299e81cfc91c5" ; 213 - 214 - case ~msg:"79d529e40c2ba4e5b9c7d77d72076f1fd9490928ff4419c824e64db8fb9a051e01e8e173c6f214e0e9e645ed250b6daaa6f8c1a5cc900d52cf3e1efbfea25748e89a1a548c73e2d110b25f5308bcf757b2135216c91dca2783332c0d7903eb21c226dbd33a69eef575aa8a41cbbdcd1b3d94928aa8f8ba58c5ce0d317786e87b" ~x:"784b9db2d19ef0ca8e696884c7711dc2f8ce150a" ~y:"282decc0e37994c2856e61f36b831b61bdc02b7ca675dbc3c2032800b7efd3b711acf14c8869968831e145361bf2182b060e4838f07dc61f76584cf102a913bb28a52c7317af5f9d2322927c9666e5e87c2f2bfd2f181dd32612d7b2b2a645bf1a47c0ebfd79a940f627a668a8f2eb729fd051aa2c659abc918e5571994e6593" ~k:"1bfcf3290fa84652a476655506b145743213e1b4" ~r:"929a4851be0ae4ba91da0e6c7376d71df7592dbb" ~s:"7e6b6504b748ef0024d9d2a2e6f3bcd7cf135ac7" ; 215 - 216 - case ~msg:"f5516410706323549b20c52dafa2f2f90799786c0ddb85048892ccc18720dce5c129a10eb4388788a3d97a03b0001799cb65a79c880836bc9f3204ea75a577204dc1e2894c572a258f9e517ca37c5b791e48b27c8dc1c821b34ebb1f29858c4a72a0d5172c565e9dbe1bdddf6e024891cd6291faa81ed565746c61c2eda2011f" ~x:"673a384687ef29ebfa66e331866bd206ca2f7664" ~y:"74ccc6eb83adbcbad0fc37144d9bfb85fdcc85ab92c9f8877c9cda66251d1aff2fb224888dddb7d772a8b738c53e03ecad9903796fa3c9c6024d06367e0870ad797694f598708d08912c0fe09881763a0a722dda95d94eee8824927cbfa6761a79a038aa6d331da34d9bd5c5833c94c526a86af1cdfb2d4079d2db6d0b9a1238" ~k:"52ee4510675f0da529684fa60f6848ce63c4689f" ~r:"27b3f235e4afc18c6613b4fa7f27d7a8262ba4c0" ~s:"8b22634e4d45b71a84eabaa1e5a4bf1e37337a59" ; 217 - 218 - case ~msg:"55bd1526e08f6443b255acd32c286807542d34c0f3d79892713f9d6d6d6b3be707e4af6e71f7dab4a2c5f6bd25f5ae1f514b2644a4cdafcece1e58f7576f82e2ab0af2326c71279e9bcef1e1c54a76fa77ec2b2d056717645764e7991b520b0e5a1b049109519b22aa5204e3ed53b1e0957dab5ec32479d06ac3e11a5d1cbd03" ~x:"495009f3a92548be4c9a562ff703187b0ec2cc86" ~y:"5d6edf6db6e6c27e80a7f02597237919170b4936489d6f15f598b820cd917e172509b7e287b88b0cc14e1a0186793886809ab4170209987095092234b4fdc44b3d1fc16eeb2efaf852ed3916698cf9eca4612b4961bb6e20c32e188469883f97f49e29a8197c30d0723babb06dea704f7704b2788e57d76d6d9a3cfa68f6c783" ~k:"423308bb414ef959025bf1a4b27db278f904241d" ~r:"621a290930ac436737a72fb4c62bf5c4b67481af" ~s:"62db20f82a5754f109f7a2ce581d4c8d71c68d29" ; 219 - 220 - case ~msg:"62789a89f0d708e21a121fc34009af884133681b9d4a66cc36c0365c34be72a4982eb0961ce257f35e6e7183f0204a96a545193001023d3309a8997e7c4b762ab4f4c40e03e13f4edb328b23cf00c09119deb40addf6567b3b74acef5ceff045304d618421e873c41a72d31e451d213b060829b286f64013d4d9342ae7ab8064" ~x:"2b8dd3965992fcffd158a0816a5987f80908b84c" ~y:"ad590590a82e8929ca86f405516c32913bf5282f70309c6d4a88ccf165ce15fcf11e140c366bb273839a711cb6ae52bb717859570fdbf9fc26726728596e6fc71923deadb35a9d57cdb213c0f29c1375f8b1d3c6b52690c428f7481c14aad82fba7f24eea8cd8da7f0ef7ae781c1a926671a61d4e5ffc8ddf1bc10d688a904c6" ~k:"58ccff88958d5fc48d671ba22ed71f5f82370ac6" ~r:"89dcbca7c8cd6b90aa906a4c547153762fcfffd6" ~s:"23e8926b18cfd4b67c53fac4a2d5321e5c3d880c" ; 221 - 222 - case ~msg:"4eafcc6874ae2a6d525738967afb3054357a39670d1e5555d7dc55be24dd5a32a0c7ca3f1b5c6d948c9ce391013abeb47f7e24cd2c54e1fc7c0e92c4ab77f5973a7054bd1c6c845b802b7937d6520508ae018ae14b27ff4b1e340a4b9f6f6b4814d07e90cb8f19b15e915d6ad1834c0f7a3c3e1e45206772a0eec2d3f9160897" ~x:"6b3acee42276bba155156f23dfb7cdf64e4b1ae8" ~y:"b93d79472f049893779a3a0e83b3853f78b3cf69b75961a60e950f0c00f498f3eaa2384325f74ddd38292fbdbdb199212e90b14ec9e554727df81e06eb7783adda38691c63a7cb00cd76d8e18e3d29c793e9f1fe8337f1598b89651f634cb703f218e1906319f82ac6d58e6786da7aecfbca5939f03a13e7b4d5a8ac812d7829" ~k:"1c48f62bd097d7686879d33ee5771558e453bb3d" ~r:"633e9812a0657cec3326aa5415340c46362fcd4b" ~s:"6b201f0c3fd44247f6c28c01d1217eb99146c040" ; 223 - 224 - case ~msg:"86d9892b48f5954101482742c0dafb68dc97122483b9e459f97495cc970e056d2162c7c71db167229fb7f45209e0c01eb06ff924b823eda51a7e990f3c986eb9af2a7a073f754cb84db453a9e8c0ae7fa5c05a2655d261ad7ec5612876fa7df09522e0b69ae92477f63def1992c96ce95ee7bd630ec1614621da6a512ab53dd7" ~x:"836d90fd90d21b84bb012da7b2168ea8f05202cf" ~y:"ae264ea96bf093ef2de27381738219e3bfdb08616967cd13e9415f475c4a794c19f12a607b898db1e3e6bc5402327585d32841ae15e3462880850e9e4136a4751b64a729ea27b72ce36128a44fa53752a08d73584faa44fb14120f47a04c47e989eadabc7e5cdb15d27c2b0ea4257cec229a2c7bf7c93c571e8d22aeaa2e38be" ~k:"7956ea15111ff392d6a9359067bfd8c21f0bfc0b" ~r:"77b480885c70c1fee2056237d1b79cfd9fb54a1f" ~s:"2283f4c0640ff6daacbdfbbef7224afa59ca3959" ; 225 - 226 - case ~msg:"8b60b9b6ba375448de4f00de51d18706ef8c4f97ba34c9cce2b0abb0698436009d1d2bafcbef73a8b5dff6a3cd5db5258ac84ef724b28d8a62d715da6e111939735366a7c66470364557f546377d5c0e7ea9064731cb7149e1051d66a7bed14aa205bdc5d4b9ca029a1e68a6fa2c1db22d27fb79d83877cfaa6742119229a493" ~x:"5a4ae9f8fc82c9198d9400c51f282493b194a07b" ~y:"87032f263de2bf2f268a093f33c366d6bcda772ca959fa17cfe948f1dca3e75ec94276de91d9bc60fc6ab9224861c55dc9ccc5f715c251dd508bd438681cab205059050f8e11e8a5468da42d20aefac53d7a9fb71f6424d7bdc65db873ee4f9dcd918091aa724b261b6056f320ca7724518e14cb8dba0b713f54a0fe44ff1597" ~k:"662351e9b8c3a607afdf3ee599b46681e27b83c0" ~r:"5d159f894d250db90d7fccd49329e44d1112db47" ~s:"37231bc15195ecb6badb7c3fe80380ff912baeda" ] 227 - 228 - 358 + [ 359 + case 360 + ~msg: 361 + "812172f09cbae62517804885754125fc6066e9a902f9db2041eeddd7e8da67e4a2e65d0029c45ecacea6002f9540eb1004c883a8f900fd84a98b5c449ac49c56f3a91d8bed3f08f427935fbe437ce46f75cd666a0707265c61a096698dc2f36b28c65ec7b6e475c8b67ddfb444b2ee6a984e9d6d15233e25e44bd8d7924d129d" 362 + ~x:"2eac4f4196fedb3e651b3b00040184cfd6da2ab4" 363 + ~y: 364 + "4cd6178637d0f0de1488515c3b12e203a3c0ca652f2fe30d088dc7278a87affa634a727a721932d671994a958a0f89223c286c3a9b10a96560542e2626b72e0cd28e5133fb57dc238b7fab2de2a49863ecf998751861ae668bf7cad136e6933f57dfdba544e3147ce0e7370fa6e8ff1de690c51b4aeedf0485183889205591e8\n" 365 + ~k:"85976c5610a74959531040a5512b347eac587e48" 366 + ~r:"76683a085d6742eadf95a61af75f881276cfd26a" 367 + ~s:"3b9da7f9926eaaad0bebd4845c67fcdb64d12453"; 368 + case 369 + ~msg: 370 + "c1b1f1472f08df38a52a55ba55827ba3b7cdd6beded904fcd52610c899eda3c61682656873bbfaab0d907495dacf458ea3450afd93be967a37434d412b6325669ad84b4eaa278a24870ecc2df0da13ad526a9e6669958d4e52dbfba2803ae9ae135d0c0acca86a04c42ba9cafb09b7af96347188880b086169ebdf9f1f5f3173" 371 + ~x:"1a220585a989ef2c12bbfa9fc0d258713556fe38" 372 + ~y: 373 + "99187498534f313dc7cd7f3a48d62b2335bcdc36f0dc98dbf845dc6085c267474c36fdfca38854219830e614bbcab2bb9decb81e86124bd78f86d471bd84be06ac1f0f41fe5b4b3740b2107e0c9c48f81e31e9bf550d96564dd380ca47a11d72f0d0a3275f075f95bbd59869c14dc912a1cbcf01db9fb7f71015cc149986825e" 374 + ~k:"8fef50b7121a04a24755b6f3e1cdc93848a9081c" 375 + ~r:"54ed4efaecdfc78d026471b65cfefc6529945bbf" 376 + ~s:"6d6dac296ebde3f873b751c6b14843f0b7befdff"; 377 + case 378 + ~msg: 379 + "b80a47071d1376fe617e59fdc005a890369a4ca5e678ff46eb9b205d6ec09cbd49373bb341fe7813ee442a6ece17e720bf71a74557ac9a375c059e5535e773a45e79e1bff3465a3886c86e2a2bc882f0beceefffb2ae1a522f13c82def4cfd0cfca6fceeb4cece71869e90cd10d0aff27a84b5601daae061cbeb3aa62b37fd3a" 380 + ~x:"4247e7e4dc4270fc7680bc05746807c183e0dd98" 381 + ~y: 382 + "91f50270a754055e5da611c720a4262f3cb8bd4161f77d07401604d3d1165e45518f7e1901adef6628f23dc48271d35ff492af8d62aa538c0e77e042f23a522f2214e62114bfeea46ae8888bdadacdaa0a9a5b503d79c23e4c20c98bd4ebb36f95bf4451ccb0b5bb44dfd011341cfa29a9e156a3cd828e126e68cb911e8f9dc0" 383 + ~k:"3aeb3383a3c0f53217c0d7077c3cd66d2ef74a2e" 384 + ~r:"1fc2d1cb80bf6e0e78b25fac293b752cbff2b5ac" 385 + ~s:"75bcc772f773d5fd98dde1f907e7ec2cba201dfb"; 386 + case 387 + ~msg: 388 + "a9603054465887df15db07c0709a8c878d2f1abdcfc6195eabf3e9b3ad07e8558b99cc4a7aa076daf67e9b7d8480f11e8afb18e2ac56a9547b48453fedca32da9eb0c29271eb60f0a1d95c18f42d992394b3264ff3e21e606e0beac08a7ba71b8e5795a8da985118e432cf5b30b6cd3a603d8b0d580f06c626ee937c6cd05f40" 389 + ~x:"4d2a5462ebccc5d19bc6c1cabb609c08ad088e08" 390 + ~y: 391 + "a2c4569a301473ae4f164d68b9a3c6eb705ae81f75d6e5cc3070a559cccb8b1a2d8c21090ed70e61670c7e9dbf5f755a37d58d3abb34c2dfd40db9f26f6868d0dd91be98f395ac0ebdc37e1b5423802bea7a6cb196d7e0f93db92f663b6c9c726e80feb2e9227154ce1c15f8e8df93ec0d37fa47e5fa112bb0a48f4a239d6052" 392 + ~k:"36a3cd0101358a4d30c5b7117bc239fb4f6ce2e7" 393 + ~r:"48539523815bd8d73ce702367c7712b9b13867f2" 394 + ~s:"20ff4cfef8a668829feae73b520e8aa4d02c8168"; 395 + case 396 + ~msg: 397 + "19eb088c3229a44f9586f00421cfe7423a486d5f7e28ad2c9119dd2e1395df1acc06cb28e9069cee62f09f48e4ca29269dd89df9fec1ffdf64b1fe2717fe52b1421fcf6c705c0cf39930f90ecb339b51ef95b2ef38a6d96a575f7b36f5edf4f2cbd6d261e1fdd77d4459288c02e68c82a3910ff8ca1747c86bb187d5205f51a8" 398 + ~x:"0842ddd5a04161e4579797b5d8eda0002dd847ad" 399 + ~y: 400 + "49e606aad5d2e54e1bae2517915c660ba30ec4fd28d718613a7c84464b0f44bc6d546e5a9bc1dc60423b45dd01ec295564ec08f29d6887e69f689d6b3488f9da5d5a60f39cdd5a158d51a3d073b2225fea559e58bb222e29a87b5f0f5ab31dd7c0ceaad887070dac955d28973607a99e46ddd7737beab65199f250d7f03b6583" 401 + ~k:"712eed73c8d2567809b4d9ec2f59e77d39290b2b" 402 + ~r:"6bf4f5d3251201059ee85edb99a67a706f37197d" 403 + ~s:"3125c5af397759996b876cb5857be2632aaaf3b6"; 404 + case 405 + ~msg: 406 + "addb5a045c9f4f4fb9eb5e5db44d6515980c9e088015b68593d8bcbffc6ff57f18865ab824d3d1586425cb5081197e9e01cb7297b06b64103cea437eeeec9c50798679fb869ec306a72575057fd368aeb0f674a29c3ac248b6a08f91331d8456d062025347c12a0a61c61f76e5206fe6ca437735af430dea7cc8f39f1a5b7505" 407 + ~x:"1f1cfc682048375915fb483b77037c81c05ed728" 408 + ~y: 409 + "221ced57a91325b10f8dcd1220b1af68f8daf397f419a43bbd8fbe644311755b111aae5257c642fafd83b047a1f56f2a829fcdf4df3e5dccb23645b28c0a34c6e8a650efcdfadd48fea467cc943ca4e7378829300713838b6c710962ba72e790c10ab879a01fe1457ea3dd4b7c3c3a542e3522a75d0db261e576cd3f22c998e4" 410 + ~k:"703154f6c6e12f163ecad0494897dfcf5657fbe2" 411 + ~r:"7cc662e352e0eede85140107a7773ad8663e70bd" 412 + ~s:"15c17b9d245872844eaac3d46bb08c3e08597423"; 413 + case 414 + ~msg: 415 + "02709d2be0d9dc1dc0ebc55f630d91fa23609f61b513c2275766034d8f40e819aaf9326c8db37c35c5a17e96bc956df6d11b558d16d91871afc010b3119c5798c2e29411ff4f0d7196e7e476bf0ad03bf72e897fed873c10613dd255d15243870b81cd87d0abc16e140d032fe5bd1c8eeb2f66e04d13d49269fc7da6b65a7c1c" 416 + ~x:"1d9cf98dc0c1d7bf8dec98962ac6ef6e9406ce76" 417 + ~y: 418 + "9e93bc03e6e815308734e3b8f1d106961bebdff10a525303257a053dea4da6dcf504c7839b54d57522f2acb3aac959ff4ae8610022ca5a1e688232336ca1ee8fd7028bf7b6e9eedf8a4b0d098969f5e5fd3d9300c340e7f19fd471a451afb92ed4829fa4d90249144aa363dc18807b3e29d27e6ec3da736c33b185511bb3aaa0" 419 + ~k:"68ae16534c5f6225fc7ef980f0063de483a76903" 420 + ~r:"72b0bcc6defa66fa8bab029676a1c7703f9608f2" 421 + ~s:"69d911e05acd7be52f2834c0aa005128e7fa85b8"; 422 + case 423 + ~msg: 424 + "cc061edb31c34d3981517f4d89afbe980f74185260cf48b3043bc13a144944ad43e0e576d2a58bf589cc021dc1c1d332c4d76896ea77dda197f683e51eed71b4d6df46666a1b142e679b0283cf339e5bca90e2ff9c34dd5fd7cc4917d66704fee4364f7693101dc766707104efb2b933c4848b93e13f94855f75e4fd756cb6e3" 425 + ~x:"78ffb40fd89416388804e56444c9a642cb5e98e8" 426 + ~y: 427 + "5d7d2e342154983ebc2015bc6750f9876f5689ca0ada8529908ed4fdbc596b972c5cc6d53e80a8ad8a8cedf3ce64b62a75db441c96207fc7477e3f7b9f10df28e0cc2fb77383e7ca4c5150f712dd823c2309f0161be0bd5eedd60cf6ba230861a08b9d9a7468438b4d6ec673d28a54d83c7010d50631e55f0a02832abc5a0a46" 428 + ~k:"07c6857486160ef4003470411573399fc4e5f7af" 429 + ~r:"21f512425670943477534e9075ceb5b7d63f20df" 430 + ~s:"73c6f6f8de3aaea520a083b2264299e81cfc91c5"; 431 + case 432 + ~msg: 433 + "79d529e40c2ba4e5b9c7d77d72076f1fd9490928ff4419c824e64db8fb9a051e01e8e173c6f214e0e9e645ed250b6daaa6f8c1a5cc900d52cf3e1efbfea25748e89a1a548c73e2d110b25f5308bcf757b2135216c91dca2783332c0d7903eb21c226dbd33a69eef575aa8a41cbbdcd1b3d94928aa8f8ba58c5ce0d317786e87b" 434 + ~x:"784b9db2d19ef0ca8e696884c7711dc2f8ce150a" 435 + ~y: 436 + "282decc0e37994c2856e61f36b831b61bdc02b7ca675dbc3c2032800b7efd3b711acf14c8869968831e145361bf2182b060e4838f07dc61f76584cf102a913bb28a52c7317af5f9d2322927c9666e5e87c2f2bfd2f181dd32612d7b2b2a645bf1a47c0ebfd79a940f627a668a8f2eb729fd051aa2c659abc918e5571994e6593" 437 + ~k:"1bfcf3290fa84652a476655506b145743213e1b4" 438 + ~r:"929a4851be0ae4ba91da0e6c7376d71df7592dbb" 439 + ~s:"7e6b6504b748ef0024d9d2a2e6f3bcd7cf135ac7"; 440 + case 441 + ~msg: 442 + "f5516410706323549b20c52dafa2f2f90799786c0ddb85048892ccc18720dce5c129a10eb4388788a3d97a03b0001799cb65a79c880836bc9f3204ea75a577204dc1e2894c572a258f9e517ca37c5b791e48b27c8dc1c821b34ebb1f29858c4a72a0d5172c565e9dbe1bdddf6e024891cd6291faa81ed565746c61c2eda2011f" 443 + ~x:"673a384687ef29ebfa66e331866bd206ca2f7664" 444 + ~y: 445 + "74ccc6eb83adbcbad0fc37144d9bfb85fdcc85ab92c9f8877c9cda66251d1aff2fb224888dddb7d772a8b738c53e03ecad9903796fa3c9c6024d06367e0870ad797694f598708d08912c0fe09881763a0a722dda95d94eee8824927cbfa6761a79a038aa6d331da34d9bd5c5833c94c526a86af1cdfb2d4079d2db6d0b9a1238" 446 + ~k:"52ee4510675f0da529684fa60f6848ce63c4689f" 447 + ~r:"27b3f235e4afc18c6613b4fa7f27d7a8262ba4c0" 448 + ~s:"8b22634e4d45b71a84eabaa1e5a4bf1e37337a59"; 449 + case 450 + ~msg: 451 + "55bd1526e08f6443b255acd32c286807542d34c0f3d79892713f9d6d6d6b3be707e4af6e71f7dab4a2c5f6bd25f5ae1f514b2644a4cdafcece1e58f7576f82e2ab0af2326c71279e9bcef1e1c54a76fa77ec2b2d056717645764e7991b520b0e5a1b049109519b22aa5204e3ed53b1e0957dab5ec32479d06ac3e11a5d1cbd03" 452 + ~x:"495009f3a92548be4c9a562ff703187b0ec2cc86" 453 + ~y: 454 + "5d6edf6db6e6c27e80a7f02597237919170b4936489d6f15f598b820cd917e172509b7e287b88b0cc14e1a0186793886809ab4170209987095092234b4fdc44b3d1fc16eeb2efaf852ed3916698cf9eca4612b4961bb6e20c32e188469883f97f49e29a8197c30d0723babb06dea704f7704b2788e57d76d6d9a3cfa68f6c783" 455 + ~k:"423308bb414ef959025bf1a4b27db278f904241d" 456 + ~r:"621a290930ac436737a72fb4c62bf5c4b67481af" 457 + ~s:"62db20f82a5754f109f7a2ce581d4c8d71c68d29"; 458 + case 459 + ~msg: 460 + "62789a89f0d708e21a121fc34009af884133681b9d4a66cc36c0365c34be72a4982eb0961ce257f35e6e7183f0204a96a545193001023d3309a8997e7c4b762ab4f4c40e03e13f4edb328b23cf00c09119deb40addf6567b3b74acef5ceff045304d618421e873c41a72d31e451d213b060829b286f64013d4d9342ae7ab8064" 461 + ~x:"2b8dd3965992fcffd158a0816a5987f80908b84c" 462 + ~y: 463 + "ad590590a82e8929ca86f405516c32913bf5282f70309c6d4a88ccf165ce15fcf11e140c366bb273839a711cb6ae52bb717859570fdbf9fc26726728596e6fc71923deadb35a9d57cdb213c0f29c1375f8b1d3c6b52690c428f7481c14aad82fba7f24eea8cd8da7f0ef7ae781c1a926671a61d4e5ffc8ddf1bc10d688a904c6" 464 + ~k:"58ccff88958d5fc48d671ba22ed71f5f82370ac6" 465 + ~r:"89dcbca7c8cd6b90aa906a4c547153762fcfffd6" 466 + ~s:"23e8926b18cfd4b67c53fac4a2d5321e5c3d880c"; 467 + case 468 + ~msg: 469 + "4eafcc6874ae2a6d525738967afb3054357a39670d1e5555d7dc55be24dd5a32a0c7ca3f1b5c6d948c9ce391013abeb47f7e24cd2c54e1fc7c0e92c4ab77f5973a7054bd1c6c845b802b7937d6520508ae018ae14b27ff4b1e340a4b9f6f6b4814d07e90cb8f19b15e915d6ad1834c0f7a3c3e1e45206772a0eec2d3f9160897" 470 + ~x:"6b3acee42276bba155156f23dfb7cdf64e4b1ae8" 471 + ~y: 472 + "b93d79472f049893779a3a0e83b3853f78b3cf69b75961a60e950f0c00f498f3eaa2384325f74ddd38292fbdbdb199212e90b14ec9e554727df81e06eb7783adda38691c63a7cb00cd76d8e18e3d29c793e9f1fe8337f1598b89651f634cb703f218e1906319f82ac6d58e6786da7aecfbca5939f03a13e7b4d5a8ac812d7829" 473 + ~k:"1c48f62bd097d7686879d33ee5771558e453bb3d" 474 + ~r:"633e9812a0657cec3326aa5415340c46362fcd4b" 475 + ~s:"6b201f0c3fd44247f6c28c01d1217eb99146c040"; 476 + case 477 + ~msg: 478 + "86d9892b48f5954101482742c0dafb68dc97122483b9e459f97495cc970e056d2162c7c71db167229fb7f45209e0c01eb06ff924b823eda51a7e990f3c986eb9af2a7a073f754cb84db453a9e8c0ae7fa5c05a2655d261ad7ec5612876fa7df09522e0b69ae92477f63def1992c96ce95ee7bd630ec1614621da6a512ab53dd7" 479 + ~x:"836d90fd90d21b84bb012da7b2168ea8f05202cf" 480 + ~y: 481 + "ae264ea96bf093ef2de27381738219e3bfdb08616967cd13e9415f475c4a794c19f12a607b898db1e3e6bc5402327585d32841ae15e3462880850e9e4136a4751b64a729ea27b72ce36128a44fa53752a08d73584faa44fb14120f47a04c47e989eadabc7e5cdb15d27c2b0ea4257cec229a2c7bf7c93c571e8d22aeaa2e38be" 482 + ~k:"7956ea15111ff392d6a9359067bfd8c21f0bfc0b" 483 + ~r:"77b480885c70c1fee2056237d1b79cfd9fb54a1f" 484 + ~s:"2283f4c0640ff6daacbdfbbef7224afa59ca3959"; 485 + case 486 + ~msg: 487 + "8b60b9b6ba375448de4f00de51d18706ef8c4f97ba34c9cce2b0abb0698436009d1d2bafcbef73a8b5dff6a3cd5db5258ac84ef724b28d8a62d715da6e111939735366a7c66470364557f546377d5c0e7ea9064731cb7149e1051d66a7bed14aa205bdc5d4b9ca029a1e68a6fa2c1db22d27fb79d83877cfaa6742119229a493" 488 + ~x:"5a4ae9f8fc82c9198d9400c51f282493b194a07b" 489 + ~y: 490 + "87032f263de2bf2f268a093f33c366d6bcda772ca959fa17cfe948f1dca3e75ec94276de91d9bc60fc6ab9224861c55dc9ccc5f715c251dd508bd438681cab205059050f8e11e8a5468da42d20aefac53d7a9fb71f6424d7bdc65db873ee4f9dcd918091aa724b261b6056f320ca7724518e14cb8dba0b713f54a0fe44ff1597" 491 + ~k:"662351e9b8c3a607afdf3ee599b46681e27b83c0" 492 + ~r:"5d159f894d250db90d7fccd49329e44d1112db47" 493 + ~s:"37231bc15195ecb6badb7c3fe80380ff912baeda"; 494 + ] 229 495 230 496 let sha384_cases = 231 497 (* [mod = L=1024, N=160, SHA-384] *) 232 - let domain = params ~p:"f24a4afc72c7e373a3c30962332fe5405c45930963909418c30792aaf135ddea561e94f24726716b75a18828982e4ce44c1fddcb746487b6b77a9a5a17f868ab50cd621b5bc9da470880b287d7398190a42a5ee22ed8d1ff147e2019810c8298ed68e1ca69d41d555f249e649fb1725ddb075c17b37beff467fdd1609243373f" 233 - ~q:"da065a078ddb56ee5d2ad06cafab20820d2c4755" 234 - ~g:"47b5591b79043e4e03ca78a0e277c9a21e2a6b543bf4f044104cd9ac93eff8e101bb6031efc8c596d5d2f92e3a3d0f1f74702dd54f77d3cd46c04dee7a5de9f00ad317691fddcefe4a220a2651acae7fcedda92bfcca855db6705e8d864f8192bf6bf860c00f08ad6493ecc1872e0028d5c86d44505db57422515c3825a6f78a" 498 + let domain = 499 + params 500 + ~p: 501 + "f24a4afc72c7e373a3c30962332fe5405c45930963909418c30792aaf135ddea561e94f24726716b75a18828982e4ce44c1fddcb746487b6b77a9a5a17f868ab50cd621b5bc9da470880b287d7398190a42a5ee22ed8d1ff147e2019810c8298ed68e1ca69d41d555f249e649fb1725ddb075c17b37beff467fdd1609243373f" 502 + ~q:"da065a078ddb56ee5d2ad06cafab20820d2c4755" 503 + ~g: 504 + "47b5591b79043e4e03ca78a0e277c9a21e2a6b543bf4f044104cd9ac93eff8e101bb6031efc8c596d5d2f92e3a3d0f1f74702dd54f77d3cd46c04dee7a5de9f00ad317691fddcefe4a220a2651acae7fcedda92bfcca855db6705e8d864f8192bf6bf860c00f08ad6493ecc1872e0028d5c86d44505db57422515c3825a6f78a" 235 505 in 236 506 let case = case_of ~domain ~hash:Digestif.sha384 in 237 507 238 - [ 239 - 240 - case ~msg:"b0dbbf4a421ba5c5b0e52f09629801c113258c252f29898c3354706e39ec5824be523d0e2f8cfe022cd61165301274d5d621a59755f50404d8b802371ce616defa962e3636ae934ec34e4bcf77a16c7eff8cf4cc08a0f4849d6ad4307e9f8df83f24ad16ab46d1a61d2d7d4e21681eb2ae281a1a5f9bca8573a3f5281d308a5a 241 - " ~x:"649820168eb594f59cd9b28b9aefe8cc106a6c4f 242 - " ~y:"43a27b740f422cb2dc3eaa232315883a2f6a22927f997d024f5a638b507b17d3b1cbd3ec691cc674470960a0146efdecb95bb5fe249749e3c806cd5cc3e7f7bab845dadbe1f50b3366fb827a942ce6246dda7bd2c13e1b4a926c0c82c884639552d9d46036f9a4bc2a9e51c2d76e3074d1f53a63224c4279e0fa460474d4ffde 243 - " ~k:"33c7ba88ff69707971b25ac344ae4a566e195f99 244 - " ~r:"77c4d99f62b3ad7dd1fe6498db45a5da73ce7bde 245 - " ~s:"23871a002ae503fdabaa6a84dcc8f38769737f01 246 - 247 - " ; case ~msg:"ec84bed09ecb4a6feeec3a7071b65a4c1267a03cac8b5a0500c237b20dc058514da798335a21b23d7e8cbb15efcf92e6060a13fb77f4998147dec1d0fa0edd418b0aae8eb0056fc7d4008b198bd40b969dc10d79e15b2300820323bd5e1b7d894ce8e7bc8f7ceca129b5e511ee1c8caec25514f537353a912a971b8070e3f141 248 - " ~x:"952b61ea90df3f788eab61d95be16ca28001800c 249 - " ~y:"d7a0950d0e6362b0c942ad8af67161df07debca59a4cfa728f93d49b6e296a23969a65a92b2e05398a114d73d5a52b73b71ebb28571cf6b6002f853a8f594b5c93b9a84233f3c552823619e0aa847d60203db15d2a916ad02228325e15783988f4159e05c8ca088360e6ea7ace51b055102153c00adf335ff6affd1754f2a8aa 250 - " ~k:"7982f6b8956c2bc0a2c2d02ecdb9e47d23a7ba81 251 - " ~r:"b2570e0e19935438d32686c478473a0e45dad023 252 - " ~s:"39a02e9803624f7e90feab8714cddc41e01f8fce 253 - 254 - " ; case ~msg:"80f757fc06409b70d733efdb68b520f3f9078ab936c4479fb98d0beb1631d8303324470824862224b439bc85decfccb8de8fbf36a2bc4ce3a092688249ab4eb9febfad268245fbd7e72e0f240500af71292ea23c8ad4b71e032106f587f4611663137690cb25241912763c5e1879b3ab67e2187f92d821fc81f552e2c355bd73 255 - " ~x:"2a5f637f4b886a3d37c4369cab04d78c79f1a3a8 256 - " ~y:"1f03013e66fd1e633ff743894c37f6964839a52cfbb6e849cfb4eac9a3c9cdb55c28e14788865c212be62047cb39c6365780bb2e627957d34e99232f69170a8efb894d8029d1b8bea8b911cebcd43b86bd536693f18bfe50c84b99911181ace14c3fab9fb6acd98786f9d2ad129c5efeb8cd0941a3d89098d5721d435343cb76 257 - " ~k:"b7c75c380bce0fffd59dfc3993e1d0724da877b6 258 - " ~r:"c7db4a9f54d882ec5f561705396c94834dd53c5a 259 - " ~s:"6752cb6be9b87265d76d69b382299678f96a5faf 260 - 261 - " ; case ~msg:"36a25659a7f1de66b4721b48855cdebe98fe6113241b7beddc2691493ed0add0b6a9fbbf9fb870a1bc68a901b932f47ded532f93493b1c081408165807b38efce7acc7dbc216bef74ed59e20973326553cc83779f742e3f469a7278eeb1537dd71cd8f15114d84693c2e6bbf62814a08e82ba71539f4cb4bf08c869d7db9dea9 262 - " ~x:"bb318987a043158b97fdbbc2707471a38316ce58 263 - " ~y:"c9003995b014afad66de25fc0a2210b1f1b22d275da51a27faacda042fd7645686ec8b1b62d58d8af2e1063ab8e146d11e3a07710bc4521228f35f5173443bbfd089f642cd16641c57199c9ab6e0d9b0c01931c2d162f5e20dbe7365c93adc62fd5a461bea5956d7c11ac67647bedcead5bb311224a496aa155992aee74e45ad 264 - " ~k:"2ff654b680e722ce65a560e785e8ce0b4773c86d 265 - " ~r:"17cc53b5b9558cc41df946055b8d7e1971be86d7 266 - " ~s:"003c21503971c03b5ef4edc804d2f7d33f9ea9cc 267 - 268 - " ; case ~msg:"65a3c92453f961de7f576d5a1e3106c38b7f20813994b5dd201546dc455065dde59edcd84d0fa17a85c0f9f99171d67a34475cef4f311951f2eef7f6b64a5bbc6da6d1b622480cde56a07a77aa6040ebc1fcb265b3b624881fd27203dcfe8a12492198474a990cb9f34a1943356fde5bce3fd83516da8bf780f8cb1851b3b954 269 - " ~x:"59d92aba23f50ad08b1d7c2ad560ded36b94ebc8 270 - " ~y:"0fc514ca160f34f2f6ede1ba5914d5844c9de514208c72569a0b36ec92c8b2c8fdfb7d68127486e58a04a32d0d150e51bb05e66624cb622edae19a6b4b1d8317689baafa30168ef3759ee82e614e4761900182df90e9cd2d931153771b8be30d89c2fbb95be7e05a4b29da968ffebbda5c0c9839354bb59dc697a269063f2f50 271 - " ~k:"3d0ea569b4dc69342955f5b240af66d228791e50 272 - " ~r:"77ffaf4290c41eb089c1d7be5c8d3833027702ef 273 - " ~s:"cb753a2d4ce0e59851f814779f343beb615f2770 274 - 275 - " ; case ~msg:"1526b64ce41cc8e2cef26f3706be530a36ac9cd16ff69f05773e9447ed9452064b7751f3a64919bfa3a7e1020dfc175a10acfdf096fd41c03372e4d2abd7ba887e0076716ce9552f2c7c8eddb1b3fca1bdcd23300ce2b1677d4a2debeaa7053466e59b098771bfb9218e0fb4ab6b7418abebcc34d681e14c4a8975000d83bb44 276 - " ~x:"716290d0ff2ad2329be2cccf825f2075be659743 277 - " ~y:"d30eed739f46479364d4c2bec18cf4c75c324f8db8184d9c3c175556a00acfb0a6813887b68706e70c167f4063bc0046396ba1bb3226c29221bd64ec4cebc990a7b404e26e2cf042304a7c57ab7de418ba671e17f7f502b9e1bb5984469b304ebc0c3c3a5a69cff7abff4110130316651e0f93ebd2834dd044eae1fd6f045102 278 - " ~k:"919d698fe37c027e3e40cdf6e77f81e96d8bfffb 279 - " ~r:"31abe8e7458ce363a5f3985111b239bc8df8dcb9 280 - " ~s:"1d967be0116128699d167fc16e5e920a41311669 281 - 282 - " ; case ~msg:"d7852ee90b3f1120bb11249808c7e7be14fe577bff1886be3c42589a6eeb06a1834110862b65d26cc5a2e5d903ed24328d684c96e3babb37ae31f96d32f57657a3bd7798aafae86f44ad8981e7cd47d7f31bb4564a757c925c64da9820963c1c5148f589d6393004a6a58aa2c8a578f4db7595f886170e79e9d57bf7ff8fd0a7 283 - " ~x:"0531cb42f45bb813f401bd239044df2d3d1968b2 284 - " ~y:"0dd37985163f93618fdea8e3975419fcf7446ff980851e18932d7494f809c0ae9c03cc39779ff0422cb2248ae1986f9aad2a43d6fa6878d244b429aac5ea80157980577e5ba0d11b1fa340a283fa0a2d651e024331e6bbe7d01ac034db37b008b91f9f88d135fad23af8c22765d833a9c9eff7accf668e17f9a8bdf59317c202 285 - " ~k:"739dbd1f84b6be2efdb921a0dfb76dbc6136915c 286 - " ~r:"44c2d6509874ace71acd1dcc32335b394c4e41e0 287 - " ~s:"37e78f13aec052eb7b07a8b9f6d54dbc77829006 288 - 289 - " ; case ~msg:"9ab91448a0dc9694be173ce6d9b522ce0e2f75fcb57720fc5eb8f92d8fb0e195030063968925a568636f4aea1edf6c5fcb86dcedd204539d8c291757fb8a51620abda59aa8f8502e6904bce0667d92c8cb3fcf1a61b1fb0bb4e9383b37eb469bd5c2f5a77680da62f907c2e263cb48402b4b12985eaab90451885e819b3e8c3a 290 - " ~x:"6d764cf62a268b0070bf80308622bb31941d4763 291 - " ~y:"49d7f08fde0a83cfb8116c9b7cdcab29751fca5ffe310760fea713c30e95e7755e65ce60928893c65020ee9b61f6c9c89c07e0fc503b7b031368f069578a9e6b451fef369ef90c26dd660ee1a6b8b714d1cc28245e9f13f187122de26ac2fbf5bccb7caff59f1de910551104d3a0e8fa9fe6b7eacc9a5fd556b7bf7139d6edf9 292 - " ~k:"c66ea7177cd6edf6b9079fbcf6737d3890469b19 293 - " ~r:"95da25d06ff9c02bc893fb032508304c17ebcf08 294 - " ~s:"617adb8de10da1a87413d64466b482409d27bce7 295 - 296 - " ; case ~msg:"c9c0e69f840cb6deb984c2575d7f6816fa35af03b4429c703a5aec90e7cb26e52413587f3bc5a0772be7b5e589c9a76071c1739833f4611fa951d375820b48d740626c665534d60487bf3e0a84eb6389e099fe621f269491c3b8942e03bbad2a5220caf51e7b4a2650e4b300024a0a96f0861b3206fffca83d0850f2a3e2a06c 297 - " ~x:"38a62d234e1aea0e847621e79dd17ee9d08bd9c6 298 - " ~y:"26f73219d0e7dd3a80e7fbc079d9baad4512891aadfd2416b1859f41adac31171ec624d8a4d6a10d5de1b93959bc49953f23492f18ab765f963a98584807d66629e5a1e057d77d42e3363458641a0469166a0d853b27798bd848aa0d3ccdbb40fa21b9fe62824cb2c7cc62425978e672aff0bbd8c8cd08e46385b0d6219dc56e 299 - " ~k:"5f5755dce464174adfe00affb55a71222d83da85 300 - " ~r:"b6b25a9da110b5d57675889eae75ab58a4d8e281 301 - " ~s:"5a60c2b0adbea4c5be065bbd0fd0e3ce4bf29200 302 - 303 - " ; case ~msg:"4002de825bb87ac346bd8487cf6be053cb30ee67c66434217107a8b0b52e5726900615edd2fd0acdf88a7e65e7dd3ba6abbbb371a1c840250d9ce809e7b1111f16daf5194211715ff5fe631e378408749848a0c81a289b4338bccd8d1053f863197ad02920fcbca514e2dfd94a8b00f90cf034adfd776f4dcaef2c8dce3b0539 304 - " ~x:"c8f0d697bbcbcc0e31864f8319984125f52ff5aa 305 - " ~y:"149bcbb4f5983db56fbe998fcd02d736e6d2f18fcf96468cd7e99bc647436fbd74fd7a2cc2f0d8866952b97b44ff644b5665cd1065b07a2c33d9151deb335e3522c1b77da1443a1373c93bfa040da5a1353b88a78e3a5a084e6c442db03f7fbb4bdbd30b1af3963f8c5d3e83453294e3a07ddacfd43dc8f9e83032fef78420c4 306 - " ~k:"b4281920a775fbeefb89615b236217fd1046f2cf 307 - " ~r:"d3cde170d82154ec1bbd9077c486971120600376 308 - " ~s:"b008fcd01b5e49a85a921bee1ddd706212799086 309 - 310 - " ; case ~msg:"f7018ff0af6776ed4234c1fb9cca1f8cff31295cb9f76d8b73898430097c49a40028441771ea1de08ffd5cec7eaa59e32b3a170329139227ba86e0c5efcaee382bfff962249da853dee418413f201a28fe45b8293c262089d2ceeb9af67529ab011f04f5eeaf82ba32dce9a9821762c3351b00206591a3f87c5260a4263659f0 311 - " ~x:"9dbd262da7a529f80aa667b27a29d6a52671fb89 312 - " ~y:"6c206e71fed8b363fcf571786ce1b4e52a404de7eda7031e5d93a47ea668de43dc7073e31d3b6b125ae3e8ee45aed273bc878c73423b225a1526bbb149a0ce5e9a2d2962bd6d332375860f84ce0e787a0af93f44e64edaa2dce6ca22bcc6d48b84b0affba342753b1842941067d5b8414c356138e625bb506566a27b335094b0 313 - " ~k:"0f0e02596ce6674684e7ec448d2938de12842fe2 314 - " ~r:"079b08bc016c543d09d6b276c023347a3aace9ae 315 - " ~s:"164c3c380f209feaf8ffcf53691ee3031c3b3fff 316 - 317 - " ; case ~msg:"4a18bdcccd46bb89567ceb9c1e2e500a3baed24ff2c5fc7f83cb3cf6a6f38859a1a927fab5e2fd7ea1e1a4154739301cb1957709103af886c929cf88d25ced5cd6f8cf3ffee7b088edc2f6abd1114398a3ab00fc21bec02e8e539ba12df70a587fbfba63195c6449b2b849547c42277834e1ec086b5e53d949846769e89715bf 318 - " ~x:"5b3e9cc0e0be3d714d1bb2d95e5146d27a58f2ee 319 - " ~y:"8e668dd1527b5d1e56aae4a6ca225e677368412324a79d98bfdad9a84d9f87c1357518c9a5056ea6a0882e94d4ffadd97d89bcf2f32ff442b25dd2af2a78ddade46b75aa8a5b1a1471764ab699d700cb2a28b959a3848edbbd6c9514ee849f833c43008531365a01541f9c0b65d5e7d3c21dc8bef1369a41c0405f3723f67910 320 - " ~k:"3d9b8166860e18a9306026ba669a3620c2954ad4 321 - " ~r:"b22c00fe0bc2fae7a4ab74edcd496c64a999c7d3 322 - " ~s:"85ba8dbbc93ab94a76133d479e3f79576944e6ca 323 - 324 - " ; case ~msg:"75474711821766b065e2448601e82b88153a41bfb5c6b6a9ddcf73170ee374a6625de19c560bcbd2020bfeab5cbfad8fc60ccfc95a1b94fbefdf815d9bfc43fa59315e7093d5685274b8afc3139b925ebf697fe2699b0feb1e42bca65e5d4eb0b4514af92dfab85e7f2666c87e9789395f354ce33938e9623061113465a4e2b9 325 - " ~x:"9b4a2536a108892240fc40c8c69a4b9b903ac760 326 - " ~y:"74a93c73d75500ca4305ca3184475b53d96c6fdd417ef23d9dc61b80bbc1108228d2543c1c3a9f2e7783ca69b019c0cd9a6d2b62b0ed93d4229da87bfc21f9e4bd0dea2c4e6d4d2f88201ab0504b31f4ef1558adf493e470adfc572ca68debc46123589ae913b967983dbcac6bf3bd8611137e39d5870057ae18cb84a76aae30 327 - " ~k:"a993b059a49855e359014151700d02e8292ae708 328 - " ~r:"1ed131c96a2c310e1f7976d3082a69a5af45bdd0 329 - " ~s:"70663e9ad7113ae57d4af6907712e0aaf88bc07a 330 - 331 - " ; case ~msg:"340df708d457df9413ef2bda225c5f558b90966cdd531a0b5aa745d5c3ea790debea224861ef12fb1638bff0121ff26dbdcffc299bf9f3a9c1fe6027400ff14c34fb06f67db9c30a1dcbfd996903523d85046382ff280418d974a3ece6b5fafe305e2e79b1d07a7c1eeb7a1277a82282be62831df7fee38841462602986a8e9b 332 - " ~x:"067e6e55be4744723b6f056b76629e93c297a585 333 - " ~y:"6150a68d64adda3d3fb5a973c62b992ad3fe538af7161bae41ea2f1799304fe5b8c864e061d133d94c16a4c6b0ed8dffdf2cefa7394015e75c57b181419dcfefe3409d3b53d86911c749f9f28f7c1de99f7e4b2ea22a48817ace4fd9974fa53b8d4f05f5731488813803d7f3aaf1cfa138bc73c4d27ca1621e9226661883e9dd 334 - " ~k:"77857e6de8f37eeb6925a87c027a3cd88b9d3584 335 - " ~r:"4f182ad42cb5671d3162bb9d04a06cd20edbc558 336 - " ~s:"a6c5417947447718ed1cb89a6efce2d3116e50d1 337 - 338 - " ; case ~msg:"9f23c82563ab7c0ba86bbb989335000a493b291e5dc17ce729494958903623ed99df344230ffb626b1dbefcce059ae16c2ee7ee6fd2a7807336cb71b8853e2ed3b74b2faac82a831d53e03d7bbb96d38df98fd19bd4c1a6248cd507c89f7995f59579afe5319731b443d6871e558f5b77f2f9a4dd99efb305e27916594524e02 339 - " ~x:"b457e1756ee9056fda7207616cf7c04a33afa66a 340 - " ~y:"96d7451181fb253fbc3f441409be5e5e0144972610e37fa82bc2af246637a4c918023097875255a217ea895daddf46bfbb174749b04c59fefa6289684f2f9aeadf5ce7ca47f0032e384b7d50597901181501cb5915fb4686a6ad7bcd5b46862411a4df22b1ed2a56905e07c0a936c9944213194ebefd4ec68597cca036338b3c 341 - " ~k:"b29f28659dffea28449435b5a044487e29d82d6a 342 - " ~r:"b6599fbddb4856276df448cf09d62fd7657de6c3 343 - " ~s:"4b49589099be5578322d829b87b43ac07f62e35d" ] 508 + [ 509 + case 510 + ~msg: 511 + "b0dbbf4a421ba5c5b0e52f09629801c113258c252f29898c3354706e39ec5824be523d0e2f8cfe022cd61165301274d5d621a59755f50404d8b802371ce616defa962e3636ae934ec34e4bcf77a16c7eff8cf4cc08a0f4849d6ad4307e9f8df83f24ad16ab46d1a61d2d7d4e21681eb2ae281a1a5f9bca8573a3f5281d308a5a\n" 512 + ~x:"649820168eb594f59cd9b28b9aefe8cc106a6c4f\n" 513 + ~y: 514 + "43a27b740f422cb2dc3eaa232315883a2f6a22927f997d024f5a638b507b17d3b1cbd3ec691cc674470960a0146efdecb95bb5fe249749e3c806cd5cc3e7f7bab845dadbe1f50b3366fb827a942ce6246dda7bd2c13e1b4a926c0c82c884639552d9d46036f9a4bc2a9e51c2d76e3074d1f53a63224c4279e0fa460474d4ffde\n" 515 + ~k:"33c7ba88ff69707971b25ac344ae4a566e195f99\n" 516 + ~r:"77c4d99f62b3ad7dd1fe6498db45a5da73ce7bde\n" 517 + ~s:"23871a002ae503fdabaa6a84dcc8f38769737f01\n\n"; 518 + case 519 + ~msg: 520 + "ec84bed09ecb4a6feeec3a7071b65a4c1267a03cac8b5a0500c237b20dc058514da798335a21b23d7e8cbb15efcf92e6060a13fb77f4998147dec1d0fa0edd418b0aae8eb0056fc7d4008b198bd40b969dc10d79e15b2300820323bd5e1b7d894ce8e7bc8f7ceca129b5e511ee1c8caec25514f537353a912a971b8070e3f141\n" 521 + ~x:"952b61ea90df3f788eab61d95be16ca28001800c\n" 522 + ~y: 523 + "d7a0950d0e6362b0c942ad8af67161df07debca59a4cfa728f93d49b6e296a23969a65a92b2e05398a114d73d5a52b73b71ebb28571cf6b6002f853a8f594b5c93b9a84233f3c552823619e0aa847d60203db15d2a916ad02228325e15783988f4159e05c8ca088360e6ea7ace51b055102153c00adf335ff6affd1754f2a8aa\n" 524 + ~k:"7982f6b8956c2bc0a2c2d02ecdb9e47d23a7ba81\n" 525 + ~r:"b2570e0e19935438d32686c478473a0e45dad023\n" 526 + ~s:"39a02e9803624f7e90feab8714cddc41e01f8fce\n\n"; 527 + case 528 + ~msg: 529 + "80f757fc06409b70d733efdb68b520f3f9078ab936c4479fb98d0beb1631d8303324470824862224b439bc85decfccb8de8fbf36a2bc4ce3a092688249ab4eb9febfad268245fbd7e72e0f240500af71292ea23c8ad4b71e032106f587f4611663137690cb25241912763c5e1879b3ab67e2187f92d821fc81f552e2c355bd73\n" 530 + ~x:"2a5f637f4b886a3d37c4369cab04d78c79f1a3a8\n" 531 + ~y: 532 + "1f03013e66fd1e633ff743894c37f6964839a52cfbb6e849cfb4eac9a3c9cdb55c28e14788865c212be62047cb39c6365780bb2e627957d34e99232f69170a8efb894d8029d1b8bea8b911cebcd43b86bd536693f18bfe50c84b99911181ace14c3fab9fb6acd98786f9d2ad129c5efeb8cd0941a3d89098d5721d435343cb76\n" 533 + ~k:"b7c75c380bce0fffd59dfc3993e1d0724da877b6\n" 534 + ~r:"c7db4a9f54d882ec5f561705396c94834dd53c5a\n" 535 + ~s:"6752cb6be9b87265d76d69b382299678f96a5faf\n\n"; 536 + case 537 + ~msg: 538 + "36a25659a7f1de66b4721b48855cdebe98fe6113241b7beddc2691493ed0add0b6a9fbbf9fb870a1bc68a901b932f47ded532f93493b1c081408165807b38efce7acc7dbc216bef74ed59e20973326553cc83779f742e3f469a7278eeb1537dd71cd8f15114d84693c2e6bbf62814a08e82ba71539f4cb4bf08c869d7db9dea9\n" 539 + ~x:"bb318987a043158b97fdbbc2707471a38316ce58\n" 540 + ~y: 541 + "c9003995b014afad66de25fc0a2210b1f1b22d275da51a27faacda042fd7645686ec8b1b62d58d8af2e1063ab8e146d11e3a07710bc4521228f35f5173443bbfd089f642cd16641c57199c9ab6e0d9b0c01931c2d162f5e20dbe7365c93adc62fd5a461bea5956d7c11ac67647bedcead5bb311224a496aa155992aee74e45ad\n" 542 + ~k:"2ff654b680e722ce65a560e785e8ce0b4773c86d\n" 543 + ~r:"17cc53b5b9558cc41df946055b8d7e1971be86d7\n" 544 + ~s:"003c21503971c03b5ef4edc804d2f7d33f9ea9cc\n\n"; 545 + case 546 + ~msg: 547 + "65a3c92453f961de7f576d5a1e3106c38b7f20813994b5dd201546dc455065dde59edcd84d0fa17a85c0f9f99171d67a34475cef4f311951f2eef7f6b64a5bbc6da6d1b622480cde56a07a77aa6040ebc1fcb265b3b624881fd27203dcfe8a12492198474a990cb9f34a1943356fde5bce3fd83516da8bf780f8cb1851b3b954\n" 548 + ~x:"59d92aba23f50ad08b1d7c2ad560ded36b94ebc8\n" 549 + ~y: 550 + "0fc514ca160f34f2f6ede1ba5914d5844c9de514208c72569a0b36ec92c8b2c8fdfb7d68127486e58a04a32d0d150e51bb05e66624cb622edae19a6b4b1d8317689baafa30168ef3759ee82e614e4761900182df90e9cd2d931153771b8be30d89c2fbb95be7e05a4b29da968ffebbda5c0c9839354bb59dc697a269063f2f50\n" 551 + ~k:"3d0ea569b4dc69342955f5b240af66d228791e50\n" 552 + ~r:"77ffaf4290c41eb089c1d7be5c8d3833027702ef\n" 553 + ~s:"cb753a2d4ce0e59851f814779f343beb615f2770\n\n"; 554 + case 555 + ~msg: 556 + "1526b64ce41cc8e2cef26f3706be530a36ac9cd16ff69f05773e9447ed9452064b7751f3a64919bfa3a7e1020dfc175a10acfdf096fd41c03372e4d2abd7ba887e0076716ce9552f2c7c8eddb1b3fca1bdcd23300ce2b1677d4a2debeaa7053466e59b098771bfb9218e0fb4ab6b7418abebcc34d681e14c4a8975000d83bb44\n" 557 + ~x:"716290d0ff2ad2329be2cccf825f2075be659743\n" 558 + ~y: 559 + "d30eed739f46479364d4c2bec18cf4c75c324f8db8184d9c3c175556a00acfb0a6813887b68706e70c167f4063bc0046396ba1bb3226c29221bd64ec4cebc990a7b404e26e2cf042304a7c57ab7de418ba671e17f7f502b9e1bb5984469b304ebc0c3c3a5a69cff7abff4110130316651e0f93ebd2834dd044eae1fd6f045102\n" 560 + ~k:"919d698fe37c027e3e40cdf6e77f81e96d8bfffb\n" 561 + ~r:"31abe8e7458ce363a5f3985111b239bc8df8dcb9\n" 562 + ~s:"1d967be0116128699d167fc16e5e920a41311669\n\n"; 563 + case 564 + ~msg: 565 + "d7852ee90b3f1120bb11249808c7e7be14fe577bff1886be3c42589a6eeb06a1834110862b65d26cc5a2e5d903ed24328d684c96e3babb37ae31f96d32f57657a3bd7798aafae86f44ad8981e7cd47d7f31bb4564a757c925c64da9820963c1c5148f589d6393004a6a58aa2c8a578f4db7595f886170e79e9d57bf7ff8fd0a7\n" 566 + ~x:"0531cb42f45bb813f401bd239044df2d3d1968b2\n" 567 + ~y: 568 + "0dd37985163f93618fdea8e3975419fcf7446ff980851e18932d7494f809c0ae9c03cc39779ff0422cb2248ae1986f9aad2a43d6fa6878d244b429aac5ea80157980577e5ba0d11b1fa340a283fa0a2d651e024331e6bbe7d01ac034db37b008b91f9f88d135fad23af8c22765d833a9c9eff7accf668e17f9a8bdf59317c202\n" 569 + ~k:"739dbd1f84b6be2efdb921a0dfb76dbc6136915c\n" 570 + ~r:"44c2d6509874ace71acd1dcc32335b394c4e41e0\n" 571 + ~s:"37e78f13aec052eb7b07a8b9f6d54dbc77829006\n\n"; 572 + case 573 + ~msg: 574 + "9ab91448a0dc9694be173ce6d9b522ce0e2f75fcb57720fc5eb8f92d8fb0e195030063968925a568636f4aea1edf6c5fcb86dcedd204539d8c291757fb8a51620abda59aa8f8502e6904bce0667d92c8cb3fcf1a61b1fb0bb4e9383b37eb469bd5c2f5a77680da62f907c2e263cb48402b4b12985eaab90451885e819b3e8c3a\n" 575 + ~x:"6d764cf62a268b0070bf80308622bb31941d4763\n" 576 + ~y: 577 + "49d7f08fde0a83cfb8116c9b7cdcab29751fca5ffe310760fea713c30e95e7755e65ce60928893c65020ee9b61f6c9c89c07e0fc503b7b031368f069578a9e6b451fef369ef90c26dd660ee1a6b8b714d1cc28245e9f13f187122de26ac2fbf5bccb7caff59f1de910551104d3a0e8fa9fe6b7eacc9a5fd556b7bf7139d6edf9\n" 578 + ~k:"c66ea7177cd6edf6b9079fbcf6737d3890469b19\n" 579 + ~r:"95da25d06ff9c02bc893fb032508304c17ebcf08\n" 580 + ~s:"617adb8de10da1a87413d64466b482409d27bce7\n\n"; 581 + case 582 + ~msg: 583 + "c9c0e69f840cb6deb984c2575d7f6816fa35af03b4429c703a5aec90e7cb26e52413587f3bc5a0772be7b5e589c9a76071c1739833f4611fa951d375820b48d740626c665534d60487bf3e0a84eb6389e099fe621f269491c3b8942e03bbad2a5220caf51e7b4a2650e4b300024a0a96f0861b3206fffca83d0850f2a3e2a06c\n" 584 + ~x:"38a62d234e1aea0e847621e79dd17ee9d08bd9c6\n" 585 + ~y: 586 + "26f73219d0e7dd3a80e7fbc079d9baad4512891aadfd2416b1859f41adac31171ec624d8a4d6a10d5de1b93959bc49953f23492f18ab765f963a98584807d66629e5a1e057d77d42e3363458641a0469166a0d853b27798bd848aa0d3ccdbb40fa21b9fe62824cb2c7cc62425978e672aff0bbd8c8cd08e46385b0d6219dc56e\n" 587 + ~k:"5f5755dce464174adfe00affb55a71222d83da85\n" 588 + ~r:"b6b25a9da110b5d57675889eae75ab58a4d8e281\n" 589 + ~s:"5a60c2b0adbea4c5be065bbd0fd0e3ce4bf29200\n\n"; 590 + case 591 + ~msg: 592 + "4002de825bb87ac346bd8487cf6be053cb30ee67c66434217107a8b0b52e5726900615edd2fd0acdf88a7e65e7dd3ba6abbbb371a1c840250d9ce809e7b1111f16daf5194211715ff5fe631e378408749848a0c81a289b4338bccd8d1053f863197ad02920fcbca514e2dfd94a8b00f90cf034adfd776f4dcaef2c8dce3b0539\n" 593 + ~x:"c8f0d697bbcbcc0e31864f8319984125f52ff5aa\n" 594 + ~y: 595 + "149bcbb4f5983db56fbe998fcd02d736e6d2f18fcf96468cd7e99bc647436fbd74fd7a2cc2f0d8866952b97b44ff644b5665cd1065b07a2c33d9151deb335e3522c1b77da1443a1373c93bfa040da5a1353b88a78e3a5a084e6c442db03f7fbb4bdbd30b1af3963f8c5d3e83453294e3a07ddacfd43dc8f9e83032fef78420c4\n" 596 + ~k:"b4281920a775fbeefb89615b236217fd1046f2cf\n" 597 + ~r:"d3cde170d82154ec1bbd9077c486971120600376\n" 598 + ~s:"b008fcd01b5e49a85a921bee1ddd706212799086\n\n"; 599 + case 600 + ~msg: 601 + "f7018ff0af6776ed4234c1fb9cca1f8cff31295cb9f76d8b73898430097c49a40028441771ea1de08ffd5cec7eaa59e32b3a170329139227ba86e0c5efcaee382bfff962249da853dee418413f201a28fe45b8293c262089d2ceeb9af67529ab011f04f5eeaf82ba32dce9a9821762c3351b00206591a3f87c5260a4263659f0\n" 602 + ~x:"9dbd262da7a529f80aa667b27a29d6a52671fb89\n" 603 + ~y: 604 + "6c206e71fed8b363fcf571786ce1b4e52a404de7eda7031e5d93a47ea668de43dc7073e31d3b6b125ae3e8ee45aed273bc878c73423b225a1526bbb149a0ce5e9a2d2962bd6d332375860f84ce0e787a0af93f44e64edaa2dce6ca22bcc6d48b84b0affba342753b1842941067d5b8414c356138e625bb506566a27b335094b0\n" 605 + ~k:"0f0e02596ce6674684e7ec448d2938de12842fe2\n" 606 + ~r:"079b08bc016c543d09d6b276c023347a3aace9ae\n" 607 + ~s:"164c3c380f209feaf8ffcf53691ee3031c3b3fff\n\n"; 608 + case 609 + ~msg: 610 + "4a18bdcccd46bb89567ceb9c1e2e500a3baed24ff2c5fc7f83cb3cf6a6f38859a1a927fab5e2fd7ea1e1a4154739301cb1957709103af886c929cf88d25ced5cd6f8cf3ffee7b088edc2f6abd1114398a3ab00fc21bec02e8e539ba12df70a587fbfba63195c6449b2b849547c42277834e1ec086b5e53d949846769e89715bf\n" 611 + ~x:"5b3e9cc0e0be3d714d1bb2d95e5146d27a58f2ee\n" 612 + ~y: 613 + "8e668dd1527b5d1e56aae4a6ca225e677368412324a79d98bfdad9a84d9f87c1357518c9a5056ea6a0882e94d4ffadd97d89bcf2f32ff442b25dd2af2a78ddade46b75aa8a5b1a1471764ab699d700cb2a28b959a3848edbbd6c9514ee849f833c43008531365a01541f9c0b65d5e7d3c21dc8bef1369a41c0405f3723f67910\n" 614 + ~k:"3d9b8166860e18a9306026ba669a3620c2954ad4\n" 615 + ~r:"b22c00fe0bc2fae7a4ab74edcd496c64a999c7d3\n" 616 + ~s:"85ba8dbbc93ab94a76133d479e3f79576944e6ca\n\n"; 617 + case 618 + ~msg: 619 + "75474711821766b065e2448601e82b88153a41bfb5c6b6a9ddcf73170ee374a6625de19c560bcbd2020bfeab5cbfad8fc60ccfc95a1b94fbefdf815d9bfc43fa59315e7093d5685274b8afc3139b925ebf697fe2699b0feb1e42bca65e5d4eb0b4514af92dfab85e7f2666c87e9789395f354ce33938e9623061113465a4e2b9\n" 620 + ~x:"9b4a2536a108892240fc40c8c69a4b9b903ac760\n" 621 + ~y: 622 + "74a93c73d75500ca4305ca3184475b53d96c6fdd417ef23d9dc61b80bbc1108228d2543c1c3a9f2e7783ca69b019c0cd9a6d2b62b0ed93d4229da87bfc21f9e4bd0dea2c4e6d4d2f88201ab0504b31f4ef1558adf493e470adfc572ca68debc46123589ae913b967983dbcac6bf3bd8611137e39d5870057ae18cb84a76aae30\n" 623 + ~k:"a993b059a49855e359014151700d02e8292ae708\n" 624 + ~r:"1ed131c96a2c310e1f7976d3082a69a5af45bdd0\n" 625 + ~s:"70663e9ad7113ae57d4af6907712e0aaf88bc07a\n\n"; 626 + case 627 + ~msg: 628 + "340df708d457df9413ef2bda225c5f558b90966cdd531a0b5aa745d5c3ea790debea224861ef12fb1638bff0121ff26dbdcffc299bf9f3a9c1fe6027400ff14c34fb06f67db9c30a1dcbfd996903523d85046382ff280418d974a3ece6b5fafe305e2e79b1d07a7c1eeb7a1277a82282be62831df7fee38841462602986a8e9b\n" 629 + ~x:"067e6e55be4744723b6f056b76629e93c297a585\n" 630 + ~y: 631 + "6150a68d64adda3d3fb5a973c62b992ad3fe538af7161bae41ea2f1799304fe5b8c864e061d133d94c16a4c6b0ed8dffdf2cefa7394015e75c57b181419dcfefe3409d3b53d86911c749f9f28f7c1de99f7e4b2ea22a48817ace4fd9974fa53b8d4f05f5731488813803d7f3aaf1cfa138bc73c4d27ca1621e9226661883e9dd\n" 632 + ~k:"77857e6de8f37eeb6925a87c027a3cd88b9d3584\n" 633 + ~r:"4f182ad42cb5671d3162bb9d04a06cd20edbc558\n" 634 + ~s:"a6c5417947447718ed1cb89a6efce2d3116e50d1\n\n"; 635 + case 636 + ~msg: 637 + "9f23c82563ab7c0ba86bbb989335000a493b291e5dc17ce729494958903623ed99df344230ffb626b1dbefcce059ae16c2ee7ee6fd2a7807336cb71b8853e2ed3b74b2faac82a831d53e03d7bbb96d38df98fd19bd4c1a6248cd507c89f7995f59579afe5319731b443d6871e558f5b77f2f9a4dd99efb305e27916594524e02\n" 638 + ~x:"b457e1756ee9056fda7207616cf7c04a33afa66a\n" 639 + ~y: 640 + "96d7451181fb253fbc3f441409be5e5e0144972610e37fa82bc2af246637a4c918023097875255a217ea895daddf46bfbb174749b04c59fefa6289684f2f9aeadf5ce7ca47f0032e384b7d50597901181501cb5915fb4686a6ad7bcd5b46862411a4df22b1ed2a56905e07c0a936c9944213194ebefd4ec68597cca036338b3c\n" 641 + ~k:"b29f28659dffea28449435b5a044487e29d82d6a\n" 642 + ~r:"b6599fbddb4856276df448cf09d62fd7657de6c3\n" 643 + ~s:"4b49589099be5578322d829b87b43ac07f62e35d"; 644 + ] 344 645 345 646 let sha512_cases = 346 647 (* [mod = L=1024, N=160, SHA-512] *) 347 - let domain = params 348 - ~p:"88d968e9602ecbda6d86f7c970a3ffbeb1da962f28c0afb9270ef05bc330ca98c3adf83c072feb05fb2e293b5065bbb0cbcc930c24d8d07869deaecd92a2604c0f5dd35c5b431fda6a222c52c3562bf7571c710209be8b3b858818788725fe8112b7d6bc82e0ff1cbbf5d6fe94690af2b510e41ad8207dc2c02fb9fa5cefaab5" 349 - ~q:"a665689b9e5b9ce82fd1676006cf4cf67ecc56b7" 350 - ~g:"267e282857417752113fba3fca7155b5ce89e7c8a33c1a29122e2b720965fc04245267ff87fc67a5730fe5b308013aa3266990fbb398185a87e055b443a868ce0ce13ae6aee330b9d25d3bbb362665c5881daf0c5aa75e9d4a82e8f04c91a9ad294822e33978ab0c13fadc45831f9d37da4efa0fc2c5eb01371fa85b7ddb1f82" 648 + let domain = 649 + params 650 + ~p: 651 + "88d968e9602ecbda6d86f7c970a3ffbeb1da962f28c0afb9270ef05bc330ca98c3adf83c072feb05fb2e293b5065bbb0cbcc930c24d8d07869deaecd92a2604c0f5dd35c5b431fda6a222c52c3562bf7571c710209be8b3b858818788725fe8112b7d6bc82e0ff1cbbf5d6fe94690af2b510e41ad8207dc2c02fb9fa5cefaab5" 652 + ~q:"a665689b9e5b9ce82fd1676006cf4cf67ecc56b7" 653 + ~g: 654 + "267e282857417752113fba3fca7155b5ce89e7c8a33c1a29122e2b720965fc04245267ff87fc67a5730fe5b308013aa3266990fbb398185a87e055b443a868ce0ce13ae6aee330b9d25d3bbb362665c5881daf0c5aa75e9d4a82e8f04c91a9ad294822e33978ab0c13fadc45831f9d37da4efa0fc2c5eb01371fa85b7ddb1f82" 351 655 in 352 656 let case = case_of ~domain ~hash:Digestif.sha512 in 353 657 354 - [ 355 - case ~msg:"3a84a5314e90fd33bb7cd6ca68720c69058da1da1b359046ae8922cac8afc5e025771635fb4735491521a728441b5cb087d60776ee0ecc2174a41985a82cf46d8f8d8b274a0cc439b00971077c745f8cf701cf56bf9914cc57209b555dc87ca8c13da063270c60fc2c988e692b75a7f2a669903b93d2e14e8efb6fb9f8694a78 356 - " ~x:"07ce8862e64b7f6c7482046dbfc93907123e5214 357 - " ~y:"60f5341e48ca7a3bc5decee61211dd2727cd8e2fc7635f3aabea262366e458f5c51c311afda916cb0dcdc5d5a5729f573a532b594743199bcfa7454903e74b33ddfe65896306cec20ebd8427682fa501ee06bc4c5d1425cbe31828ba008b19c9da68136cf71840b205919e783a628a5a57cf91cf569b2854ffef7a096eda96c9 358 - " ~k:"2f170907ac69726b14f22056dcb37b4df85f7424 359 - " ~r:"a53f1f8f20b8d3d4720f14a8bab5226b079d9953 360 - " ~s:"11f53f6a4e56b51f60e20d4957ae89e162aea616 361 - 362 - " ; case ~msg:"6f39973fd225167a7673cd71ab3534d2686687c332f93fd66db5f1ca99678efd2825a84cd7a7107adf96501dd1d05e7bbc8d113e087bba77b2346b4364132125245e9aace3a146b576f654c86e07fc1914cafa209dd6d04845575dbb279cd1b23296d01ef505b5e1ce7f2194f18988f355c9b34f920ab35152e03bcf792ac529 363 - " ~x:"8d75294b56262e42a82db41a4039615396574dbf 364 - " ~y:"110e398e36c9d2726e77deb465dd23303f9e387778b549700a52b9a5468512ee377ce3d7dcbfc6b64ee353eac6a43898b26484058ba1b24b229cd69c994d976d43344c181ea6c47df0062c09a16b23ab6075c04a0899bac3e4f034a983bf90438f6ac26855d8a5fded90172e7e8c196a2ce7e1fc0dac94278aff1653c3ae09f5 365 - " ~k:"66a1322607ab98aaa57c12a5cc3f59dce8d7d0cc 366 - " ~r:"1b9ed39bcc4b46ed0007679ce9c3f6dc7c4157b9 367 - " ~s:"258d4136ad95b704a7959d04096dcd781eb54bde 368 - 369 - " ; case ~msg:"7f59744c790c0f985a9ae101d9fa00da3b95d2473d792805ec1d6d1e95222a6f30ee6ab8fc5a632057153f237ad3aa2fae8f1e51eae75906d07e576dd0021ac1711b1c8853e62d27fe6b098766b8ce3e76d347c8e49be0ab05d0d12fd777a85cffc7ad1207a9aa75643d7b415ba4b1b97dc0ee19d05a607ba063a0341f176104 370 - " ~x:"25b7fedcba71eda85fe189bf0d0c43214ab6388a 371 - " ~y:"3ead9cf211f3859d5baa5155fb62331bca3fff9ecbe182ebf8b04db0ebb19eda548c86db4cbb5eca98ce449cfd51f1c460d7848326eee22fcac7247fb889ee415c4933a909c78ce9bc50ee190116da9ae2547ae6242a340ddbb9a15ac818c4677f2919c64509d03c49d1307bb2cd78e01ce5b25a9f47d828fc7584ebce366c2f 372 - " ~k:"8fd754defb1274bb7ddea0fc13fdc76722442d86 373 - " ~r:"38f52df78b0e454d3583208a0fce03b904eec816 374 - " ~s:"5cdc57a943ab1f269ca11c63bcb1059ee76f9c2e 375 - 376 - " ; case ~msg:"16250c74ccb40443625a37c4b7e2b3615255768241f254a506fa819efbb8698ade38fc75946b3af09055578f28a181827dda311bd4038fd47f6d86cceb1bbbef2df20bf595a0ad77afd39c84877434ade3812f05ec541e0403abadc778d116fd077c95c6ec0f47241f4db813f31986b7504c1cd9ddb496ac6ed22b45e7df72cc 377 - " ~x:"3fee04cc08624f3a7f34c538d87692209dd74797 378 - " ~y:"6e8c85150c5c9ca6dcb04806671db1b672fc1087c995311d7087ad12ab18f2c14b612cea13bf79518d2b570b8b696b3e4efcd0fda522a253bbcb7dbb711d984c598fa201c21a8a9e2774bc15020920cd8c27c2875c779b08ef95093caac2c9cea37ec498c23dd24b684abcb467ec952a202cbd2df7960c1ef929cc2b611ca6c8 379 - " ~k:"934552738360670c98b9c5384b639c46cdecfa83 380 - " ~r:"00018f0fdc16d914971c8f310f1af7796c6f662a 381 - " ~s:"62b7aecc75cbc6db00dd0c24339f7bdb5ae966a5 382 - 383 - " ; case ~msg:"a2ce90b51a480c0668b55936bbeebe3679f8d406a0b694b90345749e3b9c67776cae9a62c25cc011cdb3180263ddd73aa2090ec7a749092f6c7816c26744c5393acb08c6b7b359bb3a3c7543684f8050ecc6422234ff24978ae06b91d6a24c086d71eb1761caf14176d8bacdcad53b7895bdb0e053c616b147ff73d2d86ba3bc 384 - " ~x:"2d667bebf445cd3ee45d5815e07ca5735b858ada 385 - " ~y:"0e6b419da8b4db802d938873e3b105ab3eff432d8a1376602059cf2e510f696a2a4e42025670db0011e9be31e8b1403615b9a339ce654a89a2d462ee20c080c4479648c5c00e172ecd537c934e7534af7002bd6fdafab56506680c019ced38779d954091645fedf5d0057a23ff634919fc56a96771ce21fa99ecd9aa7f7985f1 386 - " ~k:"4aeb4911d38f1f634ddf5fe6c970d943ea51b266 387 - " ~r:"5b13f1337ac72e419867c92f9387f9df62883aa5 388 - " ~s:"90ab5b68fd8253b6bb64c61759164a97834c39e1 389 - 390 - " ; case ~msg:"3b6eeaedc5fb38ce8691686c89993caf17c9e24fa565a9e8d48436b87db62fab839c42d81fb1f8b8968c826e78d333b1d99d5c36e08a9a0ec7554c2bde07fd8ec422af128246ba3beae18ef2be755db22a869202951cd95796fc2ff7ba2a6967d19e5ca2304655bfdf879b7747f80a59b1dac0461cf6e490378e56ab378584f2 391 - " ~x:"71dbbac59768e1e3093f0c60404731a2ead482c3 392 - " ~y:"4a7ff667f7ab2891a8a69ab5d15d93d1fd833906c9b629fcb9b49e84d8ecb35b397d93839d7985590326cffb55a70e4a51a2829e387290f6fafb7d226151c282470224fd717f3d526589c6eed9611c5bdf4bde63fcc9204c8007b0b143c49d1981835658bcf800a2157c5c143d76369fd6e78d0a3f800b8a3a8f0e11c9059dcd 393 - " ~k:"8f78910d1e8a9daad9523626ee7ab1d0a5b4d977 394 - " ~r:"61380ca86798fc5fb61c35675af08d5cc13c25aa 395 - " ~s:"54ddf68f476884af3e0e6536f3a80925ee63a402 396 - 397 - " ; case ~msg:"01197ae960de90a93d9736896fe136bc561f0550c6b1cc3631b31df683017c2ab8c6f41d2745f1a797e0e89dc3d5878866c3694a080366757e6fd892d26668fd2d860ea2a2b67fdaca96e32297758787ecc0a7e1d304cc719803272e72e339b3f34c347e47b91a1ed69ca8062cd350dccc9c2264732b9fdd8462d9f6fc76850c 398 - " ~x:"45963a0771456d6ae897edf7579091f5f8c76747 399 - " ~y:"373081770a9f4dae8df5dfa70503e149d759ca37408549aa34d1b49b3176a39d7c4661e421a1f5d61e3f77b3c4b39bb2e63cd24919a2910a8b155e1758f5a375da60f19d2bf4020e828f4237eb3e2a36124a6a3914469d6833695b83b9377fb285b27bd2689933c189c7fde42e1e0e20308331fd56ed0db2efbc77ea3ac7121f 400 - " ~k:"1f68d020331b81fc1aea51907e94f7d62ace9135 401 - " ~r:"41ed170c8bf6f20fd1ce18faac97565fdb4fe6f4 402 - " ~s:"7c8c6feace68c97ca43780741fae58f2f61bf765 403 - 404 - " ; case ~msg:"0d5ab27b2b7e18cfce4ccda13aa1a5a8c18baaf39b14e642b8f81b30cd5418a1dd05df22599fbbb3bae4fee1e4b2c150a23e216c133fe2d8235485e34f80685c66bc0c190af67a0a49930b476b2803e12274cd43090921bf668fdfef155072a3cdf17901427afa51318afdda937e283e2c60d85e3bfe07f3da5f992c1fca4b98 405 - " ~x:"95bc588bb848751ba57d7a9ab340cb00e79e06d8 406 - " ~y:"1ca36e3505ee70a56afd5dc40a48e97979e984dd2d896abc7a491d3461c6931668a0cef11e45bb66c611137999907ad7e1f7cfea7f7ed49aae935bfc41443293e71dd2fec29f37a9544672ab9250caa28188f390b5d4af13bb05e9692c1c6a4d6aafebddaf7eef1834fffe0f5391bce243789a2d55d29e2b90ce120429f2a075 407 - " ~k:"07a4f8000f0ecddb72302cf4d7975c7efc41c143 408 - " ~r:"66015e5fb3abe9d78523770f7ba0990031065ad7 409 - " ~s:"4b8b153d5b01ddfa91f2dec6f0faff02e6e87218 410 - 411 - " ; case ~msg:"906a933bc823a307e2ab29a4a8f7f1510d5d303504fde38169ded168913e3bf81d53a4389a3e73a3efebd5e42cf402bf9fdc5da5ef46878165ada6d2e07299035a3987ed6c2c6c8becc44ea131a9493e72aee28242cf7cfac38ee870e54eb95a6efa9fad74354b281cb63ea71652eba1ad73f841dba7778f3a03d3e00190ed68 412 - " ~x:"8295ed7e125a65ea1762aaaada34602a7bc76845 413 - " ~y:"4f3ade3ea4f7066107321e8bfb12eeaf9b3c7bdcc6147908754231156b46e0639c9db9d5447abd2d0a9223c85d63d8b1dfa69742ebf7e0419e608c4b18c3ad9f55f5d2848edbec4e7180e34bfbb1f6b6ebbb68649714b5fbfa6cfab4a01f655008a95a7eedcdc2f7171094563a3c1831e81f5ca075c6e853beeae87a67ff9022 414 - " ~k:"8148e40362a255d240a3e6af746a8880162d78ad 415 - " ~r:"99c91e0794723bcde34594dd2268418dfb353443 416 - " ~s:"42e9c49d60ad8f9b41f290ae6b772f44be62cea9 417 - 418 - " ; case ~msg:"1d6ba43a0ff677cf8cf68d6a1d3304d99490a7cae56fe35318f38ed0f5879fe254703fa77458c45e8a698469b899a215c25e869fd28741101d27dc111ffad6980f8ebd748f6977d5d60438e6edec37a49d3011f8f0f08525156ae60bc91abe661638f4b9c6c365c3af1713bf7f7225d4afad7a1b531a331133d8b8fd238598a4 419 - " ~x:"8d3c302da7b77ece9ce6e280e603bd260d2dc144 420 - " ~y:"08ad77f233334c04ca2282f6dac0b0d8a00d596e02e836a767a146ef80624b33fdba8b35204b20bee8ff2be9a82bd80131c0aa898b17eeab5af24c20551d5d636a11548fdd2e6c616b09df86b057e5702146ecc4fa2d44d85bb1427e7e3576f698b4f21645a1e00479d08982b0573dd1981bbd405c2a45d7de9242afae8f95c9 421 - " ~k:"79989e8eb43520091706039415794d2306329861 422 - " ~r:"a2b42cca55bc1ba33f8252d1a89c8d89b00b3950 423 - " ~s:"2ec5166e35e63f0fa116b3db1bd18681a4399c04 424 - 425 - " ; case ~msg:"3bd0c5b759cb710c52b81fba48b6771cab17bf1b67eafd08f4ee1777dd473064dd0bec98d3582ee1e991ab9a91a6fe558a41db9ae6b21a057932811440d64c786b22d150e3d38c71900ad5b61e0530744e765b5c2ef30bcb96e726e3079e440086ef300bae9000df3403c33a79849f8f83d6c03f77eae98052578d82d628e65c 426 - " ~x:"4d3e42ef42a60630edcc842f25a1b33c8851c742 427 - " ~y:"3a1ed976b7934bee3e80d69fbcdd35f82051ccc214bde6fa756be67017ff60ac6847cf8d1f823f890d26af8cd351716ad2d4eefd7f06c1951ea4a7db5caf250f407b78f21fff425d0cba1b5fb35a5b5dcf062a1cdf2507af74789326710e334faf3c501bd8c8347225f94f8973adb7a8b5def9896109d1efe550325dd89f31d6 428 - " ~k:"6c59f3cec7e34db174dcbd6bfe224d52226c56cd 429 - " ~r:"77d62ec2a95beba6c672d8422ee663d1d18049d0 430 - " ~s:"2a339cc8f567c12149a8917375ec6ca4b47254a1 431 - 432 - " ; case ~msg:"8dc582a2b5af65e66ebdf5b533d8e22b38b5c1977e578d3213a110e9d4837a74d4b7bf7d71875690b5b71c8e8afab89434c46a8641cced1a130e21cd0c805ee45c134c7c0df75d5cd30c41818f7ae475dd6022877c743d09d54f0c94581ae7bd4b423f02e19397be7bd4a904b88cbd2f814b1dff1e796d9f2d1c8470b796c69a 433 - " ~x:"6a6a9874f0f89f04cbeaebde3833ae179ade3f5a 434 - " ~y:"5d6dc1749f28cb8f7c014d5c5516cf5bc222c6d9337ac0089b19b90b321956cf6192f3255d0eec45840810c21fe91cf5308948852a57cd0189f15bd96af8380d19cb821b1c56afdc38a94b2c32feb18213939693b69f2bcbae7e70ab09ead3b6a8b7dad3c4f521ad0455dd4e872b3627d4fed20d5efc78f6ae467fb9267ab1d4 435 - " ~k:"27b2661922214411aec66e58cb36142ab3e5a256 436 - " ~r:"05363bcca193d726cd20e03489e1b13b7df3bc98 437 - " ~s:"31bdaccb29e4a60023929f182199c070b71ac575 438 - 439 - " ; case ~msg:"477af8c025181b557732b9568634b1324e6669b4c28a0bcd4c653d4c81ed68b2a2043a800a314ba95e50deeacc5ee9c2ba6f6f62fdba0e86aca227d727377552a3abdbab601c2601846ec27a192a3f33e7ffdbe4a4aa7beb2b3ff6c91bd5cd5c890bcb6f4c908ff5b9b555e2a0a7df8c3ef6770136bbf009755bf6c3e6307310 440 - " ~x:"17949e838d7c93e1d837be65b3c4482433a1b208 441 - " ~y:"2cceddc9e2cebbc1e99b83b03053bb14a9cfaf072b45e4746d18cb3901f6a2c3cf72da66b0b9b3e105bd4cd0e5427d7e9b657ed71884cd49f51fe8fa18a366018a3eafac3381e07a5b19f6d3862ed2916094906e75286eaf1d13c485744b270404ff9adc8e177833043bdc34c307e6fc9c55c53d8ff84a6e251038dbeb5ef774 442 - " ~k:"620f07d7e7ced030e669685ab8c39174d88c79eb 443 - " ~r:"3591c521b2a56cf46051c0cb3d444b9a22fff63f 444 - " ~s:"7ac78ee252440cf9e8510494d1fad8b518f1e128 445 - 446 - " ; case ~msg:"bb6593ff219c9f20aa47e1e157e88ed59ae29c8940a527c82e0e0f2e855fa98e94e07be1f6bce3832b7ea1e60a5c9ef583f2ec7b179227e4afdcf829d673e1377f832ae38e7cadede415964f12baf775d38ce38e945563e72861519197c2d08f28d8b6466562e059ec41741de349ed5de2c7d6cc7518a87720a248b301733a47 447 - " ~x:"301c11a34edce1f7ab040754e0b2d4fd88572187 448 - " ~y:"15d9e20c3f39cc9e3b8fb65feb64fb1568f6efdef6457d231c491ed51731d58f06e45ea5d665d04969823da4e6750a2c3d16c5ff6080ecd09aa39c006eedceb4dbc16ebd64bc5b1e44b831a6bb25afbcb3000fa6b6c2000860014011189c22542c145e407e7b59f6d3fb1e136295ec850b14ff2f4994ea37481e80199910be8e 449 - " ~k:"117e12f88d6e44fc7f4d51d5384fc31b2e3419a2 450 - " ~r:"61e727716cc96914509740a7cba6e74a9dec6406 451 - " ~s:"2e77c14f01f22180bcda5725cf0eaac9ad13a7d1 452 - 453 - " ; case ~msg:"565f19244468515e8463d07b425b4d5f81ff2efab5156ba19a63734219c226ccca5903bf9c35dbca0961db7c2e3f6944d057edfa6c2394c39a00f1c42596e7ee72ed644c6a182115bdc44b9010c86e7b0ec2e3bdf7016c5e04f455b4cb693e32490b8f494bb4103b3b5ea6808222452841b733faf735f10a95fb283dd86ce593 454 - " ~x:"07dfca41446b2f4e1af2a67bc8468db9a9c2dfe0 455 - " ~y:"664245aaebcf5c055c32109b2159a17473043087915f14e959dddc0c9b20c726f0124f1ecbaf202fe2676afdabd346a7b5bef769a25c6f733612d7378df1b2d4c518a2da5b3a4cd0252bb8180838a46389a84693be8cc24fbdc639b62cb21d8abe1272b5aa06222fe2133fc5556d24e75496a53e1934d3b5848e510b69da04a4 456 - " ~k:"4522d27cd17a6ee739873d69f107d872ed7e2db5 457 - " ~r:"5ca07bc7cd9f7a60cf79391d873b6fddf5a48cca 458 - " ~s:"9799c74a806fc196e0223fb1a613fd178cafbd99" 459 - ] 460 - 658 + [ 659 + case 660 + ~msg: 661 + "3a84a5314e90fd33bb7cd6ca68720c69058da1da1b359046ae8922cac8afc5e025771635fb4735491521a728441b5cb087d60776ee0ecc2174a41985a82cf46d8f8d8b274a0cc439b00971077c745f8cf701cf56bf9914cc57209b555dc87ca8c13da063270c60fc2c988e692b75a7f2a669903b93d2e14e8efb6fb9f8694a78\n" 662 + ~x:"07ce8862e64b7f6c7482046dbfc93907123e5214\n" 663 + ~y: 664 + "60f5341e48ca7a3bc5decee61211dd2727cd8e2fc7635f3aabea262366e458f5c51c311afda916cb0dcdc5d5a5729f573a532b594743199bcfa7454903e74b33ddfe65896306cec20ebd8427682fa501ee06bc4c5d1425cbe31828ba008b19c9da68136cf71840b205919e783a628a5a57cf91cf569b2854ffef7a096eda96c9\n" 665 + ~k:"2f170907ac69726b14f22056dcb37b4df85f7424\n" 666 + ~r:"a53f1f8f20b8d3d4720f14a8bab5226b079d9953\n" 667 + ~s:"11f53f6a4e56b51f60e20d4957ae89e162aea616\n\n"; 668 + case 669 + ~msg: 670 + "6f39973fd225167a7673cd71ab3534d2686687c332f93fd66db5f1ca99678efd2825a84cd7a7107adf96501dd1d05e7bbc8d113e087bba77b2346b4364132125245e9aace3a146b576f654c86e07fc1914cafa209dd6d04845575dbb279cd1b23296d01ef505b5e1ce7f2194f18988f355c9b34f920ab35152e03bcf792ac529\n" 671 + ~x:"8d75294b56262e42a82db41a4039615396574dbf\n" 672 + ~y: 673 + "110e398e36c9d2726e77deb465dd23303f9e387778b549700a52b9a5468512ee377ce3d7dcbfc6b64ee353eac6a43898b26484058ba1b24b229cd69c994d976d43344c181ea6c47df0062c09a16b23ab6075c04a0899bac3e4f034a983bf90438f6ac26855d8a5fded90172e7e8c196a2ce7e1fc0dac94278aff1653c3ae09f5\n" 674 + ~k:"66a1322607ab98aaa57c12a5cc3f59dce8d7d0cc\n" 675 + ~r:"1b9ed39bcc4b46ed0007679ce9c3f6dc7c4157b9\n" 676 + ~s:"258d4136ad95b704a7959d04096dcd781eb54bde\n\n"; 677 + case 678 + ~msg: 679 + "7f59744c790c0f985a9ae101d9fa00da3b95d2473d792805ec1d6d1e95222a6f30ee6ab8fc5a632057153f237ad3aa2fae8f1e51eae75906d07e576dd0021ac1711b1c8853e62d27fe6b098766b8ce3e76d347c8e49be0ab05d0d12fd777a85cffc7ad1207a9aa75643d7b415ba4b1b97dc0ee19d05a607ba063a0341f176104\n" 680 + ~x:"25b7fedcba71eda85fe189bf0d0c43214ab6388a\n" 681 + ~y: 682 + "3ead9cf211f3859d5baa5155fb62331bca3fff9ecbe182ebf8b04db0ebb19eda548c86db4cbb5eca98ce449cfd51f1c460d7848326eee22fcac7247fb889ee415c4933a909c78ce9bc50ee190116da9ae2547ae6242a340ddbb9a15ac818c4677f2919c64509d03c49d1307bb2cd78e01ce5b25a9f47d828fc7584ebce366c2f\n" 683 + ~k:"8fd754defb1274bb7ddea0fc13fdc76722442d86\n" 684 + ~r:"38f52df78b0e454d3583208a0fce03b904eec816\n" 685 + ~s:"5cdc57a943ab1f269ca11c63bcb1059ee76f9c2e\n\n"; 686 + case 687 + ~msg: 688 + "16250c74ccb40443625a37c4b7e2b3615255768241f254a506fa819efbb8698ade38fc75946b3af09055578f28a181827dda311bd4038fd47f6d86cceb1bbbef2df20bf595a0ad77afd39c84877434ade3812f05ec541e0403abadc778d116fd077c95c6ec0f47241f4db813f31986b7504c1cd9ddb496ac6ed22b45e7df72cc\n" 689 + ~x:"3fee04cc08624f3a7f34c538d87692209dd74797\n" 690 + ~y: 691 + "6e8c85150c5c9ca6dcb04806671db1b672fc1087c995311d7087ad12ab18f2c14b612cea13bf79518d2b570b8b696b3e4efcd0fda522a253bbcb7dbb711d984c598fa201c21a8a9e2774bc15020920cd8c27c2875c779b08ef95093caac2c9cea37ec498c23dd24b684abcb467ec952a202cbd2df7960c1ef929cc2b611ca6c8\n" 692 + ~k:"934552738360670c98b9c5384b639c46cdecfa83\n" 693 + ~r:"00018f0fdc16d914971c8f310f1af7796c6f662a\n" 694 + ~s:"62b7aecc75cbc6db00dd0c24339f7bdb5ae966a5\n\n"; 695 + case 696 + ~msg: 697 + "a2ce90b51a480c0668b55936bbeebe3679f8d406a0b694b90345749e3b9c67776cae9a62c25cc011cdb3180263ddd73aa2090ec7a749092f6c7816c26744c5393acb08c6b7b359bb3a3c7543684f8050ecc6422234ff24978ae06b91d6a24c086d71eb1761caf14176d8bacdcad53b7895bdb0e053c616b147ff73d2d86ba3bc\n" 698 + ~x:"2d667bebf445cd3ee45d5815e07ca5735b858ada\n" 699 + ~y: 700 + "0e6b419da8b4db802d938873e3b105ab3eff432d8a1376602059cf2e510f696a2a4e42025670db0011e9be31e8b1403615b9a339ce654a89a2d462ee20c080c4479648c5c00e172ecd537c934e7534af7002bd6fdafab56506680c019ced38779d954091645fedf5d0057a23ff634919fc56a96771ce21fa99ecd9aa7f7985f1\n" 701 + ~k:"4aeb4911d38f1f634ddf5fe6c970d943ea51b266\n" 702 + ~r:"5b13f1337ac72e419867c92f9387f9df62883aa5\n" 703 + ~s:"90ab5b68fd8253b6bb64c61759164a97834c39e1\n\n"; 704 + case 705 + ~msg: 706 + "3b6eeaedc5fb38ce8691686c89993caf17c9e24fa565a9e8d48436b87db62fab839c42d81fb1f8b8968c826e78d333b1d99d5c36e08a9a0ec7554c2bde07fd8ec422af128246ba3beae18ef2be755db22a869202951cd95796fc2ff7ba2a6967d19e5ca2304655bfdf879b7747f80a59b1dac0461cf6e490378e56ab378584f2\n" 707 + ~x:"71dbbac59768e1e3093f0c60404731a2ead482c3\n" 708 + ~y: 709 + "4a7ff667f7ab2891a8a69ab5d15d93d1fd833906c9b629fcb9b49e84d8ecb35b397d93839d7985590326cffb55a70e4a51a2829e387290f6fafb7d226151c282470224fd717f3d526589c6eed9611c5bdf4bde63fcc9204c8007b0b143c49d1981835658bcf800a2157c5c143d76369fd6e78d0a3f800b8a3a8f0e11c9059dcd\n" 710 + ~k:"8f78910d1e8a9daad9523626ee7ab1d0a5b4d977\n" 711 + ~r:"61380ca86798fc5fb61c35675af08d5cc13c25aa\n" 712 + ~s:"54ddf68f476884af3e0e6536f3a80925ee63a402\n\n"; 713 + case 714 + ~msg: 715 + "01197ae960de90a93d9736896fe136bc561f0550c6b1cc3631b31df683017c2ab8c6f41d2745f1a797e0e89dc3d5878866c3694a080366757e6fd892d26668fd2d860ea2a2b67fdaca96e32297758787ecc0a7e1d304cc719803272e72e339b3f34c347e47b91a1ed69ca8062cd350dccc9c2264732b9fdd8462d9f6fc76850c\n" 716 + ~x:"45963a0771456d6ae897edf7579091f5f8c76747\n" 717 + ~y: 718 + "373081770a9f4dae8df5dfa70503e149d759ca37408549aa34d1b49b3176a39d7c4661e421a1f5d61e3f77b3c4b39bb2e63cd24919a2910a8b155e1758f5a375da60f19d2bf4020e828f4237eb3e2a36124a6a3914469d6833695b83b9377fb285b27bd2689933c189c7fde42e1e0e20308331fd56ed0db2efbc77ea3ac7121f\n" 719 + ~k:"1f68d020331b81fc1aea51907e94f7d62ace9135\n" 720 + ~r:"41ed170c8bf6f20fd1ce18faac97565fdb4fe6f4\n" 721 + ~s:"7c8c6feace68c97ca43780741fae58f2f61bf765\n\n"; 722 + case 723 + ~msg: 724 + "0d5ab27b2b7e18cfce4ccda13aa1a5a8c18baaf39b14e642b8f81b30cd5418a1dd05df22599fbbb3bae4fee1e4b2c150a23e216c133fe2d8235485e34f80685c66bc0c190af67a0a49930b476b2803e12274cd43090921bf668fdfef155072a3cdf17901427afa51318afdda937e283e2c60d85e3bfe07f3da5f992c1fca4b98\n" 725 + ~x:"95bc588bb848751ba57d7a9ab340cb00e79e06d8\n" 726 + ~y: 727 + "1ca36e3505ee70a56afd5dc40a48e97979e984dd2d896abc7a491d3461c6931668a0cef11e45bb66c611137999907ad7e1f7cfea7f7ed49aae935bfc41443293e71dd2fec29f37a9544672ab9250caa28188f390b5d4af13bb05e9692c1c6a4d6aafebddaf7eef1834fffe0f5391bce243789a2d55d29e2b90ce120429f2a075\n" 728 + ~k:"07a4f8000f0ecddb72302cf4d7975c7efc41c143\n" 729 + ~r:"66015e5fb3abe9d78523770f7ba0990031065ad7\n" 730 + ~s:"4b8b153d5b01ddfa91f2dec6f0faff02e6e87218\n\n"; 731 + case 732 + ~msg: 733 + "906a933bc823a307e2ab29a4a8f7f1510d5d303504fde38169ded168913e3bf81d53a4389a3e73a3efebd5e42cf402bf9fdc5da5ef46878165ada6d2e07299035a3987ed6c2c6c8becc44ea131a9493e72aee28242cf7cfac38ee870e54eb95a6efa9fad74354b281cb63ea71652eba1ad73f841dba7778f3a03d3e00190ed68\n" 734 + ~x:"8295ed7e125a65ea1762aaaada34602a7bc76845\n" 735 + ~y: 736 + "4f3ade3ea4f7066107321e8bfb12eeaf9b3c7bdcc6147908754231156b46e0639c9db9d5447abd2d0a9223c85d63d8b1dfa69742ebf7e0419e608c4b18c3ad9f55f5d2848edbec4e7180e34bfbb1f6b6ebbb68649714b5fbfa6cfab4a01f655008a95a7eedcdc2f7171094563a3c1831e81f5ca075c6e853beeae87a67ff9022\n" 737 + ~k:"8148e40362a255d240a3e6af746a8880162d78ad\n" 738 + ~r:"99c91e0794723bcde34594dd2268418dfb353443\n" 739 + ~s:"42e9c49d60ad8f9b41f290ae6b772f44be62cea9\n\n"; 740 + case 741 + ~msg: 742 + "1d6ba43a0ff677cf8cf68d6a1d3304d99490a7cae56fe35318f38ed0f5879fe254703fa77458c45e8a698469b899a215c25e869fd28741101d27dc111ffad6980f8ebd748f6977d5d60438e6edec37a49d3011f8f0f08525156ae60bc91abe661638f4b9c6c365c3af1713bf7f7225d4afad7a1b531a331133d8b8fd238598a4\n" 743 + ~x:"8d3c302da7b77ece9ce6e280e603bd260d2dc144\n" 744 + ~y: 745 + "08ad77f233334c04ca2282f6dac0b0d8a00d596e02e836a767a146ef80624b33fdba8b35204b20bee8ff2be9a82bd80131c0aa898b17eeab5af24c20551d5d636a11548fdd2e6c616b09df86b057e5702146ecc4fa2d44d85bb1427e7e3576f698b4f21645a1e00479d08982b0573dd1981bbd405c2a45d7de9242afae8f95c9\n" 746 + ~k:"79989e8eb43520091706039415794d2306329861\n" 747 + ~r:"a2b42cca55bc1ba33f8252d1a89c8d89b00b3950\n" 748 + ~s:"2ec5166e35e63f0fa116b3db1bd18681a4399c04\n\n"; 749 + case 750 + ~msg: 751 + "3bd0c5b759cb710c52b81fba48b6771cab17bf1b67eafd08f4ee1777dd473064dd0bec98d3582ee1e991ab9a91a6fe558a41db9ae6b21a057932811440d64c786b22d150e3d38c71900ad5b61e0530744e765b5c2ef30bcb96e726e3079e440086ef300bae9000df3403c33a79849f8f83d6c03f77eae98052578d82d628e65c\n" 752 + ~x:"4d3e42ef42a60630edcc842f25a1b33c8851c742\n" 753 + ~y: 754 + "3a1ed976b7934bee3e80d69fbcdd35f82051ccc214bde6fa756be67017ff60ac6847cf8d1f823f890d26af8cd351716ad2d4eefd7f06c1951ea4a7db5caf250f407b78f21fff425d0cba1b5fb35a5b5dcf062a1cdf2507af74789326710e334faf3c501bd8c8347225f94f8973adb7a8b5def9896109d1efe550325dd89f31d6\n" 755 + ~k:"6c59f3cec7e34db174dcbd6bfe224d52226c56cd\n" 756 + ~r:"77d62ec2a95beba6c672d8422ee663d1d18049d0\n" 757 + ~s:"2a339cc8f567c12149a8917375ec6ca4b47254a1\n\n"; 758 + case 759 + ~msg: 760 + "8dc582a2b5af65e66ebdf5b533d8e22b38b5c1977e578d3213a110e9d4837a74d4b7bf7d71875690b5b71c8e8afab89434c46a8641cced1a130e21cd0c805ee45c134c7c0df75d5cd30c41818f7ae475dd6022877c743d09d54f0c94581ae7bd4b423f02e19397be7bd4a904b88cbd2f814b1dff1e796d9f2d1c8470b796c69a\n" 761 + ~x:"6a6a9874f0f89f04cbeaebde3833ae179ade3f5a\n" 762 + ~y: 763 + "5d6dc1749f28cb8f7c014d5c5516cf5bc222c6d9337ac0089b19b90b321956cf6192f3255d0eec45840810c21fe91cf5308948852a57cd0189f15bd96af8380d19cb821b1c56afdc38a94b2c32feb18213939693b69f2bcbae7e70ab09ead3b6a8b7dad3c4f521ad0455dd4e872b3627d4fed20d5efc78f6ae467fb9267ab1d4\n" 764 + ~k:"27b2661922214411aec66e58cb36142ab3e5a256\n" 765 + ~r:"05363bcca193d726cd20e03489e1b13b7df3bc98\n" 766 + ~s:"31bdaccb29e4a60023929f182199c070b71ac575\n\n"; 767 + case 768 + ~msg: 769 + "477af8c025181b557732b9568634b1324e6669b4c28a0bcd4c653d4c81ed68b2a2043a800a314ba95e50deeacc5ee9c2ba6f6f62fdba0e86aca227d727377552a3abdbab601c2601846ec27a192a3f33e7ffdbe4a4aa7beb2b3ff6c91bd5cd5c890bcb6f4c908ff5b9b555e2a0a7df8c3ef6770136bbf009755bf6c3e6307310\n" 770 + ~x:"17949e838d7c93e1d837be65b3c4482433a1b208\n" 771 + ~y: 772 + "2cceddc9e2cebbc1e99b83b03053bb14a9cfaf072b45e4746d18cb3901f6a2c3cf72da66b0b9b3e105bd4cd0e5427d7e9b657ed71884cd49f51fe8fa18a366018a3eafac3381e07a5b19f6d3862ed2916094906e75286eaf1d13c485744b270404ff9adc8e177833043bdc34c307e6fc9c55c53d8ff84a6e251038dbeb5ef774\n" 773 + ~k:"620f07d7e7ced030e669685ab8c39174d88c79eb\n" 774 + ~r:"3591c521b2a56cf46051c0cb3d444b9a22fff63f\n" 775 + ~s:"7ac78ee252440cf9e8510494d1fad8b518f1e128\n\n"; 776 + case 777 + ~msg: 778 + "bb6593ff219c9f20aa47e1e157e88ed59ae29c8940a527c82e0e0f2e855fa98e94e07be1f6bce3832b7ea1e60a5c9ef583f2ec7b179227e4afdcf829d673e1377f832ae38e7cadede415964f12baf775d38ce38e945563e72861519197c2d08f28d8b6466562e059ec41741de349ed5de2c7d6cc7518a87720a248b301733a47\n" 779 + ~x:"301c11a34edce1f7ab040754e0b2d4fd88572187\n" 780 + ~y: 781 + "15d9e20c3f39cc9e3b8fb65feb64fb1568f6efdef6457d231c491ed51731d58f06e45ea5d665d04969823da4e6750a2c3d16c5ff6080ecd09aa39c006eedceb4dbc16ebd64bc5b1e44b831a6bb25afbcb3000fa6b6c2000860014011189c22542c145e407e7b59f6d3fb1e136295ec850b14ff2f4994ea37481e80199910be8e\n" 782 + ~k:"117e12f88d6e44fc7f4d51d5384fc31b2e3419a2\n" 783 + ~r:"61e727716cc96914509740a7cba6e74a9dec6406\n" 784 + ~s:"2e77c14f01f22180bcda5725cf0eaac9ad13a7d1\n\n"; 785 + case 786 + ~msg: 787 + "565f19244468515e8463d07b425b4d5f81ff2efab5156ba19a63734219c226ccca5903bf9c35dbca0961db7c2e3f6944d057edfa6c2394c39a00f1c42596e7ee72ed644c6a182115bdc44b9010c86e7b0ec2e3bdf7016c5e04f455b4cb693e32490b8f494bb4103b3b5ea6808222452841b733faf735f10a95fb283dd86ce593\n" 788 + ~x:"07dfca41446b2f4e1af2a67bc8468db9a9c2dfe0\n" 789 + ~y: 790 + "664245aaebcf5c055c32109b2159a17473043087915f14e959dddc0c9b20c726f0124f1ecbaf202fe2676afdabd346a7b5bef769a25c6f733612d7378df1b2d4c518a2da5b3a4cd0252bb8180838a46389a84693be8cc24fbdc639b62cb21d8abe1272b5aa06222fe2133fc5556d24e75496a53e1934d3b5848e510b69da04a4\n" 791 + ~k:"4522d27cd17a6ee739873d69f107d872ed7e2db5\n" 792 + ~r:"5ca07bc7cd9f7a60cf79391d873b6fddf5a48cca\n" 793 + ~s:"9799c74a806fc196e0223fb1a613fd178cafbd99"; 794 + ] 461 795 462 796 let sha1_n224_cases = 463 797 (* [mod = L=2048, N=224, SHA-1] *) 464 - let domain = params 465 - ~p:"f2d39ed3062b13c916273600a0f2a029e86d7a4b9217b4f1815bf2b24d9710a57ab33f997294b014585b8d0198dfdccbcd75314da5ff85aa344b45adaeaa979b51a312a7bfa94472fb633f1a6f156bb4458867dfd38403f06b851f00fe2d3484077bded71ab7513d04a140220575fb693395480e4c8402b7a46cec2d37a778c305accd1f13e9f62e865315f4b22cc467c8986ec8e4961ddf810566b0c4ee369ac6aa15e43f4744005826f5bde8071a19e30b6909aac4b3d174237270dad02799d09b8a2cc5f22e66894b5422228b2c234f11f5a771c5b89cf465a2acecbbeeaa1725fe8f9b59422be8991052cb556ddf2c8ce8fa9206dbf39feadc194e00f8e5 466 - " ~q:"8000000000000000c118f49835e4ef733c4d15800fcf059e884d31b1 467 - " ~g:"e3a93c09da6f560e4d483a382a4c546f2335c36a4c35ac1463c08a3e6dd415df56fdc537f25fd5372be63e4f5300780b782f1acd01c8b4eb33414615fd0ea82573acba7ef83f5a943854151afc2d7dfe121fb8cd03335b065b549c5dcc606be9052483bc284e12ac3c8dba09b426e08402030e70bc1cc2bf8957c4ba0630f3f32ad689389ac47443176063f247d9e2296b3ea5b5bc2335828ea1a080ed35918dee212fd031279d1b894f01afec523833669eac031a420e540ba1320a59c424a3e5849a460a56bcb001647885b1433c4f992971746bfe2977ce7259c550b551a6c35761e4a41af764e8d92132fcc0a59d1684eab90d863f29f41cf7578faa908c" 798 + let domain = 799 + params 800 + ~p: 801 + "f2d39ed3062b13c916273600a0f2a029e86d7a4b9217b4f1815bf2b24d9710a57ab33f997294b014585b8d0198dfdccbcd75314da5ff85aa344b45adaeaa979b51a312a7bfa94472fb633f1a6f156bb4458867dfd38403f06b851f00fe2d3484077bded71ab7513d04a140220575fb693395480e4c8402b7a46cec2d37a778c305accd1f13e9f62e865315f4b22cc467c8986ec8e4961ddf810566b0c4ee369ac6aa15e43f4744005826f5bde8071a19e30b6909aac4b3d174237270dad02799d09b8a2cc5f22e66894b5422228b2c234f11f5a771c5b89cf465a2acecbbeeaa1725fe8f9b59422be8991052cb556ddf2c8ce8fa9206dbf39feadc194e00f8e5\n" 802 + ~q:"8000000000000000c118f49835e4ef733c4d15800fcf059e884d31b1\n" 803 + ~g: 804 + "e3a93c09da6f560e4d483a382a4c546f2335c36a4c35ac1463c08a3e6dd415df56fdc537f25fd5372be63e4f5300780b782f1acd01c8b4eb33414615fd0ea82573acba7ef83f5a943854151afc2d7dfe121fb8cd03335b065b549c5dcc606be9052483bc284e12ac3c8dba09b426e08402030e70bc1cc2bf8957c4ba0630f3f32ad689389ac47443176063f247d9e2296b3ea5b5bc2335828ea1a080ed35918dee212fd031279d1b894f01afec523833669eac031a420e540ba1320a59c424a3e5849a460a56bcb001647885b1433c4f992971746bfe2977ce7259c550b551a6c35761e4a41af764e8d92132fcc0a59d1684eab90d863f29f41cf7578faa908c" 468 805 in 469 806 let case = case_of ~domain ~hash:Digestif.sha1 in 470 807 471 - [ 472 - case ~msg:"edc6fd9b6c6e8a59f283016f7f29ee16deeaa609b5737927162aef34fed985d0bcb550275637ba67831a2d4efccb35296dfe730f4a0b4f4728d1d7d1bb8f4a36238a5c94311fa1134a93a6b4de39c085e9f60ae4e237c0416d58042bb36baa38cba8c896295b745d5376fd8ce42eb6ee5a1b38f87716b265b76e58cfb24a9170 473 - " ~x:"6132e551cdac88409183bd37ee1452cd247d4834b08814b275be3ff5 474 - " ~y:"289ff18c32a56bb0b8839370647683a38a5a7e291410b93207212adc8088d30f93e9e4abc523f3d46936e7d5c90d88742b36afd37563408f15c8c1a4f7ac24bf05f01008ffee70c8825d57c3a9308bad8a095af2b53b2dda3cbed846d95e301eb9b84766415d11f6c33209a0d28571096ab04a79aa0dc465997529686b68e887cd8a205c2dc8195aef0422eba9979f549ac85548e419413643b7244361153ada1480d238cd00dc16527938955548dd5d027ded1029eeeb8ed6c61b4cd59341d8b15466e9da890a989996f4d7691e6072de136af28b5874bf08bd1f8a60cfb1c00888132909f515e04bce81b02951aa41baac68ffdb8c5dc77a1d32d8f2c10dd7 475 - " ~k:"7197392d32d0af6a7183cc3398556f8f687d86a8ff742be6ad38562f 476 - " ~r:"45df2f423e94bf155dd4e1d9e63f315ea606dd38527d4cf6328738c8 477 - " ~s:"59b3e8efa5bc0ccbf4a3cbb6515c4b9bf784cfacdcc101dc9f81d31f 478 - 479 - " ; case ~msg:"3bd2ab08217878e6774ec7797deb75d5c94c40e24ddf1fac8dde3a29c86b26f57157d329aac31a6622e1d6dac97e22695d7d1f8e20aa26b06795c2f878ba5d2b9cc4b16d5fa60a5fa5c24c09031de2f970a9b57ea24af17192ece21a4d120fdb52e62b8238f778ff8552fa453c0a8891243fc8757188e9c4e0e749f7e9cdf1c1 480 - " ~x:"32d53ad2620c156e4617a8680c543839c9be93103e80cc0fefa44ce5 481 - " ~y:"b9b0e1cd37bafbedeed173fd709983f53c2c427f9f61c895fac9eb549bd6201d05efd551aecb98b2df80142dea7a35491d474a3adc83f0da8dc4eacd7f6d7201c6fc0ab798abe89dcd7d0310d5f00fa10d211f18ea853579e2fe31ee55371d1c9fc4cfb050786586659bdc0f1aac4c109b9e4f9416d22c42b39a471311e28a8ed62f1f41bcfe06e074bb2f1acd29597953c3b69d3a78831fb2f83665d04a1395775ea3a2a6ea142ec00507badd4de0d9c102eac7bb894f7453e6a8e0dd3f14978377d1ddb1fdf1c55835b9924f42ad45c847c79b3f83fbf924f80b78f50329731016763e01ba8ef69e81523e181584f45c21e3c8edfed4e2ec56fb7b02aa4ee9 482 - " ~k:"2e8e4625de74e31bea9e480a5de92890095b6ce36897a2337ff97d53 483 - " ~r:"6d19fe3c415d6b07d6a1039a1fe34b106daa2eea4cbca971cb669eac 484 - " ~s:"14d7decc2cc05a1700fa256e4d2994bc4bd957bed0baf9a18bda7090 485 - 486 - " ; case ~msg:"c67fa77cd7351d100c7624e25418481f8fa499d75f5949a5cae60f96a0f7bfcdda7dba373f9f7512a5f1460a95213077cebd912e2662c43ac6bbe38c4479b04151a5e2d2880902d031aa0dff3f41126dd09fba5c0507634ed16c3938fbd3a96473a8b1ebdc37d32c767fd5932efa235555f3825a1595369238675453604d278e 487 - " ~x:"062bd01487e413074126d9d47258b5c7c77790a9db0af952ce799eb0 488 - " ~y:"31939ccdd393f747541a5c69f8e509761dd67eddb42e0bdfc412d4cc30d368d878d26d856c5290ec746b59c5e5af65ef3fd62c9a2dccfc1558dfbfb62cfecd7838e6d59495b20db5ad9d78e82f046f9f1598113aae0a79601d6b94a32e05f6ecfdf2b9c4cfa720debfc212221b14b0dd6f7078205a4f218cd4b8f10bea8fa481eca5254f365d01f3c86520bf254323d5634b96920a13b8f29d734e07fde8064eb0c9f8ebb6ae0b40b4aa7d26bb8d80868231d4558a278045cb5f2951cbfe0dc97bbdcee7af8c9b1e3b63cb49dc29f300775cdbe4d2d27894e27e0e7c9eada13a359f0b92b449e9d069b95bdc2aa7c85e56811c07207a150e598735996a6e5349 489 - " ~k:"7439c7aa4446ed540ba50b9c817792b08fc0278fa0af2daded03756b 490 - " ~r:"7924b76ee76ad7ff2ab327dabbbd31336750fc7663df4b5b94eeb62d 491 - " ~s:"5914cf965490b0bf8192fc6e169754bdfd31c48d716361dd15f45bf7 492 - 493 - " ; case ~msg:"fde7434c41666022d6d7dabc7a67315b1ff49a2a85a6168f2b6063e3036a4f35e66d2872af3d97e5beba239698d88e13bd036ef08cf0e83a41664c3d0d21863c24129a6a9b27b8e96c8029ec673e07af7246ab77a56c21ca208df4b1818deda906b553b2b23a37b5a05e29825ebeb47f53986c2bf26d731a5b731fffc353258c 494 - " ~x:"6e6bae97e3b37a402eca050d666b6483cf7d700419c5ab1eed1bed05 495 - " ~y:"59a14e36c9ededdce8000f04c6f7401ad987f1c7a5a070b80e0aaed7751d1d50d99a580cf205dbcc3797a0a0406b04776d80f2f2df418cee249b98672de7e61cda85cfbe903690e54642dc2a12a90ecf88c59256a4d77c4c0cb54e13fa3647b11431e1734f3ceeea04fbf3459665e999fc0f7a754683e48cefeb4a95fe473911ffe0de0f738960753dac33666c53ed2893bc63dd4162d7a6328739a252cdaea7a948c97d024153b55d14fd5304e3575048418808a952675fafb95fad84b1156b24e98e048aa777a745324ec13ba378e83b2384bc2e96c6095aa786bd28fc3be6bfa4db0c3c44fed4c351bd88a19e179a6a7bc12fc014f17de46fd12ef1287f72 496 - " ~k:"08544a6237ac967e5d11f2eccc6618399818b891df7a04d08cbc5e74 497 - " ~r:"49ea82713aaad799e263809e161b0655f1e74323a06041836f676980 498 - " ~s:"76b3f6c1647f8d17718ffb92d6e1424606ba9724e5290daa4ee95efb 499 - 500 - " ; case ~msg:"6676a3a131cef7e5647ea7590da3c704a0f5dc3f37f26913a70d430609cc2497c45e68b7bd6f5893dba26287ff0d240bab8a0761936aa709a2162ebf1c20a6136a748352dc39ba4403cbe4b0a5a54a729286dd193eac1a2e6bdc150fb06369be4443a60e75e5330083ff009eabb05232c52368a26fd237c7c3185c1c7e7d5955 501 - " ~x:"18faf583215bc4fa71791f6f34e682ab3529aa9a1a71c1fc7bd456a8 502 - " ~y:"ddcdf4c616fd6e4016099fb34ebc4ec507290762c5ee6876f10c6a2dedec97ba86a6063aa8ff069f3f3db40c9464afb1ba7ed691773afd6083586b14e35694a9ddc376ddc39dac57132a05bf88a0a6085c72a80a21c13e590c68c4e98eedb67f1e16c8cc7e9e25ff37c87ee3be9adf1ad0b838651b0fddf8d026969d4a16bbb828fcaf00efa306fcedd5ae19ca1a1abf44a2bdf6f994123ce941fd3523bc1335f51fa8dc5d525358bddf0c55fe2ce07ce974408d9090488837976f16845eb7a82d04c43a704be2dee1be2c8683b2d9e5c44f1833f5c46c65b6e62c2a720421bb35843fead7b9e0b3fc04c646be39e890e370b982bde91f2fc18442b650ae602f 503 - " ~k:"11b25b09408bb5dd784ad70264e585c978dc02cc1df8bb95a28aedfe 504 - " ~r:"1658a7ef2f444b014a1885b1eda8dad3605b96c3948e544e4c8825eb 505 - " ~s:"602150f67b19a5e3e39fc53abea02dd8f3b30d25c0b4ea0bcddcbdb0 506 - 507 - " ; case ~msg:"071f06a11588584da5576013029b5a14712581a48408bbfdbe34e17568c0a0e4d12c1e9c3fb227101440dd8dcdc415e3b49f68a26a0ec7612a10bbc64ddb8f7ec9e9750d1efc9c0574700875fcf52d00d37b9dd744ca841ecf7566977c1b5799dc4105d0b7a92551c5b33a50133fa300a5908b18f4c01936347c6049447abf29 508 - " ~x:"58882f1a41e08bf6c8dad091a299af0fbbd14515c1550906ff77f6ae 509 - " ~y:"b1f4dfc9c83455f279a3e7522734d6b120ab8ed36ccba7854e26504c707983d2a9c075045723f441abfc7b36fbb5d4bf0447678f5b709ca5129b74888a0723e905769836b9dac1303f1b9ace26554342b6e6d032ac4b477e011a4ddd3e2978fc0c449c64a66efe7d4e22e5a5fa2b01bb17fcdbec7185dd4115a19d972fb01a06b33bb18b9349ff95fb10dbbf2dcf899b1817d30ad48a99a614d57770ba764a11a84a8db3af3041ec362614f807196ea3b90d05b014054ff4e18524c795e6722c0fa1f6d1205d532d94347633eb132e6cbb596d8b341e65f2b2f955872ebd4d3006c45ac33da11167fa46869c7ee70e9cf147b23368b3aacd9c1880b09ac86a8d 510 - " ~k:"5ff04e754fe3246f35b3400b87a450192a7bfd9b3c03f3ece93449f4 511 - " ~r:"07bd3f6718e39839304ef54ac48bda8d9ac8ee051a49bb9131dcc918 512 - " ~s:"6496b2469bfb5845485004702b0c79941bc3c3007007ba169d8307ce 513 - 514 - " ; case ~msg:"71279b848c00208fb4e4d87979cf973b321b20d098dea912a3b4b5789cdd3b7ccd8f3993a9c92c34b70e9b0bd57520db56f2ded3a612a6169d2a1cc6350905ed0202a25c113b7bf8faec4edd2ea3b8f447ca75d15a712b4b4394c22de0c2554b9aa07ec8466727e7ef6f1f04ac4568d7726d9d77f50a2fd551ac29e42f8dda23 515 - " ~x:"292b1666d0b1fb361da268de725b11310000705964705ee975d4ebae 516 - " ~y:"7c8d63b9d55f59290b02a0fcea6d98c6c545e2c0d4b109a069694d80cb034dbdbd9edb6b4d9b152849cabd655fc77071644bbf4a0c7ea4edfe864a43c44fded163dd899c21cc2f9c33cbf56e8caf84394b24f8c14e84f22c3b0f747129d9aef41b6f1b1fa8ff5a8f680b496595dbc7b7b63a7790e3628747011b3277b06e80de0b67942f602eada60b518f282cde69cd717a5f6a19c8e169449e0d32a9d8ce8f09a5ada23c12a02dccfcdc0290a8bd46e8b7eb397494f32a0ecb49fa5a8edd41845eb417fbb8cdb89a9f18b9ad1b41dd4122ab349bb3c44951e4f9604360fcb1b795311545a61cfd67c287a7c9d4d3530214988e7616979e2ce907d5c7f3e9ad 517 - " ~k:"6b1b752bb180d8787c71505be758c0ce41fef428ac10591502c9a04b 518 - " ~r:"4cf5c26c4c2cd48c05508e52d743ef48685f6324141adef23d79a396 519 - " ~s:"59f64755a04c90a14b187ae142ec483c4600b6fbbe19f04a49e9ff88 520 - 521 - " ; case ~msg:"3ea03e9b005ec1954fee0c73326d8aca1a4f63648eb4cc59265528ee8e969ecefecf2797a0144c8336500e26a1c7cb1a642b1ec65201416e5deb355201de2bda695d1beba8dee62772f4d5914a245be9ffecf39408ae7bf1bff7c2451029c4ba0c522516e89955ad3bd699cce94c744081a9f2d60f5c5127ec722fa57316cede 522 - " ~x:"087e432b1c29c00508d768fda7c4b279fc088c48439f09980bfa159c 523 - " ~y:"1239c347be4ce6f1daa721fbbb141ee6e2f7c73098effe8e71beb9f1ab72d1b5bd3e78df770f7fbd4b3a9505702dacf102eeb8a16f11b4f809ca002ae3774ac0407e2572ae3ee1716458e5f45c493f4b921144e858d87d63773d023745512b0cc02b31ebfe5c24ad37efe539cd393cfc2b951fe1b6ffad2a2824c0f54bd776aa0afcf9c1ef427afc6cf4c4b17f66355d68574132e1d88ade3722513e395fc62d65e9485157c82064c90803a1a91f9e6b10af2f80699d917daa6b81415e508193152b4ccded593dde35f645e54b7cba445775eb16c5e19073f0a9eb5369bf2513b92158165b94dea511e938fb6a8798e040a05da94fdb5a4d44bee943b95b39d9 524 - " ~k:"0a8a45ce2412cb84e4e0174d7ecd2eb5b37ad0a53b474fa9bcf56d9a 525 - " ~r:"5ca2e971f21b70127a70c655eb87e20b2517976228a2c4e648d549b2 526 - " ~s:"44036b34667136a5140dd1948ddc2fb2bf679efee21f29b7ad87af7c 527 - 528 - " ; case ~msg:"a3f7033958c5b779072b0548baedf4f88d14f11a6dd6eec0181b399943d7246a45d50c4f7b5295dae4cd3ba7c4c181fa201581ad5c4b38793bcf454f176868e9cbe0997aa41987b1aa3d5ddc046be7b022fb5130594c8a9df03cfaa7acef817e3ba5e192c69a120299492baa52a9be83b8e871abe318b4a1f588f9edcddafc17 529 - " ~x:"5831abf9843eee928944e3dbb759dc7224910e1adab827a04f596e3c 530 - " ~y:"62de2465edbc1ef8458beaa205f45f9dc0fc3db77bae0f2b13bef6d803db689b8f5c747e3a041c08d326cd7e1891675b022a9da3bbaef8007784c56c86c4176c0ac876351d1062d9c270d548c8f4ec39a4556c66e76e507fc5f2540abfa77c178a9bae153435a7caaa008f36b9cab213ecf5e19a0f7b1e62fb9a9c8223bb689e8547b5ec915b04a85b2f53ccc792dc0a7a41d172e6f59f5b5e7c440350ac6a72ca9c06562d4cf8c60e70870a978312e19bf54c2481c582296b64554bd871accc8b251a7617ca5e5d2aadc19d484d76bc3826841f88fad1491d80679243e1527197d02a406348b247ae786108e5400975a38f3961758adc07ce740d8d442f152f 531 - " ~k:"36b3d1d36d1a8c41442b6fffd46bcd7977a306b53dcf7fa590538194 532 - " ~r:"1823f0a807fb9e71ad69b8e9fc674cf76f67c42cadbea6d34cf1f1cc 533 - " ~s:"667fc57a44b289fc34a198556117afd696dcbd96bf1baacb40d3f8b2 534 - 535 - " ; case ~msg:"680d878ca6eeb87e4ae158dddc3732784013ebb1da89401acdd6109089e5601d695f9e4e6ebf16026aa746dee80a01235033f242079af1b7fa6965c87eae8b3291a009e4f19d5b8f1394d866e7c9b72073a95652c0eed98e9484a15c9244764d8cbaabd49d24c207c705703cc35ebfc7683f4a0e6abf23fa07678350a6a00cde 536 - " ~x:"738a8bfc478e462c4bef8d5633e0793475206551bbddd08507f005f5 537 - " ~y:"511a3608c4bda7c82d7d68a5d30bd4c71e457b0f323027d601d6324a94893ab3d62878b12d98c44dcf30adab4352b70f4daa772df6aed3c07587e96c68f8a847a335051481d53903d1d1ae0cf99a54387b00169a1c9704bb62f1d98047dba8a0fdda734cd41611584d50554ad77890720c8ac29932097cf2bb1a8d0daf8663241e23640cc396f9e6877348f014073f4fdc5bebd115a0d74c2ce857e100ae3dc0707b95effa4a2cd8629fdd9bce72091c0e2612d2b30320420f42ecb0986ac3289251b4ae54e51ed83d0195deda9d4e5b398b037213d2f8f0ffdbf727214085534a324d4fefc1653642035ebdbe8167b150bd92b7cdf276fcf5e0bffce956a47e 538 - " ~k:"58d8b64bc8c2da02a294e9db46bfefb273e74870651e19d6cd017c55 539 - " ~r:"7ceb71480b5a7133401b5227fa2253332e04f78ea5d0fe237c8525d1 540 - " ~s:"484800e81f7b5692b79eb21ac2fff83c49c9f0d409c756c73fbdd2f0 541 - 542 - " ; case ~msg:"697f9efc8653fedb898c77f90f124bea5c3b893c49d7f1b116479e83d35cb6c3940797501e7f52887d18ae9f4055e1bdd124b572f7a6fad101f58b52b30ca30d9743a9016af891896d25356e44f982d406ea26a9b25fc4f903092d7e8e8713774a8be7aaac93a6942c1f2c48e9dea64984ae54f7ef99961bfd9b8d93226af776 543 - " ~x:"550c8755237857a0c8fc8a63525d4025713b89bdb127d1c330c3324a 544 - " ~y:"64b588499c9db3e5864192464d32fa3547f648fe676c150a8f9e153c5af57925c76dda4b419d60b22fa5cdea0fb6f0b8479c988a324d275bd42ef10d8998c36039eb4021fc0d2788b59a75cf25ed6ee4d44882b0c5c5cb8dcc1002c0baa4798107e0b57cd26debbcd0ba41d1b1b860b8eb90f6f30500b2e4be7a00b67d93c87d3ff7a6ce53b977a930999807fcbef57d8dc67a8f366124991389328ce7e70f9e5c22ffdedb28498282b4a9a9c68534a238322e0db6088ed0afa8bc77ce998c814471ab56767b35d07b94290ea106ff0c998b51f02222738ef9301f290c6b485dbc4f12b472a1192fd93f2d23527a02d95af0b422be7640a9702ecaac26c9e004 545 - " ~k:"0b4329f9e5ac4a117689883db2ca8e968d30a3aced61e27ba27c6242 546 - " ~r:"62054d11529b993a6f19a0d5481b99b4b4461a49866c29534a361a8b 547 - " ~s:"7a7fd0982e4e2118d1a069787a80b902493465f6620a355c86a94867 548 - 549 - " ; case ~msg:"d080a7dff1ef20e33832b99cf83c6c919c07620bf608e080aa301831ca6178e44ef7a4c115e93ab6d877e96652171610a51d927d2034f42f280fe87d7c1747c480ebccbf565a150f3240f6d4ce5d6eb0b2e964416791376ed22b3559cf93a019676e9e0be3c8d34f0e0d1152ec6c326d3dbf1d3303beadd188c3aa0d77e8a117 550 - " ~x:"2171d5e7cdda9a691dd27f0524f24ca41d5d801eb2ab0dcdbe6014ad 551 - " ~y:"41767ce26c780e3f2019f5a49a701570148e9ff3382203833d1b18e9d8d6a00c0b2258f2e567db31ad4e8cfb2621794bac87d9b3b53b79199a775058febc190d00adedae0fd3021291bc2d1ff0508bf019eca0c573fd863722f367d5d02bd9fa0d07f75406ac204fd3a5ca16325c661fe854fd00fb26654752febbe439096dd2284d5ab13de9eb004847d1d8599fee687cb2ecd0e5b761d91a7e9c58e6921f103024215e74f3de3cc12f5ed7703def041dd3267f1cde0d4fda8dd5ccc9c07b65de59482c4784b4f6fa85667186e2df6c5dc8b495be8ec61379f20923576f17680c4dab99312d0b6441306ae717c95d3f352ba4c096f01d14a7dc05b28ba9a3ca 552 - " ~k:"0f6626008e50c19def9bd694c00522cc861eb7069d55892e08ddff58 553 - " ~r:"44e70d2ead3c51dd0c5461dd4186825e23b4e751d8ab17d0b7edfaac 554 - " ~s:"48ffade27531db478f22fa0ec92bcfd2ffeb6db67715dcdc79bcb028 555 - 556 - " ; case ~msg:"f6a9afe241dd984e3bc265787dcc49491b3bca67feef32fc1e07fdaf0af6c5d06dccb47cdb6907511cb30c109f62e66718c5c4bb43d4b00b51235df43223d60ce1f9be3493a4dcb02e25ed3ddae10d131b481a61aef334b690c7a1ec74865954b39ccfa7a51a9a1e62e654bb89270c774f082adf09b579c8358dacb9db7ca1c2 557 - " ~x:"77207cf0963f1e961c3539d7d0f678fce517f67b728bf15e0cab3ae6 558 - " ~y:"b4138fa4e1dc6772b47e5a3ed130a13b822394c3ce8a0193d1dde4c90e7da1178e1126dd296252fa7d2f139a148ac44dc06a058b84ecb03ad827e66892e85529c362ceac2e7104b797b2e9826054de350596ab581765e9a5c9ff5143332c2f3bfd249a87fe1e30efd6fc057e234a1cd4c19e072bd71b32d55ef122ea930911081e26d998490376e3b721cc32fed92b82d545a7e6ba6e4eb434063c87db848df4ef02eda3fdf4f9d2905b78f7b16b5ea0b5998f1fbb0aaf62a1735591600f9801977b1b947f61a91ff2afb8727c55268972c87216aae900617a56f535ed18c4c5ddf8d7a54463256d09144d889c149e5b09bdd9d8509314b103b846f3e6fa1bb2 559 - " ~k:"57585204d88d73c21f66a150991531973978dfeaedd8024e268f18d5 560 - " ~r:"555a454880084f6cb2522daf3399fb4a501a943a9b6aacd58e2c7d37 561 - " ~s:"730fedb3a5911844146098ac5603e2baaae76962b33a327b50420a50 562 - 563 - " ; case ~msg:"2d1c573bf324028dc2fe00928f55f7fac79037d4d99eb185f3b997e042cdf808b5382d50a6aa8085c5d1958e67283df66986b93471c12e3045ba146ed5965c8ac5b44668f61984d21736cf1c276754b848e9fa636b6315b2272c19e65626bf8b1214d70989a623b5fff7803d28a663bbbbebb84c839b42720fd0e62246b3b034 564 - " ~x:"789375055f94b9ade40b0af8f70640336f5de213571ca1c645ca468f 565 - " ~y:"5ccdca35551cf355ec85db8d68010ded63583255b1d5fd2a522e29513ad3ce6157be30ea1c305d87de6c27fbe3a3fa5007128275d6e6183a65cec5b694bc6c027335066e01273fd6981cc5f60c3e33751386ce792ccb6e6a6db5d7f073800329f9cc46d19f422923b9748dcca4971e43a9d1f59d1c749788a8527ad524df74150b39eafa7f4d5608d1c97255654456eadd4d382ac54fdd12538b2f2ef75a50980171a04d4054b4cd79c71e1c4deb3bc6af4c874f5cf0273896d4fdc5847fefdcc97f5402c7e76484d3d2d70ac16bda41996cadcd83ad92cb37c0c1e9d64fa1abd9a2cf005c2c29a1737cdd6d63aa2fdaa560799b9f07d448760678477629f22f 566 - " ~k:"325b1562d5c9c61f95e6944fb12a4bb08d227c4dc0c8e9a79e391b08 567 - " ~r:"7bf3c0c547e21846212bf4cf3e38362dd4d359b7af6420f90da57907 568 - " ~s:"5ebd5d2d88cae40b37a9a5a84e6218d2453afa146c79a5d5f5df44f4 569 - 570 - " ; case ~msg:"bab4db55bf6d3abefd1bb4e0f7bcec65ee6c6d8eb04b7c480df4e9e39150f10c38f1abb63dfe1bb9755c41b38955ba38ba938b6ceedfec02001fa870070c59df1fd2d72a814104c5143376a3136b8118f7b47bd1ffab53359e53f95c66ee12705e31a462a8caae481556ceff607ccc8bf1450772cd68081d3f15a710e656ae56 571 - " ~x:"6f4a94c9254a557787de9afa08215414db5a0dbc67c66cde1c1e6f04 572 - " ~y:"53c0b0b0269fcf2948667e28b11ccda9cbb9275463f21ee30da33c4575be5e111a182a6f38b890f20b8f2d224f5981895310db7c4703c1cec2b257f452d964be50c014b752360ee24f2fe1bcc023477a2d7085f58214df866b13a8d8af913146dc0bee078aea1ce645999b579498eae9277ed7e8b2c75f494efaa73a973f32232f08ce7f0afcba316623b94158de39bd4c0d513234ee1a481d5b72f4eea37749b40fff12ab620f11aaa01e3558e7a4c550707b71c16cb8cda98f46bf71769a476c3385a8caf7c886ae47d228b1771a8bd4b7f19e6f53047f62f029c339fe7575be93080ac748289149a57a0ddced54d72f6d4d344fb874ccc85ea7f3dd2164df 573 - " ~k:"14fe2a5a75756885240ff29abd19d346b2e7e5dfa76d2430f0d069d6 574 - " ~r:"118d2227be4bd91e98a2efde15609b2b9124b2e83c274b632300432b 575 - " ~s:"3a447461944b2a59278a8e1118b406bd3ff416775d65530e54f9e623" 576 - ] 808 + [ 809 + case 810 + ~msg: 811 + "edc6fd9b6c6e8a59f283016f7f29ee16deeaa609b5737927162aef34fed985d0bcb550275637ba67831a2d4efccb35296dfe730f4a0b4f4728d1d7d1bb8f4a36238a5c94311fa1134a93a6b4de39c085e9f60ae4e237c0416d58042bb36baa38cba8c896295b745d5376fd8ce42eb6ee5a1b38f87716b265b76e58cfb24a9170\n" 812 + ~x:"6132e551cdac88409183bd37ee1452cd247d4834b08814b275be3ff5\n" 813 + ~y: 814 + "289ff18c32a56bb0b8839370647683a38a5a7e291410b93207212adc8088d30f93e9e4abc523f3d46936e7d5c90d88742b36afd37563408f15c8c1a4f7ac24bf05f01008ffee70c8825d57c3a9308bad8a095af2b53b2dda3cbed846d95e301eb9b84766415d11f6c33209a0d28571096ab04a79aa0dc465997529686b68e887cd8a205c2dc8195aef0422eba9979f549ac85548e419413643b7244361153ada1480d238cd00dc16527938955548dd5d027ded1029eeeb8ed6c61b4cd59341d8b15466e9da890a989996f4d7691e6072de136af28b5874bf08bd1f8a60cfb1c00888132909f515e04bce81b02951aa41baac68ffdb8c5dc77a1d32d8f2c10dd7\n" 815 + ~k:"7197392d32d0af6a7183cc3398556f8f687d86a8ff742be6ad38562f\n" 816 + ~r:"45df2f423e94bf155dd4e1d9e63f315ea606dd38527d4cf6328738c8\n" 817 + ~s:"59b3e8efa5bc0ccbf4a3cbb6515c4b9bf784cfacdcc101dc9f81d31f\n\n"; 818 + case 819 + ~msg: 820 + "3bd2ab08217878e6774ec7797deb75d5c94c40e24ddf1fac8dde3a29c86b26f57157d329aac31a6622e1d6dac97e22695d7d1f8e20aa26b06795c2f878ba5d2b9cc4b16d5fa60a5fa5c24c09031de2f970a9b57ea24af17192ece21a4d120fdb52e62b8238f778ff8552fa453c0a8891243fc8757188e9c4e0e749f7e9cdf1c1\n" 821 + ~x:"32d53ad2620c156e4617a8680c543839c9be93103e80cc0fefa44ce5\n" 822 + ~y: 823 + "b9b0e1cd37bafbedeed173fd709983f53c2c427f9f61c895fac9eb549bd6201d05efd551aecb98b2df80142dea7a35491d474a3adc83f0da8dc4eacd7f6d7201c6fc0ab798abe89dcd7d0310d5f00fa10d211f18ea853579e2fe31ee55371d1c9fc4cfb050786586659bdc0f1aac4c109b9e4f9416d22c42b39a471311e28a8ed62f1f41bcfe06e074bb2f1acd29597953c3b69d3a78831fb2f83665d04a1395775ea3a2a6ea142ec00507badd4de0d9c102eac7bb894f7453e6a8e0dd3f14978377d1ddb1fdf1c55835b9924f42ad45c847c79b3f83fbf924f80b78f50329731016763e01ba8ef69e81523e181584f45c21e3c8edfed4e2ec56fb7b02aa4ee9\n" 824 + ~k:"2e8e4625de74e31bea9e480a5de92890095b6ce36897a2337ff97d53\n" 825 + ~r:"6d19fe3c415d6b07d6a1039a1fe34b106daa2eea4cbca971cb669eac\n" 826 + ~s:"14d7decc2cc05a1700fa256e4d2994bc4bd957bed0baf9a18bda7090\n\n"; 827 + case 828 + ~msg: 829 + "c67fa77cd7351d100c7624e25418481f8fa499d75f5949a5cae60f96a0f7bfcdda7dba373f9f7512a5f1460a95213077cebd912e2662c43ac6bbe38c4479b04151a5e2d2880902d031aa0dff3f41126dd09fba5c0507634ed16c3938fbd3a96473a8b1ebdc37d32c767fd5932efa235555f3825a1595369238675453604d278e\n" 830 + ~x:"062bd01487e413074126d9d47258b5c7c77790a9db0af952ce799eb0\n" 831 + ~y: 832 + "31939ccdd393f747541a5c69f8e509761dd67eddb42e0bdfc412d4cc30d368d878d26d856c5290ec746b59c5e5af65ef3fd62c9a2dccfc1558dfbfb62cfecd7838e6d59495b20db5ad9d78e82f046f9f1598113aae0a79601d6b94a32e05f6ecfdf2b9c4cfa720debfc212221b14b0dd6f7078205a4f218cd4b8f10bea8fa481eca5254f365d01f3c86520bf254323d5634b96920a13b8f29d734e07fde8064eb0c9f8ebb6ae0b40b4aa7d26bb8d80868231d4558a278045cb5f2951cbfe0dc97bbdcee7af8c9b1e3b63cb49dc29f300775cdbe4d2d27894e27e0e7c9eada13a359f0b92b449e9d069b95bdc2aa7c85e56811c07207a150e598735996a6e5349\n" 833 + ~k:"7439c7aa4446ed540ba50b9c817792b08fc0278fa0af2daded03756b\n" 834 + ~r:"7924b76ee76ad7ff2ab327dabbbd31336750fc7663df4b5b94eeb62d\n" 835 + ~s:"5914cf965490b0bf8192fc6e169754bdfd31c48d716361dd15f45bf7\n\n"; 836 + case 837 + ~msg: 838 + "fde7434c41666022d6d7dabc7a67315b1ff49a2a85a6168f2b6063e3036a4f35e66d2872af3d97e5beba239698d88e13bd036ef08cf0e83a41664c3d0d21863c24129a6a9b27b8e96c8029ec673e07af7246ab77a56c21ca208df4b1818deda906b553b2b23a37b5a05e29825ebeb47f53986c2bf26d731a5b731fffc353258c\n" 839 + ~x:"6e6bae97e3b37a402eca050d666b6483cf7d700419c5ab1eed1bed05\n" 840 + ~y: 841 + "59a14e36c9ededdce8000f04c6f7401ad987f1c7a5a070b80e0aaed7751d1d50d99a580cf205dbcc3797a0a0406b04776d80f2f2df418cee249b98672de7e61cda85cfbe903690e54642dc2a12a90ecf88c59256a4d77c4c0cb54e13fa3647b11431e1734f3ceeea04fbf3459665e999fc0f7a754683e48cefeb4a95fe473911ffe0de0f738960753dac33666c53ed2893bc63dd4162d7a6328739a252cdaea7a948c97d024153b55d14fd5304e3575048418808a952675fafb95fad84b1156b24e98e048aa777a745324ec13ba378e83b2384bc2e96c6095aa786bd28fc3be6bfa4db0c3c44fed4c351bd88a19e179a6a7bc12fc014f17de46fd12ef1287f72\n" 842 + ~k:"08544a6237ac967e5d11f2eccc6618399818b891df7a04d08cbc5e74\n" 843 + ~r:"49ea82713aaad799e263809e161b0655f1e74323a06041836f676980\n" 844 + ~s:"76b3f6c1647f8d17718ffb92d6e1424606ba9724e5290daa4ee95efb\n\n"; 845 + case 846 + ~msg: 847 + "6676a3a131cef7e5647ea7590da3c704a0f5dc3f37f26913a70d430609cc2497c45e68b7bd6f5893dba26287ff0d240bab8a0761936aa709a2162ebf1c20a6136a748352dc39ba4403cbe4b0a5a54a729286dd193eac1a2e6bdc150fb06369be4443a60e75e5330083ff009eabb05232c52368a26fd237c7c3185c1c7e7d5955\n" 848 + ~x:"18faf583215bc4fa71791f6f34e682ab3529aa9a1a71c1fc7bd456a8\n" 849 + ~y: 850 + "ddcdf4c616fd6e4016099fb34ebc4ec507290762c5ee6876f10c6a2dedec97ba86a6063aa8ff069f3f3db40c9464afb1ba7ed691773afd6083586b14e35694a9ddc376ddc39dac57132a05bf88a0a6085c72a80a21c13e590c68c4e98eedb67f1e16c8cc7e9e25ff37c87ee3be9adf1ad0b838651b0fddf8d026969d4a16bbb828fcaf00efa306fcedd5ae19ca1a1abf44a2bdf6f994123ce941fd3523bc1335f51fa8dc5d525358bddf0c55fe2ce07ce974408d9090488837976f16845eb7a82d04c43a704be2dee1be2c8683b2d9e5c44f1833f5c46c65b6e62c2a720421bb35843fead7b9e0b3fc04c646be39e890e370b982bde91f2fc18442b650ae602f\n" 851 + ~k:"11b25b09408bb5dd784ad70264e585c978dc02cc1df8bb95a28aedfe\n" 852 + ~r:"1658a7ef2f444b014a1885b1eda8dad3605b96c3948e544e4c8825eb\n" 853 + ~s:"602150f67b19a5e3e39fc53abea02dd8f3b30d25c0b4ea0bcddcbdb0\n\n"; 854 + case 855 + ~msg: 856 + "071f06a11588584da5576013029b5a14712581a48408bbfdbe34e17568c0a0e4d12c1e9c3fb227101440dd8dcdc415e3b49f68a26a0ec7612a10bbc64ddb8f7ec9e9750d1efc9c0574700875fcf52d00d37b9dd744ca841ecf7566977c1b5799dc4105d0b7a92551c5b33a50133fa300a5908b18f4c01936347c6049447abf29\n" 857 + ~x:"58882f1a41e08bf6c8dad091a299af0fbbd14515c1550906ff77f6ae\n" 858 + ~y: 859 + "b1f4dfc9c83455f279a3e7522734d6b120ab8ed36ccba7854e26504c707983d2a9c075045723f441abfc7b36fbb5d4bf0447678f5b709ca5129b74888a0723e905769836b9dac1303f1b9ace26554342b6e6d032ac4b477e011a4ddd3e2978fc0c449c64a66efe7d4e22e5a5fa2b01bb17fcdbec7185dd4115a19d972fb01a06b33bb18b9349ff95fb10dbbf2dcf899b1817d30ad48a99a614d57770ba764a11a84a8db3af3041ec362614f807196ea3b90d05b014054ff4e18524c795e6722c0fa1f6d1205d532d94347633eb132e6cbb596d8b341e65f2b2f955872ebd4d3006c45ac33da11167fa46869c7ee70e9cf147b23368b3aacd9c1880b09ac86a8d\n" 860 + ~k:"5ff04e754fe3246f35b3400b87a450192a7bfd9b3c03f3ece93449f4\n" 861 + ~r:"07bd3f6718e39839304ef54ac48bda8d9ac8ee051a49bb9131dcc918\n" 862 + ~s:"6496b2469bfb5845485004702b0c79941bc3c3007007ba169d8307ce\n\n"; 863 + case 864 + ~msg: 865 + "71279b848c00208fb4e4d87979cf973b321b20d098dea912a3b4b5789cdd3b7ccd8f3993a9c92c34b70e9b0bd57520db56f2ded3a612a6169d2a1cc6350905ed0202a25c113b7bf8faec4edd2ea3b8f447ca75d15a712b4b4394c22de0c2554b9aa07ec8466727e7ef6f1f04ac4568d7726d9d77f50a2fd551ac29e42f8dda23\n" 866 + ~x:"292b1666d0b1fb361da268de725b11310000705964705ee975d4ebae\n" 867 + ~y: 868 + "7c8d63b9d55f59290b02a0fcea6d98c6c545e2c0d4b109a069694d80cb034dbdbd9edb6b4d9b152849cabd655fc77071644bbf4a0c7ea4edfe864a43c44fded163dd899c21cc2f9c33cbf56e8caf84394b24f8c14e84f22c3b0f747129d9aef41b6f1b1fa8ff5a8f680b496595dbc7b7b63a7790e3628747011b3277b06e80de0b67942f602eada60b518f282cde69cd717a5f6a19c8e169449e0d32a9d8ce8f09a5ada23c12a02dccfcdc0290a8bd46e8b7eb397494f32a0ecb49fa5a8edd41845eb417fbb8cdb89a9f18b9ad1b41dd4122ab349bb3c44951e4f9604360fcb1b795311545a61cfd67c287a7c9d4d3530214988e7616979e2ce907d5c7f3e9ad\n" 869 + ~k:"6b1b752bb180d8787c71505be758c0ce41fef428ac10591502c9a04b\n" 870 + ~r:"4cf5c26c4c2cd48c05508e52d743ef48685f6324141adef23d79a396\n" 871 + ~s:"59f64755a04c90a14b187ae142ec483c4600b6fbbe19f04a49e9ff88\n\n"; 872 + case 873 + ~msg: 874 + "3ea03e9b005ec1954fee0c73326d8aca1a4f63648eb4cc59265528ee8e969ecefecf2797a0144c8336500e26a1c7cb1a642b1ec65201416e5deb355201de2bda695d1beba8dee62772f4d5914a245be9ffecf39408ae7bf1bff7c2451029c4ba0c522516e89955ad3bd699cce94c744081a9f2d60f5c5127ec722fa57316cede\n" 875 + ~x:"087e432b1c29c00508d768fda7c4b279fc088c48439f09980bfa159c\n" 876 + ~y: 877 + "1239c347be4ce6f1daa721fbbb141ee6e2f7c73098effe8e71beb9f1ab72d1b5bd3e78df770f7fbd4b3a9505702dacf102eeb8a16f11b4f809ca002ae3774ac0407e2572ae3ee1716458e5f45c493f4b921144e858d87d63773d023745512b0cc02b31ebfe5c24ad37efe539cd393cfc2b951fe1b6ffad2a2824c0f54bd776aa0afcf9c1ef427afc6cf4c4b17f66355d68574132e1d88ade3722513e395fc62d65e9485157c82064c90803a1a91f9e6b10af2f80699d917daa6b81415e508193152b4ccded593dde35f645e54b7cba445775eb16c5e19073f0a9eb5369bf2513b92158165b94dea511e938fb6a8798e040a05da94fdb5a4d44bee943b95b39d9\n" 878 + ~k:"0a8a45ce2412cb84e4e0174d7ecd2eb5b37ad0a53b474fa9bcf56d9a\n" 879 + ~r:"5ca2e971f21b70127a70c655eb87e20b2517976228a2c4e648d549b2\n" 880 + ~s:"44036b34667136a5140dd1948ddc2fb2bf679efee21f29b7ad87af7c\n\n"; 881 + case 882 + ~msg: 883 + "a3f7033958c5b779072b0548baedf4f88d14f11a6dd6eec0181b399943d7246a45d50c4f7b5295dae4cd3ba7c4c181fa201581ad5c4b38793bcf454f176868e9cbe0997aa41987b1aa3d5ddc046be7b022fb5130594c8a9df03cfaa7acef817e3ba5e192c69a120299492baa52a9be83b8e871abe318b4a1f588f9edcddafc17\n" 884 + ~x:"5831abf9843eee928944e3dbb759dc7224910e1adab827a04f596e3c\n" 885 + ~y: 886 + "62de2465edbc1ef8458beaa205f45f9dc0fc3db77bae0f2b13bef6d803db689b8f5c747e3a041c08d326cd7e1891675b022a9da3bbaef8007784c56c86c4176c0ac876351d1062d9c270d548c8f4ec39a4556c66e76e507fc5f2540abfa77c178a9bae153435a7caaa008f36b9cab213ecf5e19a0f7b1e62fb9a9c8223bb689e8547b5ec915b04a85b2f53ccc792dc0a7a41d172e6f59f5b5e7c440350ac6a72ca9c06562d4cf8c60e70870a978312e19bf54c2481c582296b64554bd871accc8b251a7617ca5e5d2aadc19d484d76bc3826841f88fad1491d80679243e1527197d02a406348b247ae786108e5400975a38f3961758adc07ce740d8d442f152f\n" 887 + ~k:"36b3d1d36d1a8c41442b6fffd46bcd7977a306b53dcf7fa590538194\n" 888 + ~r:"1823f0a807fb9e71ad69b8e9fc674cf76f67c42cadbea6d34cf1f1cc\n" 889 + ~s:"667fc57a44b289fc34a198556117afd696dcbd96bf1baacb40d3f8b2\n\n"; 890 + case 891 + ~msg: 892 + "680d878ca6eeb87e4ae158dddc3732784013ebb1da89401acdd6109089e5601d695f9e4e6ebf16026aa746dee80a01235033f242079af1b7fa6965c87eae8b3291a009e4f19d5b8f1394d866e7c9b72073a95652c0eed98e9484a15c9244764d8cbaabd49d24c207c705703cc35ebfc7683f4a0e6abf23fa07678350a6a00cde\n" 893 + ~x:"738a8bfc478e462c4bef8d5633e0793475206551bbddd08507f005f5\n" 894 + ~y: 895 + "511a3608c4bda7c82d7d68a5d30bd4c71e457b0f323027d601d6324a94893ab3d62878b12d98c44dcf30adab4352b70f4daa772df6aed3c07587e96c68f8a847a335051481d53903d1d1ae0cf99a54387b00169a1c9704bb62f1d98047dba8a0fdda734cd41611584d50554ad77890720c8ac29932097cf2bb1a8d0daf8663241e23640cc396f9e6877348f014073f4fdc5bebd115a0d74c2ce857e100ae3dc0707b95effa4a2cd8629fdd9bce72091c0e2612d2b30320420f42ecb0986ac3289251b4ae54e51ed83d0195deda9d4e5b398b037213d2f8f0ffdbf727214085534a324d4fefc1653642035ebdbe8167b150bd92b7cdf276fcf5e0bffce956a47e\n" 896 + ~k:"58d8b64bc8c2da02a294e9db46bfefb273e74870651e19d6cd017c55\n" 897 + ~r:"7ceb71480b5a7133401b5227fa2253332e04f78ea5d0fe237c8525d1\n" 898 + ~s:"484800e81f7b5692b79eb21ac2fff83c49c9f0d409c756c73fbdd2f0\n\n"; 899 + case 900 + ~msg: 901 + "697f9efc8653fedb898c77f90f124bea5c3b893c49d7f1b116479e83d35cb6c3940797501e7f52887d18ae9f4055e1bdd124b572f7a6fad101f58b52b30ca30d9743a9016af891896d25356e44f982d406ea26a9b25fc4f903092d7e8e8713774a8be7aaac93a6942c1f2c48e9dea64984ae54f7ef99961bfd9b8d93226af776\n" 902 + ~x:"550c8755237857a0c8fc8a63525d4025713b89bdb127d1c330c3324a\n" 903 + ~y: 904 + "64b588499c9db3e5864192464d32fa3547f648fe676c150a8f9e153c5af57925c76dda4b419d60b22fa5cdea0fb6f0b8479c988a324d275bd42ef10d8998c36039eb4021fc0d2788b59a75cf25ed6ee4d44882b0c5c5cb8dcc1002c0baa4798107e0b57cd26debbcd0ba41d1b1b860b8eb90f6f30500b2e4be7a00b67d93c87d3ff7a6ce53b977a930999807fcbef57d8dc67a8f366124991389328ce7e70f9e5c22ffdedb28498282b4a9a9c68534a238322e0db6088ed0afa8bc77ce998c814471ab56767b35d07b94290ea106ff0c998b51f02222738ef9301f290c6b485dbc4f12b472a1192fd93f2d23527a02d95af0b422be7640a9702ecaac26c9e004\n" 905 + ~k:"0b4329f9e5ac4a117689883db2ca8e968d30a3aced61e27ba27c6242\n" 906 + ~r:"62054d11529b993a6f19a0d5481b99b4b4461a49866c29534a361a8b\n" 907 + ~s:"7a7fd0982e4e2118d1a069787a80b902493465f6620a355c86a94867\n\n"; 908 + case 909 + ~msg: 910 + "d080a7dff1ef20e33832b99cf83c6c919c07620bf608e080aa301831ca6178e44ef7a4c115e93ab6d877e96652171610a51d927d2034f42f280fe87d7c1747c480ebccbf565a150f3240f6d4ce5d6eb0b2e964416791376ed22b3559cf93a019676e9e0be3c8d34f0e0d1152ec6c326d3dbf1d3303beadd188c3aa0d77e8a117\n" 911 + ~x:"2171d5e7cdda9a691dd27f0524f24ca41d5d801eb2ab0dcdbe6014ad\n" 912 + ~y: 913 + "41767ce26c780e3f2019f5a49a701570148e9ff3382203833d1b18e9d8d6a00c0b2258f2e567db31ad4e8cfb2621794bac87d9b3b53b79199a775058febc190d00adedae0fd3021291bc2d1ff0508bf019eca0c573fd863722f367d5d02bd9fa0d07f75406ac204fd3a5ca16325c661fe854fd00fb26654752febbe439096dd2284d5ab13de9eb004847d1d8599fee687cb2ecd0e5b761d91a7e9c58e6921f103024215e74f3de3cc12f5ed7703def041dd3267f1cde0d4fda8dd5ccc9c07b65de59482c4784b4f6fa85667186e2df6c5dc8b495be8ec61379f20923576f17680c4dab99312d0b6441306ae717c95d3f352ba4c096f01d14a7dc05b28ba9a3ca\n" 914 + ~k:"0f6626008e50c19def9bd694c00522cc861eb7069d55892e08ddff58\n" 915 + ~r:"44e70d2ead3c51dd0c5461dd4186825e23b4e751d8ab17d0b7edfaac\n" 916 + ~s:"48ffade27531db478f22fa0ec92bcfd2ffeb6db67715dcdc79bcb028\n\n"; 917 + case 918 + ~msg: 919 + "f6a9afe241dd984e3bc265787dcc49491b3bca67feef32fc1e07fdaf0af6c5d06dccb47cdb6907511cb30c109f62e66718c5c4bb43d4b00b51235df43223d60ce1f9be3493a4dcb02e25ed3ddae10d131b481a61aef334b690c7a1ec74865954b39ccfa7a51a9a1e62e654bb89270c774f082adf09b579c8358dacb9db7ca1c2\n" 920 + ~x:"77207cf0963f1e961c3539d7d0f678fce517f67b728bf15e0cab3ae6\n" 921 + ~y: 922 + "b4138fa4e1dc6772b47e5a3ed130a13b822394c3ce8a0193d1dde4c90e7da1178e1126dd296252fa7d2f139a148ac44dc06a058b84ecb03ad827e66892e85529c362ceac2e7104b797b2e9826054de350596ab581765e9a5c9ff5143332c2f3bfd249a87fe1e30efd6fc057e234a1cd4c19e072bd71b32d55ef122ea930911081e26d998490376e3b721cc32fed92b82d545a7e6ba6e4eb434063c87db848df4ef02eda3fdf4f9d2905b78f7b16b5ea0b5998f1fbb0aaf62a1735591600f9801977b1b947f61a91ff2afb8727c55268972c87216aae900617a56f535ed18c4c5ddf8d7a54463256d09144d889c149e5b09bdd9d8509314b103b846f3e6fa1bb2\n" 923 + ~k:"57585204d88d73c21f66a150991531973978dfeaedd8024e268f18d5\n" 924 + ~r:"555a454880084f6cb2522daf3399fb4a501a943a9b6aacd58e2c7d37\n" 925 + ~s:"730fedb3a5911844146098ac5603e2baaae76962b33a327b50420a50\n\n"; 926 + case 927 + ~msg: 928 + "2d1c573bf324028dc2fe00928f55f7fac79037d4d99eb185f3b997e042cdf808b5382d50a6aa8085c5d1958e67283df66986b93471c12e3045ba146ed5965c8ac5b44668f61984d21736cf1c276754b848e9fa636b6315b2272c19e65626bf8b1214d70989a623b5fff7803d28a663bbbbebb84c839b42720fd0e62246b3b034\n" 929 + ~x:"789375055f94b9ade40b0af8f70640336f5de213571ca1c645ca468f\n" 930 + ~y: 931 + "5ccdca35551cf355ec85db8d68010ded63583255b1d5fd2a522e29513ad3ce6157be30ea1c305d87de6c27fbe3a3fa5007128275d6e6183a65cec5b694bc6c027335066e01273fd6981cc5f60c3e33751386ce792ccb6e6a6db5d7f073800329f9cc46d19f422923b9748dcca4971e43a9d1f59d1c749788a8527ad524df74150b39eafa7f4d5608d1c97255654456eadd4d382ac54fdd12538b2f2ef75a50980171a04d4054b4cd79c71e1c4deb3bc6af4c874f5cf0273896d4fdc5847fefdcc97f5402c7e76484d3d2d70ac16bda41996cadcd83ad92cb37c0c1e9d64fa1abd9a2cf005c2c29a1737cdd6d63aa2fdaa560799b9f07d448760678477629f22f\n" 932 + ~k:"325b1562d5c9c61f95e6944fb12a4bb08d227c4dc0c8e9a79e391b08\n" 933 + ~r:"7bf3c0c547e21846212bf4cf3e38362dd4d359b7af6420f90da57907\n" 934 + ~s:"5ebd5d2d88cae40b37a9a5a84e6218d2453afa146c79a5d5f5df44f4\n\n"; 935 + case 936 + ~msg: 937 + "bab4db55bf6d3abefd1bb4e0f7bcec65ee6c6d8eb04b7c480df4e9e39150f10c38f1abb63dfe1bb9755c41b38955ba38ba938b6ceedfec02001fa870070c59df1fd2d72a814104c5143376a3136b8118f7b47bd1ffab53359e53f95c66ee12705e31a462a8caae481556ceff607ccc8bf1450772cd68081d3f15a710e656ae56\n" 938 + ~x:"6f4a94c9254a557787de9afa08215414db5a0dbc67c66cde1c1e6f04\n" 939 + ~y: 940 + "53c0b0b0269fcf2948667e28b11ccda9cbb9275463f21ee30da33c4575be5e111a182a6f38b890f20b8f2d224f5981895310db7c4703c1cec2b257f452d964be50c014b752360ee24f2fe1bcc023477a2d7085f58214df866b13a8d8af913146dc0bee078aea1ce645999b579498eae9277ed7e8b2c75f494efaa73a973f32232f08ce7f0afcba316623b94158de39bd4c0d513234ee1a481d5b72f4eea37749b40fff12ab620f11aaa01e3558e7a4c550707b71c16cb8cda98f46bf71769a476c3385a8caf7c886ae47d228b1771a8bd4b7f19e6f53047f62f029c339fe7575be93080ac748289149a57a0ddced54d72f6d4d344fb874ccc85ea7f3dd2164df\n" 941 + ~k:"14fe2a5a75756885240ff29abd19d346b2e7e5dfa76d2430f0d069d6\n" 942 + ~r:"118d2227be4bd91e98a2efde15609b2b9124b2e83c274b632300432b\n" 943 + ~s:"3a447461944b2a59278a8e1118b406bd3ff416775d65530e54f9e623"; 944 + ] 577 945 578 946 let sha224_n224_cases = 579 947 (* [mod = L=2048, N=224, SHA-224] *) 580 - let domain = params 581 - ~p:"aa815c9db1c4d3d2773c7d0d4d1da75ecfc4a39e97d5fa191ffec8b1490a290ce335e5ce87ea620a8a17de0bb64714e2ec840bf00e6ebdb4ffb4e324ca07c3c8717309af1410362a772c9add838b2b0cae1e90ab448adabdacd2e5df59c4187a32a23719d6c57e9400885383bf8f066f23b941920d54c35b4f7cc5044f3b40f17046956307b748e840732844d00a9ce6ec5714293b6265147f15c67f4be38b082b55fdeadb6124689fb76f9d25cc28b8eaa98b562d5c1011e0dcf9b39923240d332d89dc9603b7bddd0c70b83caa2905631b1c83cabbae6c0c0c2efe8f58131ed8351bf93e875f6a73a93cbad470141a2687fbacf2d71c8ddee971ad660729ad 582 - " ~q:"ea347e90be7c2875d1fe1db622b4763837c5e27a6037310348c1aa11 583 - " ~g:"2042094ccbc8b8723fc928c12fda671b83295e99c743576f44504be1186323319b5002d24f173df909ea241d6ea5289904ee4636204b2fbe94b068fe093f7962579549551d3af219ad8ed19939eff86bcec834de2f2f78596e89e7cb52c524e177098a56c232eb1f563aa84bc6b026deee6ff51cb441e080f2dafaea1ced86427d1c346be55c66803d4b76d133cd445b4c3482fa415023463c9bf30f2f784223e26057d3aa0d7fbb660630c52e49d4a0325c7389e072aa349f13c966e159752fbb71e9336890f93243fa6e72d299365ee5b3fe266ebf1110568fee4425c847b50210bd484b97431a42856adca3e7d1a9c9c675c7e266918320dd5a78a48c48a9" 948 + let domain = 949 + params 950 + ~p: 951 + "aa815c9db1c4d3d2773c7d0d4d1da75ecfc4a39e97d5fa191ffec8b1490a290ce335e5ce87ea620a8a17de0bb64714e2ec840bf00e6ebdb4ffb4e324ca07c3c8717309af1410362a772c9add838b2b0cae1e90ab448adabdacd2e5df59c4187a32a23719d6c57e9400885383bf8f066f23b941920d54c35b4f7cc5044f3b40f17046956307b748e840732844d00a9ce6ec5714293b6265147f15c67f4be38b082b55fdeadb6124689fb76f9d25cc28b8eaa98b562d5c1011e0dcf9b39923240d332d89dc9603b7bddd0c70b83caa2905631b1c83cabbae6c0c0c2efe8f58131ed8351bf93e875f6a73a93cbad470141a2687fbacf2d71c8ddee971ad660729ad\n" 952 + ~q:"ea347e90be7c2875d1fe1db622b4763837c5e27a6037310348c1aa11\n" 953 + ~g: 954 + "2042094ccbc8b8723fc928c12fda671b83295e99c743576f44504be1186323319b5002d24f173df909ea241d6ea5289904ee4636204b2fbe94b068fe093f7962579549551d3af219ad8ed19939eff86bcec834de2f2f78596e89e7cb52c524e177098a56c232eb1f563aa84bc6b026deee6ff51cb441e080f2dafaea1ced86427d1c346be55c66803d4b76d133cd445b4c3482fa415023463c9bf30f2f784223e26057d3aa0d7fbb660630c52e49d4a0325c7389e072aa349f13c966e159752fbb71e9336890f93243fa6e72d299365ee5b3fe266ebf1110568fee4425c847b50210bd484b97431a42856adca3e7d1a9c9c675c7e266918320dd5a78a48c48a9" 584 955 in 585 956 let case = case_of ~domain ~hash:Digestif.sha224 in 586 957 587 - [ case ~msg:"e920fc1610718f2b0213d301c0092a51f3c6b0107bbbd8243a9689c044e2d142f202d9d195a5faef4be5acadc9ff6f7d2261e58b517139bcb9489b110423c2e59eb181294ffdae8aad0e624fab974c97f9f5e7dc19d678a9cb3429cf05ec509072856f5adfec6e29bafe8e5ba95593e612843e343111d88a1eaff7dc0a2e277f 588 - " ~x:"7b489021578e79e7bd3ee7ab456f659f3dc07c88f5c9a39e4f8cee81 589 - " ~y:"1ae10c786ad0902c5c685dae5c7121418a377b888b5f2f2bc76623570fd62bcb190b471ad5359c5f062f8819289e956d8aa6f90d1f8cf1ee72d3a1bdfd56c478dc29a19c4569b5a60e3a8f34f60656eac5b25dde5514a5c67b675423204f6ccaf0990617cc7355b9d3ed868978a252020a769ed59a6edaa6efe3377eef45f3f6f3e64179cc7db8b143fb835c5d71bfcfa1e2a9049bccf7fe9ab57546220fe3f4b7521c861739d138507e81a46a6993605441dcb90d6ee4afbc42cabe90a254444968109d7edd9694a023239f1d56175dd1fac115915e24fab563f4fc3f269bed2f300832d112596485a711417aa73bb4ac72a651a1fa5baed3636c720d397008 590 - " ~k:"37fadd419fcbd2b073a06ae96b9eceb63e29aee9ac5fa2bdb31ab85d 591 - " ~r:"65102e8f64ecb11f06017b1a0c0def3c29897c277c4a948b1f4da6b9 592 - " ~s:"21ad0abb27bd3c21166cb96aef70c0dbd5f3079cab0dd543d4125bd1 593 - 594 - " ; case ~msg:"da5e7b051c1859d22f2a3163335d277951973c172e06697c0490ff15b592c1ebd0fa5efa2463119804a3fea224b96b463e30083e002949a24e922031764bb3daff8101fa088af5457af36654c668f234a00cd828cc740a898c0cd3df09315da9b346b325b2fbec475210b75482affa61a3eff50c83c3a039fae5cfa8d971fddd 595 - " ~x:"9d8bba124417c126c1c011115906a7bdb7a493661d8a945e32cb283c 596 - " ~y:"5e276987b847b852cc372e986e8aba0633dd46c461bab58acae056d4d1a9df03a19df114f648b28e038506fd09ad0d95449d9d8058aa1b241b2acd3badbf9882697331de45b452345c051c2cd830f7cdd7486b1166b93891a72a8b7dc6228bad708720ef33235801c4d4c3c4f28036df6029a195d0019124d16fe8f76c525b7e8f04bf4b8d8ba6ef608e623224fa8d988420f40526c25ae3e4c79d5ae7fee69793e02bad9651ea0fefd3eadc5ff1ca2d142930355b1f3aea102221fa17b735a18af3b83327c8f33efb9a49b70211014eba43fa65eeaf25ebf452bc4b7dc1f407d0cf1b834619b5f73c6cab7051c92070aa06f7f9406c507d1a15d12c11bc839a 597 - " ~k:"1abaec5b4efaa83403fa970ff6027fdb596359df930a02baa12ed854 598 - " ~r:"313615836f0d338d81b670f116a5414d2ce90ea5ca5308ba4f0c8a7d 599 - " ~s:"dc1d4c3c06203fd598a476c891dfe5934162d0d35f37f1c09dd6395d 600 - 601 - " ; case ~msg:"f49895b3290d9aaeb4af611c5e30afc0047dd42c07216211d54977d1497fa4ee6abe11000d6ac04d24b4c50f31e06ee8a74774d3d304137cc6b114d145250ee7e94a12a1ab592ae307ef5d930cf39170e9756adc5e7ba62a54abb6f047b4500b6121e1f4a95d3c6a96f7f8333cbb1ebeed8b4db1a7fe75f4071cebfbbdfdab90 602 - " ~x:"b9174a6cb4d3b2e7e4d168078e920ecb651343223575dd37c0677371 603 - " ~y:"6d622525ecf54dbecaa811939ee07ef2975d9da9f7a3c58bbb893ce3880677404f2c6e5963b8c0b4492601f15bc6fdfd747a00ab8334e9053201e1c9fba55fbfde36ec54237501b87416992771cb5ab8781d0a967b7f14f3d5de6b1665f662885878e50ad37827b95c8f0e21d6bbebc9dfd47b2957d2fcdd1a2b25a616e698129b45998b6b6aa2a99c1ebf4275493e28eef1ae34e9ca63cd8886da58572907aa9b714e89bd3644a7ea029fa3a4ae9c26e665c85296204fdf86b7b1dd7866bc8e9385e9518a270248292594c54a4a03dc1492664ddae53277c6fbb9dd0cdd99bf11eaf6ae31923e4f979a7f581799dc432b1940f613a7a7ea6855237f776e91d4 604 - " ~k:"1c52eec9523245bd82707f2ebdb05fee6d34749f23023ba72a5a60ef 605 - " ~r:"79d544cdecfd1ec1b7d1ba6322a5e0eb858aeb4b76d5b3202cea233a 606 - " ~s:"0ea53dea4ccb25978a0af5529598911b47c25e0ba3b2a0505fd1d7fc 607 - 608 - " ; case ~msg:"31d739566914549eb25726bf6d4b6c674f479ba7a406acd108a106f36c7f5214976dcf3adf2c83fd26b37d52c0b5ff51e6b3811a8dcb026a1fbb52f95027ea6034d91149b30ab4928ede26ddd692ddb8ddd929fbff83fc673788faa0ba5d967fd1339299e55be51cea80609d2b3c3433cf713a9686e229336cfa7e720fd5303d 609 - " ~x:"4cb56c8acb9c107087837ef5e021f77cb015023c8ac1ec73575e5289 610 - " ~y:"386cbb8f7e728751d4f6a75f890502989b51228d3039dd1af7f2dd0186bf97a9ff763b40323b30ab0dc81bf09ef48db72c0cfbe772b3d314927ed19badee7b88b49ee294923714adae30c955d37b99c1dadc4a29f0f8c2b9d1038d17059c586a212a9748720fdec95b428971df1923f08a01d35893d12ed17e0b142ed8e9ef77d440a01d77905b92c51dace1b345cd19f91623a6964288ddee6e9908197f91da9a26f806bb14e2371742f849cdc6ce7a045a704a792e5760d6644eadb7cffaba806b0545fae3b9fadae4e36bdf3b69c6dbbf0d8b053da38b904e9c4b949325b2a005b249276ac36927b31793f80115b5e2f2107f987710380708e2c322894fa8 611 - " ~k:"d223b9e9c662ba6651cdbad84f2616fa223fa8742f783c87c2fb9e8e 612 - " ~r:"c8b8a92e8c101505a1991bcb02fb6e382a3ecbaec8f4374501b657be 613 - " ~s:"20d161cefd584979224379f28d827aa219c572f9600147f4048ba7cf 614 - 615 - " ; case ~msg:"d0a8a1ca0ff2b44b37ff860007334b23be4934ff89051d787ce69d3d7fa734b9779e2f0b38c235391a897fb8514b857b991d10e34a00dc25b0c4382dfb6d53aa87ec1784f1cae2599259406d4756539867679d3088913a138871e2a434747222fcfab079d9e655ba254463cb0c5786b9858dc429ffdadf4c3b6a253f90eeba24 616 - " ~x:"2286424f368e5e64bac0c977ff0d92a560b78e4f21b49f3aee7cdec6 617 - " ~y:"7247d4e1253f0b52a1388b794815db61c1a354cb0f73fd19fede615c1c3025840fff204b0c6e610ebef1113df56f67406badeb99445891dcafe18d28f597126064ddf7aaf203b2fb0d35d2f458bb74341ad937211edc394ec1a3f7909a3f972db27aa135d31bbd7e36c2bbc360585e7bb6e83276406b9525f688ee5995e7aa8ef7a72c27e990d64016b99a0ae4d04b2f1b7d238af88ac4c2e4e0f3294cfee9be2457e48955948cf4bb3a445a1d778cedfa4b86f59f156118034b2b834a9aa121e9d482d6922292823be2991b3b5b42c23925da294d5ea37406eaf78b7dc72519d8f261482d6afff0e567bf6e673dd89960ce734f092d98956352429a91845694 618 - " ~k:"c2795f65f0f077e32c022a703f7eb8e5dc068fa67cb087ef366b243a 619 - " ~r:"9dabff22a43012dbf47d56b9ae5a09f4d739dd69fe907725afcd84f4 620 - " ~s:"b60c44728e4b1390f30238fba1dc1003fdd39507ff5d6ba7e609f2ae 621 - 622 - " ; case ~msg:"e4ffe72c77c3a43af8a61f58f9240e1a07b5c2894d5bdb654b2b994dc0c987bad9b704075d3d0a969cecfc98b1dc20e76cd8e012285819462226a84dcdd67895f6ea278266f1575ea785a2c359f8f4593bef31a58091b64afb84cdfd23e4aaff29d9626f0c823d934283a4faafc9c6cc18622328cad96f77d79b9ba35a43d825 623 - " ~x:"86b0e564ef08e089c4c85675b6e5281daa4e82bc2fc0e27668052e4e 624 - " ~y:"7146009d12b03b2f32305f495fafcc4d452efb85cc80d671ff4249492c6699fb26a89ca4b224d56f6b8e745df9fbc7352ca583222f4deab118f9fec0b34e334060bdc28db872e0090649149499e7a1c197878d3c7262439303b90201d0b7f5be94d0a7c4eb15182935296c3e3fa2d77d74d78f41cadaa40eafd40d017888caa02a474868e40f496b7bc1ce367f503435e0d9a6375aab03c231d9cdaa15de23c48ac0878ef649eb144ce6be4d2de11da202fae82090673c83b32840a32df6176e1d55027d7a1c1c56e642f51aaeccb3c990898061bfa16b3dc1461073c333337fd76a3103f3fde821bc994ebedd6ffd7974d0ca1b54961d7df5b9eebbfa26c3d6 625 - " ~k:"5aba2fdf6b24bf24151943a4f32d2794e44d1f62e8c968ceb5b073c7 626 - " ~r:"4a2abc689d2a63e8b23214a3212a5d20a7386882d5e11c5d5daa66bc 627 - " ~s:"08e0c6547087b58bc94fae247e962da1a2897888d1bc9c8cbf3ad6af 628 - 629 - " ; case ~msg:"f8fec19288f3a8bd1d0d573bbbc180106065697481bed912f8752750d331e3a097775a12276bc4293a78a80748b2b2c37d20b800335c1d1b430a71bbdfd8f7afeeec82ceff2fd33f2624e49d37457f262cf5dedef9025ce96e0b7d499fcc7a7ff06c02590ea821dd8ed060cabcf4feec9592aceddfd32b4c09e4d44938435b82 630 - " ~x:"e5ada29e91ccae11fd060112540eac31d9651b34b2754ee51620624c 631 - " ~y:"7e50011d422986eae01ae68943dca0c87af44f7b879bd1256d4caffa0eb1925029c0633a7ac67487a7b6f98ad77ee7e1442d129d06db475a4f7804fd8c6a038151911f81397e963594b9c91e3bfe94328f056e9bdbb9b11f54939d7e237aafb0c950e0581cabfe94bc26f0e0d5560997bfb0f6357bbf2cadb0108ec0095646e4caa22f71e1f17a9f34e8a8c4b71cf0b1265e001554fa91f18a17562bc0948c431f25945962ba7faf7dcb64ff0b8bdde701e1df620a11aad07196d67a956ebe498ae6f82324f75cafbe80edaabef0037b79c3ed658d9ba1b5422c4ac053ba69bbaf7fa9db990e8b5e7f9af57a79f3e31c07611f502b3015962b02b6b425706e0a 632 - " ~k:"cf0544a08823ea2ad5f13716b43b154aa4bf80d6bbcafe6040ad91c3 633 - " ~r:"2f38c5cf86aa0e53d1fea0e65dd03813640404b8d9a8cd6d264d9285 634 - " ~s:"47603880f3d67ba1a6eabc20137dc4882e417304cb95d622177df511 635 - 636 - " ; case ~msg:"7559465af5ca04c1e74deb9f8e46b0ef17de4d7a2ae0faf4e903a2998bcaa09b7f1730393320ebc57d052d2e98f5486e8e92bd1ee6bb0ffd02d69e5d4591e2fa12e4ebff8b6b9d3270fc75274f8f82e1c60edb2a21f8d5531a2380cbebb24f6457176e54769a136601a9b81da68ff196ff8cc78cf059c04ae22459cec7da89b6 637 - " ~x:"6ba814fb6c1d9fe5d282008dcc9af2761d1b03eb1fd02e2499c1b509 638 - " ~y:"5bcd42e586ca180f743395fc39e2bd393820f5b4c49c7cb76921ec38bb53e864fbe809a033775f16c7f5c64872fedde6abc560488e572955edd3f9569092071e56df211564f33185dbff180e7ab2297700c64db6e220701cb8a21ead2ea809f06a16554319b2739de2aca8057a62d4caa7957a2b9f039b3c7d4fb0761a73302a6fbb583100b239d727158b4cdc9765fe0485afb6a1b0ac0db504a947f3d87faa5542c6eef7a681c5fcd28f4636360f5593bff7e433b6a338d77e3d63f6ceff69536e2a3ff77ace745b65a5160d7fbf9105a90f46ce1c54fa353c8aeebe16fb238c8ed998617b63287511208d9db3f66d503374bbda48a552d04b2c304a15bac0 639 - " ~k:"70af9c79fad2b3a0677fccadd95e6f72eb8a51464e443d1e5c007f98 640 - " ~r:"c5d33f5a4fe2280a9b96d7a9b5530dc17cd1054bf1e8cf6f4aa3e2ac 641 - " ~s:"c9bf1c062bd1e86f3bd3c1ff582c33270537fa7769b9592aef12e104 642 - 643 - " ; case ~msg:"1674823896c5a764c61fd19b125a7d6cd58c883d86794391477349f03616d75b6925e9dcc553dea37047f0cd153168eb26e5ad4b8fe7cc65e4fa275514c842af63507f901fd110b98249133d3d1266d2f967c85b7f88dd76c7f76b786b5572dcae68cc646e458b8278db346b2e970c7870cffd8457fbec06bbb5141575f40fde 644 - " ~x:"b5a607136e5dfa76645f4fee9db17bbcd260b1f6023f28474921714b 645 - " ~y:"5c34135c90f97ebc9bf1ed986eba563e32ce8c25ae7141dfefca8600ad2f3cbe8e45b4a010ae4997820a38b4888187bf207bde438a1ec7befff81a64265a4ce9900b37a38e4fc23613887b638a113ef41665ad2b1f15764cb53607d0eec303ac48c055f5aadabcfbe2c5faa85e029c43e1607a3a29f65802959b686b468e8107c466a7317b5063e038021975b2f017f1f3bad07cd0ebb487964151e4f82bb5277c35a218ec570cb568ad0404a3713ab7fcc1297b1ea9743f85ac5d5a7ec818e5f90a4a58f2c2192bba6dffecbcd39f245cc932953190ee353a0ca99dc61eac4b4f834618140c9a32eca31d718c95ee03b2992c63a683b0628883a5c222fddef0 646 - " ~k:"02e860266b3b7919a3d74f37f4fa9054f62f37959ee1ce66baea3b15 647 - " ~r:"b1a946fa42a36d836daab56fe015c9f29c4544a4a47d482ea2d9cc5b 648 - " ~s:"e2905ee70a5dc099b7e0baec5566b229e9ca8e7e00840966cf56c4d5 649 - 650 - " ; case ~msg:"281fd14ae2e702dbd25f77d8ba8af09fdd77b1839648ab9c880bd119d4475378fcd0d12415abb9f26bfb8e26f108b1298859235ed12e7f9e915628e3ca36c5986d18811a5905aef7878c6300a95ea87182016ec595d32e4dfc274adb47c3ed0f6c38ec893b331f7092f19b724b9fe43f0ef8dec14fb7bf8b9041b5390beb4408 651 - " ~x:"272b54a77c97fdfaaadf12ee05e1279f65e8748ef873c407372aaf80 652 - " ~y:"48ed8fa89d07deb5f8ee6d38748a4e66002020f79ff22d66fa53ad913d596860d4dbcb7c3a6633cd4224a80e5e95908f87b18acc2e364c14b51de6bdda7ad8961dfda454ef4798d0f7a30ef10eae87de40867764b84bc55d7c0283f9c7cd2be08e1852487512ff43a8d1e68a951197c771f9e6c2ffdf2c00ed2163f86dff5241f9e2ff1cdb05a0b3e647e6fd23ccada83b9c5961e6e2fef3297493ddb0e990295d38405a24448e249627c0a7998cc4072dd29139c5336d9856016642992cd245c758a3031ec2807b171abaeef14c82a3dab201752351de2bffa5085c137656e469581f63f86379d62868ac3e3aa24df9826a833314bd41e0d9a0ae5680e6a4d2 653 - " ~k:"bc06f559baf16de28e915dd27485338abf2bd0e62cdda5b3f1ad05f5 654 - " ~r:"5a77639663664e3f0b19fd583bab6e680688cd89d5e012ddcb1e06bc 655 - " ~s:"d41c784b583cbc525bce87c6caa44062eac847bca8b005c12ab5e554 656 - 657 - " ; case ~msg:"503f2042358f7e414296ab2d41f3a1f3f11182eca6c82b2ae6ee833dd737bcb34691793e30110036ae54d403a5ea45cbf3e5515bbf80b1af139853f506792df7ff5235995e080f82b562326adaf321159adeef20388024509f225e8c5235368a7b045d69e472e6b2ad7d470a11f6aa8d4ca6c6cdb0f3ed4e06fb9a95e2cf200c 658 - " ~x:"c3ff27ecdb6a7de642fb2d2f9d93ccb51dd09b543a77fb2e7a22a29f 659 - " ~y:"7e514a04bb575ab93e71b3555cdbac634d475c58c1d9b4802e153a858d027804ea748c2907eb9987f78e41c6757ed5cbf102544a714699a02a9ef14768f96dbbdf48f3b2b3792efb973a7f91f260e0dea28034c915d9d5a87a8f986a15f5d6f98d7d6d35bee7e059aedb59fe595ba7da17ce0db895f3411b832a1e221a831f706587841d9323e0c7f4435703127084b20eda9c6a2497280190a2b5273b231b44482c9253501c66ef1122253be4ea3477ff6186af871869af1ba10f6a15d1c432940317d119dd761ca0342ab606d532c471783a4dcd6fac9b8a67a6bae187c7dc64c7611ded7273dc348cd7613a52d02670e877e18d0b60c8bbdd1adb04eff213 660 - " ~k:"ac8009b8bc2503f5a68d667696c7fbf66ebba6f88ed3db3504c0c9b6 661 - " ~r:"8486ab31c8278fad0691fdd6cac2f5fd790b2f3fed52b09986766042 662 - " ~s:"b6967b9eacde5f4883710eba387b3c6fedfc91944ea51f6ffab72531 663 - 664 - " ; case ~msg:"650c3c409a885fa6d1ac1ff41e15f9001f6cd6a152c376fd22e2851c9cbaa5350d8a92b7401030809395cf0b1a0cb03a24dc3b4347050e8553da0e61d81dee4402b1cec97d898dc6886601024f6bfbc48d2f2c40bf96de9bc0e078e440c771f74e7115ad22ba994ae2f857c7fb865ea750b18c79e7b048563becef8898ced3dd 665 - " ~x:"d39e52c39ea46d6ce274670d3e8a22875cb9873daf4c2ed83bd3be37 666 - " ~y:"55186de39e6a0131adb7d84170a8d36ac4bf313616e750220de356fbb1899dbaaa650d8de9a7afabf3c4dd6a3c8bac241922acbcc4bb7fa4ce5fcdb5f231cb17a8c0978c8e69fb82d44683ebb9fb17898e0ba4939196ed9980ebecabbaad7b5b34cd9ec0ea6df96243823b1d170efccb4d59bcba24ce5faad32d591ad6ece0440d2b62a212059e000fb5005abfec127c1e9fa7d3469c72b89a96976eb4702f09f9c0a0971b30dfc339072b5e3a6ce40bfea2d52f2c930a11dd655dd36ac9fad86fc3986b4871e7c90459a2eaa3b3d22dd04cb824173ccc087d429bb2a188e05d8af0ac2911c907fd957b2bb330a6f3987a595930b312053c4bdf856de7293858 667 - " ~k:"78683cfccca3e13d49999e7bacccb43fa33e11547014baf66b987b83 668 - " ~r:"a0c49d3c47240d30d26f0c20e4508b360a841285de3fc1986f1ef9f6 669 - " ~s:"97caa2b76d15b1f9f177e209004a2b1fdd23a3945034584c2c15bfa2 670 - 671 - " ; case ~msg:"64129153eb9ccc74cc3aae1d5999c6e90d986be6fa40c6c4bc00b1c3f8072d10a9d8e6c314d82a7641f8a3ae29d3e7dd1942dbf0dc52b4b4b35bb67a994942aff029ca6fa18709915ff720ab8f65f231155cb1d0dbcba04fc5193afc71a5eddb4a03867e5c4bb92d37b7ef771da954ec6754d5fbe2e372b92df6a3ea8c3a4aff 672 - " ~x:"a7d5664e781c28f4859f5c126cbe8d87f9b2aa0027149f8b0a921d46 673 - " ~y:"23f538d4ec345faa906eff12f6c5942ac166914baf8e737dafc71e47285512ebc57ebf3ec666342abc059b0ebddb021ceaff6ef75828c7be3766257f7247a67e1408239fa4dd1caac2b7229e8c1bcfd57aeea4c04e1586764e28669c3612d8a006582cf8f82910482691c10e4113216fc24feb299f84ba58700a3bb6fdefa17a7fac9aa9bb410fe411fb294d6294396f7f627dca0452ef595dc24170c147d3863fc16e23645019aca63fcc1152b0f766f5f651c9bb699e2f5047fa1e9603972d2c7551b18f3b16c106ddd6cc2e24d2d05e79687efe655102e6bc15bc3a57f60c1a6ad20bf1cbe62052ad0947437b92b2c932af5d72775d43183bbc6f359a4df6 674 - " ~k:"85adc235c0060b510825ed2b436bdf003f4d63e299e973b5ddc81fc8 675 - " ~r:"3d728962aec35822fff99e1b5217d8a6264a7c608d8066f4fcc9008a 676 - " ~s:"ca5c8e178a14ba006e93cf4ad119f045bbf82b828767d3e583d0bd15 677 - 678 - " ; case ~msg:"9fd2791c41a2ffa6df26109804eaf070122e20bbb62ecd9811551136aa956dc1c321327893a0dde6dd1d5b3a0d2a5aa97ed754e5bc066753338dddfc68eba217d2483505b0d7c0a437732f8046cf3bf5930a11efd3f6599c0f8d465fca7676ce1f39102cc0cdf13281b2c7b9cf7a7afcde681005e5a2e4e38cf82e421357a41f 679 - " ~x:"ddffa0c5aafa1acf98290ce6aa7a48db2ddfec48d6ea881745f2373a 680 - " ~y:"147aa8d9e4ccac906d6a5a0b65bfeb59d4d66037ad40d288d7534fc9ae33c5aa701ca18e60f0b68908280562110af7d1d1bfb538c59d9100980384ae93b77be0332a03cc567d4d634f7648a1b9fd25daf250b2869683e9426d75561a5e1787c2bab71132757dffc4b7665143e7d87d50f12d01075bef5f4b0f14cb3f109d1599e5bf94de0111a01af57e8c13f583be4dc90089619c72d22a495c45256ec787a5832d2e4c4a42f0001837a975ac8fbb8c565f77b253303b1a873306fa5cf6a5dab62d7b1ba3d70dc11b4e4f875e3edae50ee8e5178dd09a334cf9260c3e0a10911d381d7f5601c0b3f26946682018629922946dd73f81240816ae9606911cbfd6 681 - " ~k:"3ee8b1f03687b9726de846f54618ac45f8e2d6e8957ce6996bf50c2d 682 - " ~r:"a7cc7486f47fe62fe3254ed655e1c994902d797f0d7ca93fb97df9c1 683 - " ~s:"914bf7d15ce2c9ecc5ae150d6308fc557d94e1ef18c0860aa68ad48e 684 - 685 - " ; case ~msg:"6b78b4de5f7526dbed08ee0ff4e43335b60cd3bc371b70cd4fd9ce45bf06508391085d142cc3891b179167c76a1350ca8ef8ce754ab1d624572e437195660f004cb7bed2ff3b0f7c7e53f853305a3821dfbaec33e220df3c3ef7a79f34e82cc8fff8415f108c000f21c3bb21a4c33267a213cb4a558e3b370d17c639247bffeb 686 - " ~x:"9da093f73c714e0b9994078b6cc748a675cf4f3bbc502a23895097b3 687 - " ~y:"9147670f64aedfa246938ba77fb9c1ac271ca1091d863f32f00d5ccdebe7022d268ba9051d80fe55dfc5f64b0716c4bb8da4b11e9e283448ed8be4278e93b52d675649abb45956522f92634c92a09ac5a5d603aae2a6d04a435239538de303fc05b9ed5fcb843f0536a8ab942d9c3bdc90feed97449ce309be8ab119676a96c2a60a06692e8cd59e55e6ff8d91fa462966555526c987fc44ba420bbff768f7a7fd363638d5ce4d9ea1edd7fd399d6c65627bbc337f131c7345b3d79b4db7412562547ca2a7c8ea55ebdddd05a4b4200c72ab2b83311152b71c99306c1d3b3d446657be65e58d7cf8a062b225ce937802590546853f192a6a8c8b3ff7a62fcf80 688 - " ~k:"bdd792b1ece3d0ce428cc1294b9d7497208de86929a2aad2ef481557 689 - " ~r:"2f85ee5c32d546c68f0aa2698beae53e2848c375517a570e0f1b5546 690 - " ~s:"547667e8b13f21635a0b106d324d06c85b74a64ce9225cc5e0843581" 691 - ] 958 + [ 959 + case 960 + ~msg: 961 + "e920fc1610718f2b0213d301c0092a51f3c6b0107bbbd8243a9689c044e2d142f202d9d195a5faef4be5acadc9ff6f7d2261e58b517139bcb9489b110423c2e59eb181294ffdae8aad0e624fab974c97f9f5e7dc19d678a9cb3429cf05ec509072856f5adfec6e29bafe8e5ba95593e612843e343111d88a1eaff7dc0a2e277f\n" 962 + ~x:"7b489021578e79e7bd3ee7ab456f659f3dc07c88f5c9a39e4f8cee81\n" 963 + ~y: 964 + "1ae10c786ad0902c5c685dae5c7121418a377b888b5f2f2bc76623570fd62bcb190b471ad5359c5f062f8819289e956d8aa6f90d1f8cf1ee72d3a1bdfd56c478dc29a19c4569b5a60e3a8f34f60656eac5b25dde5514a5c67b675423204f6ccaf0990617cc7355b9d3ed868978a252020a769ed59a6edaa6efe3377eef45f3f6f3e64179cc7db8b143fb835c5d71bfcfa1e2a9049bccf7fe9ab57546220fe3f4b7521c861739d138507e81a46a6993605441dcb90d6ee4afbc42cabe90a254444968109d7edd9694a023239f1d56175dd1fac115915e24fab563f4fc3f269bed2f300832d112596485a711417aa73bb4ac72a651a1fa5baed3636c720d397008\n" 965 + ~k:"37fadd419fcbd2b073a06ae96b9eceb63e29aee9ac5fa2bdb31ab85d\n" 966 + ~r:"65102e8f64ecb11f06017b1a0c0def3c29897c277c4a948b1f4da6b9\n" 967 + ~s:"21ad0abb27bd3c21166cb96aef70c0dbd5f3079cab0dd543d4125bd1\n\n"; 968 + case 969 + ~msg: 970 + "da5e7b051c1859d22f2a3163335d277951973c172e06697c0490ff15b592c1ebd0fa5efa2463119804a3fea224b96b463e30083e002949a24e922031764bb3daff8101fa088af5457af36654c668f234a00cd828cc740a898c0cd3df09315da9b346b325b2fbec475210b75482affa61a3eff50c83c3a039fae5cfa8d971fddd\n" 971 + ~x:"9d8bba124417c126c1c011115906a7bdb7a493661d8a945e32cb283c\n" 972 + ~y: 973 + "5e276987b847b852cc372e986e8aba0633dd46c461bab58acae056d4d1a9df03a19df114f648b28e038506fd09ad0d95449d9d8058aa1b241b2acd3badbf9882697331de45b452345c051c2cd830f7cdd7486b1166b93891a72a8b7dc6228bad708720ef33235801c4d4c3c4f28036df6029a195d0019124d16fe8f76c525b7e8f04bf4b8d8ba6ef608e623224fa8d988420f40526c25ae3e4c79d5ae7fee69793e02bad9651ea0fefd3eadc5ff1ca2d142930355b1f3aea102221fa17b735a18af3b83327c8f33efb9a49b70211014eba43fa65eeaf25ebf452bc4b7dc1f407d0cf1b834619b5f73c6cab7051c92070aa06f7f9406c507d1a15d12c11bc839a\n" 974 + ~k:"1abaec5b4efaa83403fa970ff6027fdb596359df930a02baa12ed854\n" 975 + ~r:"313615836f0d338d81b670f116a5414d2ce90ea5ca5308ba4f0c8a7d\n" 976 + ~s:"dc1d4c3c06203fd598a476c891dfe5934162d0d35f37f1c09dd6395d\n\n"; 977 + case 978 + ~msg: 979 + "f49895b3290d9aaeb4af611c5e30afc0047dd42c07216211d54977d1497fa4ee6abe11000d6ac04d24b4c50f31e06ee8a74774d3d304137cc6b114d145250ee7e94a12a1ab592ae307ef5d930cf39170e9756adc5e7ba62a54abb6f047b4500b6121e1f4a95d3c6a96f7f8333cbb1ebeed8b4db1a7fe75f4071cebfbbdfdab90\n" 980 + ~x:"b9174a6cb4d3b2e7e4d168078e920ecb651343223575dd37c0677371\n" 981 + ~y: 982 + "6d622525ecf54dbecaa811939ee07ef2975d9da9f7a3c58bbb893ce3880677404f2c6e5963b8c0b4492601f15bc6fdfd747a00ab8334e9053201e1c9fba55fbfde36ec54237501b87416992771cb5ab8781d0a967b7f14f3d5de6b1665f662885878e50ad37827b95c8f0e21d6bbebc9dfd47b2957d2fcdd1a2b25a616e698129b45998b6b6aa2a99c1ebf4275493e28eef1ae34e9ca63cd8886da58572907aa9b714e89bd3644a7ea029fa3a4ae9c26e665c85296204fdf86b7b1dd7866bc8e9385e9518a270248292594c54a4a03dc1492664ddae53277c6fbb9dd0cdd99bf11eaf6ae31923e4f979a7f581799dc432b1940f613a7a7ea6855237f776e91d4\n" 983 + ~k:"1c52eec9523245bd82707f2ebdb05fee6d34749f23023ba72a5a60ef\n" 984 + ~r:"79d544cdecfd1ec1b7d1ba6322a5e0eb858aeb4b76d5b3202cea233a\n" 985 + ~s:"0ea53dea4ccb25978a0af5529598911b47c25e0ba3b2a0505fd1d7fc\n\n"; 986 + case 987 + ~msg: 988 + "31d739566914549eb25726bf6d4b6c674f479ba7a406acd108a106f36c7f5214976dcf3adf2c83fd26b37d52c0b5ff51e6b3811a8dcb026a1fbb52f95027ea6034d91149b30ab4928ede26ddd692ddb8ddd929fbff83fc673788faa0ba5d967fd1339299e55be51cea80609d2b3c3433cf713a9686e229336cfa7e720fd5303d\n" 989 + ~x:"4cb56c8acb9c107087837ef5e021f77cb015023c8ac1ec73575e5289\n" 990 + ~y: 991 + "386cbb8f7e728751d4f6a75f890502989b51228d3039dd1af7f2dd0186bf97a9ff763b40323b30ab0dc81bf09ef48db72c0cfbe772b3d314927ed19badee7b88b49ee294923714adae30c955d37b99c1dadc4a29f0f8c2b9d1038d17059c586a212a9748720fdec95b428971df1923f08a01d35893d12ed17e0b142ed8e9ef77d440a01d77905b92c51dace1b345cd19f91623a6964288ddee6e9908197f91da9a26f806bb14e2371742f849cdc6ce7a045a704a792e5760d6644eadb7cffaba806b0545fae3b9fadae4e36bdf3b69c6dbbf0d8b053da38b904e9c4b949325b2a005b249276ac36927b31793f80115b5e2f2107f987710380708e2c322894fa8\n" 992 + ~k:"d223b9e9c662ba6651cdbad84f2616fa223fa8742f783c87c2fb9e8e\n" 993 + ~r:"c8b8a92e8c101505a1991bcb02fb6e382a3ecbaec8f4374501b657be\n" 994 + ~s:"20d161cefd584979224379f28d827aa219c572f9600147f4048ba7cf\n\n"; 995 + case 996 + ~msg: 997 + "d0a8a1ca0ff2b44b37ff860007334b23be4934ff89051d787ce69d3d7fa734b9779e2f0b38c235391a897fb8514b857b991d10e34a00dc25b0c4382dfb6d53aa87ec1784f1cae2599259406d4756539867679d3088913a138871e2a434747222fcfab079d9e655ba254463cb0c5786b9858dc429ffdadf4c3b6a253f90eeba24\n" 998 + ~x:"2286424f368e5e64bac0c977ff0d92a560b78e4f21b49f3aee7cdec6\n" 999 + ~y: 1000 + "7247d4e1253f0b52a1388b794815db61c1a354cb0f73fd19fede615c1c3025840fff204b0c6e610ebef1113df56f67406badeb99445891dcafe18d28f597126064ddf7aaf203b2fb0d35d2f458bb74341ad937211edc394ec1a3f7909a3f972db27aa135d31bbd7e36c2bbc360585e7bb6e83276406b9525f688ee5995e7aa8ef7a72c27e990d64016b99a0ae4d04b2f1b7d238af88ac4c2e4e0f3294cfee9be2457e48955948cf4bb3a445a1d778cedfa4b86f59f156118034b2b834a9aa121e9d482d6922292823be2991b3b5b42c23925da294d5ea37406eaf78b7dc72519d8f261482d6afff0e567bf6e673dd89960ce734f092d98956352429a91845694\n" 1001 + ~k:"c2795f65f0f077e32c022a703f7eb8e5dc068fa67cb087ef366b243a\n" 1002 + ~r:"9dabff22a43012dbf47d56b9ae5a09f4d739dd69fe907725afcd84f4\n" 1003 + ~s:"b60c44728e4b1390f30238fba1dc1003fdd39507ff5d6ba7e609f2ae\n\n"; 1004 + case 1005 + ~msg: 1006 + "e4ffe72c77c3a43af8a61f58f9240e1a07b5c2894d5bdb654b2b994dc0c987bad9b704075d3d0a969cecfc98b1dc20e76cd8e012285819462226a84dcdd67895f6ea278266f1575ea785a2c359f8f4593bef31a58091b64afb84cdfd23e4aaff29d9626f0c823d934283a4faafc9c6cc18622328cad96f77d79b9ba35a43d825\n" 1007 + ~x:"86b0e564ef08e089c4c85675b6e5281daa4e82bc2fc0e27668052e4e\n" 1008 + ~y: 1009 + "7146009d12b03b2f32305f495fafcc4d452efb85cc80d671ff4249492c6699fb26a89ca4b224d56f6b8e745df9fbc7352ca583222f4deab118f9fec0b34e334060bdc28db872e0090649149499e7a1c197878d3c7262439303b90201d0b7f5be94d0a7c4eb15182935296c3e3fa2d77d74d78f41cadaa40eafd40d017888caa02a474868e40f496b7bc1ce367f503435e0d9a6375aab03c231d9cdaa15de23c48ac0878ef649eb144ce6be4d2de11da202fae82090673c83b32840a32df6176e1d55027d7a1c1c56e642f51aaeccb3c990898061bfa16b3dc1461073c333337fd76a3103f3fde821bc994ebedd6ffd7974d0ca1b54961d7df5b9eebbfa26c3d6\n" 1010 + ~k:"5aba2fdf6b24bf24151943a4f32d2794e44d1f62e8c968ceb5b073c7\n" 1011 + ~r:"4a2abc689d2a63e8b23214a3212a5d20a7386882d5e11c5d5daa66bc\n" 1012 + ~s:"08e0c6547087b58bc94fae247e962da1a2897888d1bc9c8cbf3ad6af\n\n"; 1013 + case 1014 + ~msg: 1015 + "f8fec19288f3a8bd1d0d573bbbc180106065697481bed912f8752750d331e3a097775a12276bc4293a78a80748b2b2c37d20b800335c1d1b430a71bbdfd8f7afeeec82ceff2fd33f2624e49d37457f262cf5dedef9025ce96e0b7d499fcc7a7ff06c02590ea821dd8ed060cabcf4feec9592aceddfd32b4c09e4d44938435b82\n" 1016 + ~x:"e5ada29e91ccae11fd060112540eac31d9651b34b2754ee51620624c\n" 1017 + ~y: 1018 + "7e50011d422986eae01ae68943dca0c87af44f7b879bd1256d4caffa0eb1925029c0633a7ac67487a7b6f98ad77ee7e1442d129d06db475a4f7804fd8c6a038151911f81397e963594b9c91e3bfe94328f056e9bdbb9b11f54939d7e237aafb0c950e0581cabfe94bc26f0e0d5560997bfb0f6357bbf2cadb0108ec0095646e4caa22f71e1f17a9f34e8a8c4b71cf0b1265e001554fa91f18a17562bc0948c431f25945962ba7faf7dcb64ff0b8bdde701e1df620a11aad07196d67a956ebe498ae6f82324f75cafbe80edaabef0037b79c3ed658d9ba1b5422c4ac053ba69bbaf7fa9db990e8b5e7f9af57a79f3e31c07611f502b3015962b02b6b425706e0a\n" 1019 + ~k:"cf0544a08823ea2ad5f13716b43b154aa4bf80d6bbcafe6040ad91c3\n" 1020 + ~r:"2f38c5cf86aa0e53d1fea0e65dd03813640404b8d9a8cd6d264d9285\n" 1021 + ~s:"47603880f3d67ba1a6eabc20137dc4882e417304cb95d622177df511\n\n"; 1022 + case 1023 + ~msg: 1024 + "7559465af5ca04c1e74deb9f8e46b0ef17de4d7a2ae0faf4e903a2998bcaa09b7f1730393320ebc57d052d2e98f5486e8e92bd1ee6bb0ffd02d69e5d4591e2fa12e4ebff8b6b9d3270fc75274f8f82e1c60edb2a21f8d5531a2380cbebb24f6457176e54769a136601a9b81da68ff196ff8cc78cf059c04ae22459cec7da89b6\n" 1025 + ~x:"6ba814fb6c1d9fe5d282008dcc9af2761d1b03eb1fd02e2499c1b509\n" 1026 + ~y: 1027 + "5bcd42e586ca180f743395fc39e2bd393820f5b4c49c7cb76921ec38bb53e864fbe809a033775f16c7f5c64872fedde6abc560488e572955edd3f9569092071e56df211564f33185dbff180e7ab2297700c64db6e220701cb8a21ead2ea809f06a16554319b2739de2aca8057a62d4caa7957a2b9f039b3c7d4fb0761a73302a6fbb583100b239d727158b4cdc9765fe0485afb6a1b0ac0db504a947f3d87faa5542c6eef7a681c5fcd28f4636360f5593bff7e433b6a338d77e3d63f6ceff69536e2a3ff77ace745b65a5160d7fbf9105a90f46ce1c54fa353c8aeebe16fb238c8ed998617b63287511208d9db3f66d503374bbda48a552d04b2c304a15bac0\n" 1028 + ~k:"70af9c79fad2b3a0677fccadd95e6f72eb8a51464e443d1e5c007f98\n" 1029 + ~r:"c5d33f5a4fe2280a9b96d7a9b5530dc17cd1054bf1e8cf6f4aa3e2ac\n" 1030 + ~s:"c9bf1c062bd1e86f3bd3c1ff582c33270537fa7769b9592aef12e104\n\n"; 1031 + case 1032 + ~msg: 1033 + "1674823896c5a764c61fd19b125a7d6cd58c883d86794391477349f03616d75b6925e9dcc553dea37047f0cd153168eb26e5ad4b8fe7cc65e4fa275514c842af63507f901fd110b98249133d3d1266d2f967c85b7f88dd76c7f76b786b5572dcae68cc646e458b8278db346b2e970c7870cffd8457fbec06bbb5141575f40fde\n" 1034 + ~x:"b5a607136e5dfa76645f4fee9db17bbcd260b1f6023f28474921714b\n" 1035 + ~y: 1036 + "5c34135c90f97ebc9bf1ed986eba563e32ce8c25ae7141dfefca8600ad2f3cbe8e45b4a010ae4997820a38b4888187bf207bde438a1ec7befff81a64265a4ce9900b37a38e4fc23613887b638a113ef41665ad2b1f15764cb53607d0eec303ac48c055f5aadabcfbe2c5faa85e029c43e1607a3a29f65802959b686b468e8107c466a7317b5063e038021975b2f017f1f3bad07cd0ebb487964151e4f82bb5277c35a218ec570cb568ad0404a3713ab7fcc1297b1ea9743f85ac5d5a7ec818e5f90a4a58f2c2192bba6dffecbcd39f245cc932953190ee353a0ca99dc61eac4b4f834618140c9a32eca31d718c95ee03b2992c63a683b0628883a5c222fddef0\n" 1037 + ~k:"02e860266b3b7919a3d74f37f4fa9054f62f37959ee1ce66baea3b15\n" 1038 + ~r:"b1a946fa42a36d836daab56fe015c9f29c4544a4a47d482ea2d9cc5b\n" 1039 + ~s:"e2905ee70a5dc099b7e0baec5566b229e9ca8e7e00840966cf56c4d5\n\n"; 1040 + case 1041 + ~msg: 1042 + "281fd14ae2e702dbd25f77d8ba8af09fdd77b1839648ab9c880bd119d4475378fcd0d12415abb9f26bfb8e26f108b1298859235ed12e7f9e915628e3ca36c5986d18811a5905aef7878c6300a95ea87182016ec595d32e4dfc274adb47c3ed0f6c38ec893b331f7092f19b724b9fe43f0ef8dec14fb7bf8b9041b5390beb4408\n" 1043 + ~x:"272b54a77c97fdfaaadf12ee05e1279f65e8748ef873c407372aaf80\n" 1044 + ~y: 1045 + "48ed8fa89d07deb5f8ee6d38748a4e66002020f79ff22d66fa53ad913d596860d4dbcb7c3a6633cd4224a80e5e95908f87b18acc2e364c14b51de6bdda7ad8961dfda454ef4798d0f7a30ef10eae87de40867764b84bc55d7c0283f9c7cd2be08e1852487512ff43a8d1e68a951197c771f9e6c2ffdf2c00ed2163f86dff5241f9e2ff1cdb05a0b3e647e6fd23ccada83b9c5961e6e2fef3297493ddb0e990295d38405a24448e249627c0a7998cc4072dd29139c5336d9856016642992cd245c758a3031ec2807b171abaeef14c82a3dab201752351de2bffa5085c137656e469581f63f86379d62868ac3e3aa24df9826a833314bd41e0d9a0ae5680e6a4d2\n" 1046 + ~k:"bc06f559baf16de28e915dd27485338abf2bd0e62cdda5b3f1ad05f5\n" 1047 + ~r:"5a77639663664e3f0b19fd583bab6e680688cd89d5e012ddcb1e06bc\n" 1048 + ~s:"d41c784b583cbc525bce87c6caa44062eac847bca8b005c12ab5e554\n\n"; 1049 + case 1050 + ~msg: 1051 + "503f2042358f7e414296ab2d41f3a1f3f11182eca6c82b2ae6ee833dd737bcb34691793e30110036ae54d403a5ea45cbf3e5515bbf80b1af139853f506792df7ff5235995e080f82b562326adaf321159adeef20388024509f225e8c5235368a7b045d69e472e6b2ad7d470a11f6aa8d4ca6c6cdb0f3ed4e06fb9a95e2cf200c\n" 1052 + ~x:"c3ff27ecdb6a7de642fb2d2f9d93ccb51dd09b543a77fb2e7a22a29f\n" 1053 + ~y: 1054 + "7e514a04bb575ab93e71b3555cdbac634d475c58c1d9b4802e153a858d027804ea748c2907eb9987f78e41c6757ed5cbf102544a714699a02a9ef14768f96dbbdf48f3b2b3792efb973a7f91f260e0dea28034c915d9d5a87a8f986a15f5d6f98d7d6d35bee7e059aedb59fe595ba7da17ce0db895f3411b832a1e221a831f706587841d9323e0c7f4435703127084b20eda9c6a2497280190a2b5273b231b44482c9253501c66ef1122253be4ea3477ff6186af871869af1ba10f6a15d1c432940317d119dd761ca0342ab606d532c471783a4dcd6fac9b8a67a6bae187c7dc64c7611ded7273dc348cd7613a52d02670e877e18d0b60c8bbdd1adb04eff213\n" 1055 + ~k:"ac8009b8bc2503f5a68d667696c7fbf66ebba6f88ed3db3504c0c9b6\n" 1056 + ~r:"8486ab31c8278fad0691fdd6cac2f5fd790b2f3fed52b09986766042\n" 1057 + ~s:"b6967b9eacde5f4883710eba387b3c6fedfc91944ea51f6ffab72531\n\n"; 1058 + case 1059 + ~msg: 1060 + "650c3c409a885fa6d1ac1ff41e15f9001f6cd6a152c376fd22e2851c9cbaa5350d8a92b7401030809395cf0b1a0cb03a24dc3b4347050e8553da0e61d81dee4402b1cec97d898dc6886601024f6bfbc48d2f2c40bf96de9bc0e078e440c771f74e7115ad22ba994ae2f857c7fb865ea750b18c79e7b048563becef8898ced3dd\n" 1061 + ~x:"d39e52c39ea46d6ce274670d3e8a22875cb9873daf4c2ed83bd3be37\n" 1062 + ~y: 1063 + "55186de39e6a0131adb7d84170a8d36ac4bf313616e750220de356fbb1899dbaaa650d8de9a7afabf3c4dd6a3c8bac241922acbcc4bb7fa4ce5fcdb5f231cb17a8c0978c8e69fb82d44683ebb9fb17898e0ba4939196ed9980ebecabbaad7b5b34cd9ec0ea6df96243823b1d170efccb4d59bcba24ce5faad32d591ad6ece0440d2b62a212059e000fb5005abfec127c1e9fa7d3469c72b89a96976eb4702f09f9c0a0971b30dfc339072b5e3a6ce40bfea2d52f2c930a11dd655dd36ac9fad86fc3986b4871e7c90459a2eaa3b3d22dd04cb824173ccc087d429bb2a188e05d8af0ac2911c907fd957b2bb330a6f3987a595930b312053c4bdf856de7293858\n" 1064 + ~k:"78683cfccca3e13d49999e7bacccb43fa33e11547014baf66b987b83\n" 1065 + ~r:"a0c49d3c47240d30d26f0c20e4508b360a841285de3fc1986f1ef9f6\n" 1066 + ~s:"97caa2b76d15b1f9f177e209004a2b1fdd23a3945034584c2c15bfa2\n\n"; 1067 + case 1068 + ~msg: 1069 + "64129153eb9ccc74cc3aae1d5999c6e90d986be6fa40c6c4bc00b1c3f8072d10a9d8e6c314d82a7641f8a3ae29d3e7dd1942dbf0dc52b4b4b35bb67a994942aff029ca6fa18709915ff720ab8f65f231155cb1d0dbcba04fc5193afc71a5eddb4a03867e5c4bb92d37b7ef771da954ec6754d5fbe2e372b92df6a3ea8c3a4aff\n" 1070 + ~x:"a7d5664e781c28f4859f5c126cbe8d87f9b2aa0027149f8b0a921d46\n" 1071 + ~y: 1072 + "23f538d4ec345faa906eff12f6c5942ac166914baf8e737dafc71e47285512ebc57ebf3ec666342abc059b0ebddb021ceaff6ef75828c7be3766257f7247a67e1408239fa4dd1caac2b7229e8c1bcfd57aeea4c04e1586764e28669c3612d8a006582cf8f82910482691c10e4113216fc24feb299f84ba58700a3bb6fdefa17a7fac9aa9bb410fe411fb294d6294396f7f627dca0452ef595dc24170c147d3863fc16e23645019aca63fcc1152b0f766f5f651c9bb699e2f5047fa1e9603972d2c7551b18f3b16c106ddd6cc2e24d2d05e79687efe655102e6bc15bc3a57f60c1a6ad20bf1cbe62052ad0947437b92b2c932af5d72775d43183bbc6f359a4df6\n" 1073 + ~k:"85adc235c0060b510825ed2b436bdf003f4d63e299e973b5ddc81fc8\n" 1074 + ~r:"3d728962aec35822fff99e1b5217d8a6264a7c608d8066f4fcc9008a\n" 1075 + ~s:"ca5c8e178a14ba006e93cf4ad119f045bbf82b828767d3e583d0bd15\n\n"; 1076 + case 1077 + ~msg: 1078 + "9fd2791c41a2ffa6df26109804eaf070122e20bbb62ecd9811551136aa956dc1c321327893a0dde6dd1d5b3a0d2a5aa97ed754e5bc066753338dddfc68eba217d2483505b0d7c0a437732f8046cf3bf5930a11efd3f6599c0f8d465fca7676ce1f39102cc0cdf13281b2c7b9cf7a7afcde681005e5a2e4e38cf82e421357a41f\n" 1079 + ~x:"ddffa0c5aafa1acf98290ce6aa7a48db2ddfec48d6ea881745f2373a\n" 1080 + ~y: 1081 + "147aa8d9e4ccac906d6a5a0b65bfeb59d4d66037ad40d288d7534fc9ae33c5aa701ca18e60f0b68908280562110af7d1d1bfb538c59d9100980384ae93b77be0332a03cc567d4d634f7648a1b9fd25daf250b2869683e9426d75561a5e1787c2bab71132757dffc4b7665143e7d87d50f12d01075bef5f4b0f14cb3f109d1599e5bf94de0111a01af57e8c13f583be4dc90089619c72d22a495c45256ec787a5832d2e4c4a42f0001837a975ac8fbb8c565f77b253303b1a873306fa5cf6a5dab62d7b1ba3d70dc11b4e4f875e3edae50ee8e5178dd09a334cf9260c3e0a10911d381d7f5601c0b3f26946682018629922946dd73f81240816ae9606911cbfd6\n" 1082 + ~k:"3ee8b1f03687b9726de846f54618ac45f8e2d6e8957ce6996bf50c2d\n" 1083 + ~r:"a7cc7486f47fe62fe3254ed655e1c994902d797f0d7ca93fb97df9c1\n" 1084 + ~s:"914bf7d15ce2c9ecc5ae150d6308fc557d94e1ef18c0860aa68ad48e\n\n"; 1085 + case 1086 + ~msg: 1087 + "6b78b4de5f7526dbed08ee0ff4e43335b60cd3bc371b70cd4fd9ce45bf06508391085d142cc3891b179167c76a1350ca8ef8ce754ab1d624572e437195660f004cb7bed2ff3b0f7c7e53f853305a3821dfbaec33e220df3c3ef7a79f34e82cc8fff8415f108c000f21c3bb21a4c33267a213cb4a558e3b370d17c639247bffeb\n" 1088 + ~x:"9da093f73c714e0b9994078b6cc748a675cf4f3bbc502a23895097b3\n" 1089 + ~y: 1090 + "9147670f64aedfa246938ba77fb9c1ac271ca1091d863f32f00d5ccdebe7022d268ba9051d80fe55dfc5f64b0716c4bb8da4b11e9e283448ed8be4278e93b52d675649abb45956522f92634c92a09ac5a5d603aae2a6d04a435239538de303fc05b9ed5fcb843f0536a8ab942d9c3bdc90feed97449ce309be8ab119676a96c2a60a06692e8cd59e55e6ff8d91fa462966555526c987fc44ba420bbff768f7a7fd363638d5ce4d9ea1edd7fd399d6c65627bbc337f131c7345b3d79b4db7412562547ca2a7c8ea55ebdddd05a4b4200c72ab2b83311152b71c99306c1d3b3d446657be65e58d7cf8a062b225ce937802590546853f192a6a8c8b3ff7a62fcf80\n" 1091 + ~k:"bdd792b1ece3d0ce428cc1294b9d7497208de86929a2aad2ef481557\n" 1092 + ~r:"2f85ee5c32d546c68f0aa2698beae53e2848c375517a570e0f1b5546\n" 1093 + ~s:"547667e8b13f21635a0b106d324d06c85b74a64ce9225cc5e0843581"; 1094 + ] 692 1095 693 1096 let sha256_n224_cases = 694 1097 (* [mod = L=2048, N=224, SHA-256] *) 695 - let domain = params 696 - ~p:"a4c7eaab42c4c73b757770916489f17cd50725cd0a4bc4e1cf67f763b8c1de2d6dab9856baafb008f365b18a42e14dc51f350b88eca0209c5aa4fd71a7a96c765f5901c21e720570d7837bec7c76d2e49344731ca39405d0a879b9e0dcd1a8125fd130ec1e783e654b94e3002e6b629e904ab3877867720cbd54b4270a9e15cd028c7cc796f06c272a660951928fdbeb2dca061b41e932257305742ff16e2f429191d5e5f1a6ddf6e78c5d7722cff80a9c0bd5c8d7aeba8c04438992b075e307c1534c49ad380f477f5f7987dc172c161dca38dcaf3fb3846c72c9119a5299adc748951b3dce0d00d4a9013800b2008203b72465bc6a84ae059a30c4522dea57 697 - " ~q:"ce89fe332b8e4eb3d1e8ddcea5d163a5bc13b63f16993755427aef43 698 - " ~g:"8c465edf5a180730291e080dfc5385397a5006450dba2efe0129264fbd897bb5579ca0eab19aa278220424724b4f2a6f6ee6328432abf661380646097233505339c5519d357d7112b6eec938b85d5aa75cc2e38092f0a530acb54e50fe82c4d562fb0f3036b80b30334023ebbe6637a0010b00c7db86371168563671e1e0f028aedbd45d2d572621a609982a073e51aae27707afbeef29e2ecee84d7a6d5da382be3a35f42b6c66849202ab19d025b869d08776476d1ab981475ad2ad2f3e6fd07e30696d90a626816df60d6ca7afd7b482f942f83b45cc82933731f87faee320900f2aa3e70b1867e1430e40be67c07f9290299ef067b8b24a7515b3f992c07" 1098 + let domain = 1099 + params 1100 + ~p: 1101 + "a4c7eaab42c4c73b757770916489f17cd50725cd0a4bc4e1cf67f763b8c1de2d6dab9856baafb008f365b18a42e14dc51f350b88eca0209c5aa4fd71a7a96c765f5901c21e720570d7837bec7c76d2e49344731ca39405d0a879b9e0dcd1a8125fd130ec1e783e654b94e3002e6b629e904ab3877867720cbd54b4270a9e15cd028c7cc796f06c272a660951928fdbeb2dca061b41e932257305742ff16e2f429191d5e5f1a6ddf6e78c5d7722cff80a9c0bd5c8d7aeba8c04438992b075e307c1534c49ad380f477f5f7987dc172c161dca38dcaf3fb3846c72c9119a5299adc748951b3dce0d00d4a9013800b2008203b72465bc6a84ae059a30c4522dea57\n" 1102 + ~q:"ce89fe332b8e4eb3d1e8ddcea5d163a5bc13b63f16993755427aef43\n" 1103 + ~g: 1104 + "8c465edf5a180730291e080dfc5385397a5006450dba2efe0129264fbd897bb5579ca0eab19aa278220424724b4f2a6f6ee6328432abf661380646097233505339c5519d357d7112b6eec938b85d5aa75cc2e38092f0a530acb54e50fe82c4d562fb0f3036b80b30334023ebbe6637a0010b00c7db86371168563671e1e0f028aedbd45d2d572621a609982a073e51aae27707afbeef29e2ecee84d7a6d5da382be3a35f42b6c66849202ab19d025b869d08776476d1ab981475ad2ad2f3e6fd07e30696d90a626816df60d6ca7afd7b482f942f83b45cc82933731f87faee320900f2aa3e70b1867e1430e40be67c07f9290299ef067b8b24a7515b3f992c07" 699 1105 in 700 1106 let case = case_of ~domain ~hash:Digestif.sha256 in 701 1107 702 - [ case ~msg:"cec8d2843dee7cb5f9119b75562585e05c5ce2f4e6457e9bcc3c1c781ccd2c0442b6282aea610f7161dcede176e774861f7d2691be6c894ac3ebf80c0fab21e52a3e63ae0b35025762ccd6c9e1fecc7f9fe00aa55c0c3ae33ae88f66187f9598eba9f863171f3f56484625bf39d883427349b8671d9bb7d396180694e5b546ae 703 - " ~x:"551595eccbb003b0bf8ddda184a59da51e459a0d28205e5592ca4cb1 704 - " ~y:"748a40237211a2d9852596e7a891f43d4eb0ee48826c9cfb336bbb68dbe5a5e16b2e1271d4d13de03644bb85ef6be523a4d4d88415bcd596ba8e0a3c4f6439e981ed013d7d9c70336febf7d420cfed02c267457bb3f3e7c82145d2af54830b942ec74a5d503e4226cd25dd75decd3f50f0a858155d7be799410836ddc559ce99e1ae513808fdaeac34843dd7258f16f67f19205f6f139251a4186da8496d5e90d3fecf8ed10be6c25ff5eb33d960c9a8f4c581c8c724ca43b761e9fdb5af66bffb9d2ebb11a6b504a1fbe4f834ecb6ac254cab513e943b9a953a7084b3305c661bfad434f6a835503c9ade7f4a57f5c965ec301ecde938ee31b4deb038af97b3 705 - " ~k:"6f326546aa174b3d319ef7331ec8dfd363dd78ae583a920165ff7e54 706 - " ~r:"9c5fa46879ddaf5c14f07dfb5320715f67a6fec179e3ad53342fb6d1 707 - " ~s:"c3e17e7b3c4d0ac8d49f4dd0f04c16a094f42da0afcc6c90f5f1bbc8 708 - 709 - " ; case ~msg:"f3bb27bf9d412f13229a56d2d1533eae63f40004c143c6b92f6e606d263dd2da7581e5eb20b6cd021e3ab63b498abafce01b4ad7ac8628f7a1849c4e454f1168ae97adfab1fadbd313fca7381726f5045752dabaad6ea3250d303a5496bba2fa4895ae49f06a9aa6451ae70cf33b5f06fa17cac0144f28bd19fb2ac041a578ed 710 - " ~x:"027d0171598e7ecf23f2922d0257e604291cefa77b5cfaf1b3e31ac4 711 - " ~y:"00c7aabe30fa4c3d1ba85e7ae0aae79360e5eab3041bcaaa5d321c92f3471e4194c10484cff152bade6b7d619cf286773475298f883efdf64c08b692583de31be0a4e2b8e8d508ec145c65a369ce6195446c52d02372eba562f9a9d7cb24d2ec3b0a1ab833e4d7623b0455a41eec759d07a3c8a20d88a926408c20f1675601be53cffd65617b66fd4eb353a1f2db31f66343b07faf60de0b6a680809c6166adbf5e504c5c61babb84be72c02d3ebeee066d9eab0d0ecdfe01b8ccd6728ee9123b9d21154b2bc9a134363566402291ac8a484ee32eb884046d40fde7cabbf51d1d1206df1c5ecf290ab7ea72abb5bd3be8d91c02bb63f809718ba1d380af88331 712 - " ~k:"7494772f199ab7a7e9a248f6c2df918c9da62dc2d4176b7db9419b37 713 - " ~r:"79a6aed73ce177ed3581f5d181a77f000d6358514ea95cb0388a6add 714 - " ~s:"2b8597a694564e267b6f250a4c76361f8cdf49863a7902afa48fd6d8 715 - 716 - " ; case ~msg:"e714c01631704e9447390f5c315c9615a7a52863b143706583f661595c505aec477eeb5ad6d640ca812ce11750b67bc8bede2e4f9618dbe7376cab6231b21248ec914ae182df8753362d2118a65e66f64018810804ad97fcc1a87b8c9f349d1001e4b09b046991e6abe6338fbef7be48f1c80c350d2962eb6b8fce25b69f8dc9 717 - " ~x:"6911c21a3da88d54ff9ab58ae2075a2affa3f3eb656978ea26bfa702 718 - " ~y:"04d301f001821b03c91394c520839ab6aaa95325c108a02dad9db48b3c8033d6443bcbf05045230ca88aaf98a8c4cb6b095b352d91b4c416f632fab49d45ac90699a5a419630a81d473bc89122eb5bacb91c40caa4e4bcc476f3ca77bf6a21037a06be24f11c645b0c21b857fdc5c04fbbf0a26efc569cdbb0ea989ba0e037c23f22b0c5f1643d77d98f2de248ccc36672d397d30c1c5e1319fc7e5842ae1a9fcd9e96fe890a74ddee91a39ce732e4c0eaf7094b53b7b409303860b0b4944cc81b4a42d40538cfe512b9680e0a281b1fbbf639139e8066ad638cf846c9ea51fb4c4ef84921f16a6ca3f2bd158157c551739c9d023e270b3de7c2f1d7683cf809 719 - " ~k:"bfb79665f7d6df843d2c39357173e415724c83e1a10932efb9e22676 720 - " ~r:"790b4dcae31fe45cd3a7bb6fa10dcf9ede1f067123f93baad7edb489 721 - " ~s:"71e3e46dfe040496ce4c5e490f6944a23cd5e66ce9b4d9acbe4130ce 722 - 723 - " ; case ~msg:"3f6e482fd484ed3d07f1d0761f2d60fc96d46eb0ecd10a59dd4f392e3d3b2cbe184010e132685578b1f6303239798a5303a81169d4f52fba0d20a42834de293e3a7b32848b65dd308eef5350d633297465425b7b1595ffc8ea7b125896f89e2844561635f52ec62fab2ecfea288d23f0a771cd6311806103135172cf9fef1455 724 - " ~x:"20328083aa86511140324fd0357067a1d6abfc316e77fe3d260f0ef2 725 - " ~y:"9fc1b292ebe15531579f35dda8d706bee0da857cd696a10af770dc356232736cf893f7411a9d2718b39f388118d177cd8d0fd7ca3b3c220f3aa743d8b167219d3c2c783e1f09d8b8df8ec7e17578c5329488c87a89678d2818a99366b785d53f6ca6995e193ba5ca26c00b849f9027ca5df5bb7ec87fe78735ae880f1a97dabc3ca7985d8cbc81be824c1ffb953f1096bf926226fb5e9d4ad43e9363da5e6b738c9a2f951ab3294e2b2822cf5282bb4134158aa90ab9c8f0f64d05a0d625a75bc2d6a4ae3dd11fc05ede7b6647ae7c0750ddb273fe5f8828318a91db3172ad59166aacf2da4f3704d169ebc860d9e1c6464abc2b653013774d29375b77bac1ec 726 - " ~k:"8f4398bb9fe1b393c1d90a62e178899261fa0501c98bd9a8178b364c 727 - " ~r:"3b5d8034c4b8ad9701bf29b10006db69d017fde8638079dd7bbface7 728 - " ~s:"cde01df54a66cef3c0538648525b250cb1f08707f5ff114bdebff8f7 729 - 730 - " ; case ~msg:"31a278f881fdd375565c0f28ff7575f216110486d6fe08dae8fd072950978bdff601ded1ef226b5d904c47f7142a8f4665e03efe5870da2dd1ab80e449f5c757b3b6996a9dc0b5b2750b97bbad2f553fbaff2aedecfc9ff6a970d156e4fe3852979dc913bdb296a321f766367239de45e47cbef4d79bfa3d576887c65f7f8a60 731 - " ~x:"b75ee80c896b42148eeb7d185d45f5872a3758e983b4fdd8c2e71ca0 732 - " ~y:"7ec0a5418828159e3ec829f793b96ea3460328dea21ba157d71ac306f9bcde617db67368d592bf46d46918b130fc7e3d1189eeb7996d5f660ace30be509a26b218d865d9e56ba7f61942e567d8cdab96a78ca303c6b01d989b1e78ae956423e35b5a466c16074e0bc9e8372340d2c12516c22d5e1ff65abd5d448215b6baf565de18201c1fd5ba3de87e5d5b437d2f48deee72a12e655f8c7fa313d24bd0c8c20e59c90edfbf5dfc057c6b679850ae41826178f2f304ca3b92a9bac31ab3cf74dfb8ee5b643b4a341ebbdb5dbd24d0b782c5b450596abfc3df9ee05f45d0ea2e8ff4357cd3605f3506ce58a5394f1f2444c26359299af153532bc90daaf954ae 733 - " ~k:"ba98b478a9e12a1d03b6aca65c0acb265764357cca67d04d782fded9 734 - " ~r:"2b47e257bf72adf34d618d3a6c46142881bdd0689a46f1cb3199ee6c 735 - " ~s:"cc1ff2fa3755a0e81edfc753bcf14e637413eaee0f22d7886b058dcc 736 - 737 - " ; case ~msg:"a6d76047bd18deefe70dc0a4bd082a10fa521dffda782a9364b9e2b11e147e1a36a11c4300672144d9b974132b4975f27ea6e8e46b55aedd6723e53e7bc9b40dce2449285a690885c3223b636cb5c4873c5ddaebb0b6dc5b69438d881a525905a51bdb97b051dbfec6dd4a7b580297b08f2ba60f2ead3a07531cf299977413af 738 - " ~x:"1c0e4c78a4ad4f5046f929e7cd3db3f48b86e5eab4a5e2be61a08dfe 739 - " ~y:"8b2662775bb7f19252204594a84b469f3dc8d66eb7993bed122d8a065f59ea81d4c484cee5bd766a5c137dd57e43e941339852150509acbde6f7957a1b04ece718565ce8b637ea031bfa3410a580744b3d4959a5e75e315dd33c02b52c7c56218b7cdfdc24f51ddb4e7849faf289cf806c4d3c6b877c63dbfab569920a2b219c39215c5e3e638a3ebeebfb52c8b38e8285a85d625fc1b42fbf0e518c58eb8f45fa54676ed8b009415d2696ee9b5153dddc5eebef49cc7659810a98d4b5e8b9695fb2d9e4bf192093747c878a9565b47cba053c48ba7c0b9b1ce77f8a3e1043e87fcc6132cbe8fad7c738e9bf79bccb414ef24907675ba7cb059a8389eee7ebbe 740 - " ~k:"5135933094326e3953250a29d5f5c4c9a1033ccb844ab35a14c19d31 741 - " ~r:"b8674d1ba6f13398f5e8944b82150d9e9bc9b210a81495b335947e64 742 - " ~s:"75fcfe96926186efa12c007c0985205147cf65abd108363d8b891190 743 - 744 - " ; case ~msg:"f0d5b33327695536e351b37cd3feea693f10377a5f8bdd913402c2ed67a0fc1e7bcaab002fa779935950c76e42a491a68fa6fe445cd35575cfce5f376c29c4e8c0fed5a5487ef418b96fa5752a033ad07959653d1b8af6702dcce40efef21b2d64cf06bd8b03dadb2fdaaa73fb2d3d75b0985e9aefa1f94442a5491ae46d7c51 745 - " ~x:"269055de62d0742324803624522e678234c3600ae7bc3996c8d17bc9 746 - " ~y:"a448b0d448249a0e54a94586882985a08e19972281d10d9e7fb57f95dfeebf971f6d9dfe88dbd0a4950f528200be7b605865eefd8ec274ac53e4ed5b288c6a00721e028881b9725fb0a9ce4153dcc1fe7b5ce7259f16ea8b32456cb03bae81be77f3f6e8b39f52587bc9dd47a264278d5d8ecbe1ba574269696a7bb1e167a3ae7110ec057f4291a1bae8257d69c10ae095f3271621c6d6b5607925c3498189d751b7c9bf30e65683cb39fb51bd592f1f98279f2e7b2b53ad546816a8508c93f03496de7c47165f5cf297687ad7d60f010ab9faad0153432ec1ccdf26d4f441df625394e2104208bb675e7f972b6c66ed7028a1e3f45a671ab2716c60feabcc22 747 - " ~k:"0d9d0b3e1f24cbb18320f9ce896cfca2a5a6bb28ceec83e1ff3218d3 748 - " ~r:"01a4f4bc633ebf842a28d045184d250529920df280545cba00501cad 749 - " ~s:"09fceb2df200b7c0a56ae7969f5473b7a1f6b703f743f954a4fbdbe3 750 - 751 - " ; case ~msg:"f58e039d666ef064cccc7ed015017c68393d1455300d0c4fd4f0d302c43a0022363a7cb01bf0673d325293bd50b27f8187d88ee2b553b159a97d15ac543421446c2aec39566315211b9b4108cacf9085dacdb4de94bce84097c0892b1cc65f2e10d74e5293a04a837b616d4181f3fe4caa4cc2e744916e770ff0ab1368c86cfc 752 - " ~x:"3752b20033843d1ea4f48018bede79f39c15de33df64140259aebb82 753 - " ~y:"4052534a7726cbe17e34555648e5f297b963f22d3aca249785ad932f6ea1fb5df31d379b68522f8eebedfc9b5c5277e91574fa79ecf03780cc44351f3e3bfa1a0587c88d0e04e0a02cd1ee9ae210b3c9aacc65c71cf1b86463367e2be25ccadd9d5a4d1fcbd58772f7a117f3673c76ee2a8d93446ffd7cda7f8430490502c16b1a5022e12a3a95a7a9f20e98d3b285abe30e8de42a11c517c14ef3b6e5b6c47114a961d858c6875561c7d5d21b7c93f373cb330800728ea188b2578a6df34772a7acddb829c09b3acf9bc5b06140b9b035267a40e86c1af5577b3d02a89b20a46573c87500a2ebed4b00b1fb13a86f143e356702d791379a90dfcc26b80719ad 754 - " ~k:"1220ac99b9124f1dc2212ade5691fd330d6d868f3e90694236d44b70 755 - " ~r:"31fde5f22ebb426f256b175057a76125c40136974ad58e681ec2c4a9 756 - " ~s:"77b0614dd99acbbf4c43aa926b3f0be1cd52d52775f22a408c4e0304 757 - 758 - " ; case ~msg:"1477aa0b9f1b199b6aa0931d4d3f766d80a3af10c9ff7315391f15edc4e92632f9d4d21a8033215d5e99cff170d9888f020b0db0e5b97e123a2889898c5b0ef7c832d028afd5e385004531ff9989797c3bd954b1ac729066577667567884cd4bc5d055a3f645583d29cf4758507c883c5bbfa74444b9c5b9b495072c3261b6ec 759 - " ~x:"83770784916227ab2a73edaac5a95f7538fd94f89650841d79a37d7a 760 - " ~y:"4675f19b0095faf8ec96888e483f3a0aa675f5b425910765069ab57c97a12b7c506437c8757fef54ecc6d310921d7159ff39f2f1cd9535b64f27f136913715775a238fbe01237e181adebe551ffe5d21e3c35774e7ade8c79df741c52dabd8be4782ee5a3b607a39d1b455dc848301847312980566f55eba080621e3c123142a1a2074e2e39f6c0630b36831f074869d46a68429f62573cd2c671726131fbfd566a6d07193db4f367802d7de8f4e830aa878ee2cdfb86d8537746b71c70fbcb6a1fad66213d6fbea68241eb9f617478adcc9faaab26cf81b912089da0c4b187b496a17d886cef571e393d6f1f857ebf517c801f9231e95db661e8cb2095456a3 761 - " ~k:"6406035023c5e150e8758baeb00a9b858ebd0e4090334c69e2fd2377 762 - " ~r:"a2380b5ece76672669e26187a17da45ad89de1726c826e57378af707 763 - " ~s:"9cc26c3456c0a409f4cc98c83ea5176eb293ec7157e51370726429ce 764 - 765 - " ; case ~msg:"fc82372566ef2c626b2145549a5db973118dff4c6d1d7c4a2e16ecc31b43c14ad3683173535b0b82331f15a183e6a50200fd1e88ff903ecfc50bdd4f5875e264a4499eadbdaf807f974f8d8104477a0e4d30463dfc61cdac5bf44eab96c770a7db912eee2db248cdd2b9b36211f93870beae6bdf8e0aed0097519ecde3470cdd 766 - " ~x:"8d2855e4ea3e5085a5c145e324e5d5a5f8f23756284669279728ec9c 767 - " ~y:"3884ab23ab93d9d1b716712c8daa080b26af01657f0dab715ebe6bd766deca7612bea6a4cf1ff7d08abb2d4442ac0eaab01e68570bdcc222f84bc3dd6d8c5490132d1c36e23913f00d11c803b703a69a51a1b475f56db00fca47d234aac307b9e798e9fd891dff9c1257bee556314b021fbf93f75ed8c43433afa715b82d5ec6af8ef9471e9b02f9554ed7957c1f46d8db35a5921f4a83727f754e82b6ffa6d1b82595220876d22e18fbafa5333b26c2cfd47d894aaa7164a2630294d0a385fc8a8cf57d10ed0fc53f21f1fd6b4c27e9c69e65a288444619a3c248bcc44ec25605028325243274d72100edf560cd382babee1ca532b7f06a4388f181dbbb5db5 768 - " ~k:"5cc12f090fd965c719efa2ee907a43b3643ca8f9ef7c537adcb09189 769 - " ~r:"5461b20704453b6c51837f7b9ef5836131b501f2539145ca3481e6af 770 - " ~s:"b65f69d291ffae2d16e3108d69aeb01b4f9202afa01382e53dea4d54 771 - 772 - " ; case ~msg:"e66aad54048bececa5682644d5274c18068363e968e37e6c11c1f8a0d7e320578514e1874e9d4eaf1bd02da6b722ed22acfca48c3acb670a6f9ee62e3aa71deb18097508f431b05214c199c166fa42cd6a0797bc7b4d1a2f330cb62c2c95182fef0d06862542845e430d778c82076387adad4355c258e6c543cd656fe3cd2332 773 - " ~x:"2c984e8464cf5716053520b6a72c69798b9eec1e115b0a1e30e2e44e 774 - " ~y:"06245bc509b4955440b0e401710ddb2c4ea2e559598361a3666c4ab12e766b439f21b953962f6ef5a11dbee5677ab7f8906d8b325180ef4e45d05c1294fce5dcaf6360f71b10b70556f306993d295b695ffe5729c5c5bbb6cb4834ad037bd8364a12c992c2598e8ee6beb1606ebc0ac0ff00c0ea2eb8aed75dca01a890085a400ebf993e5879382ff91abf1be2ceedd1fc4a874342b77b6c55ffe7f676a1c95ee4ecc32358a080c92361cfcd2e3426f78c217ae29556709ed029b287e71feae0608cf3938857040d7f06b0f91b3b4da8929df4b5698e734a37316879c308a81c096b723bf2089910d5ab30b8eff38858aff6ecf764e268ed698b70e8fb7f3c66 775 - " ~k:"b20370d79e097e7c65e956d76aea1e288b668dacb8e7944aba5fbadd 776 - " ~r:"86d5bac3aeee9b501f91f2fa71b1066760df2e0ee147383f145bb0d3 777 - " ~s:"8d6a207802d6fd6e534e1b8a1edb997b7cc9a25a97a9e4b6eebd0e23 778 - 779 - " ; case ~msg:"c85747cdd2ac9da0999b7e5d7f64d11dce7673df5bc605051316b4b94bc7fc776fb1d3da5a4395a674aa8a0798a341b31b11e63cdfac5f854346f6a4b74b49f2d089cbb86fae54ebfd95eb9f05a1b5e84306e930461ad7f827cfb910014a3af4dae0d46ece912bc26870a433f70f0a38bf23b15d98cc658848f4bad9c84e89f0 780 - " ~x:"4076f4abf4d3c9a55b3f063535f6a69c221199581e72c5a8c31f1a71 781 - " ~y:"2972787dcbd67e5bddaaf1bd3f05ebd66949601dda44237ec9361591ce9b809f8722fb399e6b9b8109a79ea7b83fe98359a07a27e232cdea8f6533e34e37db3ae53309f62f108b2ee7b489a933e4ef58dd4db8c0108a3670c675b98b75798ac0884cf5a461af281f6dd8e7ea3d41396f049601a9af2e39088ae0a1ec0d2d10fae1dc1de962d84d8cf04215fc6d6262ac432541af2c48c09cd4e15bd9460e9a7bae17e0035af0b13d8de707870c54bc851112f4ae1d69074712c212bc7e13f199ffc8f37723cd6dcf539f8df8cf0cf1ed4c10eeaf0f444804f1eb9d9c329d6f19973eec273222fa04b5f1f0e17971ce399869582027b1c454dc1addd484902cb0 782 - " ~k:"7149f49e3d07c45c97db09632740560e5b0e843240255da43ae97ec1 783 - " ~r:"28e3dd71098ff04d1ca885c2774f78ecb3ecea708fab2e16bd5cece1 784 - " ~s:"ac8b6ee498ee383e28404ba4b53e64aca0fcd26790713264fe3cf6a1 785 - 786 - " ; case ~msg:"a7a59da62a9391cfe628697548b05f8af39ea9821d76c314478e210fbcd27fbf6b0bf460a65dbcbadcddfc0178ece135264a7d7c5b7053208bfbde54e3338d901927e95e1dc8eeb73d299e6fa6584555cfeafd1925e95e0b3558ddec641175fc7293c0310266ace18bbb16f9084fd4ac22ad2dc8528c3f3f332684039e74b390 787 - " ~x:"22fdd44afd372e15842413c0829c9a894ce61a3f0b135c1546f57fb0 788 - " ~y:"0aa040bbb23c337d58874d95efe9277080862ea0888d9209ecc2f5d7e0d56b3e8444ca933800450f10b8124ff8812f87e1becf1a317ace0c3a1376d624938cab617bb546d0aad4f1d0aa23c6670cfae0da28660393a90911b3dbe3847eab4ebb7dd0504aeb0269126655d135d2e9149cd8ac5221151640914d480569b383e98364cc41cec56ea157ce8d7e73a949b348e5ffd3ceefea7f7625f599aa9afe2db4cf3b0d59f2700f6cecc54f8bf7853892f07337dbe76be781994ef4e14df2f0cf7cb342ee1c8b188a7dcc317a097c9f9e33ff89462c26465bb53eec05d1085fc6156cad0f7c9b80d2a68953501a97acb746ac3a2b9bdcf18dfceaa196716ec773 789 - " ~k:"b93120b594e8994f533c1811d61495f2ebf32fde9e7ecec856033f20 790 - " ~r:"84934f3f56d64815fc66b0dbf3b1fa56d1387be7611a1e571c405100 791 - " ~s:"431f11346950e77c9e9ed0127c50bf620f6f69a699cd017c7d87368a 792 - 793 - " ; case ~msg:"d4c5b439a1ccf5d98cf0b931f253f733037921d4efb02cf87b2509e732a56ccb49e0c83b1409cc009f1d2d1cb4c0c7ab00c402ee018ec5098031ac9e7197d4395d491721708a41ff5cda5a03be6a1169bf459470b1aaf53c8a9668acae1385b921f5a26c73365444515c3c126c6940b4bf57591a0bfd6c2c74c724426cb2ad3f 794 - " ~x:"c9ed82462158cc9c99231fd48a81e4f8318a88735c35b9f2c08ad280 795 - " ~y:"37c5f029816322da5161c4e20dc4f5abde9f04f5f9dff5d581b253109191b38424dde75febac32d6ce31b116063494a70c5c1d9d8b7351252ed377ea38fbe85b9f614eca1346bff65345d57e646bfb032e9befa9e6e5a89c16d715420e24129b6f70e4f681bc1d38ad1737db79655d244b4d67ad3d2bd80fd9d80c2e15240214859fdc0b6c43dd1e805dcdd2a5b9781397bd4a4e8bc4d6f9a1664036e90cac550e83d6641367613707d0de4f2dee55e9a5be6d3de893d61561f4ba90d387b7ab48801086016c842f3e0ce60e6b46aa980191cba147407aa4ccbe19b00b0ac71648d5296d13e48c75d52848bbd39f1ded988c3616faaf64f91a30742506316893 796 - " ~k:"9f1fc151bcf8fe18bde1ac505737dc6868c34be605bf2ead6ae3294b 797 - " ~r:"1b51b8d2d3eeb3d6218da3494714d0e88cd7366f387e6ede00f653e0 798 - " ~s:"844203a81fb38f57505bf83bc8c1da002a39e81abbdd2f99ab6a4d65 799 - 800 - " ; case ~msg:"40d4d9736b54993c1bcee7071c682390d34d47c35f177939ca5b70f457b3458fd5eca4cb03f0efe1aec10bf794b841216056a155dab58a3dbfc19ddf05d45861bae6eea2bd7ffb87a6fd0fd2394e847dc36c94c81561dee120779bbecbc32206327febaa17c96505ecb97d560c934c386f6f766a2f5154f545f22181c19fc698 801 - " ~x:"5a050bfae63d347d64379ad01441b0ef9ab06ec5842c952f7a1c29ce 802 - " ~y:"24aa1c7c6a041f6d2c533006cebcc2ad048b3dc08fa86282f5879a237231d230cd854aa10158cebb45f387923fada8c5f4b91a7bc2dc3e2c39463797e6eb1958abc9b9e748bbfe80e360233e96952279959a6b80619100f6f1876fadeb790491462f5917da36cea3793c44db90908cb9da18f696ced90f2acb826355104c4c8f06c737d48acf985d6b8c2abf31807282b6e651d2967a16907be3d8e4b7f32ed34eba8c262d6c0ecb131946d2546362c217ae195d05656a4fcfac73717ae85a571d811cbc99e0b3124bba767fead605266d99021cdd8cb4c081bef102431007ee12523b48bb838698a5971e517252d6d93e1c7fe9fbe07bf434164baaa1026da4 803 - " ~k:"5de3d5e6b78c888ba4185c1547272fe562b44e507c871a0524765aea 804 - " ~r:"325aa7b173cac96d5865aa50ea54e5df45a10e72fd5dd1fb265aae09 805 - " ~s:"0a7203f6b8fbf668b8f6435e929fd52f52e23ad4b8a156ae5f3c9c47" 806 - ] 1108 + [ 1109 + case 1110 + ~msg: 1111 + "cec8d2843dee7cb5f9119b75562585e05c5ce2f4e6457e9bcc3c1c781ccd2c0442b6282aea610f7161dcede176e774861f7d2691be6c894ac3ebf80c0fab21e52a3e63ae0b35025762ccd6c9e1fecc7f9fe00aa55c0c3ae33ae88f66187f9598eba9f863171f3f56484625bf39d883427349b8671d9bb7d396180694e5b546ae\n" 1112 + ~x:"551595eccbb003b0bf8ddda184a59da51e459a0d28205e5592ca4cb1\n" 1113 + ~y: 1114 + "748a40237211a2d9852596e7a891f43d4eb0ee48826c9cfb336bbb68dbe5a5e16b2e1271d4d13de03644bb85ef6be523a4d4d88415bcd596ba8e0a3c4f6439e981ed013d7d9c70336febf7d420cfed02c267457bb3f3e7c82145d2af54830b942ec74a5d503e4226cd25dd75decd3f50f0a858155d7be799410836ddc559ce99e1ae513808fdaeac34843dd7258f16f67f19205f6f139251a4186da8496d5e90d3fecf8ed10be6c25ff5eb33d960c9a8f4c581c8c724ca43b761e9fdb5af66bffb9d2ebb11a6b504a1fbe4f834ecb6ac254cab513e943b9a953a7084b3305c661bfad434f6a835503c9ade7f4a57f5c965ec301ecde938ee31b4deb038af97b3\n" 1115 + ~k:"6f326546aa174b3d319ef7331ec8dfd363dd78ae583a920165ff7e54\n" 1116 + ~r:"9c5fa46879ddaf5c14f07dfb5320715f67a6fec179e3ad53342fb6d1\n" 1117 + ~s:"c3e17e7b3c4d0ac8d49f4dd0f04c16a094f42da0afcc6c90f5f1bbc8\n\n"; 1118 + case 1119 + ~msg: 1120 + "f3bb27bf9d412f13229a56d2d1533eae63f40004c143c6b92f6e606d263dd2da7581e5eb20b6cd021e3ab63b498abafce01b4ad7ac8628f7a1849c4e454f1168ae97adfab1fadbd313fca7381726f5045752dabaad6ea3250d303a5496bba2fa4895ae49f06a9aa6451ae70cf33b5f06fa17cac0144f28bd19fb2ac041a578ed\n" 1121 + ~x:"027d0171598e7ecf23f2922d0257e604291cefa77b5cfaf1b3e31ac4\n" 1122 + ~y: 1123 + "00c7aabe30fa4c3d1ba85e7ae0aae79360e5eab3041bcaaa5d321c92f3471e4194c10484cff152bade6b7d619cf286773475298f883efdf64c08b692583de31be0a4e2b8e8d508ec145c65a369ce6195446c52d02372eba562f9a9d7cb24d2ec3b0a1ab833e4d7623b0455a41eec759d07a3c8a20d88a926408c20f1675601be53cffd65617b66fd4eb353a1f2db31f66343b07faf60de0b6a680809c6166adbf5e504c5c61babb84be72c02d3ebeee066d9eab0d0ecdfe01b8ccd6728ee9123b9d21154b2bc9a134363566402291ac8a484ee32eb884046d40fde7cabbf51d1d1206df1c5ecf290ab7ea72abb5bd3be8d91c02bb63f809718ba1d380af88331\n" 1124 + ~k:"7494772f199ab7a7e9a248f6c2df918c9da62dc2d4176b7db9419b37\n" 1125 + ~r:"79a6aed73ce177ed3581f5d181a77f000d6358514ea95cb0388a6add\n" 1126 + ~s:"2b8597a694564e267b6f250a4c76361f8cdf49863a7902afa48fd6d8\n\n"; 1127 + case 1128 + ~msg: 1129 + "e714c01631704e9447390f5c315c9615a7a52863b143706583f661595c505aec477eeb5ad6d640ca812ce11750b67bc8bede2e4f9618dbe7376cab6231b21248ec914ae182df8753362d2118a65e66f64018810804ad97fcc1a87b8c9f349d1001e4b09b046991e6abe6338fbef7be48f1c80c350d2962eb6b8fce25b69f8dc9\n" 1130 + ~x:"6911c21a3da88d54ff9ab58ae2075a2affa3f3eb656978ea26bfa702\n" 1131 + ~y: 1132 + "04d301f001821b03c91394c520839ab6aaa95325c108a02dad9db48b3c8033d6443bcbf05045230ca88aaf98a8c4cb6b095b352d91b4c416f632fab49d45ac90699a5a419630a81d473bc89122eb5bacb91c40caa4e4bcc476f3ca77bf6a21037a06be24f11c645b0c21b857fdc5c04fbbf0a26efc569cdbb0ea989ba0e037c23f22b0c5f1643d77d98f2de248ccc36672d397d30c1c5e1319fc7e5842ae1a9fcd9e96fe890a74ddee91a39ce732e4c0eaf7094b53b7b409303860b0b4944cc81b4a42d40538cfe512b9680e0a281b1fbbf639139e8066ad638cf846c9ea51fb4c4ef84921f16a6ca3f2bd158157c551739c9d023e270b3de7c2f1d7683cf809\n" 1133 + ~k:"bfb79665f7d6df843d2c39357173e415724c83e1a10932efb9e22676\n" 1134 + ~r:"790b4dcae31fe45cd3a7bb6fa10dcf9ede1f067123f93baad7edb489\n" 1135 + ~s:"71e3e46dfe040496ce4c5e490f6944a23cd5e66ce9b4d9acbe4130ce\n\n"; 1136 + case 1137 + ~msg: 1138 + "3f6e482fd484ed3d07f1d0761f2d60fc96d46eb0ecd10a59dd4f392e3d3b2cbe184010e132685578b1f6303239798a5303a81169d4f52fba0d20a42834de293e3a7b32848b65dd308eef5350d633297465425b7b1595ffc8ea7b125896f89e2844561635f52ec62fab2ecfea288d23f0a771cd6311806103135172cf9fef1455\n" 1139 + ~x:"20328083aa86511140324fd0357067a1d6abfc316e77fe3d260f0ef2\n" 1140 + ~y: 1141 + "9fc1b292ebe15531579f35dda8d706bee0da857cd696a10af770dc356232736cf893f7411a9d2718b39f388118d177cd8d0fd7ca3b3c220f3aa743d8b167219d3c2c783e1f09d8b8df8ec7e17578c5329488c87a89678d2818a99366b785d53f6ca6995e193ba5ca26c00b849f9027ca5df5bb7ec87fe78735ae880f1a97dabc3ca7985d8cbc81be824c1ffb953f1096bf926226fb5e9d4ad43e9363da5e6b738c9a2f951ab3294e2b2822cf5282bb4134158aa90ab9c8f0f64d05a0d625a75bc2d6a4ae3dd11fc05ede7b6647ae7c0750ddb273fe5f8828318a91db3172ad59166aacf2da4f3704d169ebc860d9e1c6464abc2b653013774d29375b77bac1ec\n" 1142 + ~k:"8f4398bb9fe1b393c1d90a62e178899261fa0501c98bd9a8178b364c\n" 1143 + ~r:"3b5d8034c4b8ad9701bf29b10006db69d017fde8638079dd7bbface7\n" 1144 + ~s:"cde01df54a66cef3c0538648525b250cb1f08707f5ff114bdebff8f7\n\n"; 1145 + case 1146 + ~msg: 1147 + "31a278f881fdd375565c0f28ff7575f216110486d6fe08dae8fd072950978bdff601ded1ef226b5d904c47f7142a8f4665e03efe5870da2dd1ab80e449f5c757b3b6996a9dc0b5b2750b97bbad2f553fbaff2aedecfc9ff6a970d156e4fe3852979dc913bdb296a321f766367239de45e47cbef4d79bfa3d576887c65f7f8a60\n" 1148 + ~x:"b75ee80c896b42148eeb7d185d45f5872a3758e983b4fdd8c2e71ca0\n" 1149 + ~y: 1150 + "7ec0a5418828159e3ec829f793b96ea3460328dea21ba157d71ac306f9bcde617db67368d592bf46d46918b130fc7e3d1189eeb7996d5f660ace30be509a26b218d865d9e56ba7f61942e567d8cdab96a78ca303c6b01d989b1e78ae956423e35b5a466c16074e0bc9e8372340d2c12516c22d5e1ff65abd5d448215b6baf565de18201c1fd5ba3de87e5d5b437d2f48deee72a12e655f8c7fa313d24bd0c8c20e59c90edfbf5dfc057c6b679850ae41826178f2f304ca3b92a9bac31ab3cf74dfb8ee5b643b4a341ebbdb5dbd24d0b782c5b450596abfc3df9ee05f45d0ea2e8ff4357cd3605f3506ce58a5394f1f2444c26359299af153532bc90daaf954ae\n" 1151 + ~k:"ba98b478a9e12a1d03b6aca65c0acb265764357cca67d04d782fded9\n" 1152 + ~r:"2b47e257bf72adf34d618d3a6c46142881bdd0689a46f1cb3199ee6c\n" 1153 + ~s:"cc1ff2fa3755a0e81edfc753bcf14e637413eaee0f22d7886b058dcc\n\n"; 1154 + case 1155 + ~msg: 1156 + "a6d76047bd18deefe70dc0a4bd082a10fa521dffda782a9364b9e2b11e147e1a36a11c4300672144d9b974132b4975f27ea6e8e46b55aedd6723e53e7bc9b40dce2449285a690885c3223b636cb5c4873c5ddaebb0b6dc5b69438d881a525905a51bdb97b051dbfec6dd4a7b580297b08f2ba60f2ead3a07531cf299977413af\n" 1157 + ~x:"1c0e4c78a4ad4f5046f929e7cd3db3f48b86e5eab4a5e2be61a08dfe\n" 1158 + ~y: 1159 + "8b2662775bb7f19252204594a84b469f3dc8d66eb7993bed122d8a065f59ea81d4c484cee5bd766a5c137dd57e43e941339852150509acbde6f7957a1b04ece718565ce8b637ea031bfa3410a580744b3d4959a5e75e315dd33c02b52c7c56218b7cdfdc24f51ddb4e7849faf289cf806c4d3c6b877c63dbfab569920a2b219c39215c5e3e638a3ebeebfb52c8b38e8285a85d625fc1b42fbf0e518c58eb8f45fa54676ed8b009415d2696ee9b5153dddc5eebef49cc7659810a98d4b5e8b9695fb2d9e4bf192093747c878a9565b47cba053c48ba7c0b9b1ce77f8a3e1043e87fcc6132cbe8fad7c738e9bf79bccb414ef24907675ba7cb059a8389eee7ebbe\n" 1160 + ~k:"5135933094326e3953250a29d5f5c4c9a1033ccb844ab35a14c19d31\n" 1161 + ~r:"b8674d1ba6f13398f5e8944b82150d9e9bc9b210a81495b335947e64\n" 1162 + ~s:"75fcfe96926186efa12c007c0985205147cf65abd108363d8b891190\n\n"; 1163 + case 1164 + ~msg: 1165 + "f0d5b33327695536e351b37cd3feea693f10377a5f8bdd913402c2ed67a0fc1e7bcaab002fa779935950c76e42a491a68fa6fe445cd35575cfce5f376c29c4e8c0fed5a5487ef418b96fa5752a033ad07959653d1b8af6702dcce40efef21b2d64cf06bd8b03dadb2fdaaa73fb2d3d75b0985e9aefa1f94442a5491ae46d7c51\n" 1166 + ~x:"269055de62d0742324803624522e678234c3600ae7bc3996c8d17bc9\n" 1167 + ~y: 1168 + "a448b0d448249a0e54a94586882985a08e19972281d10d9e7fb57f95dfeebf971f6d9dfe88dbd0a4950f528200be7b605865eefd8ec274ac53e4ed5b288c6a00721e028881b9725fb0a9ce4153dcc1fe7b5ce7259f16ea8b32456cb03bae81be77f3f6e8b39f52587bc9dd47a264278d5d8ecbe1ba574269696a7bb1e167a3ae7110ec057f4291a1bae8257d69c10ae095f3271621c6d6b5607925c3498189d751b7c9bf30e65683cb39fb51bd592f1f98279f2e7b2b53ad546816a8508c93f03496de7c47165f5cf297687ad7d60f010ab9faad0153432ec1ccdf26d4f441df625394e2104208bb675e7f972b6c66ed7028a1e3f45a671ab2716c60feabcc22\n" 1169 + ~k:"0d9d0b3e1f24cbb18320f9ce896cfca2a5a6bb28ceec83e1ff3218d3\n" 1170 + ~r:"01a4f4bc633ebf842a28d045184d250529920df280545cba00501cad\n" 1171 + ~s:"09fceb2df200b7c0a56ae7969f5473b7a1f6b703f743f954a4fbdbe3\n\n"; 1172 + case 1173 + ~msg: 1174 + "f58e039d666ef064cccc7ed015017c68393d1455300d0c4fd4f0d302c43a0022363a7cb01bf0673d325293bd50b27f8187d88ee2b553b159a97d15ac543421446c2aec39566315211b9b4108cacf9085dacdb4de94bce84097c0892b1cc65f2e10d74e5293a04a837b616d4181f3fe4caa4cc2e744916e770ff0ab1368c86cfc\n" 1175 + ~x:"3752b20033843d1ea4f48018bede79f39c15de33df64140259aebb82\n" 1176 + ~y: 1177 + "4052534a7726cbe17e34555648e5f297b963f22d3aca249785ad932f6ea1fb5df31d379b68522f8eebedfc9b5c5277e91574fa79ecf03780cc44351f3e3bfa1a0587c88d0e04e0a02cd1ee9ae210b3c9aacc65c71cf1b86463367e2be25ccadd9d5a4d1fcbd58772f7a117f3673c76ee2a8d93446ffd7cda7f8430490502c16b1a5022e12a3a95a7a9f20e98d3b285abe30e8de42a11c517c14ef3b6e5b6c47114a961d858c6875561c7d5d21b7c93f373cb330800728ea188b2578a6df34772a7acddb829c09b3acf9bc5b06140b9b035267a40e86c1af5577b3d02a89b20a46573c87500a2ebed4b00b1fb13a86f143e356702d791379a90dfcc26b80719ad\n" 1178 + ~k:"1220ac99b9124f1dc2212ade5691fd330d6d868f3e90694236d44b70\n" 1179 + ~r:"31fde5f22ebb426f256b175057a76125c40136974ad58e681ec2c4a9\n" 1180 + ~s:"77b0614dd99acbbf4c43aa926b3f0be1cd52d52775f22a408c4e0304\n\n"; 1181 + case 1182 + ~msg: 1183 + "1477aa0b9f1b199b6aa0931d4d3f766d80a3af10c9ff7315391f15edc4e92632f9d4d21a8033215d5e99cff170d9888f020b0db0e5b97e123a2889898c5b0ef7c832d028afd5e385004531ff9989797c3bd954b1ac729066577667567884cd4bc5d055a3f645583d29cf4758507c883c5bbfa74444b9c5b9b495072c3261b6ec\n" 1184 + ~x:"83770784916227ab2a73edaac5a95f7538fd94f89650841d79a37d7a\n" 1185 + ~y: 1186 + "4675f19b0095faf8ec96888e483f3a0aa675f5b425910765069ab57c97a12b7c506437c8757fef54ecc6d310921d7159ff39f2f1cd9535b64f27f136913715775a238fbe01237e181adebe551ffe5d21e3c35774e7ade8c79df741c52dabd8be4782ee5a3b607a39d1b455dc848301847312980566f55eba080621e3c123142a1a2074e2e39f6c0630b36831f074869d46a68429f62573cd2c671726131fbfd566a6d07193db4f367802d7de8f4e830aa878ee2cdfb86d8537746b71c70fbcb6a1fad66213d6fbea68241eb9f617478adcc9faaab26cf81b912089da0c4b187b496a17d886cef571e393d6f1f857ebf517c801f9231e95db661e8cb2095456a3\n" 1187 + ~k:"6406035023c5e150e8758baeb00a9b858ebd0e4090334c69e2fd2377\n" 1188 + ~r:"a2380b5ece76672669e26187a17da45ad89de1726c826e57378af707\n" 1189 + ~s:"9cc26c3456c0a409f4cc98c83ea5176eb293ec7157e51370726429ce\n\n"; 1190 + case 1191 + ~msg: 1192 + "fc82372566ef2c626b2145549a5db973118dff4c6d1d7c4a2e16ecc31b43c14ad3683173535b0b82331f15a183e6a50200fd1e88ff903ecfc50bdd4f5875e264a4499eadbdaf807f974f8d8104477a0e4d30463dfc61cdac5bf44eab96c770a7db912eee2db248cdd2b9b36211f93870beae6bdf8e0aed0097519ecde3470cdd\n" 1193 + ~x:"8d2855e4ea3e5085a5c145e324e5d5a5f8f23756284669279728ec9c\n" 1194 + ~y: 1195 + "3884ab23ab93d9d1b716712c8daa080b26af01657f0dab715ebe6bd766deca7612bea6a4cf1ff7d08abb2d4442ac0eaab01e68570bdcc222f84bc3dd6d8c5490132d1c36e23913f00d11c803b703a69a51a1b475f56db00fca47d234aac307b9e798e9fd891dff9c1257bee556314b021fbf93f75ed8c43433afa715b82d5ec6af8ef9471e9b02f9554ed7957c1f46d8db35a5921f4a83727f754e82b6ffa6d1b82595220876d22e18fbafa5333b26c2cfd47d894aaa7164a2630294d0a385fc8a8cf57d10ed0fc53f21f1fd6b4c27e9c69e65a288444619a3c248bcc44ec25605028325243274d72100edf560cd382babee1ca532b7f06a4388f181dbbb5db5\n" 1196 + ~k:"5cc12f090fd965c719efa2ee907a43b3643ca8f9ef7c537adcb09189\n" 1197 + ~r:"5461b20704453b6c51837f7b9ef5836131b501f2539145ca3481e6af\n" 1198 + ~s:"b65f69d291ffae2d16e3108d69aeb01b4f9202afa01382e53dea4d54\n\n"; 1199 + case 1200 + ~msg: 1201 + "e66aad54048bececa5682644d5274c18068363e968e37e6c11c1f8a0d7e320578514e1874e9d4eaf1bd02da6b722ed22acfca48c3acb670a6f9ee62e3aa71deb18097508f431b05214c199c166fa42cd6a0797bc7b4d1a2f330cb62c2c95182fef0d06862542845e430d778c82076387adad4355c258e6c543cd656fe3cd2332\n" 1202 + ~x:"2c984e8464cf5716053520b6a72c69798b9eec1e115b0a1e30e2e44e\n" 1203 + ~y: 1204 + "06245bc509b4955440b0e401710ddb2c4ea2e559598361a3666c4ab12e766b439f21b953962f6ef5a11dbee5677ab7f8906d8b325180ef4e45d05c1294fce5dcaf6360f71b10b70556f306993d295b695ffe5729c5c5bbb6cb4834ad037bd8364a12c992c2598e8ee6beb1606ebc0ac0ff00c0ea2eb8aed75dca01a890085a400ebf993e5879382ff91abf1be2ceedd1fc4a874342b77b6c55ffe7f676a1c95ee4ecc32358a080c92361cfcd2e3426f78c217ae29556709ed029b287e71feae0608cf3938857040d7f06b0f91b3b4da8929df4b5698e734a37316879c308a81c096b723bf2089910d5ab30b8eff38858aff6ecf764e268ed698b70e8fb7f3c66\n" 1205 + ~k:"b20370d79e097e7c65e956d76aea1e288b668dacb8e7944aba5fbadd\n" 1206 + ~r:"86d5bac3aeee9b501f91f2fa71b1066760df2e0ee147383f145bb0d3\n" 1207 + ~s:"8d6a207802d6fd6e534e1b8a1edb997b7cc9a25a97a9e4b6eebd0e23\n\n"; 1208 + case 1209 + ~msg: 1210 + "c85747cdd2ac9da0999b7e5d7f64d11dce7673df5bc605051316b4b94bc7fc776fb1d3da5a4395a674aa8a0798a341b31b11e63cdfac5f854346f6a4b74b49f2d089cbb86fae54ebfd95eb9f05a1b5e84306e930461ad7f827cfb910014a3af4dae0d46ece912bc26870a433f70f0a38bf23b15d98cc658848f4bad9c84e89f0\n" 1211 + ~x:"4076f4abf4d3c9a55b3f063535f6a69c221199581e72c5a8c31f1a71\n" 1212 + ~y: 1213 + "2972787dcbd67e5bddaaf1bd3f05ebd66949601dda44237ec9361591ce9b809f8722fb399e6b9b8109a79ea7b83fe98359a07a27e232cdea8f6533e34e37db3ae53309f62f108b2ee7b489a933e4ef58dd4db8c0108a3670c675b98b75798ac0884cf5a461af281f6dd8e7ea3d41396f049601a9af2e39088ae0a1ec0d2d10fae1dc1de962d84d8cf04215fc6d6262ac432541af2c48c09cd4e15bd9460e9a7bae17e0035af0b13d8de707870c54bc851112f4ae1d69074712c212bc7e13f199ffc8f37723cd6dcf539f8df8cf0cf1ed4c10eeaf0f444804f1eb9d9c329d6f19973eec273222fa04b5f1f0e17971ce399869582027b1c454dc1addd484902cb0\n" 1214 + ~k:"7149f49e3d07c45c97db09632740560e5b0e843240255da43ae97ec1\n" 1215 + ~r:"28e3dd71098ff04d1ca885c2774f78ecb3ecea708fab2e16bd5cece1\n" 1216 + ~s:"ac8b6ee498ee383e28404ba4b53e64aca0fcd26790713264fe3cf6a1\n\n"; 1217 + case 1218 + ~msg: 1219 + "a7a59da62a9391cfe628697548b05f8af39ea9821d76c314478e210fbcd27fbf6b0bf460a65dbcbadcddfc0178ece135264a7d7c5b7053208bfbde54e3338d901927e95e1dc8eeb73d299e6fa6584555cfeafd1925e95e0b3558ddec641175fc7293c0310266ace18bbb16f9084fd4ac22ad2dc8528c3f3f332684039e74b390\n" 1220 + ~x:"22fdd44afd372e15842413c0829c9a894ce61a3f0b135c1546f57fb0\n" 1221 + ~y: 1222 + "0aa040bbb23c337d58874d95efe9277080862ea0888d9209ecc2f5d7e0d56b3e8444ca933800450f10b8124ff8812f87e1becf1a317ace0c3a1376d624938cab617bb546d0aad4f1d0aa23c6670cfae0da28660393a90911b3dbe3847eab4ebb7dd0504aeb0269126655d135d2e9149cd8ac5221151640914d480569b383e98364cc41cec56ea157ce8d7e73a949b348e5ffd3ceefea7f7625f599aa9afe2db4cf3b0d59f2700f6cecc54f8bf7853892f07337dbe76be781994ef4e14df2f0cf7cb342ee1c8b188a7dcc317a097c9f9e33ff89462c26465bb53eec05d1085fc6156cad0f7c9b80d2a68953501a97acb746ac3a2b9bdcf18dfceaa196716ec773\n" 1223 + ~k:"b93120b594e8994f533c1811d61495f2ebf32fde9e7ecec856033f20\n" 1224 + ~r:"84934f3f56d64815fc66b0dbf3b1fa56d1387be7611a1e571c405100\n" 1225 + ~s:"431f11346950e77c9e9ed0127c50bf620f6f69a699cd017c7d87368a\n\n"; 1226 + case 1227 + ~msg: 1228 + "d4c5b439a1ccf5d98cf0b931f253f733037921d4efb02cf87b2509e732a56ccb49e0c83b1409cc009f1d2d1cb4c0c7ab00c402ee018ec5098031ac9e7197d4395d491721708a41ff5cda5a03be6a1169bf459470b1aaf53c8a9668acae1385b921f5a26c73365444515c3c126c6940b4bf57591a0bfd6c2c74c724426cb2ad3f\n" 1229 + ~x:"c9ed82462158cc9c99231fd48a81e4f8318a88735c35b9f2c08ad280\n" 1230 + ~y: 1231 + "37c5f029816322da5161c4e20dc4f5abde9f04f5f9dff5d581b253109191b38424dde75febac32d6ce31b116063494a70c5c1d9d8b7351252ed377ea38fbe85b9f614eca1346bff65345d57e646bfb032e9befa9e6e5a89c16d715420e24129b6f70e4f681bc1d38ad1737db79655d244b4d67ad3d2bd80fd9d80c2e15240214859fdc0b6c43dd1e805dcdd2a5b9781397bd4a4e8bc4d6f9a1664036e90cac550e83d6641367613707d0de4f2dee55e9a5be6d3de893d61561f4ba90d387b7ab48801086016c842f3e0ce60e6b46aa980191cba147407aa4ccbe19b00b0ac71648d5296d13e48c75d52848bbd39f1ded988c3616faaf64f91a30742506316893\n" 1232 + ~k:"9f1fc151bcf8fe18bde1ac505737dc6868c34be605bf2ead6ae3294b\n" 1233 + ~r:"1b51b8d2d3eeb3d6218da3494714d0e88cd7366f387e6ede00f653e0\n" 1234 + ~s:"844203a81fb38f57505bf83bc8c1da002a39e81abbdd2f99ab6a4d65\n\n"; 1235 + case 1236 + ~msg: 1237 + "40d4d9736b54993c1bcee7071c682390d34d47c35f177939ca5b70f457b3458fd5eca4cb03f0efe1aec10bf794b841216056a155dab58a3dbfc19ddf05d45861bae6eea2bd7ffb87a6fd0fd2394e847dc36c94c81561dee120779bbecbc32206327febaa17c96505ecb97d560c934c386f6f766a2f5154f545f22181c19fc698\n" 1238 + ~x:"5a050bfae63d347d64379ad01441b0ef9ab06ec5842c952f7a1c29ce\n" 1239 + ~y: 1240 + "24aa1c7c6a041f6d2c533006cebcc2ad048b3dc08fa86282f5879a237231d230cd854aa10158cebb45f387923fada8c5f4b91a7bc2dc3e2c39463797e6eb1958abc9b9e748bbfe80e360233e96952279959a6b80619100f6f1876fadeb790491462f5917da36cea3793c44db90908cb9da18f696ced90f2acb826355104c4c8f06c737d48acf985d6b8c2abf31807282b6e651d2967a16907be3d8e4b7f32ed34eba8c262d6c0ecb131946d2546362c217ae195d05656a4fcfac73717ae85a571d811cbc99e0b3124bba767fead605266d99021cdd8cb4c081bef102431007ee12523b48bb838698a5971e517252d6d93e1c7fe9fbe07bf434164baaa1026da4\n" 1241 + ~k:"5de3d5e6b78c888ba4185c1547272fe562b44e507c871a0524765aea\n" 1242 + ~r:"325aa7b173cac96d5865aa50ea54e5df45a10e72fd5dd1fb265aae09\n" 1243 + ~s:"0a7203f6b8fbf668b8f6435e929fd52f52e23ad4b8a156ae5f3c9c47"; 1244 + ] 807 1245 808 1246 let sha384_n224_cases = 809 1247 (* [mod = L=2048, N=224, SHA-384] *) 810 - let domain = params 811 - ~p:"a6bb5333ce343c31c9b2c878ab91eef2fdea35c6db0e716762bfc0d436d87506e865a4d2c8cfbbd626ce8bfe64563ca5686cd8cf081490f02445b289087982495fb69976b10242d6d50fc23b4dbdb0bef78305d9a4d05d9eae65d87a893eaf397e04e39baa85a26c8ffbdef1233287b5f5b6ef6a90f27a69481a932ee47b18d5d27eb107ffb05025e646e8876b5cb567fec1dd35835d42082198531fafbe5ae280c575a1fb0e62e9b3ca37e197ad96d9dde1f33f2cec7d27deae261c83ee8e2002af7eb6e82f6a14796af037577a1032bbc709129caabd8addf870ae2d0595c8fdb37155748f0dea34b44d4f82ed58c2f5b1b8481662ac53473c693410082fbd 812 - " ~q:"8c3ee5bd9a2aaf068bd5845bd55ecf27417055307577bbc3770ec68b 813 - " ~g:"43b5a6b6d0bb962ec9766a377c32cc4124f1311188c2ecf95c0cd4a4fa097225b7618cb1276c474578d3bf564c145199c092a1b14baa929c2f3f0f36e0c2dae91eba08be30992a889f2952e0442c37af484a4ecdc3243ccfcb9e3413cf5cdd6630b09fe17efbfde14d8725493019b7b73d1f782b48ef30bec36e00e02ba336d2254fc202a69612cd9446f91d76b739ffa6d8b86052f8dc5f1145801c56241af5ba9037241bd89e6338b58e01310671c268eb5e33acb57d1f99f16440a675827d4017754d601a17ada2fbedf904554a90b01530da8c93cd14ce293cb2bd3e7937e934b79e310fe4d80c13f92f63381355bd80a1abee1a73fdfb6da24ef28002a3" 1248 + let domain = 1249 + params 1250 + ~p: 1251 + "a6bb5333ce343c31c9b2c878ab91eef2fdea35c6db0e716762bfc0d436d87506e865a4d2c8cfbbd626ce8bfe64563ca5686cd8cf081490f02445b289087982495fb69976b10242d6d50fc23b4dbdb0bef78305d9a4d05d9eae65d87a893eaf397e04e39baa85a26c8ffbdef1233287b5f5b6ef6a90f27a69481a932ee47b18d5d27eb107ffb05025e646e8876b5cb567fec1dd35835d42082198531fafbe5ae280c575a1fb0e62e9b3ca37e197ad96d9dde1f33f2cec7d27deae261c83ee8e2002af7eb6e82f6a14796af037577a1032bbc709129caabd8addf870ae2d0595c8fdb37155748f0dea34b44d4f82ed58c2f5b1b8481662ac53473c693410082fbd\n" 1252 + ~q:"8c3ee5bd9a2aaf068bd5845bd55ecf27417055307577bbc3770ec68b\n" 1253 + ~g: 1254 + "43b5a6b6d0bb962ec9766a377c32cc4124f1311188c2ecf95c0cd4a4fa097225b7618cb1276c474578d3bf564c145199c092a1b14baa929c2f3f0f36e0c2dae91eba08be30992a889f2952e0442c37af484a4ecdc3243ccfcb9e3413cf5cdd6630b09fe17efbfde14d8725493019b7b73d1f782b48ef30bec36e00e02ba336d2254fc202a69612cd9446f91d76b739ffa6d8b86052f8dc5f1145801c56241af5ba9037241bd89e6338b58e01310671c268eb5e33acb57d1f99f16440a675827d4017754d601a17ada2fbedf904554a90b01530da8c93cd14ce293cb2bd3e7937e934b79e310fe4d80c13f92f63381355bd80a1abee1a73fdfb6da24ef28002a3" 814 1255 in 815 1256 let case = case_of ~domain ~hash:Digestif.sha384 in 816 1257 817 - [ case ~msg:"df5d564db83592c1128be5d29b7036880d55e834a291a745ed8dcd438c4da6b1b9f39412b2c5110730db83c1ccdfe9059dd96ec7ea2bbcb34e3eba72ef0a1d4721c7c0221e29279f014d63facc5bc8f18c539b92ff2af89e568225d6b4cf599cb3dff5e3c6ddfac0a27f10f636ec220abb72630bae9a39c18fd3663e4651ccac 818 - " ~x:"4efa5136eb6aa74e92bbfc913b0bfebb613db7a47221fb7b64f42e6f 819 - " ~y:"647979b7960ce7b971ff0e5f6435f42a41b18c9de09a301114a013a7cd01183f176f88838379dcb4efb67daea79def3f042cbcf9cc503b4c2151a2364f7c9437b19643e67e24a36bac4a4cfa293deedf8ec6b154a32aa72985f7d8de235334b546c29def458c55d0c5c0ac5d74e2024ec7d4abc2fda516a2a0b1a4d886ad92c204707828a4fc7794f60ee8a4be1101c9e5518f7e19eebd475f2de6f6ba89c28bd129f13993befe5818440319a79549833196342a31dbaf7d79497dec65ee7dbef70e58f99d0595f6a711409ade3151d45563d53c1cd0a8ab1a18beff6502cbb0c069b114ea7be77898d0f4e549991ba0b368971b1072ece4afc380e9ae329a50 820 - " ~k:"7e0f1ce21d185ae65c0a00395567ea9cf217462b58b9c89c4e5ff9cf 821 - " ~r:"5ab43ede66a15688146d1f4cd7164702c0c4457bd4fddebac0482953 822 - " ~s:"6c58e8ab27d28512c46063c96bf5bceb8fbad232d8f5b39c4755d0b1 823 - 824 - " ; case ~msg:"ebeb9e2b692ec6c9afad2a0c2b908939943fdf4bb7438e3bd9288e7681984087ffdcf86502079c291236d7f1adb504e67e0f88bee61b61717014cf06b5fad5cb36f1b223b63912cdcd2b9416524d37f5d7b05c37d1789669e141aff6670db2e0de31673b2055f6799ac887937e5664a659ea0254a8d4ba6f204df2a38c2a77e4 825 - " ~x:"1c84c5c065ff165a0e1d276c2ea9fdbf8423c12aa1c73844d6c64942 826 - " ~y:"31d31a5bb82874bdc76cabae3ec85690aa5103cacbe5234e0d5ef645eef380d3ae2f6239144b82b101a7ef4744aadb8fc98e82b41372e99d6c905ca974b81c9fa521f920a1dffab4e2ee15f61e03b742f42470dc2fa9ab257f1136f9fe4b5aa2ece5207230c4906d67a156a3ffef470cbf3a65e3189b389ddc66c6040a7995c68ae1df2085941b5b1df7d957fbcf366824e0291df88eae55d8d3040d8d09f4f6ffee34ccbd1961852a5a62b26c8daaaa56a8ff7fa863b63c6d604fd3378262e815f55171dca35d04761fe3d9eddc6d32657a96d643d4608ef2143b19f1c9d8c00ed265471b245b60f31f8c7ed48dd6b18b5bec1a6ede145dea40283230724ec8 827 - " ~k:"6f399d636570476f7a2013efdc74a1bb75f5b35ce835079c4e19cc4d 828 - " ~r:"82c3747a0658df006a7a205a6ae2aedd5d2948488559fc3cfd643a64 829 - " ~s:"8636796df622d13f070fbed4184c8138358c21db30c606b8f9be521a 830 - 831 - " ; case ~msg:"dbd2516b03fdc58b32c0233080ffeea41c0d9c156b30332ec42be5e10584be3e3db85ffd5b5bae16fc876a0c9217627d84011223fab57d176def61e40d912e7eeb2bf868734ae8f276a96ab13de558ec42614167c5aa4c60357f71fac58980e579440f69968d2280bc970d0066b5bd6a6f5002481510256b3eb21bbb92ef2cdd 832 - " ~x:"383585098edd867a8522dfad08997095aa23539b9c816a5e28359b51 833 - " ~y:"6e6ee0319af8fafd7ae02013f4227e266244ae5d87fe156cefd4518bcd71aa73f9364bff35d4d23d45b0f47dfe93a607d9f8b399b424ba75072fdced6c3ed2110606fa48ed633faef2064fb336069eec7ebd8ae475978389e6e433d5a435d6529a66c489ce153940d2b1b8c886c8110d8b0aeb641a40e285d6751ce71027c30ec62f4b1fc14f4da20b1d505742cada201cea81930c381f8a6f13dd0a42aac1e0bd7fcd19c6bdd170fac6a423767b831c1e289e0a29ef85d817ad238d91ac3ace2f40a163b0a9bbddc6f05d0bdcd8cc274a74d0743c9fb56556ec1cb8e9cba982c15a9a66fa6b6999b8485db1a86ee18be16e068e12a8a165e3599df96669a1b7 834 - " ~k:"0183d11f1597ec9db32db21c1e910fa2be2f276f35d0583ce8b8f6ab 835 - " ~r:"040405136a1220adbb64ab751db3307fafad5447ab2d9bcc52f79be3 836 - " ~s:"1d35f3269c77c577243f1db8dfdbc4cc4531574276f0da1f7a44acd4 837 - 838 - " ; case ~msg:"34c45435d0cc29269272a93d43320698e454a7c287db9d062092acacd7ca086455e583baee1276caba068fdeeb52183396d5444c5a14ad52a5c2bc082cd87452aa8f9b23056b5f8af2638d965ef4fe6e4e68e88b0f50e01248fe6a6a1d9d6d93b03cd55d16fd83cd4e06763d926f7c50f20f0ed6730613f0f4db571e22d288e4 839 - " ~x:"0f115fc7073262e2f93a9d46b407b0f1bc29292aa09cd1a98a34a219 840 - " ~y:"5ebd8152935ff2a3f9a61b275e9808a041aad5650f593f612af33bc462b8c994169372e8f80f51b15f5ce966ea3e76a912c653978337e962219e323b6e922dea4bcc23c646a22eecde02433126fbace0e3a01fa6d0b9fdea9245d67899a7b745b8847c8087fa7f6c0f3edafab4c3b47220821fe46f1bcb00a323dff3dee47ee1de2ece44e1fdf3e64aa20c9e6b58e534482e7313dace1c617d8ea9a65dd51fd33024f735c3844c5c6b4a3f447e714ab0c17dc88e33f08b142b72e811e6da00299c82898aaf2bed5ae5170c1dd005678d2b576b9ce3e6bc6b2aeb04c9f04e444e2a9808405ff5926548b59304dddca8972631f7fb136808e213ecd93af98e2e54 841 - " ~k:"835a744aa418a297b7e11febe7f3bba590752e58fa1ae12ffa3bfacc 842 - " ~r:"66481f241f6b443148f0b1f2459be5ca16413d947d0981628717c108 843 - " ~s:"2cdaa73500d0ad291252d07ceff9cfeab87a739752291eb5dcefea87 844 - 845 - " ; case ~msg:"d7ac5cc8a4c3f38cfe5c0e1068ea28f0f95d3250d1aeae5f66bdc4d22e23e246ff30429cbcbad3b02a62a0a179d4d107130fa3a780c0092c329c2b026e12e6735a75c495b097aa69ebe98a96ff891234ff379511149e07c6e2411e58976ee93fba7d3d570c911f6f208375783ff5d947a3af0c839d210a8e4a8c8fa41efbc57e 846 - " ~x:"5339ec1f86a0dfd81324fca6a0d3e102b12fba8fe8c1bca45d8ddf10 847 - " ~y:"7b5fb022b55fb61f8ef8cdbfee46c0fc61e59fc62dee5c14d0c3134b4f2659112e3f4e7017f9574a2724188ba6a1ce777a8915bc1171d738754b5ac1df923103ad7b198511ed36272668ae0c2e3142ba011cb45f893ddbf7b38625818cba9a9b78aef8d06007ed505e6dd6e20c92d2500234f104c1283f7c00cf2a3a32458d97f7bd17090f76235c6c4f8ae194d52d67c74a854973fd124751f7f5804b67879b023bb6eeac76e96fe676daebbcb1bc94d5d851d7bc56bfb3d2a0a6d992313786d9fb38ad29b762349451d149d0e5fde6ad497183e352828e251bcc7c3a918be4d03b17af60f3f3ef6d9fb2455df7e8b6b169475e5f89db9908541b567d0f299b 848 - " ~k:"7c62eb8fd725a453fdb2d1e75bbe22f0c5d27a5835135c788061ddfb 849 - " ~r:"5b6be6bad725afa442f29ab7d343d2f8b4b4941cbd23d69164b3c5fd 850 - " ~s:"3a1b94634e313fc4df8292e038c6e876336cef88d691b894c0eccd3f 851 - 852 - " ; case ~msg:"7a96873f0777e8ada9867532ae5f51938bae2d56fb471e0fefa693b71a2aea2571c0108ba59e634401bbaf20a848ad8c305848420cee654a3040007f055d4e975807894b5618b9392363bc7f8c88d526bc491adbd892a93751a21d137ceede8a04423a4d0ca1557bcf334e4f855b04474544212929a81dc71fb3fc41f70d6b18 853 - " ~x:"494b68624728aaae9898c3ca22c1bce810a052e25c881a185af43cd1 854 - " ~y:"0531518177087dff8d04a0666c1301a9b38427c2ea1b162e6fca520181ef22a2d205ceffffb1549c9707805560c6c4b31943d52556bf301c5e0e75924fbe6b5c362fc9801753e630433a9a348f53e62c0746b26e348dfb85853d1ef6eca02cf3f343e77c1769ffc1c109b88ecea16ab6cf476e54312500983622df41e695ec27a41ca7a63121ba97bee7b0e9d547bf420f647d0f8671bf4107a712a7dbc1af3aa8d15b98548d3909f72b9a27f81c46e3defa95eaff7590c626b9ba10974ae8b9f58535d09ca30f9f523539cf584f9bc6c74185c2ff12504f5598ffde6f86021ae514562fed3881197fca22db5590fcf9522ef760ed0e3631a6bd79f29000b42b 855 - " ~k:"065a3ebed489d78ad676afb5373c7028f843816fa97c30169149897f 856 - " ~r:"76bd6ff4cdc4fe37f6705e77efdcac6fbb9d54fc0b220643c662acbf 857 - " ~s:"8a124a3640ad73280f305afc2bc3e57f7a2e074081be7bc90b5b1faa 858 - 859 - " ; case ~msg:"d69694bf9a93ac0cc3915973d40e351247c3bcaca98069cd9c1e7a3c5850636a592ea75fae7bfd38b1290e3f4d0aae8ee689ce4137ea868aaebb17dafb255c4a20e0fac1f4666612f90c46320a62002ede3167a34dff74a306a0842427cb9d2c61599b05c67b673144f6c08232d771f2e0af38253f36e122870e04ebc54a512f 860 - " ~x:"044b1bcb76db64ab7500741f43989d3d878991788947b679bf22c088 861 - " ~y:"9c588b76269b2f087f7e7af4ec4c0ef263e9636f45e73e604502d62fae90a25101bc2bad2a002127d4b60f5c4a1388880cade9463ab5f7997d54a02c24e7d51a4b8a7d91cdf6afca2b433768094533a0de08dec1f19eccb46df1800f53d3dfeefbfb769a80e1686e8d53c60e8c1511a6dd4f42a155bd85f75740bcbb7b1127591822926d1682982375ea5ec29fd1ef4f283b94e02423a830b35e973caf12377ee18d2c6ee7771184d7a94e7a0c4a01044afc4efb2ffecb695e233aeb80c516c77d1c730d30d1aa4f39da51bcc48f44d07abfbe75f228abec2e7273593c98f323a9b003562a168752e837a1232f462a23d3b185ea8a05361570455aadd1037063 862 - " ~k:"4707e611f7d2dbb66f5ff083bab786a525884b49390213300b088fde 863 - " ~r:"108a082d2bf6358a737465624320c4fa9d3719744c2db69d18963d75 864 - " ~s:"420f3537fa6858657db7a21e72e11ec0ec8cc85a09a0d1a445944980 865 - 866 - " ; case ~msg:"17455bfbb128df0f96544bbf83ca0ff374bc086b2de18f74f59049f73eff3c8ef32a48429a4038256304636f3032192795ba2807407ef52b8d59b40bfd517583f998810279c0211771d9e54f2b84e898f9892ef77beba33ff31a2868693f1f0978b89895e350d5ded259fb1397e9c6989986452a0d77df99048fff84b6eb150e 867 - " ~x:"2bca3c613be53a6aab121de91db4fa06b468fc6550c82eeec4bce9b1 868 - " ~y:"850c0fcac073c56318a92104654e6a8ae7678fc4014728304649bf1070277706fbd32ea4d41f77f80a80c88f2701e3665be73f59f914a915d66b411bb05ae5c18b00bc216251399732fdc2a68be6a21b3b088797416ae05ce876b6802e4f941a21b1c661e3f06d501ef2a17659f088d2195dd161f06404487a27b79df1ec574ac3abc30ece2a1428c5e0c1d4c49803398d0714cacd9853854b08746fa453561545e6f0d96cd2c7ce1b89bcace1c697ec4d616bf14d1889a79a806a3699f84f19efe690fa13a3b4383ebf77261400fcbe309c2e5eab0b24b197cb856aa27d7d71d92d32aab656faec5ff792ece53874c4069f540d948f8b2e5599082e21f02d72 869 - " ~k:"4b528d2b2bdfa4f2fce09dc9806ed5302e41cc52f35962653d7f222c 870 - " ~r:"423de9e112ec38e3a034f5d9675c76f9dc8536b30d05678a2963ec16 871 - " ~s:"74051e79699fa44de18e36ab116873593a310e4e09dce18b833fc2f5 872 - 873 - " ; case ~msg:"de1f9606261ff82218c8c145aa4d5847673b459eb55fe7e6454c0443266bbf800c1d09051f5e3141c4370d1b990cf5fea9d2683986c3bdd2823107829ace6ed7034caeb2f657a07b25b7d60240a0205026c2e3018141d479c07787a14e702622f8e6df709b636c6d3d0b5fd54f5516dbad97038e5c0eb31f54db1264d600efc6 874 - " ~x:"366a49173a1783b99550d84c7fa02b6cccab12ee9a306bed7bb81ba7 875 - " ~y:"4d6e89b022c278f3bf8932e706e418ecb20c1bbab13ea8c90b6bd84384f38b311e8fb2c4c0a94ba7d3afca1ba94252a4c1ac1187622cd9c16aa73bb1b4a5cf55b5aa34bd93526f187beeb11700e4afb88c816eda50a50e81860c87fa66a1b63f5ffec3c3ae39bdc009d38fa13da863ca5ec134a7ffcf5dc3ca85cc34d61c5df8f9d9bdbe6a541045b45cb512ef64d1ad3db7b37dba33c6e3c96180cfb26f48c63373a0f0003ae6582679da4850ad2a0b899e0e8a1847df07fef3a4330a72f8a802c06e8e95707e0c7dc1915f6e1731fe650f1ae352e782d2dd77f54e5dac52539a10a22bbc2eea31efb94438a030c4b2451bbff6901b5fb3016cd162af6bf0fb 876 - " ~k:"13894dda6721bf3af8a40603a3d97af240976a8ecb3ead998eee0ff0 877 - " ~r:"5f3839eb663f026f792912d1cb0b448f5e2e593139001e839f71c942 878 - " ~s:"6b07edb6a034d084a61bf3c0a36e7ee6911948ad8f6e50ac6844b1f3 879 - 880 - " ; case ~msg:"c1edd86151af66c6223e413f17e734b2bc024ff066578c55308f1388a91ab87270cd25ca2efbc2867eb715ebed6d10012b6f4808f2de1986ff7f4c369daf46c80a618707888ae3f86e38e7f25d6caa509104d4851cbeefbb75692aad499a33aa35b11409300e495fe007524b4af2c20d33f1c8c04516b6973ac1e07df3f160dd 881 - " ~x:"841ba91e273f1c57847ad336cea47c643335e68f611482a30d6c0bb7 882 - " ~y:"90dbbe4741a76a5ff222ddc833c0e2dd445ad01726bbea25cac247f9ef9da643932736db07cd9aeffeb45119351e00332d9dfc89f5903a541e74e2e9709d0f852ad65240d06159fe54436dd8201f8c56926e8d23c2ecadeb8cbc9aebf12d52be6489e0acb0e7526fba3754b7ec163dc7e2fa9193319124f0cbb61c2ab7ab1a28c14e7d581dfb8de23f53364d204190a58fcb9ea5b6f61a7979b86bb7a7a4263a1066f0516e5870de423a7e3b906d90313d1ff9322450f72ddda4733ac74fca5d4ad2be22c2667b92212069446b42a391233d85216a88c25b76c947d8d56591003df2532fcd7b18f923ed482d464fb76f2c85617840d370ab99e320e88cf9ef8d 883 - " ~k:"5ed84fb90761dc03a5e60f3b396d6cc7f8c16c77f065a6ec0049fa51 884 - " ~r:"836d84d86271e1648466d1955c2b60b2a04cc021405083626347aef9 885 - " ~s:"63c7eeb5e06e81d8923356f799810a26af67c0faa18b392258e4a9a0 886 - 887 - " ; case ~msg:"2b5fb613598c02916bf6b4b0fd7a6b5426ac5b56954392fba32de00bdf4b70953be196ad51ff2c097a81e6ce1d17cf837d2444752be92bd4a9d1a8b41327527ff6bdc0e5c3e0cf46f7e37966aae18a29ce1981f212d714dd6c0cbb410d3a5f3d006ba9b593da150ce422b5cc420f3b561bfdf11dcb9910005709eeb129e20665 888 - " ~x:"220947396c2de85d480bae730298df67283d0d0694950f5efa4ea5d6 889 - " ~y:"95947fbc50d5a80299c90dd27cf3910091420d8af849240ebb541a21b49e528b0f3317acc10493d50e6bce676c433c31147f81286789e6a41f4b2603bac0f6e5ee7affdb44cceb42864358607d45f4655a709d7d67f716d7367bb5eab334f61cef3720c080cab17512329e6d99925b47e4960c85031bfddb13f0c61af80ea46b7b8702f8ad348d57d481efe821054fc83b5266782756a42dd431881ea6cfeb7f7900d8f747aac9976be8945952afb8a274dad03428088310a2456ec254d1ccfb63eedea5d374ed8cc637a7baabf8f422e1a12d5ff316dff8a082068931490a4706503d19f93554f25243751dfe62cd87cb856f644fbb6fc46fb9cf89af5aea1a 890 - " ~k:"2697349761cc4ccbdb4550bb9ca73654280ade31f577ef86100ff4cf 891 - " ~r:"7b455fae1002fa87f36cf6f345716225d4aa1407802af4082bfbb14a 892 - " ~s:"235d8be4ceb0176f5d0c47c1199afc7e3041c7d7508b9feddcaa0d74 893 - 894 - " ; case ~msg:"bd7d69bcc2e4f8a42e627fa21c7fa9fdd3e574b6dc5ad20217e80bcc9997b4c5efb31c7b65dbe8a0a394f0af580387b9917888152dc4f63ce52d3ec4b723bfea8114825f9f1e259f67b5d13bcaa66c97de725fae4ad247bb922497ebed0f092bbac12f2cbd9b71b229087378e8be0626b8d5e8950b0a6e69e05129f0d3842d27 895 - " ~x:"42777374114519bf323bd03b6e0ec238660dc863b1a3b85e0cf8f8a5 896 - " ~y:"6fa6dedc84a1479be43906f2f68df0e93234ca2230c832db079d9cbd9342b2df13de4bff10bdd831313453b33b725cd616acf1fe2f7927ea32d46ff10ef1154e503f71165adeaffdd500a83bf1001ed36ca65bb6974d0372cb0f2118278466fe1286adff3c7ef719c2a02cff9ed9374fbbe6051814d26848b7d970fbecfbbffedf40a03083fe33d3067838ace22854a8e88bfcb02ecd76c378bb5c8babd22dfbe090753abf9e97cb6ba708ce00ffea5c550b09f24930698df115c020b1301d571a470e5a8a6ccfc74ad18949a57f614fcb0f7e8bf7530a731bb6091a7301af42899d9ee9e45aa62ca4903e66733e47d01e26b299746da75c7a57dc00bceb4d6c 897 - " ~k:"3ad0d788fbfaf4caef4beec9c1566a8c7a1de26bf75dba82a8243270 898 - " ~r:"16a2a48578a0b5b57553cd20005b7e8400e1061c4fef20d033f72f8a 899 - " ~s:"6c34d176e95dd49271ee48a3802edf4238401084bc3930201405693a 900 - 901 - " ; case ~msg:"7766e1ab7638bcda3e6fdbd4c85b3661acb2763d411376b2eedb4b2c6bff5d8fa20c0ae5b3cbed20796a6d8b81a1096dc36a39826a18ffb897d36bfb16363cca7632ecb71d2f996cf7cac66669bf4c83114bd53be3be3305efc99d22769188f84289cb1d11501f040b85d15890d29af2c8eae614f74beeeeb5fc915afa4322c2 902 - " ~x:"364bdce93df0eaad45ee0ef5c18828bfe2e381db607e5b6a77ffc6e9 903 - " ~y:"4c2b559024f1b3ff5c7167270cd1f33bbf0f40b9efa25e137441ab4698154e74da3cad34236da4bd1c57d7638e4277278b508e85e3a98d30388ab8638f553e2a700011923e5d154f8c1407452dc4f80770c9c31c368a21e499d5dfb6f05fd67791e761a494200710af8c2188892c2d1c3195be4a0a1d67551ad466fee80d7edc435379a72c3bffad271de31ad2ed107d784f40e24c5a6e8d5aae8f2405964fe3c28cc3652dc3c9523b39d4b083ee65e9a07ce897a17b02b354766f1b19c2b1229ab468b0148ca8fe89484b7b360024218086af56403707bec65c52281cb8aa5346cb6f6481430e8e057146f390607c572b5bd8426b90ef3a827cb0d58bd438d1 904 - " ~k:"576f8454ff45df954d123bd1384cbe004413c8f85493ed7d6425bfaa 905 - " ~r:"09c61878a9917177058e9dff27106bdca7d06c500e09099306668cbf 906 - " ~s:"7b8b6c4c5615976d7a735ac3e184cde96154ffc87b458924d4602895 907 - 908 - " ; case ~msg:"84095278f7f1d578e798399af0bc9f4695f9302ea5972479adf90c95fc25d59e576d97b89b73dec629cef05d6173b55d015a3fb1d8191ae540d552409b03a7a8db511bad0951896db949fcc28870f9d17314734ca6a3472683d02fdc8defa7b9d3762ae9357ca2a6ab623b046350fa211d5213787127d2711cbd91405abbe50d 909 - " ~x:"161fff26a7b9d7ddc15237edbab3c1f99b7294c70feb96f962df8973 910 - " ~y:"4b52c56fc64922ac04ee7a80fc5c224013e2ffdaa167381257e00c597b433641ceadbc9b16568bbc9c6d31d02c8e36db2e3987520ce8590856bd4a841b725ec95a4659a61a0086f66a6bfdbf1e4bf92b441928cf319f929a6428f5e3ba7c89123dbb0cacc16bb0e2b80854b0f60dfaa99f9c4caa412c443a073b7a51259125f012d98f0f6699d70ade66df9c5e18185672e0e2830e0585413da2956c89d2320faac03aaa83fe718a0d6cf7feb38a194e4362d7c89e4a13967e3a2d4493f4ec09ac2fc89d56a595472e60332448548d91cd6aac84a2f9b4d7a80462dc154779be5f9e1f709b9d9a156273033fe6e4842ec47521964d2e2fe262280fddec6403e8 911 - " ~k:"7cbe0c1c29b955fa1fdafcab79c02177c15ec5789a4dd53a6ad29ce8 912 - " ~r:"0c4d4527815a94bc2d77063ea69049be6a2b3b3a3a0badd5e62a8f9a 913 - " ~s:"5787ced7081fad3fe19ab5b9028e9e8df18639e4991ab6e1e243416e 914 - 915 - " ; case ~msg:"30eedc9d630b632082c196b969d24f6eb9cf1b1e2c53d244e8d8b50a40982ab53c4d57ff995fa8458908a743890382da6513cfe9c1991824873615a8a16374a5e5dc2fab3f5cd25652ec8aa3939f4884f74ac737989b6ac2e43f45b885206a31e797fd8576357e4b4baa566291815dac2f546f4abf8ba1de1120fd804284e959 916 - " ~x:"0209c00edad10594f7cd7878472169d512a7e8dc3fc1cd69285e69d5 917 - " ~y:"8920f6ab95b1dc6b93e08ead6b08141cc2a8f1ffbb71d5ec5964f6b2c3d72ff3adade52254370f130990b43487775c2fe017a8200d8119818a15ed7e5636bfbf3164042f27bb1ea418698b6756f75a8fdaebf0f6e5423e460287f4fdd2a0ef305e658741373d3baecce79063962f883398c314e36230ba8c570e667c30cac8fbaa4e70202a9157d22708ca605403066d0fc84845bce9b8c3b41ec32f40c845a532fdff4dd10cf62a714121ea8a6188500645afa9316fb3e11628b163d35d8cfcc55272b650e8072c237645600150bbb66d393c1c97345d5820f178dd405b5d46fc4ac8a5f3929e6b1627944093178a8d65101059fbbbb7081174f2308b2653ce 918 - " ~k:"36454e085b6b3dcc7c755b65ff46697b099485abd6ceb00cbf5dceed 919 - " ~r:"45212d1c8c128002fcb3ce35583ff8d08363711c1598307d9ec6a108 920 - " ~s:"4858105649db5992764dd32b102d9b9d2bc6af64c6a81595611e3e20" ] 1258 + [ 1259 + case 1260 + ~msg: 1261 + "df5d564db83592c1128be5d29b7036880d55e834a291a745ed8dcd438c4da6b1b9f39412b2c5110730db83c1ccdfe9059dd96ec7ea2bbcb34e3eba72ef0a1d4721c7c0221e29279f014d63facc5bc8f18c539b92ff2af89e568225d6b4cf599cb3dff5e3c6ddfac0a27f10f636ec220abb72630bae9a39c18fd3663e4651ccac\n" 1262 + ~x:"4efa5136eb6aa74e92bbfc913b0bfebb613db7a47221fb7b64f42e6f\n" 1263 + ~y: 1264 + "647979b7960ce7b971ff0e5f6435f42a41b18c9de09a301114a013a7cd01183f176f88838379dcb4efb67daea79def3f042cbcf9cc503b4c2151a2364f7c9437b19643e67e24a36bac4a4cfa293deedf8ec6b154a32aa72985f7d8de235334b546c29def458c55d0c5c0ac5d74e2024ec7d4abc2fda516a2a0b1a4d886ad92c204707828a4fc7794f60ee8a4be1101c9e5518f7e19eebd475f2de6f6ba89c28bd129f13993befe5818440319a79549833196342a31dbaf7d79497dec65ee7dbef70e58f99d0595f6a711409ade3151d45563d53c1cd0a8ab1a18beff6502cbb0c069b114ea7be77898d0f4e549991ba0b368971b1072ece4afc380e9ae329a50\n" 1265 + ~k:"7e0f1ce21d185ae65c0a00395567ea9cf217462b58b9c89c4e5ff9cf\n" 1266 + ~r:"5ab43ede66a15688146d1f4cd7164702c0c4457bd4fddebac0482953\n" 1267 + ~s:"6c58e8ab27d28512c46063c96bf5bceb8fbad232d8f5b39c4755d0b1\n\n"; 1268 + case 1269 + ~msg: 1270 + "ebeb9e2b692ec6c9afad2a0c2b908939943fdf4bb7438e3bd9288e7681984087ffdcf86502079c291236d7f1adb504e67e0f88bee61b61717014cf06b5fad5cb36f1b223b63912cdcd2b9416524d37f5d7b05c37d1789669e141aff6670db2e0de31673b2055f6799ac887937e5664a659ea0254a8d4ba6f204df2a38c2a77e4\n" 1271 + ~x:"1c84c5c065ff165a0e1d276c2ea9fdbf8423c12aa1c73844d6c64942\n" 1272 + ~y: 1273 + "31d31a5bb82874bdc76cabae3ec85690aa5103cacbe5234e0d5ef645eef380d3ae2f6239144b82b101a7ef4744aadb8fc98e82b41372e99d6c905ca974b81c9fa521f920a1dffab4e2ee15f61e03b742f42470dc2fa9ab257f1136f9fe4b5aa2ece5207230c4906d67a156a3ffef470cbf3a65e3189b389ddc66c6040a7995c68ae1df2085941b5b1df7d957fbcf366824e0291df88eae55d8d3040d8d09f4f6ffee34ccbd1961852a5a62b26c8daaaa56a8ff7fa863b63c6d604fd3378262e815f55171dca35d04761fe3d9eddc6d32657a96d643d4608ef2143b19f1c9d8c00ed265471b245b60f31f8c7ed48dd6b18b5bec1a6ede145dea40283230724ec8\n" 1274 + ~k:"6f399d636570476f7a2013efdc74a1bb75f5b35ce835079c4e19cc4d\n" 1275 + ~r:"82c3747a0658df006a7a205a6ae2aedd5d2948488559fc3cfd643a64\n" 1276 + ~s:"8636796df622d13f070fbed4184c8138358c21db30c606b8f9be521a\n\n"; 1277 + case 1278 + ~msg: 1279 + "dbd2516b03fdc58b32c0233080ffeea41c0d9c156b30332ec42be5e10584be3e3db85ffd5b5bae16fc876a0c9217627d84011223fab57d176def61e40d912e7eeb2bf868734ae8f276a96ab13de558ec42614167c5aa4c60357f71fac58980e579440f69968d2280bc970d0066b5bd6a6f5002481510256b3eb21bbb92ef2cdd\n" 1280 + ~x:"383585098edd867a8522dfad08997095aa23539b9c816a5e28359b51\n" 1281 + ~y: 1282 + "6e6ee0319af8fafd7ae02013f4227e266244ae5d87fe156cefd4518bcd71aa73f9364bff35d4d23d45b0f47dfe93a607d9f8b399b424ba75072fdced6c3ed2110606fa48ed633faef2064fb336069eec7ebd8ae475978389e6e433d5a435d6529a66c489ce153940d2b1b8c886c8110d8b0aeb641a40e285d6751ce71027c30ec62f4b1fc14f4da20b1d505742cada201cea81930c381f8a6f13dd0a42aac1e0bd7fcd19c6bdd170fac6a423767b831c1e289e0a29ef85d817ad238d91ac3ace2f40a163b0a9bbddc6f05d0bdcd8cc274a74d0743c9fb56556ec1cb8e9cba982c15a9a66fa6b6999b8485db1a86ee18be16e068e12a8a165e3599df96669a1b7\n" 1283 + ~k:"0183d11f1597ec9db32db21c1e910fa2be2f276f35d0583ce8b8f6ab\n" 1284 + ~r:"040405136a1220adbb64ab751db3307fafad5447ab2d9bcc52f79be3\n" 1285 + ~s:"1d35f3269c77c577243f1db8dfdbc4cc4531574276f0da1f7a44acd4\n\n"; 1286 + case 1287 + ~msg: 1288 + "34c45435d0cc29269272a93d43320698e454a7c287db9d062092acacd7ca086455e583baee1276caba068fdeeb52183396d5444c5a14ad52a5c2bc082cd87452aa8f9b23056b5f8af2638d965ef4fe6e4e68e88b0f50e01248fe6a6a1d9d6d93b03cd55d16fd83cd4e06763d926f7c50f20f0ed6730613f0f4db571e22d288e4\n" 1289 + ~x:"0f115fc7073262e2f93a9d46b407b0f1bc29292aa09cd1a98a34a219\n" 1290 + ~y: 1291 + "5ebd8152935ff2a3f9a61b275e9808a041aad5650f593f612af33bc462b8c994169372e8f80f51b15f5ce966ea3e76a912c653978337e962219e323b6e922dea4bcc23c646a22eecde02433126fbace0e3a01fa6d0b9fdea9245d67899a7b745b8847c8087fa7f6c0f3edafab4c3b47220821fe46f1bcb00a323dff3dee47ee1de2ece44e1fdf3e64aa20c9e6b58e534482e7313dace1c617d8ea9a65dd51fd33024f735c3844c5c6b4a3f447e714ab0c17dc88e33f08b142b72e811e6da00299c82898aaf2bed5ae5170c1dd005678d2b576b9ce3e6bc6b2aeb04c9f04e444e2a9808405ff5926548b59304dddca8972631f7fb136808e213ecd93af98e2e54\n" 1292 + ~k:"835a744aa418a297b7e11febe7f3bba590752e58fa1ae12ffa3bfacc\n" 1293 + ~r:"66481f241f6b443148f0b1f2459be5ca16413d947d0981628717c108\n" 1294 + ~s:"2cdaa73500d0ad291252d07ceff9cfeab87a739752291eb5dcefea87\n\n"; 1295 + case 1296 + ~msg: 1297 + "d7ac5cc8a4c3f38cfe5c0e1068ea28f0f95d3250d1aeae5f66bdc4d22e23e246ff30429cbcbad3b02a62a0a179d4d107130fa3a780c0092c329c2b026e12e6735a75c495b097aa69ebe98a96ff891234ff379511149e07c6e2411e58976ee93fba7d3d570c911f6f208375783ff5d947a3af0c839d210a8e4a8c8fa41efbc57e\n" 1298 + ~x:"5339ec1f86a0dfd81324fca6a0d3e102b12fba8fe8c1bca45d8ddf10\n" 1299 + ~y: 1300 + "7b5fb022b55fb61f8ef8cdbfee46c0fc61e59fc62dee5c14d0c3134b4f2659112e3f4e7017f9574a2724188ba6a1ce777a8915bc1171d738754b5ac1df923103ad7b198511ed36272668ae0c2e3142ba011cb45f893ddbf7b38625818cba9a9b78aef8d06007ed505e6dd6e20c92d2500234f104c1283f7c00cf2a3a32458d97f7bd17090f76235c6c4f8ae194d52d67c74a854973fd124751f7f5804b67879b023bb6eeac76e96fe676daebbcb1bc94d5d851d7bc56bfb3d2a0a6d992313786d9fb38ad29b762349451d149d0e5fde6ad497183e352828e251bcc7c3a918be4d03b17af60f3f3ef6d9fb2455df7e8b6b169475e5f89db9908541b567d0f299b\n" 1301 + ~k:"7c62eb8fd725a453fdb2d1e75bbe22f0c5d27a5835135c788061ddfb\n" 1302 + ~r:"5b6be6bad725afa442f29ab7d343d2f8b4b4941cbd23d69164b3c5fd\n" 1303 + ~s:"3a1b94634e313fc4df8292e038c6e876336cef88d691b894c0eccd3f\n\n"; 1304 + case 1305 + ~msg: 1306 + "7a96873f0777e8ada9867532ae5f51938bae2d56fb471e0fefa693b71a2aea2571c0108ba59e634401bbaf20a848ad8c305848420cee654a3040007f055d4e975807894b5618b9392363bc7f8c88d526bc491adbd892a93751a21d137ceede8a04423a4d0ca1557bcf334e4f855b04474544212929a81dc71fb3fc41f70d6b18\n" 1307 + ~x:"494b68624728aaae9898c3ca22c1bce810a052e25c881a185af43cd1\n" 1308 + ~y: 1309 + "0531518177087dff8d04a0666c1301a9b38427c2ea1b162e6fca520181ef22a2d205ceffffb1549c9707805560c6c4b31943d52556bf301c5e0e75924fbe6b5c362fc9801753e630433a9a348f53e62c0746b26e348dfb85853d1ef6eca02cf3f343e77c1769ffc1c109b88ecea16ab6cf476e54312500983622df41e695ec27a41ca7a63121ba97bee7b0e9d547bf420f647d0f8671bf4107a712a7dbc1af3aa8d15b98548d3909f72b9a27f81c46e3defa95eaff7590c626b9ba10974ae8b9f58535d09ca30f9f523539cf584f9bc6c74185c2ff12504f5598ffde6f86021ae514562fed3881197fca22db5590fcf9522ef760ed0e3631a6bd79f29000b42b\n" 1310 + ~k:"065a3ebed489d78ad676afb5373c7028f843816fa97c30169149897f\n" 1311 + ~r:"76bd6ff4cdc4fe37f6705e77efdcac6fbb9d54fc0b220643c662acbf\n" 1312 + ~s:"8a124a3640ad73280f305afc2bc3e57f7a2e074081be7bc90b5b1faa\n\n"; 1313 + case 1314 + ~msg: 1315 + "d69694bf9a93ac0cc3915973d40e351247c3bcaca98069cd9c1e7a3c5850636a592ea75fae7bfd38b1290e3f4d0aae8ee689ce4137ea868aaebb17dafb255c4a20e0fac1f4666612f90c46320a62002ede3167a34dff74a306a0842427cb9d2c61599b05c67b673144f6c08232d771f2e0af38253f36e122870e04ebc54a512f\n" 1316 + ~x:"044b1bcb76db64ab7500741f43989d3d878991788947b679bf22c088\n" 1317 + ~y: 1318 + "9c588b76269b2f087f7e7af4ec4c0ef263e9636f45e73e604502d62fae90a25101bc2bad2a002127d4b60f5c4a1388880cade9463ab5f7997d54a02c24e7d51a4b8a7d91cdf6afca2b433768094533a0de08dec1f19eccb46df1800f53d3dfeefbfb769a80e1686e8d53c60e8c1511a6dd4f42a155bd85f75740bcbb7b1127591822926d1682982375ea5ec29fd1ef4f283b94e02423a830b35e973caf12377ee18d2c6ee7771184d7a94e7a0c4a01044afc4efb2ffecb695e233aeb80c516c77d1c730d30d1aa4f39da51bcc48f44d07abfbe75f228abec2e7273593c98f323a9b003562a168752e837a1232f462a23d3b185ea8a05361570455aadd1037063\n" 1319 + ~k:"4707e611f7d2dbb66f5ff083bab786a525884b49390213300b088fde\n" 1320 + ~r:"108a082d2bf6358a737465624320c4fa9d3719744c2db69d18963d75\n" 1321 + ~s:"420f3537fa6858657db7a21e72e11ec0ec8cc85a09a0d1a445944980\n\n"; 1322 + case 1323 + ~msg: 1324 + "17455bfbb128df0f96544bbf83ca0ff374bc086b2de18f74f59049f73eff3c8ef32a48429a4038256304636f3032192795ba2807407ef52b8d59b40bfd517583f998810279c0211771d9e54f2b84e898f9892ef77beba33ff31a2868693f1f0978b89895e350d5ded259fb1397e9c6989986452a0d77df99048fff84b6eb150e\n" 1325 + ~x:"2bca3c613be53a6aab121de91db4fa06b468fc6550c82eeec4bce9b1\n" 1326 + ~y: 1327 + "850c0fcac073c56318a92104654e6a8ae7678fc4014728304649bf1070277706fbd32ea4d41f77f80a80c88f2701e3665be73f59f914a915d66b411bb05ae5c18b00bc216251399732fdc2a68be6a21b3b088797416ae05ce876b6802e4f941a21b1c661e3f06d501ef2a17659f088d2195dd161f06404487a27b79df1ec574ac3abc30ece2a1428c5e0c1d4c49803398d0714cacd9853854b08746fa453561545e6f0d96cd2c7ce1b89bcace1c697ec4d616bf14d1889a79a806a3699f84f19efe690fa13a3b4383ebf77261400fcbe309c2e5eab0b24b197cb856aa27d7d71d92d32aab656faec5ff792ece53874c4069f540d948f8b2e5599082e21f02d72\n" 1328 + ~k:"4b528d2b2bdfa4f2fce09dc9806ed5302e41cc52f35962653d7f222c\n" 1329 + ~r:"423de9e112ec38e3a034f5d9675c76f9dc8536b30d05678a2963ec16\n" 1330 + ~s:"74051e79699fa44de18e36ab116873593a310e4e09dce18b833fc2f5\n\n"; 1331 + case 1332 + ~msg: 1333 + "de1f9606261ff82218c8c145aa4d5847673b459eb55fe7e6454c0443266bbf800c1d09051f5e3141c4370d1b990cf5fea9d2683986c3bdd2823107829ace6ed7034caeb2f657a07b25b7d60240a0205026c2e3018141d479c07787a14e702622f8e6df709b636c6d3d0b5fd54f5516dbad97038e5c0eb31f54db1264d600efc6\n" 1334 + ~x:"366a49173a1783b99550d84c7fa02b6cccab12ee9a306bed7bb81ba7\n" 1335 + ~y: 1336 + "4d6e89b022c278f3bf8932e706e418ecb20c1bbab13ea8c90b6bd84384f38b311e8fb2c4c0a94ba7d3afca1ba94252a4c1ac1187622cd9c16aa73bb1b4a5cf55b5aa34bd93526f187beeb11700e4afb88c816eda50a50e81860c87fa66a1b63f5ffec3c3ae39bdc009d38fa13da863ca5ec134a7ffcf5dc3ca85cc34d61c5df8f9d9bdbe6a541045b45cb512ef64d1ad3db7b37dba33c6e3c96180cfb26f48c63373a0f0003ae6582679da4850ad2a0b899e0e8a1847df07fef3a4330a72f8a802c06e8e95707e0c7dc1915f6e1731fe650f1ae352e782d2dd77f54e5dac52539a10a22bbc2eea31efb94438a030c4b2451bbff6901b5fb3016cd162af6bf0fb\n" 1337 + ~k:"13894dda6721bf3af8a40603a3d97af240976a8ecb3ead998eee0ff0\n" 1338 + ~r:"5f3839eb663f026f792912d1cb0b448f5e2e593139001e839f71c942\n" 1339 + ~s:"6b07edb6a034d084a61bf3c0a36e7ee6911948ad8f6e50ac6844b1f3\n\n"; 1340 + case 1341 + ~msg: 1342 + "c1edd86151af66c6223e413f17e734b2bc024ff066578c55308f1388a91ab87270cd25ca2efbc2867eb715ebed6d10012b6f4808f2de1986ff7f4c369daf46c80a618707888ae3f86e38e7f25d6caa509104d4851cbeefbb75692aad499a33aa35b11409300e495fe007524b4af2c20d33f1c8c04516b6973ac1e07df3f160dd\n" 1343 + ~x:"841ba91e273f1c57847ad336cea47c643335e68f611482a30d6c0bb7\n" 1344 + ~y: 1345 + "90dbbe4741a76a5ff222ddc833c0e2dd445ad01726bbea25cac247f9ef9da643932736db07cd9aeffeb45119351e00332d9dfc89f5903a541e74e2e9709d0f852ad65240d06159fe54436dd8201f8c56926e8d23c2ecadeb8cbc9aebf12d52be6489e0acb0e7526fba3754b7ec163dc7e2fa9193319124f0cbb61c2ab7ab1a28c14e7d581dfb8de23f53364d204190a58fcb9ea5b6f61a7979b86bb7a7a4263a1066f0516e5870de423a7e3b906d90313d1ff9322450f72ddda4733ac74fca5d4ad2be22c2667b92212069446b42a391233d85216a88c25b76c947d8d56591003df2532fcd7b18f923ed482d464fb76f2c85617840d370ab99e320e88cf9ef8d\n" 1346 + ~k:"5ed84fb90761dc03a5e60f3b396d6cc7f8c16c77f065a6ec0049fa51\n" 1347 + ~r:"836d84d86271e1648466d1955c2b60b2a04cc021405083626347aef9\n" 1348 + ~s:"63c7eeb5e06e81d8923356f799810a26af67c0faa18b392258e4a9a0\n\n"; 1349 + case 1350 + ~msg: 1351 + "2b5fb613598c02916bf6b4b0fd7a6b5426ac5b56954392fba32de00bdf4b70953be196ad51ff2c097a81e6ce1d17cf837d2444752be92bd4a9d1a8b41327527ff6bdc0e5c3e0cf46f7e37966aae18a29ce1981f212d714dd6c0cbb410d3a5f3d006ba9b593da150ce422b5cc420f3b561bfdf11dcb9910005709eeb129e20665\n" 1352 + ~x:"220947396c2de85d480bae730298df67283d0d0694950f5efa4ea5d6\n" 1353 + ~y: 1354 + "95947fbc50d5a80299c90dd27cf3910091420d8af849240ebb541a21b49e528b0f3317acc10493d50e6bce676c433c31147f81286789e6a41f4b2603bac0f6e5ee7affdb44cceb42864358607d45f4655a709d7d67f716d7367bb5eab334f61cef3720c080cab17512329e6d99925b47e4960c85031bfddb13f0c61af80ea46b7b8702f8ad348d57d481efe821054fc83b5266782756a42dd431881ea6cfeb7f7900d8f747aac9976be8945952afb8a274dad03428088310a2456ec254d1ccfb63eedea5d374ed8cc637a7baabf8f422e1a12d5ff316dff8a082068931490a4706503d19f93554f25243751dfe62cd87cb856f644fbb6fc46fb9cf89af5aea1a\n" 1355 + ~k:"2697349761cc4ccbdb4550bb9ca73654280ade31f577ef86100ff4cf\n" 1356 + ~r:"7b455fae1002fa87f36cf6f345716225d4aa1407802af4082bfbb14a\n" 1357 + ~s:"235d8be4ceb0176f5d0c47c1199afc7e3041c7d7508b9feddcaa0d74\n\n"; 1358 + case 1359 + ~msg: 1360 + "bd7d69bcc2e4f8a42e627fa21c7fa9fdd3e574b6dc5ad20217e80bcc9997b4c5efb31c7b65dbe8a0a394f0af580387b9917888152dc4f63ce52d3ec4b723bfea8114825f9f1e259f67b5d13bcaa66c97de725fae4ad247bb922497ebed0f092bbac12f2cbd9b71b229087378e8be0626b8d5e8950b0a6e69e05129f0d3842d27\n" 1361 + ~x:"42777374114519bf323bd03b6e0ec238660dc863b1a3b85e0cf8f8a5\n" 1362 + ~y: 1363 + "6fa6dedc84a1479be43906f2f68df0e93234ca2230c832db079d9cbd9342b2df13de4bff10bdd831313453b33b725cd616acf1fe2f7927ea32d46ff10ef1154e503f71165adeaffdd500a83bf1001ed36ca65bb6974d0372cb0f2118278466fe1286adff3c7ef719c2a02cff9ed9374fbbe6051814d26848b7d970fbecfbbffedf40a03083fe33d3067838ace22854a8e88bfcb02ecd76c378bb5c8babd22dfbe090753abf9e97cb6ba708ce00ffea5c550b09f24930698df115c020b1301d571a470e5a8a6ccfc74ad18949a57f614fcb0f7e8bf7530a731bb6091a7301af42899d9ee9e45aa62ca4903e66733e47d01e26b299746da75c7a57dc00bceb4d6c\n" 1364 + ~k:"3ad0d788fbfaf4caef4beec9c1566a8c7a1de26bf75dba82a8243270\n" 1365 + ~r:"16a2a48578a0b5b57553cd20005b7e8400e1061c4fef20d033f72f8a\n" 1366 + ~s:"6c34d176e95dd49271ee48a3802edf4238401084bc3930201405693a\n\n"; 1367 + case 1368 + ~msg: 1369 + "7766e1ab7638bcda3e6fdbd4c85b3661acb2763d411376b2eedb4b2c6bff5d8fa20c0ae5b3cbed20796a6d8b81a1096dc36a39826a18ffb897d36bfb16363cca7632ecb71d2f996cf7cac66669bf4c83114bd53be3be3305efc99d22769188f84289cb1d11501f040b85d15890d29af2c8eae614f74beeeeb5fc915afa4322c2\n" 1370 + ~x:"364bdce93df0eaad45ee0ef5c18828bfe2e381db607e5b6a77ffc6e9\n" 1371 + ~y: 1372 + "4c2b559024f1b3ff5c7167270cd1f33bbf0f40b9efa25e137441ab4698154e74da3cad34236da4bd1c57d7638e4277278b508e85e3a98d30388ab8638f553e2a700011923e5d154f8c1407452dc4f80770c9c31c368a21e499d5dfb6f05fd67791e761a494200710af8c2188892c2d1c3195be4a0a1d67551ad466fee80d7edc435379a72c3bffad271de31ad2ed107d784f40e24c5a6e8d5aae8f2405964fe3c28cc3652dc3c9523b39d4b083ee65e9a07ce897a17b02b354766f1b19c2b1229ab468b0148ca8fe89484b7b360024218086af56403707bec65c52281cb8aa5346cb6f6481430e8e057146f390607c572b5bd8426b90ef3a827cb0d58bd438d1\n" 1373 + ~k:"576f8454ff45df954d123bd1384cbe004413c8f85493ed7d6425bfaa\n" 1374 + ~r:"09c61878a9917177058e9dff27106bdca7d06c500e09099306668cbf\n" 1375 + ~s:"7b8b6c4c5615976d7a735ac3e184cde96154ffc87b458924d4602895\n\n"; 1376 + case 1377 + ~msg: 1378 + "84095278f7f1d578e798399af0bc9f4695f9302ea5972479adf90c95fc25d59e576d97b89b73dec629cef05d6173b55d015a3fb1d8191ae540d552409b03a7a8db511bad0951896db949fcc28870f9d17314734ca6a3472683d02fdc8defa7b9d3762ae9357ca2a6ab623b046350fa211d5213787127d2711cbd91405abbe50d\n" 1379 + ~x:"161fff26a7b9d7ddc15237edbab3c1f99b7294c70feb96f962df8973\n" 1380 + ~y: 1381 + "4b52c56fc64922ac04ee7a80fc5c224013e2ffdaa167381257e00c597b433641ceadbc9b16568bbc9c6d31d02c8e36db2e3987520ce8590856bd4a841b725ec95a4659a61a0086f66a6bfdbf1e4bf92b441928cf319f929a6428f5e3ba7c89123dbb0cacc16bb0e2b80854b0f60dfaa99f9c4caa412c443a073b7a51259125f012d98f0f6699d70ade66df9c5e18185672e0e2830e0585413da2956c89d2320faac03aaa83fe718a0d6cf7feb38a194e4362d7c89e4a13967e3a2d4493f4ec09ac2fc89d56a595472e60332448548d91cd6aac84a2f9b4d7a80462dc154779be5f9e1f709b9d9a156273033fe6e4842ec47521964d2e2fe262280fddec6403e8\n" 1382 + ~k:"7cbe0c1c29b955fa1fdafcab79c02177c15ec5789a4dd53a6ad29ce8\n" 1383 + ~r:"0c4d4527815a94bc2d77063ea69049be6a2b3b3a3a0badd5e62a8f9a\n" 1384 + ~s:"5787ced7081fad3fe19ab5b9028e9e8df18639e4991ab6e1e243416e\n\n"; 1385 + case 1386 + ~msg: 1387 + "30eedc9d630b632082c196b969d24f6eb9cf1b1e2c53d244e8d8b50a40982ab53c4d57ff995fa8458908a743890382da6513cfe9c1991824873615a8a16374a5e5dc2fab3f5cd25652ec8aa3939f4884f74ac737989b6ac2e43f45b885206a31e797fd8576357e4b4baa566291815dac2f546f4abf8ba1de1120fd804284e959\n" 1388 + ~x:"0209c00edad10594f7cd7878472169d512a7e8dc3fc1cd69285e69d5\n" 1389 + ~y: 1390 + "8920f6ab95b1dc6b93e08ead6b08141cc2a8f1ffbb71d5ec5964f6b2c3d72ff3adade52254370f130990b43487775c2fe017a8200d8119818a15ed7e5636bfbf3164042f27bb1ea418698b6756f75a8fdaebf0f6e5423e460287f4fdd2a0ef305e658741373d3baecce79063962f883398c314e36230ba8c570e667c30cac8fbaa4e70202a9157d22708ca605403066d0fc84845bce9b8c3b41ec32f40c845a532fdff4dd10cf62a714121ea8a6188500645afa9316fb3e11628b163d35d8cfcc55272b650e8072c237645600150bbb66d393c1c97345d5820f178dd405b5d46fc4ac8a5f3929e6b1627944093178a8d65101059fbbbb7081174f2308b2653ce\n" 1391 + ~k:"36454e085b6b3dcc7c755b65ff46697b099485abd6ceb00cbf5dceed\n" 1392 + ~r:"45212d1c8c128002fcb3ce35583ff8d08363711c1598307d9ec6a108\n" 1393 + ~s:"4858105649db5992764dd32b102d9b9d2bc6af64c6a81595611e3e20"; 1394 + ] 921 1395 922 1396 let sha512_n224_cases = 923 1397 (* [mod = L=2048, N=224, SHA-512] *) 924 - let domain = params 925 - ~p:"bfebd000b2d6cd4ab38efba35df334df721d6c2f2b3d956679cbad009f3dfbd002952cc899cc2356ec8769bd3d1ba5a73023729888da92ca48a5ee94c97f4f04a2e3acb4f33a2f0fb3783c31f2c70fa7c70f38214a27dadec8b12e67996a9e85ee3bb148803130147392dc5253c04d7063535e6cd646bfb186984e08b58b74a7be5b333bf32b0abfd5665360e9a923a0c528ff1c62c7253458f5678528719d436e50148741f45dc7dd2c6cac71c55231f12a83fefd2ed0a33ede1b8a51f566fcf7890682cdc1931dc207c92bf2ef4e28ab31661eeb77f1601eea941c9591f038d3f00d912857db05e64b2ad569320061c6f863ff3354d842e7e7ea715afef8d1 926 - " ~q:"aa986df8a064278e9363316a9830bcfa490656faa6d5daa817d87949 927 - " ~g:"8195ad9a478fd985216ee58368366d2edd13c12b3d62239169fa042d91156408b483122f44ed6236b8308a6cdb52f9af3de88ec89e039afad7da3aa66c1976049a8e0a7d18d567baf99fcefe315cada01548386b10b25e52f52ed78eb4d28082e5e1ffee9480c4fe2cc4aafd1efc9d4fd2cc6d155968931271ef15b3240e7fb043a80c8f628befe09d645077c1029d21e0ac8bf0ba9c27714d1b580ede594aa01b3b76f6e745fc1ec07db37e2fd7e98c6c8c6915228e422c309de9f5db168f50249d1be1ed3298090808e2ebb896bb79b8c4cbf94d4c2064e37e612ba4449d7ac210edde211416d64b051dd8046ab041732665411a7f154d31b3e11a51da7fc0" 1398 + let domain = 1399 + params 1400 + ~p: 1401 + "bfebd000b2d6cd4ab38efba35df334df721d6c2f2b3d956679cbad009f3dfbd002952cc899cc2356ec8769bd3d1ba5a73023729888da92ca48a5ee94c97f4f04a2e3acb4f33a2f0fb3783c31f2c70fa7c70f38214a27dadec8b12e67996a9e85ee3bb148803130147392dc5253c04d7063535e6cd646bfb186984e08b58b74a7be5b333bf32b0abfd5665360e9a923a0c528ff1c62c7253458f5678528719d436e50148741f45dc7dd2c6cac71c55231f12a83fefd2ed0a33ede1b8a51f566fcf7890682cdc1931dc207c92bf2ef4e28ab31661eeb77f1601eea941c9591f038d3f00d912857db05e64b2ad569320061c6f863ff3354d842e7e7ea715afef8d1\n" 1402 + ~q:"aa986df8a064278e9363316a9830bcfa490656faa6d5daa817d87949\n" 1403 + ~g: 1404 + "8195ad9a478fd985216ee58368366d2edd13c12b3d62239169fa042d91156408b483122f44ed6236b8308a6cdb52f9af3de88ec89e039afad7da3aa66c1976049a8e0a7d18d567baf99fcefe315cada01548386b10b25e52f52ed78eb4d28082e5e1ffee9480c4fe2cc4aafd1efc9d4fd2cc6d155968931271ef15b3240e7fb043a80c8f628befe09d645077c1029d21e0ac8bf0ba9c27714d1b580ede594aa01b3b76f6e745fc1ec07db37e2fd7e98c6c8c6915228e422c309de9f5db168f50249d1be1ed3298090808e2ebb896bb79b8c4cbf94d4c2064e37e612ba4449d7ac210edde211416d64b051dd8046ab041732665411a7f154d31b3e11a51da7fc0" 928 1405 in 929 1406 let case = case_of ~domain ~hash:Digestif.sha512 in 930 1407 931 - 932 - [ case ~msg:"e9f59c6a5cbe8f5b0cf75008d06a076a6739bdddb39b82143cd03939aa4738a287c2a6f31829bbe15f02cc2ee7d7122dbd132825970daddd8a4d851da86e7edc8940cb1188319218b8e0248a103eae34bc68d85f5a32830d7e5dc7718f74db5e4224c0debe1e841e1eea1a88fee0f85d9fb087cbcee55f86037a646e38346d2b 933 - " ~x:"6a5b4ffc44238d1852fb9b74e4c1661be85984043cfeee023f57cac6 934 - " ~y:"af6721bf75dec6a1b76ad35ca3750def31117c5b441c15a306835a1db74c003b86ae9099ebfb745b0aa9cb000cf43fb021513b8f197bc865b22bf949b491809ad752ffc1ca8e54bea16dc7f539e4c55fb70a7743dd28f262f60ef0f2fcaac29e8021a7938c18ffe03075d0b7e0a2b4dcabe46ed1953d33e37f113af519ab0bf0b6186c12b5f6488437f5193096e2fd6a6a1835604794c66b42ae5265c1cf1cb53ae84997975e0318a93ce41e3902e4ef54de3c56555bd19491acd53f3e57464e1f460389dbc5fa80648fa5a5a0f2956e9ec3b8dc441b535c641c362eed770da828649bfd146472b0f46a4c064e459f88bff90dede7ec56177a9a71d167948712 935 - " ~k:"9ced89ea5050982222830efef26e7394f5ab7d837d4549962d285fae 936 - " ~r:"9da9966500de9d3b6b7f441ca550233fc450944bc507e01cd4acb030 937 - " ~s:"2d72f1f6681e867f7d8beaebeba4bc5b23287604a64cfee1c164595a 938 - 939 - " ; case ~msg:"971d16d111c96de0f7098b256af213f4475aef31007e12e2974c5f64b2f335e0183c196c33d50f6445c5f614649549770b1874dd0756a9a8e39971dfecc3f267ebcc1f5301703f88743b0f376482cfc06d5948bd7926d96ec4d731a44b0c0eee5e85da26687265de5a66cb1a73a7e4f3236f60647bee5c163340e19505577cf6 940 - " ~x:"9053ec8ab1f9700c2ab59259bf2e07892904f03c844cd58a7ff59c79 941 - " ~y:"290517297e4249fc3212bad67269e032818d760b0ee0525dc5a17c97116ee29eb3b450b41d15cea405d5e983a8558184067f424acc498676415e17506a351c124b5404f1d17153272619df713ce34d03f1f9ee28592f22f829a31993b106c785fa6dbe57d0049c815db5ee2dfe948ddedd1a5e2cd2346cf2f66f04fbad619cd983a1b069b471ef9adb4df6ceaea23d09f0a548c3c7209634c8a05e5897445906dea08a52e4074be22d8485f20eaaeadbaab397199b067aa860056991ee088480b4921267a698a8f7a03777f56bac84e50903e88d07261f24d0a4f317128e01fe8a9224f12293949cb6c3f095afd19aecb16b209a99487dcc2a1b83c49d75e351 942 - " ~k:"901632e0b8ffea7efebe2fc9ea0d1a52442817fe1e1b5455bd39a687 943 - " ~r:"1f44f6eac218236a1d99cf7625abcf5c964b0a0c5d88b8d05d74a3c0 944 - " ~s:"71015cbe8622d2a34fbb5e7cca8c59e828adee71f50524482d9e7904 945 - 946 - " ; case ~msg:"08ea09fa5efde215bd8b3c4d6a9c90ee9387ffb7bd65becdb88b40132c6384106aa619b7c66ca92034d284608593864ce6b92877112aa139240cb44b388fe68a8fe0501ca584f6a2de27c0fb658e72bb13fddb8d039a6bf85d63a6c073b2668013ce8fe589a0150e46d5b1d9b0cbb5a14c100ae4b20d6ce81a987a50a949f434 947 - " ~x:"a2cdf2515cb098559fa13cb70b6a897e89df120a971064bb377988ee 948 - " ~y:"b3e2b7e0641721d69616679596cc75091fade2da0558e310b8d14db0f4686f1fed48d0fb7f0b3b27bf6e1981eafa7737a3e651828d1fcbf88387d06f78404a7afaeaaf8fae1893bea3a09a118893937ae2a8fdef3320942a158463de4fddc11987f23fee9633e06ac239c06610bc45319abafe517ce4aeae6247ea789d7da60d3eeddfdc4b232b4d7a069bcc0eac7b99fc088fb7ec1946034a98d7e69cab0cb2b06b3d9deacd1b433ebe94f547a322895cca9b0ed319b1d458c3bfb260beb641a5345dbe3d01ce800ec2c6bd430ce3e3f5f78fcabf91a29658661c573b9f6fd3812e560d888b6cdf3d57673c1630e00ca841ee994958b250dafbc3e83bcb8be5 949 - " ~k:"077b3adce42ba0622772eaaa8cabd16107c92f7a134c715a4dda5ebd 950 - " ~r:"6c03637d253a8dcd0907d6de93926bdb3e1ea3135a709da2309a8da6 951 - " ~s:"236e5163f2c2ebe0eccdbd3351e4285531a4f53e45284e41db37e266 952 - 953 - " ; case ~msg:"957cef163b16d8073d5d3fe158fa0c7338bd107c6a653cb0f11ebe41402607b822abe30e36ca9ee4c9de00cf72db97f57d78f3db49a8e1093285563c68b0f4e124830b9febfa3e75ce2ea59cba2cc6d71e908b5e6d8f463954922b82bb55a69fb2ff143ffcae6b5656143c8b6cc24f57b17cfb020f6e15bdc5f25436d07b7f8a 954 - " ~x:"15ea86b973ef146f03cc701b17b589b0ffdd318b64827d49ee3c0044 955 - " ~y:"3fcb8e44d6880f9eebaedfb75994605c9ec001f0595aeb5f2bcaf6b3987bc28a7ca905e1fed7e3c715401b5c608d12076938a18013473d8a433277fd9ce5a5cae038281e768ff909aebe4d257dcb5d93488022d07d4c2862afb2bf8a2b1e974a8e7b6e176b1b0b7ad6f63bda1b7142e46f504dcccca7d1e2e7662758f760e624e59528c5a0c9563ed517c691fba2abf66899241178223ba20013ed0ab21f91f3e6bef755c8100c51ee947b7a9ba38570f880b5e42f24b72d5321132e031b985a0db825bf3bb00a7771a03007387e03ce020fc358e65ed3de8d847f5be60720917c0616a450aa341ae00abe0a809c38e97314f303fe9b0c6cde446d0217cc4eab 956 - " ~k:"9af96c995f0b7b8283e2ea288e3c3a6f751a56b38041297e2bc34cd7 957 - " ~r:"150362da792701694e23f0b0a9b7035437cc8f4faa45c6df8f7982fb 958 - " ~s:"6df4321c61738743a9fe78ec76b4952692aaa372d1c8530fba0fcdec 959 - 960 - " ; case ~msg:"204d9cde24a2f0de02aff020f6363fd68f70420dc1a9b5138216201363f832da0aa801865a75a243427d9d6c78dc5e6041b27d033660e1e405abe1be27c909994bd6fb57180c3d6b498ce8793bee8ecf51e06b96411d00996209f44a380926c7b195e84e78f01fe02e0bc7032ca462a5182683475222f9dd8f3ade1ab8fea318 961 - " ~x:"524a63cc5acada8557609a5f0d88fd3e9c6e63719704cd8bab8fe301 962 - " ~y:"99b8fc6e64cce262ed741c30cd586986aa2e8f6371b848a2617c619897de23726bb54536ece4b460cc7f1f39e0c184eb19291e930dc9140e4b7735541eeef8ca8ebc81790fed37a5f08e9da9abc66a3a2e909902a4212106927d08abec01f27c6056b6e0381150bd742d409f6810fa5818ffcb3f182adf894ba7f80678ce883c1089a6ae71db3a115c386dd9153f4191fc365461ac86838ecf2f3f81ccf283297a6fbc644f52aae664901ae30c96fe4df930cf1a41757241cc4d9adfccdd9a6bd5004b05757443598856400dd771dc089095c7dcde82f721f986af636638eea2c71770856c2ba80315e8696142a11e51ebd7559e9da6a00be3f9f38c614ef207 963 - " ~k:"028091483753f5643b61e4093a7e0a5135d71c5fa318d6e8bb0efc66 964 - " ~r:"9c023331751c79d5da355bb58e2bbe2e973e3e4b4f52743ce1f1eec2 965 - " ~s:"96ad0e8ca90627fb7ac4540c9b58a016ee6c4e0a6f0aa1e7def81a51 966 - 967 - " ; case ~msg:"1e4e58afb34c5d6f645a82645be358a2e228cc7b9c23dd7f3aa79595814d054b923b9cbc6c9e6c6f94848c1a4d215679023a96976a44e9b59136241fdf26f8f71fe5a9bf366e4912b5931e1c8f63c37fae2bf1d55ba3943a650bb463cded9a7b062ae55aa57d9c5ceed323fd9a7555e48b834d3ad4441c35d9e07c7c6e4d5d0f 968 - " ~x:"33b25c6bbbf816addad05e48b72ca560c5191214d903a978b6708a30 969 - " ~y:"b4dea0d5b671cc815382d0ec6dce661c30ff93719dc7f56e7e61df6eb6a3207a05617938c874bc3ab093bcdbbc983a4b0b587d60fdeb7b87f7b0be4a656883f5443ca7864541ccbfe0d0835636ef08a936b2321a51503be1eec5f7bccd0c73c9cd52397cc214318b30e8be1eab57200a4d4df78af991bde183e0164e694d8308b7d20d067bfcabdcb50f7a2c190c66ce3dd0e18960939cb57fc3a2e5a604f3d9bd6fa440d54e9cc0383958a0d6aa2ab670970f9b2caf866ee507067343f7513e0a981f3a344f2f753af44fda26d661796032bda0f6cc30a9a789db8d3d546f02f898116805180c6f0d2f5388ab5110a521077d88d214fbb32eed2664406cde9b 970 - " ~k:"989d87703853c4133b6d273686bf672492e90ce2a91b3c72a4188a1c 971 - " ~r:"0434ef1c127207d0c884701e75d801725c451ce67d2e71534638b231 972 - " ~s:"0c625e4a334db07825a46b55da9c2e8a5f600a36b71606834097e777 973 - 974 - " ; case ~msg:"5a470a38b2ebbead08e010efef7461f6f859257d91a61e2f0ba809e28c0ea3d410e4f41477a398d593df58039c4336260ea7d8e98c9d7daad0c31ecd1567c7db730179e2a9a62007bd56f9d9da48deaa657ac92293e5bfafbdebad1afe25c41e1aa09db61fcc191971c37549155b3e67956913aae3a5f6245cfcb9aad5dc1e15 975 - " ~x:"13411c1a6fe0063e7f9b2467ccebf2be5cf30e742f9a35d715558ba7 976 - " ~y:"06a20d5571296eeb87e79eb274036d819e8623b15de44c2697dadecab2996f51a75aa088490e683f34d5e0e71d9fb8734bcfb71e9d19cbda3caca5cec417fa37a06142bfc0682de56f0dce6e826ee9f30d01279859d3ffbd4433bf4a1057ba0ad75060d41f968f6da822c33cbda9f772c2b77bc1b29305cb697182c0d39b132868932c64016bc9071b30920eb385c5ae41c5d4f631bf5f54b1eb4b373bb3e0bf6e448ad8c988fea16e643790307b8b85f009fb67317217d9148c6cd7a46136eece1950a119e5a416a197e00d0e929b04a5bbf6c988d8595a0b2a5ca71926ba351a5f7674af4183b5a68979bedd6491295b0f172e7373eca7e62d78d744fdccec 977 - " ~k:"7406254d3cfe3d55267236ff63b0f42b2e3b55d1cee7ed1ca3f06ce0 978 - " ~r:"74dddfa35b25d0c0b285a5d21719ee39d6e3f443445ceb90556b0186 979 - " ~s:"474865d3ef07f5df49e0a6ebfb5ab5c2ede47c4c6314be4ccf455e21 980 - 981 - " ; case ~msg:"0849d67ead3e8c44ad3b2f949be1cd9f9a4bf8b5785bd00ca66038e9a8b93727a652a415c1d8a1ecfcad77782d87d912623c2fef45b2083ec0f79a264ef7c5bfb76fde5b22b9845392e759a1ec05fa6387ccd2943ef1277c2e060337f82aa562cee5bd7c158258f2e779d51e47e000a7b0706077490976a07763e2efb275b5bf 982 - " ~x:"5631c7dfd3f5adc0b7b542a8d121a07bb8251b6a1bf3a8cba771c724 983 - " ~y:"b1c61442d8aedae0a04daef7b6f8a49c6d07bd958e8ec561906ddf31f3b4ffd481da5443fe8788056c4ea7b5dfa2cee6474e3fdc83fc043a2bba333d503a2a938865ec3f118640e8457c7d974e2a65659cef5b7ae4f49a054d94ae5e2eb6345f5bdaf92148beecc109c55031fccd90cef88213b69ddb754b40ca8d8f0a4bfc81a287637a38c21807f727a67025ff67b7fcc54418adad408a5c7d1ce05a1de7e30988d560e779fdea1b78753314b0b80fdacb6246faa4b4c4ee8acc5ae24b82312040134cd8cc2fd4fcb191fe43f64d140624a8c6c2ac5fa4bfdba5d625d7d21e3c3f6acd8a153a04fb22f8d3b244ae8c6a1dd0e6e3b2f73c064ffabfad6cc461 984 - " ~k:"9c353ace0ae52501bbb98a2d1c9e28f3a833c2b0eaca49cd12c57ec7 985 - " ~r:"2aeb7fce1b7764d32cfb7d85254ceed9f3a6337ee8dab42c8ab7a415 986 - " ~s:"17cce13bcb917cdbefe0c566318fc974204b700c5cddc5b2b499a78e 987 - 988 - " ; case ~msg:"e74639f2bad42fd6393f9b350d6e19cd4c1ce0f41e8c902684ef6f86790ffc8311acd9b57d6521e80339b3243f6ec6b01a06ea899fd75da91e1080fdf06129dd851a895d74b1efb9837289c11d68e1308c47bb8c59d5eb895db53bba29102a5b48b1e75c73387ff22e6c0461196a7d48615ffdb9c8ff4ec6587b4f68d260ad86 989 - " ~x:"7319bdf79a4c8dbc115e3780c818f6e2a3243ab47263e84ba259bd3d 990 - " ~y:"9e1b77243aba0886f9baeca6c11bd2c5c55547cc502e731d9c4725da8777ab6050e3399e25577704cfc66163f6df8d749142a7e974e49b7315ab7c8b85ad5d5cb271cf207eb72e1c3476b0d863721c967be15ecbfbf06eadc27de338eaa3cac1dde642d52aa5359198d8909d23d87d827090a8ada7b7a5553642d586603ea2464dabd2ef5e18db3a623be65be7b5a469890f9dde54a27ca723b4e05d56b7181b28d5c1f65415688ee41d5337a9952d92ede4d192b9091639caaa6033e4749418dde15abe4bad62c37fab05e3bef4cd7398a4977e07e121fef2aac56be7e0546e40fca885696a3850c9a28709e699d52611c9b7926e7ad18149040582c997db71 991 - " ~k:"6defbce0e72f014526c8ab02c6fc320a4bbd85365d99fc5d3423fa4c 992 - " ~r:"515b9ce53eb10c3e47890556e0f0fd19adb207b9c01f12ef5c6caaad 993 - " ~s:"0900e3acc4c378bdfe9cda4db8f8ab54436931c73d8d3171c6dc8bb8 994 - 995 - " ; case ~msg:"4a145dd5cc4a12ea43617ec9790f1038190ed3d8af24bbec14da3ecf5f387ca9764a8b9cbc5f6292a53a9da9533c751140f8da5fb6f3d48eba1e7b98662734d9a8b120dd515408ba756f75a5755212764ad92c3f2263835211add5b4cc0eca8d4fc7a843f49c38ce80868faf8b498fb414d3080ed41e3674e285d3e40d62f305 996 - " ~x:"7944fa1a2a938ffabb234ca385916e01a89220cd16f06a474b9d4ac4 997 - " ~y:"b3f6d44da86a515d7185b70c5adaa3f6059c0bb7995a53910761fea362d9843f92f2271ddb0bca0d4519e33fdb13af49d855cd0b9ab0b970267243e468d3c41677ac588fdfcb1cb9aa4d233f7ae017e67094f4f4d904e1575e76bdc6bd8299b42a2f39adef63ce047862aaa0bb8ba32ec2733493648406f54f5d8e2eb19eea837f4d5963ad3192917f5fe3b6d027b22bc1bf0dce8401d622ca72b1d73a89e888de1e62bead2e4e1da6b5d04b2a3694c76fe07ad3c66426343d67be12b2a72c3f76225573fc054f3b7d735915238d7bdbcb03ba6dde3edc00f8c983b0b50129fab426004a27a038139f2d3295b5b032701face34a7523559485fa631c219237f6 998 - " ~k:"8ab9322319a138489eb773f3220d712d05cd14eed9aae402a8aa767b 999 - " ~r:"5cfd4b9f92ca727d513ac14143b125148655f1642c53b73cc25131c9 1000 - " ~s:"2adef94aae372d579c99629ca0786362cb0247aa6d99957074cd7d43 1001 - 1002 - " ; case ~msg:"428a20790cad1c7ba82118ae5841bd5380ee50be5b64b8040935ef3d6da37a26e6f02035fb1937c7a6bcd88c894fad7d8aa48abb89e0c64287cdc637454db89eaf0a7e692734c8a243856dd75690bdcefe554e39a0df84e6e0c96b2c5774a3e4e2afed028fb43d7998d3cdc9a6409322cf3bfa4d1e36f5e707203b59c49a753e 1003 - " ~x:"43dea1b4e5c2f22548074d7dddbdcb94a235a3dbbfdb7b3bfc5923d3 1004 - " ~y:"47a9340ac513585c83bb20a2fba946971811184fd20065fb95cbb20625b47b216f75e1f3d89797f540a0485cfbf07b1716a3ece7027d86f4940ab90bbfdd8ebf15137bcf8805f93cea259c4bea5a2d3bb3dddf83aa290d3573e91aa300bbf1afb9b525542d67a8d86051aed8ff8a2cfc225a9e51eb374c31fe103ae8f4a0c8911421d225c019e1b5c07dc149babc26b708fc0fc0c13c3b35390317c409faae81aac9ab5d01ce85add24917d94cd1b2141b638de3a253bfca6b7f1a8104518d1572211ba52dd175632c8f3f6748265a4bf6c2b8363d9810ba1f1e584794f62319f0451da831d457b5269bbe67784c474ffff692bbe2baaca32d3f85f4fe39e03f 1005 - " ~k:"5615520867828ae7dbc8e9b116e7661e18f09e5cdae17518ead1484f 1006 - " ~r:"8a96c419e0f391daa29fb162a1b9570f48a00810aa480cde0f27cfb0 1007 - " ~s:"028ed9165522fc59aeeb79c491a95ed8427fd1b695f3dedf4228a328 1008 - 1009 - " ; case ~msg:"2a07e28fc102dfe17c79b9368e0ba92414d2fcb407d34e903a0a53370f7d2d33aa13c02e527587718c3b39666125eca2e8fd4c94b9867fb6ef16d555549d8dd0f6e10417ebecf48f992ad84b5d9774540785ddcd264c55796bc2162898ecef4027c34187f8c0b1c20d4daa108b70d76c40ddbebc1e0f50f4dc904dbfbe6beb9d 1010 - " ~x:"5f4f3c4f95efb91c6b49f43afbde6d0f9b5a1324b4926f3276bc913e 1011 - " ~y:"05f27ec035627860c31aa597c96837084605f270d15a3fbbdda1c3853db2ea6f6c9de4e11a6fbd773c300ebad0f9dbc33608f9c4c5cedede0c26791cbea35af0322a607739e97c3242f0ae7d36afe269aae64b5fb2db265cd756ced45d888eaab0465e509ab7f83d623f69e73cdc0c7670675ce0c29f49a19d7038623bde36e29fb854e6fe6ffdb916abb7d61fab4b620dc739a5cbd9608a45e86c2bbfb41b8699166822e832bb6cac66e004e93d190b951424edaf34bf6bd343bf60154f739c43562b03aeb4d23de1f76c18f74b5f7a73c805b22af8cc6bdc9b55779ccf6d441cfd3154616cda18807a9f5e2d7659e9e21329755157dabc622bd1ae2d5097c6 1012 - " ~k:"97861b777e2a8cffc4c2d24e2df9eedf0b65ea2c9373c1085ba44efb 1013 - " ~r:"91a4576931ed621a0342f14ee2ba8fa8e1bbdf894c1251afdf72146f 1014 - " ~s:"56755ca163f7dc89458a7a75d4dd3ce3adec42b4aa7d04b2858c47f6 1015 - 1016 - " ; case ~msg:"7e96385816c97bd9de81de30e67db72436fb42faa9b6ccfeab1fa528c69e6351b2012a1097fb86d8c5cc60256ef11be18f16137617f8cdd29e3bab9468c12ae34336ba0e0eb6c828177d1d55b06698ddf753756af830a10ce9c99f1d13682668e3eb336a80618e666280096417c1e2b005b9351f5ea306b8c63fd184a59132b5 1017 - " ~x:"914e5d6d95ec12443f73c127b797229544971177f645b8dac5f6911d 1018 - " ~y:"2b69bf21bf689a1f5ed7096b27e447c1d52fc2473e9e4353dbf185632022fc605cefe5489102f7cbe984f00c1ab32f2def1a84f1bedddbc15f87aed0a2b1e912e9edd74edbe2c15a4c37533014b9d32b05f5a44d323def1cebae0e216bc35a1ca8a4265c3db5574eb23e17f1838e225e467a9426e8798c5a2e896536c48c4e24cd2ee9da1b61aed2e25b98e4c1f4ee55e0b4705feb2bb1694cb18a6414bcdc1a7489b4bf8967985489316b3e57ea281204ced3ed88ad1b207be7d294127bca86a9b861ccca192c15c815e2328cbdaa5899c9dd271fcd6eea0d2ab009a8ba001e6725139be26c5151875cdca7f91434443b9e5e47a45cdc8b7399bc5e8bed9300 1019 - " ~k:"7d00160fa1ebb10b0465321748eba9ca6e1b3b5216c0c51dc34b98f7 1020 - " ~r:"1bcaa2caf483abc80b75f670252faa2a8e18c32301ba6fc06f37c08e 1021 - " ~s:"909a7852b8d5c8813e17c040779ad0dc5e9e0556612056835e68d2b8 1022 - 1023 - " ; case ~msg:"24ed7a16782b5c34beb58bab6a7d2028719f9738e5d1ba6978efac4b53b37c88e7ea02e0cf0fd82a3e50046052a9049541d12993254a46fe401f402d38943e94918bf7a6fecb08ed1309b7b0f2185967ef289a2efa6c2e37a74d6592a2eb7401ca5e98bb8645a94e57499d362e0f3133ef336e119561cee1b558c15508781868 1024 - " ~x:"3a42f9927b4eb39ee3a910e4418987d1af1ffc1f3d5df0c4920e05d0 1025 - " ~y:"9dccc137197bb29824b1c10e9e8dedd714efc936cff83f42634d64391f9b7f4fc3a231954a8c3bfe4ae0f82225fd52b5dde6dcd14c0ce5085971c515da38183427c7e2a8d76e40efb671af797e0c576e3881d434ca809dd553ccb0f7cd9f73c7aea2268f36c84170ab0ae03b2b46a219547564fd21c540b1603ad7306d22a9eb8ef37ca08c2b28d16c5b9c54a328ebb3c0f9505095c612270d52637cb5584ed08bad7138d3388c634b6502fa6473a2f594040b9acc1480b343d2287fdc70d16ba14b1c2117612dcc5860dbef8387af9aa5e1621d37a38f6cbe5935673ea3cbcde4f32a249eb6a5eed41cfdcaa4c87e8bcabaa6bd1fe5a879d17e9ae35837ce0f 1026 - " ~k:"23dda49474ec6cd13e1b0249ab24f50e9d69e40c6b5c07430780c44f 1027 - " ~r:"5f4f5449b8d0dda3ac590ba1640df9772ff08cec08528bc2d70d7ac9 1028 - " ~s:"5bea04bfd33248f26aee98ca8596774e95ce685465174d1caed7d920 1029 - 1030 - " ; case ~msg:"4906dbdd9da6ddffa152fa2e250eead3c6ef708387a3ad64d34a0e057459471f48752fde0786db28a4bbf58114d8dc91b69e56be3c49ec1b9880d9917c73abc895754a60779b18bc951550b957a77c8cefa159908126cc801c665d1b01109ba604bb9e797c7a37660bfc0593bab0924df5806ca803381b24b03de3d03b484d49 1031 - " ~x:"0c53e5311c104f11f6eba646e4840d1960a92118204a49e3ec8ddec4 1032 - " ~y:"072cb5612596aa716142f5f756c9542013f3f1628cfc5497eb1ba0aa51bd5adb8eb8adfe059c0e0882e3c09a17d1f51accb687b243fd3052bbcb81b063c1e7d5be066587ebca078006f6d6ee71a69ef59b6365cbcf64d4cf1b9299e7403009272026fc1665ed403ab8dee40eea4ee7d562af001951926dc8bf0c783984664ffef629cb59d709b3d9aa06805d62afd794541a2b4ce0c59043acf73e18e74453e86a082f17914ba6b2b0fa80da8353c7ed9162609575ed41f8eb78dbafaa7b518de0c85b1720e7f493b914d5a3d2d0748273d169d55c45556bcae670575c96a444fc1d789f5bacfc8b24132bfbd75b3061fbacf2935a219b0f2ac5dcad718516a9 1033 - " ~k:"3523465a8417b3a05ba1032bf6c42511591f2830b55144f9662bf6c9 1034 - " ~r:"77475900fc7f3e0b80f3884af8604eef60ffe484bc6cd3de123f7959 1035 - " ~s:"26ca927da0d10b43dc1521bfeb58ff347ee143fc38db451c11a03510" ] 1408 + [ 1409 + case 1410 + ~msg: 1411 + "e9f59c6a5cbe8f5b0cf75008d06a076a6739bdddb39b82143cd03939aa4738a287c2a6f31829bbe15f02cc2ee7d7122dbd132825970daddd8a4d851da86e7edc8940cb1188319218b8e0248a103eae34bc68d85f5a32830d7e5dc7718f74db5e4224c0debe1e841e1eea1a88fee0f85d9fb087cbcee55f86037a646e38346d2b\n" 1412 + ~x:"6a5b4ffc44238d1852fb9b74e4c1661be85984043cfeee023f57cac6\n" 1413 + ~y: 1414 + "af6721bf75dec6a1b76ad35ca3750def31117c5b441c15a306835a1db74c003b86ae9099ebfb745b0aa9cb000cf43fb021513b8f197bc865b22bf949b491809ad752ffc1ca8e54bea16dc7f539e4c55fb70a7743dd28f262f60ef0f2fcaac29e8021a7938c18ffe03075d0b7e0a2b4dcabe46ed1953d33e37f113af519ab0bf0b6186c12b5f6488437f5193096e2fd6a6a1835604794c66b42ae5265c1cf1cb53ae84997975e0318a93ce41e3902e4ef54de3c56555bd19491acd53f3e57464e1f460389dbc5fa80648fa5a5a0f2956e9ec3b8dc441b535c641c362eed770da828649bfd146472b0f46a4c064e459f88bff90dede7ec56177a9a71d167948712\n" 1415 + ~k:"9ced89ea5050982222830efef26e7394f5ab7d837d4549962d285fae\n" 1416 + ~r:"9da9966500de9d3b6b7f441ca550233fc450944bc507e01cd4acb030\n" 1417 + ~s:"2d72f1f6681e867f7d8beaebeba4bc5b23287604a64cfee1c164595a\n\n"; 1418 + case 1419 + ~msg: 1420 + "971d16d111c96de0f7098b256af213f4475aef31007e12e2974c5f64b2f335e0183c196c33d50f6445c5f614649549770b1874dd0756a9a8e39971dfecc3f267ebcc1f5301703f88743b0f376482cfc06d5948bd7926d96ec4d731a44b0c0eee5e85da26687265de5a66cb1a73a7e4f3236f60647bee5c163340e19505577cf6\n" 1421 + ~x:"9053ec8ab1f9700c2ab59259bf2e07892904f03c844cd58a7ff59c79\n" 1422 + ~y: 1423 + "290517297e4249fc3212bad67269e032818d760b0ee0525dc5a17c97116ee29eb3b450b41d15cea405d5e983a8558184067f424acc498676415e17506a351c124b5404f1d17153272619df713ce34d03f1f9ee28592f22f829a31993b106c785fa6dbe57d0049c815db5ee2dfe948ddedd1a5e2cd2346cf2f66f04fbad619cd983a1b069b471ef9adb4df6ceaea23d09f0a548c3c7209634c8a05e5897445906dea08a52e4074be22d8485f20eaaeadbaab397199b067aa860056991ee088480b4921267a698a8f7a03777f56bac84e50903e88d07261f24d0a4f317128e01fe8a9224f12293949cb6c3f095afd19aecb16b209a99487dcc2a1b83c49d75e351\n" 1424 + ~k:"901632e0b8ffea7efebe2fc9ea0d1a52442817fe1e1b5455bd39a687\n" 1425 + ~r:"1f44f6eac218236a1d99cf7625abcf5c964b0a0c5d88b8d05d74a3c0\n" 1426 + ~s:"71015cbe8622d2a34fbb5e7cca8c59e828adee71f50524482d9e7904\n\n"; 1427 + case 1428 + ~msg: 1429 + "08ea09fa5efde215bd8b3c4d6a9c90ee9387ffb7bd65becdb88b40132c6384106aa619b7c66ca92034d284608593864ce6b92877112aa139240cb44b388fe68a8fe0501ca584f6a2de27c0fb658e72bb13fddb8d039a6bf85d63a6c073b2668013ce8fe589a0150e46d5b1d9b0cbb5a14c100ae4b20d6ce81a987a50a949f434\n" 1430 + ~x:"a2cdf2515cb098559fa13cb70b6a897e89df120a971064bb377988ee\n" 1431 + ~y: 1432 + "b3e2b7e0641721d69616679596cc75091fade2da0558e310b8d14db0f4686f1fed48d0fb7f0b3b27bf6e1981eafa7737a3e651828d1fcbf88387d06f78404a7afaeaaf8fae1893bea3a09a118893937ae2a8fdef3320942a158463de4fddc11987f23fee9633e06ac239c06610bc45319abafe517ce4aeae6247ea789d7da60d3eeddfdc4b232b4d7a069bcc0eac7b99fc088fb7ec1946034a98d7e69cab0cb2b06b3d9deacd1b433ebe94f547a322895cca9b0ed319b1d458c3bfb260beb641a5345dbe3d01ce800ec2c6bd430ce3e3f5f78fcabf91a29658661c573b9f6fd3812e560d888b6cdf3d57673c1630e00ca841ee994958b250dafbc3e83bcb8be5\n" 1433 + ~k:"077b3adce42ba0622772eaaa8cabd16107c92f7a134c715a4dda5ebd\n" 1434 + ~r:"6c03637d253a8dcd0907d6de93926bdb3e1ea3135a709da2309a8da6\n" 1435 + ~s:"236e5163f2c2ebe0eccdbd3351e4285531a4f53e45284e41db37e266\n\n"; 1436 + case 1437 + ~msg: 1438 + "957cef163b16d8073d5d3fe158fa0c7338bd107c6a653cb0f11ebe41402607b822abe30e36ca9ee4c9de00cf72db97f57d78f3db49a8e1093285563c68b0f4e124830b9febfa3e75ce2ea59cba2cc6d71e908b5e6d8f463954922b82bb55a69fb2ff143ffcae6b5656143c8b6cc24f57b17cfb020f6e15bdc5f25436d07b7f8a\n" 1439 + ~x:"15ea86b973ef146f03cc701b17b589b0ffdd318b64827d49ee3c0044\n" 1440 + ~y: 1441 + "3fcb8e44d6880f9eebaedfb75994605c9ec001f0595aeb5f2bcaf6b3987bc28a7ca905e1fed7e3c715401b5c608d12076938a18013473d8a433277fd9ce5a5cae038281e768ff909aebe4d257dcb5d93488022d07d4c2862afb2bf8a2b1e974a8e7b6e176b1b0b7ad6f63bda1b7142e46f504dcccca7d1e2e7662758f760e624e59528c5a0c9563ed517c691fba2abf66899241178223ba20013ed0ab21f91f3e6bef755c8100c51ee947b7a9ba38570f880b5e42f24b72d5321132e031b985a0db825bf3bb00a7771a03007387e03ce020fc358e65ed3de8d847f5be60720917c0616a450aa341ae00abe0a809c38e97314f303fe9b0c6cde446d0217cc4eab\n" 1442 + ~k:"9af96c995f0b7b8283e2ea288e3c3a6f751a56b38041297e2bc34cd7\n" 1443 + ~r:"150362da792701694e23f0b0a9b7035437cc8f4faa45c6df8f7982fb\n" 1444 + ~s:"6df4321c61738743a9fe78ec76b4952692aaa372d1c8530fba0fcdec\n\n"; 1445 + case 1446 + ~msg: 1447 + "204d9cde24a2f0de02aff020f6363fd68f70420dc1a9b5138216201363f832da0aa801865a75a243427d9d6c78dc5e6041b27d033660e1e405abe1be27c909994bd6fb57180c3d6b498ce8793bee8ecf51e06b96411d00996209f44a380926c7b195e84e78f01fe02e0bc7032ca462a5182683475222f9dd8f3ade1ab8fea318\n" 1448 + ~x:"524a63cc5acada8557609a5f0d88fd3e9c6e63719704cd8bab8fe301\n" 1449 + ~y: 1450 + "99b8fc6e64cce262ed741c30cd586986aa2e8f6371b848a2617c619897de23726bb54536ece4b460cc7f1f39e0c184eb19291e930dc9140e4b7735541eeef8ca8ebc81790fed37a5f08e9da9abc66a3a2e909902a4212106927d08abec01f27c6056b6e0381150bd742d409f6810fa5818ffcb3f182adf894ba7f80678ce883c1089a6ae71db3a115c386dd9153f4191fc365461ac86838ecf2f3f81ccf283297a6fbc644f52aae664901ae30c96fe4df930cf1a41757241cc4d9adfccdd9a6bd5004b05757443598856400dd771dc089095c7dcde82f721f986af636638eea2c71770856c2ba80315e8696142a11e51ebd7559e9da6a00be3f9f38c614ef207\n" 1451 + ~k:"028091483753f5643b61e4093a7e0a5135d71c5fa318d6e8bb0efc66\n" 1452 + ~r:"9c023331751c79d5da355bb58e2bbe2e973e3e4b4f52743ce1f1eec2\n" 1453 + ~s:"96ad0e8ca90627fb7ac4540c9b58a016ee6c4e0a6f0aa1e7def81a51\n\n"; 1454 + case 1455 + ~msg: 1456 + "1e4e58afb34c5d6f645a82645be358a2e228cc7b9c23dd7f3aa79595814d054b923b9cbc6c9e6c6f94848c1a4d215679023a96976a44e9b59136241fdf26f8f71fe5a9bf366e4912b5931e1c8f63c37fae2bf1d55ba3943a650bb463cded9a7b062ae55aa57d9c5ceed323fd9a7555e48b834d3ad4441c35d9e07c7c6e4d5d0f\n" 1457 + ~x:"33b25c6bbbf816addad05e48b72ca560c5191214d903a978b6708a30\n" 1458 + ~y: 1459 + "b4dea0d5b671cc815382d0ec6dce661c30ff93719dc7f56e7e61df6eb6a3207a05617938c874bc3ab093bcdbbc983a4b0b587d60fdeb7b87f7b0be4a656883f5443ca7864541ccbfe0d0835636ef08a936b2321a51503be1eec5f7bccd0c73c9cd52397cc214318b30e8be1eab57200a4d4df78af991bde183e0164e694d8308b7d20d067bfcabdcb50f7a2c190c66ce3dd0e18960939cb57fc3a2e5a604f3d9bd6fa440d54e9cc0383958a0d6aa2ab670970f9b2caf866ee507067343f7513e0a981f3a344f2f753af44fda26d661796032bda0f6cc30a9a789db8d3d546f02f898116805180c6f0d2f5388ab5110a521077d88d214fbb32eed2664406cde9b\n" 1460 + ~k:"989d87703853c4133b6d273686bf672492e90ce2a91b3c72a4188a1c\n" 1461 + ~r:"0434ef1c127207d0c884701e75d801725c451ce67d2e71534638b231\n" 1462 + ~s:"0c625e4a334db07825a46b55da9c2e8a5f600a36b71606834097e777\n\n"; 1463 + case 1464 + ~msg: 1465 + "5a470a38b2ebbead08e010efef7461f6f859257d91a61e2f0ba809e28c0ea3d410e4f41477a398d593df58039c4336260ea7d8e98c9d7daad0c31ecd1567c7db730179e2a9a62007bd56f9d9da48deaa657ac92293e5bfafbdebad1afe25c41e1aa09db61fcc191971c37549155b3e67956913aae3a5f6245cfcb9aad5dc1e15\n" 1466 + ~x:"13411c1a6fe0063e7f9b2467ccebf2be5cf30e742f9a35d715558ba7\n" 1467 + ~y: 1468 + "06a20d5571296eeb87e79eb274036d819e8623b15de44c2697dadecab2996f51a75aa088490e683f34d5e0e71d9fb8734bcfb71e9d19cbda3caca5cec417fa37a06142bfc0682de56f0dce6e826ee9f30d01279859d3ffbd4433bf4a1057ba0ad75060d41f968f6da822c33cbda9f772c2b77bc1b29305cb697182c0d39b132868932c64016bc9071b30920eb385c5ae41c5d4f631bf5f54b1eb4b373bb3e0bf6e448ad8c988fea16e643790307b8b85f009fb67317217d9148c6cd7a46136eece1950a119e5a416a197e00d0e929b04a5bbf6c988d8595a0b2a5ca71926ba351a5f7674af4183b5a68979bedd6491295b0f172e7373eca7e62d78d744fdccec\n" 1469 + ~k:"7406254d3cfe3d55267236ff63b0f42b2e3b55d1cee7ed1ca3f06ce0\n" 1470 + ~r:"74dddfa35b25d0c0b285a5d21719ee39d6e3f443445ceb90556b0186\n" 1471 + ~s:"474865d3ef07f5df49e0a6ebfb5ab5c2ede47c4c6314be4ccf455e21\n\n"; 1472 + case 1473 + ~msg: 1474 + "0849d67ead3e8c44ad3b2f949be1cd9f9a4bf8b5785bd00ca66038e9a8b93727a652a415c1d8a1ecfcad77782d87d912623c2fef45b2083ec0f79a264ef7c5bfb76fde5b22b9845392e759a1ec05fa6387ccd2943ef1277c2e060337f82aa562cee5bd7c158258f2e779d51e47e000a7b0706077490976a07763e2efb275b5bf\n" 1475 + ~x:"5631c7dfd3f5adc0b7b542a8d121a07bb8251b6a1bf3a8cba771c724\n" 1476 + ~y: 1477 + "b1c61442d8aedae0a04daef7b6f8a49c6d07bd958e8ec561906ddf31f3b4ffd481da5443fe8788056c4ea7b5dfa2cee6474e3fdc83fc043a2bba333d503a2a938865ec3f118640e8457c7d974e2a65659cef5b7ae4f49a054d94ae5e2eb6345f5bdaf92148beecc109c55031fccd90cef88213b69ddb754b40ca8d8f0a4bfc81a287637a38c21807f727a67025ff67b7fcc54418adad408a5c7d1ce05a1de7e30988d560e779fdea1b78753314b0b80fdacb6246faa4b4c4ee8acc5ae24b82312040134cd8cc2fd4fcb191fe43f64d140624a8c6c2ac5fa4bfdba5d625d7d21e3c3f6acd8a153a04fb22f8d3b244ae8c6a1dd0e6e3b2f73c064ffabfad6cc461\n" 1478 + ~k:"9c353ace0ae52501bbb98a2d1c9e28f3a833c2b0eaca49cd12c57ec7\n" 1479 + ~r:"2aeb7fce1b7764d32cfb7d85254ceed9f3a6337ee8dab42c8ab7a415\n" 1480 + ~s:"17cce13bcb917cdbefe0c566318fc974204b700c5cddc5b2b499a78e\n\n"; 1481 + case 1482 + ~msg: 1483 + "e74639f2bad42fd6393f9b350d6e19cd4c1ce0f41e8c902684ef6f86790ffc8311acd9b57d6521e80339b3243f6ec6b01a06ea899fd75da91e1080fdf06129dd851a895d74b1efb9837289c11d68e1308c47bb8c59d5eb895db53bba29102a5b48b1e75c73387ff22e6c0461196a7d48615ffdb9c8ff4ec6587b4f68d260ad86\n" 1484 + ~x:"7319bdf79a4c8dbc115e3780c818f6e2a3243ab47263e84ba259bd3d\n" 1485 + ~y: 1486 + "9e1b77243aba0886f9baeca6c11bd2c5c55547cc502e731d9c4725da8777ab6050e3399e25577704cfc66163f6df8d749142a7e974e49b7315ab7c8b85ad5d5cb271cf207eb72e1c3476b0d863721c967be15ecbfbf06eadc27de338eaa3cac1dde642d52aa5359198d8909d23d87d827090a8ada7b7a5553642d586603ea2464dabd2ef5e18db3a623be65be7b5a469890f9dde54a27ca723b4e05d56b7181b28d5c1f65415688ee41d5337a9952d92ede4d192b9091639caaa6033e4749418dde15abe4bad62c37fab05e3bef4cd7398a4977e07e121fef2aac56be7e0546e40fca885696a3850c9a28709e699d52611c9b7926e7ad18149040582c997db71\n" 1487 + ~k:"6defbce0e72f014526c8ab02c6fc320a4bbd85365d99fc5d3423fa4c\n" 1488 + ~r:"515b9ce53eb10c3e47890556e0f0fd19adb207b9c01f12ef5c6caaad\n" 1489 + ~s:"0900e3acc4c378bdfe9cda4db8f8ab54436931c73d8d3171c6dc8bb8\n\n"; 1490 + case 1491 + ~msg: 1492 + "4a145dd5cc4a12ea43617ec9790f1038190ed3d8af24bbec14da3ecf5f387ca9764a8b9cbc5f6292a53a9da9533c751140f8da5fb6f3d48eba1e7b98662734d9a8b120dd515408ba756f75a5755212764ad92c3f2263835211add5b4cc0eca8d4fc7a843f49c38ce80868faf8b498fb414d3080ed41e3674e285d3e40d62f305\n" 1493 + ~x:"7944fa1a2a938ffabb234ca385916e01a89220cd16f06a474b9d4ac4\n" 1494 + ~y: 1495 + "b3f6d44da86a515d7185b70c5adaa3f6059c0bb7995a53910761fea362d9843f92f2271ddb0bca0d4519e33fdb13af49d855cd0b9ab0b970267243e468d3c41677ac588fdfcb1cb9aa4d233f7ae017e67094f4f4d904e1575e76bdc6bd8299b42a2f39adef63ce047862aaa0bb8ba32ec2733493648406f54f5d8e2eb19eea837f4d5963ad3192917f5fe3b6d027b22bc1bf0dce8401d622ca72b1d73a89e888de1e62bead2e4e1da6b5d04b2a3694c76fe07ad3c66426343d67be12b2a72c3f76225573fc054f3b7d735915238d7bdbcb03ba6dde3edc00f8c983b0b50129fab426004a27a038139f2d3295b5b032701face34a7523559485fa631c219237f6\n" 1496 + ~k:"8ab9322319a138489eb773f3220d712d05cd14eed9aae402a8aa767b\n" 1497 + ~r:"5cfd4b9f92ca727d513ac14143b125148655f1642c53b73cc25131c9\n" 1498 + ~s:"2adef94aae372d579c99629ca0786362cb0247aa6d99957074cd7d43\n\n"; 1499 + case 1500 + ~msg: 1501 + "428a20790cad1c7ba82118ae5841bd5380ee50be5b64b8040935ef3d6da37a26e6f02035fb1937c7a6bcd88c894fad7d8aa48abb89e0c64287cdc637454db89eaf0a7e692734c8a243856dd75690bdcefe554e39a0df84e6e0c96b2c5774a3e4e2afed028fb43d7998d3cdc9a6409322cf3bfa4d1e36f5e707203b59c49a753e\n" 1502 + ~x:"43dea1b4e5c2f22548074d7dddbdcb94a235a3dbbfdb7b3bfc5923d3\n" 1503 + ~y: 1504 + "47a9340ac513585c83bb20a2fba946971811184fd20065fb95cbb20625b47b216f75e1f3d89797f540a0485cfbf07b1716a3ece7027d86f4940ab90bbfdd8ebf15137bcf8805f93cea259c4bea5a2d3bb3dddf83aa290d3573e91aa300bbf1afb9b525542d67a8d86051aed8ff8a2cfc225a9e51eb374c31fe103ae8f4a0c8911421d225c019e1b5c07dc149babc26b708fc0fc0c13c3b35390317c409faae81aac9ab5d01ce85add24917d94cd1b2141b638de3a253bfca6b7f1a8104518d1572211ba52dd175632c8f3f6748265a4bf6c2b8363d9810ba1f1e584794f62319f0451da831d457b5269bbe67784c474ffff692bbe2baaca32d3f85f4fe39e03f\n" 1505 + ~k:"5615520867828ae7dbc8e9b116e7661e18f09e5cdae17518ead1484f\n" 1506 + ~r:"8a96c419e0f391daa29fb162a1b9570f48a00810aa480cde0f27cfb0\n" 1507 + ~s:"028ed9165522fc59aeeb79c491a95ed8427fd1b695f3dedf4228a328\n\n"; 1508 + case 1509 + ~msg: 1510 + "2a07e28fc102dfe17c79b9368e0ba92414d2fcb407d34e903a0a53370f7d2d33aa13c02e527587718c3b39666125eca2e8fd4c94b9867fb6ef16d555549d8dd0f6e10417ebecf48f992ad84b5d9774540785ddcd264c55796bc2162898ecef4027c34187f8c0b1c20d4daa108b70d76c40ddbebc1e0f50f4dc904dbfbe6beb9d\n" 1511 + ~x:"5f4f3c4f95efb91c6b49f43afbde6d0f9b5a1324b4926f3276bc913e\n" 1512 + ~y: 1513 + "05f27ec035627860c31aa597c96837084605f270d15a3fbbdda1c3853db2ea6f6c9de4e11a6fbd773c300ebad0f9dbc33608f9c4c5cedede0c26791cbea35af0322a607739e97c3242f0ae7d36afe269aae64b5fb2db265cd756ced45d888eaab0465e509ab7f83d623f69e73cdc0c7670675ce0c29f49a19d7038623bde36e29fb854e6fe6ffdb916abb7d61fab4b620dc739a5cbd9608a45e86c2bbfb41b8699166822e832bb6cac66e004e93d190b951424edaf34bf6bd343bf60154f739c43562b03aeb4d23de1f76c18f74b5f7a73c805b22af8cc6bdc9b55779ccf6d441cfd3154616cda18807a9f5e2d7659e9e21329755157dabc622bd1ae2d5097c6\n" 1514 + ~k:"97861b777e2a8cffc4c2d24e2df9eedf0b65ea2c9373c1085ba44efb\n" 1515 + ~r:"91a4576931ed621a0342f14ee2ba8fa8e1bbdf894c1251afdf72146f\n" 1516 + ~s:"56755ca163f7dc89458a7a75d4dd3ce3adec42b4aa7d04b2858c47f6\n\n"; 1517 + case 1518 + ~msg: 1519 + "7e96385816c97bd9de81de30e67db72436fb42faa9b6ccfeab1fa528c69e6351b2012a1097fb86d8c5cc60256ef11be18f16137617f8cdd29e3bab9468c12ae34336ba0e0eb6c828177d1d55b06698ddf753756af830a10ce9c99f1d13682668e3eb336a80618e666280096417c1e2b005b9351f5ea306b8c63fd184a59132b5\n" 1520 + ~x:"914e5d6d95ec12443f73c127b797229544971177f645b8dac5f6911d\n" 1521 + ~y: 1522 + "2b69bf21bf689a1f5ed7096b27e447c1d52fc2473e9e4353dbf185632022fc605cefe5489102f7cbe984f00c1ab32f2def1a84f1bedddbc15f87aed0a2b1e912e9edd74edbe2c15a4c37533014b9d32b05f5a44d323def1cebae0e216bc35a1ca8a4265c3db5574eb23e17f1838e225e467a9426e8798c5a2e896536c48c4e24cd2ee9da1b61aed2e25b98e4c1f4ee55e0b4705feb2bb1694cb18a6414bcdc1a7489b4bf8967985489316b3e57ea281204ced3ed88ad1b207be7d294127bca86a9b861ccca192c15c815e2328cbdaa5899c9dd271fcd6eea0d2ab009a8ba001e6725139be26c5151875cdca7f91434443b9e5e47a45cdc8b7399bc5e8bed9300\n" 1523 + ~k:"7d00160fa1ebb10b0465321748eba9ca6e1b3b5216c0c51dc34b98f7\n" 1524 + ~r:"1bcaa2caf483abc80b75f670252faa2a8e18c32301ba6fc06f37c08e\n" 1525 + ~s:"909a7852b8d5c8813e17c040779ad0dc5e9e0556612056835e68d2b8\n\n"; 1526 + case 1527 + ~msg: 1528 + "24ed7a16782b5c34beb58bab6a7d2028719f9738e5d1ba6978efac4b53b37c88e7ea02e0cf0fd82a3e50046052a9049541d12993254a46fe401f402d38943e94918bf7a6fecb08ed1309b7b0f2185967ef289a2efa6c2e37a74d6592a2eb7401ca5e98bb8645a94e57499d362e0f3133ef336e119561cee1b558c15508781868\n" 1529 + ~x:"3a42f9927b4eb39ee3a910e4418987d1af1ffc1f3d5df0c4920e05d0\n" 1530 + ~y: 1531 + "9dccc137197bb29824b1c10e9e8dedd714efc936cff83f42634d64391f9b7f4fc3a231954a8c3bfe4ae0f82225fd52b5dde6dcd14c0ce5085971c515da38183427c7e2a8d76e40efb671af797e0c576e3881d434ca809dd553ccb0f7cd9f73c7aea2268f36c84170ab0ae03b2b46a219547564fd21c540b1603ad7306d22a9eb8ef37ca08c2b28d16c5b9c54a328ebb3c0f9505095c612270d52637cb5584ed08bad7138d3388c634b6502fa6473a2f594040b9acc1480b343d2287fdc70d16ba14b1c2117612dcc5860dbef8387af9aa5e1621d37a38f6cbe5935673ea3cbcde4f32a249eb6a5eed41cfdcaa4c87e8bcabaa6bd1fe5a879d17e9ae35837ce0f\n" 1532 + ~k:"23dda49474ec6cd13e1b0249ab24f50e9d69e40c6b5c07430780c44f\n" 1533 + ~r:"5f4f5449b8d0dda3ac590ba1640df9772ff08cec08528bc2d70d7ac9\n" 1534 + ~s:"5bea04bfd33248f26aee98ca8596774e95ce685465174d1caed7d920\n\n"; 1535 + case 1536 + ~msg: 1537 + "4906dbdd9da6ddffa152fa2e250eead3c6ef708387a3ad64d34a0e057459471f48752fde0786db28a4bbf58114d8dc91b69e56be3c49ec1b9880d9917c73abc895754a60779b18bc951550b957a77c8cefa159908126cc801c665d1b01109ba604bb9e797c7a37660bfc0593bab0924df5806ca803381b24b03de3d03b484d49\n" 1538 + ~x:"0c53e5311c104f11f6eba646e4840d1960a92118204a49e3ec8ddec4\n" 1539 + ~y: 1540 + "072cb5612596aa716142f5f756c9542013f3f1628cfc5497eb1ba0aa51bd5adb8eb8adfe059c0e0882e3c09a17d1f51accb687b243fd3052bbcb81b063c1e7d5be066587ebca078006f6d6ee71a69ef59b6365cbcf64d4cf1b9299e7403009272026fc1665ed403ab8dee40eea4ee7d562af001951926dc8bf0c783984664ffef629cb59d709b3d9aa06805d62afd794541a2b4ce0c59043acf73e18e74453e86a082f17914ba6b2b0fa80da8353c7ed9162609575ed41f8eb78dbafaa7b518de0c85b1720e7f493b914d5a3d2d0748273d169d55c45556bcae670575c96a444fc1d789f5bacfc8b24132bfbd75b3061fbacf2935a219b0f2ac5dcad718516a9\n" 1541 + ~k:"3523465a8417b3a05ba1032bf6c42511591f2830b55144f9662bf6c9\n" 1542 + ~r:"77475900fc7f3e0b80f3884af8604eef60ffe484bc6cd3de123f7959\n" 1543 + ~s:"26ca927da0d10b43dc1521bfeb58ff347ee143fc38db451c11a03510"; 1544 + ] 1036 1545 1037 1546 let sha1_n256_cases = 1038 1547 (* [mod = L=2048, N=256, SHA-1] *) 1039 - let domain = params 1040 - ~p:"c1a59d215573949e0b20a974c2edf2e3137ff2463062f75f1d13df12aba1076bb2d013402b60af6c187fb0fa362167c976c2617c726f9077f09e18c11b60f65008825bd6c02a1f57d3eb0ad41cd547de43d87f2525f971d42b306506e7ca03be63b35f4ada172d0a06924440a14250d7822ac2d5aeafed4619e79d4158a7d5eb2d9f023db181a8f094b2c6cb87cb8535416ac19813f07144660c557745f44a01c6b1029092c129b0d27183e82c5a21a80177ee7476eb95c466fb472bd3d2dc286ce25847e93cbfa9ad39cc57035d0c7b64b926a9c7f5a7b2bc5abcbfbdc0b0e3fede3c1e02c44afc8aefc7957da07a0e5fd12339db8667616f62286df80d58ab 1041 - " ~q:"8000000000000000000000001bd62c65e8b87c89797f8f0cbfa55e4a6810e2c7 1042 - " ~g:"aea5878740f1424d3c6ea9c6b4799615d2749298a17e26207f76cef340ddd390e1b1ad6b6c0010ad015a103342ddd452cac024b36e42d9b8ed52fafae7a1d3ce9e4b21f910d1356eb163a3e5a8184c781bf14492afa2e4b0a56d8884fd01a628b9662739c42e5c5795ade2f5f27e6de1d963917ce8806fc40d021cd87aa3aa3a9e4f0c2c4c45d2959b2578b2fb1a2229c37e181059b9d5e7b7862fa82e2377a49ed0f9dca820a5814079dd6610714efaf8b0cc683d8e72e4c884e6f9d4946b3e8d4cbb92adbbe7d4c47cc30be7f8c37ca81883a1aac6860059ff4640a29ccae73de20b12e63b00a88b2ee9ba94b75eb40a656e15d9ec83731c85d0effcb9ef9f" 1548 + let domain = 1549 + params 1550 + ~p: 1551 + "c1a59d215573949e0b20a974c2edf2e3137ff2463062f75f1d13df12aba1076bb2d013402b60af6c187fb0fa362167c976c2617c726f9077f09e18c11b60f65008825bd6c02a1f57d3eb0ad41cd547de43d87f2525f971d42b306506e7ca03be63b35f4ada172d0a06924440a14250d7822ac2d5aeafed4619e79d4158a7d5eb2d9f023db181a8f094b2c6cb87cb8535416ac19813f07144660c557745f44a01c6b1029092c129b0d27183e82c5a21a80177ee7476eb95c466fb472bd3d2dc286ce25847e93cbfa9ad39cc57035d0c7b64b926a9c7f5a7b2bc5abcbfbdc0b0e3fede3c1e02c44afc8aefc7957da07a0e5fd12339db8667616f62286df80d58ab\n" 1552 + ~q:"8000000000000000000000001bd62c65e8b87c89797f8f0cbfa55e4a6810e2c7\n" 1553 + ~g: 1554 + "aea5878740f1424d3c6ea9c6b4799615d2749298a17e26207f76cef340ddd390e1b1ad6b6c0010ad015a103342ddd452cac024b36e42d9b8ed52fafae7a1d3ce9e4b21f910d1356eb163a3e5a8184c781bf14492afa2e4b0a56d8884fd01a628b9662739c42e5c5795ade2f5f27e6de1d963917ce8806fc40d021cd87aa3aa3a9e4f0c2c4c45d2959b2578b2fb1a2229c37e181059b9d5e7b7862fa82e2377a49ed0f9dca820a5814079dd6610714efaf8b0cc683d8e72e4c884e6f9d4946b3e8d4cbb92adbbe7d4c47cc30be7f8c37ca81883a1aac6860059ff4640a29ccae73de20b12e63b00a88b2ee9ba94b75eb40a656e15d9ec83731c85d0effcb9ef9f" 1043 1555 in 1044 1556 let case = case_of ~domain ~hash:Digestif.sha1 in 1045 1557 1046 - [ case ~msg:"de3605dbefde353cbe05e0d6098647b6d041460dfd4c000312be1afe7551fd3b93fed76a9763c34e004564b8f7dcacbd99e85030632c94e9b0a032046523b7aacdf934a2dbbdcfceefe66b4e3d1cb29e994ff3a4648a8edd9d58ed71f12399d90624789c4e0eebb0fbd5080f7d730f875a1f290749334cb405e9fd2ae1b4ed65 1047 - " ~x:"5a42e77248358f06ae980a2c64f6a22bea2bf7b4fc0015745053c432b7132a67 1048 - " ~y:"880e17c4ae8141750609d8251c0bbd7acf6d0b460ed3688e9a5f990e6c4b5b00875da750e0228a04102a35f57e74b8d2f9b6950f0d1db8d302c5c90a5b8786a82c68ff5b17a57a758496c5f8053e4484a253d9942204d9a1109f4bd2a3ec311a60cf69c685b586d986f565d33dbf5aab7091e31aa4102c4f4b53fbf872d700156465b6c075e7f778471a23502dc0fee41b271c837a1c26691699f3550d060a331099f64837cddec69caebf51bf4ec9f36f2a220fe773cb4d3c02d0446ddd46133532ef1c3c69d432e303502bd05a75279a7809a742ac4a7872b07f1908654049419350e37a95f2ef33361d8d8736d4083dc14c0bb972e14d4c7b97f3ddfccaef 1049 - " ~k:"2cb9c1d617e127a4770d0a946fb947c5100ed0ca59454ea80479f6885ec10534 1050 - " ~r:"363e01c564f380a27d7d23b207af3f961d48fc0995487f60052775d724ab3d10 1051 - " ~s:"4916d91b2927294e429d537c06dd2463d1845018cca2873e90a6c837b445fdde 1052 - 1053 - " ; case ~msg:"49707b655b6d168c70baede03866b0fba60239ad4cf82f53b46e11b26fa8f6276ff6687d09e8ed1e5d963c11e4763b2e59a0927f01e8fffd1894a6262327c84bbb4298d7d7fbca660673128bb7dea46178146485539f9a8f88dac761d0d5d45cb557cdac960be23dd9199acd99cb64d1fee2ca68e423461a02abb34c1dc45011 1054 - " ~x:"62177a5b2f0b44352f643a9e69c1adb4a0b292a5ea52fa8065e94ad043d46218 1055 - " ~y:"385349ecf99ce783d4e7a80a7dd2c533a3623c38260243ac392d4eab6deda5b79b8f9167922e8b60468623e4603fa7681f535e20de673531255e108f542a26d5c87f19e063372d142869c5eef1325281fee7f1c74d2a96255d420f2713864d55d36f8139194f643a6e98b5bf9732c8597445af5a71e23e2ac5cae3604323f7bf09449786974ed53a5717f9aec14dd01bd1cf276bf3c63dec43c3ec8ea6557de469916412f0456c90f01291bb7125e9f855f455b360c03d4a7b4a8d4090e47aaf1111f382dd2605734fb54f4b8ffe23c9ded2900b3121b497bd46d0458a09a5df4aa9cf1be906f5542313384f93d377ba9e0a762b4793403b914e52865afabb67 1056 - " ~k:"2bae4225836dcbbcad976ed47ecb5f3fc05439358791be244e74d2cf0617fc26 1057 - " ~r:"0fdc5a5a4a2c2f3df50c868383ba800396ae25265be1a14762d3110cbeb34819 1058 - " ~s:"4b41841cad45fedea5aad0a16b053e88353b6f0102df74c9fce09e38f5e6c277 1059 - 1060 - " ; case ~msg:"763c1f15c5dd8a93aac4e048651c4ea84af18aee255b56959eaeb1876699be75271af0da6c3ca936e99be4ff4436410f69ae7018b6c843dce9d8b71a91efa53c39be55f285fb8ad8543952fd3ca89271ec23d342cfd557bfb72db43b434d0ed5b30763037754bb0f782ab08235a64abb7f0a828f892cde7e05e301da7c21c096 1061 - " ~x:"5d169761a3887a9eca0f7e59d77b75671ae02210006e754bf2f12091fc3275b0 1062 - " ~y:"0becd917eed0be9cb58ff9d259a8fa415b816da4a25d3f569d7b9f317b3f47e4244cdef35796fb455c05c156452f1c8660f5346fba169276221446f82bbb2027b056b537cfd59c57299166a6f20871c74e6c1d3f5a37b75e8dad6cadcf12c909586a32f150c68e332306abef8be1abd56c42d3c36936cf8f2acaceb707994a3d4c0555a015de892037aac68e33813bf3050f0f3a8df5e81465852f6a195ea688ac5d258eee2076a6b236362e3d792e7f358c6ba994da7a64b18263969655473aaa37cb3cfb00a27f8fb24a4b73b025c96335438484e958ad0848277df950847d46a9874f1039fbea7e08bc79675ef1df6ef21230a79a3b161308a0a4600b5347 1063 - " ~k:"66011bdefe8cc4a04fbd5d69252bb72da8f9a8d6e00bb7ca75719133ecd86f1d 1064 - " ~r:"76e9b6ef7e8d48fbfc43bf465281592223fa7e0d9978392d355868c8a20209bb 1065 - " ~s:"7f9c8deab51c60bb6f866c76450138e0d2946aca6c5f88dfe35a0c1ba493ee47 1066 - 1067 - " ; case ~msg:"67851de982fc70f969d82f65d85b0332d667114f27b58bb9e565d2e40ad011983d936049cc97a216260fa2e410ad6d6c98a548759aa8e2d022c1fbc1b16b10d83fbbbd126ec43d5fedc407c831461c7f33ed94740031ecd0f701c7b1df88a249265b3f60c38f4285bbc9bae164bc38e162c235c9a9dfc1b150eaeb1482ebed48 1068 - " ~x:"4f3e2c5901b656118d88a47fe2bd52f85cbf828dbf9b67365e2013a937f0f2d9 1069 - " ~y:"ab9a99ff87899bd6657b3a9e9b7206996bbc7799dde57dcfff8098875dc4650d791e90bc4cee10989bf49eb5e6230857f96841ae8362e4ee5cc8602f6a1a2c6f8f2f680ad3a72b0e07511ead301f575278a074138aa4eaa53919e34f001cbe2dcbc345c77f5687d071981a4dca29d026bb53ec9cf03a88d63c52206d351f8fca10239e84f4915ce347f48d650aaaa6b02d3164973f82fc0e0f83a2d458af65736d7e0dbb264fd779ffd5a3f066584494598526cd67e12d6c67965a70ec3f09e2cc447f177ec87604b531486683025e3b520a26e69c958cf8435f7c6ce564f0a72d1fc47205a50b39d516b14a476f6c2dcace50339cae20cd3421a75f6d377b8b 1070 - " ~k:"72bd0808076af461353d98cb0191ec76a7c04fbe3a7f793e390cc773434c1d4f 1071 - " ~r:"763e89fc8b2a090b75812aefa55de7b7cd61ec3fdf8730ce16b05a7b9456fd2d 1072 - " ~s:"4a97086b6717a73a6be6d4a95b8343bd20b0d7b51c3da1d86c5852350871379b 1073 - 1074 - " ; case ~msg:"616de9dd23ebede428e032db7838108a224f7aca57b1df87f031fe1d86083d688c5c3ef078e64d8d5a9e612d3983460ca1f816f787c03ca43a1fd8ce138655df677056364c0eab8e0493c07bd4b2b05022190932de794f195dbef297093e7da1c4304db40b63ca53e1b8bcdad913d7a902af025c367c48de387f1a9bcd7ca42e 1075 - " ~x:"4d0240a34dd45aacaab9e24e4838223ccb759f1d93fa8791f28fc7c2e8318820 1076 - " ~y:"584eaeed2dc785d8e2b8c85fd0e5ec251f134958bd9eeae4f79f862b62cf602ab10d22eca499042f2c875f2708ba0d697af39f23f5e0b7de4ff7964bab1279efa2aa797a2d21e788d249f42693cdbfd71fdcb1aa93b79bac0dbcb587bbff4ef15a3799a5fca8b1589838e30096069ca7931f7408815b585d140a747de43bd92cac3f9a9b1862fd704673e1e58710c16ddbe7e52d31a7df15974958b1288116ed98ff247f5028cec86d9eb97b126a48adc952e90dc52f2bd7810355aa9075051f26129c2d2fb0ba8066e414989d92e29e689960e33ee56ca62d714a42cb7487f70c0c0ba643fa9dd5f85259fdecd49fa970c8322682b114f2647837637abc0ed2 1077 - " ~k:"325e19d8b7ee8c8d9cb7e70bb5417035a8183bdf73149a45f0e83f3af68decc0 1078 - " ~r:"748f466b7fdcdfa77017c865a33b1dad4db99dbd63efa1c87345c4833b0632ac 1079 - " ~s:"0bf9938e7972ebb00fb0a3c0c2476d2509db23afcaecb17dc571905317eb8ca7 1080 - 1081 - " ; case ~msg:"115f0a8be34e84d09bdcca69d19ce17dd67df739aa4fc6e8077076535f39af8302881471a5fb0e1839a3aa76dfda4bde2f9fa25fa582b756a4966d75320ac1995472271666156ea86c19a239895e5578a3c39b0ba3258827a01df1f30db22ddbc267c9e290d5d457d0a94d8aa73f8e79f3acd31bdeee7aa32c792c22acb807ba 1082 - " ~x:"0800394a2ccdd1f55800565374d46be9bbc1190b55eee26502bf5f2459ac5cc0 1083 - " ~y:"2e06073f59196d3e29ba718e84489b6f447fd6f67a9ee6357c5e8a58fa3c4fb6ac8314ebdc3b4d6127f2b4d2112c27799f0c1ac5f7946b5607212d796741cc3be127212a125edc3a7a91a525cd62152199b18b4f1dc332215d65d64ad06098ff2180ab47bb5728720c937e1207649ed19c883331ea415faa51c556d12649665f1ece880d055a2a793adc74b38f15f50aa9b46786d907017b1d6235c43b37c2036a1640f6bfe3bec2b95b4300a3bd78f471f6aa56e5e6347571996f778670ad94efaf20991c555924fd55cd518df0bd558faac3f9826a865a3ced0f59cbea45c65412bddf8f2a8aab3dfca1dff50374163fa899cc7f7f108b194fc955cabe9ca4 1084 - " ~k:"617d00444047d8e943e429947d28b4718a8b7603475e5453cacb80fa704f90f1 1085 - " ~r:"5c8d76440735055c1b36698da73903b332d64ca5603046144fb7668b1acac337 1086 - " ~s:"11c54efbd492a7147a1c50b287377b52d2193907d5bb636159c15318a480ca6a 1087 - 1088 - " ; case ~msg:"3c1f2b92db1b4315837baa863043a9b4496a78143ca74f6e67181facf50a6e08d27945d00e7b06f9c57c0e2f1527c94bcecea6993175d0f09bab4f15af55ab7aa9b16b48c94a6a99c2d7e477b744cd27cdb9b0bbf810756bc6376fa15bfbea3c9376ca6979752fdb3a655affd6c0186d1a34355daea8cc75acf96b8847dbdb8d 1089 - " ~x:"59edd0348ca6a85c408816549e9c58338ef92f56edd8fa753226acc0e181751c 1090 - " ~y:"a4742d3c7e7681b01cd6aae17423cc780491d08df73b4a71edf7bd2ee29c698cd66dba0491688fc7eefb4d709147bfd4c8c4b797ab9197573b5d36599c4a592c466955e80ae5d2122bcaa5d0e1d94b4ed2a99b1af5d08eec86c37753a3c3656c0fef0d2c471e4ffa0fb163174a4df1707879fe083655291127a3bbb0597e23802e424efe4016360364506c8ab4081f0a95692c2629537f05306181db669bcfaf01c15395614238a2309429199555142639b3443ef85af74b5e88b7c70a8167334f27294a8ba1266695a369372badcba7623aa58cbcf25b4bbe663d4eced1a18e7753391d6c53854c4a8d0ee1a790a1a21071f1386c235ac26182d01a1e81ecf8 1091 - " ~k:"0a96189b8740005f215ae5c5a8aa8686dbb4c353d2c55deb3904bccc4f9a9b9b 1092 - " ~r:"31c1c6aee7ed541a281f37632b27ba88536f36bcd92fcc360da041f4197f7f95 1093 - " ~s:"45e1019b2a1702b5df1eef4fb7df6a53aaa66ecb8be5cd2e28b353c870e01f41 1094 - 1095 - " ; case ~msg:"ad389f53235deb068f7097780330746493607fdb7e1170bd1fe0da012714b8f1b128c69a53d7dd2646b09720883e2387dd15d46564adff6642372c838287bafa5f4343a27ec8069770e5c367548833fddcc5f8617aaf41289d96dd40f1098ded9fbb110aeb14d69272dfb2dd7d75e7a88dc4147f27c64eb1bf0aa0569bbda320 1096 - " ~x:"19ff4eec2e47301d0b70a826dad822b609c997bc1b3a9d7cbd3d1d2252e8acda 1097 - " ~y:"bf4aa2d867b433f934d1d567010dbe067905f4e35d7ce568b55aba694d12dfba95c235078461aaab81f1e4df32319e5759c5263ebfbebf7960c57aed79bf2de38948f8ff79ef26d66a7f98384117dce1f386aecc4369afb2e0de77ccd2e7dec328614243effac607c8d5fc5c7c0b1143963573d9f106fcecf2e15c67a3bff6908b286d0e4131fb81622fff9e10f5771afede2276e8344d9ae2f493fb4856d1ba5760ddae38af7ddca409e7907268691baa33dfcbfd69e9aa9faa79cf303ac8b1fa07c1d40d1cea01e8ba0d65265f4c6aabb16ebe2f6ef5aaac25c0c2730cbeedc177667ee02bf4523418a986d5b87a9b75ec201af0f1961cd51b85879147e607 1098 - " ~k:"7ff51bb8946842c7e2f7245e73461e2b0820528548f7ecb53bcadc7a20e826b7 1099 - " ~r:"2f9484aaeda9dcb88d2d3644db2c58eefe2e7695a6c8be9abe97173efc9c0bc3 1100 - " ~s:"0166a7bf4e8bda6b86396943a74a8ebfc603a85ed287bf3f5a30dd0bbe49cd8b 1101 - 1102 - " ; case ~msg:"12f9582e3a1a76f299d72d9b1502b99060802660226bc47b71e54ec9388eac325902acbe2bd7109e19f377c9d2b4d280cdfaa48888b9cf4ed06ccf5ad866d6932d402592f6be6e6876db5a62beeaf373b60238ab96829243759bdb586f45ec4ae2cb22248ab0b6aa7a7583a61dd3b8f119cd840479a4a9af8a439db904ac14ec 1103 - " ~x:"7142b195eb2417bc234cf32c6fd7cae470cb48c74dbdb469a264c1988eb3e52d 1104 - " ~y:"72d8100692e1a30a32e37c909eb6c7baea7258b0b78668e75915070037479b884fa9f18066df89b490f9a2696a8505036977604dad268e90552835fdca3339b32360c94358ffcd0b1ea11066122efd017cd6fe1ecd0dd6678081b84cb6e144471dae7636b4a0929ca71aa47b4086665d66d4034c188d64d38b69f0ca171c85925cad2840277d2887a7f7b81e6b12870cc3c69e18ca9c22c3d3a39ee286ca65d23f3e8111aa7c6ea9a0d14c84ddf76abd44db3b9833d69cb99b524c98fdb9d0ff20c9d268e8e7175f13c11c5795d0fe0b3899b74c0dca91476febcb509f7fd507023988145242dfc809ce95c6f1b31f67e01650dd45878efc7ea89cf6e3171e43 1105 - " ~k:"1043805a13045a36e1b6498db97d163571c61cc4a719e506173b5e6df33fc81d 1106 - " ~r:"38cf6b8cbae82e6295f83316a9c49d2dc7c92cb90b19a2c2d45649949354d930 1107 - " ~s:"356a5850d07aec6e9d4a4d7f79d9b0352b087d7ef48394128c5ae4993e8259b8 1108 - 1109 - " ; case ~msg:"b6ac84c49f6bd601d5868ba06d49b8cba87a9d6e7905247541fd332c2b0374cf57d4a0dc0b5a6c3f8f7e24be3a1eedc4a8c575847c02e4edd4745040685670058996250f73e298a43b391a4ad567f0c9bc4b6abf6d1e5c56b22f4eab36aa1a812a1dae8d2873cb2c2a521d320019c7cab1efb11fa4595c534ce527d43ba605f7 1110 - " ~x:"1332c3c6e2d1b7b16f501b6d48c7b866628f0c82bf33354535df99a843dd68ce 1111 - " ~y:"06dab48a076e8cec27d4c4fb98e7c00f36bed73f11e491d913864cae0fdf883468d735deee5251dd38a1f8b1d2bc19d37f3187a4ef69c33dc9528801a23a98d96fd3f129b8ca2941421ba1828e0c4f8d88c53193930292a0df1147b07c20aa726c7177ef660ddd4ecdd73315d4b9356013e115f067e843c896c1a54c81ffab1bfe7c785edec32fba652babfdaaa039b0568c6beb7d13fb4e4588140ed626b18749b0f79f669f6e7045738cf50a6d0028ba11fe1845a2dcbd9c1b02336fb30eaaa397418fe17e149829cab13d2c2e6b90e5cc81834e32fca8a173634e01f9a973e029644f0165b3033dfb054dd21d65e0c0e137b48c34d42134c47b972433ccde 1112 - " ~k:"167b97578e52869f49730df464f7e8d786594bb830d72db9af2cc88324ded288 1113 - " ~r:"1d600a745a1dec933868dc535a19ee9f1af8bf09b5abee15dc4f7cbcb95ac8c5 1114 - " ~s:"23b81097d583342ebe4aed364a7af9882f74e64518aaedce346c91d6d7ac470b 1115 - 1116 - " ; case ~msg:"a92e2ddbfd18cd307373fcb39dffc33e0b91a48c62071f2f7a8e50dbf2c290889307975b6acd642c8e3d3444acac98c22ed06551fec5dc7c9f2243b681cc9fa4fcc12c318237e9a5df0a77ac22402039cef31b1e623af58212a22e7e60419bb36b777cf6ce65dd1f56963eb28b7706f137c0f7363a002d827e45badc20233c16 1117 - " ~x:"119ab8a63a22a89baf4eb8f016dcce9423d5f40a677b258fab072a8cb622ebe5 1118 - " ~y:"5141223f4697de272269f3d99437c48dba5ab7f1373fc6bad8161018c5d6fce2bccc40ca78e4d73b6eeb096f175c4cd0c8e9f3e9311951d51ea244fd33d9e47de75f1000248fdc003bc07b501ce58f6ec1aed1754c36826cd91976b408eb7aa9bc42448058ffd3b4e513c6589f8e1bc145a47b2470e7241e2325e54302255c3d6d97abc5c6056266a9523d461fc744146da35c04a4fc0b095881cb94fc4c03bb8623953928490dbe7f84ef68667f23d4cb3ed887449f77aeb158a26d1b39b4e6297f23d49f5b41f170e72f7213ee40364c1c9a63985f69e44eacdfdcb58c35dace8b935d0789a8c0669a23d673929b2a582d6d3b2f9e67be891890da1236c6f0 1119 - " ~k:"77cefd7a6b0fcd0237ff8f51c458e5e8a79116eba6f11ea1af7f29aa608393e5 1120 - " ~r:"34a65e99bf01698b5a68f215b9c292115d17b3c202ea1fda17fcd8a0cd74b636 1121 - " ~s:"7e67d442b8f9ac2974e84ba65aeff0df5f83c271ece792a8dab9c4aee87bfea8 1122 - 1123 - " ; case ~msg:"b5aa1cfe2348d57f0e5333fc70276d2418ddda49122f4a88e8010f6f78dc829ba5c7cc68db664080945c43eeb705c2ef13de6e4b8f4de1d04fb33d5bcd7893d8ca8bfde38c9feca6c4ec03b2ce7b35ed60a6a43f7fc9ed08061a099b3eeeae7f0f1516149d175a953f52c8c518f3ad247c9fba23f1f829d5cae62673ee201ada 1124 - " ~x:"4b75db034ed0b84dfcc60b493a00940e805feb78575fd256b24d146b05a9500c 1125 - " ~y:"0b66ef2c7a34205d70fc36404957043cf46b28ac4f083ebac3787f55e8dd1f75d9193a842759376f0508c94cc7528d6611b50a73261a4a5cff730d9985bb341dfd739a4e963d1c40f114d7a7ace89e81dd70861efef2ba9d1c6425d5f85809059e8ef31f453c97743fcc94d3b1bd62084e975790b37193eb4058454ab283fe2bafaae803de892879554a340b9a3e2532931eb95d3ac5eb3f290a3f56936951288e1c05bda1fa74dc78d631c2e7a56367ec5781019dfee71453ea6bbd90778e92fea8c26bd6a823fbca71577b6335f3bdf40a30836e948db032db5a4603dd31b851ecbbdf76b4a6c9951d2192b97ff01daa5cb030e15ad1d4cff367f700e79ffb 1126 - " ~k:"654aa8be3b7bfc32f9b560b57a88a8aec1cfda276661283b7f44dd3b0944c20f 1127 - " ~r:"517f7df4831fbd01908b9218b17ae1c40e00c53404b3bd72b64f67cee75215f2 1128 - " ~s:"1903434a727c8ef0e80a43dce2834b807839ef43c22afb502b35a381782bb639 1129 - 1130 - " ; case ~msg:"27aa81d2bc49601c3f6bceb0870bb55dd10e7ba6d1f8acada70b5f902a0f4062eb93ae72cdfd3f943099cc2a10a3da7bdc9f24b00bf36a29d75136af10bb71ec9c1932058e22ec9c0600d173d37970d58ae1f66cefd27e2905afdde4223979b4041fd7d7166ea326befd5dd896ef47abc6d045c1ca23c1953a6e12cc3c54b4f6 1131 - " ~x:"7e6b77d4bc9220c3352e91abea67e33a335ace34ec4516646e8a4ff098166ff4 1132 - " ~y:"932b9c0f2d310b6bfee800c074a0969efa246244fb062a745a9a3cfe6f5336a313192e92a2027e1d2c3cfa93aac53dfe05cb8f8321ac882a63bd375af0f3d9ecc73aeebe1267f473a9f90b94f5b6de4357b74eb30cd41aeafc259e85cac7d365ee33382a584eec63719ea325a2414e116f84d2af9654268ec44d6ea2e981581d45d805b383d85c130d2dcd1c71fa68d9c76d79aa8196152c1d9440c33d99de451a359e0d2c51d6aaecb26795406e528f5de3e00947d3dacc695c08a960889a2e94ecf0a461c02afc58b51e00369c73c8140e8b92388caabd1f37a62d1b210e0f314127f46b576a4b8edeb34713aa4136b8a1875bba8a5937066544e34c206aa4 1133 - " ~k:"73c28bca3c8067da792f6312153b298a8f714cad70bb2349803b6dad024f6bc1 1134 - " ~r:"05057a982ab4a2e32238ef2e3edba07fd193d90c5f053c83a9f176e21a9d5208 1135 - " ~s:"03c2b26cf46b7f72691a72d7cbf33653df347f02b0683ebc6cb7ea7e72dc8a0a 1136 - 1137 - " ; case ~msg:"7527533f2d10c18078f5a8dec350cdfad06d3157871e4ff7d7c2b7ab11dff232d34f07699278f075442e1d4ee00cd6e87c1931333841c399576f4e587a251684e731f7c8369f712656bc1e6c2d209f511179da09368d93290e058e0ce9b6530ac6c5e4cf0a1b22d588d98f32b34e85206e09aac04a0e1f2ae2a5cfdac4e6e2b3 1138 - " ~x:"40792e5ab46518c6ffcf5357f0c5de5d9e2de99c92aebea82a307ab0f5ad252b 1139 - " ~y:"72c46505e4b071f46ed6b6d530801664a4fd518e4c6be8468a38c22bf74ed966fdc7bfd7c572218998fc4c144b59462af7e294bdf5797ecea5cb2edf8c8d2dabba88d0b84cf28524369c5040b58f090772dac0fe453c32907e9b6c740fb24ed4dacb8fdd25e0661bc0d79d41f103fbc8f96b3e3a4708a5a7f5dbffc98f344bb7ccf0d5ed07af2c2f0d5f407bcfefb54d9b947604e7a78356874c01b8c1fdd749f6a3d619d1090c83725e725706846c16bf9dfdf39f2180623f4f585402cc7d6e2c10b57c8300543686a386056a931be6336bb6173d9fda8b102cf32989cf0978f956d9ae0d8f30752f156f9f92d2954ef13100a75d9f7ff96fe15df07e7993e3 1140 - " ~k:"0c9fe826a7618108684ba2d74f10ca39168feb85f74d2737fd12d18cf27a2f16 1141 - " ~r:"6aa6c4d7afda30ff2d7178b52a3e437ed5b0745a247c9c9e120bd3e833a1dfac 1142 - " ~s:"26e0887911bb5edb6a566a2a1276353391b1e4ab8ae0b259c1bbb3af3d85b439 1143 - 1144 - " ; case ~msg:"994a49e5e8a5698fdac9a7faac01fb09b2c6113a186677676d11e6049dc98c93c51eb5144af181e1efbf44439a13d295653854813671f032aa62258c14195c4864afae0b5d154f97565cef075bbb6d97e34181410309ffe98b45c1f874326343c36c14f55fa058489dff3b49dc7888f45a099c3c919b25edac1706bb90f164ca 1145 - " ~x:"266cfbe6060134ece2c8b9e6aa25bd6cc935e49c23fdd4fb6adb2ecde63a4960 1146 - " ~y:"05e233ac49c1fda2a0c3c78b0bc72fa39674055d188a124a58ab3850d9a888861c2fe4d046c3e7c75ee254de70cdb1c3150201c2e04733ebcc25b88770fc2aa82f60526bc664047a026c2290fad8e9f81cedddde7fe3ba406535bf2710d79da01bd2d42bb5f4099c3f8bc2ac864be7892aeb6a1f3402c81474da23e0795cd6c21367509a541591ee1e6364f7e755b1419e90af869930152f34de51f0f06ca3076e68c3e3ea7f4f1bf1d3cde3a0dff0cffa1b5842752347082dda3475992f15a74d298524e636220bc9faed08af7aa5e481ba78d2d2fd8e51942cfd084efe0ebddd7500efc95a6cad37fc4923f9bf65297805840876c689ee079b7fa6169768fa 1147 - " ~k:"60f8416735fa49ab567c0bf1b6da434e1df41579699c1a92a3e70e1d90705379 1148 - " ~r:"3cc269bc7b895864a03231318cf39379ae33c7180a18c08b5aef7414fdac058f 1149 - " ~s:"6a6eb83c5fab10e34f0416628c821a6de0ad0c202443c6df032cc9d8e4948ac6" ] 1558 + [ 1559 + case 1560 + ~msg: 1561 + "de3605dbefde353cbe05e0d6098647b6d041460dfd4c000312be1afe7551fd3b93fed76a9763c34e004564b8f7dcacbd99e85030632c94e9b0a032046523b7aacdf934a2dbbdcfceefe66b4e3d1cb29e994ff3a4648a8edd9d58ed71f12399d90624789c4e0eebb0fbd5080f7d730f875a1f290749334cb405e9fd2ae1b4ed65\n" 1562 + ~x:"5a42e77248358f06ae980a2c64f6a22bea2bf7b4fc0015745053c432b7132a67\n" 1563 + ~y: 1564 + "880e17c4ae8141750609d8251c0bbd7acf6d0b460ed3688e9a5f990e6c4b5b00875da750e0228a04102a35f57e74b8d2f9b6950f0d1db8d302c5c90a5b8786a82c68ff5b17a57a758496c5f8053e4484a253d9942204d9a1109f4bd2a3ec311a60cf69c685b586d986f565d33dbf5aab7091e31aa4102c4f4b53fbf872d700156465b6c075e7f778471a23502dc0fee41b271c837a1c26691699f3550d060a331099f64837cddec69caebf51bf4ec9f36f2a220fe773cb4d3c02d0446ddd46133532ef1c3c69d432e303502bd05a75279a7809a742ac4a7872b07f1908654049419350e37a95f2ef33361d8d8736d4083dc14c0bb972e14d4c7b97f3ddfccaef\n" 1565 + ~k:"2cb9c1d617e127a4770d0a946fb947c5100ed0ca59454ea80479f6885ec10534\n" 1566 + ~r:"363e01c564f380a27d7d23b207af3f961d48fc0995487f60052775d724ab3d10\n" 1567 + ~s:"4916d91b2927294e429d537c06dd2463d1845018cca2873e90a6c837b445fdde\n\n"; 1568 + case 1569 + ~msg: 1570 + "49707b655b6d168c70baede03866b0fba60239ad4cf82f53b46e11b26fa8f6276ff6687d09e8ed1e5d963c11e4763b2e59a0927f01e8fffd1894a6262327c84bbb4298d7d7fbca660673128bb7dea46178146485539f9a8f88dac761d0d5d45cb557cdac960be23dd9199acd99cb64d1fee2ca68e423461a02abb34c1dc45011\n" 1571 + ~x:"62177a5b2f0b44352f643a9e69c1adb4a0b292a5ea52fa8065e94ad043d46218\n" 1572 + ~y: 1573 + "385349ecf99ce783d4e7a80a7dd2c533a3623c38260243ac392d4eab6deda5b79b8f9167922e8b60468623e4603fa7681f535e20de673531255e108f542a26d5c87f19e063372d142869c5eef1325281fee7f1c74d2a96255d420f2713864d55d36f8139194f643a6e98b5bf9732c8597445af5a71e23e2ac5cae3604323f7bf09449786974ed53a5717f9aec14dd01bd1cf276bf3c63dec43c3ec8ea6557de469916412f0456c90f01291bb7125e9f855f455b360c03d4a7b4a8d4090e47aaf1111f382dd2605734fb54f4b8ffe23c9ded2900b3121b497bd46d0458a09a5df4aa9cf1be906f5542313384f93d377ba9e0a762b4793403b914e52865afabb67\n" 1574 + ~k:"2bae4225836dcbbcad976ed47ecb5f3fc05439358791be244e74d2cf0617fc26\n" 1575 + ~r:"0fdc5a5a4a2c2f3df50c868383ba800396ae25265be1a14762d3110cbeb34819\n" 1576 + ~s:"4b41841cad45fedea5aad0a16b053e88353b6f0102df74c9fce09e38f5e6c277\n\n"; 1577 + case 1578 + ~msg: 1579 + "763c1f15c5dd8a93aac4e048651c4ea84af18aee255b56959eaeb1876699be75271af0da6c3ca936e99be4ff4436410f69ae7018b6c843dce9d8b71a91efa53c39be55f285fb8ad8543952fd3ca89271ec23d342cfd557bfb72db43b434d0ed5b30763037754bb0f782ab08235a64abb7f0a828f892cde7e05e301da7c21c096\n" 1580 + ~x:"5d169761a3887a9eca0f7e59d77b75671ae02210006e754bf2f12091fc3275b0\n" 1581 + ~y: 1582 + "0becd917eed0be9cb58ff9d259a8fa415b816da4a25d3f569d7b9f317b3f47e4244cdef35796fb455c05c156452f1c8660f5346fba169276221446f82bbb2027b056b537cfd59c57299166a6f20871c74e6c1d3f5a37b75e8dad6cadcf12c909586a32f150c68e332306abef8be1abd56c42d3c36936cf8f2acaceb707994a3d4c0555a015de892037aac68e33813bf3050f0f3a8df5e81465852f6a195ea688ac5d258eee2076a6b236362e3d792e7f358c6ba994da7a64b18263969655473aaa37cb3cfb00a27f8fb24a4b73b025c96335438484e958ad0848277df950847d46a9874f1039fbea7e08bc79675ef1df6ef21230a79a3b161308a0a4600b5347\n" 1583 + ~k:"66011bdefe8cc4a04fbd5d69252bb72da8f9a8d6e00bb7ca75719133ecd86f1d\n" 1584 + ~r:"76e9b6ef7e8d48fbfc43bf465281592223fa7e0d9978392d355868c8a20209bb\n" 1585 + ~s:"7f9c8deab51c60bb6f866c76450138e0d2946aca6c5f88dfe35a0c1ba493ee47\n\n"; 1586 + case 1587 + ~msg: 1588 + "67851de982fc70f969d82f65d85b0332d667114f27b58bb9e565d2e40ad011983d936049cc97a216260fa2e410ad6d6c98a548759aa8e2d022c1fbc1b16b10d83fbbbd126ec43d5fedc407c831461c7f33ed94740031ecd0f701c7b1df88a249265b3f60c38f4285bbc9bae164bc38e162c235c9a9dfc1b150eaeb1482ebed48\n" 1589 + ~x:"4f3e2c5901b656118d88a47fe2bd52f85cbf828dbf9b67365e2013a937f0f2d9\n" 1590 + ~y: 1591 + "ab9a99ff87899bd6657b3a9e9b7206996bbc7799dde57dcfff8098875dc4650d791e90bc4cee10989bf49eb5e6230857f96841ae8362e4ee5cc8602f6a1a2c6f8f2f680ad3a72b0e07511ead301f575278a074138aa4eaa53919e34f001cbe2dcbc345c77f5687d071981a4dca29d026bb53ec9cf03a88d63c52206d351f8fca10239e84f4915ce347f48d650aaaa6b02d3164973f82fc0e0f83a2d458af65736d7e0dbb264fd779ffd5a3f066584494598526cd67e12d6c67965a70ec3f09e2cc447f177ec87604b531486683025e3b520a26e69c958cf8435f7c6ce564f0a72d1fc47205a50b39d516b14a476f6c2dcace50339cae20cd3421a75f6d377b8b\n" 1592 + ~k:"72bd0808076af461353d98cb0191ec76a7c04fbe3a7f793e390cc773434c1d4f\n" 1593 + ~r:"763e89fc8b2a090b75812aefa55de7b7cd61ec3fdf8730ce16b05a7b9456fd2d\n" 1594 + ~s:"4a97086b6717a73a6be6d4a95b8343bd20b0d7b51c3da1d86c5852350871379b\n\n"; 1595 + case 1596 + ~msg: 1597 + "616de9dd23ebede428e032db7838108a224f7aca57b1df87f031fe1d86083d688c5c3ef078e64d8d5a9e612d3983460ca1f816f787c03ca43a1fd8ce138655df677056364c0eab8e0493c07bd4b2b05022190932de794f195dbef297093e7da1c4304db40b63ca53e1b8bcdad913d7a902af025c367c48de387f1a9bcd7ca42e\n" 1598 + ~x:"4d0240a34dd45aacaab9e24e4838223ccb759f1d93fa8791f28fc7c2e8318820\n" 1599 + ~y: 1600 + "584eaeed2dc785d8e2b8c85fd0e5ec251f134958bd9eeae4f79f862b62cf602ab10d22eca499042f2c875f2708ba0d697af39f23f5e0b7de4ff7964bab1279efa2aa797a2d21e788d249f42693cdbfd71fdcb1aa93b79bac0dbcb587bbff4ef15a3799a5fca8b1589838e30096069ca7931f7408815b585d140a747de43bd92cac3f9a9b1862fd704673e1e58710c16ddbe7e52d31a7df15974958b1288116ed98ff247f5028cec86d9eb97b126a48adc952e90dc52f2bd7810355aa9075051f26129c2d2fb0ba8066e414989d92e29e689960e33ee56ca62d714a42cb7487f70c0c0ba643fa9dd5f85259fdecd49fa970c8322682b114f2647837637abc0ed2\n" 1601 + ~k:"325e19d8b7ee8c8d9cb7e70bb5417035a8183bdf73149a45f0e83f3af68decc0\n" 1602 + ~r:"748f466b7fdcdfa77017c865a33b1dad4db99dbd63efa1c87345c4833b0632ac\n" 1603 + ~s:"0bf9938e7972ebb00fb0a3c0c2476d2509db23afcaecb17dc571905317eb8ca7\n\n"; 1604 + case 1605 + ~msg: 1606 + "115f0a8be34e84d09bdcca69d19ce17dd67df739aa4fc6e8077076535f39af8302881471a5fb0e1839a3aa76dfda4bde2f9fa25fa582b756a4966d75320ac1995472271666156ea86c19a239895e5578a3c39b0ba3258827a01df1f30db22ddbc267c9e290d5d457d0a94d8aa73f8e79f3acd31bdeee7aa32c792c22acb807ba\n" 1607 + ~x:"0800394a2ccdd1f55800565374d46be9bbc1190b55eee26502bf5f2459ac5cc0\n" 1608 + ~y: 1609 + "2e06073f59196d3e29ba718e84489b6f447fd6f67a9ee6357c5e8a58fa3c4fb6ac8314ebdc3b4d6127f2b4d2112c27799f0c1ac5f7946b5607212d796741cc3be127212a125edc3a7a91a525cd62152199b18b4f1dc332215d65d64ad06098ff2180ab47bb5728720c937e1207649ed19c883331ea415faa51c556d12649665f1ece880d055a2a793adc74b38f15f50aa9b46786d907017b1d6235c43b37c2036a1640f6bfe3bec2b95b4300a3bd78f471f6aa56e5e6347571996f778670ad94efaf20991c555924fd55cd518df0bd558faac3f9826a865a3ced0f59cbea45c65412bddf8f2a8aab3dfca1dff50374163fa899cc7f7f108b194fc955cabe9ca4\n" 1610 + ~k:"617d00444047d8e943e429947d28b4718a8b7603475e5453cacb80fa704f90f1\n" 1611 + ~r:"5c8d76440735055c1b36698da73903b332d64ca5603046144fb7668b1acac337\n" 1612 + ~s:"11c54efbd492a7147a1c50b287377b52d2193907d5bb636159c15318a480ca6a\n\n"; 1613 + case 1614 + ~msg: 1615 + "3c1f2b92db1b4315837baa863043a9b4496a78143ca74f6e67181facf50a6e08d27945d00e7b06f9c57c0e2f1527c94bcecea6993175d0f09bab4f15af55ab7aa9b16b48c94a6a99c2d7e477b744cd27cdb9b0bbf810756bc6376fa15bfbea3c9376ca6979752fdb3a655affd6c0186d1a34355daea8cc75acf96b8847dbdb8d\n" 1616 + ~x:"59edd0348ca6a85c408816549e9c58338ef92f56edd8fa753226acc0e181751c\n" 1617 + ~y: 1618 + "a4742d3c7e7681b01cd6aae17423cc780491d08df73b4a71edf7bd2ee29c698cd66dba0491688fc7eefb4d709147bfd4c8c4b797ab9197573b5d36599c4a592c466955e80ae5d2122bcaa5d0e1d94b4ed2a99b1af5d08eec86c37753a3c3656c0fef0d2c471e4ffa0fb163174a4df1707879fe083655291127a3bbb0597e23802e424efe4016360364506c8ab4081f0a95692c2629537f05306181db669bcfaf01c15395614238a2309429199555142639b3443ef85af74b5e88b7c70a8167334f27294a8ba1266695a369372badcba7623aa58cbcf25b4bbe663d4eced1a18e7753391d6c53854c4a8d0ee1a790a1a21071f1386c235ac26182d01a1e81ecf8\n" 1619 + ~k:"0a96189b8740005f215ae5c5a8aa8686dbb4c353d2c55deb3904bccc4f9a9b9b\n" 1620 + ~r:"31c1c6aee7ed541a281f37632b27ba88536f36bcd92fcc360da041f4197f7f95\n" 1621 + ~s:"45e1019b2a1702b5df1eef4fb7df6a53aaa66ecb8be5cd2e28b353c870e01f41\n\n"; 1622 + case 1623 + ~msg: 1624 + "ad389f53235deb068f7097780330746493607fdb7e1170bd1fe0da012714b8f1b128c69a53d7dd2646b09720883e2387dd15d46564adff6642372c838287bafa5f4343a27ec8069770e5c367548833fddcc5f8617aaf41289d96dd40f1098ded9fbb110aeb14d69272dfb2dd7d75e7a88dc4147f27c64eb1bf0aa0569bbda320\n" 1625 + ~x:"19ff4eec2e47301d0b70a826dad822b609c997bc1b3a9d7cbd3d1d2252e8acda\n" 1626 + ~y: 1627 + "bf4aa2d867b433f934d1d567010dbe067905f4e35d7ce568b55aba694d12dfba95c235078461aaab81f1e4df32319e5759c5263ebfbebf7960c57aed79bf2de38948f8ff79ef26d66a7f98384117dce1f386aecc4369afb2e0de77ccd2e7dec328614243effac607c8d5fc5c7c0b1143963573d9f106fcecf2e15c67a3bff6908b286d0e4131fb81622fff9e10f5771afede2276e8344d9ae2f493fb4856d1ba5760ddae38af7ddca409e7907268691baa33dfcbfd69e9aa9faa79cf303ac8b1fa07c1d40d1cea01e8ba0d65265f4c6aabb16ebe2f6ef5aaac25c0c2730cbeedc177667ee02bf4523418a986d5b87a9b75ec201af0f1961cd51b85879147e607\n" 1628 + ~k:"7ff51bb8946842c7e2f7245e73461e2b0820528548f7ecb53bcadc7a20e826b7\n" 1629 + ~r:"2f9484aaeda9dcb88d2d3644db2c58eefe2e7695a6c8be9abe97173efc9c0bc3\n" 1630 + ~s:"0166a7bf4e8bda6b86396943a74a8ebfc603a85ed287bf3f5a30dd0bbe49cd8b\n\n"; 1631 + case 1632 + ~msg: 1633 + "12f9582e3a1a76f299d72d9b1502b99060802660226bc47b71e54ec9388eac325902acbe2bd7109e19f377c9d2b4d280cdfaa48888b9cf4ed06ccf5ad866d6932d402592f6be6e6876db5a62beeaf373b60238ab96829243759bdb586f45ec4ae2cb22248ab0b6aa7a7583a61dd3b8f119cd840479a4a9af8a439db904ac14ec\n" 1634 + ~x:"7142b195eb2417bc234cf32c6fd7cae470cb48c74dbdb469a264c1988eb3e52d\n" 1635 + ~y: 1636 + "72d8100692e1a30a32e37c909eb6c7baea7258b0b78668e75915070037479b884fa9f18066df89b490f9a2696a8505036977604dad268e90552835fdca3339b32360c94358ffcd0b1ea11066122efd017cd6fe1ecd0dd6678081b84cb6e144471dae7636b4a0929ca71aa47b4086665d66d4034c188d64d38b69f0ca171c85925cad2840277d2887a7f7b81e6b12870cc3c69e18ca9c22c3d3a39ee286ca65d23f3e8111aa7c6ea9a0d14c84ddf76abd44db3b9833d69cb99b524c98fdb9d0ff20c9d268e8e7175f13c11c5795d0fe0b3899b74c0dca91476febcb509f7fd507023988145242dfc809ce95c6f1b31f67e01650dd45878efc7ea89cf6e3171e43\n" 1637 + ~k:"1043805a13045a36e1b6498db97d163571c61cc4a719e506173b5e6df33fc81d\n" 1638 + ~r:"38cf6b8cbae82e6295f83316a9c49d2dc7c92cb90b19a2c2d45649949354d930\n" 1639 + ~s:"356a5850d07aec6e9d4a4d7f79d9b0352b087d7ef48394128c5ae4993e8259b8\n\n"; 1640 + case 1641 + ~msg: 1642 + "b6ac84c49f6bd601d5868ba06d49b8cba87a9d6e7905247541fd332c2b0374cf57d4a0dc0b5a6c3f8f7e24be3a1eedc4a8c575847c02e4edd4745040685670058996250f73e298a43b391a4ad567f0c9bc4b6abf6d1e5c56b22f4eab36aa1a812a1dae8d2873cb2c2a521d320019c7cab1efb11fa4595c534ce527d43ba605f7\n" 1643 + ~x:"1332c3c6e2d1b7b16f501b6d48c7b866628f0c82bf33354535df99a843dd68ce\n" 1644 + ~y: 1645 + "06dab48a076e8cec27d4c4fb98e7c00f36bed73f11e491d913864cae0fdf883468d735deee5251dd38a1f8b1d2bc19d37f3187a4ef69c33dc9528801a23a98d96fd3f129b8ca2941421ba1828e0c4f8d88c53193930292a0df1147b07c20aa726c7177ef660ddd4ecdd73315d4b9356013e115f067e843c896c1a54c81ffab1bfe7c785edec32fba652babfdaaa039b0568c6beb7d13fb4e4588140ed626b18749b0f79f669f6e7045738cf50a6d0028ba11fe1845a2dcbd9c1b02336fb30eaaa397418fe17e149829cab13d2c2e6b90e5cc81834e32fca8a173634e01f9a973e029644f0165b3033dfb054dd21d65e0c0e137b48c34d42134c47b972433ccde\n" 1646 + ~k:"167b97578e52869f49730df464f7e8d786594bb830d72db9af2cc88324ded288\n" 1647 + ~r:"1d600a745a1dec933868dc535a19ee9f1af8bf09b5abee15dc4f7cbcb95ac8c5\n" 1648 + ~s:"23b81097d583342ebe4aed364a7af9882f74e64518aaedce346c91d6d7ac470b\n\n"; 1649 + case 1650 + ~msg: 1651 + "a92e2ddbfd18cd307373fcb39dffc33e0b91a48c62071f2f7a8e50dbf2c290889307975b6acd642c8e3d3444acac98c22ed06551fec5dc7c9f2243b681cc9fa4fcc12c318237e9a5df0a77ac22402039cef31b1e623af58212a22e7e60419bb36b777cf6ce65dd1f56963eb28b7706f137c0f7363a002d827e45badc20233c16\n" 1652 + ~x:"119ab8a63a22a89baf4eb8f016dcce9423d5f40a677b258fab072a8cb622ebe5\n" 1653 + ~y: 1654 + "5141223f4697de272269f3d99437c48dba5ab7f1373fc6bad8161018c5d6fce2bccc40ca78e4d73b6eeb096f175c4cd0c8e9f3e9311951d51ea244fd33d9e47de75f1000248fdc003bc07b501ce58f6ec1aed1754c36826cd91976b408eb7aa9bc42448058ffd3b4e513c6589f8e1bc145a47b2470e7241e2325e54302255c3d6d97abc5c6056266a9523d461fc744146da35c04a4fc0b095881cb94fc4c03bb8623953928490dbe7f84ef68667f23d4cb3ed887449f77aeb158a26d1b39b4e6297f23d49f5b41f170e72f7213ee40364c1c9a63985f69e44eacdfdcb58c35dace8b935d0789a8c0669a23d673929b2a582d6d3b2f9e67be891890da1236c6f0\n" 1655 + ~k:"77cefd7a6b0fcd0237ff8f51c458e5e8a79116eba6f11ea1af7f29aa608393e5\n" 1656 + ~r:"34a65e99bf01698b5a68f215b9c292115d17b3c202ea1fda17fcd8a0cd74b636\n" 1657 + ~s:"7e67d442b8f9ac2974e84ba65aeff0df5f83c271ece792a8dab9c4aee87bfea8\n\n"; 1658 + case 1659 + ~msg: 1660 + "b5aa1cfe2348d57f0e5333fc70276d2418ddda49122f4a88e8010f6f78dc829ba5c7cc68db664080945c43eeb705c2ef13de6e4b8f4de1d04fb33d5bcd7893d8ca8bfde38c9feca6c4ec03b2ce7b35ed60a6a43f7fc9ed08061a099b3eeeae7f0f1516149d175a953f52c8c518f3ad247c9fba23f1f829d5cae62673ee201ada\n" 1661 + ~x:"4b75db034ed0b84dfcc60b493a00940e805feb78575fd256b24d146b05a9500c\n" 1662 + ~y: 1663 + "0b66ef2c7a34205d70fc36404957043cf46b28ac4f083ebac3787f55e8dd1f75d9193a842759376f0508c94cc7528d6611b50a73261a4a5cff730d9985bb341dfd739a4e963d1c40f114d7a7ace89e81dd70861efef2ba9d1c6425d5f85809059e8ef31f453c97743fcc94d3b1bd62084e975790b37193eb4058454ab283fe2bafaae803de892879554a340b9a3e2532931eb95d3ac5eb3f290a3f56936951288e1c05bda1fa74dc78d631c2e7a56367ec5781019dfee71453ea6bbd90778e92fea8c26bd6a823fbca71577b6335f3bdf40a30836e948db032db5a4603dd31b851ecbbdf76b4a6c9951d2192b97ff01daa5cb030e15ad1d4cff367f700e79ffb\n" 1664 + ~k:"654aa8be3b7bfc32f9b560b57a88a8aec1cfda276661283b7f44dd3b0944c20f\n" 1665 + ~r:"517f7df4831fbd01908b9218b17ae1c40e00c53404b3bd72b64f67cee75215f2\n" 1666 + ~s:"1903434a727c8ef0e80a43dce2834b807839ef43c22afb502b35a381782bb639\n\n"; 1667 + case 1668 + ~msg: 1669 + "27aa81d2bc49601c3f6bceb0870bb55dd10e7ba6d1f8acada70b5f902a0f4062eb93ae72cdfd3f943099cc2a10a3da7bdc9f24b00bf36a29d75136af10bb71ec9c1932058e22ec9c0600d173d37970d58ae1f66cefd27e2905afdde4223979b4041fd7d7166ea326befd5dd896ef47abc6d045c1ca23c1953a6e12cc3c54b4f6\n" 1670 + ~x:"7e6b77d4bc9220c3352e91abea67e33a335ace34ec4516646e8a4ff098166ff4\n" 1671 + ~y: 1672 + "932b9c0f2d310b6bfee800c074a0969efa246244fb062a745a9a3cfe6f5336a313192e92a2027e1d2c3cfa93aac53dfe05cb8f8321ac882a63bd375af0f3d9ecc73aeebe1267f473a9f90b94f5b6de4357b74eb30cd41aeafc259e85cac7d365ee33382a584eec63719ea325a2414e116f84d2af9654268ec44d6ea2e981581d45d805b383d85c130d2dcd1c71fa68d9c76d79aa8196152c1d9440c33d99de451a359e0d2c51d6aaecb26795406e528f5de3e00947d3dacc695c08a960889a2e94ecf0a461c02afc58b51e00369c73c8140e8b92388caabd1f37a62d1b210e0f314127f46b576a4b8edeb34713aa4136b8a1875bba8a5937066544e34c206aa4\n" 1673 + ~k:"73c28bca3c8067da792f6312153b298a8f714cad70bb2349803b6dad024f6bc1\n" 1674 + ~r:"05057a982ab4a2e32238ef2e3edba07fd193d90c5f053c83a9f176e21a9d5208\n" 1675 + ~s:"03c2b26cf46b7f72691a72d7cbf33653df347f02b0683ebc6cb7ea7e72dc8a0a\n\n"; 1676 + case 1677 + ~msg: 1678 + "7527533f2d10c18078f5a8dec350cdfad06d3157871e4ff7d7c2b7ab11dff232d34f07699278f075442e1d4ee00cd6e87c1931333841c399576f4e587a251684e731f7c8369f712656bc1e6c2d209f511179da09368d93290e058e0ce9b6530ac6c5e4cf0a1b22d588d98f32b34e85206e09aac04a0e1f2ae2a5cfdac4e6e2b3\n" 1679 + ~x:"40792e5ab46518c6ffcf5357f0c5de5d9e2de99c92aebea82a307ab0f5ad252b\n" 1680 + ~y: 1681 + "72c46505e4b071f46ed6b6d530801664a4fd518e4c6be8468a38c22bf74ed966fdc7bfd7c572218998fc4c144b59462af7e294bdf5797ecea5cb2edf8c8d2dabba88d0b84cf28524369c5040b58f090772dac0fe453c32907e9b6c740fb24ed4dacb8fdd25e0661bc0d79d41f103fbc8f96b3e3a4708a5a7f5dbffc98f344bb7ccf0d5ed07af2c2f0d5f407bcfefb54d9b947604e7a78356874c01b8c1fdd749f6a3d619d1090c83725e725706846c16bf9dfdf39f2180623f4f585402cc7d6e2c10b57c8300543686a386056a931be6336bb6173d9fda8b102cf32989cf0978f956d9ae0d8f30752f156f9f92d2954ef13100a75d9f7ff96fe15df07e7993e3\n" 1682 + ~k:"0c9fe826a7618108684ba2d74f10ca39168feb85f74d2737fd12d18cf27a2f16\n" 1683 + ~r:"6aa6c4d7afda30ff2d7178b52a3e437ed5b0745a247c9c9e120bd3e833a1dfac\n" 1684 + ~s:"26e0887911bb5edb6a566a2a1276353391b1e4ab8ae0b259c1bbb3af3d85b439\n\n"; 1685 + case 1686 + ~msg: 1687 + "994a49e5e8a5698fdac9a7faac01fb09b2c6113a186677676d11e6049dc98c93c51eb5144af181e1efbf44439a13d295653854813671f032aa62258c14195c4864afae0b5d154f97565cef075bbb6d97e34181410309ffe98b45c1f874326343c36c14f55fa058489dff3b49dc7888f45a099c3c919b25edac1706bb90f164ca\n" 1688 + ~x:"266cfbe6060134ece2c8b9e6aa25bd6cc935e49c23fdd4fb6adb2ecde63a4960\n" 1689 + ~y: 1690 + "05e233ac49c1fda2a0c3c78b0bc72fa39674055d188a124a58ab3850d9a888861c2fe4d046c3e7c75ee254de70cdb1c3150201c2e04733ebcc25b88770fc2aa82f60526bc664047a026c2290fad8e9f81cedddde7fe3ba406535bf2710d79da01bd2d42bb5f4099c3f8bc2ac864be7892aeb6a1f3402c81474da23e0795cd6c21367509a541591ee1e6364f7e755b1419e90af869930152f34de51f0f06ca3076e68c3e3ea7f4f1bf1d3cde3a0dff0cffa1b5842752347082dda3475992f15a74d298524e636220bc9faed08af7aa5e481ba78d2d2fd8e51942cfd084efe0ebddd7500efc95a6cad37fc4923f9bf65297805840876c689ee079b7fa6169768fa\n" 1691 + ~k:"60f8416735fa49ab567c0bf1b6da434e1df41579699c1a92a3e70e1d90705379\n" 1692 + ~r:"3cc269bc7b895864a03231318cf39379ae33c7180a18c08b5aef7414fdac058f\n" 1693 + ~s:"6a6eb83c5fab10e34f0416628c821a6de0ad0c202443c6df032cc9d8e4948ac6"; 1694 + ] 1150 1695 1151 1696 let sha224_n256_cases = 1152 1697 (* [mod = L=2048, N=256, SHA-224] *) 1153 - let domain = params 1154 - ~p:"d02276ebf3c22ffd666983183a47ae94c9bccbcbf95ddcb491d1f7ce643549199992d37c79e7b032d26ed031b6ba4489f3125826fafb2726a98333ebd9abdde592d8693d9859536d9cc3841a1d24e044d35aced6136256fc6d6b615cf4f4163aa381eb2b4c480825a8eccc56d8ddcf5fe637e38ad9b2974bd2cf68bf271e0d067d2465a8b6b660524f0082598945ada58ea649b9804eb4753408c2c59768c46abb82e3295f3d9ca469f84cc187f572dc4b5a3b39346ec839dfad6f07d6d1f0e215209bb0ecc05c767cf2e7943ac9cfb02eee1e9ef5946e8ce88316b5e15fdcf95a132ef2e4bb0817136528cfa5dd96532f9c3abe5c421620edb6bcbd52234ca9 1155 - " ~q:"8000000012997e8285e4089708f528070c6d7af8a0bd01409e7a079cdb6fc5bb 1156 - " ~g:"778453049ef262147fed7b59b0ee6764607c51e7b5b5fc6fea7a7a7b1dd6bb283f4a9ae98efd3964b1556758cb15b2a53af8619e74d85898bec77d3b3f382494ae5961a13ffc745da386182291519800f99dd710e00aeb15adee088e2798ee2e46f598526cf0f4667055d1ba009750041dc5cdd2725ff1d97dd340c8518af7671b87d39d67aeced84b66f84e0701efc82a5c9ef954ee576d24c385b14d63037f0d866fd424b4975bdd5485ed740cb932e843f906683f7c7b2c74775d901c361b847b519c0da699638da40bd736b783d2710b2c2cc26ef91271bf4e2c1929f876e902e2057164223bc78d6a2b9f6c0c7a7cb85922f7d6c4287ae23861f8128848" 1698 + let domain = 1699 + params 1700 + ~p: 1701 + "d02276ebf3c22ffd666983183a47ae94c9bccbcbf95ddcb491d1f7ce643549199992d37c79e7b032d26ed031b6ba4489f3125826fafb2726a98333ebd9abdde592d8693d9859536d9cc3841a1d24e044d35aced6136256fc6d6b615cf4f4163aa381eb2b4c480825a8eccc56d8ddcf5fe637e38ad9b2974bd2cf68bf271e0d067d2465a8b6b660524f0082598945ada58ea649b9804eb4753408c2c59768c46abb82e3295f3d9ca469f84cc187f572dc4b5a3b39346ec839dfad6f07d6d1f0e215209bb0ecc05c767cf2e7943ac9cfb02eee1e9ef5946e8ce88316b5e15fdcf95a132ef2e4bb0817136528cfa5dd96532f9c3abe5c421620edb6bcbd52234ca9\n" 1702 + ~q:"8000000012997e8285e4089708f528070c6d7af8a0bd01409e7a079cdb6fc5bb\n" 1703 + ~g: 1704 + "778453049ef262147fed7b59b0ee6764607c51e7b5b5fc6fea7a7a7b1dd6bb283f4a9ae98efd3964b1556758cb15b2a53af8619e74d85898bec77d3b3f382494ae5961a13ffc745da386182291519800f99dd710e00aeb15adee088e2798ee2e46f598526cf0f4667055d1ba009750041dc5cdd2725ff1d97dd340c8518af7671b87d39d67aeced84b66f84e0701efc82a5c9ef954ee576d24c385b14d63037f0d866fd424b4975bdd5485ed740cb932e843f906683f7c7b2c74775d901c361b847b519c0da699638da40bd736b783d2710b2c2cc26ef91271bf4e2c1929f876e902e2057164223bc78d6a2b9f6c0c7a7cb85922f7d6c4287ae23861f8128848" 1157 1705 in 1158 1706 let case = case_of ~domain ~hash:Digestif.sha224 in 1159 1707 1160 - [ case ~msg:"39f2d8d503aae8cd17854456ecfad49a18900d4375412bc689181ed9c2ccafea98dca689a72dc75e5367d3d3abfc2169700d5891cff70f69d9aca093b061b9f5057f94636bc2783115254344fb12e33b167272e198838a8728e7744ea9a2e8248e34d5906e298302472637b879de91c1a6f9f331a5cf98a5af29132990d27416 1161 - " ~x:"6ba81e6cd4367798aaab8b7af1135183a37c42a766dbd68cd2dce78f2670ef0f 1162 - " ~y:"7bb31e98c7a0437f978a73d5dcfbdfbb09cc2499dfaf1eb5256bccd6358cabb5f67d04a42823463b7e957f2b9213f1fa8e5a98d614484701abb8c7d67641fe6ed06fa4527b493ddab2e74640fde3de70da693f1db2b8e26417040af0eea6cab451a795a52e187d2ee241b93f65c86c6d66f45834cce165ac5eb670d4f0095c23ce9757e3bdc636f991ee0073d90a09202edb35cc3ea1cf9adca1617fa0bffd9c126229a604a1d3bf4931ddf0b9942dfc8a2f8c09fcc97032564a79ae1ebe1e2ce49ff57839e7c43fa60b1603d15a450898aa4e4a1ee8065794126d64f013367096a83686b9f158c33b10f5f3b36cf1f6358b3f34f84b101dc26d3db68bcc95c8 1163 - " ~k:"45030b79a395b1632700cbaffead97998d02bed8e0656876fc0174e4bdb96f79 1164 - " ~r:"059bee9e708b7f20c3f791a640edee964e0aa672893c484799715817b3a8f6d4 1165 - " ~s:"4bd41c84a724cc86e4f0194ec0fbf379e654d0d7f6a1f08bd468139422a5c353 1166 - 1167 - " ; case ~msg:"0577ee4a9b8dbe3c6fb9725174e89940b27e8a989217b64417e66f396a35e5824f21e58236b27910a3be6b57d311aa778bef63dd025d9435301aefc92223c1aabb03d3d5d385b1a3d1f937f0f1f7f8baba91a011207480b5c23a78ebaea69ae8ad4373b2b052d60c5461111479591f8330123bf74370fba66bc7e2b400192c47 1168 - " ~x:"7bd811cf6056c1a821a85a3169113639d775247bc6578c9eeb28d4b09503ac0b 1169 - " ~y:"c54a57b08f255db1c776bb2126ea3c1e60229f1e1981e43f1d6b9110f950edd8245eeca7d55ba06468040855b736db502f01d6b3cb2d9d621c4db44cf8cb390ab2ae332bca219e09bbbbc225541d4a0ec0b4f11a591c077f2382f04bd93b364c94fb1c6147ff7784e82558e5fb68427459fa9a69d78a9f6051bd9431887ace46fa4970f0e22d75d2befa5a228e489e009af97ce9211408b4e5bfe37d3e0700b258b54174a5125eb6bbeca38805da53b1f5829dfdec8c4c9376bf235b7b0eb7119d3d69768b80ee02234589b8d95faf8062a8e1e9c3a686b6350e30fa535eaae71d753b7c3b048f8e9722254dedbc220ac9c9af0784532032ab65e48ccfcfd623 1170 - " ~k:"7ce602ece3f821390641dec7ae01b44df0fc822de1c013496bade2e3e44fff0b 1171 - " ~r:"33c198ea68bec4a7fedaf0309c317d336b97d1eb1f1dc44ebaf5c85c5a3afa98 1172 - " ~s:"5c9b23c13bb607be5473b32ae2b5e8f2a1e18f59df8ca7fd9303f76ed8e680e3 1173 - 1174 - " ; case ~msg:"c643695d29b28210017aa5a7d16ebed81ba00a869d6681d1c0fe90a5e8be9d597329ea15d24ba12d77e4c3f2160bcbe808840c6e77b0528bf9ae588738e22f41910a80a7c6e3340c127b9de17945e7f9229953e2850217b6d486f7cc804e720de214cef02df4a892f7e42898f15caad26bb30bfaf4b0551aeea14035cb756b11 1175 - " ~x:"3ff2653cbc1f27253400a9b6b1f064247053c9816cfdcb704b14bdece2a8558b 1176 - " ~y:"17ff2a5eff3926ee1520d5a63a13b4f701dceed25a653966f525450b3a63b03229d615ec54cf4f6ddb868b54df363feecc95eb8a3ab2587fc4de9c93dc8f8d7f38f99082d2867b23d073584c831baa0961651e071b43f9d5da97b60e7b5b7a935f6c1dc88279608e2bec5cac6162488085d092a97c6b6f24536589b801b6b48d478796b52c05564e904bc58ac1505074db3734fcf3575f79952ba0a2a0697e55e579d508a400ebfb2d4694b720804a9d00f8845ef0a8e690e675b4c1ce07996d64e666b0d6a1d6fc6bbc3cd9b5cc3864e5e888e3c335e05e83c67c0033ba5efc3dcdec0446d3b40793236ca074c54d2a74dad296d7c639dec938e3bf1ca085dc 1177 - " ~k:"356b49268eb799dc4db7781a06be0f8b96d28f6a13b7523c0ecbe70cb3eea1aa 1178 - " ~r:"4ddd2a1f411b570fef6d9184409b4fd55d12c5e4bddc2ac7211235873322155d 1179 - " ~s:"4043952c108ef84a25a168ea5b64a4386f7a483366054c5dfbfc5fa98579432a 1180 - 1181 - " ; case ~msg:"2f64d11e290275987b7d7430242289afd54f1be028cf36f8f55db54be70b8dd5ad74ae26e079d0ed31a361c116951bde94d686abf15ac5ed1470c3e902461cea8e5d58f407d2e0c072ee61567da7b353f6c47e694cd607f3ae894a9705e8ea2bf9ceec3acfa6d20b238bf0a7a7eac76c4462b7e4e4e868174a88a6a6c9476cdf 1182 - " ~x:"4800e9ecd9bef5a4d46aca60aca96955d8565e1b85d84dd8141d4f597e178bff 1183 - " ~y:"41cdb2c1bdfa3652ee49695d5e5eeec00f64b54b5676ee27f043b43f24133f61425b0cebaa1f88da072cc68865c12790c43285b7e19c3844fc7d81d064423ff1e19266f69f7dcb3d0203739f84d73bf00c52d60b2875171216678d59fb557553edc9eba6b84127169fe5dd2f81fc902c970d1d8d9c4779dfa1b14309f81006ee641776a6fa36339e963117447aceb823c9ca3367172eddaf6e361829dae43c4038cdb90ebb68b53c0a22d410b6f1bfa7c47496ea3aeddc36bf24f219b85917a24d30847c77d87d22a7f7486c6684755e045ddf72d41650e97b64a64becadfc47d53555127f8b7ab78d480529571996eede4618882d838bd695efc87e74d68ca5 1184 - " ~k:"460410eaeb111a18cf894468e10a88b8de8ef9dfd9a2ea1882a9fb696fd7823d 1185 - " ~r:"4fe6e2a75d9c72e81ac60dd33d31180df829b31a0dbd5fd20b7e28c4fee27d5b 1186 - " ~s:"3ce4a06bfaf70cb6cc93f33f95a43ad77ed7ad7c77a1674bf849e9ebbc5eda29 1187 - 1188 - " ; case ~msg:"173c4a23621c32c3e4b157ef96b02fc1bb466a2537d3f6e51a58e510c4aef3aae4bce4c0b4d59bb1c00e7a35f98945ca9d7fdf1f0bac732d425043062bc6d32015233dfb295ae08a324ac7c1e02a117ce436d77d4e46d0b794af04b1db82a2709da1c4449c29ccba93db8ec48eb17921cb389f6e0ae32995d7fee1fa07177a7a 1189 - " ~x:"3e696f226f21916455f8ccc861b1845303867b75303ed92f9ac79088f56ea708 1190 - " ~y:"673e349cf6d05caa16751d97ba6e344e40e158e6a7fc53ea2db87891341e6499825b5b9edbce9190bd87c3eadf7c6d5bf0a793af2c3a1c8ded790bc319449394c64384305864723a8a7bfef26c082030ab360bf9abb11117e61b00549726d772221f6f67c4a6a110cd9a9658781ea8f7ef2f176c6e8816a865af396db95d8415b541cf0f83e45a417374cf3acf5c6b4a98390522e7140cc8aa3f9d2dd26341d4eb79e4d931a178e3d57dc52bfdf90115e01b76094ad0294979d35d92b574ce7b0c627f08be66f99effadc33aed0f634f6a89507455d7341ee64183aa610d8bb3237147bd90dcd9c1a03d89b26ee31dbef5ae7e764ba9f77b6a7434ad2a8f966c 1191 - " ~k:"2837f7fa85efafb433093231983ccef5d82080e6063f67c68ff93465b59d581e 1192 - " ~r:"393d681c3edba28f7cb0f30593b94fc15cca659a80cfbcb3b236453722d5b402 1193 - " ~s:"44f7421bce1e5273a30ec016bb9969b757197987548e434e395ab3de1b0e7ba2 1194 - 1195 - " ; case ~msg:"7d6f2a97e1eb085cb9e83aa24047af9ba30a05d7bab564a149b9cd2366518e8f199134fc2ca403947f2a614c0363ed4bc1349dc496a8ec74d880578475e47427628bb023f0272208876a3a7333307a596c158eba64ce42a3c790e7167ba4a327ac71aabad2f36341edea12ce5b2b735807b34b714a49a0aa476893578f0645db 1196 - " ~x:"660898413f7a71804432ecfa11cc68f85a34fdf75012c965259ea6ca0bbcd976 1197 - " ~y:"777c251067c8ab16cce2c4a4d784c7e806fd296cbbbab0132e2ab91623acecd830e7cc7cde03e544b51fb1d8f0b2eec09f559539aa9d63ebc0c1e32579f095473d12717ce88f6671ec7e3d2581f61bfde66cf9be216d6a208086cd7bea770150a9bb0a5a7a0dace82b464180241202a30b26ad5fb933c8235ac2918e29bc53a5c01ebc1e30b1b46e37124aec596f8d1a73baeae588ce7d4aef1ae84e9a9766c24367321c047c3caba629f5d9185f0ffb3af7e50eebd1ba0eb77eb121b98073794cbc6622b678262ed3e229c6ceeb607274ce3496f370b482bf8f68c27366818486b72adfc810b2f579779adc9c25002e277641dd9ffbc5db5239f677ba1a9c1d 1198 - " ~k:"4abaf5c6f8e28356fd0dc6f096e9354baac1c2049170b2db05c81bacf02092f2 1199 - " ~r:"463b1fd6ef2986f75f9620779bb6f47e0beafa9340e3e5ee589d92428acd4f2c 1200 - " ~s:"27edd33917e49bf771f3fa1355cd3928d0bd401aa7bf0541f3af1643efd7b677 1201 - 1202 - " ; case ~msg:"7f8785e1c4f82bc0bb75f78d8c4113e0887e761a86b48dfa43a3683b2bb886ba53f5603c8d94a052af3671c5c1e7c232908e10faa6cd54efc79ccfd64811131acd7d60a9309729455aa70443ae8f32a34580f9a1aa7d89e5fa8cd4e95809a573ec6dfe9fe35b1130571982a0dd46eeebb6a16f85ee6314931839e3a4c29dc700 1203 - " ~x:"4be0926fe24da1667d71d2abc2bc0bf87172c05d7c363a324ec61b4642777e57 1204 - " ~y:"28c06e5ab3c860be8c13f74f28b5792b39487b79547f4afaf6f77a5c3a43e88132edf944ee00150a78b58a78cf92ed941578ec679e106767014e5b279c0eae9c408e6ed60687ee1464988ea545f55be3673ecda10c63fb0b1908e796d6715abd5451843da6e63bf8802ccada32c7c5342374ab26ee701f9db3d34fc96de9d23021b98a93df6877f84fad6741164055696f3b72050343ea3e5cca01a3d57e29727ebcf8583118146c27f42adaf62365b9697cf03bddc69d0bd151f715b23bfaaa27a368114b3dfb54c084e06d4343ffde1cd22058e9623a70e9942e090edc73db06dd3180bb960f0d7fed005b149b69d6d45f40368fc25ae04321eda46d52a592 1205 - " ~k:"057cca710c8e4998e9fe154cc57847bf35a512e6caf3cd338372b5becc66e8e1 1206 - " ~r:"3165b1cf3ca9bb89154ad684e089364f91b6e5d594526072f7b9db3b2358e711 1207 - " ~s:"49e1c8c34724ac5532fff1c7d243b486a2cdc0872ab84fda6cf2ba96f958f46a 1208 - 1209 - " ; case ~msg:"3e17ea8b9feb2f4e55c103e58c4ead96b5cb892d0982ab2b0cb1eeb9e1ddde9990233a22588473421aadf52767a8df524bc6e6ed857a9fd5942ef976b1fd8bcad31e403b1febb865d2872a7b34ecdbab8b245ada45243a49c7be67aa09788029779d619de30dead9f7d8c9c42153b865b1a9e81180380e27a305a6392f4b2a0b 1210 - " ~x:"75c9b6c63c80755f7a7bf38eabc58e1bc2e0cc5cb4f2274f2d63058157656608 1211 - " ~y:"b71d0ab2d405a5012d694e0a4a82769256cbdb49c18112efee8153c8e816310486a17bce19748b11f3d5d18cb44998eb329b951c23a57cac47ec9973839b130f3a980e62705c0702e4d68425845d54e152e2e83646b56a6757cde06f85ba3779eea585dfe8302f12ae77fa58cbc6dcca70b461024b7d176510a393ec027c769cfe49b698e575fcf99c60293af2ade3dc4df23ff3386f13777306c52de97ed1a886b824788863ff7263bbbb5b5fa0d4681c16942272f5e441bdf49eec7556c1fd409c78e3aaffeb95c1267dee12c24c045ef67aa70e9a3d9244f2cf1ac68cd918df5f62a3dd3de7bcdeaa3f61de51cc01af636bd665c0099d13938eb4fc289b42 1212 - " ~k:"568b8f5049c2c411f05d74e1781be5718ff921026728d285f2a77025208dbd41 1213 - " ~r:"11b7ecfeb339d6014948de5ad4c96f4ba517a2cddca611c8887fc44f14ac9a63 1214 - " ~s:"13287a22cffd825302b0fdc0955458d918727092c7bfb3ec4c3d7a838ea6c491 1215 - 1216 - " ; case ~msg:"c3e1903ceccb2af5b0dc6b1fbaaf1b2e96477e001c43eee3046eed06128c4c81eb2bc917aa8ac30d07e66c9a9469518e3cabc264d6936e5d724a613bf9a44d60797b890cc5ce0d04629e5faa1dd53e7a125a14a26df3cdd9878d9c67e7e18a4655a188885363ddabd73a17659d191e51fafb6d4171ff6c4b651168ce167ada01 1217 - " ~x:"5feba370a58c16f34e931b65c042e6bfe794309cf30105d2fdac4d9fb3e14303 1218 - " ~y:"429e6ba20b02cd69a29b4a97a6ea564e5b8874ada195a49c3a5293c9bc8d19e0a3a3c4ac8547bfdc7a209bf3a6037e5b0bb7aa291d5940d235c787a2af79a9cd7f83084ba7df85c036ad8ea23c4fdbf91d285c7caa6497af388017bd581ff308d9b56799029e21400c0c99d103a2caec195e40c90d244dac897bd418ae016d25f71e989af516d5e2491e1e4bc25914ec3ad0a9f85968a6777fbebdc73b1ac6814496d9421d2b7cdf17d53f00624010ed6618f1258da194f77c28286225d1b16da3fab76c9b70db1f7dbcbacf4e60b6b91a1f475007ee4d2c5e37fc31e89a0fa808f89e8a4e546bc90e696f454721be71c0731f99ee368afc6998761af9dd9d6d 1219 - " ~k:"7ba86d55b8b5a465f661944832862baf5f565ff0d9195986c809956db2872da9 1220 - " ~r:"77470f0d3923ff407e71a86f0336811bdd63e179891fd30e3452dac1e5175081 1221 - " ~s:"4b969f77c70b5e6ff9350ca25e7d951acaaee907fa7b830a32dce4f91a89afa4 1222 - 1223 - " ; case ~msg:"4b7c0828b715ec2da1e092204f55ddd65d13f1cdd64c109478d3847487bc48a8cb0299222a7495efffa63ea158253faedcb5314881ab41b5e773337662cc2f50dbccc736974e31b3d080467589951d511032e4cba6647f94c679aa269fca6db92715a4da28ff9803a1dc61675fa5ac114e376fa4dadb37c1b09ed5c31bc5aee8 1224 - " ~x:"1ba85c9c8f4f4ae97013bc9f7fab372e733f3445fd9a68f8e015c375df3b5515 1225 - " ~y:"09a16e0a6003f45aaaa3c6311aa9866217d4a7c8cb5093514976f6a341260e5aba7cb00ab2adb7462a47a8cfee4fdcae5accda6d42a3144792a14631bbe85534c111d2ffcdbc15b6db9dbfc4bc71d300324fd310c465443cb2a6f2ae33701f39668b118c38ef562e8554fea661a3ef80455699c23430d28ba6dcf042fc920a677c2971b2df8c6729c5b3b1be6c5a047ac1bcc8cd8dc519ada221bd92ca6893c1cc1dc158f9d472f89a8e02649440dded0f723485558effe8cf9df121c969a2d1b76a37dcbffb17edf3121d4338d4ab68b154226c0072d8bd51f23e5659a2afe520dd5e91005a6fc1157f07973610c5577824bf1666ccf851d69efde347f0b996 1226 - " ~k:"11d09ab8f3140f98dd4076d398a9aafb9c98656dd7185567a562cd108932eb77 1227 - " ~r:"1b8b8d67b640afda26fbe67cfd4bea521375526ad58a22d4d97d7af134384f4a 1228 - " ~s:"66d6c240992256eebe078265c3029a88c34095142134dfc31ff0a2d8bbd609b5 1229 - 1230 - " ; case ~msg:"baea89dcc102cd649135d63a5f52df437af7840d699a9daf131eaac381348d45b4e60477fea88803fca31b54829c5806c703eb8fdf412306ff7a79b55aab9064bc37cb26bffaa671debb74c228ba2d2a06da362f613b78e5b1f0a0b5c5febf6bc326b021bd7fc70471b25e153ea51de1010b87110e01497a7f1ac39cf4d424c3 1231 - " ~x:"2c0a2b700ea43f5fd589e665817339b60f837ca0b7dbab50d2ca7e4c362a14e6 1232 - " ~y:"cbd465ce9c3d0a137ee3d582a5172183b8a63cfe414070b247da367456203f986e6786ffb83ad764aba309c2ef7442ce38735f492c0ce6d92eaf9ae6b1cc873ab6ff58317cd166a510c3ffd8d4e6008825b58cae217fa35c94c9bbd12a4d638c20116398b21b5929dca1d49a7b748970e45de0d432fc912f76199137f1bb0c0d2c95bdcba0d303ecdbf489849be8e630ffff0603948c87a7e58131655c9f407708e8a9d675e28e9b57729f0346c0287f43ed67f9c0c0ce1542984851cc3b521afa5b9b8fa53680bdb2d73c2b6b090ef085a7e7c6f76a2e501064c852591df60439a96dd8d663b564c9e5c253ee8d8ee58ab27d8332113bdd51d8b41ac73c143a 1233 - " ~k:"05c7a20e6e4ddb833c4e30a564436fd66716f349af551e9943bac61572e04107 1234 - " ~r:"7689b5249f1943e685095106d3f68359cdb76be5d9a50ebfdf36e731575f8bda 1235 - " ~s:"049da42de51e617cdcdef17cdf6059345b8e181bac64c47123d47b5efe105ebb 1236 - 1237 - " ; case ~msg:"b1303768be174d83578407dde1ab91cf021124a34c4a35eafa4512707a3660d1f884fa6c3d7df299598018dca22f273f602bab371592b11f4574885741ab3fe2af5b71237d0057ae59f37b61dfd1ad5ea27cf8f05f5b69f2936ec79d104f4a46c902fb6790dfdc75b9768cc7dfbae011c795e646f9a234728707fb112c461007 1238 - " ~x:"247fccb44c2c0cb1f1e58d1033eabd203d8d874d0bf18ba70f04b75bd6495bad 1239 - " ~y:"5602dd579fbe37f187d49d76fd5936fcdef2369f7af29da43c6456a6ac8317b39e4cd679143a4d97751b80ce1cb45186da7bee991e25eb9a1aed1490fd74f6ab507940821a1adfbc30e19a933cc4d21769ccdfc57c96f0d21944f8a0f131626ed013b3e5c01313a1756b67b7d2a21edac486cbc3cd1d2b6fcf20c82dd70b4f72929c1499ad796de894db8af103d9b91c25737073d9df62e6b624b90fb352db781c7f2ff8d3a20a7063fb51272395cc7d35ef79c27b7634e39f74eb152975fdf3b903c23990eede8aa58df9a29954333a3f525d5baafd379dd57fe396a51876f25d9e8265cf6971edc6278ce996bdee206883448af184fae23af2a69572b20090 1240 - " ~k:"0b94ed40c05a4ef445309afb5583cba8d411ff4092452c0a064dbbe6e3ccd1a5 1241 - " ~r:"1800b6bd5c94a031d977b9d017541790a9fe7e414c90fa4d3803d56ef16a6479 1242 - " ~s:"07ece1b64711c9b3eca489e75f2e63438e097498e2890dd0273729a55df0d2df 1243 - 1244 - " ; case ~msg:"25ca3dc8e6ea4ebb936fa01b1ccc08bb1de923be6292421ff9f773af9cc7393510df2fcb6ec188b27c2688c72fdc2ff6c90f0ab0ed59c9c3a6503f53e32778b954eae582c95803c511ff3918adda02e68e2c3e73f8a6ad607a89d8eba0059eb87f4d9b0081f296961ec6ea78853aa53d24a470a74acf16a2f86748a8da34fb90 1245 - " ~x:"32b6f7ce3ce99770b888c1ef23a86377f3e00adf5dab2e380ef8c4298d20a1ee 1246 - " ~y:"bf2e140f8b8d99d2df1052e981fa0ac533c0d4ea9f266f9267cde7ba03cf10015da1cc13612dcfc92030b7c7d1c057e28a6fb45748eeb9c4bd2e6e79b217f4b68ef03f9659c8e84a20ee920d29711381ce39fe0afc9a7fe2fbdfce63249651230f3e72eed579f0d3659c2bffc70fb5d8be889a34bb67f1a904c318568394b946fd40383782cb5e4809d0c6019d20afad09f29fbbc994d28f4e41daf4666298f351898d8def404712c409745a88962e4a618c234976645559c90c54fe764eea46fa03543e4c4f25c8d2c3c1979f952458177dc6963e3f346a7fddbe0cdf23ddc7d2fa8a3455cd5b546e47169912ce7f333ac6f01e64aec596080b5d3e0f25adb9 1247 - " ~k:"73418db52c6594dd0956d9e3616a205de8204220648addd4bfd3a9fee412462a 1248 - " ~r:"7b1dfcf39b624d64db08a3974c8e14173105010f2bd5135e926f2884e30b46fa 1249 - " ~s:"697eeab669677469f62cca46d3e68c849f447881e2c9f74294f4e8ada4426c7d 1250 - 1251 - " ; case ~msg:"d58a8f5ab44f9df9ed936a1318657c324fb1399c251054986d19214c15ce951f87ccb3510aed9085411d9c5a6740df5160f3e57ea8c942d33547317c7a387c60c7ac2f0e14171f0b7719aba76ac418d157a4e3bec6b799b5da10bd3ecddae0857a29670c99d37810349b82b7bb37c0937b0dd2734da08b8b1cb7beecd43cb615 1252 - " ~x:"23a1290f8acbadc352a282015713d6cf5a88e8901cb9588a57151772619f5ae6 1253 - " ~y:"baa13652642d950d8bcec16c624a07999fb557fb40a266297c15659755fd615cc7e2125d4e8c8af8c43335539005e9e2f2d40428e7c8cc055ff3f6fe3b3df604ac128d995cfb9c867e2a9607aa3b77cf0f691738b784d4be2fea4739fda1f0674260f21f666acef5bd56a7800bbe950792ba05eee42e80a2578d2c50ec28d44afb6b687652bb9452408fcaf257c4b5cd564ddc4e63ce9ca13d4c7473f51b01ac8e4c3f799afc908eaeaccad062b0f97d958a3008cae22062bb166c7300df0b4386baecd599fa8b083fba6e7e4e5ba119860268517d79ebdcbe02437bf4eb5d91a843725db0eda66eedd46d66b781aced0dcc23154e4b8a8f0453b2f466033bd9 1254 - " ~k:"25f8923843d757ee4b7571b42de58925b0c2678ec89df07248b4cf34d83db926 1255 - " ~r:"1876b20926d8ede78d28174eeb4cb0c1af8ee206fc8db4a8cdebb5dbfb0c15cf 1256 - " ~s:"231af07aeba99ffd00659394ab6ed19a5e9f9e60e2197f65fc88c815beae7fe0 1257 - 1258 - " ; case ~msg:"aa134e9db73982e7a37a1034aab82b50d5e58e034a5637081dc880a6e265ebc7b353df210304ba00771c5bab445dc6c24999fe8eafdefabcdd46f7a91f30721a6896333c3f301e197f961944f545e4fe0730cd967790504c49b0ab5b890809be5c7c1c3f8a2e52d92a2c199b981b648fdd528e768e6ab392579b54c72c41617d 1259 - " ~x:"02ef078e61df318237c9a217b5ddbda12ab9ffde68a201971782b61b73214cae 1260 - " ~y:"691dfea144e51b9e0ff7536557b58ace8716263a70554e2f4676d172332aedaa67736d72667d328170aca070e1bb89868bf4cc98962d87eb0599f10828c6ea24cffede8ed7b39abba666bd6d0d35024ade6aaa06fe6ae45dc4b3a91c219d472db0efed469d69cb5f11d40158ea81672b1ae116ff2c3016f245254e984a59945e4e3b3d37ad12058d84082955c768643e7d80c055c1703a883f2abb075a24c2e93056697340931c25894d1d2ffac4b1022012c15cb707fb359683ad0408b668779e9d9ba21989baa6a6b0b256a34efb4751bcaf4285b15635d409fda993c0438acddc9da006c390360304ab12da76b444d64e11ccf05d963ffb7f389bee831dc7 1261 - " ~k:"013e35ddd416e092335f3bb24a5e826e3e06cb90daad599a42cb5ae8da830b24 1262 - " ~r:"041d229349cec75fb2bd8c35c249f9196a18962ca75ebdb42dca61d21cb0e910 1263 - " ~s:"77bb7975a544c51bf249dee2359523072863934497d1a479d6e4b245d456eb2a" ] 1264 - 1708 + [ 1709 + case 1710 + ~msg: 1711 + "39f2d8d503aae8cd17854456ecfad49a18900d4375412bc689181ed9c2ccafea98dca689a72dc75e5367d3d3abfc2169700d5891cff70f69d9aca093b061b9f5057f94636bc2783115254344fb12e33b167272e198838a8728e7744ea9a2e8248e34d5906e298302472637b879de91c1a6f9f331a5cf98a5af29132990d27416\n" 1712 + ~x:"6ba81e6cd4367798aaab8b7af1135183a37c42a766dbd68cd2dce78f2670ef0f\n" 1713 + ~y: 1714 + "7bb31e98c7a0437f978a73d5dcfbdfbb09cc2499dfaf1eb5256bccd6358cabb5f67d04a42823463b7e957f2b9213f1fa8e5a98d614484701abb8c7d67641fe6ed06fa4527b493ddab2e74640fde3de70da693f1db2b8e26417040af0eea6cab451a795a52e187d2ee241b93f65c86c6d66f45834cce165ac5eb670d4f0095c23ce9757e3bdc636f991ee0073d90a09202edb35cc3ea1cf9adca1617fa0bffd9c126229a604a1d3bf4931ddf0b9942dfc8a2f8c09fcc97032564a79ae1ebe1e2ce49ff57839e7c43fa60b1603d15a450898aa4e4a1ee8065794126d64f013367096a83686b9f158c33b10f5f3b36cf1f6358b3f34f84b101dc26d3db68bcc95c8\n" 1715 + ~k:"45030b79a395b1632700cbaffead97998d02bed8e0656876fc0174e4bdb96f79\n" 1716 + ~r:"059bee9e708b7f20c3f791a640edee964e0aa672893c484799715817b3a8f6d4\n" 1717 + ~s:"4bd41c84a724cc86e4f0194ec0fbf379e654d0d7f6a1f08bd468139422a5c353\n\n"; 1718 + case 1719 + ~msg: 1720 + "0577ee4a9b8dbe3c6fb9725174e89940b27e8a989217b64417e66f396a35e5824f21e58236b27910a3be6b57d311aa778bef63dd025d9435301aefc92223c1aabb03d3d5d385b1a3d1f937f0f1f7f8baba91a011207480b5c23a78ebaea69ae8ad4373b2b052d60c5461111479591f8330123bf74370fba66bc7e2b400192c47\n" 1721 + ~x:"7bd811cf6056c1a821a85a3169113639d775247bc6578c9eeb28d4b09503ac0b\n" 1722 + ~y: 1723 + "c54a57b08f255db1c776bb2126ea3c1e60229f1e1981e43f1d6b9110f950edd8245eeca7d55ba06468040855b736db502f01d6b3cb2d9d621c4db44cf8cb390ab2ae332bca219e09bbbbc225541d4a0ec0b4f11a591c077f2382f04bd93b364c94fb1c6147ff7784e82558e5fb68427459fa9a69d78a9f6051bd9431887ace46fa4970f0e22d75d2befa5a228e489e009af97ce9211408b4e5bfe37d3e0700b258b54174a5125eb6bbeca38805da53b1f5829dfdec8c4c9376bf235b7b0eb7119d3d69768b80ee02234589b8d95faf8062a8e1e9c3a686b6350e30fa535eaae71d753b7c3b048f8e9722254dedbc220ac9c9af0784532032ab65e48ccfcfd623\n" 1724 + ~k:"7ce602ece3f821390641dec7ae01b44df0fc822de1c013496bade2e3e44fff0b\n" 1725 + ~r:"33c198ea68bec4a7fedaf0309c317d336b97d1eb1f1dc44ebaf5c85c5a3afa98\n" 1726 + ~s:"5c9b23c13bb607be5473b32ae2b5e8f2a1e18f59df8ca7fd9303f76ed8e680e3\n\n"; 1727 + case 1728 + ~msg: 1729 + "c643695d29b28210017aa5a7d16ebed81ba00a869d6681d1c0fe90a5e8be9d597329ea15d24ba12d77e4c3f2160bcbe808840c6e77b0528bf9ae588738e22f41910a80a7c6e3340c127b9de17945e7f9229953e2850217b6d486f7cc804e720de214cef02df4a892f7e42898f15caad26bb30bfaf4b0551aeea14035cb756b11\n" 1730 + ~x:"3ff2653cbc1f27253400a9b6b1f064247053c9816cfdcb704b14bdece2a8558b\n" 1731 + ~y: 1732 + "17ff2a5eff3926ee1520d5a63a13b4f701dceed25a653966f525450b3a63b03229d615ec54cf4f6ddb868b54df363feecc95eb8a3ab2587fc4de9c93dc8f8d7f38f99082d2867b23d073584c831baa0961651e071b43f9d5da97b60e7b5b7a935f6c1dc88279608e2bec5cac6162488085d092a97c6b6f24536589b801b6b48d478796b52c05564e904bc58ac1505074db3734fcf3575f79952ba0a2a0697e55e579d508a400ebfb2d4694b720804a9d00f8845ef0a8e690e675b4c1ce07996d64e666b0d6a1d6fc6bbc3cd9b5cc3864e5e888e3c335e05e83c67c0033ba5efc3dcdec0446d3b40793236ca074c54d2a74dad296d7c639dec938e3bf1ca085dc\n" 1733 + ~k:"356b49268eb799dc4db7781a06be0f8b96d28f6a13b7523c0ecbe70cb3eea1aa\n" 1734 + ~r:"4ddd2a1f411b570fef6d9184409b4fd55d12c5e4bddc2ac7211235873322155d\n" 1735 + ~s:"4043952c108ef84a25a168ea5b64a4386f7a483366054c5dfbfc5fa98579432a\n\n"; 1736 + case 1737 + ~msg: 1738 + "2f64d11e290275987b7d7430242289afd54f1be028cf36f8f55db54be70b8dd5ad74ae26e079d0ed31a361c116951bde94d686abf15ac5ed1470c3e902461cea8e5d58f407d2e0c072ee61567da7b353f6c47e694cd607f3ae894a9705e8ea2bf9ceec3acfa6d20b238bf0a7a7eac76c4462b7e4e4e868174a88a6a6c9476cdf\n" 1739 + ~x:"4800e9ecd9bef5a4d46aca60aca96955d8565e1b85d84dd8141d4f597e178bff\n" 1740 + ~y: 1741 + "41cdb2c1bdfa3652ee49695d5e5eeec00f64b54b5676ee27f043b43f24133f61425b0cebaa1f88da072cc68865c12790c43285b7e19c3844fc7d81d064423ff1e19266f69f7dcb3d0203739f84d73bf00c52d60b2875171216678d59fb557553edc9eba6b84127169fe5dd2f81fc902c970d1d8d9c4779dfa1b14309f81006ee641776a6fa36339e963117447aceb823c9ca3367172eddaf6e361829dae43c4038cdb90ebb68b53c0a22d410b6f1bfa7c47496ea3aeddc36bf24f219b85917a24d30847c77d87d22a7f7486c6684755e045ddf72d41650e97b64a64becadfc47d53555127f8b7ab78d480529571996eede4618882d838bd695efc87e74d68ca5\n" 1742 + ~k:"460410eaeb111a18cf894468e10a88b8de8ef9dfd9a2ea1882a9fb696fd7823d\n" 1743 + ~r:"4fe6e2a75d9c72e81ac60dd33d31180df829b31a0dbd5fd20b7e28c4fee27d5b\n" 1744 + ~s:"3ce4a06bfaf70cb6cc93f33f95a43ad77ed7ad7c77a1674bf849e9ebbc5eda29\n\n"; 1745 + case 1746 + ~msg: 1747 + "173c4a23621c32c3e4b157ef96b02fc1bb466a2537d3f6e51a58e510c4aef3aae4bce4c0b4d59bb1c00e7a35f98945ca9d7fdf1f0bac732d425043062bc6d32015233dfb295ae08a324ac7c1e02a117ce436d77d4e46d0b794af04b1db82a2709da1c4449c29ccba93db8ec48eb17921cb389f6e0ae32995d7fee1fa07177a7a\n" 1748 + ~x:"3e696f226f21916455f8ccc861b1845303867b75303ed92f9ac79088f56ea708\n" 1749 + ~y: 1750 + "673e349cf6d05caa16751d97ba6e344e40e158e6a7fc53ea2db87891341e6499825b5b9edbce9190bd87c3eadf7c6d5bf0a793af2c3a1c8ded790bc319449394c64384305864723a8a7bfef26c082030ab360bf9abb11117e61b00549726d772221f6f67c4a6a110cd9a9658781ea8f7ef2f176c6e8816a865af396db95d8415b541cf0f83e45a417374cf3acf5c6b4a98390522e7140cc8aa3f9d2dd26341d4eb79e4d931a178e3d57dc52bfdf90115e01b76094ad0294979d35d92b574ce7b0c627f08be66f99effadc33aed0f634f6a89507455d7341ee64183aa610d8bb3237147bd90dcd9c1a03d89b26ee31dbef5ae7e764ba9f77b6a7434ad2a8f966c\n" 1751 + ~k:"2837f7fa85efafb433093231983ccef5d82080e6063f67c68ff93465b59d581e\n" 1752 + ~r:"393d681c3edba28f7cb0f30593b94fc15cca659a80cfbcb3b236453722d5b402\n" 1753 + ~s:"44f7421bce1e5273a30ec016bb9969b757197987548e434e395ab3de1b0e7ba2\n\n"; 1754 + case 1755 + ~msg: 1756 + "7d6f2a97e1eb085cb9e83aa24047af9ba30a05d7bab564a149b9cd2366518e8f199134fc2ca403947f2a614c0363ed4bc1349dc496a8ec74d880578475e47427628bb023f0272208876a3a7333307a596c158eba64ce42a3c790e7167ba4a327ac71aabad2f36341edea12ce5b2b735807b34b714a49a0aa476893578f0645db\n" 1757 + ~x:"660898413f7a71804432ecfa11cc68f85a34fdf75012c965259ea6ca0bbcd976\n" 1758 + ~y: 1759 + "777c251067c8ab16cce2c4a4d784c7e806fd296cbbbab0132e2ab91623acecd830e7cc7cde03e544b51fb1d8f0b2eec09f559539aa9d63ebc0c1e32579f095473d12717ce88f6671ec7e3d2581f61bfde66cf9be216d6a208086cd7bea770150a9bb0a5a7a0dace82b464180241202a30b26ad5fb933c8235ac2918e29bc53a5c01ebc1e30b1b46e37124aec596f8d1a73baeae588ce7d4aef1ae84e9a9766c24367321c047c3caba629f5d9185f0ffb3af7e50eebd1ba0eb77eb121b98073794cbc6622b678262ed3e229c6ceeb607274ce3496f370b482bf8f68c27366818486b72adfc810b2f579779adc9c25002e277641dd9ffbc5db5239f677ba1a9c1d\n" 1760 + ~k:"4abaf5c6f8e28356fd0dc6f096e9354baac1c2049170b2db05c81bacf02092f2\n" 1761 + ~r:"463b1fd6ef2986f75f9620779bb6f47e0beafa9340e3e5ee589d92428acd4f2c\n" 1762 + ~s:"27edd33917e49bf771f3fa1355cd3928d0bd401aa7bf0541f3af1643efd7b677\n\n"; 1763 + case 1764 + ~msg: 1765 + "7f8785e1c4f82bc0bb75f78d8c4113e0887e761a86b48dfa43a3683b2bb886ba53f5603c8d94a052af3671c5c1e7c232908e10faa6cd54efc79ccfd64811131acd7d60a9309729455aa70443ae8f32a34580f9a1aa7d89e5fa8cd4e95809a573ec6dfe9fe35b1130571982a0dd46eeebb6a16f85ee6314931839e3a4c29dc700\n" 1766 + ~x:"4be0926fe24da1667d71d2abc2bc0bf87172c05d7c363a324ec61b4642777e57\n" 1767 + ~y: 1768 + "28c06e5ab3c860be8c13f74f28b5792b39487b79547f4afaf6f77a5c3a43e88132edf944ee00150a78b58a78cf92ed941578ec679e106767014e5b279c0eae9c408e6ed60687ee1464988ea545f55be3673ecda10c63fb0b1908e796d6715abd5451843da6e63bf8802ccada32c7c5342374ab26ee701f9db3d34fc96de9d23021b98a93df6877f84fad6741164055696f3b72050343ea3e5cca01a3d57e29727ebcf8583118146c27f42adaf62365b9697cf03bddc69d0bd151f715b23bfaaa27a368114b3dfb54c084e06d4343ffde1cd22058e9623a70e9942e090edc73db06dd3180bb960f0d7fed005b149b69d6d45f40368fc25ae04321eda46d52a592\n" 1769 + ~k:"057cca710c8e4998e9fe154cc57847bf35a512e6caf3cd338372b5becc66e8e1\n" 1770 + ~r:"3165b1cf3ca9bb89154ad684e089364f91b6e5d594526072f7b9db3b2358e711\n" 1771 + ~s:"49e1c8c34724ac5532fff1c7d243b486a2cdc0872ab84fda6cf2ba96f958f46a\n\n"; 1772 + case 1773 + ~msg: 1774 + "3e17ea8b9feb2f4e55c103e58c4ead96b5cb892d0982ab2b0cb1eeb9e1ddde9990233a22588473421aadf52767a8df524bc6e6ed857a9fd5942ef976b1fd8bcad31e403b1febb865d2872a7b34ecdbab8b245ada45243a49c7be67aa09788029779d619de30dead9f7d8c9c42153b865b1a9e81180380e27a305a6392f4b2a0b\n" 1775 + ~x:"75c9b6c63c80755f7a7bf38eabc58e1bc2e0cc5cb4f2274f2d63058157656608\n" 1776 + ~y: 1777 + "b71d0ab2d405a5012d694e0a4a82769256cbdb49c18112efee8153c8e816310486a17bce19748b11f3d5d18cb44998eb329b951c23a57cac47ec9973839b130f3a980e62705c0702e4d68425845d54e152e2e83646b56a6757cde06f85ba3779eea585dfe8302f12ae77fa58cbc6dcca70b461024b7d176510a393ec027c769cfe49b698e575fcf99c60293af2ade3dc4df23ff3386f13777306c52de97ed1a886b824788863ff7263bbbb5b5fa0d4681c16942272f5e441bdf49eec7556c1fd409c78e3aaffeb95c1267dee12c24c045ef67aa70e9a3d9244f2cf1ac68cd918df5f62a3dd3de7bcdeaa3f61de51cc01af636bd665c0099d13938eb4fc289b42\n" 1778 + ~k:"568b8f5049c2c411f05d74e1781be5718ff921026728d285f2a77025208dbd41\n" 1779 + ~r:"11b7ecfeb339d6014948de5ad4c96f4ba517a2cddca611c8887fc44f14ac9a63\n" 1780 + ~s:"13287a22cffd825302b0fdc0955458d918727092c7bfb3ec4c3d7a838ea6c491\n\n"; 1781 + case 1782 + ~msg: 1783 + "c3e1903ceccb2af5b0dc6b1fbaaf1b2e96477e001c43eee3046eed06128c4c81eb2bc917aa8ac30d07e66c9a9469518e3cabc264d6936e5d724a613bf9a44d60797b890cc5ce0d04629e5faa1dd53e7a125a14a26df3cdd9878d9c67e7e18a4655a188885363ddabd73a17659d191e51fafb6d4171ff6c4b651168ce167ada01\n" 1784 + ~x:"5feba370a58c16f34e931b65c042e6bfe794309cf30105d2fdac4d9fb3e14303\n" 1785 + ~y: 1786 + "429e6ba20b02cd69a29b4a97a6ea564e5b8874ada195a49c3a5293c9bc8d19e0a3a3c4ac8547bfdc7a209bf3a6037e5b0bb7aa291d5940d235c787a2af79a9cd7f83084ba7df85c036ad8ea23c4fdbf91d285c7caa6497af388017bd581ff308d9b56799029e21400c0c99d103a2caec195e40c90d244dac897bd418ae016d25f71e989af516d5e2491e1e4bc25914ec3ad0a9f85968a6777fbebdc73b1ac6814496d9421d2b7cdf17d53f00624010ed6618f1258da194f77c28286225d1b16da3fab76c9b70db1f7dbcbacf4e60b6b91a1f475007ee4d2c5e37fc31e89a0fa808f89e8a4e546bc90e696f454721be71c0731f99ee368afc6998761af9dd9d6d\n" 1787 + ~k:"7ba86d55b8b5a465f661944832862baf5f565ff0d9195986c809956db2872da9\n" 1788 + ~r:"77470f0d3923ff407e71a86f0336811bdd63e179891fd30e3452dac1e5175081\n" 1789 + ~s:"4b969f77c70b5e6ff9350ca25e7d951acaaee907fa7b830a32dce4f91a89afa4\n\n"; 1790 + case 1791 + ~msg: 1792 + "4b7c0828b715ec2da1e092204f55ddd65d13f1cdd64c109478d3847487bc48a8cb0299222a7495efffa63ea158253faedcb5314881ab41b5e773337662cc2f50dbccc736974e31b3d080467589951d511032e4cba6647f94c679aa269fca6db92715a4da28ff9803a1dc61675fa5ac114e376fa4dadb37c1b09ed5c31bc5aee8\n" 1793 + ~x:"1ba85c9c8f4f4ae97013bc9f7fab372e733f3445fd9a68f8e015c375df3b5515\n" 1794 + ~y: 1795 + "09a16e0a6003f45aaaa3c6311aa9866217d4a7c8cb5093514976f6a341260e5aba7cb00ab2adb7462a47a8cfee4fdcae5accda6d42a3144792a14631bbe85534c111d2ffcdbc15b6db9dbfc4bc71d300324fd310c465443cb2a6f2ae33701f39668b118c38ef562e8554fea661a3ef80455699c23430d28ba6dcf042fc920a677c2971b2df8c6729c5b3b1be6c5a047ac1bcc8cd8dc519ada221bd92ca6893c1cc1dc158f9d472f89a8e02649440dded0f723485558effe8cf9df121c969a2d1b76a37dcbffb17edf3121d4338d4ab68b154226c0072d8bd51f23e5659a2afe520dd5e91005a6fc1157f07973610c5577824bf1666ccf851d69efde347f0b996\n" 1796 + ~k:"11d09ab8f3140f98dd4076d398a9aafb9c98656dd7185567a562cd108932eb77\n" 1797 + ~r:"1b8b8d67b640afda26fbe67cfd4bea521375526ad58a22d4d97d7af134384f4a\n" 1798 + ~s:"66d6c240992256eebe078265c3029a88c34095142134dfc31ff0a2d8bbd609b5\n\n"; 1799 + case 1800 + ~msg: 1801 + "baea89dcc102cd649135d63a5f52df437af7840d699a9daf131eaac381348d45b4e60477fea88803fca31b54829c5806c703eb8fdf412306ff7a79b55aab9064bc37cb26bffaa671debb74c228ba2d2a06da362f613b78e5b1f0a0b5c5febf6bc326b021bd7fc70471b25e153ea51de1010b87110e01497a7f1ac39cf4d424c3\n" 1802 + ~x:"2c0a2b700ea43f5fd589e665817339b60f837ca0b7dbab50d2ca7e4c362a14e6\n" 1803 + ~y: 1804 + "cbd465ce9c3d0a137ee3d582a5172183b8a63cfe414070b247da367456203f986e6786ffb83ad764aba309c2ef7442ce38735f492c0ce6d92eaf9ae6b1cc873ab6ff58317cd166a510c3ffd8d4e6008825b58cae217fa35c94c9bbd12a4d638c20116398b21b5929dca1d49a7b748970e45de0d432fc912f76199137f1bb0c0d2c95bdcba0d303ecdbf489849be8e630ffff0603948c87a7e58131655c9f407708e8a9d675e28e9b57729f0346c0287f43ed67f9c0c0ce1542984851cc3b521afa5b9b8fa53680bdb2d73c2b6b090ef085a7e7c6f76a2e501064c852591df60439a96dd8d663b564c9e5c253ee8d8ee58ab27d8332113bdd51d8b41ac73c143a\n" 1805 + ~k:"05c7a20e6e4ddb833c4e30a564436fd66716f349af551e9943bac61572e04107\n" 1806 + ~r:"7689b5249f1943e685095106d3f68359cdb76be5d9a50ebfdf36e731575f8bda\n" 1807 + ~s:"049da42de51e617cdcdef17cdf6059345b8e181bac64c47123d47b5efe105ebb\n\n"; 1808 + case 1809 + ~msg: 1810 + "b1303768be174d83578407dde1ab91cf021124a34c4a35eafa4512707a3660d1f884fa6c3d7df299598018dca22f273f602bab371592b11f4574885741ab3fe2af5b71237d0057ae59f37b61dfd1ad5ea27cf8f05f5b69f2936ec79d104f4a46c902fb6790dfdc75b9768cc7dfbae011c795e646f9a234728707fb112c461007\n" 1811 + ~x:"247fccb44c2c0cb1f1e58d1033eabd203d8d874d0bf18ba70f04b75bd6495bad\n" 1812 + ~y: 1813 + "5602dd579fbe37f187d49d76fd5936fcdef2369f7af29da43c6456a6ac8317b39e4cd679143a4d97751b80ce1cb45186da7bee991e25eb9a1aed1490fd74f6ab507940821a1adfbc30e19a933cc4d21769ccdfc57c96f0d21944f8a0f131626ed013b3e5c01313a1756b67b7d2a21edac486cbc3cd1d2b6fcf20c82dd70b4f72929c1499ad796de894db8af103d9b91c25737073d9df62e6b624b90fb352db781c7f2ff8d3a20a7063fb51272395cc7d35ef79c27b7634e39f74eb152975fdf3b903c23990eede8aa58df9a29954333a3f525d5baafd379dd57fe396a51876f25d9e8265cf6971edc6278ce996bdee206883448af184fae23af2a69572b20090\n" 1814 + ~k:"0b94ed40c05a4ef445309afb5583cba8d411ff4092452c0a064dbbe6e3ccd1a5\n" 1815 + ~r:"1800b6bd5c94a031d977b9d017541790a9fe7e414c90fa4d3803d56ef16a6479\n" 1816 + ~s:"07ece1b64711c9b3eca489e75f2e63438e097498e2890dd0273729a55df0d2df\n\n"; 1817 + case 1818 + ~msg: 1819 + "25ca3dc8e6ea4ebb936fa01b1ccc08bb1de923be6292421ff9f773af9cc7393510df2fcb6ec188b27c2688c72fdc2ff6c90f0ab0ed59c9c3a6503f53e32778b954eae582c95803c511ff3918adda02e68e2c3e73f8a6ad607a89d8eba0059eb87f4d9b0081f296961ec6ea78853aa53d24a470a74acf16a2f86748a8da34fb90\n" 1820 + ~x:"32b6f7ce3ce99770b888c1ef23a86377f3e00adf5dab2e380ef8c4298d20a1ee\n" 1821 + ~y: 1822 + "bf2e140f8b8d99d2df1052e981fa0ac533c0d4ea9f266f9267cde7ba03cf10015da1cc13612dcfc92030b7c7d1c057e28a6fb45748eeb9c4bd2e6e79b217f4b68ef03f9659c8e84a20ee920d29711381ce39fe0afc9a7fe2fbdfce63249651230f3e72eed579f0d3659c2bffc70fb5d8be889a34bb67f1a904c318568394b946fd40383782cb5e4809d0c6019d20afad09f29fbbc994d28f4e41daf4666298f351898d8def404712c409745a88962e4a618c234976645559c90c54fe764eea46fa03543e4c4f25c8d2c3c1979f952458177dc6963e3f346a7fddbe0cdf23ddc7d2fa8a3455cd5b546e47169912ce7f333ac6f01e64aec596080b5d3e0f25adb9\n" 1823 + ~k:"73418db52c6594dd0956d9e3616a205de8204220648addd4bfd3a9fee412462a\n" 1824 + ~r:"7b1dfcf39b624d64db08a3974c8e14173105010f2bd5135e926f2884e30b46fa\n" 1825 + ~s:"697eeab669677469f62cca46d3e68c849f447881e2c9f74294f4e8ada4426c7d\n\n"; 1826 + case 1827 + ~msg: 1828 + "d58a8f5ab44f9df9ed936a1318657c324fb1399c251054986d19214c15ce951f87ccb3510aed9085411d9c5a6740df5160f3e57ea8c942d33547317c7a387c60c7ac2f0e14171f0b7719aba76ac418d157a4e3bec6b799b5da10bd3ecddae0857a29670c99d37810349b82b7bb37c0937b0dd2734da08b8b1cb7beecd43cb615\n" 1829 + ~x:"23a1290f8acbadc352a282015713d6cf5a88e8901cb9588a57151772619f5ae6\n" 1830 + ~y: 1831 + "baa13652642d950d8bcec16c624a07999fb557fb40a266297c15659755fd615cc7e2125d4e8c8af8c43335539005e9e2f2d40428e7c8cc055ff3f6fe3b3df604ac128d995cfb9c867e2a9607aa3b77cf0f691738b784d4be2fea4739fda1f0674260f21f666acef5bd56a7800bbe950792ba05eee42e80a2578d2c50ec28d44afb6b687652bb9452408fcaf257c4b5cd564ddc4e63ce9ca13d4c7473f51b01ac8e4c3f799afc908eaeaccad062b0f97d958a3008cae22062bb166c7300df0b4386baecd599fa8b083fba6e7e4e5ba119860268517d79ebdcbe02437bf4eb5d91a843725db0eda66eedd46d66b781aced0dcc23154e4b8a8f0453b2f466033bd9\n" 1832 + ~k:"25f8923843d757ee4b7571b42de58925b0c2678ec89df07248b4cf34d83db926\n" 1833 + ~r:"1876b20926d8ede78d28174eeb4cb0c1af8ee206fc8db4a8cdebb5dbfb0c15cf\n" 1834 + ~s:"231af07aeba99ffd00659394ab6ed19a5e9f9e60e2197f65fc88c815beae7fe0\n\n"; 1835 + case 1836 + ~msg: 1837 + "aa134e9db73982e7a37a1034aab82b50d5e58e034a5637081dc880a6e265ebc7b353df210304ba00771c5bab445dc6c24999fe8eafdefabcdd46f7a91f30721a6896333c3f301e197f961944f545e4fe0730cd967790504c49b0ab5b890809be5c7c1c3f8a2e52d92a2c199b981b648fdd528e768e6ab392579b54c72c41617d\n" 1838 + ~x:"02ef078e61df318237c9a217b5ddbda12ab9ffde68a201971782b61b73214cae\n" 1839 + ~y: 1840 + "691dfea144e51b9e0ff7536557b58ace8716263a70554e2f4676d172332aedaa67736d72667d328170aca070e1bb89868bf4cc98962d87eb0599f10828c6ea24cffede8ed7b39abba666bd6d0d35024ade6aaa06fe6ae45dc4b3a91c219d472db0efed469d69cb5f11d40158ea81672b1ae116ff2c3016f245254e984a59945e4e3b3d37ad12058d84082955c768643e7d80c055c1703a883f2abb075a24c2e93056697340931c25894d1d2ffac4b1022012c15cb707fb359683ad0408b668779e9d9ba21989baa6a6b0b256a34efb4751bcaf4285b15635d409fda993c0438acddc9da006c390360304ab12da76b444d64e11ccf05d963ffb7f389bee831dc7\n" 1841 + ~k:"013e35ddd416e092335f3bb24a5e826e3e06cb90daad599a42cb5ae8da830b24\n" 1842 + ~r:"041d229349cec75fb2bd8c35c249f9196a18962ca75ebdb42dca61d21cb0e910\n" 1843 + ~s:"77bb7975a544c51bf249dee2359523072863934497d1a479d6e4b245d456eb2a"; 1844 + ] 1265 1845 1266 1846 let sha256_n256_cases = 1267 1847 (* [mod = L=2048, N=256, SHA-256] *) 1268 - let domain = params 1269 - ~p:"a8adb6c0b4cf9588012e5deff1a871d383e0e2a85b5e8e03d814fe13a059705e663230a377bf7323a8fa117100200bfd5adf857393b0bbd67906c081e585410e38480ead51684dac3a38f7b64c9eb109f19739a4517cd7d5d6291e8af20a3fbf17336c7bf80ee718ee087e322ee41047dabefbcc34d10b66b644ddb3160a28c0639563d71993a26543eadb7718f317bf5d9577a6156561b082a10029cd44012b18de6844509fe058ba87980792285f2750969fe89c2cd6498db3545638d5379d125dccf64e06c1af33a6190841d223da1513333a7c9d78462abaab31b9f96d5f34445ceb6309f2f6d2c8dde06441e87980d303ef9a1ff007e8be2f0be06cc15f 1270 - " ~q:"e71f8567447f42e75f5ef85ca20fe557ab0343d37ed09edc3f6e68604d6b9dfb 1271 - " ~g:"5ba24de9607b8998e66ce6c4f812a314c6935842f7ab54cd82b19fa104abfb5d84579a623b2574b37d22ccae9b3e415e48f5c0f9bcbdff8071d63b9bb956e547af3a8df99e5d3061979652ff96b765cb3ee493643544c75dbe5bb39834531952a0fb4b0378b3fcbb4c8b5800a5330392a2a04e700bb6ed7e0b85795ea38b1b962741b3f33b9dde2f4ec1354f09e2eb78e95f037a5804b6171659f88715ce1a9b0cc90c27f35ef2f10ff0c7c7a2bb0154d9b8ebe76a3d764aa879af372f4240de8347937e5a90cec9f41ff2f26b8da9a94a225d1a913717d73f10397d2183f1ba3b7b45a68f1ff1893caf69a827802f7b6a48d51da6fbefb64fd9a6c5b75c4561" 1848 + let domain = 1849 + params 1850 + ~p: 1851 + "a8adb6c0b4cf9588012e5deff1a871d383e0e2a85b5e8e03d814fe13a059705e663230a377bf7323a8fa117100200bfd5adf857393b0bbd67906c081e585410e38480ead51684dac3a38f7b64c9eb109f19739a4517cd7d5d6291e8af20a3fbf17336c7bf80ee718ee087e322ee41047dabefbcc34d10b66b644ddb3160a28c0639563d71993a26543eadb7718f317bf5d9577a6156561b082a10029cd44012b18de6844509fe058ba87980792285f2750969fe89c2cd6498db3545638d5379d125dccf64e06c1af33a6190841d223da1513333a7c9d78462abaab31b9f96d5f34445ceb6309f2f6d2c8dde06441e87980d303ef9a1ff007e8be2f0be06cc15f\n" 1852 + ~q:"e71f8567447f42e75f5ef85ca20fe557ab0343d37ed09edc3f6e68604d6b9dfb\n" 1853 + ~g: 1854 + "5ba24de9607b8998e66ce6c4f812a314c6935842f7ab54cd82b19fa104abfb5d84579a623b2574b37d22ccae9b3e415e48f5c0f9bcbdff8071d63b9bb956e547af3a8df99e5d3061979652ff96b765cb3ee493643544c75dbe5bb39834531952a0fb4b0378b3fcbb4c8b5800a5330392a2a04e700bb6ed7e0b85795ea38b1b962741b3f33b9dde2f4ec1354f09e2eb78e95f037a5804b6171659f88715ce1a9b0cc90c27f35ef2f10ff0c7c7a2bb0154d9b8ebe76a3d764aa879af372f4240de8347937e5a90cec9f41ff2f26b8da9a94a225d1a913717d73f10397d2183f1ba3b7b45a68f1ff1893caf69a827802f7b6a48d51da6fbefb64fd9a6c5b75c4561" 1272 1855 in 1273 1856 let case = case_of ~domain ~hash:Digestif.sha256 in 1274 1857 1275 - [ case ~msg:"4e3a28bcf90d1d2e75f075d9fbe55b36c5529b17bc3a9ccaba6935c9e20548255b3dfae0f91db030c12f2c344b3a29c4151c5b209f5e319fdf1c23b190f64f1fe5b330cb7c8fa952f9d90f13aff1cb11d63181da9efc6f7e15bfed4862d1a62c7dcf3ba8bf1ff304b102b1ec3f1497dddf09712cf323f5610a9d10c3d9132659 1276 - " ~x:"446969025446247f84fdea74d02d7dd13672b2deb7c085be11111441955a377b 1277 - " ~y:"5a55dceddd1134ee5f11ed85deb4d634a3643f5f36dc3a70689256469a0b651ad22880f14ab85719434f9c0e407e60ea420e2a0cd29422c4899c416359dbb1e592456f2b3cce233259c117542fd05f31ea25b015d9121c890b90e0bad033be1368d229985aac7226d1c8c2eab325ef3b2cd59d3b9f7de7dbc94af1a9339eb430ca36c26c46ecfa6c5481711496f624e188ad7540ef5df26f8efacb820bd17a1f618acb50c9bc197d4cb7ccac45d824a3bf795c234b556b06aeb929173453252084003f69fe98045fe74002ba658f93475622f76791d9b2623d1b5fff2cc16844746efd2d30a6a8134bfc4c8cc80a46107901fb973c28fc553130f3286c1489da 1278 - " ~k:"117a529e3fdfc79843a5a4c07539036b865214e014b4928c2a31f47bf62a4fdb 1279 - " ~r:"633055e055f237c38999d81c397848c38cce80a55b649d9e7905c298e2a51447 1280 - " ~s:"2bbf68317660ec1e4b154915027b0bc00ee19cfc0bf75d01930504f2ce10a8b0 1281 - 1282 - " ; case ~msg:"a733b3f588d5ac9b9d4fe2f804df8c256403a9f8eef6f191fc48e1267fb5b4d546ba11e77b667844e489bf0d5f72990aeb061d01ccd7949a23def74a803b7d92d51abfadeb4885ffd8ffd58ab87548a15c087a39b8993b2fa64c9d31a594eeb7512da16955834336a234435c5a9d0dd9b15a94e116154dea63fdc8dd7a512181 1283 - " ~x:"853f75ac81b3a842c999448562c584d1cd0277896ec2f93c05c337eed414367a 1284 - " ~y:"356ed47537fbf02cb30a8cee0537f300dff1d0c467399ce70b87a8758d5ec9dd256246fccaeb9dfe109f2a984f2ddaa87aad54ce0d31f907e504521baf4207d7073b0a4a9fc67d8ddda99f87aed6e0367cec27f9c608af743bf1ee6e11d55a182d43b024ace534029b866f6422828bb81a39aae9601ee81c7f81dd358e69f4e2edfa4654d8a65bc64311dc86aac4abc1fc7a3f65159661a0d8e288eb8d665cb0adf5ac3d6ba8e9453facf7542393ae24fd50451d3828086558f7ec528e284935a53f67a1aa8e25d8ad5c4ad55d83aef883a4d9eeb6297e6a53f65049ba9e2c6b7953a760bc1dc46f78ceaaa2c02f5375dd82e708744aa40b15799eb81d7e5b1a 1285 - " ~k:"d41b335753e1ff3f828f57b797ff5b2db5cd79f6a1abeaa137a2a830e24ed4b5 1286 - " ~r:"bcd490568c0a89ba311bef88ea4f4b03d273e793722722327095a378dd6f3522 1287 - " ~s:"74498fc43091fcdd2d1ef0775f8286945a01cd72b805256b0451f9cbd943cf82 1288 - 1289 - " ; case ~msg:"ac30fb155104954b9d7139de9346d54ca05178954053fd361c9719cea530d2d2e1737fc46b0ee27357cecbd47e0fd47ada0d5236a9d77dd61a1b0db52e628b14588fdba8774882866b04b49cf5205db49445a8a202a5fc3fcc36efe0bd0c1e51eb08616c4a7afe120077ea08caf167e90446862298011ad9a1f11cefb5f74335 1290 - " ~x:"d692d2c653bfcab2e7492ec56e512724c912227d793a59882800d37ad260bfd9 1291 - " ~y:"84741bef3d9f9dab0e3fae7839d39c1a1966ab82798d71aa46b7def465e39ea5e7adaeed2dfc92c9bea72d65268b8df955f9b7e7b6923d2bf00e7e43f83a0e54ca944275dc39c0fb0c8a00ccd0b29b790d9d8f3496054390410b4ae5c6eaf2e21bdb52421179970fa13e0948280a06a576cdffae6fdb239ebd486bf4699270e2bc0879be25a6a0c2f7280ea33eeb32c5d2ea6093381fc4c83c8f9a591b0b0e72fcc149c685b01381a74af4ccb902c0050e05baf732bacd1606533e2acc6308c777201eecdcdcbe935149c4e572a15a205d2b80e75ef2473160f85e642d28370c0f19464125c687c969665b13b095aa87ba476802d72c354ebcbcd89f28ef001c 1292 - " ~k:"39335e9193222c7ae3caf8e5ad77b751e9847c37b9016d355ac7520407c91e87 1293 - " ~r:"28c6bfcadb5f52324e39903bf7a04faefb89383f473daa432cab9178f2470d3c 1294 - " ~s:"4e88f65ff776940bafbbfb35643bcdaeb43b25b45de2de3c011ff1449c8b8b32 1295 - 1296 - " ; case ~msg:"2225031fd26a6bb4fd9990347bc2c8ea4ba45bd75df68476f983dffb5531899f1317d95f7cbb493de45cd2f11904cd5c5d5a748b4aa127ca730f89a928ddcd250a6551c2f7cce109e64d3ab74afb2d4f4f7e3494eb7d557060a1f29ecb5b75f64848370902bd6ae2fbf6802b2f9c37f34836ad71dd2e2abf6a0a47df4fd5573d 1297 - " ~x:"87bd74c5d70a292914d96b47dc5e9e97a6799c3b788014e7f106ce7ce7e17a95 1298 - " ~y:"04964c093fdb852c97b165e179f7ef3b39350c2588e60a0177bc2e890ab08ffd73d8a5a6692cfebd0c912de2d50bf02139bf017ec715c2dd7be1aad9d0b96c47d6465d4eb0ea0247ff655959d94a3409e9f9262d877075f6f0c7783a8df3cc115c5287c69bdbf0ffe0ed3719e418ff99b5dcd5f0cfc1065e404a216e095086a6e2197a69c47774377203d99a234e7be61cc4a95a809f9b9dd0a550b712bce5d1cfdafda232d7c831ec52884701155a3df2b086be870af8e875557518b035c84957c1742b8c02b0d46b64a773012809bfa4c5407c3fbfed3b960816604cf42b2defb4feeabc172afbfcbc82836b44b927e0cd4ca63a1daeb3eeb30d1de608127b 1299 - " ~k:"64f504110193cc4a3f400b6fcfd71d64a1e166c048829d23206da12a7dc1423a 1300 - " ~r:"5568d810ba664a08b301266d08c69eacccec5aae870a6d579eda51a31b184655 1301 - " ~s:"9e818868e06787fb9519b50546ee21d0546e16bb1b5920311ba44769dc69c7a6 1302 - 1303 - " ; case ~msg:"4b1f9335fdfe88c0866bb648c05857b79c2fda92a987b359282bbf0822db747a3940fee05aeb3cc081231e29b9d460ef30a55f0f88702a4ecdcb842beeb36a976136c9241f2eb5c2d93fe38a1580cd58fb93ed137a7d05ea22d5e87345633a0e393feea616eaf83684c3baca4fc5bf80a87dbec3a9787daccec479661af0b968 1304 - " ~x:"afa080287898b0787f5d06d5826cc285ae5bee41768098750419a5c8863ae729 1305 - " ~y:"57767c348ab0c61eab4f2e0894bb6223645a331c5be2490d764839fa4dac814e05e70925d720d0e0ab5faa3db6dc58ba573b4e0b7bc13e4c044b96259385fcd1eade0d7c5174498c70ba8fb8661ed524fa8171570fd52faac9915d947b51f6cf5b74e3edfa064a5161c7623ec6e80d29960b573fb98de9e710c56ee45aabc4022357f6c3712962ad19e43a4148957cc6b9c8f691877a59f43162d8f98f2472699ea510109305f8f98aa3f3f31e4302eb05e5f1a462d0f3bfdcd0c84e76bfdd14b7c90b982b8c0ec7c78cf3e6c216ed1d20b52a132f53c9747c7fbe39092d5ccfcc01a119c92faa3f13d4643e5db22ca1681d6536bc7b704bb09bf6c621c2ff06 1306 - " ~k:"d23656910f6e8ea72cdb979cfd8c8f6676c47c6161c3aa14f2338392891d1afe 1307 - " ~r:"7ac95d3e0936cde441e4a290711cc044e6e98e8a8de68298bf7fb90eef589eb2 1308 - " ~s:"140e9de37ec5aeb3fb795b016f51ea3e92d6f198c5a0e5a5d236671c91042c94 1309 - 1310 - " ; case ~msg:"3b87109bf21571fcfae92b859649bf37dd23d59f76d50cf26f4b2ebf7c5f4ae0b377bf3bf2c7e015a74efc808433047a71bf1ed4ba9025f4561dcb94bef2c2a2c94b3f55ed611c432f98a683abadc2c31d002eaca9b070f2b21319d072df75c62385d7d02897a00f863c2882b2897a331332bb9568b2fdfaccf50b3de4b42e8a 1311 - " ~x:"668606f4a82b50876abd7f3dc0ed580a10344c1dd092c5bc1b26c427028cc5f3 1312 - " ~y:"7c16a9644c18257911b826da10b5b10115ff77675bdc3c9f77097162fc059e86b04c1faeed3c66306c7e5fe2d5c63e8fa5fa2b82565ac6065445de5819a2e4a56925bdcce138654dfb490ac624a38ad65849be4ba74d14c829ef102248a18193933335eaf0c73b7bfe77d669f857ef3addb1f4ca424dbfdedb9e2de1fc0cc2d9777ee834a0ac7d0cac1b2a613890071490efe5cb2097ac830fbc27881f9fa51d3b0247c5e1b7f6be13c30dd31c2c59b7683ce60a0ebd6663de97870af2dd17d91431323a4686bf32e1e39732dae1300c57bd600be790593b2efa045bbfca956768157b4724ca0a1472fe6c8dcd82a38024766341d1f548ad8f36dc676676fbe3 1313 - " ~k:"a3d781e5385d66989b38034171da11594b20f15733fd4701a63cf24bb58ec341 1314 - " ~r:"1e219eefd616caac549a859d45186b5c528627573958fe55cf57fbbd1661f7b8 1315 - " ~s:"b09545843dc0f6299b48f14311503605502868859e8c43867f80df3c2391c762 1316 - 1317 - " ; case ~msg:"042365b1256931a111facc6c40f618c428801b03e4f222a1e1b7763c3b02a6214e4c517beb587a4ea69fdbd4ea2d5d5f45afded96ddac87dc89955613aeff7644fc6a58bb859a85221318fbc5e175c6985b19a1d16ab6ad3ca8fa1903acca42bc6d9efbe88fd6f2a8650425be97bab9cb670b2e39f36d526278e0bcfcbffc3c6 1318 - " ~x:"1c08570d1e1ac0857f649e4ba20de0e9aca97374acba6bae350104f1fce20be0 1319 - " ~y:"815411ac6aa1b495c4bac802806a1a3592924fd9c0a3cca41e076db293d815c2f2b0a53e97cf657c8951b856cca1166ad433be5829b0b636ca9de49111ce5ceccededf36d795edefefee1d553250fbcd5bd05b4d99de55f147773ab3a0f754d090ca7b6ff75c160eefd1709a5df3cd8a0cae3e341f2275faaee3e3e31737e7e9c7e74845651f4f839c9d08da6bfd00f2c2b9c6ed9acb78d11175fa6ded7ab95dbb2bfef18feb149bc94f6de05a205221ba0406c96f63972aefec1beef030137011e6796af2e4ebaa100150d58caf408217acb1183a1a46e06368cff6fd744da7019e7ca109acf1244a763cc2b2186f49272ba3ae0425f2ebcd30e77e9f7c957a 1320 - " ~k:"0bc8f6e0b01bcb55a4d134c967f3a9411737103d400a33a968f9036292d6e3bd 1321 - " ~r:"e7145c70e0038ae7e7d901b48828b0b8bc960cc4fa29a52e11ffc9ab08eee726 1322 - " ~s:"b9c54ef6cb3e1b0498952299d1465ed2c5d4e670cdfd2506462466c3b0fcc538 1323 - 1324 - " ; case ~msg:"98ffb2899f17c80a83e82ca6265e6f361733a6bbc63cdf8880dc756bc768b35b90db7390cfff745ec1b56f1655d8d9a29a6e8a63be0b1b2f9aa7436209a1fa061a7aec28622c472b3d0285a701655a496546e891a8ab29d9f40d2e748d0aa2babc06cfca641b300b7a219caa9e5bae3bf689f60567f922e7796fe47bb72ffb64 1325 - " ~x:"79885ff112bdb326577abf52db67784768742b36e575f06b8d1e4f0d2d49a3a3 1326 - " ~y:"14111dca30c0138761fd2f55972b9846041e5ca8b9bc6b2dc820f2a2f5100abaab337c7e0d1bc59de5ae586bbdcf4d4b14aa23be40095293123badbb11919b78cd6412548d9f9d15f614b6928713344148fd7d30985fd2c509b44d396c5672a082de4183fee03e45a90eef6a08b0d9d47132c82a2ccfef05e2ad0f340dcc06d9e2e979ecc43844c6054e4fa5fb8a73a1e3873f2145b0fd40f3ec7946f1f43de8b8057c1be5bf04630a12453d623c9b8d9f0e30c88c30434215d48f77348e6b047f16934ea09743dd3b009cebc49dbc3a3d3567c3321555ec96b2160caf7870970ac3cd8294477a0643ad52c23d9d987dbfff64aed1a883c30a49f14ff0620095 1327 - " ~k:"13ab2945ab2a40067a93ed8c1a4b305182cb070022b79a56740238e55b07e8a2 1328 - " ~r:"4551b096446db6761b708f35209edb91cc51ee4ef96a7495407ab4167a05c791 1329 - " ~s:"cfe4c58bdbf61caf09a42adb1aa5d98b4c459c0112c57823bc15b5b990d92ff1 1330 - 1331 - " ; case ~msg:"5898cc0b422bb89f066dabbd30f59e9a35a392bdd7ad315ec8ad32b8f0f3d02864e70ea36e9076c395f0ba9de1ab6080df3cf4a1470e2b9990b8e7614bb8312b075c0b2a132d7e47ded9e4c0a1368455b9d1a67bc44af2f37428f48f7e089ab41d046378b6d48d9cb135eee4574072abea93bda7eb4f15a206cdaf3bbbebd318 1332 - " ~x:"416634f9b7722188c2a5266cfd9baf1bdd508c0c068010fb228c099fca7cec11 1333 - " ~y:"766d7e4f8bc3254d92cf6a64abd504d01cdcf6c239178b0aeb3f69c9bf202bff7566eca09f29cf5d6fa4736d57c08205500d648336409df06e7f2cf99178b20a7ec2b5124bcffc61adb66f6fafc51e32521dea2124e5781c383b116d06a6a6e89dec46b5e4ad69f5a1e8dd7ac5e160da336c11860b601e7e6d58895e6797db5aa92deb7b942f2edf58d43d3dac9209557a6aa07b228e73a80ff0e92e4ec4603d362e1cca7e928d9459c21405aa0f6548732c0fc501ce50f0896f0763f633c8c1a8531321e1a0f47134a0d2d8676f45f13ea576e64c7870028033a4261bdfcec948ebb1aa25b02134d0259d73024a01da0cad1ce67571e36963dc130496160ebf 1334 - " ~k:"b057bf5a5ae4204f941ff5a01560cbc29033dc6a2e06ad168403cbc6512646df 1335 - " ~r:"a237d2c3d23706caf004a2e94de29f04c748936b62ab5431fe73c72485814265 1336 - " ~s:"b48b9ef9cbd8bdf799b70605f00550b81b309c157332153be9707a399fbdd67f 1337 - 1338 - " ; case ~msg:"0418e01236caed0f80241ce8c6307d026f5e25f4a922bbdb4aafb8d9db95a18175f9dcea9acb4d376f36ff7b7cb598e073de95ad2012eb9d11e15cb3941c6dd0dd69422e78512ebffb19cc8a403a9a7d1f1720ab0f2d25627580366093e21ac1537f93de90a94508f1d7a7a1db5a7b13c9fd00b82be044c3a35ec0451c309b82 1339 - " ~x:"6ad92911dd4fce033d7a50875e4660be08c44957b874339c2a70d915cc03e27f 1340 - " ~y:"4cf4cee4d5abc2c92db522928b6d7e436ea00884009497ed588e93281cf05b3747ca0048b917708279cd0277ce8560c22775d2aa0e7eed1bba77be45417fa7afd776b8e560679c493a520a0e626acdc83df021351669bdf9da19b12bef2926b525fa4c8e3d1f2083ea6bbb489880f594e67934d1f35581ad18e0db462a1ac944066c65dd743f35741c6cf588918d8336702329c62113e9486bfa49ca5425914526a965e3c1975824f4b39fa5fef89cf6f9ea512f7ffc9138e72dbd0f71b01a70975312eacab11118471115ee3fc810522936c9df35977509b196d867fa11f607b7ef9ab78cb748213a6763439ce5e7641b05359670612203a47d4de9c5388405 1341 - " ~k:"5aed2d19239189cd0bc8cfa3c329748c0555d8eafd5e80ff931966680e3ea454 1342 - " ~r:"83ee960e6f9026fe2454d859462ac334a13896e75179858ef40e2e9a065c536a 1343 - " ~s:"7ce8699c6ccb184d4240b8709da11451328cf1a7e0cafe6e1c8ab53d7de67d9e 1344 - 1345 - " ; case ~msg:"92c949fe2342f91a387b67c1b12b1d04d0721203caed593c9c464e5fda09fdcc91d3321d2985eec08ab2026d1ec3fcfa838cb6af45290c08dc30b9c14c4445d783b6f48409a00490f4e308dbc87fd1b2f878385212e1f4c3e1cf81c56d71e73fd7a095b56b4abec15c57107420fbdfa44477078ccf4519f9f6044f0744052035 1346 - " ~x:"b0d23aab4d95446f8c6c5d496d477dd9486f50b2827f7cd19728bc96f82840c7 1347 - " ~y:"256d231ac2bae650d25999b2706d4cb63a89b1468e0df36d677535fa7a0ea890590d3290d4b50bdb399f33dc415e4469c97c6c0cee8205eec962d7153c4c85ab88f7cf80979d4a1ffd8c74e681c1d28da07732116c3210ee4b693309333686246d667074c7172035fd6091b2840b113970b45983d474f54b95d26394b7a43e81b449a2ee9423aa1c27f4592b516c12d5433e2ba724f5463b4169a2b0940e1bccd60ccab9b5a38248acb60582ab8bbc01c5e75f9ef7474273fb51aa6316e649f4f22452dc70bfd4c3da072c03ea82ee009d4272a84961c98e517ab947741d812116011dec0373ca8fbac5576c2069b067f8b005d60a36eca44f56019a64835d76 1348 - " ~k:"17a199bd383a84e22029fb90d5abc9a8a7ccd3f0a33720ca80e3161971793526 1349 - " ~r:"84cace71a80ed47494570fc84839f2e350191b74f0eefff2d7ab2c689db77bae 1350 - " ~s:"9cac33594e1934b68f62aca05ca040f3c82110c10b7379878b7894b0919a0f2f 1351 - 1352 - " ; case ~msg:"df6a4eb7cad4ff9bdd8356d3568fcf0285c1a4e3c3109faa091b58a9bd907c629d54aa7a23a74870545a0942a2d23914f2f167d96573f06f35ea05ef704cac8014dd21b961d3dacf7b930bbd7e35550f721094c86333e03ed4dab7bc1b6416add9578d279edaee37504fd25ec0c5e8a37ac9ec19bfb1e3778ed6d9c6b6e35ec7 1353 - " ~x:"679ef48b643be394677d17e837a0be6d4d8027a900b686aed7c4b12634fea76a 1354 - " ~y:"2f4b0c01e4b15eb5ee7afa9824093330738be2f3f06c42b2b7c6968fa54b987c184e7fa89eff16da02b93ff61b9ce48eebe7eab0f7e203ad11c71e7b297d23f2d5a5998272c30c2e1724b5e963bfd6f83239f874d88ea089435b896dd2109b6a14b2d848f9ed7e92143c0649f97f4f2eb05b8c5a07e99e497dbc752d443eba93d7f3dcdc3240a2714ea0e3e7627f216e4701148dd21192f274f1ed5df05c60b1576d3a0b7f69a776b5010404acd5afafd3d70f57763f2b778d0c361e5f7f0bbe17aafaa5cd393329171d06ec032039a9ffb37c3ab8cd858ea788a7b9f501996baf959ca85c7dafe0cd3e30957640eff105894c43f866bcc422698d128dca0887 1355 - " ~k:"3cf9da6f182bade870946d3ed3b078208ea8153c45515d64f589bca72b703ebf 1356 - " ~r:"1dd2daeaf3e89fd644c6cc942311ea5056413d8a24087787675ceffd3d6c15e4 1357 - " ~s:"3e12781396558560455c4e70f610522ab2b10fc25343296818ef7ffb0378fa47 1358 - 1359 - " ; case ~msg:"4f16681eaa5d97673a7cca02ee8a7374b75411e0b5704a947f04d1a5b14be0b506f31c2fa329e3ca516fa4f1626a9b5e080bda7f353f850365eac7c3d2596f502a5d70b1542276c12d4ea4a22b5325b9eb3e942e556769b796c4f524595f1cc6ce17f99f9dbf51331453228ead327b614f4438d35d61428429f78c8c9377aaaa 1360 - " ~x:"e0e576432913bc75a2e0de3b33bf3094148298612a9dc56fedd47aa569af8ac8 1361 - " ~y:"2e33604ed9e6c0f1ba403a8c3c3fe8e8f488591813aa3d2fcccdf88fe808f70adf173f0f143abdaad43b80769e30ffc5749e8ad35999953deff4f61f4ca07313609e23acae7b35f77934fdbbe1c380b2727b1c3899250af5b4399b658b7908676d64d11763785373b2169836611d72a957319936c84efd72b72f92bdd2dbe0000d8841ab6d8d0d666e79361abb23b6007348dbbe7a94936dc6b026f3b7100081f547b994e0e0778cb761ebd43a29d8764c7f962a747ecc92e4a2a628f52d8abf43f6e3278a0d32ea67c2d79d04c83387ddc709365c0a0bacc83d75c946e283e0739233581441aeddb0d7d76503d621405d27ef66fa8b5379d178617d4bb5ad59 1362 - " ~k:"53cb2d046b391193efb14a4dfafa296c2ec92293c7b3c7d19a20e68c4a1141d9 1363 - " ~r:"e2ff3fc441db4540194a7f5da1ead849c2c3c48dccf8b2c1b3b359a7b16e16ab 1364 - " ~s:"52fbdcd5c62a999aab46147fef9e18cbfc7daf680a7ddb892edfa44d285e2158 1365 - 1366 - " ; case ~msg:"09e48a36523b5289ec41859faa141e2a29b3e88ab2d6351e20de001e6424b85337675f0ce26be224fa4f8df0ef9710ea285635b27b297d688e338b5461820b57be4bee21645b04957ca2f6cd7af9a6a52b3c97c5b9db1c2f7ea817cd6d3c8522d4e6a9de869aef26ec0dbdd269c79b38806927bd3a5100735e6f9f655ca94dae 1367 - " ~x:"7891b05e24823f283126d7d175a4e8c8124b3776f4f296d0ffc4b5e21bb64d70 1368 - " ~y:"7e38cb668d647ee15f71ac5d2b55c11fd4731e1a6c031dd7594d614f2f1ed25623fffdc5956f5256e635c914205a2937a6074cfe1f3e443bbeb323a23b0f0fbccf8c1770ad18ba97d0acbea1e846e12cf12c370625b1555d710905eee943539f2241b8fb490c9d6b44f36139226b4c1f00e95ffe595014f61bf579836a14212c07231a5e9e87de4a9aaf0f46f34c9229f2eabb71d40de26a1cbe10db0645cec37d48575a1154bb5acc947becb2a74b07e2a0e45b903be37502f91b07fb4ecd7f21fb130c6d639ef0fd8444fa12de859abe95548801f6a3c40e7a65fd1518221a274d7b65ed4175f66c04d919c86d2ae8c374b14709e9c8a39e1d0c4e9935540b 1369 - " ~k:"dc24b379ee2d26d5db792839795ad0d4b9622c0e3fd518df541a5f6e9cefba0f 1370 - " ~r:"e550dc65af275e47be480fd647366e2b055c79ea33ded4f5a9557121e082af26 1371 - " ~s:"e26b1a5f27cc6c87863e31ef7f1e61bea476fc5d7c25fdf22fe740f23aa9a752 1372 - 1373 - " ; case ~msg:"8837bbceef577511f2d0c08f790d5d2e8562d93df3d82dd4c2827cd9a9115308114a18c452db2785561081eb523685ae2b3c8b090e0d44dd40d2fc0cdfc88d6f9063a7707df609edf0a8c55034815ea9f1d8b0bcbc92fba513ba81ee646bf98ad4eb22be26a4582b1be2899c91eebcbc9fba5825e021e99be0c9d28642d13fa4 1374 - " ~x:"116d1836a131310644aaaee6ac39b3643cd50026a6b486167cb4daac242a4e7a 1375 - " ~y:"77d7a40a7bab3f5778f85d4fc48b3e28ce28b2df9eb87cc9cf394ef28e8064f39a9690103980a66da219cb5022c101f22011a8157a7568c5ff2e978ba2201367d17c22a867865d00c2a437385627bd088bfcf7219251bf6ae158269f4ef35da7095a53c24f37d61bcfb7c043feb6e93832343f9e90ee7104c80486ecd087be1b67f18cdaaa375e039cb7ad603cb0cd855623e9fb48e4eede14ea3c76a0364aac006650d3b5cd9b474b56f8584be58a721bf34dd0808d334cd8632e808536791fcbea961f7163dad28353c115eb3e856737dbbee03436721637a47754a8a1fe0fedf547b358a73d05b769a95bde3440007c0773a3c7c8dc9714e11c3a10ee01d7 1376 - " ~k:"4a6febb624c8ebd411cfb30c6db055dec3d0d17456dc0c54bd1b43531d4f2649 1377 - " ~r:"7b6b3eaef6cd5fe6daede86d63943478c771582483be0b926ee3022d22ef912e 1378 - " ~s:"39d928b59a690450d13359a29efe20cb98bfd3fc9726f80e5148f059663ffd08" ] 1379 - 1858 + [ 1859 + case 1860 + ~msg: 1861 + "4e3a28bcf90d1d2e75f075d9fbe55b36c5529b17bc3a9ccaba6935c9e20548255b3dfae0f91db030c12f2c344b3a29c4151c5b209f5e319fdf1c23b190f64f1fe5b330cb7c8fa952f9d90f13aff1cb11d63181da9efc6f7e15bfed4862d1a62c7dcf3ba8bf1ff304b102b1ec3f1497dddf09712cf323f5610a9d10c3d9132659\n" 1862 + ~x:"446969025446247f84fdea74d02d7dd13672b2deb7c085be11111441955a377b\n" 1863 + ~y: 1864 + "5a55dceddd1134ee5f11ed85deb4d634a3643f5f36dc3a70689256469a0b651ad22880f14ab85719434f9c0e407e60ea420e2a0cd29422c4899c416359dbb1e592456f2b3cce233259c117542fd05f31ea25b015d9121c890b90e0bad033be1368d229985aac7226d1c8c2eab325ef3b2cd59d3b9f7de7dbc94af1a9339eb430ca36c26c46ecfa6c5481711496f624e188ad7540ef5df26f8efacb820bd17a1f618acb50c9bc197d4cb7ccac45d824a3bf795c234b556b06aeb929173453252084003f69fe98045fe74002ba658f93475622f76791d9b2623d1b5fff2cc16844746efd2d30a6a8134bfc4c8cc80a46107901fb973c28fc553130f3286c1489da\n" 1865 + ~k:"117a529e3fdfc79843a5a4c07539036b865214e014b4928c2a31f47bf62a4fdb\n" 1866 + ~r:"633055e055f237c38999d81c397848c38cce80a55b649d9e7905c298e2a51447\n" 1867 + ~s:"2bbf68317660ec1e4b154915027b0bc00ee19cfc0bf75d01930504f2ce10a8b0\n\n"; 1868 + case 1869 + ~msg: 1870 + "a733b3f588d5ac9b9d4fe2f804df8c256403a9f8eef6f191fc48e1267fb5b4d546ba11e77b667844e489bf0d5f72990aeb061d01ccd7949a23def74a803b7d92d51abfadeb4885ffd8ffd58ab87548a15c087a39b8993b2fa64c9d31a594eeb7512da16955834336a234435c5a9d0dd9b15a94e116154dea63fdc8dd7a512181\n" 1871 + ~x:"853f75ac81b3a842c999448562c584d1cd0277896ec2f93c05c337eed414367a\n" 1872 + ~y: 1873 + "356ed47537fbf02cb30a8cee0537f300dff1d0c467399ce70b87a8758d5ec9dd256246fccaeb9dfe109f2a984f2ddaa87aad54ce0d31f907e504521baf4207d7073b0a4a9fc67d8ddda99f87aed6e0367cec27f9c608af743bf1ee6e11d55a182d43b024ace534029b866f6422828bb81a39aae9601ee81c7f81dd358e69f4e2edfa4654d8a65bc64311dc86aac4abc1fc7a3f65159661a0d8e288eb8d665cb0adf5ac3d6ba8e9453facf7542393ae24fd50451d3828086558f7ec528e284935a53f67a1aa8e25d8ad5c4ad55d83aef883a4d9eeb6297e6a53f65049ba9e2c6b7953a760bc1dc46f78ceaaa2c02f5375dd82e708744aa40b15799eb81d7e5b1a\n" 1874 + ~k:"d41b335753e1ff3f828f57b797ff5b2db5cd79f6a1abeaa137a2a830e24ed4b5\n" 1875 + ~r:"bcd490568c0a89ba311bef88ea4f4b03d273e793722722327095a378dd6f3522\n" 1876 + ~s:"74498fc43091fcdd2d1ef0775f8286945a01cd72b805256b0451f9cbd943cf82\n\n"; 1877 + case 1878 + ~msg: 1879 + "ac30fb155104954b9d7139de9346d54ca05178954053fd361c9719cea530d2d2e1737fc46b0ee27357cecbd47e0fd47ada0d5236a9d77dd61a1b0db52e628b14588fdba8774882866b04b49cf5205db49445a8a202a5fc3fcc36efe0bd0c1e51eb08616c4a7afe120077ea08caf167e90446862298011ad9a1f11cefb5f74335\n" 1880 + ~x:"d692d2c653bfcab2e7492ec56e512724c912227d793a59882800d37ad260bfd9\n" 1881 + ~y: 1882 + "84741bef3d9f9dab0e3fae7839d39c1a1966ab82798d71aa46b7def465e39ea5e7adaeed2dfc92c9bea72d65268b8df955f9b7e7b6923d2bf00e7e43f83a0e54ca944275dc39c0fb0c8a00ccd0b29b790d9d8f3496054390410b4ae5c6eaf2e21bdb52421179970fa13e0948280a06a576cdffae6fdb239ebd486bf4699270e2bc0879be25a6a0c2f7280ea33eeb32c5d2ea6093381fc4c83c8f9a591b0b0e72fcc149c685b01381a74af4ccb902c0050e05baf732bacd1606533e2acc6308c777201eecdcdcbe935149c4e572a15a205d2b80e75ef2473160f85e642d28370c0f19464125c687c969665b13b095aa87ba476802d72c354ebcbcd89f28ef001c\n" 1883 + ~k:"39335e9193222c7ae3caf8e5ad77b751e9847c37b9016d355ac7520407c91e87\n" 1884 + ~r:"28c6bfcadb5f52324e39903bf7a04faefb89383f473daa432cab9178f2470d3c\n" 1885 + ~s:"4e88f65ff776940bafbbfb35643bcdaeb43b25b45de2de3c011ff1449c8b8b32\n\n"; 1886 + case 1887 + ~msg: 1888 + "2225031fd26a6bb4fd9990347bc2c8ea4ba45bd75df68476f983dffb5531899f1317d95f7cbb493de45cd2f11904cd5c5d5a748b4aa127ca730f89a928ddcd250a6551c2f7cce109e64d3ab74afb2d4f4f7e3494eb7d557060a1f29ecb5b75f64848370902bd6ae2fbf6802b2f9c37f34836ad71dd2e2abf6a0a47df4fd5573d\n" 1889 + ~x:"87bd74c5d70a292914d96b47dc5e9e97a6799c3b788014e7f106ce7ce7e17a95\n" 1890 + ~y: 1891 + "04964c093fdb852c97b165e179f7ef3b39350c2588e60a0177bc2e890ab08ffd73d8a5a6692cfebd0c912de2d50bf02139bf017ec715c2dd7be1aad9d0b96c47d6465d4eb0ea0247ff655959d94a3409e9f9262d877075f6f0c7783a8df3cc115c5287c69bdbf0ffe0ed3719e418ff99b5dcd5f0cfc1065e404a216e095086a6e2197a69c47774377203d99a234e7be61cc4a95a809f9b9dd0a550b712bce5d1cfdafda232d7c831ec52884701155a3df2b086be870af8e875557518b035c84957c1742b8c02b0d46b64a773012809bfa4c5407c3fbfed3b960816604cf42b2defb4feeabc172afbfcbc82836b44b927e0cd4ca63a1daeb3eeb30d1de608127b\n" 1892 + ~k:"64f504110193cc4a3f400b6fcfd71d64a1e166c048829d23206da12a7dc1423a\n" 1893 + ~r:"5568d810ba664a08b301266d08c69eacccec5aae870a6d579eda51a31b184655\n" 1894 + ~s:"9e818868e06787fb9519b50546ee21d0546e16bb1b5920311ba44769dc69c7a6\n\n"; 1895 + case 1896 + ~msg: 1897 + "4b1f9335fdfe88c0866bb648c05857b79c2fda92a987b359282bbf0822db747a3940fee05aeb3cc081231e29b9d460ef30a55f0f88702a4ecdcb842beeb36a976136c9241f2eb5c2d93fe38a1580cd58fb93ed137a7d05ea22d5e87345633a0e393feea616eaf83684c3baca4fc5bf80a87dbec3a9787daccec479661af0b968\n" 1898 + ~x:"afa080287898b0787f5d06d5826cc285ae5bee41768098750419a5c8863ae729\n" 1899 + ~y: 1900 + "57767c348ab0c61eab4f2e0894bb6223645a331c5be2490d764839fa4dac814e05e70925d720d0e0ab5faa3db6dc58ba573b4e0b7bc13e4c044b96259385fcd1eade0d7c5174498c70ba8fb8661ed524fa8171570fd52faac9915d947b51f6cf5b74e3edfa064a5161c7623ec6e80d29960b573fb98de9e710c56ee45aabc4022357f6c3712962ad19e43a4148957cc6b9c8f691877a59f43162d8f98f2472699ea510109305f8f98aa3f3f31e4302eb05e5f1a462d0f3bfdcd0c84e76bfdd14b7c90b982b8c0ec7c78cf3e6c216ed1d20b52a132f53c9747c7fbe39092d5ccfcc01a119c92faa3f13d4643e5db22ca1681d6536bc7b704bb09bf6c621c2ff06\n" 1901 + ~k:"d23656910f6e8ea72cdb979cfd8c8f6676c47c6161c3aa14f2338392891d1afe\n" 1902 + ~r:"7ac95d3e0936cde441e4a290711cc044e6e98e8a8de68298bf7fb90eef589eb2\n" 1903 + ~s:"140e9de37ec5aeb3fb795b016f51ea3e92d6f198c5a0e5a5d236671c91042c94\n\n"; 1904 + case 1905 + ~msg: 1906 + "3b87109bf21571fcfae92b859649bf37dd23d59f76d50cf26f4b2ebf7c5f4ae0b377bf3bf2c7e015a74efc808433047a71bf1ed4ba9025f4561dcb94bef2c2a2c94b3f55ed611c432f98a683abadc2c31d002eaca9b070f2b21319d072df75c62385d7d02897a00f863c2882b2897a331332bb9568b2fdfaccf50b3de4b42e8a\n" 1907 + ~x:"668606f4a82b50876abd7f3dc0ed580a10344c1dd092c5bc1b26c427028cc5f3\n" 1908 + ~y: 1909 + "7c16a9644c18257911b826da10b5b10115ff77675bdc3c9f77097162fc059e86b04c1faeed3c66306c7e5fe2d5c63e8fa5fa2b82565ac6065445de5819a2e4a56925bdcce138654dfb490ac624a38ad65849be4ba74d14c829ef102248a18193933335eaf0c73b7bfe77d669f857ef3addb1f4ca424dbfdedb9e2de1fc0cc2d9777ee834a0ac7d0cac1b2a613890071490efe5cb2097ac830fbc27881f9fa51d3b0247c5e1b7f6be13c30dd31c2c59b7683ce60a0ebd6663de97870af2dd17d91431323a4686bf32e1e39732dae1300c57bd600be790593b2efa045bbfca956768157b4724ca0a1472fe6c8dcd82a38024766341d1f548ad8f36dc676676fbe3\n" 1910 + ~k:"a3d781e5385d66989b38034171da11594b20f15733fd4701a63cf24bb58ec341\n" 1911 + ~r:"1e219eefd616caac549a859d45186b5c528627573958fe55cf57fbbd1661f7b8\n" 1912 + ~s:"b09545843dc0f6299b48f14311503605502868859e8c43867f80df3c2391c762\n\n"; 1913 + case 1914 + ~msg: 1915 + "042365b1256931a111facc6c40f618c428801b03e4f222a1e1b7763c3b02a6214e4c517beb587a4ea69fdbd4ea2d5d5f45afded96ddac87dc89955613aeff7644fc6a58bb859a85221318fbc5e175c6985b19a1d16ab6ad3ca8fa1903acca42bc6d9efbe88fd6f2a8650425be97bab9cb670b2e39f36d526278e0bcfcbffc3c6\n" 1916 + ~x:"1c08570d1e1ac0857f649e4ba20de0e9aca97374acba6bae350104f1fce20be0\n" 1917 + ~y: 1918 + "815411ac6aa1b495c4bac802806a1a3592924fd9c0a3cca41e076db293d815c2f2b0a53e97cf657c8951b856cca1166ad433be5829b0b636ca9de49111ce5ceccededf36d795edefefee1d553250fbcd5bd05b4d99de55f147773ab3a0f754d090ca7b6ff75c160eefd1709a5df3cd8a0cae3e341f2275faaee3e3e31737e7e9c7e74845651f4f839c9d08da6bfd00f2c2b9c6ed9acb78d11175fa6ded7ab95dbb2bfef18feb149bc94f6de05a205221ba0406c96f63972aefec1beef030137011e6796af2e4ebaa100150d58caf408217acb1183a1a46e06368cff6fd744da7019e7ca109acf1244a763cc2b2186f49272ba3ae0425f2ebcd30e77e9f7c957a\n" 1919 + ~k:"0bc8f6e0b01bcb55a4d134c967f3a9411737103d400a33a968f9036292d6e3bd\n" 1920 + ~r:"e7145c70e0038ae7e7d901b48828b0b8bc960cc4fa29a52e11ffc9ab08eee726\n" 1921 + ~s:"b9c54ef6cb3e1b0498952299d1465ed2c5d4e670cdfd2506462466c3b0fcc538\n\n"; 1922 + case 1923 + ~msg: 1924 + "98ffb2899f17c80a83e82ca6265e6f361733a6bbc63cdf8880dc756bc768b35b90db7390cfff745ec1b56f1655d8d9a29a6e8a63be0b1b2f9aa7436209a1fa061a7aec28622c472b3d0285a701655a496546e891a8ab29d9f40d2e748d0aa2babc06cfca641b300b7a219caa9e5bae3bf689f60567f922e7796fe47bb72ffb64\n" 1925 + ~x:"79885ff112bdb326577abf52db67784768742b36e575f06b8d1e4f0d2d49a3a3\n" 1926 + ~y: 1927 + "14111dca30c0138761fd2f55972b9846041e5ca8b9bc6b2dc820f2a2f5100abaab337c7e0d1bc59de5ae586bbdcf4d4b14aa23be40095293123badbb11919b78cd6412548d9f9d15f614b6928713344148fd7d30985fd2c509b44d396c5672a082de4183fee03e45a90eef6a08b0d9d47132c82a2ccfef05e2ad0f340dcc06d9e2e979ecc43844c6054e4fa5fb8a73a1e3873f2145b0fd40f3ec7946f1f43de8b8057c1be5bf04630a12453d623c9b8d9f0e30c88c30434215d48f77348e6b047f16934ea09743dd3b009cebc49dbc3a3d3567c3321555ec96b2160caf7870970ac3cd8294477a0643ad52c23d9d987dbfff64aed1a883c30a49f14ff0620095\n" 1928 + ~k:"13ab2945ab2a40067a93ed8c1a4b305182cb070022b79a56740238e55b07e8a2\n" 1929 + ~r:"4551b096446db6761b708f35209edb91cc51ee4ef96a7495407ab4167a05c791\n" 1930 + ~s:"cfe4c58bdbf61caf09a42adb1aa5d98b4c459c0112c57823bc15b5b990d92ff1\n\n"; 1931 + case 1932 + ~msg: 1933 + "5898cc0b422bb89f066dabbd30f59e9a35a392bdd7ad315ec8ad32b8f0f3d02864e70ea36e9076c395f0ba9de1ab6080df3cf4a1470e2b9990b8e7614bb8312b075c0b2a132d7e47ded9e4c0a1368455b9d1a67bc44af2f37428f48f7e089ab41d046378b6d48d9cb135eee4574072abea93bda7eb4f15a206cdaf3bbbebd318\n" 1934 + ~x:"416634f9b7722188c2a5266cfd9baf1bdd508c0c068010fb228c099fca7cec11\n" 1935 + ~y: 1936 + "766d7e4f8bc3254d92cf6a64abd504d01cdcf6c239178b0aeb3f69c9bf202bff7566eca09f29cf5d6fa4736d57c08205500d648336409df06e7f2cf99178b20a7ec2b5124bcffc61adb66f6fafc51e32521dea2124e5781c383b116d06a6a6e89dec46b5e4ad69f5a1e8dd7ac5e160da336c11860b601e7e6d58895e6797db5aa92deb7b942f2edf58d43d3dac9209557a6aa07b228e73a80ff0e92e4ec4603d362e1cca7e928d9459c21405aa0f6548732c0fc501ce50f0896f0763f633c8c1a8531321e1a0f47134a0d2d8676f45f13ea576e64c7870028033a4261bdfcec948ebb1aa25b02134d0259d73024a01da0cad1ce67571e36963dc130496160ebf\n" 1937 + ~k:"b057bf5a5ae4204f941ff5a01560cbc29033dc6a2e06ad168403cbc6512646df\n" 1938 + ~r:"a237d2c3d23706caf004a2e94de29f04c748936b62ab5431fe73c72485814265\n" 1939 + ~s:"b48b9ef9cbd8bdf799b70605f00550b81b309c157332153be9707a399fbdd67f\n\n"; 1940 + case 1941 + ~msg: 1942 + "0418e01236caed0f80241ce8c6307d026f5e25f4a922bbdb4aafb8d9db95a18175f9dcea9acb4d376f36ff7b7cb598e073de95ad2012eb9d11e15cb3941c6dd0dd69422e78512ebffb19cc8a403a9a7d1f1720ab0f2d25627580366093e21ac1537f93de90a94508f1d7a7a1db5a7b13c9fd00b82be044c3a35ec0451c309b82\n" 1943 + ~x:"6ad92911dd4fce033d7a50875e4660be08c44957b874339c2a70d915cc03e27f\n" 1944 + ~y: 1945 + "4cf4cee4d5abc2c92db522928b6d7e436ea00884009497ed588e93281cf05b3747ca0048b917708279cd0277ce8560c22775d2aa0e7eed1bba77be45417fa7afd776b8e560679c493a520a0e626acdc83df021351669bdf9da19b12bef2926b525fa4c8e3d1f2083ea6bbb489880f594e67934d1f35581ad18e0db462a1ac944066c65dd743f35741c6cf588918d8336702329c62113e9486bfa49ca5425914526a965e3c1975824f4b39fa5fef89cf6f9ea512f7ffc9138e72dbd0f71b01a70975312eacab11118471115ee3fc810522936c9df35977509b196d867fa11f607b7ef9ab78cb748213a6763439ce5e7641b05359670612203a47d4de9c5388405\n" 1946 + ~k:"5aed2d19239189cd0bc8cfa3c329748c0555d8eafd5e80ff931966680e3ea454\n" 1947 + ~r:"83ee960e6f9026fe2454d859462ac334a13896e75179858ef40e2e9a065c536a\n" 1948 + ~s:"7ce8699c6ccb184d4240b8709da11451328cf1a7e0cafe6e1c8ab53d7de67d9e\n\n"; 1949 + case 1950 + ~msg: 1951 + "92c949fe2342f91a387b67c1b12b1d04d0721203caed593c9c464e5fda09fdcc91d3321d2985eec08ab2026d1ec3fcfa838cb6af45290c08dc30b9c14c4445d783b6f48409a00490f4e308dbc87fd1b2f878385212e1f4c3e1cf81c56d71e73fd7a095b56b4abec15c57107420fbdfa44477078ccf4519f9f6044f0744052035\n" 1952 + ~x:"b0d23aab4d95446f8c6c5d496d477dd9486f50b2827f7cd19728bc96f82840c7\n" 1953 + ~y: 1954 + "256d231ac2bae650d25999b2706d4cb63a89b1468e0df36d677535fa7a0ea890590d3290d4b50bdb399f33dc415e4469c97c6c0cee8205eec962d7153c4c85ab88f7cf80979d4a1ffd8c74e681c1d28da07732116c3210ee4b693309333686246d667074c7172035fd6091b2840b113970b45983d474f54b95d26394b7a43e81b449a2ee9423aa1c27f4592b516c12d5433e2ba724f5463b4169a2b0940e1bccd60ccab9b5a38248acb60582ab8bbc01c5e75f9ef7474273fb51aa6316e649f4f22452dc70bfd4c3da072c03ea82ee009d4272a84961c98e517ab947741d812116011dec0373ca8fbac5576c2069b067f8b005d60a36eca44f56019a64835d76\n" 1955 + ~k:"17a199bd383a84e22029fb90d5abc9a8a7ccd3f0a33720ca80e3161971793526\n" 1956 + ~r:"84cace71a80ed47494570fc84839f2e350191b74f0eefff2d7ab2c689db77bae\n" 1957 + ~s:"9cac33594e1934b68f62aca05ca040f3c82110c10b7379878b7894b0919a0f2f\n\n"; 1958 + case 1959 + ~msg: 1960 + "df6a4eb7cad4ff9bdd8356d3568fcf0285c1a4e3c3109faa091b58a9bd907c629d54aa7a23a74870545a0942a2d23914f2f167d96573f06f35ea05ef704cac8014dd21b961d3dacf7b930bbd7e35550f721094c86333e03ed4dab7bc1b6416add9578d279edaee37504fd25ec0c5e8a37ac9ec19bfb1e3778ed6d9c6b6e35ec7\n" 1961 + ~x:"679ef48b643be394677d17e837a0be6d4d8027a900b686aed7c4b12634fea76a\n" 1962 + ~y: 1963 + "2f4b0c01e4b15eb5ee7afa9824093330738be2f3f06c42b2b7c6968fa54b987c184e7fa89eff16da02b93ff61b9ce48eebe7eab0f7e203ad11c71e7b297d23f2d5a5998272c30c2e1724b5e963bfd6f83239f874d88ea089435b896dd2109b6a14b2d848f9ed7e92143c0649f97f4f2eb05b8c5a07e99e497dbc752d443eba93d7f3dcdc3240a2714ea0e3e7627f216e4701148dd21192f274f1ed5df05c60b1576d3a0b7f69a776b5010404acd5afafd3d70f57763f2b778d0c361e5f7f0bbe17aafaa5cd393329171d06ec032039a9ffb37c3ab8cd858ea788a7b9f501996baf959ca85c7dafe0cd3e30957640eff105894c43f866bcc422698d128dca0887\n" 1964 + ~k:"3cf9da6f182bade870946d3ed3b078208ea8153c45515d64f589bca72b703ebf\n" 1965 + ~r:"1dd2daeaf3e89fd644c6cc942311ea5056413d8a24087787675ceffd3d6c15e4\n" 1966 + ~s:"3e12781396558560455c4e70f610522ab2b10fc25343296818ef7ffb0378fa47\n\n"; 1967 + case 1968 + ~msg: 1969 + "4f16681eaa5d97673a7cca02ee8a7374b75411e0b5704a947f04d1a5b14be0b506f31c2fa329e3ca516fa4f1626a9b5e080bda7f353f850365eac7c3d2596f502a5d70b1542276c12d4ea4a22b5325b9eb3e942e556769b796c4f524595f1cc6ce17f99f9dbf51331453228ead327b614f4438d35d61428429f78c8c9377aaaa\n" 1970 + ~x:"e0e576432913bc75a2e0de3b33bf3094148298612a9dc56fedd47aa569af8ac8\n" 1971 + ~y: 1972 + "2e33604ed9e6c0f1ba403a8c3c3fe8e8f488591813aa3d2fcccdf88fe808f70adf173f0f143abdaad43b80769e30ffc5749e8ad35999953deff4f61f4ca07313609e23acae7b35f77934fdbbe1c380b2727b1c3899250af5b4399b658b7908676d64d11763785373b2169836611d72a957319936c84efd72b72f92bdd2dbe0000d8841ab6d8d0d666e79361abb23b6007348dbbe7a94936dc6b026f3b7100081f547b994e0e0778cb761ebd43a29d8764c7f962a747ecc92e4a2a628f52d8abf43f6e3278a0d32ea67c2d79d04c83387ddc709365c0a0bacc83d75c946e283e0739233581441aeddb0d7d76503d621405d27ef66fa8b5379d178617d4bb5ad59\n" 1973 + ~k:"53cb2d046b391193efb14a4dfafa296c2ec92293c7b3c7d19a20e68c4a1141d9\n" 1974 + ~r:"e2ff3fc441db4540194a7f5da1ead849c2c3c48dccf8b2c1b3b359a7b16e16ab\n" 1975 + ~s:"52fbdcd5c62a999aab46147fef9e18cbfc7daf680a7ddb892edfa44d285e2158\n\n"; 1976 + case 1977 + ~msg: 1978 + "09e48a36523b5289ec41859faa141e2a29b3e88ab2d6351e20de001e6424b85337675f0ce26be224fa4f8df0ef9710ea285635b27b297d688e338b5461820b57be4bee21645b04957ca2f6cd7af9a6a52b3c97c5b9db1c2f7ea817cd6d3c8522d4e6a9de869aef26ec0dbdd269c79b38806927bd3a5100735e6f9f655ca94dae\n" 1979 + ~x:"7891b05e24823f283126d7d175a4e8c8124b3776f4f296d0ffc4b5e21bb64d70\n" 1980 + ~y: 1981 + "7e38cb668d647ee15f71ac5d2b55c11fd4731e1a6c031dd7594d614f2f1ed25623fffdc5956f5256e635c914205a2937a6074cfe1f3e443bbeb323a23b0f0fbccf8c1770ad18ba97d0acbea1e846e12cf12c370625b1555d710905eee943539f2241b8fb490c9d6b44f36139226b4c1f00e95ffe595014f61bf579836a14212c07231a5e9e87de4a9aaf0f46f34c9229f2eabb71d40de26a1cbe10db0645cec37d48575a1154bb5acc947becb2a74b07e2a0e45b903be37502f91b07fb4ecd7f21fb130c6d639ef0fd8444fa12de859abe95548801f6a3c40e7a65fd1518221a274d7b65ed4175f66c04d919c86d2ae8c374b14709e9c8a39e1d0c4e9935540b\n" 1982 + ~k:"dc24b379ee2d26d5db792839795ad0d4b9622c0e3fd518df541a5f6e9cefba0f\n" 1983 + ~r:"e550dc65af275e47be480fd647366e2b055c79ea33ded4f5a9557121e082af26\n" 1984 + ~s:"e26b1a5f27cc6c87863e31ef7f1e61bea476fc5d7c25fdf22fe740f23aa9a752\n\n"; 1985 + case 1986 + ~msg: 1987 + "8837bbceef577511f2d0c08f790d5d2e8562d93df3d82dd4c2827cd9a9115308114a18c452db2785561081eb523685ae2b3c8b090e0d44dd40d2fc0cdfc88d6f9063a7707df609edf0a8c55034815ea9f1d8b0bcbc92fba513ba81ee646bf98ad4eb22be26a4582b1be2899c91eebcbc9fba5825e021e99be0c9d28642d13fa4\n" 1988 + ~x:"116d1836a131310644aaaee6ac39b3643cd50026a6b486167cb4daac242a4e7a\n" 1989 + ~y: 1990 + "77d7a40a7bab3f5778f85d4fc48b3e28ce28b2df9eb87cc9cf394ef28e8064f39a9690103980a66da219cb5022c101f22011a8157a7568c5ff2e978ba2201367d17c22a867865d00c2a437385627bd088bfcf7219251bf6ae158269f4ef35da7095a53c24f37d61bcfb7c043feb6e93832343f9e90ee7104c80486ecd087be1b67f18cdaaa375e039cb7ad603cb0cd855623e9fb48e4eede14ea3c76a0364aac006650d3b5cd9b474b56f8584be58a721bf34dd0808d334cd8632e808536791fcbea961f7163dad28353c115eb3e856737dbbee03436721637a47754a8a1fe0fedf547b358a73d05b769a95bde3440007c0773a3c7c8dc9714e11c3a10ee01d7\n" 1991 + ~k:"4a6febb624c8ebd411cfb30c6db055dec3d0d17456dc0c54bd1b43531d4f2649\n" 1992 + ~r:"7b6b3eaef6cd5fe6daede86d63943478c771582483be0b926ee3022d22ef912e\n" 1993 + ~s:"39d928b59a690450d13359a29efe20cb98bfd3fc9726f80e5148f059663ffd08"; 1994 + ] 1380 1995 1381 1996 let sha384_n256_cases = 1382 1997 (* [mod = L=2048, N=256, SHA-384] *) 1383 - let domain = params 1384 - ~p:"a6167c16fff74e29342b8586aed3cd896f7b1635a2286ff16fdff41a06317ca6b05ca2ba7c060ad6db1561621ccb0c40b86a03619bfff32e204cbd90b79dcb5f86ebb493e3bd1988d8097fa23fa4d78fb3cddcb00c466423d8fa719873c37645fe4eecc57171bbedfe56fa9474c96385b8ba378c79972d7aaae69a2ba64cde8e5654f0f7b74550cd3447e7a472a33b4037db468dde31c348aa25e82b7fc41b837f7fc226a6103966ecd8f9d14c2d3149556d43829f137451b8d20f8520b0ce8e3d705f74d0a57ea872c2bdee9714e0b63906cddfdc28b6777d19325000f8ed5278ec5d912d102109319cba3b6469d4672909b4f0dbeec0bbb634b551ba0cf213 1385 - " ~q:"8427529044d214c07574f7b359c2e01c23fd97701b328ac8c1385b81c5373895 1386 - " ~g:"6fc232415c31200cf523af3483f8e26ace808d2f1c6a8b863ab042cc7f6b7144b2d39472c3cb4c7681d0732843503d8f858cbe476e6740324aaa295950105978c335069b919ff9a6ff4b410581b80712fe5d3e04ddb4dfd26d5e7fbca2b0c52d8d404343d57b2f9b2a26daa7ece30ceab9e1789f9751aaa9387049965af32650c6ca5b374a5ae70b3f98e053f51857d6bbb17a670e6eaaf89844d641e1e13d5a1b24d053dc6b8fd101c624786951927e426310aba9498a0042b3dc7bbc59d705f80d9b807de415f7e94c5cf9d789992d3bb8336d1d808cb86b56dde09d934bb527033922de14bf307376ab7d22fbcd616f9eda479ab214a17850bdd0802a871c" 1998 + let domain = 1999 + params 2000 + ~p: 2001 + "a6167c16fff74e29342b8586aed3cd896f7b1635a2286ff16fdff41a06317ca6b05ca2ba7c060ad6db1561621ccb0c40b86a03619bfff32e204cbd90b79dcb5f86ebb493e3bd1988d8097fa23fa4d78fb3cddcb00c466423d8fa719873c37645fe4eecc57171bbedfe56fa9474c96385b8ba378c79972d7aaae69a2ba64cde8e5654f0f7b74550cd3447e7a472a33b4037db468dde31c348aa25e82b7fc41b837f7fc226a6103966ecd8f9d14c2d3149556d43829f137451b8d20f8520b0ce8e3d705f74d0a57ea872c2bdee9714e0b63906cddfdc28b6777d19325000f8ed5278ec5d912d102109319cba3b6469d4672909b4f0dbeec0bbb634b551ba0cf213\n" 2002 + ~q:"8427529044d214c07574f7b359c2e01c23fd97701b328ac8c1385b81c5373895\n" 2003 + ~g: 2004 + "6fc232415c31200cf523af3483f8e26ace808d2f1c6a8b863ab042cc7f6b7144b2d39472c3cb4c7681d0732843503d8f858cbe476e6740324aaa295950105978c335069b919ff9a6ff4b410581b80712fe5d3e04ddb4dfd26d5e7fbca2b0c52d8d404343d57b2f9b2a26daa7ece30ceab9e1789f9751aaa9387049965af32650c6ca5b374a5ae70b3f98e053f51857d6bbb17a670e6eaaf89844d641e1e13d5a1b24d053dc6b8fd101c624786951927e426310aba9498a0042b3dc7bbc59d705f80d9b807de415f7e94c5cf9d789992d3bb8336d1d808cb86b56dde09d934bb527033922de14bf307376ab7d22fbcd616f9eda479ab214a17850bdd0802a871c" 1387 2005 in 1388 2006 let case = case_of ~domain ~hash:Digestif.sha384 in 1389 2007 1390 - [ case ~msg:"8c78cffdcf25d8230b835b30512684c9b252115870b603d1b4ba2eb5d35b33f26d96b684126ec34fff67dfe5c8c856acfe3a9ff45ae11d415f30449bcdc3bf9a9fb5a7e48afeaba6d0b0fc9bce0197eb2bf7a840249d4e550c5a25dc1c71370e67933edad2362fae6fad1efba5c08dc1931ca2841b44b78c0c63a1665ffac860 1391 - " ~x:"459eb1588e9f7dd4f286677a7415cb25a1b46e7a7cfadc8a45100383e20da69d 1392 - " ~y:"5ca7151bca0e457bbc46f59f71d81ab16688dc0eb7e4d17b166c3326c5b12c5bdebb3613224d1a754023c50b83cb5ecc139096cef28933b3b12ca31038e4089383597c59cc27b902be5da62cae7da5f4af90e9410ed1604082e2e38e25eb0b78dfac0aeb2ad3b19dc23539d2bcd755db1cc6c9805a7dd109e1c98667a5b9d52b21c2772121b8d0d2b246e5fd3da80728e85bbf0d7067d1c6baa64394a29e7fcbf80842bd4ab02b35d83f59805a104e0bd69d0079a065f59e3e6f21573a00da990b72ea537fa98caaa0a58800a7e7a0623e263d4fca65ebb8eded46efdfe7db92c9ebd38062d8f12534f015b186186ee2361d62c24e4f22b3e95da0f9062ce04d 1393 - " ~k:"2368037a1c7647c683d7e301ac79b7feebc736effe3ab1644b68308b4b28620d 1394 - " ~r:"4fd8f25c059030027381d4167c3174b6be0088c15f0a573d7ebd05960f5a1eb2 1395 - " ~s:"5f56869cee7bf64fec5d5d6ea15bb1fa1169003a87eccc1621b90a1b892226f2 1396 - 1397 - " ; case ~msg:"02bb64d2d5032f54f1ac9e9ee164db83af0cb036d88d41e9b2118cfc39d1b4b4dc2c497549c7982ccacf665d1b0011268246c7c17f562ecba25e265489873e0dd9268e9b06880ba74e74b56f50c7324d29373853e3a0f3ff787eba4e5e7f9437f8ec8a5e868324e9c17fb3d0e12de2d31d438c5bf38b27167d43ae4311b11062 1398 - " ~x:"521f08c10774077ac15bc85f2f6a03d84207b4ed7bffecc35d730cdd1126877f 1399 - " ~y:"11f3a716fbda7af35bdb62d128af6f21ec2ed4896aa81e8769c6eea9c21c81aef23ae0f525269dc405accef098377f652730968a33b50f0a4c7784345280651caa034df87342ca8973ad86ff7f0f8773a94f95dd2bfa802d268dbf3a2103b1276e06db2d734399f2ab7bdcca097616fc46ed2478e52cef049d19444586e7b75d6a56741da2270f54d2c739ec8db996c71f06a39af2383c611499be0fb34809b171254ef273516c33e17e14048ef2d21d600aa153bcf7377fba9405c6b2e5f2aaf0f2f3467d7461f62e814a2c461e8ac9db0df370e18ec6eed8212acaecf1e7241bcbcbca671060e50c29f966f1ea1e92af6903f81c7ab9ee09f60577bf30c186 1400 - " ~k:"08b161571ed031152677136b54e87119133f7de56268aec07cba07667b98bcd8 1401 - " ~r:"7a5d2016afe87883491bd6cd166edddf138c1c89961e4af6876be08b0e06ad74 1402 - " ~s:"34efbda1849dedd0d1aa775dab2aa2b14c9ba0206592fbc34eb47b844646adc2 1403 - 1404 - " ; case ~msg:"4f1c0053984ab55a491f3618db1be2379174a4385974825fcbe584e2b6d0702abb8298dd9184eef1740b90a5eae850e9452b4e4ab219e187860f0fb4ad2be390ef2ba7d76cdedcaf10aeaf4f25e497b4da951375b687a8d67012d3f99c7b5ca82e9bd0630dffcd635ecd8209cddb872da5bf4736309783345a35376b4fce4b91 1405 - " ~x:"6ba8f6638316dd804a24b7390f31023cd8b26e9325be90941b90d5fd3155115a 1406 - " ~y:"10e6f50fd6dbb1ca16f2df5132a4a4eabc51da4a58fe619b2225d7adab0cea3afc2db90b158b6231c8b0774e0f0d9074517f336ca053ae115671aee3c1de0f85728cff99deebc07ffc9a63631989a9277e64c54d9c25a7e739ae92f706ee237b98b8700a9df0de12d2124e2cfd81d9ec7b0469ee3a718ab15305de099d9a2f8cecb79527d016447c8f6fe4905c3718ce5234d13bf4edd7169b9d0db9a6b0fc77b7d53bdd32b07dc15bc829620db085114581608ac9e0937752095951d289855d0bcc9d421b945cc4f37f80b0cb25f1ffee9c61e567f49d21f889ecbc3f4ed337bca666ba3ba684874c883fe228ac44952a8513e12d9f0c4ed43c9b60f35225b2 1407 - " ~k:"2a4a4e014c94d8546c62f0db2fd488f5fac03073a11c3760376114ab3201930d 1408 - " ~r:"006b759fb718c34f1a6e518f834053b9f1825dd3eb8d719465c7bcc830322f4b 1409 - " ~s:"47fa59852c9ae5e181381e3457a33b25420011d6f911efa90f3eaced1dee1329 1410 - 1411 - " ; case ~msg:"42199186434d6c55bcef269bee685c4e1580e243027ed128ca99492033a52954bd1ca8ecc5043820725a3c0d71a181a05aabcb4ecda7180d86855e7b4dfa9a44c7af4c98fbf1f0624058804fd8eaae4990d4d7bb75f01741ce36cfc9c137254cab065a4617d0d0cd5f58ea56868a40f3e0baf7db5d2557f4b9775c1820dc1d41 1412 - " ~x:"46d690ca6b9cc01e9a8c7bfdedc59a97eba52f097b8fdc19bc1f8c0ab5d4bfdb 1413 - " ~y:"6364a35ae994f27703319c36d90793c8f26511846ba06038995b6556e4443aa61eb0f8efcc3d47f7c5f85276ea921da0784a67998253c992975f9e13847ccad099d9c1e5c94cfb195488e1293e23b74db00603e8bd6814c94690bf0cccc1c0e47f0c6609a48e144587ece178f72c8514a43590bc4c219da95cbe8966f4404fe9c288f23cd0f973e77ec84b4b0f163b50a3c556cd1d3951faebd982af44447e60d7834b93b6d9c3ff0961fccb908312a24376eedc508f806668d6617b77491a01d5d069d6ccd5f21b5eb3c3a3d4a0479593845c72f720157b188d2dfae4401c57a600b142b6bde2a69f1a0afba2f507a63cd6df056bb5b34fdfcee012d341b3f1 1414 - " ~k:"638e5fd0885f4c9f7e5f4e6a103b2d2d9d1368c493f9822ef431f54e65a7a3be 1415 - " ~r:"2551d4f855174f7b28a782b89697d48fbc314cfeb17ec4c9902a8e557cc6f6b9 1416 - " ~s:"278b786f9e28eeccd00586b445e75f48cf2649f3f1b7bff72b0e767f3443dc58 1417 - 1418 - " ; case ~msg:"4fdd888756ac68f4c29cd5b1de42756794570ca8f18ff795f6f0fc856772b6a2189b5ed4a9b7547328075b56c28ddf50b84c27205cee57b29d0b387970e89a6a2236293bbc9e399013d1dd3bd5a10ab0d259f7fda704f71cbe3b8b8752806a0c84668d85e4d739cec628dff63371d24a4b14137382759ba400df0e2c25947d18 1419 - " ~x:"49da89d1673704d1f24ac7dc799bf006aa7d606c590e5e37e38032ec51a70376 1420 - " ~y:"5b619845ba969f1ca5963fcf04c03aa40e989222774e957a54191acf9ddc407a54a161e22a5ac50ca5d61e6601cc7995bf0db38ff0fa1f77b244fe98148c81f208dca29ffa30f1131c76dbbe4303425e9180b4a48f22c757ed8e388b61bdc6d55519523d00c31a5f8376640d4688e60dcc172deece73de28437e900cb19a5311a0c9ca9af6cc6eeb6844e9b8359e3ef1cbe03784107d2d0aebec7c1d70d9385a4d2b8033851f5d5b7aa18ef570aa037fcbd3e30f2fc2013ffbfa0787be6d59ffa1616eed5e121ee4dbee04a9ede004956075465a7688701e04ec9b2153f52cafbff7ff9226e69397c7083c3aa536d7109ee430a65448b10c1818c70510a339c1 1421 - " ~k:"14dca45937cfdbca5c799f2ca50de2a44d8051e6d80af242c9f4d614419e6e07 1422 - " ~r:"4b90993d707f3371d0a0cc87255e99a8fba18c3b58ddddc1067cd394172366cc 1423 - " ~s:"4b2612d506fb85e5aff9fcd56c09bd12bf60f78ab7dfd021a742ff85dc507ae2 1424 - 1425 - " ; case ~msg:"8507db5f1df9d22f447c20e4320f90d9b30722197196d1a2418d06dca41b3305f6fbe52ab58cc0b60ef1a1d257fc2fb2062fe6c5f2a25f0293ca39d0c083cfd5e4bdadf2169ad4ed178c88ecb5554ffa2b53aa4398115cde627d30144ace9325b2d79d7dce951509d734afb0ff6d9265b902672eb5884e9d8acff0ea22c76938 1426 - " ~x:"82ab2908e3d2335e07c1002764b07b1ca46d039a95b59b450b16d37ed4838872 1427 - " ~y:"438831cb0eb09aab24275454354ce42b9a2eedb31f421219def74687e6f9c92f0b1982355cadb26e095b7ca25de530aaba63e64fc23acc3d1d1f1b70cb726156ca0a799b59094bcc3b8998a4ae7744d215d63b887082f4c84128e74b9b9999c60cad3bc6bb6f727284b4311a929bbd964c9a7074e86062224dcedb58b9b598546ac95b3b434ea114ab0d678541d6caec0c56009bc347a425f167cd32a34eecb7192424d57b0e54b4a9e82f425138703ce89b189039e92a770b51497f8f10eae9c3459ed87e5101f5ab1b6271485fdb2dd3dbc4217fcf67c7e92d0096dc7da9727f5a434b7545284cd8a283070b5a49d711dffa85904311e0345a99147a168ea0 1428 - " ~k:"1ea475584982b639ada8c84e51ef72738390ed6fa44395f11428dc5fd794a81e 1429 - " ~r:"1d2781f5f9d08ab2feb1683942c2c29a66318839a7dfef9aee9cd7a89efe2ab0 1430 - " ~s:"3adc7be968502ead10feec191e212ea0e07d449006e7f22ddf869a9fae711834 1431 - 1432 - " ; case ~msg:"c7844960966584c8e3a59dc37df37b7eb3ad333148a32b86c1ec18072f3b316c59cdef98ba4dc46f532a4280200c225fac6cd1adf0a45382c2d88054e447740454976e5272330c7487eb42a095f7314139938c7419193b1c128054c1bbf10d0634e22c6e02d8e12279cac0bfa01d3058e0f8d5547ba0f71529c27e0084d4bde7 1433 - " ~x:"0c76bd647c6fafe7da1029b9bf36a9f042195691a26f36bbe0eca3d4b1e6cbb4 1434 - " ~y:"2de9d27f1a030199ffbba770e08aeb1ff3708edf8ebb3a8e664e3bd1511db126ed87bc44c2d2af40b9d512c50a4d6c10b23e3ca61819f5841cbf5d0bd6c88d46f1ac6474ec20b9100b328cc155879166f46b6d71140b0cfb2b0725b64a38d70a91ca8f0e3baeec6125262c52a95d5ca5d5ff6f4482b1825006cd469f9e7f31769a73eddb5f7017f18bc747ae4fce450c4274f4abb960577d13b6a77dd99e67d11edb413e428e50726f7052e53565fa1d6fde91859573c9289289ffef0598802808ecc5501cb300e06405ed0febc3df23f40a1f6532410f7d9049b920216f7d5c7a728c8dd63a8d0060fb53b3543d62a636661750fd43775e80b509004351475f 1435 - " ~k:"71e12996d8aaa7cb1e730713fa441098347ca95eb39362c5a78ee6e847469c7c 1436 - " ~r:"09e654b17ab775959628e7cad0e27053ee495bcc29cc2a5e3b029660a77b1330 1437 - " ~s:"261ad41d6bce6d04d891a43c16ec2a8114e51f0e47b48b1dd1f3d626150338fb 1438 - 1439 - " ; case ~msg:"6f3f74388cc90b29c109ecbda08c79349dffdeb90722974d79d640620949448f66ae673eaf4d4af8c43da673a45ed152ea66fc97166baa7ce8beb666bd57ca43da6801c0ee5a5a9b50c5047935d7a8552c381d93eaf03cbbbb88ed0d3b5a2521b67612a4405120ef0205e89aeb48d577bcda3ad20e0a7cd07f8c9b215c845dd8 1440 - " ~x:"34c0d0de98c85be291b68a5b8c7fb3536b6f7447e8565ead9b002417f56f4616 1441 - " ~y:"080ca412bd197c5aafa2c6df5933a6210fa54089826828d5496b453609a56b7d55d232fbe650dd9f62c05c050c026a8717a78b5db01614a19301c610d2b9964a7e3357c722a4c553273bf27f871b4b9241678c334e20827a5f511fe9319a075d12753ac0960df60870a08a12f09b9d3593781781a0cd75e9d81cc6b9b0d506d100fe972165b68297e6070db2d8b6ea32176d1562084f6a06e08e2929155b255d33853de6549e79f8b56049a1d02f29166d5f91cfbde5aaf6bcae56f5d2d90a9b4e8f6f450080cae8256c6619e9155523c2b2052255a8f6d9f53d8a897be5b0476002410bf798256f62bb1a81827c2c3fc4ecf9abfd77e74174787370864f05f9 1442 - " ~k:"8086cc691e7e793a5c2a81bd3d5a1ff5ae261d9336b33f103d983a817f7eaf7b 1443 - " ~r:"43993b68e847f6ba61d5ad4dc8f5ad70dabc317a7b6811c23e7f215f95415ed5 1444 - " ~s:"1ea727afdb907d1d5b2337c1ecea46c71eb0fc8363af23865a345202a762a7c5 1445 - 1446 - " ; case ~msg:"74a433c2d313f66232324df875b82563805d7ed682b266eaf962375e422b3abbfe3dce7f3c1960a1e4100f333e168d021968b48397e8cce9005e951fdcb096a9abea342cb5b08bab79ef0c431dd3a43de7d5bd6b86bea8872ba038b43a236a7356b03f89b09004ba2def663e6d299763b6cafcb6b150a57f82b890ff6d56f832 1447 - " ~x:"5c1a80e926de194995195c4cee9a2e874c7f6af0fa8a4b2df5432f9cfc86b643 1448 - " ~y:"444fafab58db4d6f5283c3443d6478b5b78daa631bd4c3d9a28ed17281da4c1c2ef4d5ed576d66bfe5314e11fe68abffe4df406f6033edb84f36a38a3ce614601bc25841f9419afb2867d991e87b44c4b744e39b64079d9aad4b585d79c8e21c8f90990540fec8ae981f7483dc5523d216088a55cf2380ea8eb5246781290559ea1b208ad4d0f5871cb4d13cdca6ef34fdf2de63e209aa320cdf14185b8f5f60ccf93f398c1a6cf8b3ce3d98daf05e4cf90c39801ce35f01ec76a9f6035ce1b5ba107a5f66cf253b71fba3833e9969c314eb6d500005749231f799b0c79a555a10cdd69f8eec4c117d7c8b4ec6f60a1ee557b70c0dea380af53b92fdde8823ca 1449 - " ~k:"13dcb7c12aeb75a417a93a22ce94618716996c3350909cfbff6d38b603d377f6 1450 - " ~r:"3bda5b0c9e3da22f0b3e29356a2f7ddace6e9b24a063eb3f5a7d755f2eeaffb5 1451 - " ~s:"4cbb815320314a06538d2a6740e6bf9d022eac9aa25c7508f659f0f7c1f59c45 1452 - 1453 - " ; case ~msg:"f4eadfea117fd3d670cea28aa9d2602c951ed843e2e8cb2864074c8c9bccb0606ced83ae2980598cc3e1b047fca8659127406d8f59f5b7bbfe8ece6d3e42f87f4e42ebe92adaa1e6e92ced3dcacc2e0b2c98eade7c9c99da887e74db5a59132c1d7df7cde866cb2f3ca750852ba53e265e62bf7a93fd693e4a13751e186e9d6b 1454 - " ~x:"6abf7cc887544bf8d3256fb210848eb46281526b1e8cdf6c9204c4c46a747435 1455 - " ~y:"104f44fd7669607644ec55e6ca4096c9a279472752a1753dbb9f2a6941b8122274c87d16f63d75dda9ebcfd6584b0cb374fd17581353d2a246ec0b378de60e9613131683c0568bb54d74457ad73de859a4f02445344d13ee928f3cda5134202a9388e64cf05f8190049df4e777709838d0c9d3bcb37eecdc38c1a5d2b471c4b910cfaa9a9ba81f69b4b45c40344029958fa40000e56881bc6a14864330d5b351c161208676cb852bf47970268d37d4bfe97b3b26ef5b785f50ebc8c47949dc9bd0b2e673fb040e26789f3f5cdbce8e4b78389992bb83eeb2b063e9e1db06a9ede933faef7e635effe5e1b1e21153dc6934197efa1fd68f18a40ed569746c8374 1456 - " ~k:"0711c4621a8bcd40ff3e8b95728ce67a000e1fa33741246d420b046bdec48657 1457 - " ~r:"36c086070368265f736e7bbad54aaf2482d26161f8057a97a4b8cd2b4ddd7855 1458 - " ~s:"31d99d736ea67014fe59cb2212c47eb920f2af44e32b65db15af83cbe8e6aa70 1459 - 1460 - " ; case ~msg:"cbc37afc75177a8386dce2c40c33b8f5dedc23113b4512cb96790f2dd74066103e0c45a9c6176ff96b7d719162003cee10fad6ccc198550a389275d21e708b6961523272ecd5efab5680ed741c2de025b02bbdc56315a442e437c43e3b378e6d62ea8878fd9789858a8c68a504bff49516e762a22ae513a2dceba9253b36f553 1461 - " ~x:"7c6ee86f45ddf8b87f8884f59aad9e320b73b246a80b26a645188a40a9bca62d 1462 - " ~y:"356cc7370c840fa26b0d106c47a626e028a0c967c093810b520639bdda0d339b7fc29adc0d9036b9710358ef9f8c6c05252b278281b2afe7953886429e85d228fb5474acfd65213151e9da0aef86a66f9f9c59fa88fd48cc3addc83d7adf4afb1665049ed094020219c01958b697f22e652152e53bf4e8f68f476a58181ddd3f64344e9b87a08c5d0de49e7b3c2995840c200084e90a76d2c05f8b5c68e77192d0676b4219d4579cb2de0f2a93a916b4f9cfe0d8113dc4bbd97ed12d8ce0447fcf9df12e922c6383ca69c9de9ad320f9c5331adb6eb1d223079196a2939cc0a7259c512c478c943fe05736710e273e4b5867174de72e703b5e7bf7afdbc06427 1463 - " ~k:"685a19da2ee3dd94fe9726a32e712fac05eeffe11e3dd9f60e6f90af7c13e23a 1464 - " ~r:"5645ef65e8e9236d874d459e7a5809923c05d64b22757bfc5b5621079e84819c 1465 - " ~s:"65f4c8febaf3e9d46581b17685c4f2ec9b956421d034a2c1aaabee94b787a4f1 1466 - 1467 - " ; case ~msg:"8eb3685c3f406c5615e88accf4c0c7d2071b6c7bde5244994f73dc04f3cc0ab7e2b6664a1994e6eec52b62790a04328e436a2b4af3cbe3ba6e4c8f363a39b2529ef554c0c627f9f6b255928a39a465e60ac50ccf01f32c7ba483640344b6a8f583c90876b84d19554b0a4baabc2c240e296b12c819410cacffe7a7464419bee0 1468 - " ~x:"7e5e3d7255a629c39f88b6046fe0039159e44c2d2309b112ab05c61561d9e44a 1469 - " ~y:"94ba486977f5982f2ae75e986b7e194461cc3d65cdbf26f936805d12d7f850aad7580206d7dc544cd12ca1891c9dc406c949e52b9febfa88836f1566d521a110bb545e07ba28caf07e1bbfa3b176cc917cc4bb45dae7f873b72dfa9000e9ab6083e705c0167d853dda114c429fd812a05961fc2e78ba9e68ccdb9dc67b116f10532034d9f0f7d39901dc643127c4309058f8ebf43b28a5ce534e29d6227c4ec27ccf777b0008df5ce8b8a19b5771725cb0f9f2a62bb41f0106c390803a307c60acbed6c2e1e0db5036e0e79ddcc3f718b29ca5aa022f2f0bbe815f9c0eb504fc9ff8d18a2da999023af8105cddfc6794dfdcc41333bccd446ad7b82a0a7bfe38 1470 - " ~k:"3966daabf7854949475ff47f3932393a73f21e275b3baad861a92a3ab322e376 1471 - " ~r:"27b4e3c3a45efa6131c3d005ca924dff11fdccf409c2a6993fcb505477b6e400 1472 - " ~s:"68a085bd130c4ec08aa9673c495ba5afd46c9ddad2052ba7ab396329d900d86c 1473 - 1474 - " ; case ~msg:"f2b02ac627b3f66baf4ebaa52b899adfd7071af53e78923182d8b4d5f3a9474251308b4dbd15fb6b657be65028a189353912d7c16d6d4989985c15cedc4343f0ceb680617bc7278511f9068abd613718a862513ee514fdf80cd25b6f84c48851e6a7850feaea57ea20deb1123ca4206bde8a93ff999ef789583e2c850d9e0635 1475 - " ~x:"7e52070b03aba0af4cad1cba0a733618e3adb7de873efba013878fa76331b5e1 1476 - " ~y:"4e160d6970683f4d84eb88c55ba2da58d77f6374fc5127273d65e8ef96ccfff51df69b0e2fdf3e98f6d35e6a3dd9f7edd90bbae4c6581cd02ad01336c0086d4248eb1373480789f7d8333b831db3bae0bdb49789aab93cde1faf1ce88dcdc7a1a4f86143ce44f851ace459a5528c96195f4438ee7c1856ac61fd5035d839d62e48a1ab6bd23ad52f1f6ffed19826b6d7f6491cfb05003176f29079455443f0ab482150fac8e32a3902a4096775f342edee2daf4c4f338d455b4ea35d3975f72be85e98e87158486b4c3d6ec37a3703f63a3e19272ba5255089aacd30fa3979b458df616f57b7502b4291384562041f6188db503f3df7f5981da5705eb0f1d242 1477 - " ~k:"57c141f543386db3bd6a97121f93b47e38891796f02565058ec6a5ce65f7a212 1478 - " ~r:"6433bd33db0ac8261c691af3a27f52cdd4a65d799939faf279ac41788e7528a6 1479 - " ~s:"04cfdcb993382e8fd2db8d90dca80e94b17b432009852cd3f86625159e837c19 1480 - 1481 - " ; case ~msg:"2b4365a4ac6854c972da7347af1cecc6edcbae9d533b74fbe6db5712163a6ce984f9d7a4c54b44dd7555e5c2d2f3d098f31d517f8ebd330199a54b15297e5adee1bdf391581f1019b1ad72dcccd5484b51d275a368c69a7662e79f9b29c9a3084c94ae76da04f958c7d36cecc5d41d77f2302ff28f2ed9c66a0662cabf51c842 1482 - " ~x:"35b701b7d59aad55eb4299e0f9e0348baec875eaf62d2174bce92dd23302a81a 1483 - " ~y:"58e635eec80bde1eb7bf2da20600617af29f0a191705676bc10f7553f7611126e4c4d44bcf14f7a9f48da6e1b1e54d0a715724af5bca93867090f9bfc92741dfe1dd4f06075ec2a9262da81e0dcabfcab9e694ddca86d0e1cfaa321e2b5818182eb620bd5d16bc27a2da035d4bc17807cfe8ae3038c5bbb8a023fb232814b91b99749f519de39aa0f434313323b1b58202c59119b0be217617047c9e2ea453d608562cb96c4f0851a7965b164f9bbe151f9c508ca209f1af659e363804c8d8fa1ad700e20866ec9a1e505b74bbab70cb472308431a3e87272febf7cce2c20ec37f5d68b4e47bf3741013723936db7c9b0f3ded964acb7f8ac9c5a6b4f28de198 1484 - " ~k:"1c6ceff82adebf8c81bb4842b90dbe2a12c9d07c3a9d4990d44106a1768bb082 1485 - " ~r:"00a7c664c544cd7b61749410dda33bb3a47c3eb5a9a7be5fba201a390cecfaef 1486 - " ~s:"6fbbda967b584bd9ec6a0ae76e0c552b3d42bf0e9cf2939caf6123f6e86046f6 1487 - 1488 - " ; case ~msg:"cab1d17666b0c9658cc78cfcba17a08e2989d3c202c8b5085531404d928c618b6e230b25c46a5b58437e4335fc040020ba00c863182325940f00aad330145e666d07e9e9d876137010932ae520d9188ca3d7993c905395219c55846d19b8fcdb1d0c1586b9b51097afd6972ae1472b0e20453f8fbd5d6aa9e4a9a9b3dc37dd8f 1489 - " ~x:"1ca2b291707ce4f70e366ee97b5da158a1c985ba4f252c572f0fb329e43f9cb9 1490 - " ~y:"5022c8a6fa79b7aa11a3d7af5acebb2ef8c50b28d8f0e3a556196562d34131fb44f22c3be3f9895e35eee70aa53b6c67920c540ba6c1085b0ea818b12aea811f2dfaeb6daed976e362430798fdcca3912a0891e7d1c83b748af1e7689e038b490eb73f7fe6e0612e8f238580e78833b20727a602768ab2d59dda36e75146fa4d3664f7b0cef7be877afdcdba23004ee313a69fd61c326759e7e779ad750f7a5cad9fb2dd80a8eea6dcbda0195dcc17b38ad6f0e2ab68cfc69b15c572f85f20c3679c15a83099cf08a379055f8fbdd8f590d43bd12f75baf0eccd6c077ac7589aab8171e8875db0122e6c78617c13586143a7ebe904a7822bacf48a7527f7fa4e 1491 - " ~k:"4f1e2aae323c5309b3ee5d3b73e5d4090c75da17765559e118bfd1460c312859 1492 - " ~r:"7b8b75ac8514c68de0caa98e9de0b9607253d8088d3feadf92b83ffc26e088ce 1493 - " ~s:"4b10e17ff64a0eb72f70a863d00a9bf331bbb515ba3a9fef72753ad7f0df0be5" ] 1494 - 2008 + [ 2009 + case 2010 + ~msg: 2011 + "8c78cffdcf25d8230b835b30512684c9b252115870b603d1b4ba2eb5d35b33f26d96b684126ec34fff67dfe5c8c856acfe3a9ff45ae11d415f30449bcdc3bf9a9fb5a7e48afeaba6d0b0fc9bce0197eb2bf7a840249d4e550c5a25dc1c71370e67933edad2362fae6fad1efba5c08dc1931ca2841b44b78c0c63a1665ffac860\n" 2012 + ~x:"459eb1588e9f7dd4f286677a7415cb25a1b46e7a7cfadc8a45100383e20da69d\n" 2013 + ~y: 2014 + "5ca7151bca0e457bbc46f59f71d81ab16688dc0eb7e4d17b166c3326c5b12c5bdebb3613224d1a754023c50b83cb5ecc139096cef28933b3b12ca31038e4089383597c59cc27b902be5da62cae7da5f4af90e9410ed1604082e2e38e25eb0b78dfac0aeb2ad3b19dc23539d2bcd755db1cc6c9805a7dd109e1c98667a5b9d52b21c2772121b8d0d2b246e5fd3da80728e85bbf0d7067d1c6baa64394a29e7fcbf80842bd4ab02b35d83f59805a104e0bd69d0079a065f59e3e6f21573a00da990b72ea537fa98caaa0a58800a7e7a0623e263d4fca65ebb8eded46efdfe7db92c9ebd38062d8f12534f015b186186ee2361d62c24e4f22b3e95da0f9062ce04d\n" 2015 + ~k:"2368037a1c7647c683d7e301ac79b7feebc736effe3ab1644b68308b4b28620d\n" 2016 + ~r:"4fd8f25c059030027381d4167c3174b6be0088c15f0a573d7ebd05960f5a1eb2\n" 2017 + ~s:"5f56869cee7bf64fec5d5d6ea15bb1fa1169003a87eccc1621b90a1b892226f2\n\n"; 2018 + case 2019 + ~msg: 2020 + "02bb64d2d5032f54f1ac9e9ee164db83af0cb036d88d41e9b2118cfc39d1b4b4dc2c497549c7982ccacf665d1b0011268246c7c17f562ecba25e265489873e0dd9268e9b06880ba74e74b56f50c7324d29373853e3a0f3ff787eba4e5e7f9437f8ec8a5e868324e9c17fb3d0e12de2d31d438c5bf38b27167d43ae4311b11062\n" 2021 + ~x:"521f08c10774077ac15bc85f2f6a03d84207b4ed7bffecc35d730cdd1126877f\n" 2022 + ~y: 2023 + "11f3a716fbda7af35bdb62d128af6f21ec2ed4896aa81e8769c6eea9c21c81aef23ae0f525269dc405accef098377f652730968a33b50f0a4c7784345280651caa034df87342ca8973ad86ff7f0f8773a94f95dd2bfa802d268dbf3a2103b1276e06db2d734399f2ab7bdcca097616fc46ed2478e52cef049d19444586e7b75d6a56741da2270f54d2c739ec8db996c71f06a39af2383c611499be0fb34809b171254ef273516c33e17e14048ef2d21d600aa153bcf7377fba9405c6b2e5f2aaf0f2f3467d7461f62e814a2c461e8ac9db0df370e18ec6eed8212acaecf1e7241bcbcbca671060e50c29f966f1ea1e92af6903f81c7ab9ee09f60577bf30c186\n" 2024 + ~k:"08b161571ed031152677136b54e87119133f7de56268aec07cba07667b98bcd8\n" 2025 + ~r:"7a5d2016afe87883491bd6cd166edddf138c1c89961e4af6876be08b0e06ad74\n" 2026 + ~s:"34efbda1849dedd0d1aa775dab2aa2b14c9ba0206592fbc34eb47b844646adc2\n\n"; 2027 + case 2028 + ~msg: 2029 + "4f1c0053984ab55a491f3618db1be2379174a4385974825fcbe584e2b6d0702abb8298dd9184eef1740b90a5eae850e9452b4e4ab219e187860f0fb4ad2be390ef2ba7d76cdedcaf10aeaf4f25e497b4da951375b687a8d67012d3f99c7b5ca82e9bd0630dffcd635ecd8209cddb872da5bf4736309783345a35376b4fce4b91\n" 2030 + ~x:"6ba8f6638316dd804a24b7390f31023cd8b26e9325be90941b90d5fd3155115a\n" 2031 + ~y: 2032 + "10e6f50fd6dbb1ca16f2df5132a4a4eabc51da4a58fe619b2225d7adab0cea3afc2db90b158b6231c8b0774e0f0d9074517f336ca053ae115671aee3c1de0f85728cff99deebc07ffc9a63631989a9277e64c54d9c25a7e739ae92f706ee237b98b8700a9df0de12d2124e2cfd81d9ec7b0469ee3a718ab15305de099d9a2f8cecb79527d016447c8f6fe4905c3718ce5234d13bf4edd7169b9d0db9a6b0fc77b7d53bdd32b07dc15bc829620db085114581608ac9e0937752095951d289855d0bcc9d421b945cc4f37f80b0cb25f1ffee9c61e567f49d21f889ecbc3f4ed337bca666ba3ba684874c883fe228ac44952a8513e12d9f0c4ed43c9b60f35225b2\n" 2033 + ~k:"2a4a4e014c94d8546c62f0db2fd488f5fac03073a11c3760376114ab3201930d\n" 2034 + ~r:"006b759fb718c34f1a6e518f834053b9f1825dd3eb8d719465c7bcc830322f4b\n" 2035 + ~s:"47fa59852c9ae5e181381e3457a33b25420011d6f911efa90f3eaced1dee1329\n\n"; 2036 + case 2037 + ~msg: 2038 + "42199186434d6c55bcef269bee685c4e1580e243027ed128ca99492033a52954bd1ca8ecc5043820725a3c0d71a181a05aabcb4ecda7180d86855e7b4dfa9a44c7af4c98fbf1f0624058804fd8eaae4990d4d7bb75f01741ce36cfc9c137254cab065a4617d0d0cd5f58ea56868a40f3e0baf7db5d2557f4b9775c1820dc1d41\n" 2039 + ~x:"46d690ca6b9cc01e9a8c7bfdedc59a97eba52f097b8fdc19bc1f8c0ab5d4bfdb\n" 2040 + ~y: 2041 + "6364a35ae994f27703319c36d90793c8f26511846ba06038995b6556e4443aa61eb0f8efcc3d47f7c5f85276ea921da0784a67998253c992975f9e13847ccad099d9c1e5c94cfb195488e1293e23b74db00603e8bd6814c94690bf0cccc1c0e47f0c6609a48e144587ece178f72c8514a43590bc4c219da95cbe8966f4404fe9c288f23cd0f973e77ec84b4b0f163b50a3c556cd1d3951faebd982af44447e60d7834b93b6d9c3ff0961fccb908312a24376eedc508f806668d6617b77491a01d5d069d6ccd5f21b5eb3c3a3d4a0479593845c72f720157b188d2dfae4401c57a600b142b6bde2a69f1a0afba2f507a63cd6df056bb5b34fdfcee012d341b3f1\n" 2042 + ~k:"638e5fd0885f4c9f7e5f4e6a103b2d2d9d1368c493f9822ef431f54e65a7a3be\n" 2043 + ~r:"2551d4f855174f7b28a782b89697d48fbc314cfeb17ec4c9902a8e557cc6f6b9\n" 2044 + ~s:"278b786f9e28eeccd00586b445e75f48cf2649f3f1b7bff72b0e767f3443dc58\n\n"; 2045 + case 2046 + ~msg: 2047 + "4fdd888756ac68f4c29cd5b1de42756794570ca8f18ff795f6f0fc856772b6a2189b5ed4a9b7547328075b56c28ddf50b84c27205cee57b29d0b387970e89a6a2236293bbc9e399013d1dd3bd5a10ab0d259f7fda704f71cbe3b8b8752806a0c84668d85e4d739cec628dff63371d24a4b14137382759ba400df0e2c25947d18\n" 2048 + ~x:"49da89d1673704d1f24ac7dc799bf006aa7d606c590e5e37e38032ec51a70376\n" 2049 + ~y: 2050 + "5b619845ba969f1ca5963fcf04c03aa40e989222774e957a54191acf9ddc407a54a161e22a5ac50ca5d61e6601cc7995bf0db38ff0fa1f77b244fe98148c81f208dca29ffa30f1131c76dbbe4303425e9180b4a48f22c757ed8e388b61bdc6d55519523d00c31a5f8376640d4688e60dcc172deece73de28437e900cb19a5311a0c9ca9af6cc6eeb6844e9b8359e3ef1cbe03784107d2d0aebec7c1d70d9385a4d2b8033851f5d5b7aa18ef570aa037fcbd3e30f2fc2013ffbfa0787be6d59ffa1616eed5e121ee4dbee04a9ede004956075465a7688701e04ec9b2153f52cafbff7ff9226e69397c7083c3aa536d7109ee430a65448b10c1818c70510a339c1\n" 2051 + ~k:"14dca45937cfdbca5c799f2ca50de2a44d8051e6d80af242c9f4d614419e6e07\n" 2052 + ~r:"4b90993d707f3371d0a0cc87255e99a8fba18c3b58ddddc1067cd394172366cc\n" 2053 + ~s:"4b2612d506fb85e5aff9fcd56c09bd12bf60f78ab7dfd021a742ff85dc507ae2\n\n"; 2054 + case 2055 + ~msg: 2056 + "8507db5f1df9d22f447c20e4320f90d9b30722197196d1a2418d06dca41b3305f6fbe52ab58cc0b60ef1a1d257fc2fb2062fe6c5f2a25f0293ca39d0c083cfd5e4bdadf2169ad4ed178c88ecb5554ffa2b53aa4398115cde627d30144ace9325b2d79d7dce951509d734afb0ff6d9265b902672eb5884e9d8acff0ea22c76938\n" 2057 + ~x:"82ab2908e3d2335e07c1002764b07b1ca46d039a95b59b450b16d37ed4838872\n" 2058 + ~y: 2059 + "438831cb0eb09aab24275454354ce42b9a2eedb31f421219def74687e6f9c92f0b1982355cadb26e095b7ca25de530aaba63e64fc23acc3d1d1f1b70cb726156ca0a799b59094bcc3b8998a4ae7744d215d63b887082f4c84128e74b9b9999c60cad3bc6bb6f727284b4311a929bbd964c9a7074e86062224dcedb58b9b598546ac95b3b434ea114ab0d678541d6caec0c56009bc347a425f167cd32a34eecb7192424d57b0e54b4a9e82f425138703ce89b189039e92a770b51497f8f10eae9c3459ed87e5101f5ab1b6271485fdb2dd3dbc4217fcf67c7e92d0096dc7da9727f5a434b7545284cd8a283070b5a49d711dffa85904311e0345a99147a168ea0\n" 2060 + ~k:"1ea475584982b639ada8c84e51ef72738390ed6fa44395f11428dc5fd794a81e\n" 2061 + ~r:"1d2781f5f9d08ab2feb1683942c2c29a66318839a7dfef9aee9cd7a89efe2ab0\n" 2062 + ~s:"3adc7be968502ead10feec191e212ea0e07d449006e7f22ddf869a9fae711834\n\n"; 2063 + case 2064 + ~msg: 2065 + "c7844960966584c8e3a59dc37df37b7eb3ad333148a32b86c1ec18072f3b316c59cdef98ba4dc46f532a4280200c225fac6cd1adf0a45382c2d88054e447740454976e5272330c7487eb42a095f7314139938c7419193b1c128054c1bbf10d0634e22c6e02d8e12279cac0bfa01d3058e0f8d5547ba0f71529c27e0084d4bde7\n" 2066 + ~x:"0c76bd647c6fafe7da1029b9bf36a9f042195691a26f36bbe0eca3d4b1e6cbb4\n" 2067 + ~y: 2068 + "2de9d27f1a030199ffbba770e08aeb1ff3708edf8ebb3a8e664e3bd1511db126ed87bc44c2d2af40b9d512c50a4d6c10b23e3ca61819f5841cbf5d0bd6c88d46f1ac6474ec20b9100b328cc155879166f46b6d71140b0cfb2b0725b64a38d70a91ca8f0e3baeec6125262c52a95d5ca5d5ff6f4482b1825006cd469f9e7f31769a73eddb5f7017f18bc747ae4fce450c4274f4abb960577d13b6a77dd99e67d11edb413e428e50726f7052e53565fa1d6fde91859573c9289289ffef0598802808ecc5501cb300e06405ed0febc3df23f40a1f6532410f7d9049b920216f7d5c7a728c8dd63a8d0060fb53b3543d62a636661750fd43775e80b509004351475f\n" 2069 + ~k:"71e12996d8aaa7cb1e730713fa441098347ca95eb39362c5a78ee6e847469c7c\n" 2070 + ~r:"09e654b17ab775959628e7cad0e27053ee495bcc29cc2a5e3b029660a77b1330\n" 2071 + ~s:"261ad41d6bce6d04d891a43c16ec2a8114e51f0e47b48b1dd1f3d626150338fb\n\n"; 2072 + case 2073 + ~msg: 2074 + "6f3f74388cc90b29c109ecbda08c79349dffdeb90722974d79d640620949448f66ae673eaf4d4af8c43da673a45ed152ea66fc97166baa7ce8beb666bd57ca43da6801c0ee5a5a9b50c5047935d7a8552c381d93eaf03cbbbb88ed0d3b5a2521b67612a4405120ef0205e89aeb48d577bcda3ad20e0a7cd07f8c9b215c845dd8\n" 2075 + ~x:"34c0d0de98c85be291b68a5b8c7fb3536b6f7447e8565ead9b002417f56f4616\n" 2076 + ~y: 2077 + "080ca412bd197c5aafa2c6df5933a6210fa54089826828d5496b453609a56b7d55d232fbe650dd9f62c05c050c026a8717a78b5db01614a19301c610d2b9964a7e3357c722a4c553273bf27f871b4b9241678c334e20827a5f511fe9319a075d12753ac0960df60870a08a12f09b9d3593781781a0cd75e9d81cc6b9b0d506d100fe972165b68297e6070db2d8b6ea32176d1562084f6a06e08e2929155b255d33853de6549e79f8b56049a1d02f29166d5f91cfbde5aaf6bcae56f5d2d90a9b4e8f6f450080cae8256c6619e9155523c2b2052255a8f6d9f53d8a897be5b0476002410bf798256f62bb1a81827c2c3fc4ecf9abfd77e74174787370864f05f9\n" 2078 + ~k:"8086cc691e7e793a5c2a81bd3d5a1ff5ae261d9336b33f103d983a817f7eaf7b\n" 2079 + ~r:"43993b68e847f6ba61d5ad4dc8f5ad70dabc317a7b6811c23e7f215f95415ed5\n" 2080 + ~s:"1ea727afdb907d1d5b2337c1ecea46c71eb0fc8363af23865a345202a762a7c5\n\n"; 2081 + case 2082 + ~msg: 2083 + "74a433c2d313f66232324df875b82563805d7ed682b266eaf962375e422b3abbfe3dce7f3c1960a1e4100f333e168d021968b48397e8cce9005e951fdcb096a9abea342cb5b08bab79ef0c431dd3a43de7d5bd6b86bea8872ba038b43a236a7356b03f89b09004ba2def663e6d299763b6cafcb6b150a57f82b890ff6d56f832\n" 2084 + ~x:"5c1a80e926de194995195c4cee9a2e874c7f6af0fa8a4b2df5432f9cfc86b643\n" 2085 + ~y: 2086 + "444fafab58db4d6f5283c3443d6478b5b78daa631bd4c3d9a28ed17281da4c1c2ef4d5ed576d66bfe5314e11fe68abffe4df406f6033edb84f36a38a3ce614601bc25841f9419afb2867d991e87b44c4b744e39b64079d9aad4b585d79c8e21c8f90990540fec8ae981f7483dc5523d216088a55cf2380ea8eb5246781290559ea1b208ad4d0f5871cb4d13cdca6ef34fdf2de63e209aa320cdf14185b8f5f60ccf93f398c1a6cf8b3ce3d98daf05e4cf90c39801ce35f01ec76a9f6035ce1b5ba107a5f66cf253b71fba3833e9969c314eb6d500005749231f799b0c79a555a10cdd69f8eec4c117d7c8b4ec6f60a1ee557b70c0dea380af53b92fdde8823ca\n" 2087 + ~k:"13dcb7c12aeb75a417a93a22ce94618716996c3350909cfbff6d38b603d377f6\n" 2088 + ~r:"3bda5b0c9e3da22f0b3e29356a2f7ddace6e9b24a063eb3f5a7d755f2eeaffb5\n" 2089 + ~s:"4cbb815320314a06538d2a6740e6bf9d022eac9aa25c7508f659f0f7c1f59c45\n\n"; 2090 + case 2091 + ~msg: 2092 + "f4eadfea117fd3d670cea28aa9d2602c951ed843e2e8cb2864074c8c9bccb0606ced83ae2980598cc3e1b047fca8659127406d8f59f5b7bbfe8ece6d3e42f87f4e42ebe92adaa1e6e92ced3dcacc2e0b2c98eade7c9c99da887e74db5a59132c1d7df7cde866cb2f3ca750852ba53e265e62bf7a93fd693e4a13751e186e9d6b\n" 2093 + ~x:"6abf7cc887544bf8d3256fb210848eb46281526b1e8cdf6c9204c4c46a747435\n" 2094 + ~y: 2095 + "104f44fd7669607644ec55e6ca4096c9a279472752a1753dbb9f2a6941b8122274c87d16f63d75dda9ebcfd6584b0cb374fd17581353d2a246ec0b378de60e9613131683c0568bb54d74457ad73de859a4f02445344d13ee928f3cda5134202a9388e64cf05f8190049df4e777709838d0c9d3bcb37eecdc38c1a5d2b471c4b910cfaa9a9ba81f69b4b45c40344029958fa40000e56881bc6a14864330d5b351c161208676cb852bf47970268d37d4bfe97b3b26ef5b785f50ebc8c47949dc9bd0b2e673fb040e26789f3f5cdbce8e4b78389992bb83eeb2b063e9e1db06a9ede933faef7e635effe5e1b1e21153dc6934197efa1fd68f18a40ed569746c8374\n" 2096 + ~k:"0711c4621a8bcd40ff3e8b95728ce67a000e1fa33741246d420b046bdec48657\n" 2097 + ~r:"36c086070368265f736e7bbad54aaf2482d26161f8057a97a4b8cd2b4ddd7855\n" 2098 + ~s:"31d99d736ea67014fe59cb2212c47eb920f2af44e32b65db15af83cbe8e6aa70\n\n"; 2099 + case 2100 + ~msg: 2101 + "cbc37afc75177a8386dce2c40c33b8f5dedc23113b4512cb96790f2dd74066103e0c45a9c6176ff96b7d719162003cee10fad6ccc198550a389275d21e708b6961523272ecd5efab5680ed741c2de025b02bbdc56315a442e437c43e3b378e6d62ea8878fd9789858a8c68a504bff49516e762a22ae513a2dceba9253b36f553\n" 2102 + ~x:"7c6ee86f45ddf8b87f8884f59aad9e320b73b246a80b26a645188a40a9bca62d\n" 2103 + ~y: 2104 + "356cc7370c840fa26b0d106c47a626e028a0c967c093810b520639bdda0d339b7fc29adc0d9036b9710358ef9f8c6c05252b278281b2afe7953886429e85d228fb5474acfd65213151e9da0aef86a66f9f9c59fa88fd48cc3addc83d7adf4afb1665049ed094020219c01958b697f22e652152e53bf4e8f68f476a58181ddd3f64344e9b87a08c5d0de49e7b3c2995840c200084e90a76d2c05f8b5c68e77192d0676b4219d4579cb2de0f2a93a916b4f9cfe0d8113dc4bbd97ed12d8ce0447fcf9df12e922c6383ca69c9de9ad320f9c5331adb6eb1d223079196a2939cc0a7259c512c478c943fe05736710e273e4b5867174de72e703b5e7bf7afdbc06427\n" 2105 + ~k:"685a19da2ee3dd94fe9726a32e712fac05eeffe11e3dd9f60e6f90af7c13e23a\n" 2106 + ~r:"5645ef65e8e9236d874d459e7a5809923c05d64b22757bfc5b5621079e84819c\n" 2107 + ~s:"65f4c8febaf3e9d46581b17685c4f2ec9b956421d034a2c1aaabee94b787a4f1\n\n"; 2108 + case 2109 + ~msg: 2110 + "8eb3685c3f406c5615e88accf4c0c7d2071b6c7bde5244994f73dc04f3cc0ab7e2b6664a1994e6eec52b62790a04328e436a2b4af3cbe3ba6e4c8f363a39b2529ef554c0c627f9f6b255928a39a465e60ac50ccf01f32c7ba483640344b6a8f583c90876b84d19554b0a4baabc2c240e296b12c819410cacffe7a7464419bee0\n" 2111 + ~x:"7e5e3d7255a629c39f88b6046fe0039159e44c2d2309b112ab05c61561d9e44a\n" 2112 + ~y: 2113 + "94ba486977f5982f2ae75e986b7e194461cc3d65cdbf26f936805d12d7f850aad7580206d7dc544cd12ca1891c9dc406c949e52b9febfa88836f1566d521a110bb545e07ba28caf07e1bbfa3b176cc917cc4bb45dae7f873b72dfa9000e9ab6083e705c0167d853dda114c429fd812a05961fc2e78ba9e68ccdb9dc67b116f10532034d9f0f7d39901dc643127c4309058f8ebf43b28a5ce534e29d6227c4ec27ccf777b0008df5ce8b8a19b5771725cb0f9f2a62bb41f0106c390803a307c60acbed6c2e1e0db5036e0e79ddcc3f718b29ca5aa022f2f0bbe815f9c0eb504fc9ff8d18a2da999023af8105cddfc6794dfdcc41333bccd446ad7b82a0a7bfe38\n" 2114 + ~k:"3966daabf7854949475ff47f3932393a73f21e275b3baad861a92a3ab322e376\n" 2115 + ~r:"27b4e3c3a45efa6131c3d005ca924dff11fdccf409c2a6993fcb505477b6e400\n" 2116 + ~s:"68a085bd130c4ec08aa9673c495ba5afd46c9ddad2052ba7ab396329d900d86c\n\n"; 2117 + case 2118 + ~msg: 2119 + "f2b02ac627b3f66baf4ebaa52b899adfd7071af53e78923182d8b4d5f3a9474251308b4dbd15fb6b657be65028a189353912d7c16d6d4989985c15cedc4343f0ceb680617bc7278511f9068abd613718a862513ee514fdf80cd25b6f84c48851e6a7850feaea57ea20deb1123ca4206bde8a93ff999ef789583e2c850d9e0635\n" 2120 + ~x:"7e52070b03aba0af4cad1cba0a733618e3adb7de873efba013878fa76331b5e1\n" 2121 + ~y: 2122 + "4e160d6970683f4d84eb88c55ba2da58d77f6374fc5127273d65e8ef96ccfff51df69b0e2fdf3e98f6d35e6a3dd9f7edd90bbae4c6581cd02ad01336c0086d4248eb1373480789f7d8333b831db3bae0bdb49789aab93cde1faf1ce88dcdc7a1a4f86143ce44f851ace459a5528c96195f4438ee7c1856ac61fd5035d839d62e48a1ab6bd23ad52f1f6ffed19826b6d7f6491cfb05003176f29079455443f0ab482150fac8e32a3902a4096775f342edee2daf4c4f338d455b4ea35d3975f72be85e98e87158486b4c3d6ec37a3703f63a3e19272ba5255089aacd30fa3979b458df616f57b7502b4291384562041f6188db503f3df7f5981da5705eb0f1d242\n" 2123 + ~k:"57c141f543386db3bd6a97121f93b47e38891796f02565058ec6a5ce65f7a212\n" 2124 + ~r:"6433bd33db0ac8261c691af3a27f52cdd4a65d799939faf279ac41788e7528a6\n" 2125 + ~s:"04cfdcb993382e8fd2db8d90dca80e94b17b432009852cd3f86625159e837c19\n\n"; 2126 + case 2127 + ~msg: 2128 + "2b4365a4ac6854c972da7347af1cecc6edcbae9d533b74fbe6db5712163a6ce984f9d7a4c54b44dd7555e5c2d2f3d098f31d517f8ebd330199a54b15297e5adee1bdf391581f1019b1ad72dcccd5484b51d275a368c69a7662e79f9b29c9a3084c94ae76da04f958c7d36cecc5d41d77f2302ff28f2ed9c66a0662cabf51c842\n" 2129 + ~x:"35b701b7d59aad55eb4299e0f9e0348baec875eaf62d2174bce92dd23302a81a\n" 2130 + ~y: 2131 + "58e635eec80bde1eb7bf2da20600617af29f0a191705676bc10f7553f7611126e4c4d44bcf14f7a9f48da6e1b1e54d0a715724af5bca93867090f9bfc92741dfe1dd4f06075ec2a9262da81e0dcabfcab9e694ddca86d0e1cfaa321e2b5818182eb620bd5d16bc27a2da035d4bc17807cfe8ae3038c5bbb8a023fb232814b91b99749f519de39aa0f434313323b1b58202c59119b0be217617047c9e2ea453d608562cb96c4f0851a7965b164f9bbe151f9c508ca209f1af659e363804c8d8fa1ad700e20866ec9a1e505b74bbab70cb472308431a3e87272febf7cce2c20ec37f5d68b4e47bf3741013723936db7c9b0f3ded964acb7f8ac9c5a6b4f28de198\n" 2132 + ~k:"1c6ceff82adebf8c81bb4842b90dbe2a12c9d07c3a9d4990d44106a1768bb082\n" 2133 + ~r:"00a7c664c544cd7b61749410dda33bb3a47c3eb5a9a7be5fba201a390cecfaef\n" 2134 + ~s:"6fbbda967b584bd9ec6a0ae76e0c552b3d42bf0e9cf2939caf6123f6e86046f6\n\n"; 2135 + case 2136 + ~msg: 2137 + "cab1d17666b0c9658cc78cfcba17a08e2989d3c202c8b5085531404d928c618b6e230b25c46a5b58437e4335fc040020ba00c863182325940f00aad330145e666d07e9e9d876137010932ae520d9188ca3d7993c905395219c55846d19b8fcdb1d0c1586b9b51097afd6972ae1472b0e20453f8fbd5d6aa9e4a9a9b3dc37dd8f\n" 2138 + ~x:"1ca2b291707ce4f70e366ee97b5da158a1c985ba4f252c572f0fb329e43f9cb9\n" 2139 + ~y: 2140 + "5022c8a6fa79b7aa11a3d7af5acebb2ef8c50b28d8f0e3a556196562d34131fb44f22c3be3f9895e35eee70aa53b6c67920c540ba6c1085b0ea818b12aea811f2dfaeb6daed976e362430798fdcca3912a0891e7d1c83b748af1e7689e038b490eb73f7fe6e0612e8f238580e78833b20727a602768ab2d59dda36e75146fa4d3664f7b0cef7be877afdcdba23004ee313a69fd61c326759e7e779ad750f7a5cad9fb2dd80a8eea6dcbda0195dcc17b38ad6f0e2ab68cfc69b15c572f85f20c3679c15a83099cf08a379055f8fbdd8f590d43bd12f75baf0eccd6c077ac7589aab8171e8875db0122e6c78617c13586143a7ebe904a7822bacf48a7527f7fa4e\n" 2141 + ~k:"4f1e2aae323c5309b3ee5d3b73e5d4090c75da17765559e118bfd1460c312859\n" 2142 + ~r:"7b8b75ac8514c68de0caa98e9de0b9607253d8088d3feadf92b83ffc26e088ce\n" 2143 + ~s:"4b10e17ff64a0eb72f70a863d00a9bf331bbb515ba3a9fef72753ad7f0df0be5"; 2144 + ] 1495 2145 1496 2146 let sha512_n256_cases = 1497 2147 (* [mod = L=2048, N=256, SHA-512] *) 1498 - let domain = params 1499 - ~p:"f63da3be9a9616196c6556f3ce6fd8b98bdda9137473da46fed970e2b8d147387a81922065d528a7d6433ebc5e35b15c67ea35a5a5bff5b9cef1cd1e6fe31dda52838da3aa89b9b4e8d9d3c0732ccc4f238ce1b416c4ca93f2c6800e5f4ed41c4f7615cec5531b98680b20dc63f73e70d803aacfaece33d45fa0e39d77c8508209528b9046b5917010791234397e412d22bc0b8d67cbd1cd28a32c2460a0bd86aaba0eea80e16e3245643171e34221760c203a56b8207a1009e6c1a2f6cda85f85c4f9e410b9499233c0ee072e465af4fb4fb9282c5c10e8234fd630ea92f0aae6b97a520db34475707b79a4c175265c0356ccbca827e3837df3d6d0576d9079 1500 - " ~q:"9b7463f8269f0b909abed10991684f36a64ac864e0d6d717c0ef21577a4c3907 1501 - " ~g:"972a75f606e8aa3a91ff08fd131a20f5963251304e3d1431b712fa0803d527fd710fb7eb27e52904971cd43ca977199a24dbeeb4b7bc2ba075d3b72eb6b2c5ad8f0e8b8f48c50b554c7e0711f4c7416330806672498f430292724bf98a8ea48c7f53d7b31d8b7528b1a6f087d2c27c335202835b1e314225b37aef8bfcec7d80920c4a460a3d68344ded75ed9ee867fa2a6945063894f563b68633b8b39f83a1aaaf5a96c7f422687e7c84cf8fb8cc5f4504dff087bcb26a95bbf8583f03b3a0e43a356b2bd7e25cdddf7a015300faecc6793c5ee99b6327cb8456e32d9115339d5a6b712b7f9d0301acb05133e3115e454d3a6dd24a1693c94aab5406504bf7" 2148 + let domain = 2149 + params 2150 + ~p: 2151 + "f63da3be9a9616196c6556f3ce6fd8b98bdda9137473da46fed970e2b8d147387a81922065d528a7d6433ebc5e35b15c67ea35a5a5bff5b9cef1cd1e6fe31dda52838da3aa89b9b4e8d9d3c0732ccc4f238ce1b416c4ca93f2c6800e5f4ed41c4f7615cec5531b98680b20dc63f73e70d803aacfaece33d45fa0e39d77c8508209528b9046b5917010791234397e412d22bc0b8d67cbd1cd28a32c2460a0bd86aaba0eea80e16e3245643171e34221760c203a56b8207a1009e6c1a2f6cda85f85c4f9e410b9499233c0ee072e465af4fb4fb9282c5c10e8234fd630ea92f0aae6b97a520db34475707b79a4c175265c0356ccbca827e3837df3d6d0576d9079\n" 2152 + ~q:"9b7463f8269f0b909abed10991684f36a64ac864e0d6d717c0ef21577a4c3907\n" 2153 + ~g: 2154 + "972a75f606e8aa3a91ff08fd131a20f5963251304e3d1431b712fa0803d527fd710fb7eb27e52904971cd43ca977199a24dbeeb4b7bc2ba075d3b72eb6b2c5ad8f0e8b8f48c50b554c7e0711f4c7416330806672498f430292724bf98a8ea48c7f53d7b31d8b7528b1a6f087d2c27c335202835b1e314225b37aef8bfcec7d80920c4a460a3d68344ded75ed9ee867fa2a6945063894f563b68633b8b39f83a1aaaf5a96c7f422687e7c84cf8fb8cc5f4504dff087bcb26a95bbf8583f03b3a0e43a356b2bd7e25cdddf7a015300faecc6793c5ee99b6327cb8456e32d9115339d5a6b712b7f9d0301acb05133e3115e454d3a6dd24a1693c94aab5406504bf7" 1502 2155 in 1503 2156 let case = case_of ~domain ~hash:Digestif.sha512 in 1504 2157 1505 - [ case ~msg:"8ab01510cfa33cfa5bcff003bba39996fa727693abf6ac010bb959b0b59a15306c0c3a1921af2a76717aa55b39fa3723f4c3229ca9acf6b741614bb551cde8a7220ab97d4b453bec1e05a0eaa42e382bbc7b9b84f8237dc8964ee5b66e9b2a4ca61cf675140efef54fb327a665def8d57ab097e8c53c643fcb58209c4215b608 1506 - " ~x:"5f6e545daef6cd1b8d9848dd98758807236ac0b7ff053b32c703eaa3b1147557 1507 - " ~y:"41197ce2233d7e48c803cd64c78f657923b9e36b871401f8661c21d8ba38c6b9b3239db767b11d1d401e5faecbf7a45860cc5f1a54d60286b7d6e1c99fd5b8c84ed851c5357d41ad60163f224d78c996143fff89dd3a8fe123dae1f621427fd8cce76ed138d68fa248f374ae233249625b93f3dd5937d15e541b7effa4df4fea7d52faced615bfe0348418ff93e69a20a52e55c76cc30f307f84e71e4aabc0825eca3a95b4bd58ebfb0029d23a169e9d80ba7d1c5fd35395e6602e089aa9918f08bae35ae1cac7af33694129e98f0dadadd90eaeb6eed25024390b1a60af794734c397b0f509865b134b2867c115d6f489b6dd7e3c82994b45dce2a23c6bc902 1508 - " ~k:"5fe61afddbdf04449b24295a52a1a037d3f31441a3cec138b7f0102db86ef132 1509 - " ~r:"6a47ea57ceaecc116d7190ff6c6dd9831ab75b4bf6cb291083e4268b486ed245 1510 - " ~s:"017355f698a32abe9a4d4a7dda7c85950cddc348ab8a6751e72fddc01aa5d1f0 1511 - 1512 - " ; case ~msg:"b2f56948a336982a5bcb4bb5d79e3fe5c36081bd286e6e021ab29b522f0be5ff5e81e638f23d0781c268a89b09332575cb31c0804bbd34c80589fb11570fc65b3f67612605a9411cdab3ac00ff3fce33ab22c46d26bf9c3fc5ad2d9018deb9b669b50fbfbaf8bed6230c7bd621d564fb1af953f0e82c5b5520ab97baccf58d6e 1513 - " ~x:"91e01626208863a954eb8987f8e987c8e6213536bb18f5afe3bd66a525bbadfc 1514 - " ~y:"72b84eb6a60c686f74f376e26b2e47e44a6d5dd92c06fde49faad0af9b11e43147ce9308ef3501a752e7bf18e9e6df3c0a49c44cd2515a05508f8060a61e6e6f1b2ecf14b338cf0fd8b7ccbe678d52dbdf20352c155a2bd517d827d6cefbf48c5679c998298e2186ef1098160dfb65914506a177943a4a058282382d327ad36f88301be693c02000c72463e682421a0237804dbb27335c78e8495fac7842d2aafebf90f3c3605f758615df989fdbd06e23e4ad6974b62384f0aa01027db89ac3dcb01cb5258cdbd9c19372a6c4aadf27298062ac9a16de2eb076e167ad7c65d0505c8fcecf359bb5d05cd22e7d48629af539fe7f60e23e957c84c7a61ac92bf8 1515 - " ~k:"6aff566d97cc48ef6bac507d64973c95da14fd704d3a5332aaaca2bdf21e894e 1516 - " ~r:"43704e96cc8d63e6f5b7e118cb7c030d0bd563b8f7a1a304b368a6c66d7e7fa8 1517 - " ~s:"490da43fd0f19fec4ee081cce25df6b2720b1a76b023c15704dd03ef1c3e48a7 1518 - 1519 - " ; case ~msg:"9ae8479327b8b8a57f570f6ec76a1ac6f02b198c6048a1f096e6ce5630b6caf363176413d88033b1cd07f4d3960a12dbae8a659174bb87c37aca6ec56ed5a6619b8ba676b650d97c6a21af023985dc361fa234b2b3c17e77703ba99ae3211260da10a60f240eeef478f2641184a281716ae57888117dba992853f494ac3caa45 1520 - " ~x:"8a5624694a25209a5fb3983ecac3fedf508e0b23e878f60a18ec0e897c379f7b 1521 - " ~y:"ce348b5cb3d36808422a5016dd5873df79f3cbb5e1b458e8c1110226047543d965769a112adb4fced0d146230962a8d413225cc70d810d40e6a72e6dc80db509400c09d263d66206966ed51ab65930a2aac99fcce3a398b64d59097683d2baa57682705abc32eb8c32d6f1e7d94ca17ed7067822cd20fba3795ed1843c01b0d7551c7c4c759d53a4191483bdc6e3121c2bc12607701f43e3ba382c6766819db07ef9c59586937514772c2eccde4c54d92575734c45a8e832c4417b43a92c9abd152259cc0a969bac64b237bb3a0826ae72919d7c2dd2efdf03e83701980c2a8f50ce6e44d7cc8848645bf40aefdf24fa7a6dce5a3b9aca6f017618a64d91ce4b 1522 - " ~k:"86c3ce567e7995a61bc00e088ff2f2a425433a453252b1a729d8d85ed506bdec 1523 - " ~r:"0091d750ad9a4f29573fd457a5891b68d4b6c15703a2bc192c7c620c4e4c4529 1524 - " ~s:"92c409c8977975a417d9f5e0e2dc70683a53a95662ad270ae35d496567a9a2fc 1525 - 1526 - " ; case ~msg:"e5a1a344c25ba0cbbcffe6800135f2ede81049180fb2759fd9e1af3b816ad5436a24faf29cf3ad91cf413332f454f74a9d4f5efe76cf02512c273cd525f04afdb5c24b0588d611d72153680d1e3995e0aa750e9077b0752bd4442bf7bfa8dba38e1c5e7ddd687f55aa54c138c7e6d5f064f3ec55942dc192dd996e553633afd6 1527 - " ~x:"976fb067157b214a80658e7ed2f566911b35b1671e5c0bdd55ff5811e822bf82 1528 - " ~y:"3859d4735c14baeec14b79cc2693ffcac900a2c26ec634a8e977d206ad6ec7b13f2d450ef04782ec0abb0da48f000628cec1f6e9a727bb59d7c0f0d743f513ac0925beb61bf3ad75824fffae1eb783eb1b68fc40d28770e280fde23844a144d4b1a95409b755c7ff2e5c67811f3b1c2eb96cb159a642d84dd7b5dccc2c0aef06d1cd54eac94a11273f9498f1e7a7cd79c108e496dcf573ef3a6610b7731ab14c162ce8377cb9b90788e356f51f4b51a1ec8bd86bd88fd4c38e62cad619ab8941bcb98a2f35ee512f4f8ffdd5ee70caed8467156b893b3532a0a2aa5199ceaecc5b194bc057964cf450668c44f27ec80de21ea1a415ee6a6569832394f6b405d1 1529 - " ~k:"1ef4f08defdb5c59a3df3358e083ce804c969d046ab67f2f938eb1a8f06a5d0a 1530 - " ~r:"443644e127e381b17bb66c53509718a58a30f927425806a62840119e78c293b7 1531 - " ~s:"3f01e5d1e9fdb1cfda25eff3caccf4edf599fea277201cf2b01ffd7cb1a9a727 1532 - 1533 - " ; case ~msg:"b88c212070be398a1f81e85dfd71dc2424a38ae38a9d61085186504f4c2cbfa492b76dbcc051cefde0616a7e3310b4bf17244de7d10f847ce2a9f665948e76724d8f1f4bb3a61919b2ec7dc47ad8a72cb5998b79fe3a156395e4ae88e682b1dd16c52d64cb4b31c39d4a42a21e6242dc0cdbb0acf3d47182638c5f216dc6e8b1 1534 - " ~x:"02163cda612e84eb5ea9e4e068b14c10dad073409154d86fea6aaede59538d2e 1535 - " ~y:"541c690f4ca0c42e5267646f78ef42fd68c363375b2e983be444e4819e63cdc129018bd3b8c6da8b707c196c35c93eabee10e875c41fd925bb3ce80696935d16313fd3a26858eccf2d507fc2a10950525c670dadc883dc6779ac1ce866d8820395f3541c863018337a6be944ddc644aaa6c007197d7a5f9aa53a5e1180ad51c98be9d561a85fe9734160ca35e4fadb02527ba0fa58041b4d96385f7f8ff6ae756add4968c0c2799c0d680f66c8ce96f498228738e3e87b7c866344db7d5a4ec3282431aee5951d9b4c83ec2a0cda36cb2e2c437363ceba4e8e9f6128439d12c51868d0cb1f61e53a68d4e71c5a9e7de43c6dfca26f1741aca916e4282653bfc1 1536 - " ~k:"42cc30e9591b42486ce9998ab7594ddabc5328ca2e931e08c75b76bbe1f8b978 1537 - " ~r:"078a7146a2c509b97a6a8c963baf1fbfbd1a2a5aa214a15ea45763f0e7930beb 1538 - " ~s:"2979cbf59adb70f28ac4fcb69297498f8163764c62b31963da9c8f9c0c43e075 1539 - 1540 - " ; case ~msg:"4adf1ed4fbb5b82d7a2b1a2938430753a6207da1cc049574f0a19314272f9a80c6a53498b78e5c0b7401ce485fd4baebc966da6c1fcb025816cfae32b58aa87f5e8885054735f93df19ed32c819786d4109dbda047d68c0589330715e10522643bbe27e32c0dc9c58336be305b4c0c981b40e0eeda0de461d8441c02c18ceac5 1541 - " ~x:"5b44bfbb69277fbe497ec729838886e7a787f336c246551526b660a7603d167e 1542 - " ~y:"8b6927fe293ac9111ba406125d6ebfbc30f96cbfd696fcac7dded42305c6105453accb1b0ca6f0f31601f8c34f96bb8ee4ccf149923a12821dfaa2a3859a39cf82567609b2060ff609232e90261d66cf31fb9264671f3f1bff6c8a958e5cd015dcc02dfd2f02fb6a443c2bf45abf13862059df98066e00311bb6438b7fe2d91e287553d25411f0fba47417c2902f978c57257ae4eaa3f99317d5adee0f9adf4d41e41072552b3f51eb9936a7f63cc28b466fab6429d06868d18ca09aba634093767192049b02bcb752eb674c98a86869d6726f742e57ef8c3d4531171c64f03e10a4e44039a44d407ebfc6b56a7cdf6b17394b53b5604347c51cf375551b7306 1543 - " ~k:"5f02472e007874056abe7194e80845b81baeaf4f6f564d3640373757f4252f57 1544 - " ~r:"5b201116d8bbc87db99001707b567e7c3451d802fa6c679bf3db3456711a1913 1545 - " ~s:"5be7e4c493fd5d19b771373141294daad97656a3dbe3fd2abbd3b6c62c166126 1546 - 1547 - " ; case ~msg:"bd491cf68b34f7ba9afe0c6ef5f2b7956ef964465f28b2797bc1d6e670a6d81730ee2993d0b4aa96905157025d775ba104e7c19b3b372e852026b1286cbc6a48a10cb9378e97ad966f9cf03917ee8db75b6264e9b0a48a0ae10c2f46444710d4234126ce456b9fd11ab7a3504948d046d5f438d893d9b1052b8fac9547415472 1548 - " ~x:"609a372d3844ca8224dfe780b425e1a7c00d09957a862de6f640af57c086dd6d 1549 - " ~y:"a92e446510764ee1cf81c6b59b5160a7608ff8952d045dd69f034fdfef93f633607ec209b106c6ac8f0cc6ffa64bb9a4484560b838d6f24c993a954efc9d5ee16656aaba2a0d5a94e7a346c7e501af83f131db9e0cab8789fab19bd591ec227f39b349be7f8d0df58ca0396efb1e76549335904b88ec21cd3265c543c4e80e9dde7cb5c9ea8cdda23d96ef1c3839ade8ed4a5cd5fd98b79bceeed9c641c5a7758d0529aceaf27b5014f13dfcaa267a14a0841b36897b6e1e8917b7f7cbf7cff1d1953ac43cc04ab06cf111e006497eb42f28cbc905d6f1cd5d8394857983e1c9e552015a451d0c13a6848a8fc56b79dec1723a8067ff18931c852ceb81affec1 1550 - " ~k:"8c70ac971b83f159d2e6ec26bca1463aadbc8e9987593f49a9258f7f0de9cb38 1551 - " ~r:"0cf526d8a0f9c912d143f3f8afded4598b2a5aaf200e0749ea27defeb7f28f3a 1552 - " ~s:"877a9066f6c5ae78251d9d140bcf39ae912d18bf131bdc7e9d61012daaa4292c 1553 - 1554 - " ; case ~msg:"c00a8a2fffd10bc2eab63b8e375d0c10f9dfae2848ba42afe6085aeec26e21af3eaa493ce4b3d95a31fa502a60ab88e805f4fdf889ed91c15421718084cd0d644795749b1a6b183d74782d52c7babf7400393cee698af5dc010c0ff7f5acdf0208f93ee7e4ef58da123dfde7f0a34e209bbaec61007293fd11afa60b6522c45d 1555 - " ~x:"683e924893dbbd751e0a3f910867471a6410fef562cca9f464943abd88e0430f 1556 - " ~y:"7560105b8586c4532bf1b51e0d2cf9a713a5ea5d40e262ce01ebdaf1ee53d857129e1529a0f8dff63e86202c111c6eb289439cb15cd59fc218abe619c9516250f127fafe9a53076274f306f0b7871cffbd156b1a8819795f0a9955864756650274b83e67caa4e215f833afd5a77d0594b21b4b54356a98a56a0bf6177faffb9fdfd888d6538a1ce76059854bd1f0a20761281d7b751757c6ecc9b1e8131196d0669597213ae73edb9965da9ff372420851155011f691a03a7f1e2040291575b86f595998a06ef79f4eadbae2bd9e2e477dd72684d8efdc1e835f7f0f5c93635c181b96cc7c0eaa27ee62c9227ed9485a8c822b3224e9e2b7acc10956f3d49a6f 1557 - " ~k:"3bf5f524e3a3903c149958d10ae68f0a87a03821445a98b0b9d08a3689738853 1558 - " ~r:"98fee10c85ab46d334758734819e68b5046439cd0b66be26d43760613ac77b8c 1559 - " ~s:"665fab98dd437e06a4f877ee218986e37c2cb2d237e598d98f1b7d4e829a846b 1560 - 1561 - " ; case ~msg:"27f01b47d15f7d196f2667b75ed15b89d7443fb4fab068f4adb67175ca70071d52e270f68964f9fb0e0e14ed5d2954a33d93807acf3c82500e8b9f5fc5510cc3bd6aaa1daac8309128ef4c0b4cac026425aefdd7e69c22c32e5f8d2a6e8f2ea291ac33da6c71a1953e443c0ea206568aadef2b96466cbf76bf149d89d86f529f 1562 - " ~x:"285dcba140162fc203651c5ff7f1155341436c5c5c98e1e9df192b3c948a16ca 1563 - " ~y:"38fa994a1f61ab79ee7a7e6f689c38f6c2826f06647b1663cd812adb36d7fd7ccc50e9a90d02bf7c3f12a228c692c056fb3bd608f51aa401022c839791e6a678185cd31d88cc661af29e5d238142181dd3f6e7c8b05785221e62fdb36c71e07f51d732e7e0cab520a7f2fc5b1831b0a6ba280e00321cb9a025db6538abd672463dbff5ca81993676bcbaf0f6e9c754f24d654ee7879bc03d7d4bc8e8ca58fb9b3929a3c38365cd2e205729e9def0a00108dffe9407271e17d355ec4b29003e0caf0c5b2acb9bd8e52d4410baa9b97a49874c14beebf03abf28a9ec59bc1738b8dd4223d47aa336acbca7662fc69a6fefeecffd47f6737ecda331d1ba5cdf023d 1564 - " ~k:"4029e06b437cbcf8e0788a393ba3aad0d182564ab6a53565eec1755c4f4b6e2f 1565 - " ~r:"8dad02c02ad34fe4e758ff5c81d5384c40d2c49d0ac777bad1cdebc58ec01cfd 1566 - " ~s:"0fe4e1f6875c113f1c17a0f0ed228d44213f8d7e2f15567e57ceb2e8b1098f7d 1567 - 1568 - " ; case ~msg:"73cc5e4a188d2814466941389014ea45a1a06525d2069cf4883ebcb5f22ab128c00f041cf69fd94b33fdade78548f6523c838b87ccd868f3d3d0a9a000f278ba54048b9cadac7a99d98def51713191ad83e5232e3e86497245c80bc710fdd7faaad88ce92c894f8cad3de0075caba337a222cb7a3d7c2d937bcfe4b6e69d388d 1569 - " ~x:"742242f1cde89559dadae5e2cea28cf402c60ea9af2a5282202281f55a0d4d04 1570 - " ~y:"5266427ad4c1cf3ea229377ad397c7d5613512fc27f2ce37407d2cea8e1999aebb8f3767ee96cb927ebdd43b8dbc10ba2c47843d3f43368d9e442bf51ebcf20b48b543a4c388bb3ae3e4027acb657d1bf74abeb8b998421308770f70b3f7b1d910219a1210260340123b95dba187e00cb067f7e37792341202554bfc8a235fc01ecb099ec3615a67a3610d4d8c2dad16087024f5973eb18400c29c05d6984d1c15c159422827c0dbb2bf4509d710c4972ee93be7283aadd991ae8ef0e97312118f195d304fbe96d5aebfb21203eae6117831f9be9099d3d476b83f65ab225f8be493a8ad21620f259d8a44200810c8e562aea8e7a6bc238c129b19f2531a6af0 1571 - " ~k:"57d9723e0d17ed96a3a77ad47be6eafc06a5aa01b59b89be70a756d37dd0df2b 1572 - " ~r:"77236b33b04285425775ee3f658b3761295cbff8e4bc05abdd22e3d78b1b6da2 1573 - " ~s:"43fdbd936ab40459f6843056ca77e125b6ec5ad945041c1f6a2770be9dfcc682 1574 - 1575 - " ; case ~msg:"c0746befd2afc6ca15cdb145c18462c515bd42794c4c7ee513cd9aeb0fc6fc3048b6c7231634984a1be824c775f9c9b028255f5b3c3d8fa08d47aba07755b5f1b5b008933eff35838f15a02ba9366c1036d3ff19e88199ef86a88227272cf4e4e00ffad9c36bebac30578b00214fb29bae43cf555ed431a2f24922430b1496fb 1576 - " ~x:"47c0c6f4e6b56cdf1e1d9b63ff3739edec9c3d5a7c990492a1c72aa1494fcf9c 1577 - " ~y:"431eee49090ad58f4a874c2eb5897969fafe3274bd7486b65e3519e4309d636ace6864d5ca4d8448a357cafac15ac3cb3bd7b2755b3cb6db0af1a4e91b2d1fcb28561b170faf2e0690071bc0f6e42b2d82abe5646ddb8f9b99ee1daf5906036f395d824d080bfaea103048b3f44d0636bc7a6a88e9b004a363b99d24a89b6e97379b20bacf48c7ae2e9bf7e281fe3b4d7eb947a102396d523a1e85ce17fd25f271f3c221a5681e9fb77d64d6241039ac8a85da32741bacf00660e421fe850a0fe73a08ee3a9b069c6d9114c1975272127468f9008552ea4cdf9d96561ea69a646695242500f2318bda82da633ef1ae0497014a637b15a572ddddec070d19d884 1578 - " ~k:"3598a6006fa3f8b8f9b7ff96ba06bf3837a1a1a92892e4a268c75285bfa6d660 1579 - " ~r:"796d7dba322d92a083da7a588fb6238dc86b1fc5104ed600c9b4c688edf805e9 1580 - " ~s:"012c1ff4de8ee386b951275e250581d661d030a4d8fe115432288ab0a4bd46cb 1581 - 1582 - " ; case ~msg:"b8b915cf4ea3b0c4cdcd8b2a06479e71bb4797294b6c41ca870d3cb2ec2cb5a49f6bfe5bcd10be609ed3e1882a312395fc991345aba5b566e67960b42913db669041ea30c29947edde7bdcfc0896b97660740d6c79f0088665f51dadcfa07f7be44821d60a8ffde4e5cb1f98139ff91c9c6f3126596344c5f7eff40049d3f9ae 1583 - " ~x:"0eb74b5186697af279ce72da74f1ebf59921ed425da0f3eea17517eadddb7c90 1584 - " ~y:"1b3722764264e17994f3343bf260c73575d106f6307f2eaa3f7dcd5af804463ddb6bbe38a38f5ab5a8ae6701317cf6c267049fc9b84078241f82d3c6b7e5beba5c1427030297f1df258148e5f9eb41eb20a86877fcc06e5373cd50562613d307649539d28cb52418d42fd59758b61185e792992b5a581229b43403d793b04d878eb9b9d12ea10d2e64d153d3fa41881fe79a67ac408a5348d79239567dca96e1ead3c6ac22dbcdbcb5185bf8ace57660a4252104e5047cac87851d2815b12ae8ae96ab2f33345ea1cf5f2e58a4ddcba26265c06df65afcc6e852b3f910c8778de28a9f098158ed0eca652dda2f9f4ac8a17a9b252410ec5973a6063b642568f1 1585 - " ~k:"37128d19b2108a8e8fdf2cac984d45851078a194bb9946a4db260f27b4650439 1586 - " ~r:"6b4b0e1e7cbdefedb1df1f529ece47891f7b9e959a3f8556ba4bef7bb9856560 1587 - " ~s:"7e933b44ede6b2e941b60c37dcd1568284def229c0a2bb9093f4829000c4409a 1588 - 1589 - " ; case ~msg:"dffd458a808f1889d7f3d6197f0e41920ad731124cee308cb90d2361b23fee969c0e105835549e5d0a3f7690d5862d4cd6ccb33ad18094c85c9650d75b248496390a0b89e7dc7dc0d3a6130dd97789ebf105f8e55d8f0a1162fb3c6b529e2a80dd51e9045ef8ec42ca4bc46abb6539588b531c9799560cf4ea806c3d93d043e5 1590 - " ~x:"36ff71ed608f351c736042f3b638a89666007cefe8ab487e512d76fedce1ff35 1591 - " ~y:"ea437ad0ee9264de8792b677207e547090b32d6ab460b4d589d842ed0a0b4fb4c635e4443bf60e46cba8d226f659c76d2ca01c69707ba6d977255c4584b74740a7cdec4c973e3d16ab6af60cd3123ca12ed5971e69eaffa3da0770d8e1228889cd6825e1b85846f4f7ecdb33f1e5c7acd6b2add1308c5cec439728d0cc625eb89df34fb9c0dd4568f979deead286c50145903a0dccca7239874b4683d367ed31696eecada90dced8a9b1e01364b8794660c60f40590794c95a614c04563c92d444b5ecf01286b1bffe9ed9ef915b4db820ea5c9a5b3dedcf89a3e2c37871d21b763990c7bbf44418f91cdbce4361eeb227516cb344409d2c651f0dc29ec82623 1592 - " ~k:"91797ee940a167a57de7619334638f1b3ba63f9065b69f56dc04e4020a1682eb 1593 - " ~r:"3152fc286fed44f28b1af2d537592c5691d6798caed90591b5888b0d6fe6bb07 1594 - " ~s:"7bff61a8676f0df189654f25c5812b341dd17f4f44667789cc887c191bf47202 1595 - 1596 - " ; case ~msg:"a6516019727d95639db038f90306a8d94fac5243dc7b67c3568d63d85dead1cfddbb2b330b619589bd582af15f0811177504fd5b7aad7b298647a3f64797e3da5fe5bf87b65c2ddec576a8f40660686b808ba42e54bfd0e9e48082d6904f8e19050e54ea4797a2f401ff7c9f3d217b526c03be9201c0dc1b0e8e054bbb32c382 1597 - " ~x:"396102ad116ca2e419b9229667a31737344d0d7854cac8930af18e12a9e2d63e 1598 - " ~y:"9779eb5338dcae7377b1847018ce72c1ed4c55292a963f81608ef332050f0a484519aa96b18bcce8e1b49c11a200c1ab4a75726bcc842485df6314e5c39fec622d819434294dbe1eb647885ce841527c03481b7f22ee586d8c2b1a8471a2757bffbdd9c26f125065685509ff0e4c8b826d73c6e12f6d4b9319cdfa72c069e07b2d2c254b330c06f488d6598c7476ce0f3330c97ec36b7c10871388472451a34afb7b4d4e251f9f72a4a38a6851aab86507b283e890c31ba96d0a1e5572637b2d8467060c0736d11d0744e332a19f59ae2920894e9cffacfeda64ae1ff4869882df3b690c7ce8fe0eb88171e4f2ab8624e6ac77dc8907613235163e0a2c7d9fd6 1599 - " ~k:"79753fbd43773b6757c01663b8f5ef642801aa5ccbf32082c780f71a22c4cb0d 1600 - " ~r:"7222d5eb392460defe8fe3df18fa534f3060235f1e8dce5370762ec6fc11e690 1601 - " ~s:"4351c428031cd9af567b1163037a4e376962620c4ec23c43b7105879f95bf614 1602 - 1603 - " ; case ~msg:"1ffa7cf55f92f234a24bd3296744d543a433c907c1f77d8b706f4b6262d096e2dfe713fa9ca80e68579396fc11a12c0331cfb7745d96b005204e483fbf8f9fdc458e2ca8613406069df5f44918eff8c5f54b8b4d972e07a4b8e06d8426a70874cefe6e93404c1eb381c2d0701c37f85afb1601a09fff8ecfdaf6cb64ad9bd8b7 1604 - " ~x:"24039963cc5ac26a977728b852414f60a287174186ea812e00a5c8a8a5355daf 1605 - " ~y:"18e298e6301389d48644674f8339487a8651b0768dee425905e803ab357c7f9fa05dd5e2ee84bfe105a092716274557e063d086e78b781a43c56a4e0ea115c5cfeac57a4c9b7e1effb89413689928f1546feb30738586d36ffe338083ee2bf5c5bd344bc3db2a7977de2b1ab5ba006d9ee93ef8688a7d10cafe27af3e671013a816984196bfacf002335fe7414423ed8bdc80327372b0d460866480bdf073c9def7977131b06e28d14ae1a816d3222ebaadcc8d7c300aa820e0328af66f742061aff5d4b7176a994ad69b390bbdd619fce047dc7d15a48ea71afa72040bb14eeaf4a2b23d99b4d977beb6d806101021eb0c3a0e31e54579e58c953b55b6e3245 1606 - " ~k:"2ae1af11ff810141c37b1c23796e54f027b4eb7c2f0c412b6c83076de3d4aba1 1607 - " ~r:"21d70ed955b09ea302fb792978d12501071a2e8e2cc8f659decd3df24e37c466 1608 - " ~s:"2cdaaee2a5a3dd74a67795f93ac1d8416223836c76f7fe31c72ec6170925fd73" ] 2158 + [ 2159 + case 2160 + ~msg: 2161 + "8ab01510cfa33cfa5bcff003bba39996fa727693abf6ac010bb959b0b59a15306c0c3a1921af2a76717aa55b39fa3723f4c3229ca9acf6b741614bb551cde8a7220ab97d4b453bec1e05a0eaa42e382bbc7b9b84f8237dc8964ee5b66e9b2a4ca61cf675140efef54fb327a665def8d57ab097e8c53c643fcb58209c4215b608\n" 2162 + ~x:"5f6e545daef6cd1b8d9848dd98758807236ac0b7ff053b32c703eaa3b1147557\n" 2163 + ~y: 2164 + "41197ce2233d7e48c803cd64c78f657923b9e36b871401f8661c21d8ba38c6b9b3239db767b11d1d401e5faecbf7a45860cc5f1a54d60286b7d6e1c99fd5b8c84ed851c5357d41ad60163f224d78c996143fff89dd3a8fe123dae1f621427fd8cce76ed138d68fa248f374ae233249625b93f3dd5937d15e541b7effa4df4fea7d52faced615bfe0348418ff93e69a20a52e55c76cc30f307f84e71e4aabc0825eca3a95b4bd58ebfb0029d23a169e9d80ba7d1c5fd35395e6602e089aa9918f08bae35ae1cac7af33694129e98f0dadadd90eaeb6eed25024390b1a60af794734c397b0f509865b134b2867c115d6f489b6dd7e3c82994b45dce2a23c6bc902\n" 2165 + ~k:"5fe61afddbdf04449b24295a52a1a037d3f31441a3cec138b7f0102db86ef132\n" 2166 + ~r:"6a47ea57ceaecc116d7190ff6c6dd9831ab75b4bf6cb291083e4268b486ed245\n" 2167 + ~s:"017355f698a32abe9a4d4a7dda7c85950cddc348ab8a6751e72fddc01aa5d1f0\n\n"; 2168 + case 2169 + ~msg: 2170 + "b2f56948a336982a5bcb4bb5d79e3fe5c36081bd286e6e021ab29b522f0be5ff5e81e638f23d0781c268a89b09332575cb31c0804bbd34c80589fb11570fc65b3f67612605a9411cdab3ac00ff3fce33ab22c46d26bf9c3fc5ad2d9018deb9b669b50fbfbaf8bed6230c7bd621d564fb1af953f0e82c5b5520ab97baccf58d6e\n" 2171 + ~x:"91e01626208863a954eb8987f8e987c8e6213536bb18f5afe3bd66a525bbadfc\n" 2172 + ~y: 2173 + "72b84eb6a60c686f74f376e26b2e47e44a6d5dd92c06fde49faad0af9b11e43147ce9308ef3501a752e7bf18e9e6df3c0a49c44cd2515a05508f8060a61e6e6f1b2ecf14b338cf0fd8b7ccbe678d52dbdf20352c155a2bd517d827d6cefbf48c5679c998298e2186ef1098160dfb65914506a177943a4a058282382d327ad36f88301be693c02000c72463e682421a0237804dbb27335c78e8495fac7842d2aafebf90f3c3605f758615df989fdbd06e23e4ad6974b62384f0aa01027db89ac3dcb01cb5258cdbd9c19372a6c4aadf27298062ac9a16de2eb076e167ad7c65d0505c8fcecf359bb5d05cd22e7d48629af539fe7f60e23e957c84c7a61ac92bf8\n" 2174 + ~k:"6aff566d97cc48ef6bac507d64973c95da14fd704d3a5332aaaca2bdf21e894e\n" 2175 + ~r:"43704e96cc8d63e6f5b7e118cb7c030d0bd563b8f7a1a304b368a6c66d7e7fa8\n" 2176 + ~s:"490da43fd0f19fec4ee081cce25df6b2720b1a76b023c15704dd03ef1c3e48a7\n\n"; 2177 + case 2178 + ~msg: 2179 + "9ae8479327b8b8a57f570f6ec76a1ac6f02b198c6048a1f096e6ce5630b6caf363176413d88033b1cd07f4d3960a12dbae8a659174bb87c37aca6ec56ed5a6619b8ba676b650d97c6a21af023985dc361fa234b2b3c17e77703ba99ae3211260da10a60f240eeef478f2641184a281716ae57888117dba992853f494ac3caa45\n" 2180 + ~x:"8a5624694a25209a5fb3983ecac3fedf508e0b23e878f60a18ec0e897c379f7b\n" 2181 + ~y: 2182 + "ce348b5cb3d36808422a5016dd5873df79f3cbb5e1b458e8c1110226047543d965769a112adb4fced0d146230962a8d413225cc70d810d40e6a72e6dc80db509400c09d263d66206966ed51ab65930a2aac99fcce3a398b64d59097683d2baa57682705abc32eb8c32d6f1e7d94ca17ed7067822cd20fba3795ed1843c01b0d7551c7c4c759d53a4191483bdc6e3121c2bc12607701f43e3ba382c6766819db07ef9c59586937514772c2eccde4c54d92575734c45a8e832c4417b43a92c9abd152259cc0a969bac64b237bb3a0826ae72919d7c2dd2efdf03e83701980c2a8f50ce6e44d7cc8848645bf40aefdf24fa7a6dce5a3b9aca6f017618a64d91ce4b\n" 2183 + ~k:"86c3ce567e7995a61bc00e088ff2f2a425433a453252b1a729d8d85ed506bdec\n" 2184 + ~r:"0091d750ad9a4f29573fd457a5891b68d4b6c15703a2bc192c7c620c4e4c4529\n" 2185 + ~s:"92c409c8977975a417d9f5e0e2dc70683a53a95662ad270ae35d496567a9a2fc\n\n"; 2186 + case 2187 + ~msg: 2188 + "e5a1a344c25ba0cbbcffe6800135f2ede81049180fb2759fd9e1af3b816ad5436a24faf29cf3ad91cf413332f454f74a9d4f5efe76cf02512c273cd525f04afdb5c24b0588d611d72153680d1e3995e0aa750e9077b0752bd4442bf7bfa8dba38e1c5e7ddd687f55aa54c138c7e6d5f064f3ec55942dc192dd996e553633afd6\n" 2189 + ~x:"976fb067157b214a80658e7ed2f566911b35b1671e5c0bdd55ff5811e822bf82\n" 2190 + ~y: 2191 + "3859d4735c14baeec14b79cc2693ffcac900a2c26ec634a8e977d206ad6ec7b13f2d450ef04782ec0abb0da48f000628cec1f6e9a727bb59d7c0f0d743f513ac0925beb61bf3ad75824fffae1eb783eb1b68fc40d28770e280fde23844a144d4b1a95409b755c7ff2e5c67811f3b1c2eb96cb159a642d84dd7b5dccc2c0aef06d1cd54eac94a11273f9498f1e7a7cd79c108e496dcf573ef3a6610b7731ab14c162ce8377cb9b90788e356f51f4b51a1ec8bd86bd88fd4c38e62cad619ab8941bcb98a2f35ee512f4f8ffdd5ee70caed8467156b893b3532a0a2aa5199ceaecc5b194bc057964cf450668c44f27ec80de21ea1a415ee6a6569832394f6b405d1\n" 2192 + ~k:"1ef4f08defdb5c59a3df3358e083ce804c969d046ab67f2f938eb1a8f06a5d0a\n" 2193 + ~r:"443644e127e381b17bb66c53509718a58a30f927425806a62840119e78c293b7\n" 2194 + ~s:"3f01e5d1e9fdb1cfda25eff3caccf4edf599fea277201cf2b01ffd7cb1a9a727\n\n"; 2195 + case 2196 + ~msg: 2197 + "b88c212070be398a1f81e85dfd71dc2424a38ae38a9d61085186504f4c2cbfa492b76dbcc051cefde0616a7e3310b4bf17244de7d10f847ce2a9f665948e76724d8f1f4bb3a61919b2ec7dc47ad8a72cb5998b79fe3a156395e4ae88e682b1dd16c52d64cb4b31c39d4a42a21e6242dc0cdbb0acf3d47182638c5f216dc6e8b1\n" 2198 + ~x:"02163cda612e84eb5ea9e4e068b14c10dad073409154d86fea6aaede59538d2e\n" 2199 + ~y: 2200 + "541c690f4ca0c42e5267646f78ef42fd68c363375b2e983be444e4819e63cdc129018bd3b8c6da8b707c196c35c93eabee10e875c41fd925bb3ce80696935d16313fd3a26858eccf2d507fc2a10950525c670dadc883dc6779ac1ce866d8820395f3541c863018337a6be944ddc644aaa6c007197d7a5f9aa53a5e1180ad51c98be9d561a85fe9734160ca35e4fadb02527ba0fa58041b4d96385f7f8ff6ae756add4968c0c2799c0d680f66c8ce96f498228738e3e87b7c866344db7d5a4ec3282431aee5951d9b4c83ec2a0cda36cb2e2c437363ceba4e8e9f6128439d12c51868d0cb1f61e53a68d4e71c5a9e7de43c6dfca26f1741aca916e4282653bfc1\n" 2201 + ~k:"42cc30e9591b42486ce9998ab7594ddabc5328ca2e931e08c75b76bbe1f8b978\n" 2202 + ~r:"078a7146a2c509b97a6a8c963baf1fbfbd1a2a5aa214a15ea45763f0e7930beb\n" 2203 + ~s:"2979cbf59adb70f28ac4fcb69297498f8163764c62b31963da9c8f9c0c43e075\n\n"; 2204 + case 2205 + ~msg: 2206 + "4adf1ed4fbb5b82d7a2b1a2938430753a6207da1cc049574f0a19314272f9a80c6a53498b78e5c0b7401ce485fd4baebc966da6c1fcb025816cfae32b58aa87f5e8885054735f93df19ed32c819786d4109dbda047d68c0589330715e10522643bbe27e32c0dc9c58336be305b4c0c981b40e0eeda0de461d8441c02c18ceac5\n" 2207 + ~x:"5b44bfbb69277fbe497ec729838886e7a787f336c246551526b660a7603d167e\n" 2208 + ~y: 2209 + "8b6927fe293ac9111ba406125d6ebfbc30f96cbfd696fcac7dded42305c6105453accb1b0ca6f0f31601f8c34f96bb8ee4ccf149923a12821dfaa2a3859a39cf82567609b2060ff609232e90261d66cf31fb9264671f3f1bff6c8a958e5cd015dcc02dfd2f02fb6a443c2bf45abf13862059df98066e00311bb6438b7fe2d91e287553d25411f0fba47417c2902f978c57257ae4eaa3f99317d5adee0f9adf4d41e41072552b3f51eb9936a7f63cc28b466fab6429d06868d18ca09aba634093767192049b02bcb752eb674c98a86869d6726f742e57ef8c3d4531171c64f03e10a4e44039a44d407ebfc6b56a7cdf6b17394b53b5604347c51cf375551b7306\n" 2210 + ~k:"5f02472e007874056abe7194e80845b81baeaf4f6f564d3640373757f4252f57\n" 2211 + ~r:"5b201116d8bbc87db99001707b567e7c3451d802fa6c679bf3db3456711a1913\n" 2212 + ~s:"5be7e4c493fd5d19b771373141294daad97656a3dbe3fd2abbd3b6c62c166126\n\n"; 2213 + case 2214 + ~msg: 2215 + "bd491cf68b34f7ba9afe0c6ef5f2b7956ef964465f28b2797bc1d6e670a6d81730ee2993d0b4aa96905157025d775ba104e7c19b3b372e852026b1286cbc6a48a10cb9378e97ad966f9cf03917ee8db75b6264e9b0a48a0ae10c2f46444710d4234126ce456b9fd11ab7a3504948d046d5f438d893d9b1052b8fac9547415472\n" 2216 + ~x:"609a372d3844ca8224dfe780b425e1a7c00d09957a862de6f640af57c086dd6d\n" 2217 + ~y: 2218 + "a92e446510764ee1cf81c6b59b5160a7608ff8952d045dd69f034fdfef93f633607ec209b106c6ac8f0cc6ffa64bb9a4484560b838d6f24c993a954efc9d5ee16656aaba2a0d5a94e7a346c7e501af83f131db9e0cab8789fab19bd591ec227f39b349be7f8d0df58ca0396efb1e76549335904b88ec21cd3265c543c4e80e9dde7cb5c9ea8cdda23d96ef1c3839ade8ed4a5cd5fd98b79bceeed9c641c5a7758d0529aceaf27b5014f13dfcaa267a14a0841b36897b6e1e8917b7f7cbf7cff1d1953ac43cc04ab06cf111e006497eb42f28cbc905d6f1cd5d8394857983e1c9e552015a451d0c13a6848a8fc56b79dec1723a8067ff18931c852ceb81affec1\n" 2219 + ~k:"8c70ac971b83f159d2e6ec26bca1463aadbc8e9987593f49a9258f7f0de9cb38\n" 2220 + ~r:"0cf526d8a0f9c912d143f3f8afded4598b2a5aaf200e0749ea27defeb7f28f3a\n" 2221 + ~s:"877a9066f6c5ae78251d9d140bcf39ae912d18bf131bdc7e9d61012daaa4292c\n\n"; 2222 + case 2223 + ~msg: 2224 + "c00a8a2fffd10bc2eab63b8e375d0c10f9dfae2848ba42afe6085aeec26e21af3eaa493ce4b3d95a31fa502a60ab88e805f4fdf889ed91c15421718084cd0d644795749b1a6b183d74782d52c7babf7400393cee698af5dc010c0ff7f5acdf0208f93ee7e4ef58da123dfde7f0a34e209bbaec61007293fd11afa60b6522c45d\n" 2225 + ~x:"683e924893dbbd751e0a3f910867471a6410fef562cca9f464943abd88e0430f\n" 2226 + ~y: 2227 + "7560105b8586c4532bf1b51e0d2cf9a713a5ea5d40e262ce01ebdaf1ee53d857129e1529a0f8dff63e86202c111c6eb289439cb15cd59fc218abe619c9516250f127fafe9a53076274f306f0b7871cffbd156b1a8819795f0a9955864756650274b83e67caa4e215f833afd5a77d0594b21b4b54356a98a56a0bf6177faffb9fdfd888d6538a1ce76059854bd1f0a20761281d7b751757c6ecc9b1e8131196d0669597213ae73edb9965da9ff372420851155011f691a03a7f1e2040291575b86f595998a06ef79f4eadbae2bd9e2e477dd72684d8efdc1e835f7f0f5c93635c181b96cc7c0eaa27ee62c9227ed9485a8c822b3224e9e2b7acc10956f3d49a6f\n" 2228 + ~k:"3bf5f524e3a3903c149958d10ae68f0a87a03821445a98b0b9d08a3689738853\n" 2229 + ~r:"98fee10c85ab46d334758734819e68b5046439cd0b66be26d43760613ac77b8c\n" 2230 + ~s:"665fab98dd437e06a4f877ee218986e37c2cb2d237e598d98f1b7d4e829a846b\n\n"; 2231 + case 2232 + ~msg: 2233 + "27f01b47d15f7d196f2667b75ed15b89d7443fb4fab068f4adb67175ca70071d52e270f68964f9fb0e0e14ed5d2954a33d93807acf3c82500e8b9f5fc5510cc3bd6aaa1daac8309128ef4c0b4cac026425aefdd7e69c22c32e5f8d2a6e8f2ea291ac33da6c71a1953e443c0ea206568aadef2b96466cbf76bf149d89d86f529f\n" 2234 + ~x:"285dcba140162fc203651c5ff7f1155341436c5c5c98e1e9df192b3c948a16ca\n" 2235 + ~y: 2236 + "38fa994a1f61ab79ee7a7e6f689c38f6c2826f06647b1663cd812adb36d7fd7ccc50e9a90d02bf7c3f12a228c692c056fb3bd608f51aa401022c839791e6a678185cd31d88cc661af29e5d238142181dd3f6e7c8b05785221e62fdb36c71e07f51d732e7e0cab520a7f2fc5b1831b0a6ba280e00321cb9a025db6538abd672463dbff5ca81993676bcbaf0f6e9c754f24d654ee7879bc03d7d4bc8e8ca58fb9b3929a3c38365cd2e205729e9def0a00108dffe9407271e17d355ec4b29003e0caf0c5b2acb9bd8e52d4410baa9b97a49874c14beebf03abf28a9ec59bc1738b8dd4223d47aa336acbca7662fc69a6fefeecffd47f6737ecda331d1ba5cdf023d\n" 2237 + ~k:"4029e06b437cbcf8e0788a393ba3aad0d182564ab6a53565eec1755c4f4b6e2f\n" 2238 + ~r:"8dad02c02ad34fe4e758ff5c81d5384c40d2c49d0ac777bad1cdebc58ec01cfd\n" 2239 + ~s:"0fe4e1f6875c113f1c17a0f0ed228d44213f8d7e2f15567e57ceb2e8b1098f7d\n\n"; 2240 + case 2241 + ~msg: 2242 + "73cc5e4a188d2814466941389014ea45a1a06525d2069cf4883ebcb5f22ab128c00f041cf69fd94b33fdade78548f6523c838b87ccd868f3d3d0a9a000f278ba54048b9cadac7a99d98def51713191ad83e5232e3e86497245c80bc710fdd7faaad88ce92c894f8cad3de0075caba337a222cb7a3d7c2d937bcfe4b6e69d388d\n" 2243 + ~x:"742242f1cde89559dadae5e2cea28cf402c60ea9af2a5282202281f55a0d4d04\n" 2244 + ~y: 2245 + "5266427ad4c1cf3ea229377ad397c7d5613512fc27f2ce37407d2cea8e1999aebb8f3767ee96cb927ebdd43b8dbc10ba2c47843d3f43368d9e442bf51ebcf20b48b543a4c388bb3ae3e4027acb657d1bf74abeb8b998421308770f70b3f7b1d910219a1210260340123b95dba187e00cb067f7e37792341202554bfc8a235fc01ecb099ec3615a67a3610d4d8c2dad16087024f5973eb18400c29c05d6984d1c15c159422827c0dbb2bf4509d710c4972ee93be7283aadd991ae8ef0e97312118f195d304fbe96d5aebfb21203eae6117831f9be9099d3d476b83f65ab225f8be493a8ad21620f259d8a44200810c8e562aea8e7a6bc238c129b19f2531a6af0\n" 2246 + ~k:"57d9723e0d17ed96a3a77ad47be6eafc06a5aa01b59b89be70a756d37dd0df2b\n" 2247 + ~r:"77236b33b04285425775ee3f658b3761295cbff8e4bc05abdd22e3d78b1b6da2\n" 2248 + ~s:"43fdbd936ab40459f6843056ca77e125b6ec5ad945041c1f6a2770be9dfcc682\n\n"; 2249 + case 2250 + ~msg: 2251 + "c0746befd2afc6ca15cdb145c18462c515bd42794c4c7ee513cd9aeb0fc6fc3048b6c7231634984a1be824c775f9c9b028255f5b3c3d8fa08d47aba07755b5f1b5b008933eff35838f15a02ba9366c1036d3ff19e88199ef86a88227272cf4e4e00ffad9c36bebac30578b00214fb29bae43cf555ed431a2f24922430b1496fb\n" 2252 + ~x:"47c0c6f4e6b56cdf1e1d9b63ff3739edec9c3d5a7c990492a1c72aa1494fcf9c\n" 2253 + ~y: 2254 + "431eee49090ad58f4a874c2eb5897969fafe3274bd7486b65e3519e4309d636ace6864d5ca4d8448a357cafac15ac3cb3bd7b2755b3cb6db0af1a4e91b2d1fcb28561b170faf2e0690071bc0f6e42b2d82abe5646ddb8f9b99ee1daf5906036f395d824d080bfaea103048b3f44d0636bc7a6a88e9b004a363b99d24a89b6e97379b20bacf48c7ae2e9bf7e281fe3b4d7eb947a102396d523a1e85ce17fd25f271f3c221a5681e9fb77d64d6241039ac8a85da32741bacf00660e421fe850a0fe73a08ee3a9b069c6d9114c1975272127468f9008552ea4cdf9d96561ea69a646695242500f2318bda82da633ef1ae0497014a637b15a572ddddec070d19d884\n" 2255 + ~k:"3598a6006fa3f8b8f9b7ff96ba06bf3837a1a1a92892e4a268c75285bfa6d660\n" 2256 + ~r:"796d7dba322d92a083da7a588fb6238dc86b1fc5104ed600c9b4c688edf805e9\n" 2257 + ~s:"012c1ff4de8ee386b951275e250581d661d030a4d8fe115432288ab0a4bd46cb\n\n"; 2258 + case 2259 + ~msg: 2260 + "b8b915cf4ea3b0c4cdcd8b2a06479e71bb4797294b6c41ca870d3cb2ec2cb5a49f6bfe5bcd10be609ed3e1882a312395fc991345aba5b566e67960b42913db669041ea30c29947edde7bdcfc0896b97660740d6c79f0088665f51dadcfa07f7be44821d60a8ffde4e5cb1f98139ff91c9c6f3126596344c5f7eff40049d3f9ae\n" 2261 + ~x:"0eb74b5186697af279ce72da74f1ebf59921ed425da0f3eea17517eadddb7c90\n" 2262 + ~y: 2263 + "1b3722764264e17994f3343bf260c73575d106f6307f2eaa3f7dcd5af804463ddb6bbe38a38f5ab5a8ae6701317cf6c267049fc9b84078241f82d3c6b7e5beba5c1427030297f1df258148e5f9eb41eb20a86877fcc06e5373cd50562613d307649539d28cb52418d42fd59758b61185e792992b5a581229b43403d793b04d878eb9b9d12ea10d2e64d153d3fa41881fe79a67ac408a5348d79239567dca96e1ead3c6ac22dbcdbcb5185bf8ace57660a4252104e5047cac87851d2815b12ae8ae96ab2f33345ea1cf5f2e58a4ddcba26265c06df65afcc6e852b3f910c8778de28a9f098158ed0eca652dda2f9f4ac8a17a9b252410ec5973a6063b642568f1\n" 2264 + ~k:"37128d19b2108a8e8fdf2cac984d45851078a194bb9946a4db260f27b4650439\n" 2265 + ~r:"6b4b0e1e7cbdefedb1df1f529ece47891f7b9e959a3f8556ba4bef7bb9856560\n" 2266 + ~s:"7e933b44ede6b2e941b60c37dcd1568284def229c0a2bb9093f4829000c4409a\n\n"; 2267 + case 2268 + ~msg: 2269 + "dffd458a808f1889d7f3d6197f0e41920ad731124cee308cb90d2361b23fee969c0e105835549e5d0a3f7690d5862d4cd6ccb33ad18094c85c9650d75b248496390a0b89e7dc7dc0d3a6130dd97789ebf105f8e55d8f0a1162fb3c6b529e2a80dd51e9045ef8ec42ca4bc46abb6539588b531c9799560cf4ea806c3d93d043e5\n" 2270 + ~x:"36ff71ed608f351c736042f3b638a89666007cefe8ab487e512d76fedce1ff35\n" 2271 + ~y: 2272 + "ea437ad0ee9264de8792b677207e547090b32d6ab460b4d589d842ed0a0b4fb4c635e4443bf60e46cba8d226f659c76d2ca01c69707ba6d977255c4584b74740a7cdec4c973e3d16ab6af60cd3123ca12ed5971e69eaffa3da0770d8e1228889cd6825e1b85846f4f7ecdb33f1e5c7acd6b2add1308c5cec439728d0cc625eb89df34fb9c0dd4568f979deead286c50145903a0dccca7239874b4683d367ed31696eecada90dced8a9b1e01364b8794660c60f40590794c95a614c04563c92d444b5ecf01286b1bffe9ed9ef915b4db820ea5c9a5b3dedcf89a3e2c37871d21b763990c7bbf44418f91cdbce4361eeb227516cb344409d2c651f0dc29ec82623\n" 2273 + ~k:"91797ee940a167a57de7619334638f1b3ba63f9065b69f56dc04e4020a1682eb\n" 2274 + ~r:"3152fc286fed44f28b1af2d537592c5691d6798caed90591b5888b0d6fe6bb07\n" 2275 + ~s:"7bff61a8676f0df189654f25c5812b341dd17f4f44667789cc887c191bf47202\n\n"; 2276 + case 2277 + ~msg: 2278 + "a6516019727d95639db038f90306a8d94fac5243dc7b67c3568d63d85dead1cfddbb2b330b619589bd582af15f0811177504fd5b7aad7b298647a3f64797e3da5fe5bf87b65c2ddec576a8f40660686b808ba42e54bfd0e9e48082d6904f8e19050e54ea4797a2f401ff7c9f3d217b526c03be9201c0dc1b0e8e054bbb32c382\n" 2279 + ~x:"396102ad116ca2e419b9229667a31737344d0d7854cac8930af18e12a9e2d63e\n" 2280 + ~y: 2281 + "9779eb5338dcae7377b1847018ce72c1ed4c55292a963f81608ef332050f0a484519aa96b18bcce8e1b49c11a200c1ab4a75726bcc842485df6314e5c39fec622d819434294dbe1eb647885ce841527c03481b7f22ee586d8c2b1a8471a2757bffbdd9c26f125065685509ff0e4c8b826d73c6e12f6d4b9319cdfa72c069e07b2d2c254b330c06f488d6598c7476ce0f3330c97ec36b7c10871388472451a34afb7b4d4e251f9f72a4a38a6851aab86507b283e890c31ba96d0a1e5572637b2d8467060c0736d11d0744e332a19f59ae2920894e9cffacfeda64ae1ff4869882df3b690c7ce8fe0eb88171e4f2ab8624e6ac77dc8907613235163e0a2c7d9fd6\n" 2282 + ~k:"79753fbd43773b6757c01663b8f5ef642801aa5ccbf32082c780f71a22c4cb0d\n" 2283 + ~r:"7222d5eb392460defe8fe3df18fa534f3060235f1e8dce5370762ec6fc11e690\n" 2284 + ~s:"4351c428031cd9af567b1163037a4e376962620c4ec23c43b7105879f95bf614\n\n"; 2285 + case 2286 + ~msg: 2287 + "1ffa7cf55f92f234a24bd3296744d543a433c907c1f77d8b706f4b6262d096e2dfe713fa9ca80e68579396fc11a12c0331cfb7745d96b005204e483fbf8f9fdc458e2ca8613406069df5f44918eff8c5f54b8b4d972e07a4b8e06d8426a70874cefe6e93404c1eb381c2d0701c37f85afb1601a09fff8ecfdaf6cb64ad9bd8b7\n" 2288 + ~x:"24039963cc5ac26a977728b852414f60a287174186ea812e00a5c8a8a5355daf\n" 2289 + ~y: 2290 + "18e298e6301389d48644674f8339487a8651b0768dee425905e803ab357c7f9fa05dd5e2ee84bfe105a092716274557e063d086e78b781a43c56a4e0ea115c5cfeac57a4c9b7e1effb89413689928f1546feb30738586d36ffe338083ee2bf5c5bd344bc3db2a7977de2b1ab5ba006d9ee93ef8688a7d10cafe27af3e671013a816984196bfacf002335fe7414423ed8bdc80327372b0d460866480bdf073c9def7977131b06e28d14ae1a816d3222ebaadcc8d7c300aa820e0328af66f742061aff5d4b7176a994ad69b390bbdd619fce047dc7d15a48ea71afa72040bb14eeaf4a2b23d99b4d977beb6d806101021eb0c3a0e31e54579e58c953b55b6e3245\n" 2291 + ~k:"2ae1af11ff810141c37b1c23796e54f027b4eb7c2f0c412b6c83076de3d4aba1\n" 2292 + ~r:"21d70ed955b09ea302fb792978d12501071a2e8e2cc8f659decd3df24e37c466\n" 2293 + ~s:"2cdaaee2a5a3dd74a67795f93ac1d8416223836c76f7fe31c72ec6170925fd73"; 2294 + ] 1609 2295 1610 2296 let sha1_n256_cases2 = 1611 2297 (* [mod = L=3072, N=256, SHA-1] *) 1612 - 1613 - let domain = params 1614 - ~p:"fd5a6c56dd290f7dd84a29de17126eb4e4487b3eff0a44abe5c59792d2e1200b9c3db44d528b9f7d2248032e4ba0f7bfc4fafc706be511db2276c0b7ecffd38da2e1c2f237a75390c1e4d3239cba8e20e55840ecb05df5f01a1b6977ad1906f2cb544ccfb93b901ad0966b1832ad2dab526244a3156c905c01ac51cb73b9dcd9860d56175a425d846485d9b1f44a8a0c2578e6cf61947bc1a1392fdd320b16a9d70455fe436f2d47ded8e8e605f7486eb578ea7fc4ffd13c07f9996af159fd411e9451403278dd1141a8c926b35c96384bbd6bee09c46f44c36b1ffc7197f5e925dbe0544a68e6ab8c18e426a466b392f9c27dd79fefa9ca163cc5a375539a8559f277f657a535d1964c6a5e91683ef5698ebaa01ef818dbf72cb04c3ff092d188866f25cd405108f566b087f73d2d5beb51fac6de84ae5161a66af9602c7e4bfc146f4820bdfc092faeac69133e4a08a5b202a12498a22e57bad54674ed4b510109d52b5f74e70e1f6f82161718cd4cf00cc9f1958acc8bddcdfbd1fbe46cd1 1615 - " ~q:"800000000000000000000000334a26dd8f49c6811ce81bb1342b06e980f64b75 1616 - " ~g:"99ab030a21a5c9818174872167641c81c1e03c9b274cfbc27bc472542927766de5fa0539b3b73f3f16ac866a9aec8b445ded97fbff08834ed98c77e7fc89e5dc657bef766ff7fbf8e76873e17bee412762d56fe1141760ab4d25bafd4b6ef25b49a3506632d1f8e10770930760ec1325932c5a4baf9e90154264ddf442ec5c41fed95d11525151dbcfb3758149bad81c62b9cff7816b8f953b8b7c022590d1584e921dc955f5328ac72983ed5cf0d04056fe0d531e62f8f6c9ab3c0fcd44e14860b7311d2561c77c1d32f6c69dc8f77968c9d881ad9db5e0c114fda8628bca0335eb7fb9e15e625aabab58fc01194c81bf6fb2ce54077b82250e57c6a7b25deb6ee39d4b686a5c307a7612b2d85ee92512413dea297e44f317be7ceb70a3328af0b401001a418562b8ffe4e9771b4b4a8e0b40c791349d5d4e459fe620a1a2fc72e2f6ca28567d4c2632bbde1b49864c06bb12619f132c1da8f571ef613eac739f66ab3914cb3fa1ab86e05e5082ebaa24ebeea4cf51beefc27df512fe3fee7d" 2298 + let domain = 2299 + params 2300 + ~p: 2301 + "fd5a6c56dd290f7dd84a29de17126eb4e4487b3eff0a44abe5c59792d2e1200b9c3db44d528b9f7d2248032e4ba0f7bfc4fafc706be511db2276c0b7ecffd38da2e1c2f237a75390c1e4d3239cba8e20e55840ecb05df5f01a1b6977ad1906f2cb544ccfb93b901ad0966b1832ad2dab526244a3156c905c01ac51cb73b9dcd9860d56175a425d846485d9b1f44a8a0c2578e6cf61947bc1a1392fdd320b16a9d70455fe436f2d47ded8e8e605f7486eb578ea7fc4ffd13c07f9996af159fd411e9451403278dd1141a8c926b35c96384bbd6bee09c46f44c36b1ffc7197f5e925dbe0544a68e6ab8c18e426a466b392f9c27dd79fefa9ca163cc5a375539a8559f277f657a535d1964c6a5e91683ef5698ebaa01ef818dbf72cb04c3ff092d188866f25cd405108f566b087f73d2d5beb51fac6de84ae5161a66af9602c7e4bfc146f4820bdfc092faeac69133e4a08a5b202a12498a22e57bad54674ed4b510109d52b5f74e70e1f6f82161718cd4cf00cc9f1958acc8bddcdfbd1fbe46cd1\n" 2302 + ~q:"800000000000000000000000334a26dd8f49c6811ce81bb1342b06e980f64b75\n" 2303 + ~g: 2304 + "99ab030a21a5c9818174872167641c81c1e03c9b274cfbc27bc472542927766de5fa0539b3b73f3f16ac866a9aec8b445ded97fbff08834ed98c77e7fc89e5dc657bef766ff7fbf8e76873e17bee412762d56fe1141760ab4d25bafd4b6ef25b49a3506632d1f8e10770930760ec1325932c5a4baf9e90154264ddf442ec5c41fed95d11525151dbcfb3758149bad81c62b9cff7816b8f953b8b7c022590d1584e921dc955f5328ac72983ed5cf0d04056fe0d531e62f8f6c9ab3c0fcd44e14860b7311d2561c77c1d32f6c69dc8f77968c9d881ad9db5e0c114fda8628bca0335eb7fb9e15e625aabab58fc01194c81bf6fb2ce54077b82250e57c6a7b25deb6ee39d4b686a5c307a7612b2d85ee92512413dea297e44f317be7ceb70a3328af0b401001a418562b8ffe4e9771b4b4a8e0b40c791349d5d4e459fe620a1a2fc72e2f6ca28567d4c2632bbde1b49864c06bb12619f132c1da8f571ef613eac739f66ab3914cb3fa1ab86e05e5082ebaa24ebeea4cf51beefc27df512fe3fee7d" 1617 2305 in 1618 2306 let case = case_of ~domain ~hash:Digestif.sha1 in 1619 2307 1620 - [ case ~msg:"ca84af5c9adbc0044db00d7acfb1b493aab0388ffbad47b38cd3e9e3111cfe2cda2a45f751c46862f05bdcec4b698adfd2e1606e484c3be4ac0c379d4fbc7c2cda43e922811d7f6c33040e8e65d5f317684b90e26387cf931fe7c2f515058d753b08137ff2c6b79c910de8283149e6872cb66f7e02e66f2371785129569362f1 1621 - " ~x:"433cfd0532ccfd8cdd1b25920d2bb7396987b766240379035b0e86527ce9c52d 1622 - " ~y:"e7c2ee18c3aa362c0182c6a56c2584628083c73e045beda8d653690c9c2f6544edf9702c57c455273905336a5f5171107a313cd7d0b0f50f8d3342c60219f22a9023394059d05f464c4496d55dab6eb0898527ff4cf5678e7b5bfb5e18d92c4a9d73288cce14530fc4702f6d0397ec39a880c4a72d358730c56633386ede028023c1791f3164d1574e7823c79b8a3ca1343ea166ba6f02b7ff7e9ef2198db107f7cc159f3b6a1c00a78c355c566deb0ac6fde3f633cb9177a1fbc6c1766ca021d5fec470101abb440d2f06982181a8c92b7cdd765336b9a1e1ab70283d6db0a963fb648c37c4e29a74c37577291049ab47cdbc104c04db966681ea8ebb9f00cf4c4a5462117379575fbda4b801979451fa94b19b4e93656705c0f734f3e0914bb96c1e2b8a0fb68faf14296efdf3300ad95bcde8b67cc4b26e6488eef925cfaeac6f0d6567e8b41355f89d1c2b8fe687bfa2df5e287e1305b89b8c388c26196090ac0351abc561aadc797da8ccea4146c3e96095ebce353e0da4c55019052caa 1623 - " ~k:"40f503abd70fd49a76c67a83e08b062b3fd465ad92be433c080e5f295bb9f559 1624 - " ~r:"21ca148cdf44be4ae93b2f353b8e512d03ad96dafa80623fde4922a95f032732 1625 - " ~s:"73e48b77a3aa44307483c2dd895cb51db2112177c185c59cb1dcff32fda02a4f 1626 - 1627 - " ; case ~msg:"3ccad0018519a898f87d8ce5f28c0d93ab16c51addf4173322cbc49d48ca9ea37ebe8bc9d8c1b3f783f8cf59cf3fcba10a393eb2ddd989ce258e73788ce74b0ce8223d24e993cfeafa49cc8ec1b8ecee017d83a11bb7034c779206c364ac463cfed3047e1a2bf5c591773b1d882b310bfba2db87893c89a5442c0845bf644e21 1628 - " ~x:"306c1304b380b7c3e09e7a4b489c64a295582bb3e03ce526f13d7482ef8263f0 1629 - " ~y:"3750d36353bfd2e9973e26a555bcf0d834d3d6620cb66579199e040ce8eccfaee660046e78df66e8ff641523046adcf425b8319db2447680194c3a386b5201dd1ac6bf3e66394e939eaaaca4fd3f386fcfe1d5ef4524b06c5ed9a15746f24baef1eec41e683bf35371084495d4da8e727aeba307fba000a769a234e3c4609704b3ba4dfd6a8644fba56083dac848751b52a8c2cdc47946cd21ea24383cc6244f000918e9a23276b606c5688565c44ddf7788181b789565a6becd257123bb81a2cbf9db7fa384e0ca41804ed7cd3c9ca0e1f8bb390bff50213b0629682409933770f6e03a5c4e7e89ade90255609786f6b2fc5a7aa7566bcf7f725aead4cf456c5f5ed7dc3e91e20d94d1aa2f6568c97abdf21e0ba8cbfb6561305cb45175b1abd7f39b9a11c797926b944f5d13c3d70e0b2a8ca18e1f5cda8ce6ac43ecbc1fef881f5eef5a842fd5984ad1e321a317005ad478cb47c9cff61267f1d496fded0a48328d629b7b200c441634ee908879011745bcab6660e15583748014d6de2fe2 1630 - " ~k:"223e52fc516c0a79f55a5474321264fcce78c050cf79b3d9961b37e24d7f32d3 1631 - " ~r:"1ef7723345b2013b71104ceedbe7a9cad430018968bb295b672c2b57b9a108b9 1632 - " ~s:"72852da485c0836a8ebdbc4c996f7f6cb65e99391ce06b19a7187618e9a95584 1633 - 1634 - " ; case ~msg:"1fc98288857fb3a83ab507465a53c079ed66679cafdfb8653bfdebb03020fe86a943182d4f1377d58eca3c7710d32e210d8d03728bc69e1b8003944ffedaa1b69ae6cc506302bd6917019f588cc29501cc8263572ebc0feb153877174bcfdbad4a58659175d2de71d5f5019c46d112b6631cf0c3f912aac83140cd56cdf903ee 1635 - " ~x:"047a5e52039da40523feffe63312887e4d1ecdf64f32abb31dfe680bd1513077 1636 - " ~y:"335372770c0e8e591a367de99833bde6f01240bc6e236a5b4e36233e120b8ee6d1c19c77f4cdbc294d3278c3d4cf73ed9e8ea5032b0524a391cf293b35ee7e023430222216d9f18b45022f4d5f9385f6384d9faf1a0ffa4a800da23b937651a09e82c22285b9de6a408e23386ffa67abb9d1c71cda7bc0c93525fcd79e83153e746070782467858b697ad14914673033fedb2d7a105ad2d438daaa35b503b518314ac370fc5b1112d4fe514e5835d9a86de25e6b35691392d1cd04836d4126b295b8a89f217d581258af95277b8b91c31e6b0d23a7c52b0ce2641cf1a252838b6e28e226cfc4fa9dc914c5f675fc900ed680dc1aa9e1d17193c432af4032ebab954191327083c59a5f64c1ea18107ce4d7211d1c22f04805ed548fc22df4b162f30b6ff3a7f7c38a5a95fe824d2961180e98b30208dc7ea7071f792261d45c7bb7b911f3b19c3ee0171a326c033cf5fc2bf79de7d5115ac568e04789cb44e08f3a8627a1b1f3762342b49b7679bd7edbe47bc3ee9c3f02db15d53256a5ea2847 1637 - " ~k:"69a22d61b152af35c1b43deda88d5ad456d38df75b318b82712b2690a5f2f647 1638 - " ~r:"5dd0c7e8a3993b9de0676a579c897ea39943a43dbec5996e58c1985b541d7c1a 1639 - " ~s:"67971001822a08a2148a6b1adb50274a57dafe896fb04a12a6f99707555306ac 1640 - 1641 - " ; case ~msg:"fda9765cc91a9db922aec7b13fc32ac4ec4e3b8534f9e95af96e8ebeab89d847dcd150444868cfaf4213f8d8baa6b1d0886224e2afd0aeb93d59b886572088d05bf721c7adfb54da47c6c4851204a7a92a11deb39ba17cf6c07fb7ce8ba350a99d018d4ea64bd56d1d9f8f7d88157f190fcb372acf6f8d31cf7b795b36c10f5e 1642 - " ~x:"7f6ce353841963c8a6ff3405713e361ef9f1e0765e665195e7c147dd98120c4f 1643 - " ~y:"0539cc992ca70f913537b1211dd326d85f7531baa6be0583ba45b9571baa81cd5828050dcd9ab7a203bc4fe1d874f76ec1f34d935579ed2132255789d7e6010cf504b4c7f586d44a716600acf8a04ad30cb7ca055d7223f9761cdaebfdf7ef72bdea3dfcd020069a969c560160f0534676beff5ea611fcbc0fd47c867f3163e1371e1de67a1a3c3e37168bf0be79c09f45f2bc43517aeea0100a2a25d148ff1990c06143fa253d8306f48d77362224bc3efe93389e922def0fd11d1992f550ed8294b6136547ffd612b0bc8e4ee90b3100bb89922177147be0083281bf663f8370417fa790d4105eb98cc126f5005b7c08bc211dea2898aa653c3d2b51fc67732bff5644e804aae69200c416035aa0ba5a14cc439b569f462117b7dfcf3f2cc13e723a93ff9533208f20241daf36cd16066be3dba20117cb145d756f5a6f79ce2356a051647aedd645bfa6faf8f80a6fdf3eec42ddd42bb2e7b7738296e23978c8bd63b8045953e06cef1263bfe03be2f61b16007df1eb198567a7bc6bff274e 1644 - " ~k:"01cd3cdd3feb4d1a995103b1520fef17f60cd9370ad59b3efe9383a2c0126f00 1645 - " ~r:"55c2b27e769fac99b47bc0a54ff1821c7a46be6001ab664fb68fb1bafc04446f 1646 - " ~s:"3059db42a399c428f3cfbb102d6c0409b06f20068d1ca8cbea4858ac6e5de1d3 1647 - 1648 - " ; case ~msg:"e49a12b8d761ef7afbcb1c377eedf629d08cc509a8753a5b92e26a2397365156e7c081bcb4686695575c6a64f5d77dfd550b04df390aa55e0d051c759f197a751a6041e2dd0959f902f2e359a167d880c49cfa81e7196fa1604ad32a8017071f098d4cb346b39266fbe75659dfc6607bf0d829640782cf3e12e38376c5a99282 1649 - " ~x:"28d9bc1d9aaba882427ee26c262bd4003aaeba422bf053b0dde14bb6d6d74bdc 1650 - " ~y:"ee7fff18822ff454a207f9db542d24298bb5edb11d80ddc6ddb9bfae0c952d4fe8d9db0f1a86e8a0f2193af7caaee7264d74106de5af0a6c14f710bb863eb7dc167a1e4378b6cdb7ab6841c664e9824529119773578ef55b7c35ed221ef070dd4690b4c12f27673e5d1fe964ffe29da57e2d1acd21ef13e0669fa97668bb199b56a3a53e10469133022081cdf62648100dca267c4f6a3ca3a75b573bb1b39c8a4e1fcf81269e9e1b10c63f5ba4fe75cf7139d038d02f5f534aa081fce732cd5051609bc06f18874dd01121d3c179f0c3f0399c185eebdc34635b3139f1ca50fbffb3b0ad12e481c1a64682143793f072c7db8b5b9eef41ccdd66b904139d644442a92f6255edb9bc1234e27d07a6ba32b1f14cdf98a22c6a12300dff50ac1b65568b6e915541bb386ec725da444467ca25e81448cb78375146ad2078a830e7d905de9ad7d89559c9d430cf5f419ce945704a426ab264016ed87c90d97f51a7d6e1ee2f51bbb3a8de81391697b0e422df9e5d3551e93374e5f38016b296d53bc2 1651 - " ~k:"0650ebc3e21bf1d90ffb3ef5a707013dfce78fbd2c21a0da9c8106d1fa98a46f 1652 - " ~r:"21d34df605237975db31b864f98c9ab6e465dbf0b3fc5868d67cd6cb3a13963b 1653 - " ~s:"70c48807d62d1fe74d58959347ab12c97b500d20607ed2a95d8a388fee265812 1654 - 1655 - " ; case ~msg:"28f7a067a0ea7f0a4d797cea3939f66b281ed19cc98b8563ef375798b40614f4dd85ac2fcfccbc5ebf0ac93228c0b72937a481ca4f9df7a7e5d2e5da9af04874dcec35035f6a7db493793aa2361fb66ef2eedb7574d04e2147c357298a2adf99aca1eebe00cefa44b39157eb1e94aa8aa98d545151fbb4de67070b3904cce930 1656 - " ~x:"0c5088f5d337802770e6f98349d53461f13161020ab9a241efed4faed2e569ee 1657 - " ~y:"cdb9922d69e99c7f34a9210e2afc5be0115da4aaf682d9ea37788e0b6caa6fde13c88e51f558820668b59d14c06d2cbe6549d3f06d10dbeee46f59154cd467ae19e16be25e6f6cd238ccd1947fc581562d30ca329bb327258ca4aeb901f814414058b6f169a45ff55e40232d7870499ae78c0513777140752d55f0a470761bdcff5a6609cca2d1809f184b298718071d216a14ad01f56cccced23969607b62d4d140c9ef28507674f59fecc7e7ce8ad2636a5c53f070ad317c8cd0231f500a790ef69ac786000faf68e7b7854d6eb26499a9d524cbf8f373ca41dd6a2fa5198eba2a8e228f5ab29be9f6d450f7f5a149aeb20d8a277971fa6e64a0de36c8750afc381961756975621f287a3950f88402c5081fe0c54f44f9fa7c50df906b264098853646b3d05a4f04c6f1bbc6c440f7e7358d3a72b29f7643f4406b7db173690d40aa2938eaf01874d2ba8094cc5be1145b2b2ee9e7cf15bf398e50832d95017430b1869938732cdd1df593f5db2b2bd71308d8c253d254ef39b475e249d890 1658 - " ~k:"2be962ca1f82b879255e20d6971e633ba68582a5137bc55058fa42b48ddf0566 1659 - " ~r:"12de252da2593c5969a6496ae808d851cad1ded2959ea89057a92e5ec91c5f95 1660 - " ~s:"165338075e6a4fea0b238f9fac904b7b33dbee5a552646dfbed827f6d28d6492 1661 - 1662 - " ; case ~msg:"0e156b0bd84595155ef4fc213dfc7e46bf27a89c275723e0984076b027c49cb2eee6ac866d75333581cca6f897e11418fb37ba5cab1391cd237e2c6ab3f11a055d3bd03f425baaabe5a6a34eba4b118af73edd610787cb8eaf476bd217048208ea4c1d0591372947a1c0ef94696568983424fd1d802fc911e7bf71224afdbdd9 1663 - " ~x:"2c4d972bb3539876b8f32cc645cff0d4be877175f31a028b9bfe973f0651789a 1664 - " ~y:"d0973641d56d8baaa2c2d430501dff44eaf9a3657478799134b0f335ae94ff2791dfd494401332486ba637683e704bd985f526919e661a2280d99bd48262b6c9305e0c8fd879cd0a836128d88eddae51fcfb51f744b23d2d2d27a2cc1ea5a9d5e0a7faf4227a2adbfb7ed45d6aa9c33798abf07bc69efc5fdde5dc5c780196257093eca75468b161cba44bcd142b21fae9edc6ab327830c28e1b3d2d7c812d8aec3a1952627a040110872e148e15de5c7b4ca24f086336daecbbf9816cdb9dc730db8a66a1929abecd4b09a039a19bffa45ffc85ddf0be3277bf075bbb46f07bf0daea24897e07044b5ee37f9f44fee757188170da22924fa15ed9c07f113cdf37a8c48648e586fb55a0c35f3b63a69667244193c70d94bbe36d043b25a041fba92a2042e2eef767e7cd18dd1c1b5ca4878fe774c833cb5c5aff9f67bfd6cfbf2dfc63b8842ad2d49cebcaff4c3927f3199c106d0c149a9b1b49bef1d6f8143d93d25df9db1b5b37d522e723ff64d9ee52e476206712a38246dd926271f5590e 1665 - " ~k:"5e12de89504bc84836c14fc47628a517e898fa46769eba2b36e7c69e580a6473 1666 - " ~r:"5ef5d78c421ae5a63978bcbf7d2037b5022bc47be7b293806580ad5b4de27a4e 1667 - " ~s:"67ccb2833c1d32c68e91ae3890b4c9a6e5229b22a5799168c0046ead92573c85 1668 - 1669 - " ; case ~msg:"849c5337d88b3b247df573eb0d665548b6423763d5571f8acb5e61e316d7cdc208cda5b39a1944a717587e58e21b86ed222b8ee265105a32baff3692dcf7b8713d0b539262a5bd9a954cb7143ee66f8764db6236136cb1cb3b34a87cbd3fee3b11288bc94ac99179c681a469d62d9bcd91d40332a650a5bce33b6026884ef94a 1670 - " ~x:"680878e382b713d4dc9bed8b7eae880f1054f58e70cda2717577fed3c63393dc 1671 - " ~y:"1e8d4d6fef9905d639e2564d87dcbe0d8f99bde38082ff091a977f2affcab86505aeffe6ef1ddbacf15d9165b006ac0517434aaa65db210452fb2ff4c990b87f25fee7ad5b26ad87749575190089a56cdbceee6782ceaaf569814bb9e658ff50aebf6f3c9791893e5d6ada5fdf8c4720fafa184cc84a84f5fca79d899636e007bd0e1a89da094a378edb6d72240cc2d1d7098b53ba4837a5d0d7d02019b952712e4f1420e58af23d1377cd6d5f3989b3d60b5fc572043b96c4f7beb7137c0894fa99d727a5a88a5d5dcbf2da7b0b2d83db88747fb0ccaa8991d24fccdef42111ff402ed0d9bdb8a4ad13f8fcff6a1df56c82a5f88f575f49a06275a9e66067f15daec402ed877048499909b9e76e5fde52feac944e1de7894cf13c515299acc6442d90f027317b0713805a9512256bcaa7963b9429a510c5869792c1e29082921d0e7d0cefffc34d30762fb83e2abb7821fab4ca89d08b497f75e3149a5cd3d23b29bc52137d8be9c4a95c6376f62ed64fdc159b1bb6c842bd07f8cf03f7f2eb 1672 - " ~k:"48ea48cad85abe488665eb75359217b63387427093318bdfb5d7d8092d342caa 1673 - " ~r:"11b16351f8f72031ba2a772000ac8726a479e1be4523a9eefabe23947a1df0d9 1674 - " ~s:"2660fbb44e29e7687c10e29de96fa1ab03c087ccce086cddab48ec63774141c1 1675 - 1676 - " ; case ~msg:"4c37a4c8b41109240c4f53d87277d3c790b2f071105d15aa10bd0f7709da274ccea1961e0b99635b31acd2c80530d2b403d7110ad7cd0e3572518909c136e73e57d38c1c7443e58a257f0736b9f6f51da8fd1ae9213e8193003d69583381f020cce7fc59ba1b1ed5541dbef6b59925750d50b6515a977aa4325d5fade42f8287 1677 - " ~x:"6bc051fba93b92859a8a06eb361f348f5e50d091c55b998476ecaa1777f26fb8 1678 - " ~y:"88a4dd593b64a4ebcb27ffea3de9a7ed7801f9672b5c8dc27b383d6cba58b4f00181634d05eb490282ce4e57f0940373d3a7bd7e9ccaa9bb2965322ab5fb21b4327b47ef4e2b42424c1383bbd8558b506a7bf5537b049fff35c558bcc739b760443728c090c34d6d4eba81e24e42394f8fb826f7c92ca71a9dab16e999274726b0c5d8f72fb9141870dac0bb9ec0429802b629ad71ae0560e5862ecf3eaba9c2a584885b32c684f6d55fd1b090d93d036a4e9858a4d89b9b5750849d926c519120131d456fce9d247341eb17336ca9729a9080ac5b1272fbf707526afc8ae6a8c661ef3c151845f6ee0902de9abb4322afe585e59d6d418e87d7cdce4897ccac81d013fd72dae1a5557762527312587ca676f0e0676000fc0c76b8265842f2db7e18e621c0e3c2ca9295e9e36ec8ce1c85097ca5fffa62e7b896bb16836d063386b1e663ef29ec1702965a7e0562d2d282f80952d7476b322ffa7929a453a638ea3bede802ff5f8f566085a6e2a2414ef7a6f117ac8628486b23603b1408faae 1679 - " ~k:"40c6be904308e25af6616fe77c23e6e6570ac32ba5bf54aa81f6773a5071a904 1680 - " ~r:"23e13a35777c189ae56509c7afb411b31307737e2ffc8db3f208940c5e76edb3 1681 - " ~s:"0544758362cbb61d66b66826958aca63af1b8ad615a49ba557923959b68f8228 1682 - 1683 - " ; case ~msg:"443473d615bedcba2c8d9a9a45a28c428d7f1a26ab14705627d9ad13f53b767cbb60be523fc21a99c373bd7761817b314290f2f6a80e06e12cce238954c648ace50f3b0dfdf71dc308e1a8ee1159fc1f19b73ab6015d186d9b6bad965a9ad62e440a9ced13550a444b5f0400b96e2d238e9e3dc6e6de12f44205d4fd57f60e9d 1684 - " ~x:"0bdf6ed048358dcc9a2dc555c3d45ac394571135ab36168d9fc4ffe4a3529a80 1685 - " ~y:"0f4ec6e2baaea9c81e90700519f2f05f545ddc0ae9bd3a091e8b6ba5255c15fce5ef3c046771c5f31bb01de4377e142831ac1749903f9317c7b01a990714985f9251198c829073205924c568050acd6dcca757618cd2809bb7aab64db1e86ca92eeb854120c9d89fb9363596be9cbbaf8eacae2f18f3ed483589eb466a5144824feb1f88c30cfcbb7628f7cb4159ce32e7c2ed04d0ff0481c958e5ff744522944cf32020389b32959b5e12f80f08064908a270f8695a3f99e75e7e85ba3b3c773f04ef9e09e76b6c47302e41d50ead04541e0fca4a42502722265f82ff60ef46aa7547f9de249135dd077f24a4e7e03be2e3094772767a9760883c520816fae637c030956ea25f0a869e4a00a4a8017bcb72b2f2fd83643bdc01d8ff2868d3caf100ae8b818b926c96a850bd69d8931dbfdcff31c67c537c4f5959d04b744a346647066dcc61f63be6251b590d688ae3c9b53f392007d8584e4624ffd2941650a31dcd5abfae7ca120b11c8d0194be96e8dd09b643d5685d1065d98f39b6ed7c 1686 - " ~k:"63066e05d16e79fd013a6ae456aa3f036e9d58675b3c9e08a412420a64c1f977 1687 - " ~r:"76bb0ecb9faec7c971137ea6feacf1792073ae80be1ca8ed9cec2a5ca6cd510f 1688 - " ~s:"34920246730e0974fb0faa57e77fc50ab78726c8e51579a0ef5ebe3fce3ba7cb 1689 - 1690 - " ; case ~msg:"cee06f792332080d6e73b3f02f5ec16996b66995beab4a2ba092f40d85c8ac1accf54fba068128c8cdbada209360776a7706455015e73e92c624ada1dfa62ec794cf2a1a9294f3fb55994bc5211add1c685d9a54acd5bcd830d9a4fcff29aec5001c3b2b2a9706046f38bfe48e8522768f1c6f08a8e240e123ed30e20fc46c19 1691 - " ~x:"530e54bf51b3ea012e76206b5ff53c1d5ae6f3433f2a50b66b6947e84dd52171 1692 - " ~y:"5c9205fb649d3b4ba2d44c80a925e30d27b05bd339f1ce35e0d0419a91ed31fd108c51a2a62cf9d0adfd877d27cf5575e43ac7bfcfceec5673736cae089516df8eb1ea6b563198b24a6e2522f320b123bfb250d43b600df9298e121b6c5d2e637a989215e095e603ee6d4e8a2dcd17b908918aa514c86a33d8c717578d861261da43f73250ff2be746c6916fc72871fb42a279d22595051b8ac04afbf2013063e31661b117c5d094b4c232b22f21d2c65d6361290c08f12befd1f5a2b9b5259af0435b97b4328297c252d813499f5209dfa35e9198de68501af4ca8658942d059bb62b8e55a3ce6120a78ee098132e8d2dc3757f7e60f8c08c4e43feac67abcddd1ea2f016839fb1a0f797b8b137ab43b64508ef69f6ae0f3abc4ed682aa7e38fa5146fec62e01e0951a6e81152de43171ca8869fa1a42a4fb2d8ae512c005fd97d12bb13f299ab9f5321ee2fc39b28e61c9ebcb91ecd2b610fd8291f538a00d06d057c3e79422a931279fed9d93b0b6533fae441e98413025fb4fa73cdefa80 1693 - " ~k:"4e500b513c2e24ad17fcb8cc0d6a8c54e654e00a892545a33cb5af8877589520 1694 - " ~r:"6d02536db546f2bb1f65ff0b91b964802b38d171e678054ee41f2b8563809cfa 1695 - " ~s:"6bc51120e35c955ab8f717f8930d8cc8def8505415cf159d2516f96578842f31 1696 - 1697 - " ; case ~msg:"58aba24e9481d1151b574b146ac21b17110ed0b9bfaa55a4e2e06dcdc18bd10cdfafac047189f5ba9f10377affb40a514d528a3483fe8e64b831ea0cd076ce583942b938a4b257d0b5a92412e01dfda8217d5f8054596a61d5737d8ad8112ae228220e3bff60e2e891d03d53fb14f14dd91975dc15d6b7bd62e99d74ef3839fd 1698 - " ~x:"7bc2316b6301b772b6742d0c50f2c1c39bbede01448026b6a201793bfe7dc3e3 1699 - " ~y:"2adbc07d8aee284ec982c4b95e1ec3ec3f5fd5172368ddf83f9a3c69655291dee6b99ed713e5a1fec338239b8199c5a3bb2b5e2e7f23fc795058a9ac70ebdff2b3daaffa389e97fee35f174961f12d634e8b8250b8b770b8d7113d0fbc020b7b108f8d6b2d7cb6c59e2e151015145a8e374f9b7396e970d91e3c1f85ce23dcae12b2f53741cfc2350b582ca87f0ff9ab50ad0ca2879e216e61a5c358970a3c3528dcd9ece6b83d525b31fe687696a2a2c65e34f2854fea6ff92244d27500f7da946c37169756f4a4664b2909611549ad2b93ebacebfc270ecf4204e6641dbce05da2c000a4ca5ac885406ba155807494706180d54cc012ce06e734024f4ccd882bddd2257afb5c287bc3a8570edf21a20afeda0c762ad696fba177a5f2f9d609355cb91d72ccac8bb9e7c3cff1834d86b0772aec741d7b4b3c3e43bb26ec9f5e86b8685ea5c625b6aea450a46e85e380b158de6aaa2701ffad0c7d1ed0df355d09d06fe1758b2f27a5d02aa283aec9fd12d3b62d504dca0b6632e89fc55fb083 1700 - " ~k:"0c2a0d2b326ad63e869384e3e2e32fcff8db83285fa0a5b9a7b13589a7dd7fc1 1701 - " ~r:"2c462d49344f3ad03b6798f96452f7d66351cead919e8201b7665c877f8255bb 1702 - " ~s:"50e8908a1c6684a2caa8aafb432cda4b7699008c72d8d622c3da4171e51cfdbf 1703 - 1704 - " ; case ~msg:"e10604ca00728e533621dbb6618b0c877c4902a2ed79aaf40a4daa34d6cc216ad4648daab6cc1e18451bb94e6a1c0c6f9d0d883962eebd507da099788008da23205e3b4e90fad9ae857074ffeac63430c0facbae489c54c957db09d53e12b656cc278615a3a5612af4c2f168bdeb118a42a2a67103fac321adf5688b05848f7c 1705 - " ~x:"6dd500e2aece9ae331df269c26a4e5d58fc6be3963f5002e36bd9cd04c1adbbd 1706 - " ~y:"b0448d43c520377b7df214969f59ffd4e0010c12d7e5fa8f241e9ce1c634439c94700ed5742a8322d405dd05de9953447831c7674e5ae1b89041fb8f2ec1054b928c64ab862f021a55ebce838d2a3d2c7645ec7c0a1a4603617e4f508929144c1ef2b039bc78b59362d5ba9537906e66c8e9c9a3c68e71b35d88b8bac86cacbebd962c66e18129637fad2d98d21e45a32672649492f131bae88c9989bd6372e17492bedff4d9b091b3dd00ebca6bcc49148480589f9593e32795299f3de7e09d88bc0ed27b7ef22ef7d202207fb5ce8c91712c3bd5e758d2822809ea5d2cb288332aa0760368259281a34447ff5a98c9c97c1d58383cd14f6d59bb5e5763217b2337ec2321268197f02cecd0d9fd93db39f8059a38bbb35792ba0d4ed1bad95a05b481c39f6adc9017dec1d662b0803f2ecf0845935765f9356db536c8c11887d9e44b73b6996ae7ac24fcad9c23017e5c2aca88b5a136b6307298b85ff010f964b7477a4f980800e69d3cc0f438aff7f2df8ac61d64435ffaf5e46633609e87 1707 - " ~k:"65243ccac0a014b9e52638171b4a88b02a8c6e617ab9467da523487122e6650c 1708 - " ~r:"56ab9947ac94fe3df7e35801660f68753b0b620a26594cb8fd375be3ea4dbf05 1709 - " ~s:"608ed1835139af29a2e3d874df465edd8d6428f40357d9ae4904efe8bccbd035 1710 - 1711 - " ; case ~msg:"8af31f66772fb0c31a8c5b28e568e6368cb66b591edfb0db867fd99e83feb3638bc80f0b14483d069e8f2e167c8b0f10cd6b45d039b7d6f833bd58d99b00597aeef82fa3aae2e55ded62ab660810de0fe1c92d53adf98c838c18fd76a273ea12119d675af727011869943d765b96ef266270b4f89ac72edadcf707a4a21b7533 1712 - " ~x:"145abce3eaa8fa6b670afd658ba0c14fa98d2d20e1422367d4455967f9844858 1713 - " ~y:"22f3db9ea369938ed750d5ed3781368d594e62635c6b6e103d6db489a9972f398203abb973d5ad9c0dc110586978d2061483c0202738ceb01a665dd22fc568cbdff2148ae664dffbf888e4dda5a04fd3e89398b4f1ffc3a3813ae94da1f8965efbe7f300948749e9757cc7c05f6e53fdbff994c223aba2c137151b6a320f5b7f8cdd6003baa66020162990624099f3cf56d68b74e96ee09240f2cf11e3954e75b261ef9e8e3551c6c00f41e9eb17421203a4565388c321c1325f72eb10c28a9deeddcb4806f625382b37f0becf77936b7f83d26bf1ee1fe05e8a0005a4058c678eb569e339423e7c844305f4a18b1160a0c430513fad715896b62b9d6e2468232ae375f5f3c0056245eb4616ba11a6029410a955af09f07595fefa03e5516c95a4cfcd66046be2a4f7b3ab274b21c0a4f126c482c934c79dcbbd6916f3b887b2600472495c8335de121c7720f29ae56f5ccf9b99c9ce5655c5e1d15d67895af0dee586bc491a97241f7eff434bb79aad831db0695781e6b512e8702407a7d748 1714 - " ~k:"06f085f77088ec97cebe5397a588369e3dc15b70f2a5316a6dd5f94967fe3dbc 1715 - " ~r:"0fda7a8a3e5d324fc0a1c2841cd22f98757a0c6a2a465b0d9d65bda9b23b3c1a 1716 - " ~s:"40860265229085453fe58487a933edf3c28433694c7b85f6370d9a4783168237 1717 - 1718 - " ; case ~msg:"e2456ef5d465731b976f2ad1fc94634c0569a0ff7566a49d47d69e60b3b6d7eb2ab25cd49c931299796bff7e9774075ea20a972e3949a29dfb50b2b5613b45c596ca5dab282ff183f564a06311a49601a1e8560d43c6a481ce713f46c6ea85bf4c16489fbd72cf552b26516298bc66942a05d5a8e6d0f6a88f3e678d310e297b 1719 - " ~x:"286d3cec1d2ad2a85f0f163245267438f7d7d62149ba9e59a18dfffaefe44358 1720 - " ~y:"dc9d68b53f35c29f7ca003a2583ec8f8ef5d78a0e45db3c884d35df4fb531a080ee3831bffd3c756ea5042c7614570fba2f6ca4870db4a453d0f793fb4d0225d94f27412dbdf43432f52cb8f867fe5f492a8876d7bd850d899ba2f0a53820c440841fe0cb76fe0444bd6c3235785a3da3081fef99f53a195314aefe955f2964c56506fcc969b67b323766d299c0b02981c72a2ce3d7524ae6f08458795fd32e31b47aa1f974e356081163cb23efd73a9e655deefe5e734ceb58e88a9dbb524eff7e11c3e30680702d8560dd8b6ad9f61e7246c6dde164e914951d6a0573152ec8bdea679dca1985bcf267304d5f1bce2f32bb9946a056857359afbaffa59bee61ad960c567efe3f1145a8a87c2491fa6b33f7e71fcdd8f1ffbcd2b89920907d1144a8cf0573f5b89217bc0598c6e1754f1ae7d9d42a608a051621419da91d11bda9bb9dfa7118e4b663e7bffe6e9946c77ce9f8086dfc822a7ef728888b31654a19b6debd2ca62f5e3b4e289810435b363ecab511f47e9e157f0f4198862ca13 1721 - " ~k:"183ca3afd082bf3de19e89faffc5cfa7dd713a873c02c723279b3091f9bc627c 1722 - " ~r:"778640ce75da584a6a83f9794c4ffdbe30411be43027758c74f89f7ccc7f3983 1723 - " ~s:"6125481e103f7803b2f16d9a4d00f881e0b367024df5822f7cbeb5711e0e4401" ] 2308 + [ 2309 + case 2310 + ~msg: 2311 + "ca84af5c9adbc0044db00d7acfb1b493aab0388ffbad47b38cd3e9e3111cfe2cda2a45f751c46862f05bdcec4b698adfd2e1606e484c3be4ac0c379d4fbc7c2cda43e922811d7f6c33040e8e65d5f317684b90e26387cf931fe7c2f515058d753b08137ff2c6b79c910de8283149e6872cb66f7e02e66f2371785129569362f1\n" 2312 + ~x:"433cfd0532ccfd8cdd1b25920d2bb7396987b766240379035b0e86527ce9c52d\n" 2313 + ~y: 2314 + "e7c2ee18c3aa362c0182c6a56c2584628083c73e045beda8d653690c9c2f6544edf9702c57c455273905336a5f5171107a313cd7d0b0f50f8d3342c60219f22a9023394059d05f464c4496d55dab6eb0898527ff4cf5678e7b5bfb5e18d92c4a9d73288cce14530fc4702f6d0397ec39a880c4a72d358730c56633386ede028023c1791f3164d1574e7823c79b8a3ca1343ea166ba6f02b7ff7e9ef2198db107f7cc159f3b6a1c00a78c355c566deb0ac6fde3f633cb9177a1fbc6c1766ca021d5fec470101abb440d2f06982181a8c92b7cdd765336b9a1e1ab70283d6db0a963fb648c37c4e29a74c37577291049ab47cdbc104c04db966681ea8ebb9f00cf4c4a5462117379575fbda4b801979451fa94b19b4e93656705c0f734f3e0914bb96c1e2b8a0fb68faf14296efdf3300ad95bcde8b67cc4b26e6488eef925cfaeac6f0d6567e8b41355f89d1c2b8fe687bfa2df5e287e1305b89b8c388c26196090ac0351abc561aadc797da8ccea4146c3e96095ebce353e0da4c55019052caa\n" 2315 + ~k:"40f503abd70fd49a76c67a83e08b062b3fd465ad92be433c080e5f295bb9f559\n" 2316 + ~r:"21ca148cdf44be4ae93b2f353b8e512d03ad96dafa80623fde4922a95f032732\n" 2317 + ~s:"73e48b77a3aa44307483c2dd895cb51db2112177c185c59cb1dcff32fda02a4f\n\n"; 2318 + case 2319 + ~msg: 2320 + "3ccad0018519a898f87d8ce5f28c0d93ab16c51addf4173322cbc49d48ca9ea37ebe8bc9d8c1b3f783f8cf59cf3fcba10a393eb2ddd989ce258e73788ce74b0ce8223d24e993cfeafa49cc8ec1b8ecee017d83a11bb7034c779206c364ac463cfed3047e1a2bf5c591773b1d882b310bfba2db87893c89a5442c0845bf644e21\n" 2321 + ~x:"306c1304b380b7c3e09e7a4b489c64a295582bb3e03ce526f13d7482ef8263f0\n" 2322 + ~y: 2323 + "3750d36353bfd2e9973e26a555bcf0d834d3d6620cb66579199e040ce8eccfaee660046e78df66e8ff641523046adcf425b8319db2447680194c3a386b5201dd1ac6bf3e66394e939eaaaca4fd3f386fcfe1d5ef4524b06c5ed9a15746f24baef1eec41e683bf35371084495d4da8e727aeba307fba000a769a234e3c4609704b3ba4dfd6a8644fba56083dac848751b52a8c2cdc47946cd21ea24383cc6244f000918e9a23276b606c5688565c44ddf7788181b789565a6becd257123bb81a2cbf9db7fa384e0ca41804ed7cd3c9ca0e1f8bb390bff50213b0629682409933770f6e03a5c4e7e89ade90255609786f6b2fc5a7aa7566bcf7f725aead4cf456c5f5ed7dc3e91e20d94d1aa2f6568c97abdf21e0ba8cbfb6561305cb45175b1abd7f39b9a11c797926b944f5d13c3d70e0b2a8ca18e1f5cda8ce6ac43ecbc1fef881f5eef5a842fd5984ad1e321a317005ad478cb47c9cff61267f1d496fded0a48328d629b7b200c441634ee908879011745bcab6660e15583748014d6de2fe2\n" 2324 + ~k:"223e52fc516c0a79f55a5474321264fcce78c050cf79b3d9961b37e24d7f32d3\n" 2325 + ~r:"1ef7723345b2013b71104ceedbe7a9cad430018968bb295b672c2b57b9a108b9\n" 2326 + ~s:"72852da485c0836a8ebdbc4c996f7f6cb65e99391ce06b19a7187618e9a95584\n\n"; 2327 + case 2328 + ~msg: 2329 + "1fc98288857fb3a83ab507465a53c079ed66679cafdfb8653bfdebb03020fe86a943182d4f1377d58eca3c7710d32e210d8d03728bc69e1b8003944ffedaa1b69ae6cc506302bd6917019f588cc29501cc8263572ebc0feb153877174bcfdbad4a58659175d2de71d5f5019c46d112b6631cf0c3f912aac83140cd56cdf903ee\n" 2330 + ~x:"047a5e52039da40523feffe63312887e4d1ecdf64f32abb31dfe680bd1513077\n" 2331 + ~y: 2332 + "335372770c0e8e591a367de99833bde6f01240bc6e236a5b4e36233e120b8ee6d1c19c77f4cdbc294d3278c3d4cf73ed9e8ea5032b0524a391cf293b35ee7e023430222216d9f18b45022f4d5f9385f6384d9faf1a0ffa4a800da23b937651a09e82c22285b9de6a408e23386ffa67abb9d1c71cda7bc0c93525fcd79e83153e746070782467858b697ad14914673033fedb2d7a105ad2d438daaa35b503b518314ac370fc5b1112d4fe514e5835d9a86de25e6b35691392d1cd04836d4126b295b8a89f217d581258af95277b8b91c31e6b0d23a7c52b0ce2641cf1a252838b6e28e226cfc4fa9dc914c5f675fc900ed680dc1aa9e1d17193c432af4032ebab954191327083c59a5f64c1ea18107ce4d7211d1c22f04805ed548fc22df4b162f30b6ff3a7f7c38a5a95fe824d2961180e98b30208dc7ea7071f792261d45c7bb7b911f3b19c3ee0171a326c033cf5fc2bf79de7d5115ac568e04789cb44e08f3a8627a1b1f3762342b49b7679bd7edbe47bc3ee9c3f02db15d53256a5ea2847\n" 2333 + ~k:"69a22d61b152af35c1b43deda88d5ad456d38df75b318b82712b2690a5f2f647\n" 2334 + ~r:"5dd0c7e8a3993b9de0676a579c897ea39943a43dbec5996e58c1985b541d7c1a\n" 2335 + ~s:"67971001822a08a2148a6b1adb50274a57dafe896fb04a12a6f99707555306ac\n\n"; 2336 + case 2337 + ~msg: 2338 + "fda9765cc91a9db922aec7b13fc32ac4ec4e3b8534f9e95af96e8ebeab89d847dcd150444868cfaf4213f8d8baa6b1d0886224e2afd0aeb93d59b886572088d05bf721c7adfb54da47c6c4851204a7a92a11deb39ba17cf6c07fb7ce8ba350a99d018d4ea64bd56d1d9f8f7d88157f190fcb372acf6f8d31cf7b795b36c10f5e\n" 2339 + ~x:"7f6ce353841963c8a6ff3405713e361ef9f1e0765e665195e7c147dd98120c4f\n" 2340 + ~y: 2341 + "0539cc992ca70f913537b1211dd326d85f7531baa6be0583ba45b9571baa81cd5828050dcd9ab7a203bc4fe1d874f76ec1f34d935579ed2132255789d7e6010cf504b4c7f586d44a716600acf8a04ad30cb7ca055d7223f9761cdaebfdf7ef72bdea3dfcd020069a969c560160f0534676beff5ea611fcbc0fd47c867f3163e1371e1de67a1a3c3e37168bf0be79c09f45f2bc43517aeea0100a2a25d148ff1990c06143fa253d8306f48d77362224bc3efe93389e922def0fd11d1992f550ed8294b6136547ffd612b0bc8e4ee90b3100bb89922177147be0083281bf663f8370417fa790d4105eb98cc126f5005b7c08bc211dea2898aa653c3d2b51fc67732bff5644e804aae69200c416035aa0ba5a14cc439b569f462117b7dfcf3f2cc13e723a93ff9533208f20241daf36cd16066be3dba20117cb145d756f5a6f79ce2356a051647aedd645bfa6faf8f80a6fdf3eec42ddd42bb2e7b7738296e23978c8bd63b8045953e06cef1263bfe03be2f61b16007df1eb198567a7bc6bff274e\n" 2342 + ~k:"01cd3cdd3feb4d1a995103b1520fef17f60cd9370ad59b3efe9383a2c0126f00\n" 2343 + ~r:"55c2b27e769fac99b47bc0a54ff1821c7a46be6001ab664fb68fb1bafc04446f\n" 2344 + ~s:"3059db42a399c428f3cfbb102d6c0409b06f20068d1ca8cbea4858ac6e5de1d3\n\n"; 2345 + case 2346 + ~msg: 2347 + "e49a12b8d761ef7afbcb1c377eedf629d08cc509a8753a5b92e26a2397365156e7c081bcb4686695575c6a64f5d77dfd550b04df390aa55e0d051c759f197a751a6041e2dd0959f902f2e359a167d880c49cfa81e7196fa1604ad32a8017071f098d4cb346b39266fbe75659dfc6607bf0d829640782cf3e12e38376c5a99282\n" 2348 + ~x:"28d9bc1d9aaba882427ee26c262bd4003aaeba422bf053b0dde14bb6d6d74bdc\n" 2349 + ~y: 2350 + "ee7fff18822ff454a207f9db542d24298bb5edb11d80ddc6ddb9bfae0c952d4fe8d9db0f1a86e8a0f2193af7caaee7264d74106de5af0a6c14f710bb863eb7dc167a1e4378b6cdb7ab6841c664e9824529119773578ef55b7c35ed221ef070dd4690b4c12f27673e5d1fe964ffe29da57e2d1acd21ef13e0669fa97668bb199b56a3a53e10469133022081cdf62648100dca267c4f6a3ca3a75b573bb1b39c8a4e1fcf81269e9e1b10c63f5ba4fe75cf7139d038d02f5f534aa081fce732cd5051609bc06f18874dd01121d3c179f0c3f0399c185eebdc34635b3139f1ca50fbffb3b0ad12e481c1a64682143793f072c7db8b5b9eef41ccdd66b904139d644442a92f6255edb9bc1234e27d07a6ba32b1f14cdf98a22c6a12300dff50ac1b65568b6e915541bb386ec725da444467ca25e81448cb78375146ad2078a830e7d905de9ad7d89559c9d430cf5f419ce945704a426ab264016ed87c90d97f51a7d6e1ee2f51bbb3a8de81391697b0e422df9e5d3551e93374e5f38016b296d53bc2\n" 2351 + ~k:"0650ebc3e21bf1d90ffb3ef5a707013dfce78fbd2c21a0da9c8106d1fa98a46f\n" 2352 + ~r:"21d34df605237975db31b864f98c9ab6e465dbf0b3fc5868d67cd6cb3a13963b\n" 2353 + ~s:"70c48807d62d1fe74d58959347ab12c97b500d20607ed2a95d8a388fee265812\n\n"; 2354 + case 2355 + ~msg: 2356 + "28f7a067a0ea7f0a4d797cea3939f66b281ed19cc98b8563ef375798b40614f4dd85ac2fcfccbc5ebf0ac93228c0b72937a481ca4f9df7a7e5d2e5da9af04874dcec35035f6a7db493793aa2361fb66ef2eedb7574d04e2147c357298a2adf99aca1eebe00cefa44b39157eb1e94aa8aa98d545151fbb4de67070b3904cce930\n" 2357 + ~x:"0c5088f5d337802770e6f98349d53461f13161020ab9a241efed4faed2e569ee\n" 2358 + ~y: 2359 + "cdb9922d69e99c7f34a9210e2afc5be0115da4aaf682d9ea37788e0b6caa6fde13c88e51f558820668b59d14c06d2cbe6549d3f06d10dbeee46f59154cd467ae19e16be25e6f6cd238ccd1947fc581562d30ca329bb327258ca4aeb901f814414058b6f169a45ff55e40232d7870499ae78c0513777140752d55f0a470761bdcff5a6609cca2d1809f184b298718071d216a14ad01f56cccced23969607b62d4d140c9ef28507674f59fecc7e7ce8ad2636a5c53f070ad317c8cd0231f500a790ef69ac786000faf68e7b7854d6eb26499a9d524cbf8f373ca41dd6a2fa5198eba2a8e228f5ab29be9f6d450f7f5a149aeb20d8a277971fa6e64a0de36c8750afc381961756975621f287a3950f88402c5081fe0c54f44f9fa7c50df906b264098853646b3d05a4f04c6f1bbc6c440f7e7358d3a72b29f7643f4406b7db173690d40aa2938eaf01874d2ba8094cc5be1145b2b2ee9e7cf15bf398e50832d95017430b1869938732cdd1df593f5db2b2bd71308d8c253d254ef39b475e249d890\n" 2360 + ~k:"2be962ca1f82b879255e20d6971e633ba68582a5137bc55058fa42b48ddf0566\n" 2361 + ~r:"12de252da2593c5969a6496ae808d851cad1ded2959ea89057a92e5ec91c5f95\n" 2362 + ~s:"165338075e6a4fea0b238f9fac904b7b33dbee5a552646dfbed827f6d28d6492\n\n"; 2363 + case 2364 + ~msg: 2365 + "0e156b0bd84595155ef4fc213dfc7e46bf27a89c275723e0984076b027c49cb2eee6ac866d75333581cca6f897e11418fb37ba5cab1391cd237e2c6ab3f11a055d3bd03f425baaabe5a6a34eba4b118af73edd610787cb8eaf476bd217048208ea4c1d0591372947a1c0ef94696568983424fd1d802fc911e7bf71224afdbdd9\n" 2366 + ~x:"2c4d972bb3539876b8f32cc645cff0d4be877175f31a028b9bfe973f0651789a\n" 2367 + ~y: 2368 + "d0973641d56d8baaa2c2d430501dff44eaf9a3657478799134b0f335ae94ff2791dfd494401332486ba637683e704bd985f526919e661a2280d99bd48262b6c9305e0c8fd879cd0a836128d88eddae51fcfb51f744b23d2d2d27a2cc1ea5a9d5e0a7faf4227a2adbfb7ed45d6aa9c33798abf07bc69efc5fdde5dc5c780196257093eca75468b161cba44bcd142b21fae9edc6ab327830c28e1b3d2d7c812d8aec3a1952627a040110872e148e15de5c7b4ca24f086336daecbbf9816cdb9dc730db8a66a1929abecd4b09a039a19bffa45ffc85ddf0be3277bf075bbb46f07bf0daea24897e07044b5ee37f9f44fee757188170da22924fa15ed9c07f113cdf37a8c48648e586fb55a0c35f3b63a69667244193c70d94bbe36d043b25a041fba92a2042e2eef767e7cd18dd1c1b5ca4878fe774c833cb5c5aff9f67bfd6cfbf2dfc63b8842ad2d49cebcaff4c3927f3199c106d0c149a9b1b49bef1d6f8143d93d25df9db1b5b37d522e723ff64d9ee52e476206712a38246dd926271f5590e\n" 2369 + ~k:"5e12de89504bc84836c14fc47628a517e898fa46769eba2b36e7c69e580a6473\n" 2370 + ~r:"5ef5d78c421ae5a63978bcbf7d2037b5022bc47be7b293806580ad5b4de27a4e\n" 2371 + ~s:"67ccb2833c1d32c68e91ae3890b4c9a6e5229b22a5799168c0046ead92573c85\n\n"; 2372 + case 2373 + ~msg: 2374 + "849c5337d88b3b247df573eb0d665548b6423763d5571f8acb5e61e316d7cdc208cda5b39a1944a717587e58e21b86ed222b8ee265105a32baff3692dcf7b8713d0b539262a5bd9a954cb7143ee66f8764db6236136cb1cb3b34a87cbd3fee3b11288bc94ac99179c681a469d62d9bcd91d40332a650a5bce33b6026884ef94a\n" 2375 + ~x:"680878e382b713d4dc9bed8b7eae880f1054f58e70cda2717577fed3c63393dc\n" 2376 + ~y: 2377 + "1e8d4d6fef9905d639e2564d87dcbe0d8f99bde38082ff091a977f2affcab86505aeffe6ef1ddbacf15d9165b006ac0517434aaa65db210452fb2ff4c990b87f25fee7ad5b26ad87749575190089a56cdbceee6782ceaaf569814bb9e658ff50aebf6f3c9791893e5d6ada5fdf8c4720fafa184cc84a84f5fca79d899636e007bd0e1a89da094a378edb6d72240cc2d1d7098b53ba4837a5d0d7d02019b952712e4f1420e58af23d1377cd6d5f3989b3d60b5fc572043b96c4f7beb7137c0894fa99d727a5a88a5d5dcbf2da7b0b2d83db88747fb0ccaa8991d24fccdef42111ff402ed0d9bdb8a4ad13f8fcff6a1df56c82a5f88f575f49a06275a9e66067f15daec402ed877048499909b9e76e5fde52feac944e1de7894cf13c515299acc6442d90f027317b0713805a9512256bcaa7963b9429a510c5869792c1e29082921d0e7d0cefffc34d30762fb83e2abb7821fab4ca89d08b497f75e3149a5cd3d23b29bc52137d8be9c4a95c6376f62ed64fdc159b1bb6c842bd07f8cf03f7f2eb\n" 2378 + ~k:"48ea48cad85abe488665eb75359217b63387427093318bdfb5d7d8092d342caa\n" 2379 + ~r:"11b16351f8f72031ba2a772000ac8726a479e1be4523a9eefabe23947a1df0d9\n" 2380 + ~s:"2660fbb44e29e7687c10e29de96fa1ab03c087ccce086cddab48ec63774141c1\n\n"; 2381 + case 2382 + ~msg: 2383 + "4c37a4c8b41109240c4f53d87277d3c790b2f071105d15aa10bd0f7709da274ccea1961e0b99635b31acd2c80530d2b403d7110ad7cd0e3572518909c136e73e57d38c1c7443e58a257f0736b9f6f51da8fd1ae9213e8193003d69583381f020cce7fc59ba1b1ed5541dbef6b59925750d50b6515a977aa4325d5fade42f8287\n" 2384 + ~x:"6bc051fba93b92859a8a06eb361f348f5e50d091c55b998476ecaa1777f26fb8\n" 2385 + ~y: 2386 + "88a4dd593b64a4ebcb27ffea3de9a7ed7801f9672b5c8dc27b383d6cba58b4f00181634d05eb490282ce4e57f0940373d3a7bd7e9ccaa9bb2965322ab5fb21b4327b47ef4e2b42424c1383bbd8558b506a7bf5537b049fff35c558bcc739b760443728c090c34d6d4eba81e24e42394f8fb826f7c92ca71a9dab16e999274726b0c5d8f72fb9141870dac0bb9ec0429802b629ad71ae0560e5862ecf3eaba9c2a584885b32c684f6d55fd1b090d93d036a4e9858a4d89b9b5750849d926c519120131d456fce9d247341eb17336ca9729a9080ac5b1272fbf707526afc8ae6a8c661ef3c151845f6ee0902de9abb4322afe585e59d6d418e87d7cdce4897ccac81d013fd72dae1a5557762527312587ca676f0e0676000fc0c76b8265842f2db7e18e621c0e3c2ca9295e9e36ec8ce1c85097ca5fffa62e7b896bb16836d063386b1e663ef29ec1702965a7e0562d2d282f80952d7476b322ffa7929a453a638ea3bede802ff5f8f566085a6e2a2414ef7a6f117ac8628486b23603b1408faae\n" 2387 + ~k:"40c6be904308e25af6616fe77c23e6e6570ac32ba5bf54aa81f6773a5071a904\n" 2388 + ~r:"23e13a35777c189ae56509c7afb411b31307737e2ffc8db3f208940c5e76edb3\n" 2389 + ~s:"0544758362cbb61d66b66826958aca63af1b8ad615a49ba557923959b68f8228\n\n"; 2390 + case 2391 + ~msg: 2392 + "443473d615bedcba2c8d9a9a45a28c428d7f1a26ab14705627d9ad13f53b767cbb60be523fc21a99c373bd7761817b314290f2f6a80e06e12cce238954c648ace50f3b0dfdf71dc308e1a8ee1159fc1f19b73ab6015d186d9b6bad965a9ad62e440a9ced13550a444b5f0400b96e2d238e9e3dc6e6de12f44205d4fd57f60e9d\n" 2393 + ~x:"0bdf6ed048358dcc9a2dc555c3d45ac394571135ab36168d9fc4ffe4a3529a80\n" 2394 + ~y: 2395 + "0f4ec6e2baaea9c81e90700519f2f05f545ddc0ae9bd3a091e8b6ba5255c15fce5ef3c046771c5f31bb01de4377e142831ac1749903f9317c7b01a990714985f9251198c829073205924c568050acd6dcca757618cd2809bb7aab64db1e86ca92eeb854120c9d89fb9363596be9cbbaf8eacae2f18f3ed483589eb466a5144824feb1f88c30cfcbb7628f7cb4159ce32e7c2ed04d0ff0481c958e5ff744522944cf32020389b32959b5e12f80f08064908a270f8695a3f99e75e7e85ba3b3c773f04ef9e09e76b6c47302e41d50ead04541e0fca4a42502722265f82ff60ef46aa7547f9de249135dd077f24a4e7e03be2e3094772767a9760883c520816fae637c030956ea25f0a869e4a00a4a8017bcb72b2f2fd83643bdc01d8ff2868d3caf100ae8b818b926c96a850bd69d8931dbfdcff31c67c537c4f5959d04b744a346647066dcc61f63be6251b590d688ae3c9b53f392007d8584e4624ffd2941650a31dcd5abfae7ca120b11c8d0194be96e8dd09b643d5685d1065d98f39b6ed7c\n" 2396 + ~k:"63066e05d16e79fd013a6ae456aa3f036e9d58675b3c9e08a412420a64c1f977\n" 2397 + ~r:"76bb0ecb9faec7c971137ea6feacf1792073ae80be1ca8ed9cec2a5ca6cd510f\n" 2398 + ~s:"34920246730e0974fb0faa57e77fc50ab78726c8e51579a0ef5ebe3fce3ba7cb\n\n"; 2399 + case 2400 + ~msg: 2401 + "cee06f792332080d6e73b3f02f5ec16996b66995beab4a2ba092f40d85c8ac1accf54fba068128c8cdbada209360776a7706455015e73e92c624ada1dfa62ec794cf2a1a9294f3fb55994bc5211add1c685d9a54acd5bcd830d9a4fcff29aec5001c3b2b2a9706046f38bfe48e8522768f1c6f08a8e240e123ed30e20fc46c19\n" 2402 + ~x:"530e54bf51b3ea012e76206b5ff53c1d5ae6f3433f2a50b66b6947e84dd52171\n" 2403 + ~y: 2404 + "5c9205fb649d3b4ba2d44c80a925e30d27b05bd339f1ce35e0d0419a91ed31fd108c51a2a62cf9d0adfd877d27cf5575e43ac7bfcfceec5673736cae089516df8eb1ea6b563198b24a6e2522f320b123bfb250d43b600df9298e121b6c5d2e637a989215e095e603ee6d4e8a2dcd17b908918aa514c86a33d8c717578d861261da43f73250ff2be746c6916fc72871fb42a279d22595051b8ac04afbf2013063e31661b117c5d094b4c232b22f21d2c65d6361290c08f12befd1f5a2b9b5259af0435b97b4328297c252d813499f5209dfa35e9198de68501af4ca8658942d059bb62b8e55a3ce6120a78ee098132e8d2dc3757f7e60f8c08c4e43feac67abcddd1ea2f016839fb1a0f797b8b137ab43b64508ef69f6ae0f3abc4ed682aa7e38fa5146fec62e01e0951a6e81152de43171ca8869fa1a42a4fb2d8ae512c005fd97d12bb13f299ab9f5321ee2fc39b28e61c9ebcb91ecd2b610fd8291f538a00d06d057c3e79422a931279fed9d93b0b6533fae441e98413025fb4fa73cdefa80\n" 2405 + ~k:"4e500b513c2e24ad17fcb8cc0d6a8c54e654e00a892545a33cb5af8877589520\n" 2406 + ~r:"6d02536db546f2bb1f65ff0b91b964802b38d171e678054ee41f2b8563809cfa\n" 2407 + ~s:"6bc51120e35c955ab8f717f8930d8cc8def8505415cf159d2516f96578842f31\n\n"; 2408 + case 2409 + ~msg: 2410 + "58aba24e9481d1151b574b146ac21b17110ed0b9bfaa55a4e2e06dcdc18bd10cdfafac047189f5ba9f10377affb40a514d528a3483fe8e64b831ea0cd076ce583942b938a4b257d0b5a92412e01dfda8217d5f8054596a61d5737d8ad8112ae228220e3bff60e2e891d03d53fb14f14dd91975dc15d6b7bd62e99d74ef3839fd\n" 2411 + ~x:"7bc2316b6301b772b6742d0c50f2c1c39bbede01448026b6a201793bfe7dc3e3\n" 2412 + ~y: 2413 + "2adbc07d8aee284ec982c4b95e1ec3ec3f5fd5172368ddf83f9a3c69655291dee6b99ed713e5a1fec338239b8199c5a3bb2b5e2e7f23fc795058a9ac70ebdff2b3daaffa389e97fee35f174961f12d634e8b8250b8b770b8d7113d0fbc020b7b108f8d6b2d7cb6c59e2e151015145a8e374f9b7396e970d91e3c1f85ce23dcae12b2f53741cfc2350b582ca87f0ff9ab50ad0ca2879e216e61a5c358970a3c3528dcd9ece6b83d525b31fe687696a2a2c65e34f2854fea6ff92244d27500f7da946c37169756f4a4664b2909611549ad2b93ebacebfc270ecf4204e6641dbce05da2c000a4ca5ac885406ba155807494706180d54cc012ce06e734024f4ccd882bddd2257afb5c287bc3a8570edf21a20afeda0c762ad696fba177a5f2f9d609355cb91d72ccac8bb9e7c3cff1834d86b0772aec741d7b4b3c3e43bb26ec9f5e86b8685ea5c625b6aea450a46e85e380b158de6aaa2701ffad0c7d1ed0df355d09d06fe1758b2f27a5d02aa283aec9fd12d3b62d504dca0b6632e89fc55fb083\n" 2414 + ~k:"0c2a0d2b326ad63e869384e3e2e32fcff8db83285fa0a5b9a7b13589a7dd7fc1\n" 2415 + ~r:"2c462d49344f3ad03b6798f96452f7d66351cead919e8201b7665c877f8255bb\n" 2416 + ~s:"50e8908a1c6684a2caa8aafb432cda4b7699008c72d8d622c3da4171e51cfdbf\n\n"; 2417 + case 2418 + ~msg: 2419 + "e10604ca00728e533621dbb6618b0c877c4902a2ed79aaf40a4daa34d6cc216ad4648daab6cc1e18451bb94e6a1c0c6f9d0d883962eebd507da099788008da23205e3b4e90fad9ae857074ffeac63430c0facbae489c54c957db09d53e12b656cc278615a3a5612af4c2f168bdeb118a42a2a67103fac321adf5688b05848f7c\n" 2420 + ~x:"6dd500e2aece9ae331df269c26a4e5d58fc6be3963f5002e36bd9cd04c1adbbd\n" 2421 + ~y: 2422 + "b0448d43c520377b7df214969f59ffd4e0010c12d7e5fa8f241e9ce1c634439c94700ed5742a8322d405dd05de9953447831c7674e5ae1b89041fb8f2ec1054b928c64ab862f021a55ebce838d2a3d2c7645ec7c0a1a4603617e4f508929144c1ef2b039bc78b59362d5ba9537906e66c8e9c9a3c68e71b35d88b8bac86cacbebd962c66e18129637fad2d98d21e45a32672649492f131bae88c9989bd6372e17492bedff4d9b091b3dd00ebca6bcc49148480589f9593e32795299f3de7e09d88bc0ed27b7ef22ef7d202207fb5ce8c91712c3bd5e758d2822809ea5d2cb288332aa0760368259281a34447ff5a98c9c97c1d58383cd14f6d59bb5e5763217b2337ec2321268197f02cecd0d9fd93db39f8059a38bbb35792ba0d4ed1bad95a05b481c39f6adc9017dec1d662b0803f2ecf0845935765f9356db536c8c11887d9e44b73b6996ae7ac24fcad9c23017e5c2aca88b5a136b6307298b85ff010f964b7477a4f980800e69d3cc0f438aff7f2df8ac61d64435ffaf5e46633609e87\n" 2423 + ~k:"65243ccac0a014b9e52638171b4a88b02a8c6e617ab9467da523487122e6650c\n" 2424 + ~r:"56ab9947ac94fe3df7e35801660f68753b0b620a26594cb8fd375be3ea4dbf05\n" 2425 + ~s:"608ed1835139af29a2e3d874df465edd8d6428f40357d9ae4904efe8bccbd035\n\n"; 2426 + case 2427 + ~msg: 2428 + "8af31f66772fb0c31a8c5b28e568e6368cb66b591edfb0db867fd99e83feb3638bc80f0b14483d069e8f2e167c8b0f10cd6b45d039b7d6f833bd58d99b00597aeef82fa3aae2e55ded62ab660810de0fe1c92d53adf98c838c18fd76a273ea12119d675af727011869943d765b96ef266270b4f89ac72edadcf707a4a21b7533\n" 2429 + ~x:"145abce3eaa8fa6b670afd658ba0c14fa98d2d20e1422367d4455967f9844858\n" 2430 + ~y: 2431 + "22f3db9ea369938ed750d5ed3781368d594e62635c6b6e103d6db489a9972f398203abb973d5ad9c0dc110586978d2061483c0202738ceb01a665dd22fc568cbdff2148ae664dffbf888e4dda5a04fd3e89398b4f1ffc3a3813ae94da1f8965efbe7f300948749e9757cc7c05f6e53fdbff994c223aba2c137151b6a320f5b7f8cdd6003baa66020162990624099f3cf56d68b74e96ee09240f2cf11e3954e75b261ef9e8e3551c6c00f41e9eb17421203a4565388c321c1325f72eb10c28a9deeddcb4806f625382b37f0becf77936b7f83d26bf1ee1fe05e8a0005a4058c678eb569e339423e7c844305f4a18b1160a0c430513fad715896b62b9d6e2468232ae375f5f3c0056245eb4616ba11a6029410a955af09f07595fefa03e5516c95a4cfcd66046be2a4f7b3ab274b21c0a4f126c482c934c79dcbbd6916f3b887b2600472495c8335de121c7720f29ae56f5ccf9b99c9ce5655c5e1d15d67895af0dee586bc491a97241f7eff434bb79aad831db0695781e6b512e8702407a7d748\n" 2432 + ~k:"06f085f77088ec97cebe5397a588369e3dc15b70f2a5316a6dd5f94967fe3dbc\n" 2433 + ~r:"0fda7a8a3e5d324fc0a1c2841cd22f98757a0c6a2a465b0d9d65bda9b23b3c1a\n" 2434 + ~s:"40860265229085453fe58487a933edf3c28433694c7b85f6370d9a4783168237\n\n"; 2435 + case 2436 + ~msg: 2437 + "e2456ef5d465731b976f2ad1fc94634c0569a0ff7566a49d47d69e60b3b6d7eb2ab25cd49c931299796bff7e9774075ea20a972e3949a29dfb50b2b5613b45c596ca5dab282ff183f564a06311a49601a1e8560d43c6a481ce713f46c6ea85bf4c16489fbd72cf552b26516298bc66942a05d5a8e6d0f6a88f3e678d310e297b\n" 2438 + ~x:"286d3cec1d2ad2a85f0f163245267438f7d7d62149ba9e59a18dfffaefe44358\n" 2439 + ~y: 2440 + "dc9d68b53f35c29f7ca003a2583ec8f8ef5d78a0e45db3c884d35df4fb531a080ee3831bffd3c756ea5042c7614570fba2f6ca4870db4a453d0f793fb4d0225d94f27412dbdf43432f52cb8f867fe5f492a8876d7bd850d899ba2f0a53820c440841fe0cb76fe0444bd6c3235785a3da3081fef99f53a195314aefe955f2964c56506fcc969b67b323766d299c0b02981c72a2ce3d7524ae6f08458795fd32e31b47aa1f974e356081163cb23efd73a9e655deefe5e734ceb58e88a9dbb524eff7e11c3e30680702d8560dd8b6ad9f61e7246c6dde164e914951d6a0573152ec8bdea679dca1985bcf267304d5f1bce2f32bb9946a056857359afbaffa59bee61ad960c567efe3f1145a8a87c2491fa6b33f7e71fcdd8f1ffbcd2b89920907d1144a8cf0573f5b89217bc0598c6e1754f1ae7d9d42a608a051621419da91d11bda9bb9dfa7118e4b663e7bffe6e9946c77ce9f8086dfc822a7ef728888b31654a19b6debd2ca62f5e3b4e289810435b363ecab511f47e9e157f0f4198862ca13\n" 2441 + ~k:"183ca3afd082bf3de19e89faffc5cfa7dd713a873c02c723279b3091f9bc627c\n" 2442 + ~r:"778640ce75da584a6a83f9794c4ffdbe30411be43027758c74f89f7ccc7f3983\n" 2443 + ~s:"6125481e103f7803b2f16d9a4d00f881e0b367024df5822f7cbeb5711e0e4401"; 2444 + ] 1724 2445 1725 2446 let sha224_n256_cases2 = 1726 2447 (* [mod = L=3072, N=256, SHA-224] *) 1727 - let domain = params 1728 - ~p:"f63b3cdd646d8e7ddb57216aa6eec2134d707488a1f29cfa9970645f1227ea5db2e318eea5da1687c7ed90509669345ed6134cff32203ab72aecbfa693d216aeb55d8d28a981f4abff07d1319a799be5dd746f84842817929c305b408598af12045daa2f1ccc8be4d81b513c630f017fec1658aca108a1af6120ec05e3018c4253c9dd35bce062b73d0f2a93d41c481a5c43bb97909682d39a9a60dc3c35e36375dec6ced0d2db3ba0d111bedea701a0e4753624977a9e75b70a74e2b81e38a52ab22da131b35416d3cec9663079746a763476e57598142e39861545daaf8d38a176f26c71f5afebd9c5620da80cf3452b55c37c661b4a1ec0351710b9de4a3cbe0b98b4d9ec89128d97aa7efb19db8ba43cc0be25c200f90e1506cb78ec0c336d7a95613d4204e8ed68d0f0a6c78420105a8d2d438fbd2551a64a1a0b03ffb878742f8c9979cfa87394150281998d51701d5fcfa9696a4989fd25f400955e626b1abe926c0afa69aa6981900effcdd030592f82b2042a47a9a5a8cb0283dc4d 1729 - " ~q:"80000000ba4634b5fa4da054bd0ca48ae490e57711f381193842429159ba7ca1 1730 - " ~g:"8ad4553c4e49aa24728ab5024417b132d2ca53a55d959458f2f759adb0435beeefa3a2cfcd0038e2420643fc4a4deeb5d9feaa1edf21193b40e14b42982a94f35c58b81147d7189d263c9b12fe63ab9fa5f6f03a2860c186432e3ab04f2ab0f2fb6147bd9bf7ed5d20713b9da21383e2c3a168e7d09d3d8a5a058fd23095b5acfeb864a3306be2425fa1ad32ad6d9382e603b03c68af4af0246397102c4155cba811abf99da7839e77b2eac9970588ca1d0a2361723a164ac9229c2e80dcfa8db4f9e29803effb3168c7fed7a3a6de40dda19a0536af9b5b7afaefb9c70d6ae8df12da658f6236043aea873db29ceb6f07d108f5225687bd0c30e3084e2090b45ae2f92a97b8ecb7a9705c4956b8b31c4a3d61107c84e47adda6c80d5d22dab3d859220f9d5aab13677ae3df168f0c176d176b54506c639853f04ddef2722f39c18e5ce426e14562ad8ff26247af88870efb72c0cce836de8fee67a662378245b502bf1f83099988a093ce7cdc81364c78b1f4a51b800df6137c71d65e6b089a" 2448 + let domain = 2449 + params 2450 + ~p: 2451 + "f63b3cdd646d8e7ddb57216aa6eec2134d707488a1f29cfa9970645f1227ea5db2e318eea5da1687c7ed90509669345ed6134cff32203ab72aecbfa693d216aeb55d8d28a981f4abff07d1319a799be5dd746f84842817929c305b408598af12045daa2f1ccc8be4d81b513c630f017fec1658aca108a1af6120ec05e3018c4253c9dd35bce062b73d0f2a93d41c481a5c43bb97909682d39a9a60dc3c35e36375dec6ced0d2db3ba0d111bedea701a0e4753624977a9e75b70a74e2b81e38a52ab22da131b35416d3cec9663079746a763476e57598142e39861545daaf8d38a176f26c71f5afebd9c5620da80cf3452b55c37c661b4a1ec0351710b9de4a3cbe0b98b4d9ec89128d97aa7efb19db8ba43cc0be25c200f90e1506cb78ec0c336d7a95613d4204e8ed68d0f0a6c78420105a8d2d438fbd2551a64a1a0b03ffb878742f8c9979cfa87394150281998d51701d5fcfa9696a4989fd25f400955e626b1abe926c0afa69aa6981900effcdd030592f82b2042a47a9a5a8cb0283dc4d\n" 2452 + ~q:"80000000ba4634b5fa4da054bd0ca48ae490e57711f381193842429159ba7ca1\n" 2453 + ~g: 2454 + "8ad4553c4e49aa24728ab5024417b132d2ca53a55d959458f2f759adb0435beeefa3a2cfcd0038e2420643fc4a4deeb5d9feaa1edf21193b40e14b42982a94f35c58b81147d7189d263c9b12fe63ab9fa5f6f03a2860c186432e3ab04f2ab0f2fb6147bd9bf7ed5d20713b9da21383e2c3a168e7d09d3d8a5a058fd23095b5acfeb864a3306be2425fa1ad32ad6d9382e603b03c68af4af0246397102c4155cba811abf99da7839e77b2eac9970588ca1d0a2361723a164ac9229c2e80dcfa8db4f9e29803effb3168c7fed7a3a6de40dda19a0536af9b5b7afaefb9c70d6ae8df12da658f6236043aea873db29ceb6f07d108f5225687bd0c30e3084e2090b45ae2f92a97b8ecb7a9705c4956b8b31c4a3d61107c84e47adda6c80d5d22dab3d859220f9d5aab13677ae3df168f0c176d176b54506c639853f04ddef2722f39c18e5ce426e14562ad8ff26247af88870efb72c0cce836de8fee67a662378245b502bf1f83099988a093ce7cdc81364c78b1f4a51b800df6137c71d65e6b089a" 1731 2455 in 1732 2456 let case = case_of ~domain ~hash:Digestif.sha224 in 1733 2457 1734 - [ case ~msg:"957973fc3f3fe3f559065be5d4a0c281cf17959018b9a670d2b3706d41d5812e37301005f8b70ebd2fba3c40a3f377a751b6cb9693e3cb00d92888247d07921d3c1e9257ce08733b8926e0df7bdb6e855f1f851075d4e628d110d42b643b54876e5faa3611477ee68371562555269ed62a9271bad50cc4d46038de2dd41920c2 1735 - " ~x:"524a7ea5977f8102b3552930477f5f042401165d4637dcd8b9d13df4f3aae5d0 1736 - " ~y:"42243539e49db9ea19d98d97f6f2a94b23529812df889eaabcfeda01ce4c759487fb89bc82da75fe1c9134361f86de47d16d8eee80e56ac502178e8ed8129477af8bfbd8262c5edd937e1a86c0f0e7b2afe7bcbddfcb5814ced0b756a76ca178423bb4d578c5da183712d968582640aa0ec7e9fb56bfd960d7a57549747d8fb7ade47cfe816c1e57da6633dacc537de060813964bb5b2757a312f9da3d84e60aff98170051d3d90e380b8bcc1986c58ff9dc91e8827d4f9f5fc4b2b2e743cf9389ff02dec01f5d434b430d162e891c3355f91855339f8df58300e4c993ae4df8c4318b5c4bd05283ca4b46b7d2fb0f6476bf15907f50dd4141aa7acac9daa62eccd3a67357122060b6cece0446a93eb230ad93bc9a4d1b1efeeca1e3fc83c119785035b439509ffb7968b1a448b7bd8315753fdf04a256eca1562a11b096c90a36b353659cbde4420e17e90b94c43c7519c60641ceec056f897b97d6bb1861268e0dc79b7c3b6b7639c255bf06865737459126cb465bc1da4a043a1963da7d63 1737 - " ~k:"29e4d7790e181b4767903fe0eb37757f33f13337c33588c1fdbfba0e655ab621 1738 - " ~r:"2e59d5f30f73781d38255b70dedeeb38ae78df4f002c1f747c08deadc6530155 1739 - " ~s:"615c55b2df0ca28c60a6b385c58fa036df8c4b2f4f1935730bf8f4f0bed13610 1740 - 1741 - " ; case ~msg:"54071aca28969749ce2e2dc855052019bec27d0dd6a310219311b4b6d822467b22b3f02fb8313993fc77c4af1d76ab9db99b0b2b78204aa45f4032a7d945f93d55bcb8a6bbd47f98299a0929710461419edbe1132dc22575f5afbe7078cf5f05b231000f4a0f9f367d9025ed3ae1786e0183eac93ea96b55304a8c2dbf690821 1742 - " ~x:"4b2d62d0e7b88436737d03d6f64dd6a6dd0757021817169ba373e3a31bc12cb7 1743 - " ~y:"ef78152efd88130a4fecfe235037de2309b1e2f322d4f4154756caa8f0b3e41be45c80d895de56389257c391307286be8e8709b80186e2724172b0f2974be591584916fc0e750c0caf83d839b5c248f5de658668665f004bab8ad310118835957c02da6ae9a2a79da039adc884f9eb8b62e379e27f549e7f8aff8ad2fc276ece15f0423528a09e31b26421df93573bec7a4d6c2cbfbe5ce0fce0702088fb384ad1dc35bb2c1c742d43d79ad136e71057cb9f22ca042e61d2c5cc4ccf5b75a7379922bc4fd88372d2a8f6a2750865f91c143412a3fc61e4ad4abd03dc1ca0fc4297ab107a1963533a3d80a24ae2ec4146e8265acfd4446fc28103c5047c17796c4148b8e658e44e9b1c259d63c97f0e766fba8d9a7394cdb734508bfa09ae42d2da3068e2c85af2065f618ec3f3c73d73a750c13644c96e3dbbb7474325af48d1d145c28d69f22cbb4a9073059a9c40891804c73a229f01cef0678cf4855d18f900f0253acd6b3ee53dd96c4c92afff1f3087eeb4fba86d2e9495c5f734a46ca2 1744 - " ~k:"5af719a9e5d8567dc26576782e8f247517fad5ac5de0f7115c5158748fc73b40 1745 - " ~r:"0debcf6c88504a882a0191e6fa4c774c10858362629428aff24c22e3364baa15 1746 - " ~s:"53d8c1dbb3a2c1023521b705005ce6350bcf66c093588c35d768fca295a4a9ce 1747 - 1748 - " ; case ~msg:"49d5f20acf1e9d59a656bd163fe46fc868476ccd926377a40ed3d7476e9eb7a8a70c4b88b16e799148d25fa23bd0c91611b76c9665f5722f404fd90efdb8ad14b759c349ff6c830642d51076ccbdc57f152fba41c6a7f3cd3905fa7c857265ffc7596a64dc69490a932b95adbc79a3b4f21b2c6fb5d5835d8bcae5d44d912a0a 1749 - " ~x:"4abef24f715cfb3ba6e39c26b07ca46b700aac69fb8df3c0e09be08df90e44e2 1750 - " ~y:"8ff13022080316bea49b89a06dd5a971d86e0c9a3af414258a8f485088b66cc38cdea02cdd62096c00eb0d1c2ee662cff16f6d2d30440b2ad9e897b9eb939b1299ff879557f163f17c8ac60d0c6e998b3a044b43fbfac7b0cc30a579a6bda1b4ff598a531f9e37cc1901a7b08e794a7401d0f8ca4be55bff7b176321828575a477686a98b4b17266e101601f436e554b9e4288057970fa3463343e7e52a58ca145ec9befd7be31ea766ed74ac178bccdfee9d29565e7935e8d70c3eb091e3e3b3e6e77716931ed729c49b96443606098bd0810989e0e6f253cf3ec38294231b711b09a941609acc8976819076543926ec4e06f3e4d7f123c2b8771e54589e04524e3b4f950da560a25d12172d4ebdadc1719400d91cf0264708714479200c50ef00ec0e604909a546c95eb2fa53c65ee72ad53f149c938dc2193496db07af3b30a1f439708aa115c8dd47c81c1bc68ea3abd9026113c01eb05558b8a2be9093476f01247bfbeb3f2858b13e6228b98205fa710b6af1c5f71480dee401d7472d7 1751 - " ~k:"5472e89286e6ccbed316fe7564e3eae899ed7bfc55ca7fb6fbc392d191304bfa 1752 - " ~r:"19a73b049b164dbf7fb2826f4253617cf1c5bb46ffc5204efa00002a79e23c0b 1753 - " ~s:"7be137c109e68f337b5a21cb591a87af1cb8681419f875ff8f041e829991fe28 1754 - 1755 - " ; case ~msg:"1190853efb7e04cd4947c1ea5b1b5d9e0ac5e6df1dd050877308f1b2c7e0a4917e588103d28c0f6e8b72d967aa06aca68a986d807740f2dddde7281e550af4f637eadf61f880c7351b486615096f6ba50d8754bbf9ba1c49a3485815ef06b3cd761b5586c3fc2b464c6fe12c160ab0f6f446fabf74212430cec15e75a57b102e 1756 - " ~x:"7b2510c73ea6447bc319de79afebcf45482917042a3ca3c1cb1c97d1a1216b2b 1757 - " ~y:"9bb81c80d2b8a601a09e22475d70d1dc5513409fb4668b176c76b3aa1af8630ac7790a4444ab823787f6f569bdf02b9eef5e7bb21a88e3d3296857e91919f3c473add16bcd763f31a2f9844d7cbd8d480672a036c4b104be66acd66e6ef0e8a744b3d878090d1de9f105560247c62153e117efa55ec61c177cd82f8d72c51d253f4dc7336f79826025619fb2103f91144f90f6a689abcc51c68affd28462578b183eec942058f48abf546f738940a6c26d301c4b90ca40ea49c117d61147e8683989baed7a221c4f22092f72b1ed604b6aa94ff6a574b4215bd6f8e9d7b638afa435a3346589a61b1d1db2989d7b45f3234545e8a22d605ad6cb036ef791f625d2c6a995eda3e0cafce704a2bf15ab5dfad0162104592d23f52aa0fea1f432f0a308d16a45e1f41f823262074e9173754ceba70cd8a370dbab1a14f84159116da73d3a9cf82594cb3af95797cf444272850589acc6bca471d076335d67c461db602395bfb17c39bfa24df140c0ac4388db0534a50dfd261374f81b310f751d16 1758 - " ~k:"0fd7617bfdc671127a1d7465f683b98d8951a741f85d43cf5a5bef9232a16ae8 1759 - " ~r:"587d7f4454d59418a7527570f28f1b07451f3baf28f5cabe0310c4d79e4253a5 1760 - " ~s:"18839404aaad59ff24d6accec3b7cc6ac7003dd4adf96b77bab068ae72f25f61 1761 - 1762 - " ; case ~msg:"b1cb430c5a1d72788c795ab567a84c7f5977965933a5bf238058f2fc818880d25b4ddef9635481fd9fdd4598aecec3764fa73093a225d4e4ebcf01e4b75bdc1841dc01652c4d9916afa24b89c2d6854b72eaa7b1f3089d1a919210831ac80f99835790ce64abc34270cd4551d31b8f5348ce8a70df60b88e085a984acac665a7 1763 - " ~x:"403b2137ade39c1e5b817ffbd0bc3448024089fc1925550b5b860403e7ba65bc 1764 - " ~y:"a81a54be0685f33505aed9591f333a74a842995da5135fa48f5053fac29fff08afd9b901c3df1347204a3f133a7dff6b1adbab077526b638a63837d7844339d48fe107af08ed62e87de547ced84df9a2ccc45876b29bc5361ce8a9a21b81d4f85d3b671c9b44b5483f2610efa01751d3a07fd694e46653ac47ac64a910b7fc421f07e5de54e898789989091e9ed58b7c04e9e1dced60475dc693a0eb4015ed658110b82f8e720dc7afff69cea7b8e56b8a9755bf1e2933d083608377504cab52d38cce1ba82f84c26265e693f18cf52e930dc0d8bc9d41f4d28b32b7405cb1fce88a55be40dca1b1a351aa7d77fa6ef84c776fa301dba2e236933d89c8b944f53403414df0d434db72caa749fbcd566d76f4f6f0bc40e42a29aebe6210e89fa0ca8b6ac08a4cac65c590503533c3e4f1b3c5bde868e79d9da918b72d1b098a7278769546b78450e00e46dd400efe97c884db9612baaaeee2486f64cd8302a4c32d8fdb873fe0afffd7bb74811220b01339dfc5e567c766af2805ec1c30126399 1765 - " ~k:"2c1ca8b5ce7247dca6173fbaf854d00020ded6300311f53ebec8eccef9570d07 1766 - " ~r:"60d2763f0138076e9e0e20f83e4aa2e9aa352c19ca79e3726303fe89b12e27f2 1767 - " ~s:"07e08d916c8a10ba269dc460ee9d83f86a7b3d98621bb7324a6a7e607238baa3 1768 - 1769 - " ; case ~msg:"3bb9430eea6979129be745d5ae6babd4966e3abf7d9ee5856f2caae6014cb340eebd28bd9f391eb46b3a2b8a4cdc224e5508532ca08cb104aff677133cf4393a20fe4499967dfa64515455930c659d43bbee2340b14a3b3342d4b9a466b889e850dff4b2a51d389ca32fb6a5f433ed93032be4e563695797b8c1e1e019184172 1770 - " ~x:"0d3fc8fc4c59971a963e8e41d26a86499c962615c64abe011e88e590bddd3b0b 1771 - " ~y:"75b765eca4ebde0b6564c3137f16cdae00eeadd2d0b2cb83cd1500cd05ed0dd16730c9501c8a353a64634d065f6137ffcf9563d96127906fb17d5a79ad291024a4a6fb7e7d080219a6231ca158b65f5202912ddcb8dd1f018c9b0e76b3a476336c5041bc502f8acb748f136c3d78cb2c429c8f1ac17b63dd7e9e57b607f9debe571459df3688cf4c11fa1e84533aecda2dfece05f4bdb268cc7b0c8fe7af5a633a83515ada95f31824d6a3c7122fdcd12f54992cbe64d1d6bdbd0ab5ae4d19aa52609750a1de186afab5a16398da473d128882b065e873809fae0bbdc01a9c73b5c6ee65857fa794a15058ddfb24a9a17a0408646f2009dda610c8291ae148a18c173f836b197c78ede5654895b45a3419e9c3177f2503a93ce526be14ad919939ebe3f2d07f006a0b022d6a623c6017f0c76619f0780531d5390d4239b2f900efb44c9530c7d9b3e84a70c904b179ad0c4f909250f7ccf83c5f42d6437cbc9f03fbae8131a12d33e01721e650aee91e1c893f5e7e039e0d585cd7cd7495c40d 1772 - " ~k:"32d9aa04b104b5d7b59a122b368fe0cf476e28098b898662a78efee764545ea5 1773 - " ~r:"7416729a1f60208b7f837480fba81840e45b338ab9846e9bbb9168229f64bcea 1774 - " ~s:"58eb904076a3ac6907d750ff6cdfaa465435e9982ecbdf72197b09bb6df1373a 1775 - 1776 - " ; case ~msg:"55a69fc16f6b753d0bf65e844d067859f51dd329279980196063fb59f89bd778a9244f932c2adb6811183612105d1c527e8302dfee5042cfce5dbeab165a396f5a4c21339be1021b7ecec66f2177f94243ef6261608c56919679d44863cf9d2afc6010fc2bf821b931ca3970d69b1e622a908389db5049d718e357071063aef8 1777 - " ~x:"3dd224f00ee1d4648c600b10ba05ff36ad2c06ddc5a9f0112e0331ae958f36af 1778 - " ~y:"6146a51deb79957a83b2c7a3204b5c34ae4f8e0db60f0c07e70803f22bf99a39647263db9e285d72f6270ee10f18584c39081d2544d40502c50df1e35a457600b5569d61e8126c055f7b964572e9f3282e4d9745006955c24261c68d7c0cb3f08b0b0d8eaa971e1a631c68a3a914d35efe89f76b9c2116afb7bd1989e202e092b5b570eaefcc933542e650d92c033b5973821d6d77cfc243f744da80b56eaea7650bf50802516228ad6d5b0d4e889c575e3678ffdb1c289e59d9ff7f84a3d63d39d6888dbe213e2c3b3114085e006ad74505739fce826f963284dc4e2b01ec2f9233d3470e82d872ed944e62961f64134e8080daf2df494a76240ac0cd22f9afae7e80d3cf3efbe055147f62ff8c6192e388b49e47d9feaf19eccd65dca9991638ebd7b048077707adab1cb2a4358eefc4aab8251fb0f9d5f0b09f299c720d3a8c00a5a4d84feec040057040b709cc0ed185a832537bc4b2df0ec1f77169ac96e91282de21f342d5429ec3d66ad9d336c440949a1211217bf54aad93bb4b0a43 1779 - " ~k:"7969d08c0cafe4019b64ad3e6614be0aaabc2c2be61b3b3dcdd10d5f75fa24bb 1780 - " ~r:"136f93dcc7d33e559b8db0af13e00c7190928bff5086eedfd11706e6f2349ad0 1781 - " ~s:"32b95b9b147c7d1ac2a2f0057fc0538a4b7c9cd4652e6783e5d7e3534655631a 1782 - 1783 - " ; case ~msg:"1567890c69e578a27d6208913dfbc20eddc61f5feed457400693dd170f8067bf290b11150780684c20d5cfd2bf1d536dd3b70025883fb41703436fd09c0a141125784f9091151303ef80cd345e5a7d2854335c2984538c5cd739b007248cd99f1dbcd3148cb0ff0db633f8cafc7a0b99c61e784d0303a5120307d3fb3c4c219e 1784 - " ~x:"3ac374b2a4940d92ab35ebb8e59677fbf95980fe632ffbb1db4f385ee4e13a15 1785 - " ~y:"5c53d13a1bee17a28720b7089646d07a3fd58b9b2b23ec94af3144830746177b0d2073707b6b84901ffaa7a4165ceff2425640fcfe5d17650a44a168ebd769c833445f1b2d26434c228c1e2edf1704d711a86257be25235a7cea1e5cbac412235b7596d1dfa0398081a4f18151cbb51dc62c226a2abcaf3335e86ab54608040ee814e443b64398213ba60d7b5a3c8ea78ec6b98934c89aca05b97df5f65bc574a30acddd09f73cec14528be49a2fbeca70291b1b29f7042c594994da128fda22b3ed3a935a1a00575ff1ffd193c4cac53a2a2d4b0c510228a76a74333607d15b568614427144b4174da358e383f658c60b45710036f54f93f17bc808b302674e838c1dfd7f816f7ea44b0d97386e4e1634c9539568dd6ae1c28f25b27aa94499ae389a0926c8fa62956c6e24dced0afb0491dd9fac0516d27fd4d2dd0150ee6b4cff7bfd575043d701daad0f1b942a0e4c61956b32a68c9078f6077fa9945198d447a5bf3c47b7288427edc6f99655aeadf8de18515714c6b9c0d4ce5ab092c2 1786 - " ~k:"7ca690c92c8d4a3ac1d5255a2e5a12922093b8b2ee95906eab29b67f84fd21cc 1787 - " ~r:"4947d36e7426f1441be5a75dc9cd845450c61104f19ed40ce33e252fa2c26268 1788 - " ~s:"356879deb1daef01da04750d58e598db47aaaff50b1cf42d87334a615780ff8c 1789 - 1790 - " ; case ~msg:"4f7d894dfb7d82040a9fed6c26a7d27a9a1511388c113c64715a06dc46fcf4f904070a6ed95bdd8dc1730a27645d37eb3b02847cb1c631ec0c67b2ee07b8805b34dd9b84e6ab3f9afb9246994ea579567a8f4af7feb86898cc9cb534c387993c6ec16584ac85bed36bbc2c305770f21163686167dd53fe562362ff549d903539 1791 - " ~x:"2c14cd975bc163f9740dcb4a5ba9d8529c5a075016e02400dbfede8dd4f0d245 1792 - " ~y:"00967478358d7c1696ceb92be850f5538ad8543e151aadd84caba1b72f3636a2092a86b6462873903d5bf17f612b45b5133eac1630bf07c0371423d2e5d7147ceacc9baa8cb3b04cbc3cbda429ab40d7e592730dc477b0a95f1fb5ed5d91e14b9d5a1ac8d403a55a658d1c383bb598053be238cd82386968aedb811586fa2a14119324896f2111b9bc7cff666d37affe76041d98f362daa09ff65e82e865eb29c5d4710ca7800886887d383da0cb599b225fdd210a3d70929d35fb9ca807e56c91c0851252b95c07b6b120b3b650418e0f54f45736f82018d09294462dde6eeafcb15a2a728577faf3ef3eb13db044965ea3892f7eb0884e47766089d2a43abc62a3c375831c20848dfde8f83c249a8e27f2897cafcf5a06b7c3591e09b42f82849d498664f485de26c788e559ad5b15f999db927f81f54b96e997b9096b2a7e3e756f5a9aab54c160cfc2e64492179487c98d0aa38308d67428f3a113228bc6dcdf7ab93cbb1da225c72c636f49d27442cf3cf2f9c49b90ac8bafe740dbbfd5 1793 - " ~k:"141936264e075533a96952808935238d715e7cbd840c016ee7a9f508608e4808 1794 - " ~r:"0940724855a0671d60147dc61fd283190134a68c178114d59ab58da73a1c8182 1795 - " ~s:"43f194b97078dc9b84c8e8e867a74bafdc2211706ae110b5aec0b99ede1ffed8 1796 - 1797 - " ; case ~msg:"9b62a74bc49ef4ff5c62165e7d25521f135c836bc4ef023fb4bb1d6b42c6291071eae0b465c59231cb297cac6d145875fd84f5729f79f92218522b9e55cb70d471030d36291a24925ab731a2d4458cff677079d207ce865b3d5526009238861d64506a92b76baff59b37b863087558d5965d76685f0fbd1fab1b1f9561f8f69c 1798 - " ~x:"70e12e51a254831bdec081a8882e5a24d78b48b6dd163727b93f803734e06a3e 1799 - " ~y:"75d7d9a5dbdd47cecd12f69ab212dfe08a9656e2bca92c81db2d268a293a325e511cd5aa1ba59deef2ab6311665dda58230d48f1416371de1a8364b38f5ad599c472d363a18a2c13d572cf849be2fef9a166e838aa58b721ecfc4b361fdab1d0876b78e2e8f23ef1c82cc0e1700fa015a4007b1d7b535c82d23c129d1d1c9c4afe875a06c05f71f078cb8d9060f4d936671faee217d4045525d570b0c8ca0c4e8b55dfe9b780ba69c9d8cda10c50fd61c4e7214b943c1c29797b099f57a4c648597cedd9d909bc584a9b754b209515dbfa0fecce2ad05c848e99dca21a6d0d5f2dac2361e4c0eaf96df199ad2888d671974ef05d65c92788434ab42f1f1f79edc49ec1fa921395bd0feb6a9e6a0622e8255b0ef6937b89d0cccd5852872d2b0ab5d79c2f198bff6b8aa38acee21d6c3add5562d84d968758d93e8c1d611f7d6182b62e44f57df342899bb564a794d13915882143d9df45f8f21cc030af3397e9e949683ddd8d8da9909cc1139619e4b7b252aadd02c66a5e20105adf26f2f021 1800 - " ~k:"5de7fe70b5c60ec0ba66ade4fb6b0c925d1d56d26d6f57c5d12d07b5f6f800ed 1801 - " ~r:"01e3de398b018a694780ddc6ca12b78dc55e7ad9fdddb5a3f5b2cad0103253dd 1802 - " ~s:"03c98280abe3050a67f88ef29fb214a80124f47321c62e41e3905b8532f4936c 1803 - 1804 - " ; case ~msg:"6c66051e04c2e6aaa43de9aa42cd9f61e8329c124ed3031b67452db4c435db291d756ba6ef90ab06307cb8d70f3496792e633bf5ac985c37c43bdb4e455c7f761a5ee450567f85cc977e968e7fa42a428c1a7e915c82874865631d8078899377255947c344618297b83c96114d11d74d8cd579b553667cac1d97aea4d1684987 1805 - " ~x:"11d2f10293c3884b1e28a600dd71b2ed37bea133255a0f97e641f9530bb4693c 1806 - " ~y:"ed2e10a44316d677467d79947bec9e405d30f32d860a1ce46b366845df9ad222b0f992f5844571b196a310d587fffa74bd510215f3bdafa1c93d1b1315246fd2f794c4da07bd722a98dda9a02ad4255b6d5267738256cb8639a145c28404562add2bc7691dac12600ba9f8ebe00614ee3fc6e6b2484d9c5c7090b3f3b134ba19909864563040fe8752d6c6ab95111fe1014bf7bbe4e674c9d03bb8d229e4b5f6a6e471c678b0265e88ccad7960fffae700f3a75e61a24ea882b970535eb7017e16c48ce9e2bc8357f7f0889c871d0b4ce29d279afd1d114998d1eb6fe4a5661e429b1327f0a39e9ef00a41a74fe479b90fdda21d9315555afe227274c11a71c0d10c9e5dfc89750eda53c6a8b52a5272c75526375e5fb91ff75d028df7aa2bceb5fdf6f8e3bc1ec3f1e226d04df1d842e4c8f458988cb7415f0d2ca4498b0cd67e8b085b008fc4ca064393a0df517f0b4833ea4051ac3f1de5686dccb7bba8bd939092d6d78fa08f5bf9bf6f13d7aef72f047fcc47a88223df6e1a62d218169f 1807 - " ~k:"2621703fb8f5094bc68eea72d5b5caf26f8ea3a173158b8d3e7f9565296767f0 1808 - " ~r:"31f2c86287e572ff4d07421a58dc7b3d727de113769952b6d8d736088b36a825 1809 - " ~s:"30acbd1c4cd6aa666ee52b0bdc41fc3b239b60d57e279b3f5483c4d54bdd97a6 1810 - 1811 - " ; case ~msg:"5f8d7f283af00384a519769029d208b61eee0e1cb21ce9fb80e9d8596b894580da7ab3457429e72dfa64e7cb839414de344da21cff55b1b3a83189d208ad2089b35abd78e2416bceb66466762fd7ab9c234c4aec3872cbc8443c92b8ce4ee4595425e746e4b6f7972ebd5d065fb3fdc5e329e8a87ed3cddbe279d57227ae4b13 1812 - " ~x:"1de925bf532a50dc7a10984bd1dbd90500ec9ad22df0f2d6f185fd1ba8060d37 1813 - " ~y:"aa4d065270c38bdf996b1f5f1ee4b67a76ef1e7b134ea21fd0a6137521245052e74954b96544c700d40f36248ff29a712a098d80ca12e28fdd7901a622dd0988e1c4d67de4c497a957882ce992fcb08c5b85c6858447ed6fcbad26d8c40485f0a89d9d020fe233e89319038455644c828d608df9707c63170dd0618c0baef3eca8d1455460a2eb25faff444f803bca297bb680e5f0fd06e887ed50c8060f55d0160ec64517086f4e1d624ab7d12df1b5947017e622ebbcd6f4eddb0a41dcba82743efdc5804288d2863f54003eea12753246e6e0357df05501b195fdf3a7761c4c3acf26537bf98b32f2e72ff1e0159d046bbc053171e3d518344f0537f2e7200bcdd957ec96365caf55fcd246afe771709ecec28348a356a1d4eb136a176adb5fa102f5fa5c969f90896462e0677afc606a948b25587c10316d22e1269fc64f915a796c965b8be97e5beab047ca5198bf2ff856df740afbbc1aefafefb1ed47278b150e6a7222417d3a86494bdb51edd0616899526c27acc2a818e83baf579b 1814 - " ~k:"5f0d6676776f40cfd5ca255fd8e32b10bf3472b193818914876d4c3be68a83b9 1815 - " ~r:"7187cae836823618f9a6e847055ca2bc38c86e726d02d38f4950eb6b71b36bcb 1816 - " ~s:"21f6ff4175765430e2dbed342a85d30056b28905744ece5dad79755ee3d7bbbd 1817 - 1818 - " ; case ~msg:"b216a035b0ff29feaf7d4c34eeb1604155c90338006753ee2b36062d72f62b524504659f70b976c68952a62c2b9a2a00cf0066a5e5098a632df2ee56dd1a140a98f7b3ac12db3576b610d76563e4621637da1098aa20f3c83247b7278860417cecf7e137194cf1bae12bbc63a7bae02c906d503f694dea3bd534718e37704962 1819 - " ~x:"3bae9330b47aab85cec948f944ac13221ad35d859de56db56c31aae88345cbea 1820 - " ~y:"7d6b3b71b1415807d15901427e6ab002ee985ce7c8d844969c6e7294a2167b4c26171bcd646f0d1bce14df05e4ce58a3ae50b2aba5fb74455233fa6d179a0794cb26e92ca910cd1c16e5464e8fa7ba936341d3ac211ac1f8a2f2a19c148a1c3d6b00ac44c35ea345a3ff73ae9d5abcc6ab65162a53daabdf6da25f96958eaf89f559895cbec52351394f9132c9564d61aac792640f11e09aa6f6cde9ee9ca5e05fd902911163817177bf054cf2eabf7ce8f34bb1c4aded8dad93411fb276d2d0a296799661307de579641e607fdad058d9a3f194574ea76f4bec46bef8adc5d62c7390da1c45f6fc5d9a784f696f24ae7e6b27a809029418dd18a420455c2cc9695e7c0fe00219a1711468e2866b71f3f9c538789ed2843f44f2a821773c52d211dd1333b5f164ecdf6c3ffd71de6678b0c272f92355d5974eb21c3c8fbd0bca7538bbd9894750b1dd0142bea85104356f9a515ef1ab69daed98d94803ac912c770e26efa2fa0b04e11051ced2f70f06f2f05eac8029d68e12261657cf4dbcc1 1821 - " ~k:"248048e6fc52c48398f5cd2ccd8a659c4b7b76dedf54f3fb90c5bb173c5d24f7 1822 - " ~r:"67df1d510d063c9067e9759180be470c71fe09c4f133aca181bdb47bb87b2097 1823 - " ~s:"7328b887bf0d520abe6f24aff2153f40de009e2706ae043dd3aa55521d9572d6 1824 - 1825 - " ; case ~msg:"6c67116fbd21a0e3ed16b3c4ca58ac49661918bfc6a7c3a6acdbcd53dd4087034fca164df8d38f7ef7db03363701409246382ee053c69c84fafa3c77ad2ce08dc7f41c34a31da496d070a99435799f269dc8effd06d31f85879c299cf7241b37b9a4cfd545086393156737cd9da2d282e7d569fcfa5cbde4bba51bd89fdcc913 1826 - " ~x:"7fa66120c5acd5bac132d07083d07968b210cd9c26c2c56d9b16d98066f5df6e 1827 - " ~y:"6a50d1125f9f3fc2f7e023c093b3608e6972acefe29c0c6ba07a2f61ed747153ada4a9b680622a842b9a820119675620c11688700b855d4b8d13bf726c36acf923256fef1b53093622d1bcbcf023848b8b8f4abf43bb6e87b84d061deb75236224ceda914b18f7ceb72708789dfb94070413b0e65c1231ad02db42decbe0e558aea06c310aa1a8d113be1f071482fc61913225f007b569b6e867cfb392725776ad71f50dc97b834a71375bac18fabf781126d06df62124064e6a723b48635e6754fc767a5094d0645974041591d0ad4828f63783356696af7ff77cd00107949fbff4709dff8a660a413f5b6c0df37ade84fcbc1d3253ba617265a10cc087606130290909a4f813341efdb611696feb5bea3d7d00a53a81f3a2043b887a776075d250c1a010ec47660087f3ef05782dd21d298d6d37559cd473008f474d8deca6817c1390180276097a81f462c0527928f93a461f4ac2d6ed8c9d6d101a2a9a29201a83d0589f57be28a727484518c7425cf5744df396a0e14a4d260a5c8d29bf 1828 - " ~k:"5771223a25f539c80481baebe7b2862156fcf26220d6e953c37f2a22bce77c0e 1829 - " ~r:"7d489ab0d44bc73271ef42e28a60e1b7ef7dd27af4045546047085da408bccc7 1830 - " ~s:"310151d943f088bb7dfdcd52d82884a7f1ee64d46f9d600d23f52f4cea4d2862 1831 - 1832 - " ; case ~msg:"c8d416c1efe686637078122f798d8804f64a6e85e05f7e8e07634a309a98e92abd54061cccc319f1acd4a087b1d7dbf0b6bf2a09c5dc508ed14dcd5442056eade7691b7fb65b678ec2e137b5fbe875208a427c2a7ad90665426fbcbc7655e48a8965d23fdef11ca8092f511207a607359f94e91b197fcc993ee6ce3c37ad3b71 1833 - " ~x:"1f4a3cf1fb60360db3790a03fe55194985977c6884a5fc05a6fb5eafd53587f5 1834 - " ~y:"cc9b9d0292915d631aa0d9eb6161f924705c566ee09e74e418d88e6b67b7f57aff5170f6c42a839ba839402bfe517c287781dc97df2e0550b3862484d253152f6cff895f092358b5c4459048581309eff2f689230b4c4951db8413573b6eae85c2dc50fd6134461328e5b6439f41442b91e3a34204428d1e2c22412b012242b14f92e2d1bad626af95051bf06c74da4081b0d619e136a99c8da3a91adb3b8cf8bc5964ff655d45c75ada253aba91c64095394c701c53ddc11f388d61984c32d4326a8c627df845b4100f171bbdb252d3e28494ac173432dd5531e03040302aac8c07c9ea92a9ab67faf0c78b3ad8d454dcd428f942d8ce6e29873049fdbfa1df0e6ec224c9dd066b981a400b1f5194fee13cc5ca7ffbeca98ed0a0221377a1ae612740fce774eeed68382b32b686a25ffc016682186448207c4d9783e83da20a5e8b228a134dc3f44ecc565ab9ae162b855ecd37e6407e714045f4e83b971a5f4e304cd778f3d34137745fc6ea15b4b74d60176ef807410b1b26f68ea14f8f91 1835 - " ~k:"589da8a8ac79ad6b62b353422691f35e6474e9c605d877670dd95738b4935f06 1836 - " ~r:"7fa51231bc845fa8b668393b78a7b0408113fb77c1e36f3c78c67d65715a8b58 1837 - " ~s:"730c9e3483811c52cf295bad042acb5dd6ee90083857bee95b6392b080b5041d" ] 2458 + [ 2459 + case 2460 + ~msg: 2461 + "957973fc3f3fe3f559065be5d4a0c281cf17959018b9a670d2b3706d41d5812e37301005f8b70ebd2fba3c40a3f377a751b6cb9693e3cb00d92888247d07921d3c1e9257ce08733b8926e0df7bdb6e855f1f851075d4e628d110d42b643b54876e5faa3611477ee68371562555269ed62a9271bad50cc4d46038de2dd41920c2\n" 2462 + ~x:"524a7ea5977f8102b3552930477f5f042401165d4637dcd8b9d13df4f3aae5d0\n" 2463 + ~y: 2464 + "42243539e49db9ea19d98d97f6f2a94b23529812df889eaabcfeda01ce4c759487fb89bc82da75fe1c9134361f86de47d16d8eee80e56ac502178e8ed8129477af8bfbd8262c5edd937e1a86c0f0e7b2afe7bcbddfcb5814ced0b756a76ca178423bb4d578c5da183712d968582640aa0ec7e9fb56bfd960d7a57549747d8fb7ade47cfe816c1e57da6633dacc537de060813964bb5b2757a312f9da3d84e60aff98170051d3d90e380b8bcc1986c58ff9dc91e8827d4f9f5fc4b2b2e743cf9389ff02dec01f5d434b430d162e891c3355f91855339f8df58300e4c993ae4df8c4318b5c4bd05283ca4b46b7d2fb0f6476bf15907f50dd4141aa7acac9daa62eccd3a67357122060b6cece0446a93eb230ad93bc9a4d1b1efeeca1e3fc83c119785035b439509ffb7968b1a448b7bd8315753fdf04a256eca1562a11b096c90a36b353659cbde4420e17e90b94c43c7519c60641ceec056f897b97d6bb1861268e0dc79b7c3b6b7639c255bf06865737459126cb465bc1da4a043a1963da7d63\n" 2465 + ~k:"29e4d7790e181b4767903fe0eb37757f33f13337c33588c1fdbfba0e655ab621\n" 2466 + ~r:"2e59d5f30f73781d38255b70dedeeb38ae78df4f002c1f747c08deadc6530155\n" 2467 + ~s:"615c55b2df0ca28c60a6b385c58fa036df8c4b2f4f1935730bf8f4f0bed13610\n\n"; 2468 + case 2469 + ~msg: 2470 + "54071aca28969749ce2e2dc855052019bec27d0dd6a310219311b4b6d822467b22b3f02fb8313993fc77c4af1d76ab9db99b0b2b78204aa45f4032a7d945f93d55bcb8a6bbd47f98299a0929710461419edbe1132dc22575f5afbe7078cf5f05b231000f4a0f9f367d9025ed3ae1786e0183eac93ea96b55304a8c2dbf690821\n" 2471 + ~x:"4b2d62d0e7b88436737d03d6f64dd6a6dd0757021817169ba373e3a31bc12cb7\n" 2472 + ~y: 2473 + "ef78152efd88130a4fecfe235037de2309b1e2f322d4f4154756caa8f0b3e41be45c80d895de56389257c391307286be8e8709b80186e2724172b0f2974be591584916fc0e750c0caf83d839b5c248f5de658668665f004bab8ad310118835957c02da6ae9a2a79da039adc884f9eb8b62e379e27f549e7f8aff8ad2fc276ece15f0423528a09e31b26421df93573bec7a4d6c2cbfbe5ce0fce0702088fb384ad1dc35bb2c1c742d43d79ad136e71057cb9f22ca042e61d2c5cc4ccf5b75a7379922bc4fd88372d2a8f6a2750865f91c143412a3fc61e4ad4abd03dc1ca0fc4297ab107a1963533a3d80a24ae2ec4146e8265acfd4446fc28103c5047c17796c4148b8e658e44e9b1c259d63c97f0e766fba8d9a7394cdb734508bfa09ae42d2da3068e2c85af2065f618ec3f3c73d73a750c13644c96e3dbbb7474325af48d1d145c28d69f22cbb4a9073059a9c40891804c73a229f01cef0678cf4855d18f900f0253acd6b3ee53dd96c4c92afff1f3087eeb4fba86d2e9495c5f734a46ca2\n" 2474 + ~k:"5af719a9e5d8567dc26576782e8f247517fad5ac5de0f7115c5158748fc73b40\n" 2475 + ~r:"0debcf6c88504a882a0191e6fa4c774c10858362629428aff24c22e3364baa15\n" 2476 + ~s:"53d8c1dbb3a2c1023521b705005ce6350bcf66c093588c35d768fca295a4a9ce\n\n"; 2477 + case 2478 + ~msg: 2479 + "49d5f20acf1e9d59a656bd163fe46fc868476ccd926377a40ed3d7476e9eb7a8a70c4b88b16e799148d25fa23bd0c91611b76c9665f5722f404fd90efdb8ad14b759c349ff6c830642d51076ccbdc57f152fba41c6a7f3cd3905fa7c857265ffc7596a64dc69490a932b95adbc79a3b4f21b2c6fb5d5835d8bcae5d44d912a0a\n" 2480 + ~x:"4abef24f715cfb3ba6e39c26b07ca46b700aac69fb8df3c0e09be08df90e44e2\n" 2481 + ~y: 2482 + "8ff13022080316bea49b89a06dd5a971d86e0c9a3af414258a8f485088b66cc38cdea02cdd62096c00eb0d1c2ee662cff16f6d2d30440b2ad9e897b9eb939b1299ff879557f163f17c8ac60d0c6e998b3a044b43fbfac7b0cc30a579a6bda1b4ff598a531f9e37cc1901a7b08e794a7401d0f8ca4be55bff7b176321828575a477686a98b4b17266e101601f436e554b9e4288057970fa3463343e7e52a58ca145ec9befd7be31ea766ed74ac178bccdfee9d29565e7935e8d70c3eb091e3e3b3e6e77716931ed729c49b96443606098bd0810989e0e6f253cf3ec38294231b711b09a941609acc8976819076543926ec4e06f3e4d7f123c2b8771e54589e04524e3b4f950da560a25d12172d4ebdadc1719400d91cf0264708714479200c50ef00ec0e604909a546c95eb2fa53c65ee72ad53f149c938dc2193496db07af3b30a1f439708aa115c8dd47c81c1bc68ea3abd9026113c01eb05558b8a2be9093476f01247bfbeb3f2858b13e6228b98205fa710b6af1c5f71480dee401d7472d7\n" 2483 + ~k:"5472e89286e6ccbed316fe7564e3eae899ed7bfc55ca7fb6fbc392d191304bfa\n" 2484 + ~r:"19a73b049b164dbf7fb2826f4253617cf1c5bb46ffc5204efa00002a79e23c0b\n" 2485 + ~s:"7be137c109e68f337b5a21cb591a87af1cb8681419f875ff8f041e829991fe28\n\n"; 2486 + case 2487 + ~msg: 2488 + "1190853efb7e04cd4947c1ea5b1b5d9e0ac5e6df1dd050877308f1b2c7e0a4917e588103d28c0f6e8b72d967aa06aca68a986d807740f2dddde7281e550af4f637eadf61f880c7351b486615096f6ba50d8754bbf9ba1c49a3485815ef06b3cd761b5586c3fc2b464c6fe12c160ab0f6f446fabf74212430cec15e75a57b102e\n" 2489 + ~x:"7b2510c73ea6447bc319de79afebcf45482917042a3ca3c1cb1c97d1a1216b2b\n" 2490 + ~y: 2491 + "9bb81c80d2b8a601a09e22475d70d1dc5513409fb4668b176c76b3aa1af8630ac7790a4444ab823787f6f569bdf02b9eef5e7bb21a88e3d3296857e91919f3c473add16bcd763f31a2f9844d7cbd8d480672a036c4b104be66acd66e6ef0e8a744b3d878090d1de9f105560247c62153e117efa55ec61c177cd82f8d72c51d253f4dc7336f79826025619fb2103f91144f90f6a689abcc51c68affd28462578b183eec942058f48abf546f738940a6c26d301c4b90ca40ea49c117d61147e8683989baed7a221c4f22092f72b1ed604b6aa94ff6a574b4215bd6f8e9d7b638afa435a3346589a61b1d1db2989d7b45f3234545e8a22d605ad6cb036ef791f625d2c6a995eda3e0cafce704a2bf15ab5dfad0162104592d23f52aa0fea1f432f0a308d16a45e1f41f823262074e9173754ceba70cd8a370dbab1a14f84159116da73d3a9cf82594cb3af95797cf444272850589acc6bca471d076335d67c461db602395bfb17c39bfa24df140c0ac4388db0534a50dfd261374f81b310f751d16\n" 2492 + ~k:"0fd7617bfdc671127a1d7465f683b98d8951a741f85d43cf5a5bef9232a16ae8\n" 2493 + ~r:"587d7f4454d59418a7527570f28f1b07451f3baf28f5cabe0310c4d79e4253a5\n" 2494 + ~s:"18839404aaad59ff24d6accec3b7cc6ac7003dd4adf96b77bab068ae72f25f61\n\n"; 2495 + case 2496 + ~msg: 2497 + "b1cb430c5a1d72788c795ab567a84c7f5977965933a5bf238058f2fc818880d25b4ddef9635481fd9fdd4598aecec3764fa73093a225d4e4ebcf01e4b75bdc1841dc01652c4d9916afa24b89c2d6854b72eaa7b1f3089d1a919210831ac80f99835790ce64abc34270cd4551d31b8f5348ce8a70df60b88e085a984acac665a7\n" 2498 + ~x:"403b2137ade39c1e5b817ffbd0bc3448024089fc1925550b5b860403e7ba65bc\n" 2499 + ~y: 2500 + "a81a54be0685f33505aed9591f333a74a842995da5135fa48f5053fac29fff08afd9b901c3df1347204a3f133a7dff6b1adbab077526b638a63837d7844339d48fe107af08ed62e87de547ced84df9a2ccc45876b29bc5361ce8a9a21b81d4f85d3b671c9b44b5483f2610efa01751d3a07fd694e46653ac47ac64a910b7fc421f07e5de54e898789989091e9ed58b7c04e9e1dced60475dc693a0eb4015ed658110b82f8e720dc7afff69cea7b8e56b8a9755bf1e2933d083608377504cab52d38cce1ba82f84c26265e693f18cf52e930dc0d8bc9d41f4d28b32b7405cb1fce88a55be40dca1b1a351aa7d77fa6ef84c776fa301dba2e236933d89c8b944f53403414df0d434db72caa749fbcd566d76f4f6f0bc40e42a29aebe6210e89fa0ca8b6ac08a4cac65c590503533c3e4f1b3c5bde868e79d9da918b72d1b098a7278769546b78450e00e46dd400efe97c884db9612baaaeee2486f64cd8302a4c32d8fdb873fe0afffd7bb74811220b01339dfc5e567c766af2805ec1c30126399\n" 2501 + ~k:"2c1ca8b5ce7247dca6173fbaf854d00020ded6300311f53ebec8eccef9570d07\n" 2502 + ~r:"60d2763f0138076e9e0e20f83e4aa2e9aa352c19ca79e3726303fe89b12e27f2\n" 2503 + ~s:"07e08d916c8a10ba269dc460ee9d83f86a7b3d98621bb7324a6a7e607238baa3\n\n"; 2504 + case 2505 + ~msg: 2506 + "3bb9430eea6979129be745d5ae6babd4966e3abf7d9ee5856f2caae6014cb340eebd28bd9f391eb46b3a2b8a4cdc224e5508532ca08cb104aff677133cf4393a20fe4499967dfa64515455930c659d43bbee2340b14a3b3342d4b9a466b889e850dff4b2a51d389ca32fb6a5f433ed93032be4e563695797b8c1e1e019184172\n" 2507 + ~x:"0d3fc8fc4c59971a963e8e41d26a86499c962615c64abe011e88e590bddd3b0b\n" 2508 + ~y: 2509 + "75b765eca4ebde0b6564c3137f16cdae00eeadd2d0b2cb83cd1500cd05ed0dd16730c9501c8a353a64634d065f6137ffcf9563d96127906fb17d5a79ad291024a4a6fb7e7d080219a6231ca158b65f5202912ddcb8dd1f018c9b0e76b3a476336c5041bc502f8acb748f136c3d78cb2c429c8f1ac17b63dd7e9e57b607f9debe571459df3688cf4c11fa1e84533aecda2dfece05f4bdb268cc7b0c8fe7af5a633a83515ada95f31824d6a3c7122fdcd12f54992cbe64d1d6bdbd0ab5ae4d19aa52609750a1de186afab5a16398da473d128882b065e873809fae0bbdc01a9c73b5c6ee65857fa794a15058ddfb24a9a17a0408646f2009dda610c8291ae148a18c173f836b197c78ede5654895b45a3419e9c3177f2503a93ce526be14ad919939ebe3f2d07f006a0b022d6a623c6017f0c76619f0780531d5390d4239b2f900efb44c9530c7d9b3e84a70c904b179ad0c4f909250f7ccf83c5f42d6437cbc9f03fbae8131a12d33e01721e650aee91e1c893f5e7e039e0d585cd7cd7495c40d\n" 2510 + ~k:"32d9aa04b104b5d7b59a122b368fe0cf476e28098b898662a78efee764545ea5\n" 2511 + ~r:"7416729a1f60208b7f837480fba81840e45b338ab9846e9bbb9168229f64bcea\n" 2512 + ~s:"58eb904076a3ac6907d750ff6cdfaa465435e9982ecbdf72197b09bb6df1373a\n\n"; 2513 + case 2514 + ~msg: 2515 + "55a69fc16f6b753d0bf65e844d067859f51dd329279980196063fb59f89bd778a9244f932c2adb6811183612105d1c527e8302dfee5042cfce5dbeab165a396f5a4c21339be1021b7ecec66f2177f94243ef6261608c56919679d44863cf9d2afc6010fc2bf821b931ca3970d69b1e622a908389db5049d718e357071063aef8\n" 2516 + ~x:"3dd224f00ee1d4648c600b10ba05ff36ad2c06ddc5a9f0112e0331ae958f36af\n" 2517 + ~y: 2518 + "6146a51deb79957a83b2c7a3204b5c34ae4f8e0db60f0c07e70803f22bf99a39647263db9e285d72f6270ee10f18584c39081d2544d40502c50df1e35a457600b5569d61e8126c055f7b964572e9f3282e4d9745006955c24261c68d7c0cb3f08b0b0d8eaa971e1a631c68a3a914d35efe89f76b9c2116afb7bd1989e202e092b5b570eaefcc933542e650d92c033b5973821d6d77cfc243f744da80b56eaea7650bf50802516228ad6d5b0d4e889c575e3678ffdb1c289e59d9ff7f84a3d63d39d6888dbe213e2c3b3114085e006ad74505739fce826f963284dc4e2b01ec2f9233d3470e82d872ed944e62961f64134e8080daf2df494a76240ac0cd22f9afae7e80d3cf3efbe055147f62ff8c6192e388b49e47d9feaf19eccd65dca9991638ebd7b048077707adab1cb2a4358eefc4aab8251fb0f9d5f0b09f299c720d3a8c00a5a4d84feec040057040b709cc0ed185a832537bc4b2df0ec1f77169ac96e91282de21f342d5429ec3d66ad9d336c440949a1211217bf54aad93bb4b0a43\n" 2519 + ~k:"7969d08c0cafe4019b64ad3e6614be0aaabc2c2be61b3b3dcdd10d5f75fa24bb\n" 2520 + ~r:"136f93dcc7d33e559b8db0af13e00c7190928bff5086eedfd11706e6f2349ad0\n" 2521 + ~s:"32b95b9b147c7d1ac2a2f0057fc0538a4b7c9cd4652e6783e5d7e3534655631a\n\n"; 2522 + case 2523 + ~msg: 2524 + "1567890c69e578a27d6208913dfbc20eddc61f5feed457400693dd170f8067bf290b11150780684c20d5cfd2bf1d536dd3b70025883fb41703436fd09c0a141125784f9091151303ef80cd345e5a7d2854335c2984538c5cd739b007248cd99f1dbcd3148cb0ff0db633f8cafc7a0b99c61e784d0303a5120307d3fb3c4c219e\n" 2525 + ~x:"3ac374b2a4940d92ab35ebb8e59677fbf95980fe632ffbb1db4f385ee4e13a15\n" 2526 + ~y: 2527 + "5c53d13a1bee17a28720b7089646d07a3fd58b9b2b23ec94af3144830746177b0d2073707b6b84901ffaa7a4165ceff2425640fcfe5d17650a44a168ebd769c833445f1b2d26434c228c1e2edf1704d711a86257be25235a7cea1e5cbac412235b7596d1dfa0398081a4f18151cbb51dc62c226a2abcaf3335e86ab54608040ee814e443b64398213ba60d7b5a3c8ea78ec6b98934c89aca05b97df5f65bc574a30acddd09f73cec14528be49a2fbeca70291b1b29f7042c594994da128fda22b3ed3a935a1a00575ff1ffd193c4cac53a2a2d4b0c510228a76a74333607d15b568614427144b4174da358e383f658c60b45710036f54f93f17bc808b302674e838c1dfd7f816f7ea44b0d97386e4e1634c9539568dd6ae1c28f25b27aa94499ae389a0926c8fa62956c6e24dced0afb0491dd9fac0516d27fd4d2dd0150ee6b4cff7bfd575043d701daad0f1b942a0e4c61956b32a68c9078f6077fa9945198d447a5bf3c47b7288427edc6f99655aeadf8de18515714c6b9c0d4ce5ab092c2\n" 2528 + ~k:"7ca690c92c8d4a3ac1d5255a2e5a12922093b8b2ee95906eab29b67f84fd21cc\n" 2529 + ~r:"4947d36e7426f1441be5a75dc9cd845450c61104f19ed40ce33e252fa2c26268\n" 2530 + ~s:"356879deb1daef01da04750d58e598db47aaaff50b1cf42d87334a615780ff8c\n\n"; 2531 + case 2532 + ~msg: 2533 + "4f7d894dfb7d82040a9fed6c26a7d27a9a1511388c113c64715a06dc46fcf4f904070a6ed95bdd8dc1730a27645d37eb3b02847cb1c631ec0c67b2ee07b8805b34dd9b84e6ab3f9afb9246994ea579567a8f4af7feb86898cc9cb534c387993c6ec16584ac85bed36bbc2c305770f21163686167dd53fe562362ff549d903539\n" 2534 + ~x:"2c14cd975bc163f9740dcb4a5ba9d8529c5a075016e02400dbfede8dd4f0d245\n" 2535 + ~y: 2536 + "00967478358d7c1696ceb92be850f5538ad8543e151aadd84caba1b72f3636a2092a86b6462873903d5bf17f612b45b5133eac1630bf07c0371423d2e5d7147ceacc9baa8cb3b04cbc3cbda429ab40d7e592730dc477b0a95f1fb5ed5d91e14b9d5a1ac8d403a55a658d1c383bb598053be238cd82386968aedb811586fa2a14119324896f2111b9bc7cff666d37affe76041d98f362daa09ff65e82e865eb29c5d4710ca7800886887d383da0cb599b225fdd210a3d70929d35fb9ca807e56c91c0851252b95c07b6b120b3b650418e0f54f45736f82018d09294462dde6eeafcb15a2a728577faf3ef3eb13db044965ea3892f7eb0884e47766089d2a43abc62a3c375831c20848dfde8f83c249a8e27f2897cafcf5a06b7c3591e09b42f82849d498664f485de26c788e559ad5b15f999db927f81f54b96e997b9096b2a7e3e756f5a9aab54c160cfc2e64492179487c98d0aa38308d67428f3a113228bc6dcdf7ab93cbb1da225c72c636f49d27442cf3cf2f9c49b90ac8bafe740dbbfd5\n" 2537 + ~k:"141936264e075533a96952808935238d715e7cbd840c016ee7a9f508608e4808\n" 2538 + ~r:"0940724855a0671d60147dc61fd283190134a68c178114d59ab58da73a1c8182\n" 2539 + ~s:"43f194b97078dc9b84c8e8e867a74bafdc2211706ae110b5aec0b99ede1ffed8\n\n"; 2540 + case 2541 + ~msg: 2542 + "9b62a74bc49ef4ff5c62165e7d25521f135c836bc4ef023fb4bb1d6b42c6291071eae0b465c59231cb297cac6d145875fd84f5729f79f92218522b9e55cb70d471030d36291a24925ab731a2d4458cff677079d207ce865b3d5526009238861d64506a92b76baff59b37b863087558d5965d76685f0fbd1fab1b1f9561f8f69c\n" 2543 + ~x:"70e12e51a254831bdec081a8882e5a24d78b48b6dd163727b93f803734e06a3e\n" 2544 + ~y: 2545 + "75d7d9a5dbdd47cecd12f69ab212dfe08a9656e2bca92c81db2d268a293a325e511cd5aa1ba59deef2ab6311665dda58230d48f1416371de1a8364b38f5ad599c472d363a18a2c13d572cf849be2fef9a166e838aa58b721ecfc4b361fdab1d0876b78e2e8f23ef1c82cc0e1700fa015a4007b1d7b535c82d23c129d1d1c9c4afe875a06c05f71f078cb8d9060f4d936671faee217d4045525d570b0c8ca0c4e8b55dfe9b780ba69c9d8cda10c50fd61c4e7214b943c1c29797b099f57a4c648597cedd9d909bc584a9b754b209515dbfa0fecce2ad05c848e99dca21a6d0d5f2dac2361e4c0eaf96df199ad2888d671974ef05d65c92788434ab42f1f1f79edc49ec1fa921395bd0feb6a9e6a0622e8255b0ef6937b89d0cccd5852872d2b0ab5d79c2f198bff6b8aa38acee21d6c3add5562d84d968758d93e8c1d611f7d6182b62e44f57df342899bb564a794d13915882143d9df45f8f21cc030af3397e9e949683ddd8d8da9909cc1139619e4b7b252aadd02c66a5e20105adf26f2f021\n" 2546 + ~k:"5de7fe70b5c60ec0ba66ade4fb6b0c925d1d56d26d6f57c5d12d07b5f6f800ed\n" 2547 + ~r:"01e3de398b018a694780ddc6ca12b78dc55e7ad9fdddb5a3f5b2cad0103253dd\n" 2548 + ~s:"03c98280abe3050a67f88ef29fb214a80124f47321c62e41e3905b8532f4936c\n\n"; 2549 + case 2550 + ~msg: 2551 + "6c66051e04c2e6aaa43de9aa42cd9f61e8329c124ed3031b67452db4c435db291d756ba6ef90ab06307cb8d70f3496792e633bf5ac985c37c43bdb4e455c7f761a5ee450567f85cc977e968e7fa42a428c1a7e915c82874865631d8078899377255947c344618297b83c96114d11d74d8cd579b553667cac1d97aea4d1684987\n" 2552 + ~x:"11d2f10293c3884b1e28a600dd71b2ed37bea133255a0f97e641f9530bb4693c\n" 2553 + ~y: 2554 + "ed2e10a44316d677467d79947bec9e405d30f32d860a1ce46b366845df9ad222b0f992f5844571b196a310d587fffa74bd510215f3bdafa1c93d1b1315246fd2f794c4da07bd722a98dda9a02ad4255b6d5267738256cb8639a145c28404562add2bc7691dac12600ba9f8ebe00614ee3fc6e6b2484d9c5c7090b3f3b134ba19909864563040fe8752d6c6ab95111fe1014bf7bbe4e674c9d03bb8d229e4b5f6a6e471c678b0265e88ccad7960fffae700f3a75e61a24ea882b970535eb7017e16c48ce9e2bc8357f7f0889c871d0b4ce29d279afd1d114998d1eb6fe4a5661e429b1327f0a39e9ef00a41a74fe479b90fdda21d9315555afe227274c11a71c0d10c9e5dfc89750eda53c6a8b52a5272c75526375e5fb91ff75d028df7aa2bceb5fdf6f8e3bc1ec3f1e226d04df1d842e4c8f458988cb7415f0d2ca4498b0cd67e8b085b008fc4ca064393a0df517f0b4833ea4051ac3f1de5686dccb7bba8bd939092d6d78fa08f5bf9bf6f13d7aef72f047fcc47a88223df6e1a62d218169f\n" 2555 + ~k:"2621703fb8f5094bc68eea72d5b5caf26f8ea3a173158b8d3e7f9565296767f0\n" 2556 + ~r:"31f2c86287e572ff4d07421a58dc7b3d727de113769952b6d8d736088b36a825\n" 2557 + ~s:"30acbd1c4cd6aa666ee52b0bdc41fc3b239b60d57e279b3f5483c4d54bdd97a6\n\n"; 2558 + case 2559 + ~msg: 2560 + "5f8d7f283af00384a519769029d208b61eee0e1cb21ce9fb80e9d8596b894580da7ab3457429e72dfa64e7cb839414de344da21cff55b1b3a83189d208ad2089b35abd78e2416bceb66466762fd7ab9c234c4aec3872cbc8443c92b8ce4ee4595425e746e4b6f7972ebd5d065fb3fdc5e329e8a87ed3cddbe279d57227ae4b13\n" 2561 + ~x:"1de925bf532a50dc7a10984bd1dbd90500ec9ad22df0f2d6f185fd1ba8060d37\n" 2562 + ~y: 2563 + "aa4d065270c38bdf996b1f5f1ee4b67a76ef1e7b134ea21fd0a6137521245052e74954b96544c700d40f36248ff29a712a098d80ca12e28fdd7901a622dd0988e1c4d67de4c497a957882ce992fcb08c5b85c6858447ed6fcbad26d8c40485f0a89d9d020fe233e89319038455644c828d608df9707c63170dd0618c0baef3eca8d1455460a2eb25faff444f803bca297bb680e5f0fd06e887ed50c8060f55d0160ec64517086f4e1d624ab7d12df1b5947017e622ebbcd6f4eddb0a41dcba82743efdc5804288d2863f54003eea12753246e6e0357df05501b195fdf3a7761c4c3acf26537bf98b32f2e72ff1e0159d046bbc053171e3d518344f0537f2e7200bcdd957ec96365caf55fcd246afe771709ecec28348a356a1d4eb136a176adb5fa102f5fa5c969f90896462e0677afc606a948b25587c10316d22e1269fc64f915a796c965b8be97e5beab047ca5198bf2ff856df740afbbc1aefafefb1ed47278b150e6a7222417d3a86494bdb51edd0616899526c27acc2a818e83baf579b\n" 2564 + ~k:"5f0d6676776f40cfd5ca255fd8e32b10bf3472b193818914876d4c3be68a83b9\n" 2565 + ~r:"7187cae836823618f9a6e847055ca2bc38c86e726d02d38f4950eb6b71b36bcb\n" 2566 + ~s:"21f6ff4175765430e2dbed342a85d30056b28905744ece5dad79755ee3d7bbbd\n\n"; 2567 + case 2568 + ~msg: 2569 + "b216a035b0ff29feaf7d4c34eeb1604155c90338006753ee2b36062d72f62b524504659f70b976c68952a62c2b9a2a00cf0066a5e5098a632df2ee56dd1a140a98f7b3ac12db3576b610d76563e4621637da1098aa20f3c83247b7278860417cecf7e137194cf1bae12bbc63a7bae02c906d503f694dea3bd534718e37704962\n" 2570 + ~x:"3bae9330b47aab85cec948f944ac13221ad35d859de56db56c31aae88345cbea\n" 2571 + ~y: 2572 + "7d6b3b71b1415807d15901427e6ab002ee985ce7c8d844969c6e7294a2167b4c26171bcd646f0d1bce14df05e4ce58a3ae50b2aba5fb74455233fa6d179a0794cb26e92ca910cd1c16e5464e8fa7ba936341d3ac211ac1f8a2f2a19c148a1c3d6b00ac44c35ea345a3ff73ae9d5abcc6ab65162a53daabdf6da25f96958eaf89f559895cbec52351394f9132c9564d61aac792640f11e09aa6f6cde9ee9ca5e05fd902911163817177bf054cf2eabf7ce8f34bb1c4aded8dad93411fb276d2d0a296799661307de579641e607fdad058d9a3f194574ea76f4bec46bef8adc5d62c7390da1c45f6fc5d9a784f696f24ae7e6b27a809029418dd18a420455c2cc9695e7c0fe00219a1711468e2866b71f3f9c538789ed2843f44f2a821773c52d211dd1333b5f164ecdf6c3ffd71de6678b0c272f92355d5974eb21c3c8fbd0bca7538bbd9894750b1dd0142bea85104356f9a515ef1ab69daed98d94803ac912c770e26efa2fa0b04e11051ced2f70f06f2f05eac8029d68e12261657cf4dbcc1\n" 2573 + ~k:"248048e6fc52c48398f5cd2ccd8a659c4b7b76dedf54f3fb90c5bb173c5d24f7\n" 2574 + ~r:"67df1d510d063c9067e9759180be470c71fe09c4f133aca181bdb47bb87b2097\n" 2575 + ~s:"7328b887bf0d520abe6f24aff2153f40de009e2706ae043dd3aa55521d9572d6\n\n"; 2576 + case 2577 + ~msg: 2578 + "6c67116fbd21a0e3ed16b3c4ca58ac49661918bfc6a7c3a6acdbcd53dd4087034fca164df8d38f7ef7db03363701409246382ee053c69c84fafa3c77ad2ce08dc7f41c34a31da496d070a99435799f269dc8effd06d31f85879c299cf7241b37b9a4cfd545086393156737cd9da2d282e7d569fcfa5cbde4bba51bd89fdcc913\n" 2579 + ~x:"7fa66120c5acd5bac132d07083d07968b210cd9c26c2c56d9b16d98066f5df6e\n" 2580 + ~y: 2581 + "6a50d1125f9f3fc2f7e023c093b3608e6972acefe29c0c6ba07a2f61ed747153ada4a9b680622a842b9a820119675620c11688700b855d4b8d13bf726c36acf923256fef1b53093622d1bcbcf023848b8b8f4abf43bb6e87b84d061deb75236224ceda914b18f7ceb72708789dfb94070413b0e65c1231ad02db42decbe0e558aea06c310aa1a8d113be1f071482fc61913225f007b569b6e867cfb392725776ad71f50dc97b834a71375bac18fabf781126d06df62124064e6a723b48635e6754fc767a5094d0645974041591d0ad4828f63783356696af7ff77cd00107949fbff4709dff8a660a413f5b6c0df37ade84fcbc1d3253ba617265a10cc087606130290909a4f813341efdb611696feb5bea3d7d00a53a81f3a2043b887a776075d250c1a010ec47660087f3ef05782dd21d298d6d37559cd473008f474d8deca6817c1390180276097a81f462c0527928f93a461f4ac2d6ed8c9d6d101a2a9a29201a83d0589f57be28a727484518c7425cf5744df396a0e14a4d260a5c8d29bf\n" 2582 + ~k:"5771223a25f539c80481baebe7b2862156fcf26220d6e953c37f2a22bce77c0e\n" 2583 + ~r:"7d489ab0d44bc73271ef42e28a60e1b7ef7dd27af4045546047085da408bccc7\n" 2584 + ~s:"310151d943f088bb7dfdcd52d82884a7f1ee64d46f9d600d23f52f4cea4d2862\n\n"; 2585 + case 2586 + ~msg: 2587 + "c8d416c1efe686637078122f798d8804f64a6e85e05f7e8e07634a309a98e92abd54061cccc319f1acd4a087b1d7dbf0b6bf2a09c5dc508ed14dcd5442056eade7691b7fb65b678ec2e137b5fbe875208a427c2a7ad90665426fbcbc7655e48a8965d23fdef11ca8092f511207a607359f94e91b197fcc993ee6ce3c37ad3b71\n" 2588 + ~x:"1f4a3cf1fb60360db3790a03fe55194985977c6884a5fc05a6fb5eafd53587f5\n" 2589 + ~y: 2590 + "cc9b9d0292915d631aa0d9eb6161f924705c566ee09e74e418d88e6b67b7f57aff5170f6c42a839ba839402bfe517c287781dc97df2e0550b3862484d253152f6cff895f092358b5c4459048581309eff2f689230b4c4951db8413573b6eae85c2dc50fd6134461328e5b6439f41442b91e3a34204428d1e2c22412b012242b14f92e2d1bad626af95051bf06c74da4081b0d619e136a99c8da3a91adb3b8cf8bc5964ff655d45c75ada253aba91c64095394c701c53ddc11f388d61984c32d4326a8c627df845b4100f171bbdb252d3e28494ac173432dd5531e03040302aac8c07c9ea92a9ab67faf0c78b3ad8d454dcd428f942d8ce6e29873049fdbfa1df0e6ec224c9dd066b981a400b1f5194fee13cc5ca7ffbeca98ed0a0221377a1ae612740fce774eeed68382b32b686a25ffc016682186448207c4d9783e83da20a5e8b228a134dc3f44ecc565ab9ae162b855ecd37e6407e714045f4e83b971a5f4e304cd778f3d34137745fc6ea15b4b74d60176ef807410b1b26f68ea14f8f91\n" 2591 + ~k:"589da8a8ac79ad6b62b353422691f35e6474e9c605d877670dd95738b4935f06\n" 2592 + ~r:"7fa51231bc845fa8b668393b78a7b0408113fb77c1e36f3c78c67d65715a8b58\n" 2593 + ~s:"730c9e3483811c52cf295bad042acb5dd6ee90083857bee95b6392b080b5041d"; 2594 + ] 1838 2595 1839 2596 let sha256_n256_cases2 = 1840 - 1841 2597 (* [mod = L=3072, N=256, SHA-256] *) 1842 - 1843 - let domain = params 1844 - ~p:"c7b86d7044218e367453d210e76433e4e27a983db1c560bb9755a8fb7d819912c56cfe002ab1ff3f72165b943c0b28ed46039a07de507d7a29f738603decd1270380a41f971f2592661a64ba2f351d9a69e51a888a05156b7fe1563c4b77ee93a44949138438a2ab8bdcfc49b4e78d1cde766e54984760057d76cd740c94a4dd25a46aa77b18e9d707d6738497d4eac364f4792d9766a16a0e234807e96b8c64d404bbdb876e39b5799ef53fe6cb9bab62ef19fdcc2bdd905beda13b9ef7ac35f1f557cb0dc458c019e2bc19a9f5dfc1e4eca9e6d466564124304a31f038605a3e342da01be1c2b545610edd2c1397a3c8396588c6329efeb4e165af5b368a39a88e4888e39f40bb3de4eb1416672f999fead37aef1ca9643ff32cdbc0fcebe628d7e46d281a989d43dd21432151af68be3f6d56acfbdb6c97d87fcb5e6291bf8b4ee1275ae0eb4383cc753903c8d29f4adb6a547e405decdff288c5f6c7aa30dcb12f84d392493a70933317c0f5e6552601fae18f17e6e5bb6bf396d32d8ab9 1845 - " ~q:"876fa09e1dc62b236ce1c3155ba48b0ccfda29f3ac5a97f7ffa1bd87b68d2a4b 1846 - " ~g:"110afebb12c7f862b6de03d47fdbc3326e0d4d31b12a8ca95b2dee2123bcc667d4f72c1e7209767d2721f95fbd9a4d03236d54174fbfaff2c4ff7deae4738b20d9f37bf0a1134c288b420af0b5792e47a92513c0413f346a4edbab2c45bdca13f5341c2b55b8ba54932b9217b5a859e553f14bb8c120fbb9d99909dff5ea68e14b379964fd3f3861e5ba5cc970c4a180eef54428703961021e7bd68cb637927b8cbee6805fa27285bfee4d1ef70e02c1a18a7cd78bef1dd9cdad45dde9cd690755050fc4662937ee1d6f4db12807ccc95bc435f11b71e7086048b1dab5913c6055012de82e43a4e50cf93feff5dcab814abc224c5e0025bd868c3fc592041bba04747c10af513fc36e4d91c63ee5253422cf4063398d77c52fcb011427cbfcfa67b1b2c2d1aa4a3da72645cb1c767036054e2f31f88665a54461c885fb3219d5ad8748a01158f6c7c0df5a8c908ba8c3e536822428886c7b500bbc15b49df746b9de5a78fe3b4f6991d0110c3cbff458039dc36261cf46af4bc2515368f4abb7" 2598 + let domain = 2599 + params 2600 + ~p: 2601 + "c7b86d7044218e367453d210e76433e4e27a983db1c560bb9755a8fb7d819912c56cfe002ab1ff3f72165b943c0b28ed46039a07de507d7a29f738603decd1270380a41f971f2592661a64ba2f351d9a69e51a888a05156b7fe1563c4b77ee93a44949138438a2ab8bdcfc49b4e78d1cde766e54984760057d76cd740c94a4dd25a46aa77b18e9d707d6738497d4eac364f4792d9766a16a0e234807e96b8c64d404bbdb876e39b5799ef53fe6cb9bab62ef19fdcc2bdd905beda13b9ef7ac35f1f557cb0dc458c019e2bc19a9f5dfc1e4eca9e6d466564124304a31f038605a3e342da01be1c2b545610edd2c1397a3c8396588c6329efeb4e165af5b368a39a88e4888e39f40bb3de4eb1416672f999fead37aef1ca9643ff32cdbc0fcebe628d7e46d281a989d43dd21432151af68be3f6d56acfbdb6c97d87fcb5e6291bf8b4ee1275ae0eb4383cc753903c8d29f4adb6a547e405decdff288c5f6c7aa30dcb12f84d392493a70933317c0f5e6552601fae18f17e6e5bb6bf396d32d8ab9\n" 2602 + ~q:"876fa09e1dc62b236ce1c3155ba48b0ccfda29f3ac5a97f7ffa1bd87b68d2a4b\n" 2603 + ~g: 2604 + "110afebb12c7f862b6de03d47fdbc3326e0d4d31b12a8ca95b2dee2123bcc667d4f72c1e7209767d2721f95fbd9a4d03236d54174fbfaff2c4ff7deae4738b20d9f37bf0a1134c288b420af0b5792e47a92513c0413f346a4edbab2c45bdca13f5341c2b55b8ba54932b9217b5a859e553f14bb8c120fbb9d99909dff5ea68e14b379964fd3f3861e5ba5cc970c4a180eef54428703961021e7bd68cb637927b8cbee6805fa27285bfee4d1ef70e02c1a18a7cd78bef1dd9cdad45dde9cd690755050fc4662937ee1d6f4db12807ccc95bc435f11b71e7086048b1dab5913c6055012de82e43a4e50cf93feff5dcab814abc224c5e0025bd868c3fc592041bba04747c10af513fc36e4d91c63ee5253422cf4063398d77c52fcb011427cbfcfa67b1b2c2d1aa4a3da72645cb1c767036054e2f31f88665a54461c885fb3219d5ad8748a01158f6c7c0df5a8c908ba8c3e536822428886c7b500bbc15b49df746b9de5a78fe3b4f6991d0110c3cbff458039dc36261cf46af4bc2515368f4abb7" 1847 2605 in 1848 2606 let case = case_of ~domain ~hash:Digestif.sha256 in 1849 2607 1850 - [ case ~msg:"cb06e02234263c22b80e832d6dc5a1bee5ea8af3bc2da752441c04027f176158bfe68372bd67f84d489c0d49b07d4025962976be60437be1a2d01d3be0992afa5abe0980e26a9da4ae72f827b423665195cc4eed6fe85c335b32d9c03c945a86e7fa99373f0a30c6eca938b3afb6dff67adb8bece6f8cfec4b6a12ea281e2323 1851 - " ~x:"3470832055dade94e14cd8777171d18e5d06f66aeff4c61471e4eba74ee56164 1852 - " ~y:"456a105c713566234838bc070b8a751a0b57767cb75e99114a1a46641e11da1fa9f22914d808ad7148612c1ea55d25301781e9ae0c9ae36a69d87ba039ec7cd864c3ad094873e6e56709fd10d966853d611b1cff15d37fdee424506c184d62c7033358be78c2250943b6f6d043d63b317de56e5ad8d1fd97dd355abe96452f8e435485fb3b907b51900aa3f24418df50b4fcdafbf6137548c39373b8bc4ba3dabb4746ebd17b87fcd6a2f197c107b18ec5b465e6e4cb430d9c0ce78da5988441054a370792b730da9aba41a3169af26176f74e6f7c0c9c9b55b62bbe7ce38d4695d48157e660c2acb63f482f55418150e5fee43ace84c540c3ba7662ae80835c1a2d51890ea96ba206427c41ef8c38aa07d2a365e7e58380d8f4782e22ac2101af732ee22758337b253637838e16f50f56d313d07981880d685557f7d79a6db823c61f1bb3dbc5d50421a4843a6f29690e78aa0f0cff304231818b81fc4a243fc00f09a54c466d6a8c73d32a55e1abd5ec8b4e1afa32a79b01df85a81f3f5cfe 1853 - " ~k:"3d7c068a3978b2d8fe9034bcad65ad7c300c4440e4085de280e577eea72c1207 1854 - " ~r:"53bae6c6f336e2eb311c1e92d95fc449a929444ef81ec4279660b200d59433de 1855 - " ~s:"49f3a74e953e77a7941af3aefeef4ed499be209976a0edb3fa5e7cb961b0c112 1856 - 1857 - " ; case ~msg:"0661c1bf79eed78ad4879e240a46b95a0db2b29bf81263b9b1676daa2554aad7222c9eb7a893048e46fbd2826ab6e8cf42ab0cd631c4c4a1a819560f73cc861a5b6465cf2880a730635ed7f49e28f7b565768f029db2a443ba0a1bd10773f26f752c83da40fcd33f32f78d24ac9820d0bf70dae568a12538affa867160c81e39 1858 - " ~x:"807675fbaaf0b6d6ba3d82063cc07327cca3f3522d396fe5d2c6599045d668c5 1859 - " ~y:"54b6818054cc000c3af61b62ef4189ba35e04845dee0015be6273392c67332e2e04510cd5b2bbf4723cd8196e025511f6623f03607e566484c330751d03c713068a77e08bde907fc57b3c021e37303373d9d811e38f14b547d2bd87d981269c677dac6ade6acbbae3014ebd381b4008637031c9b6d49ca908765472b05962f55aa361f7dd5a4260705ff5ecf7b317db1fe5d33fdbf48e6a33b3c78b14e620d93806b52e86e082fe4f54d5265e8df623b0c9a259f61b7fa2c0455fadf39693ef3977440f302067c3affbc4574224d5a22044e9bfe11d0d6ede2739c7ffe9277c8644d46beecb946f81775c116388fd6c24af02ec59f621233efe8792d6d0cd2c84333b11f07657333da4e274b8cd3914d977706e786f325e18a339b805c51b45eacb3ce241845970acb9fd1a482a564b2aeecdaeb0a0db39f33ad2991f25cf622bf22f0c4430cf94df1db59aa2d7c2004b5177b9ea69ff556dd4c07edec6259ee139b421573a11cf85d11e245e251190ba869c9cb4daf9f49451a85f38b9b903e 1860 - " ~k:"6215e72ef2d6f6e040b7b6ef4cf566a21fcc4f37783a68db445c1ddf3042a150 1861 - " ~r:"519fe4c5f9b7707ae4b36217ea1707a1871d8fce98eee9e643c45cd3eb50c5d3 1862 - " ~s:"1df224af0b51519e11d8422999b1d3ab0972064180ffc3f1114c9f876a1de3b1 1863 - 1864 - " ; case ~msg:"1597353f24aaf515fd7c0b0a7453444d5f329d6c3f099113bb3a13309b053e6c123a56227a81e8b1a0c8ab4b46160cc5380df591b19d8a386d29a8e43ccab5d8c0e547fba21bffcf5ef42efb9fb2e9be6297c03d57da0b5889b3b9742ddc2c54b8373fed1f2195f5bb2329a8f1f3f8afcec25eb152e7fa819e5d36cfd3625239 1865 - " ~x:"169b11d03cba7e817da27d889cdb147ae9cb0459359bbf85a367c64c2ab556ad 1866 - " ~y:"5062aa1fdc67294cd57623cedd2808303ceb43537e3abfa1bdbc492b1aeecee61b1fd96cc055d1459ab52ddc3f2344389e5f21448a90cb36e448e60787b1ff5ab6e5549a3921496e8354646bc1fd6cd5f2359ae299c0a047fac3920512a1f411c438bafd03e95e538c6e21d1dd1f15a89d38d48f26305c2534fa8e31d054dcb00774138fb8fc61c6a8d4ae1ca46430d0e31b4b92dfb15bd6b8739fd537101e77334e6f3ce5469e82a8dbc58b3be5ca370359f4a6132fe03360b8f6be248c34220a8003772648664059f1f6a322e0c122f427efdb7d640eb5bb7f3db2d967a2159092d8f8df333ff5ba135602b9ee7e9db6ae0b95886df38d4b4a26a4b2d790c24fa214cd68d0a7ede63e7dfacaeae14d9785be693ad78d88242dfad988b7122adf5afa9efdd0c2047470c607d47b30089ff8bfc4cf5d7a8ba69a7d0ab6c54c05280d66aa4019f6362ea24a1d3f8fcd80c3eb20831b6e0db010faf826488f015f63f0b9ac6df72883efd286f0532b5beff1b9e810ff6a2b2d328af675eafc2f56 1867 - " ~k:"467e04dcd564f36cfe47c8fb9fa09cb142a99417a61797e047fcfd51e16e3e00 1868 - " ~r:"0502a6e1d8c8dfdf56eb67f9a6f6605735e4d1b0076c8b08b61daf8e7c2bf2d6 1869 - " ~s:"7c67abdcf4e580812b13d0a4edbae8a2786d6612bc866e3c13bc09f3e96616e0 1870 - 1871 - " ; case ~msg:"715f296930312368a2a98d3f42810da57115f00ffc4a12029c276b10629e6bddd60bca2c535b79a5f4a006817791f7f3ad2e01a00216672ee5adec579deb07e9d2b0db222c4e01e1f819c1a52d101b1ef678cfca85655dd6b2426f1ac379a92a9c69b0f8987432d109cd9a7bc04ef287c2afb663444688601ce3c55fd90d0fa3 1872 - " ~x:"4ee80e4cf46b4e072e976893a2d1e34c03d20f3aa1785a74564d6b4654b11a54 1873 - " ~y:"b63340d6a1955731283064f6f22ad7f0e28199f6a58c57ddcb44a026c61e441318c4f8755dfd71b295e9e7babe000849c972f68d4be00954a3c29cd4b4e83ad51830080e29e7619e45d3abbf9d82fd87e97581fe909d3da1e3e96cb3f0c893af9d07f418df902e76b0bbc1c97139cbd51226ac442b3d0b0525c784ba138131421c60543e6e296069f611b9c37cf6030636eecaf41c3b4838f506c02cc84cde6b99cabd2ca578449cc1718aa418ca12a2b76f78259c1691e0b49f09dbdaf585f626cf74d73212b3427845c66f2283b60703adf1a262bb8b10ac7ac5d1ec73614fdd37ee51b71cd1fb4e6db8938382643c721fbc4cfc987bc5efbc81299b375a560cde5adae62831ca4138c399d82f1f8bc680f9c6b47eb464a1e0aac448fe3b5c25bd8c0b7afb701b0680db87ab51738f19f5b965375dd48daca07bff3885632175700c678619f194e4ee5f55aa448aeca7f7b3322f64a547315c5cee045122549fb38b8acc95da5e833022b3b894f03ccb7f73b91c1fe82ce414e1219411780e 1874 - " ~k:"3d7728ce25def9a31dfbe442fef8b162b30544065d9cb7bcc4914662a282bc10 1875 - " ~r:"4c5e990a6e24feddab48d0af4a08b45ae8092594bfb3c012fa1c325c977a3cc0 1876 - " ~s:"820b6cafa89b41c4ccbec842d7c408c65d4998ab1ac6b6bce8d4d569cdf04726 1877 - 1878 - " ; case ~msg:"1fe5ad49e11c207d3d5e1923060832afbfc0aa0cb29fc0b22b3be59a598f8c703b9bf2c7347f8abde25677ea9cc60af9307d21d301fdd23c28277fce11400310033962c04ecd377fd446358a3449efd6bc05721b784ddf0e238f28608e86bd4c3d7ac631fff8be0678d37bfbac16b75bc15a50ce1397dd4ba3bffcf94d341274 1879 - " ~x:"0d690f2c87fe2cebc9f15546f05afaf6dc843b80abd2046f33de30c2e806358f 1880 - " ~y:"53fcd07399e4d31b09abeff2f096a7b2cc5cf417dee1207d8a5aabf9e8f9fb0f66be48826a3dc11e39beba2ff47b76544bcf55485acf1e3d49e19057015e49ed012a4877be741607749b6f4bf95c44ec3c9e8b893aae8d80e369978a3580371cc13de8e714092bb892e4a956ad3654032f7758fb9454a1cb56406e1bf45855108ee960107a65d45453cb482dc19049b6c83bac111756caf65bdbe5e6b270d5875b997a1722ee9d58384941aa40e810b60b83412eafd0a7428a0abb55df45680cf22656711db6bfce8bdcbb4c083a401cdb68284e0c7ec00f7de74e57146adae221e54cc4a566b05a113ddb22cbc19d881a41cd75de8cf6c7b89a5fae650df585aa70c045b84b2cbbccd0e7ab720c5896abfd356a66f3dcbbb5386be6d02ea9b3191ca275d22248aedc360ecd4057ae06ab2c2aafb50657a91c62e038eac9f5c4d88106db4c6926fb5dd2de1ec7e4e005ce184570e7e97d76422fa037621a6f6d46cb83ab6f4d434b6a8f073900cb03a7810455d19e77d4df624d08e782090ffa 1881 - " ~k:"796cef38518aed8644ec5a1b3389da5ee9b063b88e7fb4602af0709999f9a938 1882 - " ~r:"41a2c955f41413a7ab067b4f50c61e396f9febff61c1500b1a4bc69e50a51935 1883 - " ~s:"79edd751a9dc2372b40580fa4d538fbe2cda4149f6b11939ddad92c574740883 1884 - 1885 - " ; case ~msg:"a326973093ce502c16473d89ba196507d92281504759cb34c6cc353d45197f915b5e736b8ff857a8b2ec99649a3224f857401898c9ea607e6a2c1d320f27564ccff5dbdacfd87a145f1a029425d76502c081ac0f6a14de5b2cad1c23a61d4e9ec6a04e1a455fd710c3c78c096753c0b7f1511e8ba5f5f1af4f0741fee88b77eb 1886 - " ~x:"37d0fa99e5eed0fb51c6e690f0ac556ae74cab9a84d887a07363599b198475dd 1887 - " ~y:"92915db21c2c3e57fcccb7dfdce28a12aaf6dd10581193b98b7d51a728c38516e39ef5cfb1ff9fa1659c9bee56d4ebc1cd69646c3cc3f7caae0c42d9cca9219148e4998c2ddc89eb9a3edcfa6f457129007a9344013dd123aff197bfcd3db1d9e2199bcea16165a4c34ed2ac32167abd167704ead31d5fc2860b834d44f86cb530dad9e887013ca4d6e883008c286d206b6c7cb252d1328b503ae0679b502ec1646f69f2602d5e3d631d4a5a63fc7a5d06f27926a4d6b1ef2f77ddff3d850d3d9f58a958c3f4f12cf029f148386c5b8a71bae9094dec85279b1e387799d26b2a6a0e0dbf06497366e4903e559e70975dedc7d4934d4e2d3d2cd305ab826402ea8f2778e26625119e7b0c24c45dd9c05a3890dd1d9d930bd0bb409366b07a47ce572ed5bcd5f63c467d49c56811fc3e401341b9a4531f776debdea540a34c7cca3c3fb2ea99c5fa9f9fdfde918a94f74e080d1986b68fc1e3fb978054872ced97bafd96731e6d4f1c4a91278c383d4761c974100974522f7b6e8a2884d5b3bbf6 1888 - " ~k:"0b5c9b613708ea26bea151a0dd4222bb573d950588483483cd2b8ab537469e53 1889 - " ~r:"73f1922e26d9b8068b68f83c2bd5dbbb5960403b49223c02a42ce6cf3810db66 1890 - " ~s:"3ad30be9a60f6d4227039456c9827d5424858a02a8e6d3891772cf80a5e4ee21 1891 - 1892 - " ; case ~msg:"7504382fb7fba1dab3c93bd31b16e73d9ae1d027dd23166b3b94c7124183faf3963c420be5205a1f44a9a9026c6ef77e7c4ef1ec4845fef6e5ea2487ce012ff53f9450fceb0d3ac62f2102d717e3287db3714717a28cd8b7fc64556a86173e6e7f479f8a8dcd895429cd7f0f5304ef6aaf275d94a7f4b30acc1071787ca5f062 1893 - " ~x:"1c21aa2ef3b11d31f3c94a278859cb74bc40daf5993dbd774b32ea3ca24bf162 1894 - " ~y:"2055bbe89da0a0c488c3dbf29531f1f7cd3fb55a26efc540c2eddcccea1615dd923fea4c8d0c95a5af7e1e7816048f2ae85323a96411e7d1ad62c4ca675b63df9dba31c1c76803fb1c8292465ad0a7e49ba3756a8ad4c6ce86fd30b8b28e08c4b4777e079faff10ff852f7d891a984198dd04977972108c52ce8bdb115646224a79337746e3647213198f1127430f5608733d88204a62be6eaee84629fc7282acef4c4f5d3adbe72410b1edfb74be16b2d675cca891bd8cef205178902b99271b48041abe33ac119ad6b756a477a63063aae8a17ccfbe2acae3c0a3c630c13ade197cf3d05a9fa9d6899c0a3f9487e6148732dc63e907ef79488df3373b8a213705d69dcce6ed9a2209f59ebc58bbbeb08054510b5a65169d0fc1d4d10bda68aa7eceae2e72f0339a2eaaea08303064dd6588414ee7705df3ab974debef588f4e31fd6a8f25979c9f521d2343120e40794f41a4601be579183b877e6a8f6c0ab7ce8480e7fbff467a581df570af89929bc4b56397b787df4d729e65f9b98ee7e 1895 - " ~k:"44efaf7a15a1eb2a7ba04fd4717e938fe738666040b3d81560497ce166f31e86 1896 - " ~r:"56e21a7ab61f9eabbff47c75e5f68c31873a9e1f2e1db662731182f9a029b8f6 1897 - " ~s:"2f24c52f7baae29c0b4633a3855233180eba80611dbc7e88e23548a520b60f66 1898 - 1899 - " ; case ~msg:"0c0f7b0f9955bb54f16e4e39ad9bfd1deb04b8e8b38e674da455696bdf7cf28e24114ad00513d8dd4e5c895d351ea913fee516b646820087721d9a0b5ecd769b3825739123544e7058b66d2342b04462d5d173cdb00ef6aca604aaa438b8868d15dd6624abb8d19384db48bdaa66471413a894d3610bc97d848a59e2c69c0c0a 1900 - " ~x:"34651f5844cbf85960e987190eda4ca1fcf32d8cbe1ad08dd5aa36fbd0d42000 1901 - " ~y:"45ef384ed817386668e1b90b42f1d423ad9b17ea870119c0932ac2f515f546a3b6b80a612ee66dfc00cc4d9e3b5dd15303d5ebc0aa40cbcd7746f54a3ffea23aea0704ae9cf5ad6145629c61d158db6ee39ac899bbda59794b1769a92982082b77a1d48856427b78bb6e077e27335f115bb842e53251f699f04488beaf83a6c4aa6a4b76370cefc9099c0a45bcf973242df2a01ef68e66c87effd7f98f441e94a09a2830076c2895f997afd0a909b45b3c059177000236c501bfaa56da800ecf08701d212016b525f30d63ccf3afea09df39e1cfab7bf45de1a39ac7f28de0037ec552e2ea10c6b56a5db8c13fcbf73d2e50d58b4f3cf278506f1eaf0873e9ee9465cbaff4ae626f3aa109fce49e55d57fe881c50f7279262621282adcf379141c9b2c39813faf823a7ec077c6e6bf953f130aca58f36e7a87ab1aaeea5eeb4402fa9e26ef8938c8f38a6c040809f4d04c81e2948387d7be813a973a9c95176700117de2f33e61940387f851a73dfa4ac5c984ec97918c967bfedd886d1bb705 1902 - " ~k:"52c16c3e7b17f3e73d7965f584bfd7ca036423b0d42cc00e58d1ccbc419d33b2 1903 - " ~r:"77563b3b48fc9ee0dbea79fc74dd6c69b72c4270918e6a1be2c998177023b40f 1904 - " ~s:"099cdd62dc044a57ea25d1b5c1f6ed84d11bacbb0975976d5821c414b5416bde 1905 - 1906 - " ; case ~msg:"c67735698ae7bbaeb6f321a1088617382a5c92092151ec364582962c9c0ed9ed8fc790cde0d9744d4e38970a8482401c0f61e91805f4984b8cfdf9dc8093a5c6681dac13809bc41d167d3e11bc99698a4bc07fd248a67491e8641081ff1e97871745157cf930195a35a14d0883a26db442e4edb962aa6187b8d1c7791d61bd25 1907 - " ~x:"2ad20d2e78a9ec234f99a4b2ff52faf492c3e3242ae6c04ea8a37d5f10fce6db 1908 - " ~y:"0d3b3c3df072b5f5129118132bb7bca3c52f51df36767f1152387ec00df65c728f0cffc1cb6f224258cb6d3e90f79dd976b5a180b83903d210f0c4dab82eb72a1f8997bf09301d0f7c89075d552c81fd9585b0b1b1291744d21bd1edcb511217c2962e1a6de9bb01c2b9698ff55ea75dcfe456be481cb6f064fed4bff874eb1c9b7451979f7de7011baf5a47c976a179aee909d25ca87fd5e3c75df778e21272937c5ba7806aefa70647221e5f7cc32ab8015921a5a95ecbb3ca4b667249d0f34dd2d8ba86dc158f9e8425176e988048efd9f7b7cc53e9fcdb29ad2412ab4ca6ebbde6f4efca5945b53b2753bfc4eabe6280235620c4464f6940acca1a94659a527aa14cc7c5467382a54fe479656dfbc11923094fe8019a08c3ce7e99a28f086bdaaf0faac6ee16190dca8e94bf87657058495ad07931c89008ca1e565076256a93cb2468aa7122758b8e174f6a80f41a90fc92f05bf1f1f47da185b2f25a1abf5e0ccc6613e3aef87193400d751b4c87b44d9bdf5c0e207f0f6a7dc2113799 1909 - " ~k:"654dff8f0500b52adbb70fb7bb7aec4b4820963706964c19c8320e161c3ba365 1910 - " ~r:"42c902c5826874774550464c4bb736f2af7fd2a347f27c65bae11820eeb752aa 1911 - " ~s:"6411b45947a43c5b01c2f6cefcd41cab73fcb6ea0f2a35a21475563055316e3e 1912 - 1913 - " ; case ~msg:"eb6a0359c6e46e09a42c554705bcfc5c0c022670b2f6c1a5bfe14ea805759ca2256153fdf815057ca9bd5f4cf837e14fdba3ad17612ccd19fde00764ba2e8ecd8f5a185cb26512f7457259c2f0670852741e7393b40c8bab673be2fa519b48a95dee6552365fdb7ddb632b1b33f1a5290b828da5965e82d874f79cdb928814fb 1914 - " ~x:"0d06d405d228c0ed860b9e21bae570a6fd940cc702dd6e9a0846e7b2a4be47a5 1915 - " ~y:"6db83b06c698ed80122ec4a2183370ed7dbd6ea44dbb4542149568570c53521d3399ab44fe2babd49068e11953c5d38f7ffe3bcbe4cbceb91c155ac8741dcf226a59ede10b050b9f3743f29689266ce6ee020ca17f9fa0e75b3f7158a65cef9fac76c88786b5e377afeacb9b3dda55be922da0ef958aa556abfb43067a414e915e31af5f5370881ed97b25b4bfecbe082a145d02717af800e77e28963cc0a6a1c11b02835e14bdba1a8c9ce4bfeb06aaebd760d7c43cf56ba212d0c75da026176535f982e8d749f20c2a8d5f53875d893374d859b7cee58b0eb319d3313cb8d17602f47e120d1a24a0f8a63cfe45a5028cc0937bbe89f6b3b7cdcaa7dcd5ec5f3ed2aa9f3aa8e91a496a8bad7874dd34bd8f2a9591997d54f92d5864216c953646840b378c7a05215ecd97b6ba944ca18597b7a54832ec98c1cac0003d50d5a05312cbc852d507cc973ecb56f424e8a1c198bcdbafaa6f928fd27a7c91f84bc234f2532639a8aa2196f8fc2b7111b3d0b1153165a0e0525d4ea595f89aec33b6 1916 - " ~k:"521906f186797e7f5ce85112ab2457ddc030d6f34be361929f4d373dda576e08 1917 - " ~r:"0493db0c18a3882709b3cc9f8dbe05454506c04c3a12a41d599d201d7615b6d8 1918 - " ~s:"7494b4d1b2f3ae22797255a1d0662746352a3d0532290402068594cfe48c23a3 1919 - 1920 - " ; case ~msg:"5c59b209bbc0a1e010cb108db4101b8e2d04ced91299a8742322102e0d578c3698422b43d19d331608188bed4c7edc03a442f89aae60f4e7ee9b6325de3a8bb702918c21343bc9b266f2ebcf5a620336a7bc99ae3685f19080db46f24a501228c5bbfd9c0b4b0abecbfbd676c359607ce292cffd52d26af80b22e3c4d516ba0f 1921 - " ~x:"4214d55b0a058c3dee2751407d9296168fed9f255e5c68273e1e5aeb3e504e67 1922 - " ~y:"be31fd5d62db690bcdbc09e453d4417f82e8621ad717cab94648201a74f6ffdfab965311e8ff35c4a0b5dda339b435f17317175ac642f785129e151694ea8b244627e300ceb0f3be08f91c0f527f2e0df7c9f55492d1329b7d9689634c8a4f5210157e2419e615d9431736f804b1641103371e7ffe7200e74296127d59a8f97d41af11d70c3fd02531f7b811daa7516aa2f2a9ba70dcb704f3fee47f2cbed65c1e3d06c8814e1b28abe29f3d056792efdf9ac9307ed0106c5a328721af0e202b6df737ec4d82143dd2505e103ad845863c45869e69abd9e02c7b6eaaff9e2e12bc188138688c0be3e6941c37c7ddc9b6d289f7cc8fde42bc3c14e3ee521635f32f54280d119ccedfc51090a0ad006b2427604014ea4d0e0cd1efbce09c7f8e9981f969aed6d481cafb329f995343541d36686de6cb8e4b1e7e3727abd5c1e3ffa6936ad44b926063561512c0e9ac787f8eb791f963f790ba1b21dfe1b8d31d4c16b152a6de65bf54ab0f0d1e3d450317b1cf0c4e331d18587accb6960ccd04dd 1923 - " ~k:"574cca3bd87ec1994449da2f2324a3945fa3047791274367bac0f12d4c064343 1924 - " ~r:"7fc9bab3505adcd1b1c8127e2d1fbcd0e15eaac314250dc1c684fcc47fda2993 1925 - " ~s:"70f2007edd68fb9dfe19a63eee4d5a977291abd235ed26e4291476ca5d0c8171 1926 - 1927 - " ; case ~msg:"c805d18c0bb53d32b57cb652f5b0e5293be492a1c88dfbec5baf47ee093e2df06918994e5cacbc3dfff229abd31fab7a95ade2fb53adaa7dff51f6c8581c69eb5b090baec38607ee9435447ad8137455b6ba179fc53ac094f97e3e29d0724cd10811f142d67d1cfcd5c3d1e9b411dac38f6e1c0c14dc9a50d84bcf00ece8a603 1928 - " ~x:"3cc7e58577382500cb461c0ab8ff01ece8fa766b66f8be746e347ed2ebc18ebb 1929 - " ~y:"2b6e1a8d4482b41697bbbe50b55b3dcdecea8d2e2eb5cf27b892bcbcabfb253c19486fa77c98c15add4149925b5501e5a5ef45b32ad09a872462a0f41d048af4e530660a3864937ba6a9eb0734e90fda3c9b6fcd30c9078771295a93802d9e1992a4eee9af7a0413880f33bc0b62036203286844bc384187ec51a33d390eaac0cc3328098a847509129bda735909fc7a11893ad0ec61276b7a5dcd4e626d9ba67610eaf0af876afc0419fa4f009aa5f913a1c73798c2707eeb8fa77f4ee058229a0ad37e845739668d95de226760898c02d06f155f82dc16360c3abca3780bcdb79446c8343583dc0f6925434b0dae7b59cb26b10008f86570ca0350de340b275524f00551310f1d095db8480b4acc489cf5e2947eb92904ebfd0d978bbfb5d0c6a1a9db50cc6917949c71854632b4408bade5195d40dcaf61fe950eff0c8997c374f1d465c80bc65adda636433e94f22c5fbcf09e99666a535919ee6f88154934f11377a9a9e021f2d7ecaba32510e92bf5ad67fa8b3d70dd2092b1389e3193 1930 - " ~k:"179c02ec8f18fd88146120fcc51628f23e250ad694aa47bd691c0f442a63a92d 1931 - " ~r:"38208c0985624bb9d62713bc7150942cbc92b8e8a36ef6d1ec4d08d1d9a5715f 1932 - " ~s:"65d2ba787ed4c08beabf24343d06ed61872d6d684a3bc70307fcb7e20df931da 1933 - 1934 - " ; case ~msg:"9e0c66a4f120e85aea064e7a8ba132cf30a45de2889f3547384e4e84f45b3572bb0423b834de9f2c9636faffdb6331924f0d2f5b6876145d9cae110ab0cf6fc90c2eeff98c61fa186cc3952b57299a73678f4585bb18fbb84ef4166779ff10eed14d47ae528e03298dbb97cf4f88b7e6d0959b5894550a3e2e356947d25ffe73 1935 - " ~x:"5c5791dd648703f29099736146f5b1b5e35dc71a74d6eed312d37aeb6d389ef0 1936 - " ~y:"a62adbdaa5a55a2d1e439b5489cd6c8fcb23e9c64fbfae7c83e9d5599319bf3f06c3c290b989a638940b1d0b7e8bf6741319ab4c38d46e77ebd4945e25cb89cbb64e44b9474bc7c9d9f61a36e57eb6afab6c7a149afe02c1cd685483208c55feecb0d0bd96697b437991059267d76a488465faab4a7e17592329567005faa421e011d67f4da75accb627537e933e9ef0be3c70f21ed3f8c3b3d7d769bb611f82f2baa10fbc7313ad0819048d353d679736c4d14bca9985ecd37041afffb291a7d909c7458181d01592e6c90c0e34b49461ede66c5ac002671a4985546a6075df95b523f166d2e0d1f5da77baff5a24df775cc9d367f2a0728c4802d797041788c56cb871290332c1361f8da8897b5b8e25d4a93594ac648bc53c9d85b4fcdd7ab0f5a3ee9c25cc14ba6543b078859524ec7f0b61cdb209cc51c40aa9af082ea9c1d4b91b2c1f6dc11cd879fb3865d879fe000f0e0b4b233dbd01c9c98d01a664746577a64bf28d88256b76de2babf14961113733b1bb555325c09d8ec9189fca 1937 - " ~k:"8327daa2fbd001858dea53d2dc0cb005e0ae5fb15bebc0c5efd33371637ef318 1938 - " ~r:"4e35f586fad4f512863c485ec61ed01629aa1399b16fef4d80cb332752b1da92 1939 - " ~s:"262dfe6ac72a2f6044f62698e42dd2f92b1f9a91be42b5fdd293b1bf9a145f00 1940 - 1941 - " ; case ~msg:"ed88d7076c5f6a5e0f947543d5fe746afca9b2c4d06655da4607685c799c210be4aaee0e6ed19713814182c7f7d584ddbed488c8e3239ddd810555ad6316d1db37fd9553ad74e3ceef9eeefaf54563602f5547aad4161e9384edab655a898416db53f71237ac5a1485711182bc5bfff72460252784ab1bba23634a36be77533f 1942 - " ~x:"22b44bd6d23ee65ebc2e88030f837ef65593eeef0966239a92d5126cde867a13 1943 - " ~y:"3e1ce8780f39444c2130dbf9d80ca4b25817dc16d08e2cdaca0b56cd2abdb9ef5adb741ccc1abecf62806ad7e87636f52831c6dea48e0729b904e5a0615d7ab4450104208a5ddfdb2f2569146ee83ac9aa27b4d066355fc53dc1a3683211ad3efad1ae69b8a7737bbd89f5ff48482e2c56edaa776e43b2a0ba62e513862da290288f07f84ca5a06837d19e9b186dc8d36952966e08f7213340186d31fd41a2d1455a083aee62127a28dfe4da6c876a5a6f36c45245dee6f6566b8318d3d01943b2adf8ce94ea01a01ba41a6e286820a96707cbd4002875b79d9fe2db6cc3f808ef0f71380ea9a73fc7e36850d022ffac131636367886a6e9965759d73f03ace69704b52144f67b678e2fa201c19bb37b00377daabc9377adcbddea2816cbb50b26ad2e429ea0576e7721b3b75c4fedb31fdf1f0c6c2eaa135f52c9a97f0df5fb25ef28848bdd7390cd054003722582d94e90a3bbe85beb34701271b4bb48bdf9b3d0e1bb5623445c7828c937a423be512c1177c9c0b5b0b6b0e1f639d330e051 1944 - " ~k:"0c37eecd48682f897accf43b3e4a538cccdfd784625a6cc046dc54b093d16162 1945 - " ~r:"2e7cb404a6daaa8e00760dafc95b4eb5545683224a61a1bcd6128bc4e7ac535e 1946 - " ~s:"3a70b3a97e06e63b89d56ed5232346461c1a3b6b145d89043a48d666de0256d5 1947 - 1948 - " ; case ~msg:"9e440052ed927321948388776d3719be068739dc2d6c64c5937176b2005c2d70a9389e6a655663366c0970a8e2e3117ecef257e951ac81c0731dfcd4fbdb1241bc249adde9cb398c7d15e381368ad3d24edee23397c15a5a356e787d8f2fe9be76260bd363e17006281c199fe5b710f9dfcac52895e392f7384d71bb83053ffc 1949 - " ~x:"680883caf23665e813572c1e4230218edf53b3a5167f56a7d80e53e7d3ad1df9 1950 - " ~y:"89e859fc63a263bcc051bc2ef58cc919ee537385cb3636d83a624a4230d4b0024ec5e28bcb884667cd2bf8c28451b64de097f2194cbb8c6e1cecbd6f9fbd576481555d0f0e8f13752f2472f7619d052318424310f69d50de78ad6c457b98c611f8481d4543031a73f83d1e852c1f2038a6435e571f776bbb5cf978a9b2c88f05d134fd5ff4656a69d6fe6b667da6da54be48386250394c75b495689fd4628f666424eb080094448d41b706292e51e75386543e5fcce6a6f3aac03a7d6d5c2551ca6b5b85fadc86bff14c79a1602fb0c1d43d88d5679021e826062ecf186aaaaefc312eab9f9e2da120a8d7d08ba09aa9abf4e34f6d88c4c314c59c36ba57f928d88d5d70fe48ac6700f5cf607a55e3646dd03d47e96ad869f7ba2bcc7d65a99c3221d4909d1f22e4ccba815fa5b720570e42f8626c31d99f60cd6a015391fab3537446f747c0111293c5bd6b5dab2bc3d5137d2124029eed12db71bdf794de1a2ec5070d83f87195264ff09cb48cddb5e852b233570f1b70cd457cf864e2ef3b 1951 - " ~k:"69e6cb5bcf8cae88c96e464a9b26c6e1bbac1e229909e27542278a50c66959f1 1952 - " ~r:"37c34f9cce916df3deff26be08a4e6bbae0661fbbb5d81d6039f00b1e5632b67 1953 - " ~s:"3f4a2932917e6bb088599a269d7b590769acf9807dc5a9420a95e12c7364c5fa" ] 2608 + [ 2609 + case 2610 + ~msg: 2611 + "cb06e02234263c22b80e832d6dc5a1bee5ea8af3bc2da752441c04027f176158bfe68372bd67f84d489c0d49b07d4025962976be60437be1a2d01d3be0992afa5abe0980e26a9da4ae72f827b423665195cc4eed6fe85c335b32d9c03c945a86e7fa99373f0a30c6eca938b3afb6dff67adb8bece6f8cfec4b6a12ea281e2323\n" 2612 + ~x:"3470832055dade94e14cd8777171d18e5d06f66aeff4c61471e4eba74ee56164\n" 2613 + ~y: 2614 + "456a105c713566234838bc070b8a751a0b57767cb75e99114a1a46641e11da1fa9f22914d808ad7148612c1ea55d25301781e9ae0c9ae36a69d87ba039ec7cd864c3ad094873e6e56709fd10d966853d611b1cff15d37fdee424506c184d62c7033358be78c2250943b6f6d043d63b317de56e5ad8d1fd97dd355abe96452f8e435485fb3b907b51900aa3f24418df50b4fcdafbf6137548c39373b8bc4ba3dabb4746ebd17b87fcd6a2f197c107b18ec5b465e6e4cb430d9c0ce78da5988441054a370792b730da9aba41a3169af26176f74e6f7c0c9c9b55b62bbe7ce38d4695d48157e660c2acb63f482f55418150e5fee43ace84c540c3ba7662ae80835c1a2d51890ea96ba206427c41ef8c38aa07d2a365e7e58380d8f4782e22ac2101af732ee22758337b253637838e16f50f56d313d07981880d685557f7d79a6db823c61f1bb3dbc5d50421a4843a6f29690e78aa0f0cff304231818b81fc4a243fc00f09a54c466d6a8c73d32a55e1abd5ec8b4e1afa32a79b01df85a81f3f5cfe\n" 2615 + ~k:"3d7c068a3978b2d8fe9034bcad65ad7c300c4440e4085de280e577eea72c1207\n" 2616 + ~r:"53bae6c6f336e2eb311c1e92d95fc449a929444ef81ec4279660b200d59433de\n" 2617 + ~s:"49f3a74e953e77a7941af3aefeef4ed499be209976a0edb3fa5e7cb961b0c112\n\n"; 2618 + case 2619 + ~msg: 2620 + "0661c1bf79eed78ad4879e240a46b95a0db2b29bf81263b9b1676daa2554aad7222c9eb7a893048e46fbd2826ab6e8cf42ab0cd631c4c4a1a819560f73cc861a5b6465cf2880a730635ed7f49e28f7b565768f029db2a443ba0a1bd10773f26f752c83da40fcd33f32f78d24ac9820d0bf70dae568a12538affa867160c81e39\n" 2621 + ~x:"807675fbaaf0b6d6ba3d82063cc07327cca3f3522d396fe5d2c6599045d668c5\n" 2622 + ~y: 2623 + "54b6818054cc000c3af61b62ef4189ba35e04845dee0015be6273392c67332e2e04510cd5b2bbf4723cd8196e025511f6623f03607e566484c330751d03c713068a77e08bde907fc57b3c021e37303373d9d811e38f14b547d2bd87d981269c677dac6ade6acbbae3014ebd381b4008637031c9b6d49ca908765472b05962f55aa361f7dd5a4260705ff5ecf7b317db1fe5d33fdbf48e6a33b3c78b14e620d93806b52e86e082fe4f54d5265e8df623b0c9a259f61b7fa2c0455fadf39693ef3977440f302067c3affbc4574224d5a22044e9bfe11d0d6ede2739c7ffe9277c8644d46beecb946f81775c116388fd6c24af02ec59f621233efe8792d6d0cd2c84333b11f07657333da4e274b8cd3914d977706e786f325e18a339b805c51b45eacb3ce241845970acb9fd1a482a564b2aeecdaeb0a0db39f33ad2991f25cf622bf22f0c4430cf94df1db59aa2d7c2004b5177b9ea69ff556dd4c07edec6259ee139b421573a11cf85d11e245e251190ba869c9cb4daf9f49451a85f38b9b903e\n" 2624 + ~k:"6215e72ef2d6f6e040b7b6ef4cf566a21fcc4f37783a68db445c1ddf3042a150\n" 2625 + ~r:"519fe4c5f9b7707ae4b36217ea1707a1871d8fce98eee9e643c45cd3eb50c5d3\n" 2626 + ~s:"1df224af0b51519e11d8422999b1d3ab0972064180ffc3f1114c9f876a1de3b1\n\n"; 2627 + case 2628 + ~msg: 2629 + "1597353f24aaf515fd7c0b0a7453444d5f329d6c3f099113bb3a13309b053e6c123a56227a81e8b1a0c8ab4b46160cc5380df591b19d8a386d29a8e43ccab5d8c0e547fba21bffcf5ef42efb9fb2e9be6297c03d57da0b5889b3b9742ddc2c54b8373fed1f2195f5bb2329a8f1f3f8afcec25eb152e7fa819e5d36cfd3625239\n" 2630 + ~x:"169b11d03cba7e817da27d889cdb147ae9cb0459359bbf85a367c64c2ab556ad\n" 2631 + ~y: 2632 + "5062aa1fdc67294cd57623cedd2808303ceb43537e3abfa1bdbc492b1aeecee61b1fd96cc055d1459ab52ddc3f2344389e5f21448a90cb36e448e60787b1ff5ab6e5549a3921496e8354646bc1fd6cd5f2359ae299c0a047fac3920512a1f411c438bafd03e95e538c6e21d1dd1f15a89d38d48f26305c2534fa8e31d054dcb00774138fb8fc61c6a8d4ae1ca46430d0e31b4b92dfb15bd6b8739fd537101e77334e6f3ce5469e82a8dbc58b3be5ca370359f4a6132fe03360b8f6be248c34220a8003772648664059f1f6a322e0c122f427efdb7d640eb5bb7f3db2d967a2159092d8f8df333ff5ba135602b9ee7e9db6ae0b95886df38d4b4a26a4b2d790c24fa214cd68d0a7ede63e7dfacaeae14d9785be693ad78d88242dfad988b7122adf5afa9efdd0c2047470c607d47b30089ff8bfc4cf5d7a8ba69a7d0ab6c54c05280d66aa4019f6362ea24a1d3f8fcd80c3eb20831b6e0db010faf826488f015f63f0b9ac6df72883efd286f0532b5beff1b9e810ff6a2b2d328af675eafc2f56\n" 2633 + ~k:"467e04dcd564f36cfe47c8fb9fa09cb142a99417a61797e047fcfd51e16e3e00\n" 2634 + ~r:"0502a6e1d8c8dfdf56eb67f9a6f6605735e4d1b0076c8b08b61daf8e7c2bf2d6\n" 2635 + ~s:"7c67abdcf4e580812b13d0a4edbae8a2786d6612bc866e3c13bc09f3e96616e0\n\n"; 2636 + case 2637 + ~msg: 2638 + "715f296930312368a2a98d3f42810da57115f00ffc4a12029c276b10629e6bddd60bca2c535b79a5f4a006817791f7f3ad2e01a00216672ee5adec579deb07e9d2b0db222c4e01e1f819c1a52d101b1ef678cfca85655dd6b2426f1ac379a92a9c69b0f8987432d109cd9a7bc04ef287c2afb663444688601ce3c55fd90d0fa3\n" 2639 + ~x:"4ee80e4cf46b4e072e976893a2d1e34c03d20f3aa1785a74564d6b4654b11a54\n" 2640 + ~y: 2641 + "b63340d6a1955731283064f6f22ad7f0e28199f6a58c57ddcb44a026c61e441318c4f8755dfd71b295e9e7babe000849c972f68d4be00954a3c29cd4b4e83ad51830080e29e7619e45d3abbf9d82fd87e97581fe909d3da1e3e96cb3f0c893af9d07f418df902e76b0bbc1c97139cbd51226ac442b3d0b0525c784ba138131421c60543e6e296069f611b9c37cf6030636eecaf41c3b4838f506c02cc84cde6b99cabd2ca578449cc1718aa418ca12a2b76f78259c1691e0b49f09dbdaf585f626cf74d73212b3427845c66f2283b60703adf1a262bb8b10ac7ac5d1ec73614fdd37ee51b71cd1fb4e6db8938382643c721fbc4cfc987bc5efbc81299b375a560cde5adae62831ca4138c399d82f1f8bc680f9c6b47eb464a1e0aac448fe3b5c25bd8c0b7afb701b0680db87ab51738f19f5b965375dd48daca07bff3885632175700c678619f194e4ee5f55aa448aeca7f7b3322f64a547315c5cee045122549fb38b8acc95da5e833022b3b894f03ccb7f73b91c1fe82ce414e1219411780e\n" 2642 + ~k:"3d7728ce25def9a31dfbe442fef8b162b30544065d9cb7bcc4914662a282bc10\n" 2643 + ~r:"4c5e990a6e24feddab48d0af4a08b45ae8092594bfb3c012fa1c325c977a3cc0\n" 2644 + ~s:"820b6cafa89b41c4ccbec842d7c408c65d4998ab1ac6b6bce8d4d569cdf04726\n\n"; 2645 + case 2646 + ~msg: 2647 + "1fe5ad49e11c207d3d5e1923060832afbfc0aa0cb29fc0b22b3be59a598f8c703b9bf2c7347f8abde25677ea9cc60af9307d21d301fdd23c28277fce11400310033962c04ecd377fd446358a3449efd6bc05721b784ddf0e238f28608e86bd4c3d7ac631fff8be0678d37bfbac16b75bc15a50ce1397dd4ba3bffcf94d341274\n" 2648 + ~x:"0d690f2c87fe2cebc9f15546f05afaf6dc843b80abd2046f33de30c2e806358f\n" 2649 + ~y: 2650 + "53fcd07399e4d31b09abeff2f096a7b2cc5cf417dee1207d8a5aabf9e8f9fb0f66be48826a3dc11e39beba2ff47b76544bcf55485acf1e3d49e19057015e49ed012a4877be741607749b6f4bf95c44ec3c9e8b893aae8d80e369978a3580371cc13de8e714092bb892e4a956ad3654032f7758fb9454a1cb56406e1bf45855108ee960107a65d45453cb482dc19049b6c83bac111756caf65bdbe5e6b270d5875b997a1722ee9d58384941aa40e810b60b83412eafd0a7428a0abb55df45680cf22656711db6bfce8bdcbb4c083a401cdb68284e0c7ec00f7de74e57146adae221e54cc4a566b05a113ddb22cbc19d881a41cd75de8cf6c7b89a5fae650df585aa70c045b84b2cbbccd0e7ab720c5896abfd356a66f3dcbbb5386be6d02ea9b3191ca275d22248aedc360ecd4057ae06ab2c2aafb50657a91c62e038eac9f5c4d88106db4c6926fb5dd2de1ec7e4e005ce184570e7e97d76422fa037621a6f6d46cb83ab6f4d434b6a8f073900cb03a7810455d19e77d4df624d08e782090ffa\n" 2651 + ~k:"796cef38518aed8644ec5a1b3389da5ee9b063b88e7fb4602af0709999f9a938\n" 2652 + ~r:"41a2c955f41413a7ab067b4f50c61e396f9febff61c1500b1a4bc69e50a51935\n" 2653 + ~s:"79edd751a9dc2372b40580fa4d538fbe2cda4149f6b11939ddad92c574740883\n\n"; 2654 + case 2655 + ~msg: 2656 + "a326973093ce502c16473d89ba196507d92281504759cb34c6cc353d45197f915b5e736b8ff857a8b2ec99649a3224f857401898c9ea607e6a2c1d320f27564ccff5dbdacfd87a145f1a029425d76502c081ac0f6a14de5b2cad1c23a61d4e9ec6a04e1a455fd710c3c78c096753c0b7f1511e8ba5f5f1af4f0741fee88b77eb\n" 2657 + ~x:"37d0fa99e5eed0fb51c6e690f0ac556ae74cab9a84d887a07363599b198475dd\n" 2658 + ~y: 2659 + "92915db21c2c3e57fcccb7dfdce28a12aaf6dd10581193b98b7d51a728c38516e39ef5cfb1ff9fa1659c9bee56d4ebc1cd69646c3cc3f7caae0c42d9cca9219148e4998c2ddc89eb9a3edcfa6f457129007a9344013dd123aff197bfcd3db1d9e2199bcea16165a4c34ed2ac32167abd167704ead31d5fc2860b834d44f86cb530dad9e887013ca4d6e883008c286d206b6c7cb252d1328b503ae0679b502ec1646f69f2602d5e3d631d4a5a63fc7a5d06f27926a4d6b1ef2f77ddff3d850d3d9f58a958c3f4f12cf029f148386c5b8a71bae9094dec85279b1e387799d26b2a6a0e0dbf06497366e4903e559e70975dedc7d4934d4e2d3d2cd305ab826402ea8f2778e26625119e7b0c24c45dd9c05a3890dd1d9d930bd0bb409366b07a47ce572ed5bcd5f63c467d49c56811fc3e401341b9a4531f776debdea540a34c7cca3c3fb2ea99c5fa9f9fdfde918a94f74e080d1986b68fc1e3fb978054872ced97bafd96731e6d4f1c4a91278c383d4761c974100974522f7b6e8a2884d5b3bbf6\n" 2660 + ~k:"0b5c9b613708ea26bea151a0dd4222bb573d950588483483cd2b8ab537469e53\n" 2661 + ~r:"73f1922e26d9b8068b68f83c2bd5dbbb5960403b49223c02a42ce6cf3810db66\n" 2662 + ~s:"3ad30be9a60f6d4227039456c9827d5424858a02a8e6d3891772cf80a5e4ee21\n\n"; 2663 + case 2664 + ~msg: 2665 + "7504382fb7fba1dab3c93bd31b16e73d9ae1d027dd23166b3b94c7124183faf3963c420be5205a1f44a9a9026c6ef77e7c4ef1ec4845fef6e5ea2487ce012ff53f9450fceb0d3ac62f2102d717e3287db3714717a28cd8b7fc64556a86173e6e7f479f8a8dcd895429cd7f0f5304ef6aaf275d94a7f4b30acc1071787ca5f062\n" 2666 + ~x:"1c21aa2ef3b11d31f3c94a278859cb74bc40daf5993dbd774b32ea3ca24bf162\n" 2667 + ~y: 2668 + "2055bbe89da0a0c488c3dbf29531f1f7cd3fb55a26efc540c2eddcccea1615dd923fea4c8d0c95a5af7e1e7816048f2ae85323a96411e7d1ad62c4ca675b63df9dba31c1c76803fb1c8292465ad0a7e49ba3756a8ad4c6ce86fd30b8b28e08c4b4777e079faff10ff852f7d891a984198dd04977972108c52ce8bdb115646224a79337746e3647213198f1127430f5608733d88204a62be6eaee84629fc7282acef4c4f5d3adbe72410b1edfb74be16b2d675cca891bd8cef205178902b99271b48041abe33ac119ad6b756a477a63063aae8a17ccfbe2acae3c0a3c630c13ade197cf3d05a9fa9d6899c0a3f9487e6148732dc63e907ef79488df3373b8a213705d69dcce6ed9a2209f59ebc58bbbeb08054510b5a65169d0fc1d4d10bda68aa7eceae2e72f0339a2eaaea08303064dd6588414ee7705df3ab974debef588f4e31fd6a8f25979c9f521d2343120e40794f41a4601be579183b877e6a8f6c0ab7ce8480e7fbff467a581df570af89929bc4b56397b787df4d729e65f9b98ee7e\n" 2669 + ~k:"44efaf7a15a1eb2a7ba04fd4717e938fe738666040b3d81560497ce166f31e86\n" 2670 + ~r:"56e21a7ab61f9eabbff47c75e5f68c31873a9e1f2e1db662731182f9a029b8f6\n" 2671 + ~s:"2f24c52f7baae29c0b4633a3855233180eba80611dbc7e88e23548a520b60f66\n\n"; 2672 + case 2673 + ~msg: 2674 + "0c0f7b0f9955bb54f16e4e39ad9bfd1deb04b8e8b38e674da455696bdf7cf28e24114ad00513d8dd4e5c895d351ea913fee516b646820087721d9a0b5ecd769b3825739123544e7058b66d2342b04462d5d173cdb00ef6aca604aaa438b8868d15dd6624abb8d19384db48bdaa66471413a894d3610bc97d848a59e2c69c0c0a\n" 2675 + ~x:"34651f5844cbf85960e987190eda4ca1fcf32d8cbe1ad08dd5aa36fbd0d42000\n" 2676 + ~y: 2677 + "45ef384ed817386668e1b90b42f1d423ad9b17ea870119c0932ac2f515f546a3b6b80a612ee66dfc00cc4d9e3b5dd15303d5ebc0aa40cbcd7746f54a3ffea23aea0704ae9cf5ad6145629c61d158db6ee39ac899bbda59794b1769a92982082b77a1d48856427b78bb6e077e27335f115bb842e53251f699f04488beaf83a6c4aa6a4b76370cefc9099c0a45bcf973242df2a01ef68e66c87effd7f98f441e94a09a2830076c2895f997afd0a909b45b3c059177000236c501bfaa56da800ecf08701d212016b525f30d63ccf3afea09df39e1cfab7bf45de1a39ac7f28de0037ec552e2ea10c6b56a5db8c13fcbf73d2e50d58b4f3cf278506f1eaf0873e9ee9465cbaff4ae626f3aa109fce49e55d57fe881c50f7279262621282adcf379141c9b2c39813faf823a7ec077c6e6bf953f130aca58f36e7a87ab1aaeea5eeb4402fa9e26ef8938c8f38a6c040809f4d04c81e2948387d7be813a973a9c95176700117de2f33e61940387f851a73dfa4ac5c984ec97918c967bfedd886d1bb705\n" 2678 + ~k:"52c16c3e7b17f3e73d7965f584bfd7ca036423b0d42cc00e58d1ccbc419d33b2\n" 2679 + ~r:"77563b3b48fc9ee0dbea79fc74dd6c69b72c4270918e6a1be2c998177023b40f\n" 2680 + ~s:"099cdd62dc044a57ea25d1b5c1f6ed84d11bacbb0975976d5821c414b5416bde\n\n"; 2681 + case 2682 + ~msg: 2683 + "c67735698ae7bbaeb6f321a1088617382a5c92092151ec364582962c9c0ed9ed8fc790cde0d9744d4e38970a8482401c0f61e91805f4984b8cfdf9dc8093a5c6681dac13809bc41d167d3e11bc99698a4bc07fd248a67491e8641081ff1e97871745157cf930195a35a14d0883a26db442e4edb962aa6187b8d1c7791d61bd25\n" 2684 + ~x:"2ad20d2e78a9ec234f99a4b2ff52faf492c3e3242ae6c04ea8a37d5f10fce6db\n" 2685 + ~y: 2686 + "0d3b3c3df072b5f5129118132bb7bca3c52f51df36767f1152387ec00df65c728f0cffc1cb6f224258cb6d3e90f79dd976b5a180b83903d210f0c4dab82eb72a1f8997bf09301d0f7c89075d552c81fd9585b0b1b1291744d21bd1edcb511217c2962e1a6de9bb01c2b9698ff55ea75dcfe456be481cb6f064fed4bff874eb1c9b7451979f7de7011baf5a47c976a179aee909d25ca87fd5e3c75df778e21272937c5ba7806aefa70647221e5f7cc32ab8015921a5a95ecbb3ca4b667249d0f34dd2d8ba86dc158f9e8425176e988048efd9f7b7cc53e9fcdb29ad2412ab4ca6ebbde6f4efca5945b53b2753bfc4eabe6280235620c4464f6940acca1a94659a527aa14cc7c5467382a54fe479656dfbc11923094fe8019a08c3ce7e99a28f086bdaaf0faac6ee16190dca8e94bf87657058495ad07931c89008ca1e565076256a93cb2468aa7122758b8e174f6a80f41a90fc92f05bf1f1f47da185b2f25a1abf5e0ccc6613e3aef87193400d751b4c87b44d9bdf5c0e207f0f6a7dc2113799\n" 2687 + ~k:"654dff8f0500b52adbb70fb7bb7aec4b4820963706964c19c8320e161c3ba365\n" 2688 + ~r:"42c902c5826874774550464c4bb736f2af7fd2a347f27c65bae11820eeb752aa\n" 2689 + ~s:"6411b45947a43c5b01c2f6cefcd41cab73fcb6ea0f2a35a21475563055316e3e\n\n"; 2690 + case 2691 + ~msg: 2692 + "eb6a0359c6e46e09a42c554705bcfc5c0c022670b2f6c1a5bfe14ea805759ca2256153fdf815057ca9bd5f4cf837e14fdba3ad17612ccd19fde00764ba2e8ecd8f5a185cb26512f7457259c2f0670852741e7393b40c8bab673be2fa519b48a95dee6552365fdb7ddb632b1b33f1a5290b828da5965e82d874f79cdb928814fb\n" 2693 + ~x:"0d06d405d228c0ed860b9e21bae570a6fd940cc702dd6e9a0846e7b2a4be47a5\n" 2694 + ~y: 2695 + "6db83b06c698ed80122ec4a2183370ed7dbd6ea44dbb4542149568570c53521d3399ab44fe2babd49068e11953c5d38f7ffe3bcbe4cbceb91c155ac8741dcf226a59ede10b050b9f3743f29689266ce6ee020ca17f9fa0e75b3f7158a65cef9fac76c88786b5e377afeacb9b3dda55be922da0ef958aa556abfb43067a414e915e31af5f5370881ed97b25b4bfecbe082a145d02717af800e77e28963cc0a6a1c11b02835e14bdba1a8c9ce4bfeb06aaebd760d7c43cf56ba212d0c75da026176535f982e8d749f20c2a8d5f53875d893374d859b7cee58b0eb319d3313cb8d17602f47e120d1a24a0f8a63cfe45a5028cc0937bbe89f6b3b7cdcaa7dcd5ec5f3ed2aa9f3aa8e91a496a8bad7874dd34bd8f2a9591997d54f92d5864216c953646840b378c7a05215ecd97b6ba944ca18597b7a54832ec98c1cac0003d50d5a05312cbc852d507cc973ecb56f424e8a1c198bcdbafaa6f928fd27a7c91f84bc234f2532639a8aa2196f8fc2b7111b3d0b1153165a0e0525d4ea595f89aec33b6\n" 2696 + ~k:"521906f186797e7f5ce85112ab2457ddc030d6f34be361929f4d373dda576e08\n" 2697 + ~r:"0493db0c18a3882709b3cc9f8dbe05454506c04c3a12a41d599d201d7615b6d8\n" 2698 + ~s:"7494b4d1b2f3ae22797255a1d0662746352a3d0532290402068594cfe48c23a3\n\n"; 2699 + case 2700 + ~msg: 2701 + "5c59b209bbc0a1e010cb108db4101b8e2d04ced91299a8742322102e0d578c3698422b43d19d331608188bed4c7edc03a442f89aae60f4e7ee9b6325de3a8bb702918c21343bc9b266f2ebcf5a620336a7bc99ae3685f19080db46f24a501228c5bbfd9c0b4b0abecbfbd676c359607ce292cffd52d26af80b22e3c4d516ba0f\n" 2702 + ~x:"4214d55b0a058c3dee2751407d9296168fed9f255e5c68273e1e5aeb3e504e67\n" 2703 + ~y: 2704 + "be31fd5d62db690bcdbc09e453d4417f82e8621ad717cab94648201a74f6ffdfab965311e8ff35c4a0b5dda339b435f17317175ac642f785129e151694ea8b244627e300ceb0f3be08f91c0f527f2e0df7c9f55492d1329b7d9689634c8a4f5210157e2419e615d9431736f804b1641103371e7ffe7200e74296127d59a8f97d41af11d70c3fd02531f7b811daa7516aa2f2a9ba70dcb704f3fee47f2cbed65c1e3d06c8814e1b28abe29f3d056792efdf9ac9307ed0106c5a328721af0e202b6df737ec4d82143dd2505e103ad845863c45869e69abd9e02c7b6eaaff9e2e12bc188138688c0be3e6941c37c7ddc9b6d289f7cc8fde42bc3c14e3ee521635f32f54280d119ccedfc51090a0ad006b2427604014ea4d0e0cd1efbce09c7f8e9981f969aed6d481cafb329f995343541d36686de6cb8e4b1e7e3727abd5c1e3ffa6936ad44b926063561512c0e9ac787f8eb791f963f790ba1b21dfe1b8d31d4c16b152a6de65bf54ab0f0d1e3d450317b1cf0c4e331d18587accb6960ccd04dd\n" 2705 + ~k:"574cca3bd87ec1994449da2f2324a3945fa3047791274367bac0f12d4c064343\n" 2706 + ~r:"7fc9bab3505adcd1b1c8127e2d1fbcd0e15eaac314250dc1c684fcc47fda2993\n" 2707 + ~s:"70f2007edd68fb9dfe19a63eee4d5a977291abd235ed26e4291476ca5d0c8171\n\n"; 2708 + case 2709 + ~msg: 2710 + "c805d18c0bb53d32b57cb652f5b0e5293be492a1c88dfbec5baf47ee093e2df06918994e5cacbc3dfff229abd31fab7a95ade2fb53adaa7dff51f6c8581c69eb5b090baec38607ee9435447ad8137455b6ba179fc53ac094f97e3e29d0724cd10811f142d67d1cfcd5c3d1e9b411dac38f6e1c0c14dc9a50d84bcf00ece8a603\n" 2711 + ~x:"3cc7e58577382500cb461c0ab8ff01ece8fa766b66f8be746e347ed2ebc18ebb\n" 2712 + ~y: 2713 + "2b6e1a8d4482b41697bbbe50b55b3dcdecea8d2e2eb5cf27b892bcbcabfb253c19486fa77c98c15add4149925b5501e5a5ef45b32ad09a872462a0f41d048af4e530660a3864937ba6a9eb0734e90fda3c9b6fcd30c9078771295a93802d9e1992a4eee9af7a0413880f33bc0b62036203286844bc384187ec51a33d390eaac0cc3328098a847509129bda735909fc7a11893ad0ec61276b7a5dcd4e626d9ba67610eaf0af876afc0419fa4f009aa5f913a1c73798c2707eeb8fa77f4ee058229a0ad37e845739668d95de226760898c02d06f155f82dc16360c3abca3780bcdb79446c8343583dc0f6925434b0dae7b59cb26b10008f86570ca0350de340b275524f00551310f1d095db8480b4acc489cf5e2947eb92904ebfd0d978bbfb5d0c6a1a9db50cc6917949c71854632b4408bade5195d40dcaf61fe950eff0c8997c374f1d465c80bc65adda636433e94f22c5fbcf09e99666a535919ee6f88154934f11377a9a9e021f2d7ecaba32510e92bf5ad67fa8b3d70dd2092b1389e3193\n" 2714 + ~k:"179c02ec8f18fd88146120fcc51628f23e250ad694aa47bd691c0f442a63a92d\n" 2715 + ~r:"38208c0985624bb9d62713bc7150942cbc92b8e8a36ef6d1ec4d08d1d9a5715f\n" 2716 + ~s:"65d2ba787ed4c08beabf24343d06ed61872d6d684a3bc70307fcb7e20df931da\n\n"; 2717 + case 2718 + ~msg: 2719 + "9e0c66a4f120e85aea064e7a8ba132cf30a45de2889f3547384e4e84f45b3572bb0423b834de9f2c9636faffdb6331924f0d2f5b6876145d9cae110ab0cf6fc90c2eeff98c61fa186cc3952b57299a73678f4585bb18fbb84ef4166779ff10eed14d47ae528e03298dbb97cf4f88b7e6d0959b5894550a3e2e356947d25ffe73\n" 2720 + ~x:"5c5791dd648703f29099736146f5b1b5e35dc71a74d6eed312d37aeb6d389ef0\n" 2721 + ~y: 2722 + "a62adbdaa5a55a2d1e439b5489cd6c8fcb23e9c64fbfae7c83e9d5599319bf3f06c3c290b989a638940b1d0b7e8bf6741319ab4c38d46e77ebd4945e25cb89cbb64e44b9474bc7c9d9f61a36e57eb6afab6c7a149afe02c1cd685483208c55feecb0d0bd96697b437991059267d76a488465faab4a7e17592329567005faa421e011d67f4da75accb627537e933e9ef0be3c70f21ed3f8c3b3d7d769bb611f82f2baa10fbc7313ad0819048d353d679736c4d14bca9985ecd37041afffb291a7d909c7458181d01592e6c90c0e34b49461ede66c5ac002671a4985546a6075df95b523f166d2e0d1f5da77baff5a24df775cc9d367f2a0728c4802d797041788c56cb871290332c1361f8da8897b5b8e25d4a93594ac648bc53c9d85b4fcdd7ab0f5a3ee9c25cc14ba6543b078859524ec7f0b61cdb209cc51c40aa9af082ea9c1d4b91b2c1f6dc11cd879fb3865d879fe000f0e0b4b233dbd01c9c98d01a664746577a64bf28d88256b76de2babf14961113733b1bb555325c09d8ec9189fca\n" 2723 + ~k:"8327daa2fbd001858dea53d2dc0cb005e0ae5fb15bebc0c5efd33371637ef318\n" 2724 + ~r:"4e35f586fad4f512863c485ec61ed01629aa1399b16fef4d80cb332752b1da92\n" 2725 + ~s:"262dfe6ac72a2f6044f62698e42dd2f92b1f9a91be42b5fdd293b1bf9a145f00\n\n"; 2726 + case 2727 + ~msg: 2728 + "ed88d7076c5f6a5e0f947543d5fe746afca9b2c4d06655da4607685c799c210be4aaee0e6ed19713814182c7f7d584ddbed488c8e3239ddd810555ad6316d1db37fd9553ad74e3ceef9eeefaf54563602f5547aad4161e9384edab655a898416db53f71237ac5a1485711182bc5bfff72460252784ab1bba23634a36be77533f\n" 2729 + ~x:"22b44bd6d23ee65ebc2e88030f837ef65593eeef0966239a92d5126cde867a13\n" 2730 + ~y: 2731 + "3e1ce8780f39444c2130dbf9d80ca4b25817dc16d08e2cdaca0b56cd2abdb9ef5adb741ccc1abecf62806ad7e87636f52831c6dea48e0729b904e5a0615d7ab4450104208a5ddfdb2f2569146ee83ac9aa27b4d066355fc53dc1a3683211ad3efad1ae69b8a7737bbd89f5ff48482e2c56edaa776e43b2a0ba62e513862da290288f07f84ca5a06837d19e9b186dc8d36952966e08f7213340186d31fd41a2d1455a083aee62127a28dfe4da6c876a5a6f36c45245dee6f6566b8318d3d01943b2adf8ce94ea01a01ba41a6e286820a96707cbd4002875b79d9fe2db6cc3f808ef0f71380ea9a73fc7e36850d022ffac131636367886a6e9965759d73f03ace69704b52144f67b678e2fa201c19bb37b00377daabc9377adcbddea2816cbb50b26ad2e429ea0576e7721b3b75c4fedb31fdf1f0c6c2eaa135f52c9a97f0df5fb25ef28848bdd7390cd054003722582d94e90a3bbe85beb34701271b4bb48bdf9b3d0e1bb5623445c7828c937a423be512c1177c9c0b5b0b6b0e1f639d330e051\n" 2732 + ~k:"0c37eecd48682f897accf43b3e4a538cccdfd784625a6cc046dc54b093d16162\n" 2733 + ~r:"2e7cb404a6daaa8e00760dafc95b4eb5545683224a61a1bcd6128bc4e7ac535e\n" 2734 + ~s:"3a70b3a97e06e63b89d56ed5232346461c1a3b6b145d89043a48d666de0256d5\n\n"; 2735 + case 2736 + ~msg: 2737 + "9e440052ed927321948388776d3719be068739dc2d6c64c5937176b2005c2d70a9389e6a655663366c0970a8e2e3117ecef257e951ac81c0731dfcd4fbdb1241bc249adde9cb398c7d15e381368ad3d24edee23397c15a5a356e787d8f2fe9be76260bd363e17006281c199fe5b710f9dfcac52895e392f7384d71bb83053ffc\n" 2738 + ~x:"680883caf23665e813572c1e4230218edf53b3a5167f56a7d80e53e7d3ad1df9\n" 2739 + ~y: 2740 + "89e859fc63a263bcc051bc2ef58cc919ee537385cb3636d83a624a4230d4b0024ec5e28bcb884667cd2bf8c28451b64de097f2194cbb8c6e1cecbd6f9fbd576481555d0f0e8f13752f2472f7619d052318424310f69d50de78ad6c457b98c611f8481d4543031a73f83d1e852c1f2038a6435e571f776bbb5cf978a9b2c88f05d134fd5ff4656a69d6fe6b667da6da54be48386250394c75b495689fd4628f666424eb080094448d41b706292e51e75386543e5fcce6a6f3aac03a7d6d5c2551ca6b5b85fadc86bff14c79a1602fb0c1d43d88d5679021e826062ecf186aaaaefc312eab9f9e2da120a8d7d08ba09aa9abf4e34f6d88c4c314c59c36ba57f928d88d5d70fe48ac6700f5cf607a55e3646dd03d47e96ad869f7ba2bcc7d65a99c3221d4909d1f22e4ccba815fa5b720570e42f8626c31d99f60cd6a015391fab3537446f747c0111293c5bd6b5dab2bc3d5137d2124029eed12db71bdf794de1a2ec5070d83f87195264ff09cb48cddb5e852b233570f1b70cd457cf864e2ef3b\n" 2741 + ~k:"69e6cb5bcf8cae88c96e464a9b26c6e1bbac1e229909e27542278a50c66959f1\n" 2742 + ~r:"37c34f9cce916df3deff26be08a4e6bbae0661fbbb5d81d6039f00b1e5632b67\n" 2743 + ~s:"3f4a2932917e6bb088599a269d7b590769acf9807dc5a9420a95e12c7364c5fa"; 2744 + ] 1954 2745 1955 2746 let sha384_n256_cases2 = 1956 2747 (* [mod = L=3072, N=256, SHA-384] *) 1957 - let domain = params 1958 - ~p:"a410d23ed9ad9964d3e401cb9317a25213f75712acbc5c12191abf3f1c0e723e2333b49eb1f95b0f9748d952f04a5ae358859d384403ce364aa3f58dd9769909b45048548c55872a6afbb3b15c54882f96c20df1b2df164f0bac849ca17ad2df63abd75c881922e79a5009f00b7d631622e90e7fa4e980618575e1d6bd1a72d5b6a50f4f6a68b793937c4af95fc11541759a1736577d9448b87792dff07232415512e933755e12250d466e9cc8df150727d747e51fea7964158326b1365d580cb190f4518291598221fdf36c6305c8b8a8ed05663dd7b006e945f592abbecae460f77c71b6ec649d3fd5394202ed7bbbd040f7b8fd57cb06a99be254fa25d71a3760734046c2a0db383e02397913ae67ce65870d9f6c6f67a9d00497be1d763b21937cf9cbf9a24ef97bbcaa07916f8894e5b7fb03258821ac46140965b23c5409ca49026efb2bf95bce025c4183a5f659bf6aaeef56d7933bb29697d7d541348c871fa01f869678b2e34506f6dc0a4c132b689a0ed27dc3c8d53702aa584877 1959 - " ~q:"abc67417725cf28fc7640d5de43825f416ebfa80e191c42ee886303338f56045 1960 - " ~g:"867d5fb72f5936d1a14ed3b60499662f3124686ef108c5b3da6663a0e86197ec2cc4c9460193a74ff16028ac9441b0c7d27c2272d483ac7cd794d598416c4ff9099a61679d417d478ce5dd974bf349a14575afe74a88b12dd5f6d1cbd3f91ddd597ed68e79eba402613130c224b94ac28714a1f1c552475a5d29cfcdd8e08a6b1d65661e28ef313514d1408f5abd3e06ebe3a7d814d1ede316bf495273ca1d574f42b482eea30db53466f454b51a175a0b89b3c05dda006e719a2e6371669080d768cc038cdfb8098e9aad9b8d83d4b759f43ac9d22b353ed88a33723550150de0361b7a376f37b45d437f71cb711f2847de671ad1059516a1d45755224a15d37b4aeada3f58c69a136daef0636fe38e3752064afe598433e80089fda24b144a462734bef8f77638845b00e59ce7fa4f1daf487a2cada11eaba72bb23e1df6b66a183edd226c440272dd9b06bec0e57f1a0822d2e00212064b6dba64562085f5a75929afa5fe509e0b78e630aaf12f91e4980c9b0d6f7e059a2ea3e23479d930" 2748 + let domain = 2749 + params 2750 + ~p: 2751 + "a410d23ed9ad9964d3e401cb9317a25213f75712acbc5c12191abf3f1c0e723e2333b49eb1f95b0f9748d952f04a5ae358859d384403ce364aa3f58dd9769909b45048548c55872a6afbb3b15c54882f96c20df1b2df164f0bac849ca17ad2df63abd75c881922e79a5009f00b7d631622e90e7fa4e980618575e1d6bd1a72d5b6a50f4f6a68b793937c4af95fc11541759a1736577d9448b87792dff07232415512e933755e12250d466e9cc8df150727d747e51fea7964158326b1365d580cb190f4518291598221fdf36c6305c8b8a8ed05663dd7b006e945f592abbecae460f77c71b6ec649d3fd5394202ed7bbbd040f7b8fd57cb06a99be254fa25d71a3760734046c2a0db383e02397913ae67ce65870d9f6c6f67a9d00497be1d763b21937cf9cbf9a24ef97bbcaa07916f8894e5b7fb03258821ac46140965b23c5409ca49026efb2bf95bce025c4183a5f659bf6aaeef56d7933bb29697d7d541348c871fa01f869678b2e34506f6dc0a4c132b689a0ed27dc3c8d53702aa584877\n" 2752 + ~q:"abc67417725cf28fc7640d5de43825f416ebfa80e191c42ee886303338f56045\n" 2753 + ~g: 2754 + "867d5fb72f5936d1a14ed3b60499662f3124686ef108c5b3da6663a0e86197ec2cc4c9460193a74ff16028ac9441b0c7d27c2272d483ac7cd794d598416c4ff9099a61679d417d478ce5dd974bf349a14575afe74a88b12dd5f6d1cbd3f91ddd597ed68e79eba402613130c224b94ac28714a1f1c552475a5d29cfcdd8e08a6b1d65661e28ef313514d1408f5abd3e06ebe3a7d814d1ede316bf495273ca1d574f42b482eea30db53466f454b51a175a0b89b3c05dda006e719a2e6371669080d768cc038cdfb8098e9aad9b8d83d4b759f43ac9d22b353ed88a33723550150de0361b7a376f37b45d437f71cb711f2847de671ad1059516a1d45755224a15d37b4aeada3f58c69a136daef0636fe38e3752064afe598433e80089fda24b144a462734bef8f77638845b00e59ce7fa4f1daf487a2cada11eaba72bb23e1df6b66a183edd226c440272dd9b06bec0e57f1a0822d2e00212064b6dba64562085f5a75929afa5fe509e0b78e630aaf12f91e4980c9b0d6f7e059a2ea3e23479d930" 1961 2755 in 1962 2756 let case = case_of ~domain ~hash:Digestif.sha384 in 1963 2757 1964 - [ case ~msg:"ed9a64d3109ef8a9292956b946873ca4bd887ce624b81be81b82c69c67aaddf5655f70fe4768114db2834c71787f858e5165da1a7fa961d855ad7e5bc4b7be31b97dbe770798ef7966152b14b86ae35625a28aee5663b9ef3067cbdfbabd87197e5c842d3092eb88dca57c6c8ad4c00a19ddf2e1967b59bd06ccaef933bc28e7 1965 - " ~x:"6d4c934391b7f6fb6e19e3141f8c0018ef5726118a11064358c7d35b37737377 1966 - " ~y:"1f0a5c75e7985d6e70e4fbfda51a10b925f6accb600d7c6510db90ec367b93bb069bd286e8f979b22ef0702f717a8755c18309c87dae3fe82cc3dc8f4b7aa3d5f3876f4d4b3eb68bfe910c43076d6cd0d39fc88dde78f09480db55234e6c8ca59fe2700efec04feee6b4e8ee2413721858be7190dbe905f456edcab55b2dc2916dc1e8731988d9ef8b619abcf8955aa960ef02b3f02a8dc649369222af50f1338ed28d667f3f10cae2a3c28a3c1d08df639c81ada13c8fd198c6dae3d62a3fe9f04c985c65f610c06cb8faea68edb80de6cf07a8e89c00218185a952b23572e34df07ce5b4261e5de427eb503ee1baf5992db6d438b47434c40c22657bc163e7953fa33eff39dc2734607039aadd6ac27e4367131041f845ffa1a13f556bfba2307a5c78f2ccf11298c762e08871968e48dc3d1569d09965cd09da43cf0309a16af1e20fee7da3dc21b364c4615cd5123fa5f9b23cfc4ffd9cfdcea670623840b062d4648d2eba786ad3f7ae337a4284324ace236f9f7174fbf442b99043002f 1967 - " ~k:"40b5cc685c3d1f59072228af9551683b5b8c8ff65240114ad2dacfccf3928057 1968 - " ~r:"7695698a14755db4206e850b4f5f19c540b07d07e08aac591e20081646e6eedc 1969 - " ~s:"3dae01154ecff7b19007a953f185f0663ef7f2537f0b15e04fb343c961f36de2 1970 - 1971 - " ; case ~msg:"4bfd28a0a79c94dbd667c275ef77a235d8ead7c698d42fb7f7c1fd3c8c2dc48d0dda2408dea56325d69283692a523d281ffea856ffd9f8417eafbea606d862dc5897bdf241f3e8e49aded5eadc7295e5afbf96b3975d0e25daa2433612e120f659036b807c1853c03c90fade2c19dcd923492ecc906cafc57a95da6f20dd59d6 1972 - " ~x:"95fded7e5e949602c1123d80f89503cc5fb7454be3173af495a18709c1c2506e 1973 - " ~y:"6c778bcb146582277633931bfd029e69c9e8c0ae9e24913fa734554f24f64aa64fd9bc608ef677a1d4829aa8a8564c2ff0ffa2fa6a0c1a2ccb606dda018bf095f8c897d7a43349beb9807b7b118f8de8856b164b8d8babdc17b48f3a2b972ce537ab4e7a7d9ba5d7e6fa3698aca91973cd1787ef7b6b4d0410de59cd3143e0f3acfdaabe56b371b4354d0d32dbd1b5ca6a872054f3e6566319d5d50b2cf54c123ffc929007ad1857ba13b7c403f551c2fa4109c44e19ef97afb62a6103356fcc2ef451e736261010b0ef58ae07a0c801ff75ebaf6cdd763f8df2f83f0ebbda40845b2f42d3feeac071fc626ee5b51f9bc1a130514f2204971b4b7261b4bd783ff75775aa73a63d7ebe990b939b0f44a909ec390036f297c3563f64d142c14ea43c5d3c6def4a3a9ccf6274182b939b886501aeb4efb23d0073434cec6a915a67e24cbb2354c9bb1089af487eab5d8e499a632e6c61492ea15d2c444c269de33271a90042468de2767f0dcf7a66424a3a40a63eebd19cb89c8d74c58504c4e103 1974 - " ~k:"6bd1eede564ecb1b3fbbf2d96e334ab4cc002e6624e2cb8448d8608fe0e8c43b 1975 - " ~r:"37c3f7556d6e5acf7989f0baa770c2450deebd4d5f58b61e17b4b2b926b58031 1976 - " ~s:"a61d86365f10ca5e1ee2c4bf276f2374e88b5a2d1acd8ecc11e97785b4fd9931 1977 - 1978 - " ; case ~msg:"e3fc751b6978fcf40f09606ee4263e1660ff20e9c63a7138f078ae3e3e603dfcad172f3c7cb3f3545fc23bc30c37c8439c7b238341f29148276ea2122ea8ed0feacb149de17cfd33b8c9408aee8ab0ea8ba4a2b2ea237418bc3165369c8cd420242f8d32bcabe0c352e21f65de80d587ba2713cea6e53ca524aec365bdf21adc 1979 - " ~x:"3a09006faedec91446995a393b034b0c7ff3fcd05cda2e9e3b2f98e3a4bbb9f5 1980 - " ~y:"1349bbf16d375c392a9acd5bdce655f14d616274388a45cd372925c507ac129fe61b998e25127f210926ad1191583eee8c4190026ba0a95894be3f0ad5d05886c59a3c7a0044f7e2bd9bbe28bf9366d034db424f34960e30a8e7888f927d0bf984b0ff99ea271871124aa12e0c0e19624e533cb4149cedb3e11d321600dc07b32e531a615c8f7fd7f33a071caaa76433d1aab0b710fa7ba3ddb0175ced4e558d5117afc7542b9b07a8fe8e4b08a1de456443553fe87a4c2455ded72f98544d6c41d6ef66b7142a4aa9aa1d3d20f700010389e417840782fad682153d569f944d3d3ad1d88db5bfba3499e4c3660b76b44da4b0e6727ebc3f22b2a0aaf62dc2a29db8babcacc2169c2b8674054c89fd770db98b12af2d933becbeca9f22444b527aa894b3765292dcffaf3408e699495df79b98d957fdba7e4c8e7ace3f987a95dcb2e777fa2d1304479a6d137efcb0c404e6d8ed39d6afba2549f3ee2b9a45f324567c0227319dc59bcadfcfdf1566f356f7c2ba6db21cca2a8fb2fbeaf31cb7 1981 - " ~k:"4212971feb32e25fbb22845ab8c9333cb2a265f003542838a128a25108a88365 1982 - " ~r:"2d3f3c605eca8fec37a76d606d20fde89cb6f971a44796095a01dcf8e900f5b2 1983 - " ~s:"6a43168334e5b0ea07cfa5978609e86f969d1005528ebb3ee9073d5655d54b44 1984 - 1985 - " ; case ~msg:"45f656a1ef0e61de46df2ca2d8ea26640a994c30380c0cfd66be3998d89849161bbcf3bee77ad30e769f10e23aad5b4df4edc19a86fbb5abdeec8779b76be279532d7692bc586c62692fa1e3dbcce33ffddc9f97589172f64a48535693ded6bc73b2ca32469d0eaf6706d2a5f58f8d28a745dc328bcc75b3415ca93e29eabb1e 1986 - " ~x:"9f35b1038686bde07a5f517d68f562739cb7150fa47ebaf7ffd29306afd4688a 1987 - " ~y:"31a989601f32b205943a841887df3c6814cfb2258e5204d04d3928ddfaba0dffad43151e27d666d2928bedc67275440fb502ed3eafc3adc11009ee703f01eaa034aa724fcc63c59a8a5963f3352f7293ea2425ea89bbf1e41724b69f383bf10a973146ed02f55208b04833d1bb5399a67f04081590acfcfbb12105423e26091d09078c45007d436eb19f952f8798b001a3c64a3baa5496c9dbe6580781d4020bb7e4e7ae2380ce79658c10a2e57bbb8cac12087728ce43ba2b9f380e3abc2dd12a682488c6b4fb2f8dd7f3846b6a26f913ac156879ee6a1ae0ada9568521a4428ed9f741e0e79a842880019c01b34e988a7cf7e63524e8cd025453223a2660273e491968af7f4b1dc2123961de3753ab16eca5b1859a4f71172538f05a2a82a34f98ba07c1e531d82ef592e5493533416bd6c6a4c7ca3b0d2a2fff88a8f073a76c691802aaaece4e852d6650871a17cca0f5251ef22dfc8e3b261bfcbd5a22b2732aa17d7df1f7b82f6b222e5f6065bf80d04c2e5774094084e4d5ce0d3e8917 1988 - " ~k:"55d1ffc73b52b6364d660fa4658a6351142ac538fd3cfb4eec40ba07bef5418b 1989 - " ~r:"3ced0ea5f7fd588668a41efe0e90954c0930afb6be18d90752831f683cd92a9c 1990 - " ~s:"9e46ca12941745ea1a12c5a2d609884cb5792f46afaacff07237137400366868 1991 - 1992 - " ; case ~msg:"c737d5ae248a96062d6afa8dcacc0384c5fbfb9d8b6052b52493c60d3edfc524b567b1f896e7447d0e24019403ed83e4889c0c4de57c70fada6c8b5a09904350a44dfaf77d60af62de3edfd8760d077473f26df2837cfc2015f227dd7d351a5350f1428f2699fd3f518326fea8aef98fc4ea673130c8079fac3895fe856c77f8 1993 - " ~x:"40dbd496fc4644be7ccb24d9dc55895c1b923a05f4da5610589d564ee8aac33f 1994 - " ~y:"6112d3cd3191d17dee7788f568815a0aab50006002c9de2bd1a9bba245ba02894b02e9247517ace698ae0a05176b62b3a025a563dda8deb7f2fc3e177ae3477448d39ae4ebe7ae8ec65a4421f754667fd6d7c2eb93f1a18d3d1a6235736bcdb74746f46d88e65dc07c2591e1f95dda5e5e20e105ee8b4ddcaaf36021290d6b6493671d8aafae145d9b90bec3cc60179bb8fc30f143c575d5d861623721b6547d3aaaade455f05fef9318abcd29bd19b12c35ca756de5108c185ece4aa1bf1a8e38809797067bd1f52b6cf2c415e73f9246bd5bfadd7b9a9d2b5369701e72147e22da7e092d9b578fb0c044a36effcbd709258500a00cff230962c44225712fc43f9e802baead7f9cb46ab4931f663c6e3ed4082d59610f01741b5f24566b01b3e3933b29e028c54bd2fc75b549fd05e64c58c9ae0ba417a9e98581db77be75233a42f771c99f0a49b494f0955202b19d6c740e866066104e463e65e4bad9a081636d05367426153f04bcb2712186dca6834388e82520d34efd8a89313b2c7e60 1995 - " ~k:"aa63e91cb3fa545c447a8b8309a569d48104e14d5d05b8951033ac8a7d711c3f 1996 - " ~r:"0041b1c756dd2e42714f9ee7edce21ea33ef49dbf452ccd9357d5f45ffab08f9 1997 - " ~s:"102c6eaad38d39c0d036335ae19dd0d75e8dcabae59b120f69cbd2b5cf48abdb 1998 - 1999 - " ; case ~msg:"a6fc89a223022ee9e508725278582f56db9cd24c0d75d072a528d0c60f27171ea376e2dc28a9dc0b12e668af77dcbb381737e1ba7d9e80b9bec80bf9061b8fa10e43a7403a291624a600dd4f5c2b50c52d5c6155d52be5a325f6ad813fb3ecaf6d1f92e98cc87c26c68cbd15d548a3782bffdd1116c7c11fcabde4025fec5154 2000 - " ~x:"1b41c29364947768876ad4e7abcae59c8e61373d25274ba42ceb3d876d6ce672 2001 - " ~y:"6c1d4d6b52aa4bff35f4302330052777f51f6a0849161f906ef217b04b18545ce52ae4ae423ad1b4f8b1735ae00ab0c044a56f945da84d1cdc26e082d7acd772dfabcd18b5e13c05c2791a8dc16146e151323e4ef2ce5d64389f69d9347aa2a5bd0114de0eecdf990a440d1bf9890dd95fd640d2fb1789ca6a6dbee1836ad7cb47370b7456e49f3bac03310f8cbe61dd1cc06d78c76fec6397e608a4cac4e2c38983ce5aa9dcba074a206fa608db35f2ad3d63d95b2cb7a01c33d498767e8e68578e4e99538bf3d703e63863a25091452e73b96a3716e9cc109b66008fa5cafdbf96b7fc10c3bb89d79d45ffefc01908d247ef1d4fcb903bf5e7917af88618a52a12004798890540a5a75c65fbc057d860f4b65d8b08b8d215f056d8e5e38bf0b319e294db242a4fc79b2e106feca2556d146f5203fd72adc73a48e3a5aadbb293a2ef5862654c31539ad856a16e5716c437b474f3339cd84f0ac92bc2ca6fac10c751d099a90408def6106ca83893d87e32818d7634537a4ef667ce7f26a5cb 2002 - " ~k:"4c9ace2c908648032151f638e3c909d1f0646fe018a1c9c22a170eff64447fbe 2003 - " ~r:"48bd010c1af77b3c40db50349706d64d16cbb72db51943d345151deacd4a4133 2004 - " ~s:"0f1c4bdb4758ab3b5518d4605b9864805723d33a36116ea650546feef11c4a5e 2005 - 2006 - " ; case ~msg:"2ae4ac7ce29ae7d32490d3a54b715db3f47306f84b59b33b21622a18aa2c060a4434adfa01ff1686b5d1dd3035308e92f7acc76dea969deefb98c2972b42a596e1055a5aa2c661f0b734ba4f0b341c77827d88915a5e89f95a98d63d7729874fce4ff75d7add74f4313dff784e417b2ee1fcd270c038dbbbb96a7768484b8854 2007 - " ~x:"87980da0684558f87e5864ae585864625aed61b1309c1d5f30f6477f947c44fb 2008 - " ~y:"0a84298f4768e9d7bf796d06585e8b75fbde658398a224a8ac3a49fb91235eaaa183aa8827cc2af79ea334dc8be4cc729029ab5f8161f718f7bfbe90ad2a159888523982b6d4932d8159495ba84d0ab35d7e395d14dba906a1679ae3cbb72c10ed6fa14da4d60077b0bfb591a3dec643996c396338a51d446bde6224aea16aef41f354e09a9dce9f3a00cb445a5c9cae4a6c3c1919c9e0c53082173d0ec00ae5e15aa7260750b6a03ef05a518a48615340ac20984073cea5fc990d489858949aaf6e9e347b4802afbe25a0669472bd9316ba2c23a61cc3aadf1b70d9fd9761bb035f0ca51edb2b12fcfd651cb92363ef48005a2683fd2ed8665d70588fd9a1be3aa51c958b81f13e4acfaf0d2a90aaaef21b2cc9ef2ed37bce3c47c8bcbfc1fb9f94e49bd2f1a30a88df22735a0fdf0ac6028a008b062c9560c42a476997dd21100692ef6396d5f3fb2c155328257e7b7d2bc05fabd54a81a2272993d342bec8577c64d51b4cdbe3654dae568c4da018618c3047aee06bf2621e056b335d044b 2009 - " ~k:"25b9d8fbe7e3ab7017f2b1e53da579df460dfb72ba5fe4ae4c85b8c23472bc8c 2010 - " ~r:"6b7ed3a4c2a4f78500c7e947e6175c5ca857c9d613e7790b9be0d14ec8403e5f 2011 - " ~s:"a116f3de166260d110e20e84eb8c97c3f018178608a2ea3e3e2f5ed91d43de11 2012 - 2013 - " ; case ~msg:"3eade9a10fb59af36a540170737fbc536e4c5230b8f6c4b216eddd3ea92342123a3374d0c751b24b627f9ead4de26e9a7897d9bc5d58a6a3ac74cd4575b3286ec15f8453224f37179e51d9c4ad8a60bf37d71c62ad7fc53e5c7b12f4aaa2d428e5c889fd7f062c913d9b574f4b5db516c976bad588302f219fd83e18bee8e68e 2014 - " ~x:"6cf453178db0dd7f2f94f9a1f518c622c1ddee46d4b090462812e9f7b862265b 2015 - " ~y:"08a15b2384dff4f3033c87168673c567059870c8e78d2fddc7540afda8058df384d3182a42615432ff93777d3fce49c117c7bbe821e6789b5137ddf084656098aa7b0516fd30a42c8c86d94e6b268b6e13011d25eba018ca40cf8a35e1963135d5cd65a57aca8b007988a5ea75adb4d01cc0f0838ab42d3df643a7d2561cfd1fdebe3ad86ad03de317027533d523351be532bc731aaf43b8642a7da80873b80dc61b7a249e5860fd1a3eae0f8f0cf21e205d6f403cb0a103290c9e69d38cbed9e092b69f71f9172b3676f29a97133fc3e18746fedc653fbfb62c5e0afe89a8e1b8724b1a3314c4cacc4bb8f390439701a614ae9bcdafd472b0ab131667dbbf1c790f73ab9046a58932691a930b3c42e908b4d1f47ed6e2ff18d6b70bb16d1af7993bdb2ca3cb359a0b43f8dc844dea6aebaa34b8d2b6fc288419780ff980908926c46c3b0e595fa308f4e894ecb683c804c93140d91769132d37e93791b9f89d595e698f049b3a9502abc488bdd9472f1131a757f3d54b149067507d1b04a976 2016 - " ~k:"a3fb61e544d59206d334049e8554d97b6699db616871fd2b421229c28e84f73c 2017 - " ~r:"9e833ec3ded9d81ea7422bdac78422274fa35348e3fce3bbc93b3c10d70b4f1e 2018 - " ~s:"653756594eac681d48a2358a0f82a10faa7929b00fd9cd4394c32679060f96e3 2019 - 2020 - " ; case ~msg:"33decfc1e06b92ed81cd30ee3771470b59e22c1564647f1aae8510729715a8ce94624a11554ac909c924aec853df64327546db85d3df597916a39353388a8b3363765281a4352701ff1af43fba6d03664127c15da7b84c04d5409c364094dc62e37983a8eb066880de8136701406e67250679300d2b97d228327c1514c0bc1ea 2021 - " ~x:"3bf2be01d154c23ccae92ae93f78ea36f70efcf7fb7eb43cdcaeb9ffb8471b10 2022 - " ~y:"16ea2e795c636c9d312159a579b8df329ffc28fecc4a4c13b16a290bd1525a53a97d72315be251d11d23ca78bbec45c0e243279b1eb6e206a9273c1e766e213648bdf90c40479df48acfd9c209a523c8b4a99a481ca8df4774b3bb29f82526520c2dc28ab314fe14140f2be1792e1ac3c759ad44f7845a2012f64ecab0b1fec0ed166bd175955704f62d9401111ffc04f804e48fe774dfd346bb41f4beca2b34a83134a3884a01729cce1abc5b8d0de3fe2654c374deb246d96ffaffc7aa2055b74e819bbeec137eb3caed1fc71f129c8ea8b763f2f57e88de0845f76ceb1841559019872a5b5a969c9cf385d6578b4f27b5b76be3ef0a8fd3ee47eed695e16f14e2a3b791f2a016d6b86ff8ec2343c6a5c80ab6224b6502eb374c8fa6510bce990d70efdfa9a0b702585595184514c78f7e905b6fd6c237333d560fcc06303637ac0b2c7f7c4da559e31f531df2e5d6c651591771d7ea4575888afc4011fa1124fbd1a282a41d933989eff91a51cd39bce7fb0d569fedcc42de48bf18ee755f 2023 - " ~k:"a0c97f80ca449fd8f69733e046664408da590dbbab6865c3275c389a478aa248 2024 - " ~r:"6f77a52169a2e880a3b55aa278f6463032dc5f81c38468224d5532f6a601f2d9 2025 - " ~s:"96b753efb4abbc8c179d03cc2a1a0c1256e23d1fa2e97cfbf55d2bb69812d100 2026 - 2027 - " ; case ~msg:"6ae5a6da794f923f6d8032549b81d04ae7aa35c2099dffbdd83bb94db574faf8f95c7126db2db60fed50f740e87c359544dc2ebfbcafb094ddca69c914d27e5f3d10fa0ce32d2a1355bcf61a2574c755d7c324a2e0ed6f7719ba2f2c9f113df8d04025f4abd2e1c4b7bc18d8acec9f6d8d797cd7b042f50348eeb3f7a2922da7 2028 - " ~x:"3b4a52c8b5c386f26ac6ffabcef2df3bf8b25e6108ab540d314dd3d9245c075d 2029 - " ~y:"93106fb000c67f1111c6fd3da0f44b4ae4cb3695de2e35b241dfe88d3269b8fda25bf348008725fd613cd61aa826bd8f1aaaee22b4dc0a02842290bb7dad91af0b2854ffab16932208d272f2c081c13889db3ed0b24646c665af9f4b723898eb1ac0053f2a0f4cf22fd4e12940b5b52269484ebb8abc484c06eddbd9b1a426132f402efdcd88ab29e7e510961af8ec83a642e34015858ac3f32197601a888e16c759c94ec5b8dec0da30643b9d9db2574af29e78f9d3f6a7b4c76f45cd0b2ab5e8524935b886918b5d9e9ccb5a6853e62efad2dff83a8520985ee8442f2bdd1c5f9d48062ade6b288c8ad82a41db6c34e2deba541aaac3cd3156c975efbbc718ebd4961996b3ed1cc5c2987ab779052cdbecf51d17661b498e84371ff859f89906f426f563572f66c279ef3d036a427778463f67f8d4de623fb4b2803007871d0a349ec202a9aa1cffef70137e009303497214ada786357a4d8046255e40f89ea588000634e7f0aaf64d92aa21fff8fbe078baa96961699738b268237eab606c 2030 - " ~k:"39f68875cade6ae208d3043b010541624679df649cc5d97b09a3ebbe2c9d59be 2031 - " ~r:"8636d4d3203aa0912fbfc938be4370077ea9c75195cd2f67e6ee427cde531c40 2032 - " ~s:"93023d97efb4327e9e886e7b783741e9d2c397af9c67b91cdb8aa27f83bb025d 2033 - 2034 - " ; case ~msg:"86e03bc3f4ddea6a93888ee389b15eb690822c71f9b85efaaffc52e486b1144ad7fcff3f53bf97da2481e85e0983ee1d5279e27a364d0e690f587a31535fb94eece747f8b605724adfb258c9983c9002e0c11b7976627690d58281305ea9308db74c491a28192e354b600e8376811ccefb751bb10c7d97b42ffe304bee97ecaf 2035 - " ~x:"7f56c74b495a12db963e03cfafe60ac95e8019cb212c332d1f19c64615568119 2036 - " ~y:"23ed5445391a5bb94e00c76ec80d83728d5d461be425da79f921bca27d625cb42b323971022ad4c3f05bca109910fd06ba39e95bebe794ed108d2ead297ad794f99c32c219e65fb726532715b1bc2075dd4b6949297712f91d5ba061196fb25754c34377bbbe6a37f61787ea844d359285c78e733eb65f665a6b157f832b5638d74ebe1d5dce66d528925e44eef13bf23f807da35f34d169a687758229b99a313acecfb20b142b534926d59aaa7643a79030e9335ef28abeddac8ac9471da4997e33f3e491db8668a2c3920a3b3a37225179361d5539beb33f3252244267465e48faf575cdac938133effe9d1f69f19f1b44b245a447b1fc2b859244e2e39053595cf7978933c3d468c65c231663070aeaf2ec23138d1660081a55bdc3dd3f2446176b1d6d9977a14ebd0ed4d8dfcdfc4a433118401f2c2632095ce7ae6200c74bda5d2fd3854524c3081741975a076a1b4f933ec32a2bac9171bebfdf3b355eddb1f455ecaf73396e85fb04797558ba4f2bbc49d9f2329a23b393301ae0db92 2037 - " ~k:"407180cc311aebdc1cdcb4685241597783f34076672362a24a21193c0d45d24d 2038 - " ~r:"68efaa05eb90c48c6a7a45337c29175f8ee5b19b53db4ebd83a02f53c5b2104b 2039 - " ~s:"145f13f1ae3675c521b334ce6a49fc6f502e3ac6b2b5143be0641d0d57b3c722 2040 - 2041 - " ; case ~msg:"1d0954ee0de1e9ceee0532597ee434c73fe4f66635f7e72d38b67763c66817f53cf36ca0f613e01896cebc9f77a772607f4aeedd3856c73fc2f19100aa7b540ccd057f26cd9564d673228c68088e5f1abf1254a97ed1453ee558e062711ceb7643b345ad33b649affbe8a62067f9d84ed4c8506fcff578d2eba596a205267387 2042 - " ~x:"0b48499625f0c2548bf8a2fed1f6696f59df8fbe6eaf91b82385994209c2d04f 2043 - " ~y:"2f0d89ac78a61fb74f81142b17766656d1788940077808e3d880ce10ec60e2bbb158d54e020dbc5f6786c0b43cca2cb002c8ce13b291b250f399e8e02f195926978f6c5b007d4f0a66048996a9932a918b2363c4008f547adcaa7d12694baee4fbca34bc6d7e29c5049cda13698fcce61bd3b3db05d2158132dd380cf653cccdf279aa164134bfbddd7ea347760041f92c3a4cfde0092d5cb96bb8c24e98259475596f3377d59f11661bcc0d47e83cb31aae9dcb4a6f25619a29054b62aa8b421e529e61ac95a0de01c50b09e119516c2c5b3563d47eed679a1cf80ba70a50254d851a13a778e1a08da8667e46e35979c15df45cf7886dde5af9d744624b981acd252ec5ba46870b8ee4b32b1be1b944802d91d8148d38f54315a7ad4e38079ea2bed9df8fa59414ddded3a1d2308ba769ae2a652f10c2d96917edfe5874885f3c99d6912f69ae3fc3b4de82decc30edc9314f7ec9e567b7e00de21959486a887d74a5b2180293df5dbeae1e35a6e937b2506d205092cc4c3595db92fc255af5 2044 - " ~k:"1c020abb0e1d52b3ad95467f7baaf665e2281f34c342401ef1fb4c1fc2d7b2bd 2045 - " ~r:"a67210341a04cd3a4b63ebc7e6208f37e487a8c6f1134cd2601b844d6903203f 2046 - " ~s:"6b972c622cab48d85a2dde355f947a8151a17a0acf06b7f3659f868d5ece92d9 2047 - 2048 - " ; case ~msg:"14f566c5fe44aaad6e8b3c627570aabdd4efb7fcfa1ab1bb74f2c6d8795e88233dac4e7d240abd5e9bbd8e1fb03a3bf50c0ca92c9aef1894f2aed600fc5873d23451d3204d75ab9581cbcf82ae8c0df0dfbd3a1f149f70660865726cdc73c015d5ddbf7513eedcd1ef17578d2719fea1e5ba39aef3fa6f00846f0fb8d9a1a436 2049 - " ~x:"7928d3edc11a890fe332c0d3759bc6ecb822438d7f604da76b4fd78590720ddb 2050 - " ~y:"a36a333900035d3453139b28356bf0124e571f55a5e4259b8b2ee1457cc3588056d6c6a645d422cac72474c5901d0a7f410df7f9b4e22f8684867d9332e2d4266a6e595e515becff7fb94d21a8a9ad7211572e44ce8448317b34c3c0b89b3097ab2ec134ec7c178c2278309cf9152b223bb937e68682f1f680c17ee59ecd0698a05c24c135d2b0238e71f807e079f175e11671308f5bd9e5a69712a9c508b3b50925d1276d552bda51cef3bd0fbd00a9d2dddf0e5ecb6b328378ea637b493846480ed75a3152d9e6a4884eebad12b07cad8d101b3d001bc99fb1eee4e98fd6fc920cb5765ec24e62abd32f975a47d50f61553e1c14775193b53b05b7d02024aace818ab659d717d11deacc9877b818a51689d239b60f7f9ed4caf7325ac0b31b316c036599ea66959d525fd16f5c1a2a809f2866ee9e99f6d8a3c42b58d33d0e5d38055c55c7bccdef310ccd3426207dbbc60faf9f2a219ab367ce84623b81104822e2c77ec5b133ce7050caed090946c1f1355d878a1317de694e686c62ffdf 2051 - " ~k:"01f77e5f125a9a1385349f77d7a32f26b1efa5b0a5d4a212753bb54d300d088e 2052 - " ~r:"12b40bd1c866ce38e7da0764d807ae82512b33b51dc908e5a5b3d7c16f0d08a5 2053 - " ~s:"5caccee2bc85e28d506a9bc6d260dbd08205b75d20690e26aa6bed30d7327099 2054 - 2055 - " ; case ~msg:"60c29d99753d0847bb52e906c862a1b0628496416c14df5dcfbb5e2804f502cb0a2d163e9bc2d84122c0b3f5d0609b82ac16aa15efd55f55c8caa3d1114ac0cb83e5ff3db12a24b89aca5f0514d2ceb09b14fa916000c0f4deb016db755e88b326172144e4f1a705a800559b3da3c27af55cb32b1147460c31186d99dc1cf2e5 2056 - " ~x:"3dd64db4bd8e28e701235ad83a5d5e9dd13ee8a3b3dcb4c99c1bc95b6ae25291 2057 - " ~y:"a37397e6eafbdcf1e0158f1f4ea1cb3a1ebd739c8559a500def3b7551799d652b327101cfea0b87016db591522b9b34ed267132c5255e77653c4eb935ce0c822b4b10a5e8f3cce39ad1b9606de5be2b2d36e1c5411f06aba0461ea8dc48b649f108eba88def44daa2a5c653dccf1d8ae29205dd5c340e34b7bd698eccdcd345bd4aa5eee3c08b9162ca1804872de3c575d572f34dd48b41f8235d0f511c8dc65daeb07095c3b5dbd3a076f8eb24412f3621f492126737a9d73014defa5f5d57bdc6faf53142eb191606f2fd3dc035f4b8ae84d655cb6daaaf889005c3c334ffd7e3b0498fae2a6f8dc1bc62f3704c8f8c005c8019e0bf45b7aa8e0803b93a992675e381f61a898582950b9ce40e7cdb0300f4b26f9b44484e89c9234179b60a372fe9476f84de0ed4b93497216fb96bae43297dcdc8496c634100cf066402c7d290a7cd28cbcf8b08ad4c136db2fe992ffa045bf8cb249234f29a674762a56d20897ea5538c674a14353db64ba60fe4052a0528eb0b25887e3c5ea69b41f68b3 2058 - " ~k:"453b64f2dedfeb1419b5dbeb726a2c92b1a37ef11a7732c911d9a96184285f40 2059 - " ~r:"72cf0e18e4bc3749647cdfa62dcbd2513c7c2b1d397c1fcbc7f6a425ebb897ce 2060 - " ~s:"7b7d0a9e93340941bb55f6afa6cd63f7364963671008ede457d05b6545fab1f1 2061 - 2062 - " ; case ~msg:"b3dea62a20a9ed9da990465bebe18aa71f08f93fbaee4fe5d581ffaa6fd55cbe272a115d7fa18fb9cf5662f595b7cb9bdb97a81bdc078ee3bdceb2c03722610134c3bbfd7a6f8b79ecc6a9a7709265687f9c236fc68b02203ba666e9eced5161de90c110ee7af9bf54d84a22181f17b4329348bdeefbb324962e63569f07c285 2063 - " ~x:"6327d3818c87e4c99b7e5116fc091a9da1e4c02aab9b207d61e859dda8d859ed 2064 - " ~y:"45013318b941a710b8ab1010d818c3103634658d2e3e2f413165860805e08d5c1e80add9969a3d3a0d23432c8a48cce836b24a410892099bbf53cc5a84a95e1eb3b682d2754e721efc86d3f4248baa337d6f6e5dac4759b296165918a71b31ced25bf1b05d675bfa222980608fda8f9d0eba9aa08475512d04c612133c88253bf3e27e9ffe3a8570be204f54bf8ff1c7fe42aece832050aabdd9415764b8c872697f9c8e78e2f56bd235ebbbb4b9cf8f054b60292963764536d6fd4c6cfaa1baea53546c6ffb56a04fbfaee001228280aec40e66d9dc192f9ba743bd3ffc0eaf277b6ba3d33c3697024892b0b35419534873fb7a3d594dd6ae0751a2fa430ba46237f4a55e4a678072c651fe6ad314a010fdfe8f8b5342bdabe9ae5910c6f44a51f47524a6fe8216830ccaeded26ce1f13f7f216e0b7809e9272563cab3352b8ed766650227bfe16e981b505609c41f03dca98e219d02aa7d91921edb3a89229e78c30161cc13973b35de3c87779378b8d607a19320405661312432dd8d07af2 2065 - " ~k:"94a0f6f58f004e45ce5ffffa6e63abca8daf7768cdafd517f3a5e399828b1e72 2066 - " ~r:"3ec677e91c63e65aaa174aee2791dc409244cb80c0220991dcb497397a3c5e9b 2067 - " ~s:"1de0ec466b2ad4ed1adce3bc38ee521803dc87085e2fbfc561d63844c1a9a2e6" ] 2758 + [ 2759 + case 2760 + ~msg: 2761 + "ed9a64d3109ef8a9292956b946873ca4bd887ce624b81be81b82c69c67aaddf5655f70fe4768114db2834c71787f858e5165da1a7fa961d855ad7e5bc4b7be31b97dbe770798ef7966152b14b86ae35625a28aee5663b9ef3067cbdfbabd87197e5c842d3092eb88dca57c6c8ad4c00a19ddf2e1967b59bd06ccaef933bc28e7\n" 2762 + ~x:"6d4c934391b7f6fb6e19e3141f8c0018ef5726118a11064358c7d35b37737377\n" 2763 + ~y: 2764 + "1f0a5c75e7985d6e70e4fbfda51a10b925f6accb600d7c6510db90ec367b93bb069bd286e8f979b22ef0702f717a8755c18309c87dae3fe82cc3dc8f4b7aa3d5f3876f4d4b3eb68bfe910c43076d6cd0d39fc88dde78f09480db55234e6c8ca59fe2700efec04feee6b4e8ee2413721858be7190dbe905f456edcab55b2dc2916dc1e8731988d9ef8b619abcf8955aa960ef02b3f02a8dc649369222af50f1338ed28d667f3f10cae2a3c28a3c1d08df639c81ada13c8fd198c6dae3d62a3fe9f04c985c65f610c06cb8faea68edb80de6cf07a8e89c00218185a952b23572e34df07ce5b4261e5de427eb503ee1baf5992db6d438b47434c40c22657bc163e7953fa33eff39dc2734607039aadd6ac27e4367131041f845ffa1a13f556bfba2307a5c78f2ccf11298c762e08871968e48dc3d1569d09965cd09da43cf0309a16af1e20fee7da3dc21b364c4615cd5123fa5f9b23cfc4ffd9cfdcea670623840b062d4648d2eba786ad3f7ae337a4284324ace236f9f7174fbf442b99043002f\n" 2765 + ~k:"40b5cc685c3d1f59072228af9551683b5b8c8ff65240114ad2dacfccf3928057\n" 2766 + ~r:"7695698a14755db4206e850b4f5f19c540b07d07e08aac591e20081646e6eedc\n" 2767 + ~s:"3dae01154ecff7b19007a953f185f0663ef7f2537f0b15e04fb343c961f36de2\n\n"; 2768 + case 2769 + ~msg: 2770 + "4bfd28a0a79c94dbd667c275ef77a235d8ead7c698d42fb7f7c1fd3c8c2dc48d0dda2408dea56325d69283692a523d281ffea856ffd9f8417eafbea606d862dc5897bdf241f3e8e49aded5eadc7295e5afbf96b3975d0e25daa2433612e120f659036b807c1853c03c90fade2c19dcd923492ecc906cafc57a95da6f20dd59d6\n" 2771 + ~x:"95fded7e5e949602c1123d80f89503cc5fb7454be3173af495a18709c1c2506e\n" 2772 + ~y: 2773 + "6c778bcb146582277633931bfd029e69c9e8c0ae9e24913fa734554f24f64aa64fd9bc608ef677a1d4829aa8a8564c2ff0ffa2fa6a0c1a2ccb606dda018bf095f8c897d7a43349beb9807b7b118f8de8856b164b8d8babdc17b48f3a2b972ce537ab4e7a7d9ba5d7e6fa3698aca91973cd1787ef7b6b4d0410de59cd3143e0f3acfdaabe56b371b4354d0d32dbd1b5ca6a872054f3e6566319d5d50b2cf54c123ffc929007ad1857ba13b7c403f551c2fa4109c44e19ef97afb62a6103356fcc2ef451e736261010b0ef58ae07a0c801ff75ebaf6cdd763f8df2f83f0ebbda40845b2f42d3feeac071fc626ee5b51f9bc1a130514f2204971b4b7261b4bd783ff75775aa73a63d7ebe990b939b0f44a909ec390036f297c3563f64d142c14ea43c5d3c6def4a3a9ccf6274182b939b886501aeb4efb23d0073434cec6a915a67e24cbb2354c9bb1089af487eab5d8e499a632e6c61492ea15d2c444c269de33271a90042468de2767f0dcf7a66424a3a40a63eebd19cb89c8d74c58504c4e103\n" 2774 + ~k:"6bd1eede564ecb1b3fbbf2d96e334ab4cc002e6624e2cb8448d8608fe0e8c43b\n" 2775 + ~r:"37c3f7556d6e5acf7989f0baa770c2450deebd4d5f58b61e17b4b2b926b58031\n" 2776 + ~s:"a61d86365f10ca5e1ee2c4bf276f2374e88b5a2d1acd8ecc11e97785b4fd9931\n\n"; 2777 + case 2778 + ~msg: 2779 + "e3fc751b6978fcf40f09606ee4263e1660ff20e9c63a7138f078ae3e3e603dfcad172f3c7cb3f3545fc23bc30c37c8439c7b238341f29148276ea2122ea8ed0feacb149de17cfd33b8c9408aee8ab0ea8ba4a2b2ea237418bc3165369c8cd420242f8d32bcabe0c352e21f65de80d587ba2713cea6e53ca524aec365bdf21adc\n" 2780 + ~x:"3a09006faedec91446995a393b034b0c7ff3fcd05cda2e9e3b2f98e3a4bbb9f5\n" 2781 + ~y: 2782 + "1349bbf16d375c392a9acd5bdce655f14d616274388a45cd372925c507ac129fe61b998e25127f210926ad1191583eee8c4190026ba0a95894be3f0ad5d05886c59a3c7a0044f7e2bd9bbe28bf9366d034db424f34960e30a8e7888f927d0bf984b0ff99ea271871124aa12e0c0e19624e533cb4149cedb3e11d321600dc07b32e531a615c8f7fd7f33a071caaa76433d1aab0b710fa7ba3ddb0175ced4e558d5117afc7542b9b07a8fe8e4b08a1de456443553fe87a4c2455ded72f98544d6c41d6ef66b7142a4aa9aa1d3d20f700010389e417840782fad682153d569f944d3d3ad1d88db5bfba3499e4c3660b76b44da4b0e6727ebc3f22b2a0aaf62dc2a29db8babcacc2169c2b8674054c89fd770db98b12af2d933becbeca9f22444b527aa894b3765292dcffaf3408e699495df79b98d957fdba7e4c8e7ace3f987a95dcb2e777fa2d1304479a6d137efcb0c404e6d8ed39d6afba2549f3ee2b9a45f324567c0227319dc59bcadfcfdf1566f356f7c2ba6db21cca2a8fb2fbeaf31cb7\n" 2783 + ~k:"4212971feb32e25fbb22845ab8c9333cb2a265f003542838a128a25108a88365\n" 2784 + ~r:"2d3f3c605eca8fec37a76d606d20fde89cb6f971a44796095a01dcf8e900f5b2\n" 2785 + ~s:"6a43168334e5b0ea07cfa5978609e86f969d1005528ebb3ee9073d5655d54b44\n\n"; 2786 + case 2787 + ~msg: 2788 + "45f656a1ef0e61de46df2ca2d8ea26640a994c30380c0cfd66be3998d89849161bbcf3bee77ad30e769f10e23aad5b4df4edc19a86fbb5abdeec8779b76be279532d7692bc586c62692fa1e3dbcce33ffddc9f97589172f64a48535693ded6bc73b2ca32469d0eaf6706d2a5f58f8d28a745dc328bcc75b3415ca93e29eabb1e\n" 2789 + ~x:"9f35b1038686bde07a5f517d68f562739cb7150fa47ebaf7ffd29306afd4688a\n" 2790 + ~y: 2791 + "31a989601f32b205943a841887df3c6814cfb2258e5204d04d3928ddfaba0dffad43151e27d666d2928bedc67275440fb502ed3eafc3adc11009ee703f01eaa034aa724fcc63c59a8a5963f3352f7293ea2425ea89bbf1e41724b69f383bf10a973146ed02f55208b04833d1bb5399a67f04081590acfcfbb12105423e26091d09078c45007d436eb19f952f8798b001a3c64a3baa5496c9dbe6580781d4020bb7e4e7ae2380ce79658c10a2e57bbb8cac12087728ce43ba2b9f380e3abc2dd12a682488c6b4fb2f8dd7f3846b6a26f913ac156879ee6a1ae0ada9568521a4428ed9f741e0e79a842880019c01b34e988a7cf7e63524e8cd025453223a2660273e491968af7f4b1dc2123961de3753ab16eca5b1859a4f71172538f05a2a82a34f98ba07c1e531d82ef592e5493533416bd6c6a4c7ca3b0d2a2fff88a8f073a76c691802aaaece4e852d6650871a17cca0f5251ef22dfc8e3b261bfcbd5a22b2732aa17d7df1f7b82f6b222e5f6065bf80d04c2e5774094084e4d5ce0d3e8917\n" 2792 + ~k:"55d1ffc73b52b6364d660fa4658a6351142ac538fd3cfb4eec40ba07bef5418b\n" 2793 + ~r:"3ced0ea5f7fd588668a41efe0e90954c0930afb6be18d90752831f683cd92a9c\n" 2794 + ~s:"9e46ca12941745ea1a12c5a2d609884cb5792f46afaacff07237137400366868\n\n"; 2795 + case 2796 + ~msg: 2797 + "c737d5ae248a96062d6afa8dcacc0384c5fbfb9d8b6052b52493c60d3edfc524b567b1f896e7447d0e24019403ed83e4889c0c4de57c70fada6c8b5a09904350a44dfaf77d60af62de3edfd8760d077473f26df2837cfc2015f227dd7d351a5350f1428f2699fd3f518326fea8aef98fc4ea673130c8079fac3895fe856c77f8\n" 2798 + ~x:"40dbd496fc4644be7ccb24d9dc55895c1b923a05f4da5610589d564ee8aac33f\n" 2799 + ~y: 2800 + "6112d3cd3191d17dee7788f568815a0aab50006002c9de2bd1a9bba245ba02894b02e9247517ace698ae0a05176b62b3a025a563dda8deb7f2fc3e177ae3477448d39ae4ebe7ae8ec65a4421f754667fd6d7c2eb93f1a18d3d1a6235736bcdb74746f46d88e65dc07c2591e1f95dda5e5e20e105ee8b4ddcaaf36021290d6b6493671d8aafae145d9b90bec3cc60179bb8fc30f143c575d5d861623721b6547d3aaaade455f05fef9318abcd29bd19b12c35ca756de5108c185ece4aa1bf1a8e38809797067bd1f52b6cf2c415e73f9246bd5bfadd7b9a9d2b5369701e72147e22da7e092d9b578fb0c044a36effcbd709258500a00cff230962c44225712fc43f9e802baead7f9cb46ab4931f663c6e3ed4082d59610f01741b5f24566b01b3e3933b29e028c54bd2fc75b549fd05e64c58c9ae0ba417a9e98581db77be75233a42f771c99f0a49b494f0955202b19d6c740e866066104e463e65e4bad9a081636d05367426153f04bcb2712186dca6834388e82520d34efd8a89313b2c7e60\n" 2801 + ~k:"aa63e91cb3fa545c447a8b8309a569d48104e14d5d05b8951033ac8a7d711c3f\n" 2802 + ~r:"0041b1c756dd2e42714f9ee7edce21ea33ef49dbf452ccd9357d5f45ffab08f9\n" 2803 + ~s:"102c6eaad38d39c0d036335ae19dd0d75e8dcabae59b120f69cbd2b5cf48abdb\n\n"; 2804 + case 2805 + ~msg: 2806 + "a6fc89a223022ee9e508725278582f56db9cd24c0d75d072a528d0c60f27171ea376e2dc28a9dc0b12e668af77dcbb381737e1ba7d9e80b9bec80bf9061b8fa10e43a7403a291624a600dd4f5c2b50c52d5c6155d52be5a325f6ad813fb3ecaf6d1f92e98cc87c26c68cbd15d548a3782bffdd1116c7c11fcabde4025fec5154\n" 2807 + ~x:"1b41c29364947768876ad4e7abcae59c8e61373d25274ba42ceb3d876d6ce672\n" 2808 + ~y: 2809 + "6c1d4d6b52aa4bff35f4302330052777f51f6a0849161f906ef217b04b18545ce52ae4ae423ad1b4f8b1735ae00ab0c044a56f945da84d1cdc26e082d7acd772dfabcd18b5e13c05c2791a8dc16146e151323e4ef2ce5d64389f69d9347aa2a5bd0114de0eecdf990a440d1bf9890dd95fd640d2fb1789ca6a6dbee1836ad7cb47370b7456e49f3bac03310f8cbe61dd1cc06d78c76fec6397e608a4cac4e2c38983ce5aa9dcba074a206fa608db35f2ad3d63d95b2cb7a01c33d498767e8e68578e4e99538bf3d703e63863a25091452e73b96a3716e9cc109b66008fa5cafdbf96b7fc10c3bb89d79d45ffefc01908d247ef1d4fcb903bf5e7917af88618a52a12004798890540a5a75c65fbc057d860f4b65d8b08b8d215f056d8e5e38bf0b319e294db242a4fc79b2e106feca2556d146f5203fd72adc73a48e3a5aadbb293a2ef5862654c31539ad856a16e5716c437b474f3339cd84f0ac92bc2ca6fac10c751d099a90408def6106ca83893d87e32818d7634537a4ef667ce7f26a5cb\n" 2810 + ~k:"4c9ace2c908648032151f638e3c909d1f0646fe018a1c9c22a170eff64447fbe\n" 2811 + ~r:"48bd010c1af77b3c40db50349706d64d16cbb72db51943d345151deacd4a4133\n" 2812 + ~s:"0f1c4bdb4758ab3b5518d4605b9864805723d33a36116ea650546feef11c4a5e\n\n"; 2813 + case 2814 + ~msg: 2815 + "2ae4ac7ce29ae7d32490d3a54b715db3f47306f84b59b33b21622a18aa2c060a4434adfa01ff1686b5d1dd3035308e92f7acc76dea969deefb98c2972b42a596e1055a5aa2c661f0b734ba4f0b341c77827d88915a5e89f95a98d63d7729874fce4ff75d7add74f4313dff784e417b2ee1fcd270c038dbbbb96a7768484b8854\n" 2816 + ~x:"87980da0684558f87e5864ae585864625aed61b1309c1d5f30f6477f947c44fb\n" 2817 + ~y: 2818 + "0a84298f4768e9d7bf796d06585e8b75fbde658398a224a8ac3a49fb91235eaaa183aa8827cc2af79ea334dc8be4cc729029ab5f8161f718f7bfbe90ad2a159888523982b6d4932d8159495ba84d0ab35d7e395d14dba906a1679ae3cbb72c10ed6fa14da4d60077b0bfb591a3dec643996c396338a51d446bde6224aea16aef41f354e09a9dce9f3a00cb445a5c9cae4a6c3c1919c9e0c53082173d0ec00ae5e15aa7260750b6a03ef05a518a48615340ac20984073cea5fc990d489858949aaf6e9e347b4802afbe25a0669472bd9316ba2c23a61cc3aadf1b70d9fd9761bb035f0ca51edb2b12fcfd651cb92363ef48005a2683fd2ed8665d70588fd9a1be3aa51c958b81f13e4acfaf0d2a90aaaef21b2cc9ef2ed37bce3c47c8bcbfc1fb9f94e49bd2f1a30a88df22735a0fdf0ac6028a008b062c9560c42a476997dd21100692ef6396d5f3fb2c155328257e7b7d2bc05fabd54a81a2272993d342bec8577c64d51b4cdbe3654dae568c4da018618c3047aee06bf2621e056b335d044b\n" 2819 + ~k:"25b9d8fbe7e3ab7017f2b1e53da579df460dfb72ba5fe4ae4c85b8c23472bc8c\n" 2820 + ~r:"6b7ed3a4c2a4f78500c7e947e6175c5ca857c9d613e7790b9be0d14ec8403e5f\n" 2821 + ~s:"a116f3de166260d110e20e84eb8c97c3f018178608a2ea3e3e2f5ed91d43de11\n\n"; 2822 + case 2823 + ~msg: 2824 + "3eade9a10fb59af36a540170737fbc536e4c5230b8f6c4b216eddd3ea92342123a3374d0c751b24b627f9ead4de26e9a7897d9bc5d58a6a3ac74cd4575b3286ec15f8453224f37179e51d9c4ad8a60bf37d71c62ad7fc53e5c7b12f4aaa2d428e5c889fd7f062c913d9b574f4b5db516c976bad588302f219fd83e18bee8e68e\n" 2825 + ~x:"6cf453178db0dd7f2f94f9a1f518c622c1ddee46d4b090462812e9f7b862265b\n" 2826 + ~y: 2827 + "08a15b2384dff4f3033c87168673c567059870c8e78d2fddc7540afda8058df384d3182a42615432ff93777d3fce49c117c7bbe821e6789b5137ddf084656098aa7b0516fd30a42c8c86d94e6b268b6e13011d25eba018ca40cf8a35e1963135d5cd65a57aca8b007988a5ea75adb4d01cc0f0838ab42d3df643a7d2561cfd1fdebe3ad86ad03de317027533d523351be532bc731aaf43b8642a7da80873b80dc61b7a249e5860fd1a3eae0f8f0cf21e205d6f403cb0a103290c9e69d38cbed9e092b69f71f9172b3676f29a97133fc3e18746fedc653fbfb62c5e0afe89a8e1b8724b1a3314c4cacc4bb8f390439701a614ae9bcdafd472b0ab131667dbbf1c790f73ab9046a58932691a930b3c42e908b4d1f47ed6e2ff18d6b70bb16d1af7993bdb2ca3cb359a0b43f8dc844dea6aebaa34b8d2b6fc288419780ff980908926c46c3b0e595fa308f4e894ecb683c804c93140d91769132d37e93791b9f89d595e698f049b3a9502abc488bdd9472f1131a757f3d54b149067507d1b04a976\n" 2828 + ~k:"a3fb61e544d59206d334049e8554d97b6699db616871fd2b421229c28e84f73c\n" 2829 + ~r:"9e833ec3ded9d81ea7422bdac78422274fa35348e3fce3bbc93b3c10d70b4f1e\n" 2830 + ~s:"653756594eac681d48a2358a0f82a10faa7929b00fd9cd4394c32679060f96e3\n\n"; 2831 + case 2832 + ~msg: 2833 + "33decfc1e06b92ed81cd30ee3771470b59e22c1564647f1aae8510729715a8ce94624a11554ac909c924aec853df64327546db85d3df597916a39353388a8b3363765281a4352701ff1af43fba6d03664127c15da7b84c04d5409c364094dc62e37983a8eb066880de8136701406e67250679300d2b97d228327c1514c0bc1ea\n" 2834 + ~x:"3bf2be01d154c23ccae92ae93f78ea36f70efcf7fb7eb43cdcaeb9ffb8471b10\n" 2835 + ~y: 2836 + "16ea2e795c636c9d312159a579b8df329ffc28fecc4a4c13b16a290bd1525a53a97d72315be251d11d23ca78bbec45c0e243279b1eb6e206a9273c1e766e213648bdf90c40479df48acfd9c209a523c8b4a99a481ca8df4774b3bb29f82526520c2dc28ab314fe14140f2be1792e1ac3c759ad44f7845a2012f64ecab0b1fec0ed166bd175955704f62d9401111ffc04f804e48fe774dfd346bb41f4beca2b34a83134a3884a01729cce1abc5b8d0de3fe2654c374deb246d96ffaffc7aa2055b74e819bbeec137eb3caed1fc71f129c8ea8b763f2f57e88de0845f76ceb1841559019872a5b5a969c9cf385d6578b4f27b5b76be3ef0a8fd3ee47eed695e16f14e2a3b791f2a016d6b86ff8ec2343c6a5c80ab6224b6502eb374c8fa6510bce990d70efdfa9a0b702585595184514c78f7e905b6fd6c237333d560fcc06303637ac0b2c7f7c4da559e31f531df2e5d6c651591771d7ea4575888afc4011fa1124fbd1a282a41d933989eff91a51cd39bce7fb0d569fedcc42de48bf18ee755f\n" 2837 + ~k:"a0c97f80ca449fd8f69733e046664408da590dbbab6865c3275c389a478aa248\n" 2838 + ~r:"6f77a52169a2e880a3b55aa278f6463032dc5f81c38468224d5532f6a601f2d9\n" 2839 + ~s:"96b753efb4abbc8c179d03cc2a1a0c1256e23d1fa2e97cfbf55d2bb69812d100\n\n"; 2840 + case 2841 + ~msg: 2842 + "6ae5a6da794f923f6d8032549b81d04ae7aa35c2099dffbdd83bb94db574faf8f95c7126db2db60fed50f740e87c359544dc2ebfbcafb094ddca69c914d27e5f3d10fa0ce32d2a1355bcf61a2574c755d7c324a2e0ed6f7719ba2f2c9f113df8d04025f4abd2e1c4b7bc18d8acec9f6d8d797cd7b042f50348eeb3f7a2922da7\n" 2843 + ~x:"3b4a52c8b5c386f26ac6ffabcef2df3bf8b25e6108ab540d314dd3d9245c075d\n" 2844 + ~y: 2845 + "93106fb000c67f1111c6fd3da0f44b4ae4cb3695de2e35b241dfe88d3269b8fda25bf348008725fd613cd61aa826bd8f1aaaee22b4dc0a02842290bb7dad91af0b2854ffab16932208d272f2c081c13889db3ed0b24646c665af9f4b723898eb1ac0053f2a0f4cf22fd4e12940b5b52269484ebb8abc484c06eddbd9b1a426132f402efdcd88ab29e7e510961af8ec83a642e34015858ac3f32197601a888e16c759c94ec5b8dec0da30643b9d9db2574af29e78f9d3f6a7b4c76f45cd0b2ab5e8524935b886918b5d9e9ccb5a6853e62efad2dff83a8520985ee8442f2bdd1c5f9d48062ade6b288c8ad82a41db6c34e2deba541aaac3cd3156c975efbbc718ebd4961996b3ed1cc5c2987ab779052cdbecf51d17661b498e84371ff859f89906f426f563572f66c279ef3d036a427778463f67f8d4de623fb4b2803007871d0a349ec202a9aa1cffef70137e009303497214ada786357a4d8046255e40f89ea588000634e7f0aaf64d92aa21fff8fbe078baa96961699738b268237eab606c\n" 2846 + ~k:"39f68875cade6ae208d3043b010541624679df649cc5d97b09a3ebbe2c9d59be\n" 2847 + ~r:"8636d4d3203aa0912fbfc938be4370077ea9c75195cd2f67e6ee427cde531c40\n" 2848 + ~s:"93023d97efb4327e9e886e7b783741e9d2c397af9c67b91cdb8aa27f83bb025d\n\n"; 2849 + case 2850 + ~msg: 2851 + "86e03bc3f4ddea6a93888ee389b15eb690822c71f9b85efaaffc52e486b1144ad7fcff3f53bf97da2481e85e0983ee1d5279e27a364d0e690f587a31535fb94eece747f8b605724adfb258c9983c9002e0c11b7976627690d58281305ea9308db74c491a28192e354b600e8376811ccefb751bb10c7d97b42ffe304bee97ecaf\n" 2852 + ~x:"7f56c74b495a12db963e03cfafe60ac95e8019cb212c332d1f19c64615568119\n" 2853 + ~y: 2854 + "23ed5445391a5bb94e00c76ec80d83728d5d461be425da79f921bca27d625cb42b323971022ad4c3f05bca109910fd06ba39e95bebe794ed108d2ead297ad794f99c32c219e65fb726532715b1bc2075dd4b6949297712f91d5ba061196fb25754c34377bbbe6a37f61787ea844d359285c78e733eb65f665a6b157f832b5638d74ebe1d5dce66d528925e44eef13bf23f807da35f34d169a687758229b99a313acecfb20b142b534926d59aaa7643a79030e9335ef28abeddac8ac9471da4997e33f3e491db8668a2c3920a3b3a37225179361d5539beb33f3252244267465e48faf575cdac938133effe9d1f69f19f1b44b245a447b1fc2b859244e2e39053595cf7978933c3d468c65c231663070aeaf2ec23138d1660081a55bdc3dd3f2446176b1d6d9977a14ebd0ed4d8dfcdfc4a433118401f2c2632095ce7ae6200c74bda5d2fd3854524c3081741975a076a1b4f933ec32a2bac9171bebfdf3b355eddb1f455ecaf73396e85fb04797558ba4f2bbc49d9f2329a23b393301ae0db92\n" 2855 + ~k:"407180cc311aebdc1cdcb4685241597783f34076672362a24a21193c0d45d24d\n" 2856 + ~r:"68efaa05eb90c48c6a7a45337c29175f8ee5b19b53db4ebd83a02f53c5b2104b\n" 2857 + ~s:"145f13f1ae3675c521b334ce6a49fc6f502e3ac6b2b5143be0641d0d57b3c722\n\n"; 2858 + case 2859 + ~msg: 2860 + "1d0954ee0de1e9ceee0532597ee434c73fe4f66635f7e72d38b67763c66817f53cf36ca0f613e01896cebc9f77a772607f4aeedd3856c73fc2f19100aa7b540ccd057f26cd9564d673228c68088e5f1abf1254a97ed1453ee558e062711ceb7643b345ad33b649affbe8a62067f9d84ed4c8506fcff578d2eba596a205267387\n" 2861 + ~x:"0b48499625f0c2548bf8a2fed1f6696f59df8fbe6eaf91b82385994209c2d04f\n" 2862 + ~y: 2863 + "2f0d89ac78a61fb74f81142b17766656d1788940077808e3d880ce10ec60e2bbb158d54e020dbc5f6786c0b43cca2cb002c8ce13b291b250f399e8e02f195926978f6c5b007d4f0a66048996a9932a918b2363c4008f547adcaa7d12694baee4fbca34bc6d7e29c5049cda13698fcce61bd3b3db05d2158132dd380cf653cccdf279aa164134bfbddd7ea347760041f92c3a4cfde0092d5cb96bb8c24e98259475596f3377d59f11661bcc0d47e83cb31aae9dcb4a6f25619a29054b62aa8b421e529e61ac95a0de01c50b09e119516c2c5b3563d47eed679a1cf80ba70a50254d851a13a778e1a08da8667e46e35979c15df45cf7886dde5af9d744624b981acd252ec5ba46870b8ee4b32b1be1b944802d91d8148d38f54315a7ad4e38079ea2bed9df8fa59414ddded3a1d2308ba769ae2a652f10c2d96917edfe5874885f3c99d6912f69ae3fc3b4de82decc30edc9314f7ec9e567b7e00de21959486a887d74a5b2180293df5dbeae1e35a6e937b2506d205092cc4c3595db92fc255af5\n" 2864 + ~k:"1c020abb0e1d52b3ad95467f7baaf665e2281f34c342401ef1fb4c1fc2d7b2bd\n" 2865 + ~r:"a67210341a04cd3a4b63ebc7e6208f37e487a8c6f1134cd2601b844d6903203f\n" 2866 + ~s:"6b972c622cab48d85a2dde355f947a8151a17a0acf06b7f3659f868d5ece92d9\n\n"; 2867 + case 2868 + ~msg: 2869 + "14f566c5fe44aaad6e8b3c627570aabdd4efb7fcfa1ab1bb74f2c6d8795e88233dac4e7d240abd5e9bbd8e1fb03a3bf50c0ca92c9aef1894f2aed600fc5873d23451d3204d75ab9581cbcf82ae8c0df0dfbd3a1f149f70660865726cdc73c015d5ddbf7513eedcd1ef17578d2719fea1e5ba39aef3fa6f00846f0fb8d9a1a436\n" 2870 + ~x:"7928d3edc11a890fe332c0d3759bc6ecb822438d7f604da76b4fd78590720ddb\n" 2871 + ~y: 2872 + "a36a333900035d3453139b28356bf0124e571f55a5e4259b8b2ee1457cc3588056d6c6a645d422cac72474c5901d0a7f410df7f9b4e22f8684867d9332e2d4266a6e595e515becff7fb94d21a8a9ad7211572e44ce8448317b34c3c0b89b3097ab2ec134ec7c178c2278309cf9152b223bb937e68682f1f680c17ee59ecd0698a05c24c135d2b0238e71f807e079f175e11671308f5bd9e5a69712a9c508b3b50925d1276d552bda51cef3bd0fbd00a9d2dddf0e5ecb6b328378ea637b493846480ed75a3152d9e6a4884eebad12b07cad8d101b3d001bc99fb1eee4e98fd6fc920cb5765ec24e62abd32f975a47d50f61553e1c14775193b53b05b7d02024aace818ab659d717d11deacc9877b818a51689d239b60f7f9ed4caf7325ac0b31b316c036599ea66959d525fd16f5c1a2a809f2866ee9e99f6d8a3c42b58d33d0e5d38055c55c7bccdef310ccd3426207dbbc60faf9f2a219ab367ce84623b81104822e2c77ec5b133ce7050caed090946c1f1355d878a1317de694e686c62ffdf\n" 2873 + ~k:"01f77e5f125a9a1385349f77d7a32f26b1efa5b0a5d4a212753bb54d300d088e\n" 2874 + ~r:"12b40bd1c866ce38e7da0764d807ae82512b33b51dc908e5a5b3d7c16f0d08a5\n" 2875 + ~s:"5caccee2bc85e28d506a9bc6d260dbd08205b75d20690e26aa6bed30d7327099\n\n"; 2876 + case 2877 + ~msg: 2878 + "60c29d99753d0847bb52e906c862a1b0628496416c14df5dcfbb5e2804f502cb0a2d163e9bc2d84122c0b3f5d0609b82ac16aa15efd55f55c8caa3d1114ac0cb83e5ff3db12a24b89aca5f0514d2ceb09b14fa916000c0f4deb016db755e88b326172144e4f1a705a800559b3da3c27af55cb32b1147460c31186d99dc1cf2e5\n" 2879 + ~x:"3dd64db4bd8e28e701235ad83a5d5e9dd13ee8a3b3dcb4c99c1bc95b6ae25291\n" 2880 + ~y: 2881 + "a37397e6eafbdcf1e0158f1f4ea1cb3a1ebd739c8559a500def3b7551799d652b327101cfea0b87016db591522b9b34ed267132c5255e77653c4eb935ce0c822b4b10a5e8f3cce39ad1b9606de5be2b2d36e1c5411f06aba0461ea8dc48b649f108eba88def44daa2a5c653dccf1d8ae29205dd5c340e34b7bd698eccdcd345bd4aa5eee3c08b9162ca1804872de3c575d572f34dd48b41f8235d0f511c8dc65daeb07095c3b5dbd3a076f8eb24412f3621f492126737a9d73014defa5f5d57bdc6faf53142eb191606f2fd3dc035f4b8ae84d655cb6daaaf889005c3c334ffd7e3b0498fae2a6f8dc1bc62f3704c8f8c005c8019e0bf45b7aa8e0803b93a992675e381f61a898582950b9ce40e7cdb0300f4b26f9b44484e89c9234179b60a372fe9476f84de0ed4b93497216fb96bae43297dcdc8496c634100cf066402c7d290a7cd28cbcf8b08ad4c136db2fe992ffa045bf8cb249234f29a674762a56d20897ea5538c674a14353db64ba60fe4052a0528eb0b25887e3c5ea69b41f68b3\n" 2882 + ~k:"453b64f2dedfeb1419b5dbeb726a2c92b1a37ef11a7732c911d9a96184285f40\n" 2883 + ~r:"72cf0e18e4bc3749647cdfa62dcbd2513c7c2b1d397c1fcbc7f6a425ebb897ce\n" 2884 + ~s:"7b7d0a9e93340941bb55f6afa6cd63f7364963671008ede457d05b6545fab1f1\n\n"; 2885 + case 2886 + ~msg: 2887 + "b3dea62a20a9ed9da990465bebe18aa71f08f93fbaee4fe5d581ffaa6fd55cbe272a115d7fa18fb9cf5662f595b7cb9bdb97a81bdc078ee3bdceb2c03722610134c3bbfd7a6f8b79ecc6a9a7709265687f9c236fc68b02203ba666e9eced5161de90c110ee7af9bf54d84a22181f17b4329348bdeefbb324962e63569f07c285\n" 2888 + ~x:"6327d3818c87e4c99b7e5116fc091a9da1e4c02aab9b207d61e859dda8d859ed\n" 2889 + ~y: 2890 + "45013318b941a710b8ab1010d818c3103634658d2e3e2f413165860805e08d5c1e80add9969a3d3a0d23432c8a48cce836b24a410892099bbf53cc5a84a95e1eb3b682d2754e721efc86d3f4248baa337d6f6e5dac4759b296165918a71b31ced25bf1b05d675bfa222980608fda8f9d0eba9aa08475512d04c612133c88253bf3e27e9ffe3a8570be204f54bf8ff1c7fe42aece832050aabdd9415764b8c872697f9c8e78e2f56bd235ebbbb4b9cf8f054b60292963764536d6fd4c6cfaa1baea53546c6ffb56a04fbfaee001228280aec40e66d9dc192f9ba743bd3ffc0eaf277b6ba3d33c3697024892b0b35419534873fb7a3d594dd6ae0751a2fa430ba46237f4a55e4a678072c651fe6ad314a010fdfe8f8b5342bdabe9ae5910c6f44a51f47524a6fe8216830ccaeded26ce1f13f7f216e0b7809e9272563cab3352b8ed766650227bfe16e981b505609c41f03dca98e219d02aa7d91921edb3a89229e78c30161cc13973b35de3c87779378b8d607a19320405661312432dd8d07af2\n" 2891 + ~k:"94a0f6f58f004e45ce5ffffa6e63abca8daf7768cdafd517f3a5e399828b1e72\n" 2892 + ~r:"3ec677e91c63e65aaa174aee2791dc409244cb80c0220991dcb497397a3c5e9b\n" 2893 + ~s:"1de0ec466b2ad4ed1adce3bc38ee521803dc87085e2fbfc561d63844c1a9a2e6"; 2894 + ] 2068 2895 2069 2896 let sha512_n256_cases2 = 2070 2897 (* [mod = L=3072, N=256, SHA-512] *) 2071 - 2072 - let domain = params 2073 - ~p:"c1d0a6d0b5ed615dee76ac5a60dd35ecb000a202063018b1ba0a06fe7a00f765db1c59a680cecfe3ad41475badb5ad50b6147e2596b88d34656052aca79486ea6f6ec90b23e363f3ab8cdc8b93b62a070e02688ea877843a4685c2ba6db111e9addbd7ca4bce65bb10c9ceb69bf806e2ebd7e54edeb7f996a65c907b50efdf8e575bae462a219c302fef2ae81d73cee75274625b5fc29c6d60c057ed9e7b0d46ad2f57fe01f823230f31422722319ce0abf1f141f326c00fbc2be4cdb8944b6fd050bd300bdb1c5f4da72537e553e01d51239c4d461860f1fb4fd8fa79f5d5263ff62fed7008e2e0a2d36bf7b9062d0d75db226c3464b67ba24101b085f2c670c0f87ae530d98ee60c5472f4aa15fb25041e19106354da06bc2b1d322d40ed97b21fd1cdad3025c69da6ce9c7ddf3dcf1ea4d56577bfdec23071c1f05ee4077b5391e9a404eaffe12d1ea62d06acd6bf19e91a158d2066b4cd20e4c4e52ffb1d5204cd022bc7108f2c799fb468866ef1cb09bce09dfd49e4740ff8140497be61 2074 - " ~q:"bf65441c987b7737385eadec158dd01614da6f15386248e59f3cddbefc8e9dd1 2075 - " ~g:"c02ac85375fab80ba2a784b94e4d145b3be0f92090eba17bd12358cf3e03f4379584f8742252f76b1ede3fc37281420e74a963e4c088796ff2bab8db6e9a4530fc67d51f88b905ab43995aab46364cb40c1256f0466f3dbce36203ef228b35e90247e95e5115e831b126b628ee984f349911d30ffb9d613b50a84dfa1f042ba536b82d5101e711c629f9f2096dc834deec63b70f2a2315a6d27323b995aa20d3d0737075186f5049af6f512a0c38a9da06817f4b619b94520edfac85c4a6e2e186225c95a04ec3c3422b8deb284e98d24b31465802008a097c25969e826c2baa59d2cba33d6c1d9f3962330c1fcda7cfb18508fea7d0555e3a169daed353f3ee6f4bb30244319161dff6438a37ca793b24bbb1b1bc2194fc6e6ef60278157899cb03c5dd6fc91a836eb20a25c09945643d95f7bd50d206684d6ffc14d16d82d5f781225bff908392a5793b803f9b70b4dfcb394f9ed81c18e391a09eb3f93a032d81ba670cabfd6f64aa5e3374cb7c2029f45200e4f0bfd820c8bd58dc5eeb34" 2898 + let domain = 2899 + params 2900 + ~p: 2901 + "c1d0a6d0b5ed615dee76ac5a60dd35ecb000a202063018b1ba0a06fe7a00f765db1c59a680cecfe3ad41475badb5ad50b6147e2596b88d34656052aca79486ea6f6ec90b23e363f3ab8cdc8b93b62a070e02688ea877843a4685c2ba6db111e9addbd7ca4bce65bb10c9ceb69bf806e2ebd7e54edeb7f996a65c907b50efdf8e575bae462a219c302fef2ae81d73cee75274625b5fc29c6d60c057ed9e7b0d46ad2f57fe01f823230f31422722319ce0abf1f141f326c00fbc2be4cdb8944b6fd050bd300bdb1c5f4da72537e553e01d51239c4d461860f1fb4fd8fa79f5d5263ff62fed7008e2e0a2d36bf7b9062d0d75db226c3464b67ba24101b085f2c670c0f87ae530d98ee60c5472f4aa15fb25041e19106354da06bc2b1d322d40ed97b21fd1cdad3025c69da6ce9c7ddf3dcf1ea4d56577bfdec23071c1f05ee4077b5391e9a404eaffe12d1ea62d06acd6bf19e91a158d2066b4cd20e4c4e52ffb1d5204cd022bc7108f2c799fb468866ef1cb09bce09dfd49e4740ff8140497be61\n" 2902 + ~q:"bf65441c987b7737385eadec158dd01614da6f15386248e59f3cddbefc8e9dd1\n" 2903 + ~g: 2904 + "c02ac85375fab80ba2a784b94e4d145b3be0f92090eba17bd12358cf3e03f4379584f8742252f76b1ede3fc37281420e74a963e4c088796ff2bab8db6e9a4530fc67d51f88b905ab43995aab46364cb40c1256f0466f3dbce36203ef228b35e90247e95e5115e831b126b628ee984f349911d30ffb9d613b50a84dfa1f042ba536b82d5101e711c629f9f2096dc834deec63b70f2a2315a6d27323b995aa20d3d0737075186f5049af6f512a0c38a9da06817f4b619b94520edfac85c4a6e2e186225c95a04ec3c3422b8deb284e98d24b31465802008a097c25969e826c2baa59d2cba33d6c1d9f3962330c1fcda7cfb18508fea7d0555e3a169daed353f3ee6f4bb30244319161dff6438a37ca793b24bbb1b1bc2194fc6e6ef60278157899cb03c5dd6fc91a836eb20a25c09945643d95f7bd50d206684d6ffc14d16d82d5f781225bff908392a5793b803f9b70b4dfcb394f9ed81c18e391a09eb3f93a032d81ba670cabfd6f64aa5e3374cb7c2029f45200e4f0bfd820c8bd58dc5eeb34" 2076 2905 in 2077 2906 let case = case_of ~domain ~hash:Digestif.sha512 in 2078 2907 2079 - [ case ~msg:"494180eed0951371bbaf0a850ef13679df49c1f13fe3770b6c13285bf3ad93dc4ab018aab9139d74200808e9c55bf88300324cc697efeaa641d37f3acf72d8c97bff0182a35b940150c98a03ef41a3e1487440c923a988e53ca3ce883a2fb532bb7441c122f1dc2f9d0b0bc07f26ba29a35cdf0da846a9d8eab405cbf8c8e77f 2080 - " ~x:"150b5c51ea6402276bc912322f0404f6d57ff7d32afcaa83b6dfde11abb48181 2081 - " ~y:"6da54f2b0ddb4dcce2da1edfa16ba84953d8429ce60cd111a5c65edcf7ba5b8d9387ab6881c24880b2afbdb437e9ed7ffb8e96beca7ea80d1d90f24d546112629df5c9e9661742cc872fdb3d409bc77b75b17c7e6cfff86261071c4b5c9f9898be1e9e27349b933c34fb345685f8fc6c12470d124cecf51b5d5adbf5e7a2490f8d67aac53a82ed6a2110686cf631c348bcbc4cf156f3a6980163e2feca72a45f6b3d68c10e5a2283b470b7292674490383f75fa26ccf93c0e1c8d0628ca35f2f3d9b6876505d118988957237a2fc8051cb47b410e8b7a619e73b1350a9f6a260c5f16841e7c4db53d8eaa0b4708d62f95b2a72e2f04ca14647bca6b5e3ee707fcdf758b925eb8d4e6ace4fc7443c9bc5819ff9e555be098aa055066828e21b818fedc3aac517a0ee8f9060bd86e0d4cce212ab6a3a243c5ec0274563353ca7103af085e8f41be524fbb75cda88903907df94bfd69373e288949bd0626d85c1398b3073a139d5c747d24afdae7a3e745437335d0ee993eef36a3041c912f7eb58 2082 - " ~k:"b599111b9f78402cefe7bde8bf553b6ca00d5abaf9a158aa42f2607bf78510bc 2083 - " ~r:"a40a6c905654c55fc58e99c7d1a3feea2c5be64823d4086ce811f334cfdc448d 2084 - " ~s:"6478050977ec585980454e0a2f26a03037b921ca588a78a4daff7e84d49a8a6c 2085 - 2086 - " ; case ~msg:"c01c47bfa208e2f19ddda5cde5833325d16a83fbda29e666fe67ff3489803a6478a5ac17ff01edc7973d15fe4998f63bbc095fc1ac07534241c643a44444dc9a356fa812d5ca191a2f6ed162a2d5fd6d0aa898a20563d993830254db8a4bf65ba86099cc6b58a1bf6ebb01a19c79304308acebe1da09f1753a195e9ef586c7e1 2087 - " ~x:"9f11370ddb3c43e2f4162dc61f7e08dfc6e86d5d71742c6adcb5340f7bea2ada 2088 - " ~y:"970d38cd8b3f16659ec42a46a19ff06ce8495b9f477d9b7e35ae1035b08b0ee17a0c3ceedf029846e3aeb912f850881c2277f82281e7c0741d2f87e9fa5c30677fe7268cc5fd9aed29f308d9be8de92b961e39c1dbc46790c99b7e29579daf888176d5ce16db5cabfcbe4209ac4753b0e96b15d0b82c7eefb42a10de88f8a7723492a2be5451c1c6ec68ca759d8b4ee418826e71f39cd07654d00d0e0f88d0924bdb97aaca5a6346ad69fc223cd57f5bb0300477b594aa445e5ea8896cdf3bc882e8fa5523b8a332fd98e9d0a924578944d24a41cbeae3ed7b37dffb2f60c0084eaf005c1251823da41d2a5d977d8e483ddb33f73fbc27254a814b616d6a390513f0567a563ac053a76667197b4558f871b69cbf2c116ce457513f60b4f528e2dcdaa71a9a3a4cccb3738a22937bca2a042bef8a74a600acd26975c891466d7e57cc930984212ee0eaf174ebcbafbeb8cc12bc43bfdb00fd11576c439513ef5b59a88fa5a9ae963d94dafd78f81ee7b0d7fab53e41bbf65f8449a4f58b44f9e3 2089 - " ~k:"ab53984e0b154992ace73bba548185b49719bcc3b11fb150b5da279529750078 2090 - " ~r:"5bb50e4f538a6e4638206be119dbf712776154acfb4c06d65d66c80212341739 2091 - " ~s:"7b7e640cd76086d3f640d18ceb26bb53e30282afb17401e7b48aa6818934dc5c 2092 - 2093 - " ; case ~msg:"47e7af22c9298ad3bfef9bee5086bedbdc513d67416d5f4e7981cddb1002cba24700c45dd6d4dcef4f81d003f0513dab4e04eb4c70d944042e1b726d8a33050d0e4f70c0a8341b75fd4e27c7948754e441208eb93fc7b7c37354252f73b838fd02d078c6a1ae073ef1233aa1c8aa2781e193ba2897ccdd8cf617ca23541ce1c5 2094 - " ~x:"232c1c88d571492779172ce6650524cb6d91174e8a23780d0fdf7c44ffd80c1a 2095 - " ~y:"75163af15cd6b228251504ba024df51df32f638e37f0f2f9d08837f8c6ecfba43eb515ccbabea11b01e1e1fd3cfe7e405fc7f8142b07315e1dc37b08c78668421e2a21fc5d811d26558c504abc4e6fddf03740b8a27fa2ebcda5460ad785706c53cd2d14093d923df942051cbba2586b4d54709d24babe2f7c61a50da8451895999166e80c0fab892a37eb6782745596b49f96e11e9a957c8ec650d2d9a40aa4b014d2e9a4c08b9d7bfeaf1ecd42785b95c0172ae21cf25c4d368bb5100b6e6d92310b28b7b1afe64d496b9c60b763cac08ac46a6bce1bbd3ac8bb76bb55b649b7594820ab6ef7dd1b09bb12852816b61e6dbefab742e0ea2cda47eac7d9d913ddd4bfd8b2eb5f01951caa4f413eb5e7a41a0685695f8331a394e06b1495c170f30ac294660e8909843f9f11c4bfa64e8792df677da0a08aae32a8a4e7067fc35eee03964e8afbdb6a421b8248add284789e4ed3cace7106c23fe6666c4b12b836e7307a55ab24d92d58ac84e71f81dc9b0b7436ad07f74994af7d0b049bd09a 2096 - " ~k:"101acd88a048a6a87c13ff23225dc2c4d2fe3fff039e072fbb268ef2dbfab9c3 2097 - " ~r:"6175473d7aa7d5ce55590c952a19897206086887fd84bf2b566926e47981c2a3 2098 - " ~s:"71d7857b6ff06ca67885fa9c9c71b8cc246d0339b6c2725247172a297e26a7b5 2099 - 2100 - " ; case ~msg:"9311d8f951141713f459eb65f01880b961c0a590b36f785f1aeb880ee71300c0cbc601b3a6072193dad6ddf2028eca4c8bd7b8575187928f84bd69c5dcfb0b9d320003c3a863c09ee503e38abe07ce2e0d46b3cec926231a57defa0aebd1a6e01eef4f9b537ae1fcdf64e01434d40ab5019f3965c735411a5c19941f41febf4f 2101 - " ~x:"87bde6350da15832966fe70300e5dc66b96ec263344bcfb5de051be34d76262b 2102 - " ~y:"287ddc1969156c18420743ade0fa1271ea346c3329f9ca9b5d54ebfa21f676f9e013616239f4bbe60eaf8e1902ed9ac742d8df918876770894b512aaa25c068bde961f56c9b5b87806d7d0a9de7843d3cb0797903126a47bd9422337e3b46bb1f4f4a79fdf9cf6762157118aeee1e71116f34dafce0047f05d43c7f2cbd4cd52d614b7a945d48be44cfebf784332fe99c1ee1aa8310867df20b280da855b19029fa79ecd6dd6919a4d22b5a1400c30e62ce7acc4b28efbdb94ea23afbb64d6e5f7b3975d2ac63b1d048feea835c7f50b425ce3cb418afdf4dc84008473606574e20db5ebf86cb1ad27737d46494b2e485b26b8c95d829cf656f80f96b1a62e7c03c8f20f18dc58bf59916682e6dcc68d34c89c1b1bd6e6b1e15a7dc325e23fd7a35099831dbd75989c738020bf4dc4079ccb0bf12faf3b9d6494a379aacb1b66d07cbcebbf77a6e29aef22f4baa3df40d270b457dde64f00b53759ae57811b64e040cbd42ea90f4e2808bc81dfd663b28584cdb8199da96d3e03d03fb4133e2f 2103 - " ~k:"7d1b5d39e51af0c22a56bc57ba6bf8bb6de18f2c256bb2d6fea684add38b1f6f 2104 - " ~r:"66f729716456a2781bdb8578fa18d1e64af0edf8ec1dee0a50d25981912fc45a 2105 - " ~s:"8c3cccfe6f0cfdc0ac3a542c8e8c85210bbd7f95134c8f035d1ce16f44ab7a06 2106 - 2107 - " ; case ~msg:"808603f7f8439441277913b21bef4e01c89e4113e07cacc33f65ac9849db1ad1a1cb7dd2fecd88ee4139b1638355c623821309f326c16bc658bb4821518238982e5251f7cd37807292153d2b07dddc066e003c6069c371155d2d191f15111f2089ce423f5c2a1f8534e301313c69623f62ba635adce8551733a82a8fac1a66b1 2108 - " ~x:"9464ce029452e8602214c5236d9637ce7e59f92536a07ac5ba30f639e09814d4 2109 - " ~y:"389672ec6de0b86655cb10f1199f857013b6320d52c8728fbbb5360a9701b1d6ca4f9eecb8487fb879690f85430c582d3d91ef184c8247d162b94d6dfdfe7c4ae867ac1672827970415aa67a1406ac1a6e2c6c13167719e1d1a536d10078427c211cf682051a75ee8322c1408b89d963bd8e85f9eff7bb8ce05ca42225b4bdfead6b897b0feab76c2272b487d27d4e8dcde0f19e4615f7e1114541f61d43533ce788cc4505600b83266b1bea665912196c2c84c36aa93baf5b7464a6ddf547183e2cd058bb50a12765536f0a4d3524af4f31acc609fc447e1729aab97b5a36b01764b84bc5f77f6cc584866d1a6cfb3aa8437895f777f2dc6897499f6c5f02fa1e6c1ead68f3385b733387c6b58f2d11284a63ae7c7cfee42c3f44a3c926adad8107cca1c3f944f9b9e237d9ab35c81391d7c5f5292d1a322f7a12ce108a86237ba4de3c612fa738f53194ba67bed843cd2d4330a5d194d67cf45fa05183e0cb46c2d23a1bae76755c309fa1c31605c88a9214227ce02fe915bcf0d34bce8c8e 2110 - " ~k:"5c2bb856c4d87b27e01e2ac1ae6f2fc526ab8bb49a67eda5c1d8cd4253610df3 2111 - " ~r:"98fe587e43aa96f9a9bbe8af404a08b02307b36053db87f6db25a3aa36fcc3db 2112 - " ~s:"5c94ea70f99f9ff14b8e5dd4a6688398260907176ea80e19c39b14621149f0d6 2113 - 2114 - " ; case ~msg:"ce2aa3ed12c1b8843a3e11b06b5f0e5e63fe8e19c1a38ac446a48eeca8dac6d8b769d7809442c32ac82e93f686ec64347e9444c3f452823c840e8d0cd334b4152002148da16ac8859d189d87d67164c5db16195c081d2edd7d8157e2bf3b97a90b4b4784324eb8ceac4261809f674256daf007c4ab1f222f5fd28398a5b824de 2115 - " ~x:"b887c14673cbc63f04f0839ea56a76154027d7eecf41d8d0b53d4892353ae9a4 2116 - " ~y:"584fe0eb314afb866c0466c3980a2df54598d8a705dc2d1bf5102eac86312784eebd019b81a7642d4a3c4cc65dbedd8187e3593f0a9bcc06ea367009b7eb4d29b0450061378edbe163efd3f344bb36234fc86fe1c32f2c9995a07c6e957d195e8105f5179c2bd976b3127067c80ca93456c16b98dfcc7de355790f0b15cfd2ff91db09345532d46096c06b40a2304681d62857675ac50e22c7d1ab47589235419cbedd4b7d24b90531e5bfd853e88a28836ac46b6df26760985b962c6a2445809866b46126212aa263ab2a4603ff41a852c7988c2d4386241655a7222fa4e9f6eac6a144a16b059ea25b71a2138491d54ee95a9d6819977f90fe6a59e0cad81b329eba3e68277df04f9828ef6f081610b4595a92113ec6d069ffe97196d956191daabe9877377ad0416b0ee0658663377e07adb24644e8a0e3ce5fc178f152be0cd9b04071890427c6b001d59262f38fe897ce32040daa7807821c40ac8c63505bed0af070443337c9e9a64e44203c36a8ca5064d87aa0d3cd1d403aa6a24ecc 2117 - " ~k:"49548238215fed6525693bc3cca3872944a97790087fb35f329b206e6046b32a 2118 - " ~r:"54c99b21f28feee27f0e999aac6b49b6b07633e1db18a45952fcf7e73b166bdb 2119 - " ~s:"7a18588ea1456f67562d677878346fb34b684b9a8a61a721b3db0e95695ab43a 2120 - 2121 - " ; case ~msg:"17b925e2a1a51c2036e225715f2f771d8f0a6d98c7ed9cacf5aa4cd30ab16afb94e21a7c953e01ca211c28782a06073fdad27713aa8c26ae9ec449aaaa8ccfda8c947172de94b3f20b54af98df152d5d3a636c736ff01bfa699d6214002dc76dbb3f3860d94e0e34edaba5f2bfd6b2bf660086be876451a50f6a2dc7c2b098b7 2122 - " ~x:"0684a8fad551c8d08beb05033185e3b4b6b6f6f4920ef9982d72d0a9c7549855 2123 - " ~y:"42a93bf44ec7d2fbd651cc1d1ac391d63cab00971a7ff7a56166768b22e611dc4d729faf8c94e7ed4d6f82b7020b7b4d2fb3591cf2295cc6e1b4be2c256c2fdda43e00051114645da91cbed5cc087085f7cecd8bace67889100bcce7928220266fd3faf2ead9c21e423c9948ec70c2d31b668cdc360ddcebdf429720607f96d851235515d6dbdf163f7ea5ddf351baa76f38663fdbfbd5871bb2157df0a43420648c10e4827f54065614623ed3abad10d317be9d49a4c66564f20dcac176b6605a2e3c3c01c362220f352e477419f2b4b238affbc3920e5bb57cebb9a74746d62cdd070f4a13af001d262def014f29b7f754fac84e02d29285b73bb20ac0c8624123a577be8d6a6b9739185e4458090ddb42b005ea4fa8b51007bd9ca5b4cf2a3dca446a87ec83c9548dab46cf3daf86db3bc69a99baed459d6a197f9bf5032c1dc3a877dd7e5c1161124a6d701324e9a9712b824a4fc3b1b353259af225813c27e820b0ba72fb4e78f5c78673924e7fa2f486030284f26cb6fa31da56f49d3f 2124 - " ~k:"4a258c125db1f7b775432b53c7a0ff47c00bf7af27abec7fcd42a2916e95e26d 2125 - " ~r:"726e4d3baf00b259f4bdca8b0a5e1cbfd37827c48373ef5029f7601a7769478c 2126 - " ~s:"903079439ebde1f766d1a8ff33e0f778d77b5e8b7b0d687443c271e8a63b5975 2127 - 2128 - " ; case ~msg:"1c1169f0e790053cd7df780b5c832c64147694b4a6448ba14a426d9def7ddc78e3ed36a12da81cf9c3f245d64c859b6b4d8121d112851974df178defc977db691234d142dff99bea1957891b5d6fe8a787e96369d93c24682debd1cf3fdb64379b8c1b3b73e1bc2467dcb08b86cbd494c01477be24d7900f5a578930f4bddcb6 2129 - " ~x:"3fa44778b414ff27436e276ca4904546d3542d128f73c4463c69ff9cea2b7a41 2130 - " ~y:"7fca2268fba33bf94e76416a9e3869f8a90c3b0d2d37aacecd3f6785b9a95aeefe9324c3ab09ce61ffde37b50f82b699413f3b54f24d6c52eca62325029523deb05db138778447bc3d0d05aff7d85b5525f2b863d26486e84cde13e2e2117d3fa38a38d1073aaa794ed8eaa7b3d1daa4ac3e808c3738a9cbef3546cd79eccb4faa28b50fce57cdc24015fec390f0e7a7dc9f9c471d22b30c3e4174358f1ad0734cf79a09a639bdf3f3eabda2b47b81f92e2a4f9004dd641370338c02029bbf4971aa67483eea7a4bf7dff3889f84faa5765617ccab37d190a94c57f99d792807a6965e2113586c6c5d1a81abfd372e1c7954e2e09064df4d2d8288f5cdd8106ed84ffa798819a09a732bc204a812c0352e4e39d2ceb88f8e7d3624a5a5f3dc56ea0f9c5290788e12dc463161601ff3ab681bd0403ee03af45d5e586d84d9c901986718193e661256f402de735d2ca696ef6b594868950ae173f22d95856656a9d00610fe8c2bd725ae55d791277b1317085b67188da00645ce91bbe62e324311 2131 - " ~k:"a05b9ca1c9532bc050cd0c1150c27bc192154cf64d59dc9a949906f1ded57e35 2132 - " ~r:"1026ecee0ac31bdcdbd6103b1343f84b441fc326e1d86ad0903d0b17cfb2ff9c 2133 - " ~s:"a5d3cb2e7c39d87640c4547ac6c33afccbfc1820905ba1e5be5b262313277cb9 2134 - 2135 - " ; case ~msg:"805baabdd018d9e5ebb4dc51435be632d2387869756d743788442790d55bb183e26655ae3aac86dc16a48ddd268dd15e18d8320df9a1a0a6cb2b49bc701d7a15e3fe8ddd584a75c8c9aaaecd1efe17324d6261881f3d34685b04f62e968505966c9a5feb0c39b5095e5568e40f20aa21cb2505356dc9049ce56182d94a2d94a9 2136 - " ~x:"770b99935d393eb90b583d1251696007cbeb1b35e6c3f4f9bcb62879070e0940 2137 - " ~y:"434d0612b2a8332b0ab15614e3ee9fa245131712fb2ba84f71396fff9488dca340a37e820f44c13aa87fc9df0b7aabeae2ed85a9622b8defad474ac362a7039abde33d1df732a052446aff7857bc24d8f61d258015ed2a3060a8bf9d447e7d83d7b497a8e654731969e437b3f46f83eb58f7884ff2a2390f5d821ecaa7fd09a146c55fc1180073cc5aaa607cabb944f6078a4486cf206ddc5635242def2d3e2edcbc026bb84e849518f197399c22a9009dde9afcd8769b241c75d4ccce7f93900b5f488333df47c026c4f2b2767e70d2d9dde78405e226c9952f6db1a2e55829bc8a76c7de5c2b588f3f3e93ce72fadabacb75c7c14669701e0a2ba127bac56863c8c4e7205cc0a73c429a801e9797da4f26e848982306cc3c3439f9e394ddc80b0f13e0d528190638d8b96bba3af889de373b3549fc90a6822964c22171e7601fdefbe5708988b84f3ea554d621600a876415d5bc1e557e948caace563b3702f0915a90a13aada77709eeba8c50a8629351a4787d0d58808ffb8b217c1d164f 2138 - " ~k:"424a43cfd90f7b84e9e375572f82ebce7ffb197bd3237a353bf15ddc1a17095f 2139 - " ~r:"2d63e6d2568571acfe4a931580a04b974c7aae4ca9aa9610d87be1a91c657c31 2140 - " ~s:"574b10d14dcb8f079461b29ae1b91ed6c5ef32f93cbad306697552c11748fe0c 2141 - 2142 - " ; case ~msg:"be8ca5ed4c22a050d8309c7a31acf667f0c0fbaadc64a34d2b63074a763a2b8db73b24cdbaad26cc6f2c3e90df4b25bfa724fce587faa0fd65ffb719f0a0351648230d5354d721d8fa6d0d686c37f257d7d9dbd15f555d5073f8bc71c92139d1f627d743f7d6586d510d19d0d8a555d0bf79ec70596e712183880c89caf69d6f 2143 - " ~x:"9886138d837d20e8c6be853cd7de1a66a25748c7a33fd55121a27237623d68d6 2144 - " ~y:"afaff7a4d438b464f27415d2e03ed9c416db2bebfbe0ab34f14ee10644885b5a4588877150f46327c2c7a6f712670bfd6237a29452494859948f5e37c0e586656b119a0e01c81acee57c1775a3a146e8fbafc99cd203fc98195687fb94a88a4f44280b03f0895e0eca84db087c1bf7c4843c85597368e839841131e027109daa7b8172a25e11355fa9a9205ac324941a9fe492c48421f0681a47e280803e8bd91b113e0fa1597607430bcb0ad50b9408de0066d6a2324d09cf6e99133654dd64e8c8f70cd6445343758b5cd5a0e77e2d3fa1cb3f7efed76124b2881dfd2028ab5918c389b9c3978271db54a5171515ab2e85eeb10ab307130159bca5fe13cc4a959e88e9267221ac8d14ee6938e149f52ec59125b449cb55c5a0029f018770b31f08440ce6876e6600a32411722f58e6263339bd9d34e17aa574b921228926ff668ce90362c4391ecd0c037454e12fdf80c96bb7a840cd866e8570bb7d6586fbe3d1eae5332931198ba1d5d902d6b7a122dfa77018553a2dd3680a809bb06053 2145 - " ~k:"1689eba0aac66b3d0cca9ae1911602f9638937b6be17c23a187be323d0dec7be 2146 - " ~r:"9c7d40e214082bd5e71f3bf4be99789303f38e851a76f88cb90aff713080c587 2147 - " ~s:"24ca23be94c624b9d736328b53782b5feb384dc9fe6370016cc3f97d8f48b6d0 2148 - 2149 - " ; case ~msg:"62f0cb1bb07f6497a1dc7a66955765a9cc403bde03fef4e16b09d7ec545b4c75d08b6e9c4c5af7232548d45445638d7194a199ef1534e81241eaa9c7e767fd54e2caceea4d2f7215d37baad6b05e28ea093497e2e8e1db6e41a5eb13ffa4caa27108f2263a74cf54bd5b6a6b62284bac99fd7977aaa8ffff18fa8a70ab0debdf 2150 - " ~x:"badece34257da3d7b8713f8f0f9f0107b1909c7f99a765ad8405d8c2a20310ee 2151 - " ~y:"73554a69e1a09f6191f0aded542a077ee8c814265d745d9ae5c792f442c5fa47b34643d3ba1d5147161898de5188a80714ee36512a618a33e40300ff1187e553f54433e17466af486472bc0778af55ba7346c961d7f13ac6d8d6ac9a42092c01579ee2170590cbc3b45eef795b5d9e5d0a8449439ab307c14c5674c4a7a3eaf8b240ef36dd21f43cced58c2dcf23c314364e8e314e9671e80813d185801358d5df61d7e7ec0dd69e90c2cc75c1c3543efeca82b2ec6ec59e6c99bcd1a8631c6228e216884082da119125cb0a80c8fe344afe66e0f20646432465f3e0096a17725a8867b3bdba3c69a1aacbb8d64755b7f2a3df0a49ba0b2114e112d4cae0ad6d8d0fd618e54d53f07ba109b75a54a989618b2863e4415e176e0bfd88dbf36553ca853bb36316c66eb93da34ff3ae74cd5f187f49bf38af0f393b2d7f854df192ade2df6b39a176d2152c912bba248d84a5b0aa4084a18bb64fd136973f73b413d77db275ea5ece93ce2fa00d7c8887b7e50b00649d0353a7f58cc63f6b5fbdfc 2152 - " ~k:"2d468a99e315c158a1af18abd4d58872d6e281dcd4c9b0b43298eddf346496d7 2153 - " ~r:"54ff5d3dc8767856a10f54088882e28c110980ef9b204eb5f162dbef73a37c73 2154 - " ~s:"57ed0748427c089d6395528b2b4555c01b4c1341ab5fb99c64d1cc247a41c3a8 2155 - 2156 - " ; case ~msg:"baeb12a1ebd8057a99a0137ee60f60eed10d26f1eab22ae2d9adbc3e5ffc3252abf62b614707ad2546141bed779f0cfad9544a74e562da549e2f7b286efb615449b0946dc7c498d8f12150b2eacbd27157966f592ad5f3e43a24c60b7e06630b82a4fdb699119dbd878b13a98bf22a7b3dc7efdd992ce6b8a950e61299c5663b 2157 - " ~x:"bd3006cf5d3ac04a8a5128140df6025d9942d78544e9b27efe28b2ca1f79e313 2158 - " ~y:"00728e23e74bb82de0e1315d58164a5cecc8951d89e88da702f5b878020fd8d2a1791b3e8ab770e084ac2397d297971ca8708a30a4097d86740153ee2db6ab6343c5b6cc2c8a7fa59082a8d659931cc48a0433a033dbb2fff3aa545686f922c7063da1d52d9688142ec64a1002948e5da89165d9df8eed9aa469b61ee0210b4033562333097ba8659944e5f7924e04a21bc3edc6d551e202e4c543e97518f91e0cab49111029b29c3aa1bed5f35e5c90feb9d3c745953dbf859defce4537b4a09801fdc8fe6999fbde39908079811b4b992c2e8333b9f800ea0d9f0a5f53607e308942e68efef01e03d7cca6f196872bf01f436d4a8e05fc59d8fbc6b88a166f57a4e99d67ddaece844653be77819747dd2e07d581c518cb9779e9f7960c17ff0bae710ecf575b09591b013b4805c88b235df262e61a4c94f46bf9a08284611df44eadd94f44cef6225a808e211e4d3af5e96bce64a90f8013874f10749a8382a6026a855d90853440bfce31f258b3a258f7b5e659b43e702dee7c24c02d2284 2159 - " ~k:"16aedfbe554de17a3e5b83e942702bd60702d9823ba154baa6d1e7e94308324d 2160 - " ~r:"8d357b0b956fb90e8e0b9ff284cedc88a04d171a90c5997d8ee1e9bc4d0b35ff 2161 - " ~s:"ab37329c50145d146505015704fdc4fb0fd7207e0b11d8becbad934e6255c30c 2162 - 2163 - " ; case ~msg:"184e599a4c1de86c4151205754df0b1912c2b3c532552c51a61c6459db98c83e59d4a40806c6a2c6b3fe74e3bb9e720d7d0a3cc11ef88959a8990c0fa057a3915fe0dd9a138aa0ec1cb1ab69d93910d8d6f9e14f3b8a135d3f031a56c76a9dc3aed1962bdf05815c2492d14f2324d2da491810d1672b633f2419da4e7ebdef24 2164 - " ~x:"a29e90d33f200b1faf61bee5d92ca8a392b1eaeeaa0817cec98b40c97e25018c 2165 - " ~y:"60159720021fd2d5a2f575b3220905788d328d0c46895a46bb985942467209ec28d8ddfdc97ec34da65b164cf48652ac475d8978959cfc4330743ed98137559391b1204da6b26b451211407e8fc77d819934c48709c8eadc620f6db2592b65483265149a324467d93c375d97230f2b1a682897cf6d280df61a34f20f0c7c729a40141958044876c44e595d2378a7d22c6cda9ab816486c294e4eddea7ada88b15eca5371da164471edafcdefc654e64a1f995068fa85dbbb5516137bc442f60717fe59c629081c234f27195d5f9c2bf85cdc1ea4cae57aa908cbff9b2a53353b13e9f6fe45daa5174cd956236d447b52011d688cd22f23018409b39a36079cb53e03b6d3a752733297fea4ca27c6395becef4081d201f41d4a00e99d95f42281dcf44b9ef6754998d94231937c82594218a78463cc837193de6bf1d3c3ec31d8dc5468cb56defc9c70d08b95b029d97aa043d557f6286b87ee4098442df495c0ad8ae4d4ae037312c5f7239032c03b088c1036fad7774b1519709242c9511e6e 2166 - " ~k:"78e781b2874ca2441e2ce74a2a2a16417b51537eca876831f6593ae25fbd796c 2167 - " ~r:"079d4df14ad703a435b21bc70a03456ca822b876c9accb018bddd674bd6392d7 2168 - " ~s:"6c7765e1f1eddf915a56a57390db45636e52f083ce440766ad4f32580f722483 2169 - 2170 - " ; case ~msg:"b189dd34f58f3efa85b6f97677edfb82664cbe43a2550c336ffa08705bbda2545ef244a275014c6a265971f4c3658e5e8d6a3fafc889f3c4eda6b5616092954b15c60435efd76806e28557c05faaaa8a05c262657840865ff69c511a68d13022a712d35bde138eb7a2f8f1a87b342c7caf388c1a8b95079bc4a8003eef84b899 2171 - " ~x:"9759c24820670eaeaf92370197d0037f9f71dcc283970f341117fb56a1764001 2172 - " ~y:"05e280310810715d29ea1ca00a700378bd5979493b9803174c932b7dadb7029a9a9f9c91cf8f938af2bceaa052f2273f0de393b0f7544490d693f529a68b812e2e589cc092b83ef847c5306039aa8eaf225128926145893a51551db382fda4b63e5abc10fd076100684d4ca657c89b2265de6e0f0473f01bb222b2bc50ec1c5fcde9161831018aab3014a956033bb0a83866df11915808f9e7461645c89c6e17ab65dbf97cbf4ac1164d671a1516ca81645bc3e09913a03f30641bd0920083578ca84df71f62eb756ba445a0dc44f85a9e4f72ce5f6bf82ccbd674d2ce3c4afc300562a7dbd3e8ab838993f9decc9933dc07dc01b502fee5b390461a8c82c4e69615f121b3f9fd4f0c8b7620a25996df43d7cf355f15be09e2c82178c6f8836c36c1d3ef26ad05219fb57e85ef162c8dd8f0e55014769d53cba478a2aa66d90d8acd6cb0489d1eea46c2c41bd5495ab8def43b2cd5bb2673945c21c80a4833fd75d884c7675c09e7191fb26e92c54c7c8208d0a0e8dee75c2968e962de4493e8 2173 - " ~k:"86050bf276a649b13c18814430eadcff54edf7416f1a8b1559c6c2c808e8dc9f 2174 - " ~r:"9fd105c74a0d36973740867ccc1c731cf1c50c7935d5c09e92f574d7a569157e 2175 - " ~s:"501f50c32b0288672e02aca78f90f446acf92626365957a375550c77980c3c17 2176 - 2177 - " ; case ~msg:"42c065fadd56d6a1fe68dd4e86c17efd76d0f9db87036bd7b609159d66847f46de01b8ae43590360fa324559a2d709d45cf01034f5facb7f52324e60dd464a583d42e412659d8420f7265e30cf82bbbcb2c99b0f00ca6a46d28556428789f415000dc31babbd67ccc8fbaa84a880466bca4783eaf00b7f78231c667126433e6a 2178 - " ~x:"307555893610e15549a5bfb2b446251f9595eb0c16df5fe3b784ebfc3fc30140 2179 - " ~y:"b265edfed77b3ad511e56d583129b12e5796d659d484a2fce350661f79e545dd0a06c23774c8ba2fb5101a2848c413dfc5b374a7c5ff3acc7332f0ff8bd6f5fa882c0a67689308be7154c4efc51835f349525419ed722a90bf26ddded65bc8962ba11de9e734442571affc2d42b9f3f54a46535ae9eb01361adf03fc28410abf41db3ae4113da4c40e9a368f9cd029be4d98c66d835d034e3c86544b60bcb01feb383b2add9afe7b6251a17ad4e5439a9cd2d1bf62b6cf5377c097b7268bd736cca9ceb822e5d1844a09fa69c78217c3d6737f0bf45e3236508b5a3f5c466dd0d75ace95d447f9bd7aa9ee57bd10ee3c5e8389a06c00857e699794f5cacc7dc5bb1504421dc920565618bef05dc1713b6f08bc00681c5a1c0685359729fe4b544090ccceaa82f4fefa9f1117bf1e371b99fe4ed71635dad415017a62341d704227ee7cfb64a8deae90d86c0cfd37ed363d91a4a06fd06f64dbd8142c12503f49eeb1b9a971aeb343f15cd27d279b99d4cfa51f121259b3c1b55d28d994bb3299 2180 - " ~k:"5359fe067eb9d98ec2217500de743b0dbe88e8d94552b53a0117aac4d3390083 2181 - " ~r:"6ed82af8e89e38c49a58010f0564165a16a76a2bfb348466d9b4a91e5ce53ab2 2182 - " ~s:"8c466a8b3e4c90886f29986a4d513904f31db43a68ce880311403cc755466604" 2183 - ] 2184 - 2908 + [ 2909 + case 2910 + ~msg: 2911 + "494180eed0951371bbaf0a850ef13679df49c1f13fe3770b6c13285bf3ad93dc4ab018aab9139d74200808e9c55bf88300324cc697efeaa641d37f3acf72d8c97bff0182a35b940150c98a03ef41a3e1487440c923a988e53ca3ce883a2fb532bb7441c122f1dc2f9d0b0bc07f26ba29a35cdf0da846a9d8eab405cbf8c8e77f\n" 2912 + ~x:"150b5c51ea6402276bc912322f0404f6d57ff7d32afcaa83b6dfde11abb48181\n" 2913 + ~y: 2914 + "6da54f2b0ddb4dcce2da1edfa16ba84953d8429ce60cd111a5c65edcf7ba5b8d9387ab6881c24880b2afbdb437e9ed7ffb8e96beca7ea80d1d90f24d546112629df5c9e9661742cc872fdb3d409bc77b75b17c7e6cfff86261071c4b5c9f9898be1e9e27349b933c34fb345685f8fc6c12470d124cecf51b5d5adbf5e7a2490f8d67aac53a82ed6a2110686cf631c348bcbc4cf156f3a6980163e2feca72a45f6b3d68c10e5a2283b470b7292674490383f75fa26ccf93c0e1c8d0628ca35f2f3d9b6876505d118988957237a2fc8051cb47b410e8b7a619e73b1350a9f6a260c5f16841e7c4db53d8eaa0b4708d62f95b2a72e2f04ca14647bca6b5e3ee707fcdf758b925eb8d4e6ace4fc7443c9bc5819ff9e555be098aa055066828e21b818fedc3aac517a0ee8f9060bd86e0d4cce212ab6a3a243c5ec0274563353ca7103af085e8f41be524fbb75cda88903907df94bfd69373e288949bd0626d85c1398b3073a139d5c747d24afdae7a3e745437335d0ee993eef36a3041c912f7eb58\n" 2915 + ~k:"b599111b9f78402cefe7bde8bf553b6ca00d5abaf9a158aa42f2607bf78510bc\n" 2916 + ~r:"a40a6c905654c55fc58e99c7d1a3feea2c5be64823d4086ce811f334cfdc448d\n" 2917 + ~s:"6478050977ec585980454e0a2f26a03037b921ca588a78a4daff7e84d49a8a6c\n\n"; 2918 + case 2919 + ~msg: 2920 + "c01c47bfa208e2f19ddda5cde5833325d16a83fbda29e666fe67ff3489803a6478a5ac17ff01edc7973d15fe4998f63bbc095fc1ac07534241c643a44444dc9a356fa812d5ca191a2f6ed162a2d5fd6d0aa898a20563d993830254db8a4bf65ba86099cc6b58a1bf6ebb01a19c79304308acebe1da09f1753a195e9ef586c7e1\n" 2921 + ~x:"9f11370ddb3c43e2f4162dc61f7e08dfc6e86d5d71742c6adcb5340f7bea2ada\n" 2922 + ~y: 2923 + "970d38cd8b3f16659ec42a46a19ff06ce8495b9f477d9b7e35ae1035b08b0ee17a0c3ceedf029846e3aeb912f850881c2277f82281e7c0741d2f87e9fa5c30677fe7268cc5fd9aed29f308d9be8de92b961e39c1dbc46790c99b7e29579daf888176d5ce16db5cabfcbe4209ac4753b0e96b15d0b82c7eefb42a10de88f8a7723492a2be5451c1c6ec68ca759d8b4ee418826e71f39cd07654d00d0e0f88d0924bdb97aaca5a6346ad69fc223cd57f5bb0300477b594aa445e5ea8896cdf3bc882e8fa5523b8a332fd98e9d0a924578944d24a41cbeae3ed7b37dffb2f60c0084eaf005c1251823da41d2a5d977d8e483ddb33f73fbc27254a814b616d6a390513f0567a563ac053a76667197b4558f871b69cbf2c116ce457513f60b4f528e2dcdaa71a9a3a4cccb3738a22937bca2a042bef8a74a600acd26975c891466d7e57cc930984212ee0eaf174ebcbafbeb8cc12bc43bfdb00fd11576c439513ef5b59a88fa5a9ae963d94dafd78f81ee7b0d7fab53e41bbf65f8449a4f58b44f9e3\n" 2924 + ~k:"ab53984e0b154992ace73bba548185b49719bcc3b11fb150b5da279529750078\n" 2925 + ~r:"5bb50e4f538a6e4638206be119dbf712776154acfb4c06d65d66c80212341739\n" 2926 + ~s:"7b7e640cd76086d3f640d18ceb26bb53e30282afb17401e7b48aa6818934dc5c\n\n"; 2927 + case 2928 + ~msg: 2929 + "47e7af22c9298ad3bfef9bee5086bedbdc513d67416d5f4e7981cddb1002cba24700c45dd6d4dcef4f81d003f0513dab4e04eb4c70d944042e1b726d8a33050d0e4f70c0a8341b75fd4e27c7948754e441208eb93fc7b7c37354252f73b838fd02d078c6a1ae073ef1233aa1c8aa2781e193ba2897ccdd8cf617ca23541ce1c5\n" 2930 + ~x:"232c1c88d571492779172ce6650524cb6d91174e8a23780d0fdf7c44ffd80c1a\n" 2931 + ~y: 2932 + "75163af15cd6b228251504ba024df51df32f638e37f0f2f9d08837f8c6ecfba43eb515ccbabea11b01e1e1fd3cfe7e405fc7f8142b07315e1dc37b08c78668421e2a21fc5d811d26558c504abc4e6fddf03740b8a27fa2ebcda5460ad785706c53cd2d14093d923df942051cbba2586b4d54709d24babe2f7c61a50da8451895999166e80c0fab892a37eb6782745596b49f96e11e9a957c8ec650d2d9a40aa4b014d2e9a4c08b9d7bfeaf1ecd42785b95c0172ae21cf25c4d368bb5100b6e6d92310b28b7b1afe64d496b9c60b763cac08ac46a6bce1bbd3ac8bb76bb55b649b7594820ab6ef7dd1b09bb12852816b61e6dbefab742e0ea2cda47eac7d9d913ddd4bfd8b2eb5f01951caa4f413eb5e7a41a0685695f8331a394e06b1495c170f30ac294660e8909843f9f11c4bfa64e8792df677da0a08aae32a8a4e7067fc35eee03964e8afbdb6a421b8248add284789e4ed3cace7106c23fe6666c4b12b836e7307a55ab24d92d58ac84e71f81dc9b0b7436ad07f74994af7d0b049bd09a\n" 2933 + ~k:"101acd88a048a6a87c13ff23225dc2c4d2fe3fff039e072fbb268ef2dbfab9c3\n" 2934 + ~r:"6175473d7aa7d5ce55590c952a19897206086887fd84bf2b566926e47981c2a3\n" 2935 + ~s:"71d7857b6ff06ca67885fa9c9c71b8cc246d0339b6c2725247172a297e26a7b5\n\n"; 2936 + case 2937 + ~msg: 2938 + "9311d8f951141713f459eb65f01880b961c0a590b36f785f1aeb880ee71300c0cbc601b3a6072193dad6ddf2028eca4c8bd7b8575187928f84bd69c5dcfb0b9d320003c3a863c09ee503e38abe07ce2e0d46b3cec926231a57defa0aebd1a6e01eef4f9b537ae1fcdf64e01434d40ab5019f3965c735411a5c19941f41febf4f\n" 2939 + ~x:"87bde6350da15832966fe70300e5dc66b96ec263344bcfb5de051be34d76262b\n" 2940 + ~y: 2941 + "287ddc1969156c18420743ade0fa1271ea346c3329f9ca9b5d54ebfa21f676f9e013616239f4bbe60eaf8e1902ed9ac742d8df918876770894b512aaa25c068bde961f56c9b5b87806d7d0a9de7843d3cb0797903126a47bd9422337e3b46bb1f4f4a79fdf9cf6762157118aeee1e71116f34dafce0047f05d43c7f2cbd4cd52d614b7a945d48be44cfebf784332fe99c1ee1aa8310867df20b280da855b19029fa79ecd6dd6919a4d22b5a1400c30e62ce7acc4b28efbdb94ea23afbb64d6e5f7b3975d2ac63b1d048feea835c7f50b425ce3cb418afdf4dc84008473606574e20db5ebf86cb1ad27737d46494b2e485b26b8c95d829cf656f80f96b1a62e7c03c8f20f18dc58bf59916682e6dcc68d34c89c1b1bd6e6b1e15a7dc325e23fd7a35099831dbd75989c738020bf4dc4079ccb0bf12faf3b9d6494a379aacb1b66d07cbcebbf77a6e29aef22f4baa3df40d270b457dde64f00b53759ae57811b64e040cbd42ea90f4e2808bc81dfd663b28584cdb8199da96d3e03d03fb4133e2f\n" 2942 + ~k:"7d1b5d39e51af0c22a56bc57ba6bf8bb6de18f2c256bb2d6fea684add38b1f6f\n" 2943 + ~r:"66f729716456a2781bdb8578fa18d1e64af0edf8ec1dee0a50d25981912fc45a\n" 2944 + ~s:"8c3cccfe6f0cfdc0ac3a542c8e8c85210bbd7f95134c8f035d1ce16f44ab7a06\n\n"; 2945 + case 2946 + ~msg: 2947 + "808603f7f8439441277913b21bef4e01c89e4113e07cacc33f65ac9849db1ad1a1cb7dd2fecd88ee4139b1638355c623821309f326c16bc658bb4821518238982e5251f7cd37807292153d2b07dddc066e003c6069c371155d2d191f15111f2089ce423f5c2a1f8534e301313c69623f62ba635adce8551733a82a8fac1a66b1\n" 2948 + ~x:"9464ce029452e8602214c5236d9637ce7e59f92536a07ac5ba30f639e09814d4\n" 2949 + ~y: 2950 + "389672ec6de0b86655cb10f1199f857013b6320d52c8728fbbb5360a9701b1d6ca4f9eecb8487fb879690f85430c582d3d91ef184c8247d162b94d6dfdfe7c4ae867ac1672827970415aa67a1406ac1a6e2c6c13167719e1d1a536d10078427c211cf682051a75ee8322c1408b89d963bd8e85f9eff7bb8ce05ca42225b4bdfead6b897b0feab76c2272b487d27d4e8dcde0f19e4615f7e1114541f61d43533ce788cc4505600b83266b1bea665912196c2c84c36aa93baf5b7464a6ddf547183e2cd058bb50a12765536f0a4d3524af4f31acc609fc447e1729aab97b5a36b01764b84bc5f77f6cc584866d1a6cfb3aa8437895f777f2dc6897499f6c5f02fa1e6c1ead68f3385b733387c6b58f2d11284a63ae7c7cfee42c3f44a3c926adad8107cca1c3f944f9b9e237d9ab35c81391d7c5f5292d1a322f7a12ce108a86237ba4de3c612fa738f53194ba67bed843cd2d4330a5d194d67cf45fa05183e0cb46c2d23a1bae76755c309fa1c31605c88a9214227ce02fe915bcf0d34bce8c8e\n" 2951 + ~k:"5c2bb856c4d87b27e01e2ac1ae6f2fc526ab8bb49a67eda5c1d8cd4253610df3\n" 2952 + ~r:"98fe587e43aa96f9a9bbe8af404a08b02307b36053db87f6db25a3aa36fcc3db\n" 2953 + ~s:"5c94ea70f99f9ff14b8e5dd4a6688398260907176ea80e19c39b14621149f0d6\n\n"; 2954 + case 2955 + ~msg: 2956 + "ce2aa3ed12c1b8843a3e11b06b5f0e5e63fe8e19c1a38ac446a48eeca8dac6d8b769d7809442c32ac82e93f686ec64347e9444c3f452823c840e8d0cd334b4152002148da16ac8859d189d87d67164c5db16195c081d2edd7d8157e2bf3b97a90b4b4784324eb8ceac4261809f674256daf007c4ab1f222f5fd28398a5b824de\n" 2957 + ~x:"b887c14673cbc63f04f0839ea56a76154027d7eecf41d8d0b53d4892353ae9a4\n" 2958 + ~y: 2959 + "584fe0eb314afb866c0466c3980a2df54598d8a705dc2d1bf5102eac86312784eebd019b81a7642d4a3c4cc65dbedd8187e3593f0a9bcc06ea367009b7eb4d29b0450061378edbe163efd3f344bb36234fc86fe1c32f2c9995a07c6e957d195e8105f5179c2bd976b3127067c80ca93456c16b98dfcc7de355790f0b15cfd2ff91db09345532d46096c06b40a2304681d62857675ac50e22c7d1ab47589235419cbedd4b7d24b90531e5bfd853e88a28836ac46b6df26760985b962c6a2445809866b46126212aa263ab2a4603ff41a852c7988c2d4386241655a7222fa4e9f6eac6a144a16b059ea25b71a2138491d54ee95a9d6819977f90fe6a59e0cad81b329eba3e68277df04f9828ef6f081610b4595a92113ec6d069ffe97196d956191daabe9877377ad0416b0ee0658663377e07adb24644e8a0e3ce5fc178f152be0cd9b04071890427c6b001d59262f38fe897ce32040daa7807821c40ac8c63505bed0af070443337c9e9a64e44203c36a8ca5064d87aa0d3cd1d403aa6a24ecc\n" 2960 + ~k:"49548238215fed6525693bc3cca3872944a97790087fb35f329b206e6046b32a\n" 2961 + ~r:"54c99b21f28feee27f0e999aac6b49b6b07633e1db18a45952fcf7e73b166bdb\n" 2962 + ~s:"7a18588ea1456f67562d677878346fb34b684b9a8a61a721b3db0e95695ab43a\n\n"; 2963 + case 2964 + ~msg: 2965 + "17b925e2a1a51c2036e225715f2f771d8f0a6d98c7ed9cacf5aa4cd30ab16afb94e21a7c953e01ca211c28782a06073fdad27713aa8c26ae9ec449aaaa8ccfda8c947172de94b3f20b54af98df152d5d3a636c736ff01bfa699d6214002dc76dbb3f3860d94e0e34edaba5f2bfd6b2bf660086be876451a50f6a2dc7c2b098b7\n" 2966 + ~x:"0684a8fad551c8d08beb05033185e3b4b6b6f6f4920ef9982d72d0a9c7549855\n" 2967 + ~y: 2968 + "42a93bf44ec7d2fbd651cc1d1ac391d63cab00971a7ff7a56166768b22e611dc4d729faf8c94e7ed4d6f82b7020b7b4d2fb3591cf2295cc6e1b4be2c256c2fdda43e00051114645da91cbed5cc087085f7cecd8bace67889100bcce7928220266fd3faf2ead9c21e423c9948ec70c2d31b668cdc360ddcebdf429720607f96d851235515d6dbdf163f7ea5ddf351baa76f38663fdbfbd5871bb2157df0a43420648c10e4827f54065614623ed3abad10d317be9d49a4c66564f20dcac176b6605a2e3c3c01c362220f352e477419f2b4b238affbc3920e5bb57cebb9a74746d62cdd070f4a13af001d262def014f29b7f754fac84e02d29285b73bb20ac0c8624123a577be8d6a6b9739185e4458090ddb42b005ea4fa8b51007bd9ca5b4cf2a3dca446a87ec83c9548dab46cf3daf86db3bc69a99baed459d6a197f9bf5032c1dc3a877dd7e5c1161124a6d701324e9a9712b824a4fc3b1b353259af225813c27e820b0ba72fb4e78f5c78673924e7fa2f486030284f26cb6fa31da56f49d3f\n" 2969 + ~k:"4a258c125db1f7b775432b53c7a0ff47c00bf7af27abec7fcd42a2916e95e26d\n" 2970 + ~r:"726e4d3baf00b259f4bdca8b0a5e1cbfd37827c48373ef5029f7601a7769478c\n" 2971 + ~s:"903079439ebde1f766d1a8ff33e0f778d77b5e8b7b0d687443c271e8a63b5975\n\n"; 2972 + case 2973 + ~msg: 2974 + "1c1169f0e790053cd7df780b5c832c64147694b4a6448ba14a426d9def7ddc78e3ed36a12da81cf9c3f245d64c859b6b4d8121d112851974df178defc977db691234d142dff99bea1957891b5d6fe8a787e96369d93c24682debd1cf3fdb64379b8c1b3b73e1bc2467dcb08b86cbd494c01477be24d7900f5a578930f4bddcb6\n" 2975 + ~x:"3fa44778b414ff27436e276ca4904546d3542d128f73c4463c69ff9cea2b7a41\n" 2976 + ~y: 2977 + "7fca2268fba33bf94e76416a9e3869f8a90c3b0d2d37aacecd3f6785b9a95aeefe9324c3ab09ce61ffde37b50f82b699413f3b54f24d6c52eca62325029523deb05db138778447bc3d0d05aff7d85b5525f2b863d26486e84cde13e2e2117d3fa38a38d1073aaa794ed8eaa7b3d1daa4ac3e808c3738a9cbef3546cd79eccb4faa28b50fce57cdc24015fec390f0e7a7dc9f9c471d22b30c3e4174358f1ad0734cf79a09a639bdf3f3eabda2b47b81f92e2a4f9004dd641370338c02029bbf4971aa67483eea7a4bf7dff3889f84faa5765617ccab37d190a94c57f99d792807a6965e2113586c6c5d1a81abfd372e1c7954e2e09064df4d2d8288f5cdd8106ed84ffa798819a09a732bc204a812c0352e4e39d2ceb88f8e7d3624a5a5f3dc56ea0f9c5290788e12dc463161601ff3ab681bd0403ee03af45d5e586d84d9c901986718193e661256f402de735d2ca696ef6b594868950ae173f22d95856656a9d00610fe8c2bd725ae55d791277b1317085b67188da00645ce91bbe62e324311\n" 2978 + ~k:"a05b9ca1c9532bc050cd0c1150c27bc192154cf64d59dc9a949906f1ded57e35\n" 2979 + ~r:"1026ecee0ac31bdcdbd6103b1343f84b441fc326e1d86ad0903d0b17cfb2ff9c\n" 2980 + ~s:"a5d3cb2e7c39d87640c4547ac6c33afccbfc1820905ba1e5be5b262313277cb9\n\n"; 2981 + case 2982 + ~msg: 2983 + "805baabdd018d9e5ebb4dc51435be632d2387869756d743788442790d55bb183e26655ae3aac86dc16a48ddd268dd15e18d8320df9a1a0a6cb2b49bc701d7a15e3fe8ddd584a75c8c9aaaecd1efe17324d6261881f3d34685b04f62e968505966c9a5feb0c39b5095e5568e40f20aa21cb2505356dc9049ce56182d94a2d94a9\n" 2984 + ~x:"770b99935d393eb90b583d1251696007cbeb1b35e6c3f4f9bcb62879070e0940\n" 2985 + ~y: 2986 + "434d0612b2a8332b0ab15614e3ee9fa245131712fb2ba84f71396fff9488dca340a37e820f44c13aa87fc9df0b7aabeae2ed85a9622b8defad474ac362a7039abde33d1df732a052446aff7857bc24d8f61d258015ed2a3060a8bf9d447e7d83d7b497a8e654731969e437b3f46f83eb58f7884ff2a2390f5d821ecaa7fd09a146c55fc1180073cc5aaa607cabb944f6078a4486cf206ddc5635242def2d3e2edcbc026bb84e849518f197399c22a9009dde9afcd8769b241c75d4ccce7f93900b5f488333df47c026c4f2b2767e70d2d9dde78405e226c9952f6db1a2e55829bc8a76c7de5c2b588f3f3e93ce72fadabacb75c7c14669701e0a2ba127bac56863c8c4e7205cc0a73c429a801e9797da4f26e848982306cc3c3439f9e394ddc80b0f13e0d528190638d8b96bba3af889de373b3549fc90a6822964c22171e7601fdefbe5708988b84f3ea554d621600a876415d5bc1e557e948caace563b3702f0915a90a13aada77709eeba8c50a8629351a4787d0d58808ffb8b217c1d164f\n" 2987 + ~k:"424a43cfd90f7b84e9e375572f82ebce7ffb197bd3237a353bf15ddc1a17095f\n" 2988 + ~r:"2d63e6d2568571acfe4a931580a04b974c7aae4ca9aa9610d87be1a91c657c31\n" 2989 + ~s:"574b10d14dcb8f079461b29ae1b91ed6c5ef32f93cbad306697552c11748fe0c\n\n"; 2990 + case 2991 + ~msg: 2992 + "be8ca5ed4c22a050d8309c7a31acf667f0c0fbaadc64a34d2b63074a763a2b8db73b24cdbaad26cc6f2c3e90df4b25bfa724fce587faa0fd65ffb719f0a0351648230d5354d721d8fa6d0d686c37f257d7d9dbd15f555d5073f8bc71c92139d1f627d743f7d6586d510d19d0d8a555d0bf79ec70596e712183880c89caf69d6f\n" 2993 + ~x:"9886138d837d20e8c6be853cd7de1a66a25748c7a33fd55121a27237623d68d6\n" 2994 + ~y: 2995 + "afaff7a4d438b464f27415d2e03ed9c416db2bebfbe0ab34f14ee10644885b5a4588877150f46327c2c7a6f712670bfd6237a29452494859948f5e37c0e586656b119a0e01c81acee57c1775a3a146e8fbafc99cd203fc98195687fb94a88a4f44280b03f0895e0eca84db087c1bf7c4843c85597368e839841131e027109daa7b8172a25e11355fa9a9205ac324941a9fe492c48421f0681a47e280803e8bd91b113e0fa1597607430bcb0ad50b9408de0066d6a2324d09cf6e99133654dd64e8c8f70cd6445343758b5cd5a0e77e2d3fa1cb3f7efed76124b2881dfd2028ab5918c389b9c3978271db54a5171515ab2e85eeb10ab307130159bca5fe13cc4a959e88e9267221ac8d14ee6938e149f52ec59125b449cb55c5a0029f018770b31f08440ce6876e6600a32411722f58e6263339bd9d34e17aa574b921228926ff668ce90362c4391ecd0c037454e12fdf80c96bb7a840cd866e8570bb7d6586fbe3d1eae5332931198ba1d5d902d6b7a122dfa77018553a2dd3680a809bb06053\n" 2996 + ~k:"1689eba0aac66b3d0cca9ae1911602f9638937b6be17c23a187be323d0dec7be\n" 2997 + ~r:"9c7d40e214082bd5e71f3bf4be99789303f38e851a76f88cb90aff713080c587\n" 2998 + ~s:"24ca23be94c624b9d736328b53782b5feb384dc9fe6370016cc3f97d8f48b6d0\n\n"; 2999 + case 3000 + ~msg: 3001 + "62f0cb1bb07f6497a1dc7a66955765a9cc403bde03fef4e16b09d7ec545b4c75d08b6e9c4c5af7232548d45445638d7194a199ef1534e81241eaa9c7e767fd54e2caceea4d2f7215d37baad6b05e28ea093497e2e8e1db6e41a5eb13ffa4caa27108f2263a74cf54bd5b6a6b62284bac99fd7977aaa8ffff18fa8a70ab0debdf\n" 3002 + ~x:"badece34257da3d7b8713f8f0f9f0107b1909c7f99a765ad8405d8c2a20310ee\n" 3003 + ~y: 3004 + "73554a69e1a09f6191f0aded542a077ee8c814265d745d9ae5c792f442c5fa47b34643d3ba1d5147161898de5188a80714ee36512a618a33e40300ff1187e553f54433e17466af486472bc0778af55ba7346c961d7f13ac6d8d6ac9a42092c01579ee2170590cbc3b45eef795b5d9e5d0a8449439ab307c14c5674c4a7a3eaf8b240ef36dd21f43cced58c2dcf23c314364e8e314e9671e80813d185801358d5df61d7e7ec0dd69e90c2cc75c1c3543efeca82b2ec6ec59e6c99bcd1a8631c6228e216884082da119125cb0a80c8fe344afe66e0f20646432465f3e0096a17725a8867b3bdba3c69a1aacbb8d64755b7f2a3df0a49ba0b2114e112d4cae0ad6d8d0fd618e54d53f07ba109b75a54a989618b2863e4415e176e0bfd88dbf36553ca853bb36316c66eb93da34ff3ae74cd5f187f49bf38af0f393b2d7f854df192ade2df6b39a176d2152c912bba248d84a5b0aa4084a18bb64fd136973f73b413d77db275ea5ece93ce2fa00d7c8887b7e50b00649d0353a7f58cc63f6b5fbdfc\n" 3005 + ~k:"2d468a99e315c158a1af18abd4d58872d6e281dcd4c9b0b43298eddf346496d7\n" 3006 + ~r:"54ff5d3dc8767856a10f54088882e28c110980ef9b204eb5f162dbef73a37c73\n" 3007 + ~s:"57ed0748427c089d6395528b2b4555c01b4c1341ab5fb99c64d1cc247a41c3a8\n\n"; 3008 + case 3009 + ~msg: 3010 + "baeb12a1ebd8057a99a0137ee60f60eed10d26f1eab22ae2d9adbc3e5ffc3252abf62b614707ad2546141bed779f0cfad9544a74e562da549e2f7b286efb615449b0946dc7c498d8f12150b2eacbd27157966f592ad5f3e43a24c60b7e06630b82a4fdb699119dbd878b13a98bf22a7b3dc7efdd992ce6b8a950e61299c5663b\n" 3011 + ~x:"bd3006cf5d3ac04a8a5128140df6025d9942d78544e9b27efe28b2ca1f79e313\n" 3012 + ~y: 3013 + "00728e23e74bb82de0e1315d58164a5cecc8951d89e88da702f5b878020fd8d2a1791b3e8ab770e084ac2397d297971ca8708a30a4097d86740153ee2db6ab6343c5b6cc2c8a7fa59082a8d659931cc48a0433a033dbb2fff3aa545686f922c7063da1d52d9688142ec64a1002948e5da89165d9df8eed9aa469b61ee0210b4033562333097ba8659944e5f7924e04a21bc3edc6d551e202e4c543e97518f91e0cab49111029b29c3aa1bed5f35e5c90feb9d3c745953dbf859defce4537b4a09801fdc8fe6999fbde39908079811b4b992c2e8333b9f800ea0d9f0a5f53607e308942e68efef01e03d7cca6f196872bf01f436d4a8e05fc59d8fbc6b88a166f57a4e99d67ddaece844653be77819747dd2e07d581c518cb9779e9f7960c17ff0bae710ecf575b09591b013b4805c88b235df262e61a4c94f46bf9a08284611df44eadd94f44cef6225a808e211e4d3af5e96bce64a90f8013874f10749a8382a6026a855d90853440bfce31f258b3a258f7b5e659b43e702dee7c24c02d2284\n" 3014 + ~k:"16aedfbe554de17a3e5b83e942702bd60702d9823ba154baa6d1e7e94308324d\n" 3015 + ~r:"8d357b0b956fb90e8e0b9ff284cedc88a04d171a90c5997d8ee1e9bc4d0b35ff\n" 3016 + ~s:"ab37329c50145d146505015704fdc4fb0fd7207e0b11d8becbad934e6255c30c\n\n"; 3017 + case 3018 + ~msg: 3019 + "184e599a4c1de86c4151205754df0b1912c2b3c532552c51a61c6459db98c83e59d4a40806c6a2c6b3fe74e3bb9e720d7d0a3cc11ef88959a8990c0fa057a3915fe0dd9a138aa0ec1cb1ab69d93910d8d6f9e14f3b8a135d3f031a56c76a9dc3aed1962bdf05815c2492d14f2324d2da491810d1672b633f2419da4e7ebdef24\n" 3020 + ~x:"a29e90d33f200b1faf61bee5d92ca8a392b1eaeeaa0817cec98b40c97e25018c\n" 3021 + ~y: 3022 + "60159720021fd2d5a2f575b3220905788d328d0c46895a46bb985942467209ec28d8ddfdc97ec34da65b164cf48652ac475d8978959cfc4330743ed98137559391b1204da6b26b451211407e8fc77d819934c48709c8eadc620f6db2592b65483265149a324467d93c375d97230f2b1a682897cf6d280df61a34f20f0c7c729a40141958044876c44e595d2378a7d22c6cda9ab816486c294e4eddea7ada88b15eca5371da164471edafcdefc654e64a1f995068fa85dbbb5516137bc442f60717fe59c629081c234f27195d5f9c2bf85cdc1ea4cae57aa908cbff9b2a53353b13e9f6fe45daa5174cd956236d447b52011d688cd22f23018409b39a36079cb53e03b6d3a752733297fea4ca27c6395becef4081d201f41d4a00e99d95f42281dcf44b9ef6754998d94231937c82594218a78463cc837193de6bf1d3c3ec31d8dc5468cb56defc9c70d08b95b029d97aa043d557f6286b87ee4098442df495c0ad8ae4d4ae037312c5f7239032c03b088c1036fad7774b1519709242c9511e6e\n" 3023 + ~k:"78e781b2874ca2441e2ce74a2a2a16417b51537eca876831f6593ae25fbd796c\n" 3024 + ~r:"079d4df14ad703a435b21bc70a03456ca822b876c9accb018bddd674bd6392d7\n" 3025 + ~s:"6c7765e1f1eddf915a56a57390db45636e52f083ce440766ad4f32580f722483\n\n"; 3026 + case 3027 + ~msg: 3028 + "b189dd34f58f3efa85b6f97677edfb82664cbe43a2550c336ffa08705bbda2545ef244a275014c6a265971f4c3658e5e8d6a3fafc889f3c4eda6b5616092954b15c60435efd76806e28557c05faaaa8a05c262657840865ff69c511a68d13022a712d35bde138eb7a2f8f1a87b342c7caf388c1a8b95079bc4a8003eef84b899\n" 3029 + ~x:"9759c24820670eaeaf92370197d0037f9f71dcc283970f341117fb56a1764001\n" 3030 + ~y: 3031 + "05e280310810715d29ea1ca00a700378bd5979493b9803174c932b7dadb7029a9a9f9c91cf8f938af2bceaa052f2273f0de393b0f7544490d693f529a68b812e2e589cc092b83ef847c5306039aa8eaf225128926145893a51551db382fda4b63e5abc10fd076100684d4ca657c89b2265de6e0f0473f01bb222b2bc50ec1c5fcde9161831018aab3014a956033bb0a83866df11915808f9e7461645c89c6e17ab65dbf97cbf4ac1164d671a1516ca81645bc3e09913a03f30641bd0920083578ca84df71f62eb756ba445a0dc44f85a9e4f72ce5f6bf82ccbd674d2ce3c4afc300562a7dbd3e8ab838993f9decc9933dc07dc01b502fee5b390461a8c82c4e69615f121b3f9fd4f0c8b7620a25996df43d7cf355f15be09e2c82178c6f8836c36c1d3ef26ad05219fb57e85ef162c8dd8f0e55014769d53cba478a2aa66d90d8acd6cb0489d1eea46c2c41bd5495ab8def43b2cd5bb2673945c21c80a4833fd75d884c7675c09e7191fb26e92c54c7c8208d0a0e8dee75c2968e962de4493e8\n" 3032 + ~k:"86050bf276a649b13c18814430eadcff54edf7416f1a8b1559c6c2c808e8dc9f\n" 3033 + ~r:"9fd105c74a0d36973740867ccc1c731cf1c50c7935d5c09e92f574d7a569157e\n" 3034 + ~s:"501f50c32b0288672e02aca78f90f446acf92626365957a375550c77980c3c17\n\n"; 3035 + case 3036 + ~msg: 3037 + "42c065fadd56d6a1fe68dd4e86c17efd76d0f9db87036bd7b609159d66847f46de01b8ae43590360fa324559a2d709d45cf01034f5facb7f52324e60dd464a583d42e412659d8420f7265e30cf82bbbcb2c99b0f00ca6a46d28556428789f415000dc31babbd67ccc8fbaa84a880466bca4783eaf00b7f78231c667126433e6a\n" 3038 + ~x:"307555893610e15549a5bfb2b446251f9595eb0c16df5fe3b784ebfc3fc30140\n" 3039 + ~y: 3040 + "b265edfed77b3ad511e56d583129b12e5796d659d484a2fce350661f79e545dd0a06c23774c8ba2fb5101a2848c413dfc5b374a7c5ff3acc7332f0ff8bd6f5fa882c0a67689308be7154c4efc51835f349525419ed722a90bf26ddded65bc8962ba11de9e734442571affc2d42b9f3f54a46535ae9eb01361adf03fc28410abf41db3ae4113da4c40e9a368f9cd029be4d98c66d835d034e3c86544b60bcb01feb383b2add9afe7b6251a17ad4e5439a9cd2d1bf62b6cf5377c097b7268bd736cca9ceb822e5d1844a09fa69c78217c3d6737f0bf45e3236508b5a3f5c466dd0d75ace95d447f9bd7aa9ee57bd10ee3c5e8389a06c00857e699794f5cacc7dc5bb1504421dc920565618bef05dc1713b6f08bc00681c5a1c0685359729fe4b544090ccceaa82f4fefa9f1117bf1e371b99fe4ed71635dad415017a62341d704227ee7cfb64a8deae90d86c0cfd37ed363d91a4a06fd06f64dbd8142c12503f49eeb1b9a971aeb343f15cd27d279b99d4cfa51f121259b3c1b55d28d994bb3299\n" 3041 + ~k:"5359fe067eb9d98ec2217500de743b0dbe88e8d94552b53a0117aac4d3390083\n" 3042 + ~r:"6ed82af8e89e38c49a58010f0564165a16a76a2bfb348466d9b4a91e5ce53ab2\n" 3043 + ~s:"8c466a8b3e4c90886f29986a4d513904f31db43a68ce880311403cc755466604"; 3044 + ] 2185 3045 2186 3046 let private_key ~p ~q ~g ~x ~y = priv_of_hex ~p ~q ~gg:g ~x ~y 2187 3047 2188 - let test_rfc6979 (type a) ~priv ~msg ~(hash: a Digestif.hash) ~k ~r ~s _ = 3048 + let test_rfc6979 (type a) ~priv ~msg ~(hash : a Digestif.hash) ~k ~r ~s _ = 2189 3049 let h1 = Digestif.(digest_string hash msg |> to_raw_string hash) in 2190 3050 let k' = 2191 - let module H = (val (Digestif.module_of hash)) in 3051 + let module H = (val Digestif.module_of hash) in 2192 3052 let module K = Dsa.K_gen (H) in 2193 - K.generate ~key:priv h1 in 2194 - assert_oct_equal 2195 - ~msg:"computed k" k 2196 - (Z_extra.to_octets_be ~size:(Z.numbits priv.Dsa.q // 8) k') ; 3053 + K.generate ~key:priv h1 3054 + in 3055 + assert_oct_equal ~msg:"computed k" k 3056 + (Z_extra.to_octets_be ~size:(Z.numbits priv.Dsa.q // 8) k'); 2197 3057 dsa_test ~priv ~msg ~k:k' ~r ~s ~hash () 2198 3058 2199 - 2200 3059 let rfc6979_dsa_1024 = 2201 - let priv = private_key 2202 - ~p:"86F5CA03DCFEB225063FF830A0C769B9DD9D6153AD91D7CE27F787C43278B447 2203 - E6533B86B18BED6E8A48B784A14C252C5BE0DBF60B86D6385BD2F12FB763ED88 2204 - 73ABFD3F5BA2E0A8C0A59082EAC056935E529DAF7C610467899C77ADEDFC846C 2205 - 881870B7B19B2B58F9BE0521A17002E3BDD6B86685EE90B3D9A1B02B782B1779" 2206 - ~q:"996F967F6C8E388D9E28D01E205FBA957A5698B1" 2207 - ~g:"07B0F92546150B62514BB771E2A0C0CE387F03BDA6C56B505209FF25FD3C133D 2208 - 89BBCD97E904E09114D9A7DEFDEADFC9078EA544D2E401AEECC40BB9FBBF78FD 2209 - 87995A10A1C27CB7789B594BA7EFB5C4326A9FE59A070E136DB77175464ADCA4 2210 - 17BE5DCE2F40D10A46A3A3943F26AB7FD9C0398FF8C76EE0A56826A8A88F1DBD" 2211 - ~x:"411602CB19A6CCC34494D79D98EF1E7ED5AF25F7" 2212 - ~y:"5DF5E01DED31D0297E274E1691C192FE5868FEF9E19A84776454B100CF16F653 2213 - 92195A38B90523E2542EE61871C0440CB87C322FC4B4D2EC5E1E7EC766E1BE8D 2214 - 4CE935437DC11C3C8FD426338933EBFE739CB3465F4D3668C5E473508253B1E6 2215 - 82F65CBDC4FAE93C2EA212390E54905A86E2223170B44EAA7DA5DD9FFCFB7F3B" 3060 + let priv = 3061 + private_key 3062 + ~p: 3063 + "86F5CA03DCFEB225063FF830A0C769B9DD9D6153AD91D7CE27F787C43278B447\n\ 3064 + \ E6533B86B18BED6E8A48B784A14C252C5BE0DBF60B86D6385BD2F12FB763ED88\n\ 3065 + \ 73ABFD3F5BA2E0A8C0A59082EAC056935E529DAF7C610467899C77ADEDFC846C\n\ 3066 + \ \ 3067 + 881870B7B19B2B58F9BE0521A17002E3BDD6B86685EE90B3D9A1B02B782B1779" 3068 + ~q:"996F967F6C8E388D9E28D01E205FBA957A5698B1" 3069 + ~g: 3070 + "07B0F92546150B62514BB771E2A0C0CE387F03BDA6C56B505209FF25FD3C133D\n\ 3071 + \ 89BBCD97E904E09114D9A7DEFDEADFC9078EA544D2E401AEECC40BB9FBBF78FD\n\ 3072 + \ 87995A10A1C27CB7789B594BA7EFB5C4326A9FE59A070E136DB77175464ADCA4\n\ 3073 + \ \ 3074 + 17BE5DCE2F40D10A46A3A3943F26AB7FD9C0398FF8C76EE0A56826A8A88F1DBD" 3075 + ~x:"411602CB19A6CCC34494D79D98EF1E7ED5AF25F7" 3076 + ~y: 3077 + "5DF5E01DED31D0297E274E1691C192FE5868FEF9E19A84776454B100CF16F653\n\ 3078 + \ 92195A38B90523E2542EE61871C0440CB87C322FC4B4D2EC5E1E7EC766E1BE8D\n\ 3079 + \ 4CE935437DC11C3C8FD426338933EBFE739CB3465F4D3668C5E473508253B1E6\n\ 3080 + \ \ 3081 + 82F65CBDC4FAE93C2EA212390E54905A86E2223170B44EAA7DA5DD9FFCFB7F3B" 2216 3082 in 2217 3083 2218 3084 let case ~msg ~hash ~k ~r ~s = 2219 3085 test_rfc6979 ~priv ~msg ~k:(vx k) ~r:(vx r) ~s:(vx s) ~hash 2220 - in [ 3086 + in 3087 + [ 2221 3088 case ~msg:"sample" ~hash:Digestif.sha1 2222 - ~k:"7BDB6B0FF756E1BB5D53583EF979082F9AD5BD5B" 2223 - ~r:"2E1A0C2562B2912CAAF89186FB0F42001585DA55" 2224 - ~s:"29EFB6B0AFF2D7A68EB70CA313022253B9A88DF5" ; 2225 - 3089 + ~k:"7BDB6B0FF756E1BB5D53583EF979082F9AD5BD5B" 3090 + ~r:"2E1A0C2562B2912CAAF89186FB0F42001585DA55" 3091 + ~s:"29EFB6B0AFF2D7A68EB70CA313022253B9A88DF5"; 2226 3092 case ~hash:Digestif.sha224 ~msg:"sample" 2227 - ~k:"562097C06782D60C3037BA7BE104774344687649" 2228 - ~r:"4BC3B686AEA70145856814A6F1BB53346F02101E" 2229 - ~s:"410697B92295D994D21EDD2F4ADA85566F6F94C1" ; 2230 - 3093 + ~k:"562097C06782D60C3037BA7BE104774344687649" 3094 + ~r:"4BC3B686AEA70145856814A6F1BB53346F02101E" 3095 + ~s:"410697B92295D994D21EDD2F4ADA85566F6F94C1"; 2231 3096 case ~hash:Digestif.sha256 ~msg:"sample" 2232 - ~k:"519BA0546D0C39202A7D34D7DFA5E760B318BCFB" 2233 - ~r:"81F2F5850BE5BC123C43F71A3033E9384611C545" 2234 - ~s:"4CDD914B65EB6C66A8AAAD27299BEE6B035F5E89" ; 2235 - 3097 + ~k:"519BA0546D0C39202A7D34D7DFA5E760B318BCFB" 3098 + ~r:"81F2F5850BE5BC123C43F71A3033E9384611C545" 3099 + ~s:"4CDD914B65EB6C66A8AAAD27299BEE6B035F5E89"; 2236 3100 case ~hash:Digestif.sha384 ~msg:"sample" 2237 - ~k:"95897CD7BBB944AA932DBC579C1C09EB6FCFC595" 2238 - ~r:"07F2108557EE0E3921BC1774F1CA9B410B4CE65A" 2239 - ~s:"54DF70456C86FAC10FAB47C1949AB83F2C6F7595" ; 2240 - 3101 + ~k:"95897CD7BBB944AA932DBC579C1C09EB6FCFC595" 3102 + ~r:"07F2108557EE0E3921BC1774F1CA9B410B4CE65A" 3103 + ~s:"54DF70456C86FAC10FAB47C1949AB83F2C6F7595"; 2241 3104 case ~hash:Digestif.sha512 ~msg:"sample" 2242 - ~k:"09ECE7CA27D0F5A4DD4E556C9DF1D21D28104F8B" 2243 - ~r:"16C3491F9B8C3FBBDD5E7A7B667057F0D8EE8E1B" 2244 - ~s:"02C36A127A7B89EDBB72E4FFBC71DABC7D4FC69C" ; 2245 - 3105 + ~k:"09ECE7CA27D0F5A4DD4E556C9DF1D21D28104F8B" 3106 + ~r:"16C3491F9B8C3FBBDD5E7A7B667057F0D8EE8E1B" 3107 + ~s:"02C36A127A7B89EDBB72E4FFBC71DABC7D4FC69C"; 2246 3108 case ~hash:Digestif.sha1 ~msg:"test" 2247 - ~k:"5C842DF4F9E344EE09F056838B42C7A17F4A6433" 2248 - ~r:"42AB2052FD43E123F0607F115052A67DCD9C5C77" 2249 - ~s:"183916B0230D45B9931491D4C6B0BD2FB4AAF088" ; 2250 - 3109 + ~k:"5C842DF4F9E344EE09F056838B42C7A17F4A6433" 3110 + ~r:"42AB2052FD43E123F0607F115052A67DCD9C5C77" 3111 + ~s:"183916B0230D45B9931491D4C6B0BD2FB4AAF088"; 2251 3112 case ~hash:Digestif.sha224 ~msg:"test" 2252 - ~k:"4598B8EFC1A53BC8AECD58D1ABBB0C0C71E67297" 2253 - ~r:"6868E9964E36C1689F6037F91F28D5F2C30610F2" 2254 - ~s:"49CEC3ACDC83018C5BD2674ECAAD35B8CD22940F" ; 2255 - 3113 + ~k:"4598B8EFC1A53BC8AECD58D1ABBB0C0C71E67297" 3114 + ~r:"6868E9964E36C1689F6037F91F28D5F2C30610F2" 3115 + ~s:"49CEC3ACDC83018C5BD2674ECAAD35B8CD22940F"; 2256 3116 case ~hash:Digestif.sha256 ~msg:"test" 2257 - ~k:"5A67592E8128E03A417B0484410FB72C0B630E1A" 2258 - ~r:"22518C127299B0F6FDC9872B282B9E70D0790812" 2259 - ~s:"6837EC18F150D55DE95B5E29BE7AF5D01E4FE160" ; 2260 - 3117 + ~k:"5A67592E8128E03A417B0484410FB72C0B630E1A" 3118 + ~r:"22518C127299B0F6FDC9872B282B9E70D0790812" 3119 + ~s:"6837EC18F150D55DE95B5E29BE7AF5D01E4FE160"; 2261 3120 case ~hash:Digestif.sha384 ~msg:"test" 2262 - ~k:"220156B761F6CA5E6C9F1B9CF9C24BE25F98CD89" 2263 - ~r:"854CF929B58D73C3CBFDC421E8D5430CD6DB5E66" 2264 - ~s:"91D0E0F53E22F898D158380676A871A157CDA622" ; 2265 - 3121 + ~k:"220156B761F6CA5E6C9F1B9CF9C24BE25F98CD89" 3122 + ~r:"854CF929B58D73C3CBFDC421E8D5430CD6DB5E66" 3123 + ~s:"91D0E0F53E22F898D158380676A871A157CDA622"; 2266 3124 case ~hash:Digestif.sha512 ~msg:"test" 2267 - ~k:"65D2C2EEB175E370F28C75BFCDC028D22C7DBE9C" 2268 - ~r:"8EA47E475BA8AC6F2D821DA3BD212D11A3DEB9A0" 2269 - ~s:"7C670C7AD72B6C050C109E1790008097125433E8" 3125 + ~k:"65D2C2EEB175E370F28C75BFCDC028D22C7DBE9C" 3126 + ~r:"8EA47E475BA8AC6F2D821DA3BD212D11A3DEB9A0" 3127 + ~s:"7C670C7AD72B6C050C109E1790008097125433E8"; 2270 3128 ] 2271 3129 2272 3130 let rfc6979_dsa_2048 = 2273 - let priv = private_key 2274 - ~p:"9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642F0B5C48 2275 - C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757264E5A1A44F 2276 - FE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F9716BFE6117C6B5 2277 - B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091EB51743BF33050C38DE2 2278 - 35567E1B34C3D6A5C0CEAA1A0F368213C3D19843D0B4B09DCB9FC72D39C8DE41 2279 - F1BF14D4BB4563CA28371621CAD3324B6A2D392145BEBFAC748805236F5CA2FE 2280 - 92B871CD8F9C36D3292B5509CA8CAA77A2ADFC7BFD77DDA6F71125A7456FEA15 2281 - 3E433256A2261C6A06ED3693797E7995FAD5AABBCFBE3EDA2741E375404AE25B" 2282 - ~q:"F2C3119374CE76C9356990B465374A17F23F9ED35089BD969F61C6DDE9998C1F" 2283 - ~g:"5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E24809670716C613 2284 - D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D1AA58C4328A06C4 2285 - 6A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A338661D10461C0D135472 2286 - 085057F3494309FFA73C611F78B32ADBB5740C361C9F35BE90997DB2014E2EF5 2287 - AA61782F52ABEB8BD6432C4DD097BC5423B285DAFB60DC364E8161F4A2A35ACA 2288 - 3A10B1C4D203CC76A470A33AFDCBDD92959859ABD8B56E1725252D78EAC66E71 2289 - BA9AE3F1DD2487199874393CD4D832186800654760E1E34C09E4D155179F9EC0 2290 - DC4473F996BDCE6EED1CABED8B6F116F7AD9CF505DF0F998E34AB27514B0FFE7" 2291 - ~x:"69C7548C21D0DFEA6B9A51C9EAD4E27C33D3B3F180316E5BCAB92C933F0E4DBC" 2292 - ~y:"667098C654426C78D7F8201EAC6C203EF030D43605032C2F1FA937E5237DBD94 2293 - 9F34A0A2564FE126DC8B715C5141802CE0979C8246463C40E6B6BDAA2513FA61 2294 - 1728716C2E4FD53BC95B89E69949D96512E873B9C8F8DFD499CC312882561ADE 2295 - CB31F658E934C0C197F2C4D96B05CBAD67381E7B768891E4DA3843D24D94CDFB 2296 - 5126E9B8BF21E8358EE0E0A30EF13FD6A664C0DCE3731F7FB49A4845A4FD8254 2297 - 687972A2D382599C9BAC4E0ED7998193078913032558134976410B89D2C171D1 2298 - 23AC35FD977219597AA7D15C1A9A428E59194F75C721EBCBCFAE44696A499AFA 2299 - 74E04299F132026601638CB87AB79190D4A0986315DA8EEC6561C938996BEADF" 3131 + let priv = 3132 + private_key 3133 + ~p: 3134 + "9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642F0B5C48\n\ 3135 + \ C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757264E5A1A44F\n\ 3136 + \ FE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F9716BFE6117C6B5\n\ 3137 + \ B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091EB51743BF33050C38DE2\n\ 3138 + \ 35567E1B34C3D6A5C0CEAA1A0F368213C3D19843D0B4B09DCB9FC72D39C8DE41\n\ 3139 + \ F1BF14D4BB4563CA28371621CAD3324B6A2D392145BEBFAC748805236F5CA2FE\n\ 3140 + \ 92B871CD8F9C36D3292B5509CA8CAA77A2ADFC7BFD77DDA6F71125A7456FEA15\n\ 3141 + \ \ 3142 + 3E433256A2261C6A06ED3693797E7995FAD5AABBCFBE3EDA2741E375404AE25B" 3143 + ~q:"F2C3119374CE76C9356990B465374A17F23F9ED35089BD969F61C6DDE9998C1F" 3144 + ~g: 3145 + "5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E24809670716C613\n\ 3146 + \ D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D1AA58C4328A06C4\n\ 3147 + \ 6A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A338661D10461C0D135472\n\ 3148 + \ 085057F3494309FFA73C611F78B32ADBB5740C361C9F35BE90997DB2014E2EF5\n\ 3149 + \ AA61782F52ABEB8BD6432C4DD097BC5423B285DAFB60DC364E8161F4A2A35ACA\n\ 3150 + \ 3A10B1C4D203CC76A470A33AFDCBDD92959859ABD8B56E1725252D78EAC66E71\n\ 3151 + \ BA9AE3F1DD2487199874393CD4D832186800654760E1E34C09E4D155179F9EC0\n\ 3152 + \ \ 3153 + DC4473F996BDCE6EED1CABED8B6F116F7AD9CF505DF0F998E34AB27514B0FFE7" 3154 + ~x:"69C7548C21D0DFEA6B9A51C9EAD4E27C33D3B3F180316E5BCAB92C933F0E4DBC" 3155 + ~y: 3156 + "667098C654426C78D7F8201EAC6C203EF030D43605032C2F1FA937E5237DBD94\n\ 3157 + \ 9F34A0A2564FE126DC8B715C5141802CE0979C8246463C40E6B6BDAA2513FA61\n\ 3158 + \ 1728716C2E4FD53BC95B89E69949D96512E873B9C8F8DFD499CC312882561ADE\n\ 3159 + \ CB31F658E934C0C197F2C4D96B05CBAD67381E7B768891E4DA3843D24D94CDFB\n\ 3160 + \ 5126E9B8BF21E8358EE0E0A30EF13FD6A664C0DCE3731F7FB49A4845A4FD8254\n\ 3161 + \ 687972A2D382599C9BAC4E0ED7998193078913032558134976410B89D2C171D1\n\ 3162 + \ 23AC35FD977219597AA7D15C1A9A428E59194F75C721EBCBCFAE44696A499AFA\n\ 3163 + \ \ 3164 + 74E04299F132026601638CB87AB79190D4A0986315DA8EEC6561C938996BEADF" 2300 3165 in 2301 3166 2302 3167 let case ~msg ~hash ~k ~r ~s = 2303 3168 test_rfc6979 ~priv ~msg ~k:(vx k) ~r:(vx r) ~s:(vx s) ~hash 2304 - in [ 3169 + in 3170 + [ 2305 3171 case ~hash:Digestif.sha1 ~msg:"sample" 2306 - ~k:"888FA6F7738A41BDC9846466ABDB8174C0338250AE50CE955CA16230F9CBD53E" 2307 - ~r:"3A1B2DBD7489D6ED7E608FD036C83AF396E290DBD602408E8677DAABD6E7445A" 2308 - ~s:"D26FCBA19FA3E3058FFC02CA1596CDBB6E0D20CB37B06054F7E36DED0CDBBCCF" ; 2309 - 2310 - case ~hash:Digestif.sha224 ~msg:"sample" 2311 - ~k:"BC372967702082E1AA4FCE892209F71AE4AD25A6DFD869334E6F153BD0C4D806" 2312 - ~r:"DC9F4DEADA8D8FF588E98FED0AB690FFCE858DC8C79376450EB6B76C24537E2C" 2313 - ~s:"A65A9C3BC7BABE286B195D5DA68616DA8D47FA0097F36DD19F517327DC848CEC" ; 2314 - 2315 - 2316 - case ~hash:Digestif.sha256 ~msg:"sample" 2317 - ~k:"8926A27C40484216F052F4427CFD5647338B7B3939BC6573AF4333569D597C52" 2318 - ~r:"EACE8BDBBE353C432A795D9EC556C6D021F7A03F42C36E9BC87E4AC7932CC809" 2319 - ~s:"7081E175455F9247B812B74583E9E94F9EA79BD640DC962533B0680793A38D53" ; 2320 - 2321 - 2322 - case ~hash:Digestif.sha384 ~msg:"sample" 2323 - ~k:"C345D5AB3DA0A5BCB7EC8F8FB7A7E96069E03B206371EF7D83E39068EC564920" 2324 - ~r:"B2DA945E91858834FD9BF616EBAC151EDBC4B45D27D0DD4A7F6A22739F45C00B" 2325 - ~s:"19048B63D9FD6BCA1D9BAE3664E1BCB97F7276C306130969F63F38FA8319021B" ; 2326 - 2327 - case ~hash:Digestif.sha512 ~msg:"sample" 2328 - ~k:"5A12994431785485B3F5F067221517791B85A597B7A9436995C89ED0374668FC" 2329 - ~r:"2016ED092DC5FB669B8EFB3D1F31A91EECB199879BE0CF78F02BA062CB4C942E" 2330 - ~s:"D0C76F84B5F091E141572A639A4FB8C230807EEA7D55C8A154A224400AFF2351" ; 2331 - 2332 - case ~hash:Digestif.sha1 ~msg:"test" 2333 - ~k:"6EEA486F9D41A037B2C640BC5645694FF8FF4B98D066A25F76BE641CCB24BA4F" 2334 - ~r:"C18270A93CFC6063F57A4DFA86024F700D980E4CF4E2CB65A504397273D98EA0" 2335 - ~s:"414F22E5F31A8B6D33295C7539C1C1BA3A6160D7D68D50AC0D3A5BEAC2884FAA" ; 2336 - 2337 - case ~hash:Digestif.sha224 ~msg:"test" 2338 - ~k:"06BD4C05ED74719106223BE33F2D95DA6B3B541DAD7BFBD7AC508213B6DA6670" 2339 - ~r:"272ABA31572F6CC55E30BF616B7A265312018DD325BE031BE0CC82AA17870EA3" 2340 - ~s:"E9CC286A52CCE201586722D36D1E917EB96A4EBDB47932F9576AC645B3A60806" ; 2341 - 2342 - case ~hash:Digestif.sha256 ~msg:"test" 2343 - ~k:"1D6CE6DDA1C5D37307839CD03AB0A5CBB18E60D800937D67DFB4479AAC8DEAD7" 2344 - ~r:"8190012A1969F9957D56FCCAAD223186F423398D58EF5B3CEFD5A4146A4476F0" 2345 - ~s:"7452A53F7075D417B4B013B278D1BB8BBD21863F5E7B1CEE679CF2188E1AB19E" ; 2346 - 2347 - case ~hash:Digestif.sha384 ~msg:"test" 2348 - ~k:"206E61F73DBE1B2DC8BE736B22B079E9DACD974DB00EEBBC5B64CAD39CF9F91C" 2349 - ~r:"239E66DDBE8F8C230A3D071D601B6FFBDFB5901F94D444C6AF56F732BEB954BE" 2350 - ~s:"6BD737513D5E72FE85D1C750E0F73921FE299B945AAD1C802F15C26A43D34961" ; 2351 - 2352 - case ~hash:Digestif.sha512 ~msg:"test" 2353 - ~k:"AFF1651E4CD6036D57AA8B2A05CCF1A9D5A40166340ECBBDC55BE10B568AA0AA" 2354 - ~r:"89EC4BB1400ECCFF8E7D9AA515CD1DE7803F2DAFF09693EE7FD1353E90A68307" 2355 - ~s:"C9F0BDABCC0D880BB137A994CC7F3980CE91CC10FAF529FC46565B15CEA854E1" 2356 - 3172 + ~k:"888FA6F7738A41BDC9846466ABDB8174C0338250AE50CE955CA16230F9CBD53E" 3173 + ~r:"3A1B2DBD7489D6ED7E608FD036C83AF396E290DBD602408E8677DAABD6E7445A" 3174 + ~s:"D26FCBA19FA3E3058FFC02CA1596CDBB6E0D20CB37B06054F7E36DED0CDBBCCF"; 3175 + case ~hash:Digestif.sha224 ~msg:"sample" 3176 + ~k:"BC372967702082E1AA4FCE892209F71AE4AD25A6DFD869334E6F153BD0C4D806" 3177 + ~r:"DC9F4DEADA8D8FF588E98FED0AB690FFCE858DC8C79376450EB6B76C24537E2C" 3178 + ~s:"A65A9C3BC7BABE286B195D5DA68616DA8D47FA0097F36DD19F517327DC848CEC"; 3179 + case ~hash:Digestif.sha256 ~msg:"sample" 3180 + ~k:"8926A27C40484216F052F4427CFD5647338B7B3939BC6573AF4333569D597C52" 3181 + ~r:"EACE8BDBBE353C432A795D9EC556C6D021F7A03F42C36E9BC87E4AC7932CC809" 3182 + ~s:"7081E175455F9247B812B74583E9E94F9EA79BD640DC962533B0680793A38D53"; 3183 + case ~hash:Digestif.sha384 ~msg:"sample" 3184 + ~k:"C345D5AB3DA0A5BCB7EC8F8FB7A7E96069E03B206371EF7D83E39068EC564920" 3185 + ~r:"B2DA945E91858834FD9BF616EBAC151EDBC4B45D27D0DD4A7F6A22739F45C00B" 3186 + ~s:"19048B63D9FD6BCA1D9BAE3664E1BCB97F7276C306130969F63F38FA8319021B"; 3187 + case ~hash:Digestif.sha512 ~msg:"sample" 3188 + ~k:"5A12994431785485B3F5F067221517791B85A597B7A9436995C89ED0374668FC" 3189 + ~r:"2016ED092DC5FB669B8EFB3D1F31A91EECB199879BE0CF78F02BA062CB4C942E" 3190 + ~s:"D0C76F84B5F091E141572A639A4FB8C230807EEA7D55C8A154A224400AFF2351"; 3191 + case ~hash:Digestif.sha1 ~msg:"test" 3192 + ~k:"6EEA486F9D41A037B2C640BC5645694FF8FF4B98D066A25F76BE641CCB24BA4F" 3193 + ~r:"C18270A93CFC6063F57A4DFA86024F700D980E4CF4E2CB65A504397273D98EA0" 3194 + ~s:"414F22E5F31A8B6D33295C7539C1C1BA3A6160D7D68D50AC0D3A5BEAC2884FAA"; 3195 + case ~hash:Digestif.sha224 ~msg:"test" 3196 + ~k:"06BD4C05ED74719106223BE33F2D95DA6B3B541DAD7BFBD7AC508213B6DA6670" 3197 + ~r:"272ABA31572F6CC55E30BF616B7A265312018DD325BE031BE0CC82AA17870EA3" 3198 + ~s:"E9CC286A52CCE201586722D36D1E917EB96A4EBDB47932F9576AC645B3A60806"; 3199 + case ~hash:Digestif.sha256 ~msg:"test" 3200 + ~k:"1D6CE6DDA1C5D37307839CD03AB0A5CBB18E60D800937D67DFB4479AAC8DEAD7" 3201 + ~r:"8190012A1969F9957D56FCCAAD223186F423398D58EF5B3CEFD5A4146A4476F0" 3202 + ~s:"7452A53F7075D417B4B013B278D1BB8BBD21863F5E7B1CEE679CF2188E1AB19E"; 3203 + case ~hash:Digestif.sha384 ~msg:"test" 3204 + ~k:"206E61F73DBE1B2DC8BE736B22B079E9DACD974DB00EEBBC5B64CAD39CF9F91C" 3205 + ~r:"239E66DDBE8F8C230A3D071D601B6FFBDFB5901F94D444C6AF56F732BEB954BE" 3206 + ~s:"6BD737513D5E72FE85D1C750E0F73921FE299B945AAD1C802F15C26A43D34961"; 3207 + case ~hash:Digestif.sha512 ~msg:"test" 3208 + ~k:"AFF1651E4CD6036D57AA8B2A05CCF1A9D5A40166340ECBBDC55BE10B568AA0AA" 3209 + ~r:"89EC4BB1400ECCFF8E7D9AA515CD1DE7803F2DAFF09693EE7FD1353E90A68307" 3210 + ~s:"C9F0BDABCC0D880BB137A994CC7F3980CE91CC10FAF529FC46565B15CEA854E1"; 2357 3211 ] 2358 3212 2359 3213 let suite = 2360 - List.mapi (fun i f -> "DSA SHA1 " ^ string_of_int i >:: f) sha1_cases @ 2361 - List.mapi (fun i f -> "DSA SHA224 " ^ string_of_int i >:: f) sha224_cases @ 2362 - List.mapi (fun i f -> "DSA SHA256 " ^ string_of_int i >:: f) sha256_cases @ 2363 - List.mapi (fun i f -> "DSA SHA384 " ^ string_of_int i >:: f) sha384_cases @ 2364 - List.mapi (fun i f -> "DSA SHA512 " ^ string_of_int i >:: f) sha512_cases @ 2365 - List.mapi (fun i f -> "DSA SHA1 N224 " ^ string_of_int i >:: f) sha1_n224_cases @ 2366 - List.mapi (fun i f -> "DSA SHA224 N224 " ^ string_of_int i >:: f) sha224_n224_cases @ 2367 - List.mapi (fun i f -> "DSA SHA256 N224 " ^ string_of_int i >:: f) sha256_n224_cases @ 2368 - List.mapi (fun i f -> "DSA SHA384 N224 " ^ string_of_int i >:: f) sha384_n224_cases @ 2369 - List.mapi (fun i f -> "DSA SHA512 N224 " ^ string_of_int i >:: f) sha512_n224_cases @ 2370 - List.mapi (fun i f -> "DSA SHA1 N256 " ^ string_of_int i >:: f) sha1_n256_cases @ 2371 - List.mapi (fun i f -> "DSA SHA224 N256 " ^ string_of_int i >:: f) sha224_n256_cases @ 2372 - List.mapi (fun i f -> "DSA SHA256 N256 " ^ string_of_int i >:: f) sha256_n256_cases @ 2373 - List.mapi (fun i f -> "DSA SHA384 N256 " ^ string_of_int i >:: f) sha384_n256_cases @ 2374 - List.mapi (fun i f -> "DSA SHA512 N256 " ^ string_of_int i >:: f) sha512_n256_cases @ 2375 - List.mapi (fun i f -> "DSA SHA1 N256 2 " ^ string_of_int i >:: f) sha1_n256_cases2 @ 2376 - List.mapi (fun i f -> "DSA SHA224 N256 2 " ^ string_of_int i >:: f) sha224_n256_cases2 @ 2377 - List.mapi (fun i f -> "DSA SHA256 N256 2 " ^ string_of_int i >:: f) sha256_n256_cases2 @ 2378 - List.mapi (fun i f -> "DSA SHA384 N256 2 " ^ string_of_int i >:: f) sha384_n256_cases2 @ 2379 - List.mapi (fun i f -> "DSA SHA512 N256 2 " ^ string_of_int i >:: f) sha512_n256_cases2 @ 2380 - List.mapi (fun i f -> "RFC6979 DSA 1024 " ^ string_of_int i >:: f) rfc6979_dsa_1024 @ 2381 - List.mapi (fun i f -> "RFC6979 DSA 2048 " ^ string_of_int i >:: f) rfc6979_dsa_2048 3214 + List.mapi (fun i f -> "DSA SHA1 " ^ string_of_int i >:: f) sha1_cases 3215 + @ List.mapi (fun i f -> "DSA SHA224 " ^ string_of_int i >:: f) sha224_cases 3216 + @ List.mapi (fun i f -> "DSA SHA256 " ^ string_of_int i >:: f) sha256_cases 3217 + @ List.mapi (fun i f -> "DSA SHA384 " ^ string_of_int i >:: f) sha384_cases 3218 + @ List.mapi (fun i f -> "DSA SHA512 " ^ string_of_int i >:: f) sha512_cases 3219 + @ List.mapi 3220 + (fun i f -> "DSA SHA1 N224 " ^ string_of_int i >:: f) 3221 + sha1_n224_cases 3222 + @ List.mapi 3223 + (fun i f -> "DSA SHA224 N224 " ^ string_of_int i >:: f) 3224 + sha224_n224_cases 3225 + @ List.mapi 3226 + (fun i f -> "DSA SHA256 N224 " ^ string_of_int i >:: f) 3227 + sha256_n224_cases 3228 + @ List.mapi 3229 + (fun i f -> "DSA SHA384 N224 " ^ string_of_int i >:: f) 3230 + sha384_n224_cases 3231 + @ List.mapi 3232 + (fun i f -> "DSA SHA512 N224 " ^ string_of_int i >:: f) 3233 + sha512_n224_cases 3234 + @ List.mapi 3235 + (fun i f -> "DSA SHA1 N256 " ^ string_of_int i >:: f) 3236 + sha1_n256_cases 3237 + @ List.mapi 3238 + (fun i f -> "DSA SHA224 N256 " ^ string_of_int i >:: f) 3239 + sha224_n256_cases 3240 + @ List.mapi 3241 + (fun i f -> "DSA SHA256 N256 " ^ string_of_int i >:: f) 3242 + sha256_n256_cases 3243 + @ List.mapi 3244 + (fun i f -> "DSA SHA384 N256 " ^ string_of_int i >:: f) 3245 + sha384_n256_cases 3246 + @ List.mapi 3247 + (fun i f -> "DSA SHA512 N256 " ^ string_of_int i >:: f) 3248 + sha512_n256_cases 3249 + @ List.mapi 3250 + (fun i f -> "DSA SHA1 N256 2 " ^ string_of_int i >:: f) 3251 + sha1_n256_cases2 3252 + @ List.mapi 3253 + (fun i f -> "DSA SHA224 N256 2 " ^ string_of_int i >:: f) 3254 + sha224_n256_cases2 3255 + @ List.mapi 3256 + (fun i f -> "DSA SHA256 N256 2 " ^ string_of_int i >:: f) 3257 + sha256_n256_cases2 3258 + @ List.mapi 3259 + (fun i f -> "DSA SHA384 N256 2 " ^ string_of_int i >:: f) 3260 + sha384_n256_cases2 3261 + @ List.mapi 3262 + (fun i f -> "DSA SHA512 N256 2 " ^ string_of_int i >:: f) 3263 + sha512_n256_cases2 3264 + @ List.mapi 3265 + (fun i f -> "RFC6979 DSA 1024 " ^ string_of_int i >:: f) 3266 + rfc6979_dsa_1024 3267 + @ List.mapi 3268 + (fun i f -> "RFC6979 DSA 2048 " ^ string_of_int i >:: f) 3269 + rfc6979_dsa_2048
+661 -452
tests/test_ec.ml
··· 29 29 in 30 30 let kp data = 31 31 match P256.Dh.secret_of_octets data with 32 - | Ok (p, s) -> p, s 32 + | Ok (p, s) -> (p, s) 33 33 | Error _ -> assert false 34 34 in 35 35 let d_a, p_a = 36 - kp (of_hex "200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") 36 + kp 37 + (of_hex "200102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") 37 38 and d_b, p_b = 38 - kp (of_hex "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") 39 + kp 40 + (of_hex "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") 39 41 in 40 42 [ 41 43 test ~name:"b*A" d_b p_a ··· 67 69 |> Alcotest.check Alcotest.string __LOC__ expected ) 68 70 in 69 71 let point = 70 - of_hex "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" 72 + of_hex 73 + "046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5" 71 74 in 72 75 [ 73 76 test ~n:0 74 - ~scalar:(of_hex "0000000000000000000000000000000000000000000000000000000000000001") 77 + ~scalar: 78 + (of_hex 79 + "0000000000000000000000000000000000000000000000000000000000000001") 75 80 ~point 76 - ~expected:"96c298d84539a1f4a033eb2d817d0377f240a463e5e6bcf847422ce1f2d1176b"; 81 + ~expected: 82 + "96c298d84539a1f4a033eb2d817d0377f240a463e5e6bcf847422ce1f2d1176b"; 77 83 test ~n:1 78 - ~scalar:(of_hex "0000000000000000000000000000000000000000000000000000000000000002") 84 + ~scalar: 85 + (of_hex 86 + "0000000000000000000000000000000000000000000000000000000000000002") 79 87 ~point 80 - ~expected:"78996647fc480ba6351bf277e26989c0c31ab5040338528a7e4f038d187bf27c"; 88 + ~expected: 89 + "78996647fc480ba6351bf277e26989c0c31ab5040338528a7e4f038d187bf27c"; 81 90 test ~n:2 82 - ~scalar:(of_hex "0000000000000000000000000000000000000000000000000000000000000004") 91 + ~scalar: 92 + (of_hex 93 + "0000000000000000000000000000000000000000000000000000000000000004") 83 94 ~point 84 - ~expected:"5208036b44029350ef965578dbe21f03d02be69e65de2da0bb8fd032354a53e2"; 95 + ~expected: 96 + "5208036b44029350ef965578dbe21f03d02be69e65de2da0bb8fd032354a53e2"; 85 97 test ~n:3 86 - ~scalar:(of_hex "0612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346") 87 - ~point:(of_hex "0462d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf") 88 - ~expected:"854271e19508bc935ab22b95cd2be13a0e78265f528b658b3219028b900d0253"; 98 + ~scalar: 99 + (of_hex 100 + "0612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346") 101 + ~point: 102 + (of_hex 103 + "0462d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf") 104 + ~expected: 105 + "854271e19508bc935ab22b95cd2be13a0e78265f528b658b3219028b900d0253"; 89 106 test ~n:4 90 - ~scalar:(of_hex "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a") 91 - ~point:(of_hex "043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c74fde0a4ef93887469793270eb2ff148287da9265b0334f9e2609aac16e8ad503") 92 - ~expected:"ffffffffffffffffffffffffffffffff3022cfeeffffffffffffffffffffff7f"; 107 + ~scalar: 108 + (of_hex 109 + "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a") 110 + ~point: 111 + (of_hex 112 + "043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c74fde0a4ef93887469793270eb2ff148287da9265b0334f9e2609aac16e8ad503") 113 + ~expected: 114 + "ffffffffffffffffffffffffffffffff3022cfeeffffffffffffffffffffff7f"; 93 115 test ~n:5 94 - ~scalar:(of_hex "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48") 95 - ~point:(of_hex "04000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4") 96 - ~expected:"48e82c9b82c88cb9fc2a5cff9e7c41bc4255ff6bd3814538c9b130877c07e4cf"; 116 + ~scalar: 117 + (of_hex 118 + "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48") 119 + ~point: 120 + (of_hex 121 + "04000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4") 122 + ~expected: 123 + "48e82c9b82c88cb9fc2a5cff9e7c41bc4255ff6bd3814538c9b130877c07e4cf"; 97 124 ] 98 125 99 126 let to_ok_or_error = function Ok _ -> Ok () | Error _ as e -> e ··· 101 128 let point_validation = 102 129 let test ~name ~x ~y ~expected = 103 130 let scalar = 104 - match P256.Dh.secret_of_octets (of_hex "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") with 131 + match 132 + P256.Dh.secret_of_octets 133 + (of_hex 134 + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") 135 + with 105 136 | Ok (p, _) -> p 106 137 | _ -> assert false 107 138 in ··· 117 148 |> Alcotest.check Testable.ok_or_error __LOC__ expected ) 118 149 in 119 150 let zero = String.make 32 '\000' in 120 - let sb = of_hex "66485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4" 151 + let sb = 152 + of_hex "66485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4" 121 153 in 122 154 [ 123 155 test ~name:"Ok" 124 - ~x:(of_hex "62d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26") 125 - ~y:(of_hex "ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf") 156 + ~x: 157 + (of_hex 158 + "62d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26") 159 + ~y: 160 + (of_hex 161 + "ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf") 126 162 ~expected:(Ok ()); 127 163 test ~name:"P=0" 128 - ~x:(of_hex "0000000000000000000000000000000000000000000000000000000000000000") 129 - ~y:(of_hex "0000000000000000000000000000000000000000000000000000000000000000") 164 + ~x: 165 + (of_hex 166 + "0000000000000000000000000000000000000000000000000000000000000000") 167 + ~y: 168 + (of_hex 169 + "0000000000000000000000000000000000000000000000000000000000000000") 130 170 ~expected:(Error `Not_on_curve); 131 171 test ~name:"(0, sqrt(b))" ~x:zero ~y:sb ~expected:(Ok ()); 132 172 test ~name:"out of range" 133 - ~x:(of_hex "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF") 134 - ~y:sb 135 - ~expected:(Error `Invalid_range); 173 + ~x: 174 + (of_hex 175 + "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF") 176 + ~y:sb ~expected:(Error `Invalid_range); 136 177 ] 137 178 138 179 let scalar_validation = ··· 141 182 | Ok _ -> Ok () 142 183 | Error _ as e -> e 143 184 in 144 - [ ("0", `Quick, fun () -> 145 - Alcotest.check Testable.ok_or_error __LOC__ 146 - (Error `Invalid_range) 147 - (ign_sec "0000000000000000000000000000000000000000000000000000000000000000")) ; 148 - ("1", `Quick, fun () -> 149 - Alcotest.check Testable.ok_or_error __LOC__ 150 - (Ok ()) 151 - (ign_sec "0000000000000000000000000000000000000000000000000000000000000001")) ; 152 - ("n-1", `Quick, fun () -> 153 - Alcotest.check Testable.ok_or_error __LOC__ 154 - (Ok ()) 155 - (ign_sec "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550")) ; 156 - ("n", `Quick, fun () -> 157 - Alcotest.check Testable.ok_or_error __LOC__ 158 - (Error `Invalid_range) 159 - (ign_sec "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551")) ; 185 + [ 186 + ( "0", 187 + `Quick, 188 + fun () -> 189 + Alcotest.check Testable.ok_or_error __LOC__ (Error `Invalid_range) 190 + (ign_sec 191 + "0000000000000000000000000000000000000000000000000000000000000000") 192 + ); 193 + ( "1", 194 + `Quick, 195 + fun () -> 196 + Alcotest.check Testable.ok_or_error __LOC__ (Ok ()) 197 + (ign_sec 198 + "0000000000000000000000000000000000000000000000000000000000000001") 199 + ); 200 + ( "n-1", 201 + `Quick, 202 + fun () -> 203 + Alcotest.check Testable.ok_or_error __LOC__ (Ok ()) 204 + (ign_sec 205 + "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550") 206 + ); 207 + ( "n", 208 + `Quick, 209 + fun () -> 210 + Alcotest.check Testable.ok_or_error __LOC__ (Error `Invalid_range) 211 + (ign_sec 212 + "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551") 213 + ); 160 214 ] 161 215 162 216 let ecdsa_gen () = 163 - let d = of_hex "C477F9F6 5C22CCE2 0657FAA5 B2D1D812 2336F851 A508A1ED 04E479C3 4985BF96" in 164 - let p = match 217 + let d = 218 + of_hex 219 + "C477F9F6 5C22CCE2 0657FAA5 B2D1D812 2336F851 A508A1ED 04E479C3 4985BF96" 220 + in 221 + let p = 222 + match 165 223 P256.Dsa.pub_of_octets 166 - (of_hex {|04 224 + (of_hex 225 + {|04 167 226 B7E08AFD FE94BAD3 F1DC8C73 4798BA1C 62B3A0AD 1E9EA2A3 8201CD08 89BC7A19 168 227 3603F747 959DBF7A 4BB226E4 19287290 63ADC7AE 43529E61 B563BBC6 06CC5E09|}) 169 228 with 170 229 | Ok a -> a 171 230 | Error _ -> assert false 172 231 in 173 - let pub = match P256.Dsa.priv_of_octets d with 232 + let pub = 233 + match P256.Dsa.priv_of_octets d with 174 234 | Ok p -> P256.Dsa.pub_of_priv p 175 235 | Error _ -> Alcotest.fail "couldn't decode private key" 176 236 in ··· 180 240 Alcotest.(check bool __LOC__ true (pub_eq pub p)) 181 241 182 242 let ecdsa_sign () = 183 - let d = of_hex "C477F9F6 5C22CCE2 0657FAA5 B2D1D812 2336F851 A508A1ED 04E479C3 4985BF96" 184 - and k = of_hex "7A1A7E52 797FC8CA AA435D2A 4DACE391 58504BF2 04FBE19F 14DBB427 FAEE50AE" 185 - and e = of_hex "A41A41A1 2A799548 211C410C 65D8133A FDE34D28 BDD542E4 B680CF28 99C8A8C4" 243 + let d = 244 + of_hex 245 + "C477F9F6 5C22CCE2 0657FAA5 B2D1D812 2336F851 A508A1ED 04E479C3 4985BF96" 246 + and k = 247 + of_hex 248 + "7A1A7E52 797FC8CA AA435D2A 4DACE391 58504BF2 04FBE19F 14DBB427 FAEE50AE" 249 + and e = 250 + of_hex 251 + "A41A41A1 2A799548 211C410C 65D8133A FDE34D28 BDD542E4 B680CF28 99C8A8C4" 186 252 in 187 - let r = of_hex "2B42F576 D07F4165 FF65D1F3 B1500F81 E44C316F 1F0B3EF5 7325B69A CA46104F" 188 - and s = of_hex "DC42C212 2D6392CD 3E3A993A 89502A81 98C1886F E69D262C 4B329BDB 6B63FAF1" 253 + let r = 254 + of_hex 255 + "2B42F576 D07F4165 FF65D1F3 B1500F81 E44C316F 1F0B3EF5 7325B69A CA46104F" 256 + and s = 257 + of_hex 258 + "DC42C212 2D6392CD 3E3A993A 89502A81 98C1886F E69D262C 4B329BDB 6B63FAF1" 189 259 in 190 - let key = match P256.Dsa.priv_of_octets d with 260 + let key = 261 + match P256.Dsa.priv_of_octets d with 191 262 | Ok p -> p 192 263 | Error _ -> Alcotest.fail "couldn't decode private key" 193 264 in 194 - let (r', s') = P256.Dsa.sign ~key ~k e in 265 + let r', s' = P256.Dsa.sign ~key ~k e in 195 266 Alcotest.(check bool __LOC__ true (String.equal r r' && String.equal s s')) 196 267 197 268 let ecdsa_verify () = 198 269 let key = 199 - match P256.Dsa.pub_of_octets 200 - (of_hex {|04 270 + match 271 + P256.Dsa.pub_of_octets 272 + (of_hex 273 + {|04 201 274 B7E08AFD FE94BAD3 F1DC8C73 4798BA1C 62B3A0AD 1E9EA2A3 8201CD08 89BC7A19 202 275 3603F747 959DBF7A 4BB226E4 19287290 63ADC7AE 43529E61 B563BBC6 06CC5E09|}) 203 276 with 204 277 | Ok a -> a 205 278 | Error _ -> assert false 206 - and e = of_hex "A41A41A1 2A799548 211C410C 65D8133A FDE34D28 BDD542E4 B680CF28 99C8A8C4" 207 - and r = of_hex "2B42F576 D07F4165 FF65D1F3 B1500F81 E44C316F 1F0B3EF5 7325B69A CA46104F" 208 - and s = of_hex "DC42C212 2D6392CD 3E3A993A 89502A81 98C1886F E69D262C 4B329BDB 6B63FAF1" 279 + and e = 280 + of_hex 281 + "A41A41A1 2A799548 211C410C 65D8133A FDE34D28 BDD542E4 B680CF28 99C8A8C4" 282 + and r = 283 + of_hex 284 + "2B42F576 D07F4165 FF65D1F3 B1500F81 E44C316F 1F0B3EF5 7325B69A CA46104F" 285 + and s = 286 + of_hex 287 + "DC42C212 2D6392CD 3E3A993A 89502A81 98C1886F E69D262C 4B329BDB 6B63FAF1" 209 288 in 210 289 Alcotest.(check bool __LOC__ true (P256.Dsa.verify ~key (r, s) e)) 211 290 212 - let ecdsa = [ 213 - (* from https://csrc.nist.rip/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf *) 214 - "ECDSA gen", `Quick, ecdsa_gen ; 215 - "ECDSA sign", `Quick, ecdsa_sign ; 216 - "ECDSA verify", `Quick, ecdsa_verify ; 217 - ] 291 + let ecdsa = 292 + [ 293 + (* from https://csrc.nist.rip/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf *) 294 + ("ECDSA gen", `Quick, ecdsa_gen); 295 + ("ECDSA sign", `Quick, ecdsa_sign); 296 + ("ECDSA verify", `Quick, ecdsa_verify); 297 + ] 218 298 219 - let pub_key_compression (module Dsa:Crypto_ec.Dsa) () = 299 + let pub_key_compression (module Dsa : Crypto_ec.Dsa) () = 220 300 for _ = 1 to 20 do 221 301 let _, pub = Dsa.generate () in 222 302 let compressed = Dsa.pub_to_octets ~compress:true pub in 223 303 let decompressed = Dsa.pub_of_octets compressed in 224 304 match decompressed with 225 - | Ok decompressed -> 305 + | Ok decompressed -> 226 306 let p1 = Dsa.pub_to_octets pub in 227 307 let p2 = Dsa.pub_to_octets decompressed in 228 308 Alcotest.(check string __LOC__ p1 p2); 229 309 let prefix = String.get_uint8 compressed 0 in 230 - let expected = 2 + String.(get_uint8 p1 (length p1 - 1)) land 1 in 231 - Alcotest.(check int __LOC__ expected prefix); 232 - | Error e -> Alcotest.failf "%a" pp_error e 310 + let expected = 2 + (String.(get_uint8 p1 (length p1 - 1)) land 1) in 311 + Alcotest.(check int __LOC__ expected prefix) 312 + | Error e -> Alcotest.failf "%a" pp_error e 233 313 done 234 314 235 315 let ecdsa_rfc6979_p256 = 236 316 (* A.2.5 - P 256 *) 237 317 let priv, pub = 238 - let data = of_hex "C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721" in 318 + let data = 319 + of_hex "C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721" 320 + in 239 321 match P256.Dsa.priv_of_octets data with 240 - | Ok p -> p, P256.Dsa.pub_of_priv p 322 + | Ok p -> (p, P256.Dsa.pub_of_priv p) 241 323 | Error _ -> assert false 242 324 in 243 325 let pub_rfc () = 244 326 let fst = String.make 1 '\004' in 245 - let ux = of_hex "60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6" 246 - and uy = of_hex "7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299" 327 + let ux = 328 + of_hex "60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6" 329 + and uy = 330 + of_hex "7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299" 247 331 in 248 332 match P256.Dsa.pub_of_octets (fst ^ ux ^ uy) with 249 333 | Ok p -> 250 - let pub_eq = 251 - String.equal (P256.Dsa.pub_to_octets pub) (P256.Dsa.pub_to_octets p) 252 - in 253 - Alcotest.(check bool __LOC__ true pub_eq) 334 + let pub_eq = 335 + String.equal (P256.Dsa.pub_to_octets pub) (P256.Dsa.pub_to_octets p) 336 + in 337 + Alcotest.(check bool __LOC__ true pub_eq) 254 338 | Error _ -> Alcotest.fail "bad public key" 255 339 in 256 340 let case (type a) (hash : a Digestif.hash) ~message ~k ~r ~s () = 257 341 let msg = 258 342 let h = Digestif.(digest_string hash message |> to_raw_string hash) in 259 343 String.sub h 0 (min (String.length h) 32) 260 - and k = of_hex k 261 - in 344 + and k = of_hex k in 262 345 let k' = 263 346 let module H = (val Digestif.module_of hash) in 264 347 let module K = P256.Dsa.K_gen (H) in ··· 271 354 let sig' = P256.Dsa.sign ~key:priv ~k msg in 272 355 Alcotest.(check bool __LOC__ true (sig_eq sig')) 273 356 in 274 - let cases = [ 275 - case Digestif.sha1 ~message:"sample" 276 - ~k:"882905F1227FD620FBF2ABF21244F0BA83D0DC3A9103DBBEE43A1FB858109DB4" 277 - ~r:"61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D32" 278 - ~s:"6D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB" ; 279 - case Digestif.sha224 ~message:"sample" 280 - ~k:"103F90EE9DC52E5E7FB5132B7033C63066D194321491862059967C715985D473" 281 - ~r:"53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3F" 282 - ~s:"B9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C" ; 283 - case Digestif.sha256 ~message:"sample" 284 - ~k:"A6E3C57DD01ABE90086538398355DD4C3B17AA873382B0F24D6129493D8AAD60" 285 - ~r:"EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716" 286 - ~s:"F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8" ; 287 - case Digestif.sha384 ~message:"sample" 288 - ~k:"09F634B188CEFD98E7EC88B1AA9852D734D0BC272F7D2A47DECC6EBEB375AAD4" 289 - ~r:"0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719" 290 - ~s:"4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954" ; 291 - case Digestif.sha512 ~message:"sample" 292 - ~k:"5FA81C63109BADB88C1F367B47DA606DA28CAD69AA22C4FE6AD7DF73A7173AA5" 293 - ~r:"8496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F00" 294 - ~s:"2362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE" ; 295 - case Digestif.sha1 ~message:"test" 296 - ~k:"8C9520267C55D6B980DF741E56B4ADEE114D84FBFA2E62137954164028632A2E" 297 - ~r:"0CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A89" 298 - ~s:"01B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1" ; 299 - case Digestif.sha224 ~message:"test" 300 - ~k:"669F4426F2688B8BE0DB3A6BD1989BDAEFFF84B649EEB84F3DD26080F667FAA7" 301 - ~r:"C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692" 302 - ~s:"C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D" ; 303 - case Digestif.sha256 ~message:"test" 304 - ~k:"D16B6AE827F17175E040871A1C7EC3500192C4C92677336EC2537ACAEE0008E0" 305 - ~r:"F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367" 306 - ~s:"019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083" ; 307 - case Digestif.sha384 ~message:"test" 308 - ~k:"16AEFFA357260B04B1DD199693960740066C1A8F3E8EDD79070AA914D361B3B8" 309 - ~r:"83910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB6" 310 - ~s:"8DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C" ; 311 - case Digestif.sha512 ~message:"test" 312 - ~k:"6915D11632ACA3C40D5D51C08DAF9C555933819548784480E93499000D9F0B7F" 313 - ~r:"461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A04" 314 - ~s:"39AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55" ; 315 - ] in 316 - ("public key matches", `Quick, pub_rfc) :: 317 - ("public key compression and decompression", `Quick, (pub_key_compression (module P256.Dsa))) :: 318 - List.mapi (fun i c -> "RFC 6979 A.2.5 " ^ string_of_int i, `Quick, c) cases 357 + let cases = 358 + [ 359 + case Digestif.sha1 ~message:"sample" 360 + ~k:"882905F1227FD620FBF2ABF21244F0BA83D0DC3A9103DBBEE43A1FB858109DB4" 361 + ~r:"61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D32" 362 + ~s:"6D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB"; 363 + case Digestif.sha224 ~message:"sample" 364 + ~k:"103F90EE9DC52E5E7FB5132B7033C63066D194321491862059967C715985D473" 365 + ~r:"53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3F" 366 + ~s:"B9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C"; 367 + case Digestif.sha256 ~message:"sample" 368 + ~k:"A6E3C57DD01ABE90086538398355DD4C3B17AA873382B0F24D6129493D8AAD60" 369 + ~r:"EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716" 370 + ~s:"F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8"; 371 + case Digestif.sha384 ~message:"sample" 372 + ~k:"09F634B188CEFD98E7EC88B1AA9852D734D0BC272F7D2A47DECC6EBEB375AAD4" 373 + ~r:"0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719" 374 + ~s:"4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954"; 375 + case Digestif.sha512 ~message:"sample" 376 + ~k:"5FA81C63109BADB88C1F367B47DA606DA28CAD69AA22C4FE6AD7DF73A7173AA5" 377 + ~r:"8496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F00" 378 + ~s:"2362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE"; 379 + case Digestif.sha1 ~message:"test" 380 + ~k:"8C9520267C55D6B980DF741E56B4ADEE114D84FBFA2E62137954164028632A2E" 381 + ~r:"0CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A89" 382 + ~s:"01B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1"; 383 + case Digestif.sha224 ~message:"test" 384 + ~k:"669F4426F2688B8BE0DB3A6BD1989BDAEFFF84B649EEB84F3DD26080F667FAA7" 385 + ~r:"C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692" 386 + ~s:"C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D"; 387 + case Digestif.sha256 ~message:"test" 388 + ~k:"D16B6AE827F17175E040871A1C7EC3500192C4C92677336EC2537ACAEE0008E0" 389 + ~r:"F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367" 390 + ~s:"019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083"; 391 + case Digestif.sha384 ~message:"test" 392 + ~k:"16AEFFA357260B04B1DD199693960740066C1A8F3E8EDD79070AA914D361B3B8" 393 + ~r:"83910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB6" 394 + ~s:"8DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C"; 395 + case Digestif.sha512 ~message:"test" 396 + ~k:"6915D11632ACA3C40D5D51C08DAF9C555933819548784480E93499000D9F0B7F" 397 + ~r:"461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A04" 398 + ~s:"39AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55"; 399 + ] 400 + in 401 + ("public key matches", `Quick, pub_rfc) 402 + :: ( "public key compression and decompression", 403 + `Quick, 404 + pub_key_compression (module P256.Dsa) ) 405 + :: List.mapi 406 + (fun i c -> ("RFC 6979 A.2.5 " ^ string_of_int i, `Quick, c)) 407 + cases 319 408 320 409 let ecdsa_rfc6979_p384 = 321 410 (* A.2.6 - P 384 *) 322 411 let priv, pub = 323 - let data = of_hex "6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5" in 412 + let data = 413 + of_hex 414 + "6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5" 415 + in 324 416 match P384.Dsa.priv_of_octets data with 325 - | Ok p -> p, P384.Dsa.pub_of_priv p 417 + | Ok p -> (p, P384.Dsa.pub_of_priv p) 326 418 | Error _ -> assert false 327 419 in 328 420 let pub_rfc () = 329 421 let fst = String.make 1 '\004' in 330 - let ux = of_hex "EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13" 331 - and uy = of_hex "8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720" 422 + let ux = 423 + of_hex 424 + "EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC13" 425 + and uy = 426 + of_hex 427 + "8015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720" 332 428 in 333 429 match P384.Dsa.pub_of_octets (fst ^ ux ^ uy) with 334 430 | Ok p -> 335 - let pub_eq = 336 - String.equal (P384.Dsa.pub_to_octets pub) (P384.Dsa.pub_to_octets p) 337 - in 338 - Alcotest.(check bool __LOC__ true pub_eq) 431 + let pub_eq = 432 + String.equal (P384.Dsa.pub_to_octets pub) (P384.Dsa.pub_to_octets p) 433 + in 434 + Alcotest.(check bool __LOC__ true pub_eq) 339 435 | Error _ -> Alcotest.fail "bad public key" 340 436 in 341 437 let case (type a) (hash : a Digestif.hash) ~message ~k ~r ~s () = 342 438 let msg = 343 439 let h = Digestif.(digest_string hash message |> to_raw_string hash) in 344 440 String.sub h 0 (min (String.length h) 48) 345 - and k = of_hex k 346 - in 441 + and k = of_hex k in 347 442 let k' = 348 443 let module H = (val Digestif.module_of hash) in 349 444 let module K = P384.Dsa.K_gen (H) in ··· 356 451 let sig' = P384.Dsa.sign ~key:priv ~k msg in 357 452 Alcotest.(check bool __LOC__ true (sig_eq sig')) 358 453 in 359 - let cases = [ 360 - case Digestif.sha1 ~message:"sample" 361 - ~k:"4471EF7518BB2C7C20F62EAE1C387AD0C5E8E470995DB4ACF694466E6AB09663 362 - 0F29E5938D25106C3C340045A2DB01A7" 363 - ~r:"EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA3 364 - 7B9BA002899F6FDA3A4A9386790D4EB2" 365 - ~s:"A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF 366 - 26F49CA031D4857570CCB5CA4424A443"; 367 - 368 - case Digestif.sha224 ~message:"sample" 369 - ~k:"A4E4D2F0E729EB786B31FC20AD5D849E304450E0AE8E3E341134A5C1AFA03CAB 370 - 8083EE4E3C45B06A5899EA56C51B5879" 371 - ~r:"42356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366 372 - 450F76EE3DE43F5A125333A6BE060122" 373 - ~s:"9DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E483 374 - 4C082C03D83028EFBF93A3C23940CA8D"; 375 - 376 - case Digestif.sha256 ~message:"sample" 377 - ~k:"180AE9F9AEC5438A44BC159A1FCB277C7BE54FA20E7CF404B490650A8ACC414E 378 - 375572342863C899F9F2EDF9747A9B60" 379 - ~r:"21B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33 380 - BDE1E888E63355D92FA2B3C36D8FB2CD" 381 - ~s:"F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEB 382 - EFDC63ECCD1AC42EC0CB8668A4FA0AB0"; 383 - 384 - case Digestif.sha384 ~message:"sample" 385 - ~k:"94ED910D1A099DAD3254E9242AE85ABDE4BA15168EAF0CA87A555FD56D10FBCA 386 - 2907E3E83BA95368623B8C4686915CF9" 387 - ~r:"94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C 388 - 81A648152E44ACF96E36DD1E80FABE46" 389 - ~s:"99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94F 390 - A329C145786E679E7B82C71A38628AC8"; 391 - 392 - case Digestif.sha512 ~message:"sample" 393 - ~k:"92FC3C7183A883E24216D1141F1A8976C5B0DD797DFA597E3D7B32198BD35331 394 - A4E966532593A52980D0E3AAA5E10EC3" 395 - ~r:"ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799C 396 - FE30F35CC900056D7C99CD7882433709" 397 - ~s:"512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112 398 - DC7CC3EF3446DEFCEB01A45C2667FDD5"; 399 - 400 - case Digestif.sha1 ~message:"test" 401 - ~k:"66CC2C8F4D303FC962E5FF6A27BD79F84EC812DDAE58CF5243B64A4AD8094D47 402 - EC3727F3A3C186C15054492E30698497" 403 - ~r:"4BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678 404 - ACD9D29876DAF46638645F7F404B11C7" 405 - ~s:"D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A29916 406 - 95BA1C84541327E966FA7B50F7382282"; 407 - 408 - case Digestif.sha224 ~message:"test" 409 - ~k:"18FA39DB95AA5F561F30FA3591DC59C0FA3653A80DAFFA0B48D1A4C6DFCBFF6E 410 - 3D33BE4DC5EB8886A8ECD093F2935726" 411 - ~r:"E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E624 412 - 64A9A817C47FF78B8C11066B24080E72" 413 - ~s:"07041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C614 414 - 1C53EA5ABEF0D8231077A04540A96B66"; 415 - 416 - case Digestif.sha256 ~message:"test" 417 - ~k:"0CFAC37587532347DC3389FDC98286BBA8C73807285B184C83E62E26C401C0FA 418 - A48DD070BA79921A3457ABFF2D630AD7" 419 - ~r:"6D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559 420 - F918EEDAF2293BE5B475CC8F0188636B" 421 - ~s:"2D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D 422 - 51AB373F9845C0514EEFB14024787265"; 423 - 424 - case Digestif.sha384 ~message:"test" 425 - ~k:"015EE46A5BF88773ED9123A5AB0807962D193719503C527B031B4C2D225092AD 426 - A71F4A459BC0DA98ADB95837DB8312EA" 427 - ~r:"8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB 428 - 0542A7F0812998DA8F1DD3CA3CF023DB" 429 - ~s:"DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E0 430 - 6A739F040649A667BF3B828246BAA5A5"; 431 - 432 - case Digestif.sha512 ~message:"test" 433 - ~k:"3780C4F67CB15518B6ACAE34C9F83568D2E12E47DEAB6C50A4E4EE5319D1E8CE 434 - 0E2CC8A136036DC4B9C00E6888F66B6C" 435 - ~r:"A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D0 436 - 6FB6495CD21B4B6E340FC236584FB277" 437 - ~s:"976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B22463 438 - 4A2092CD3792E0159AD9CEE37659C736" 439 - ] in 440 - ("public key matches", `Quick, pub_rfc) :: 441 - ("public key compression and decompression", `Quick, pub_key_compression (module P384.Dsa)) :: 442 - List.mapi (fun i c -> "RFC 6979 A.2.6 " ^ string_of_int i, `Quick, c) cases 454 + let cases = 455 + [ 456 + case Digestif.sha1 ~message:"sample" 457 + ~k: 458 + "4471EF7518BB2C7C20F62EAE1C387AD0C5E8E470995DB4ACF694466E6AB09663\n\ 459 + \ 0F29E5938D25106C3C340045A2DB01A7" 460 + ~r: 461 + "EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA3\n\ 462 + \ 7B9BA002899F6FDA3A4A9386790D4EB2" 463 + ~s: 464 + "A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF\n\ 465 + \ 26F49CA031D4857570CCB5CA4424A443"; 466 + case Digestif.sha224 ~message:"sample" 467 + ~k: 468 + "A4E4D2F0E729EB786B31FC20AD5D849E304450E0AE8E3E341134A5C1AFA03CAB\n\ 469 + \ 8083EE4E3C45B06A5899EA56C51B5879" 470 + ~r: 471 + "42356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366\n\ 472 + \ 450F76EE3DE43F5A125333A6BE060122" 473 + ~s: 474 + "9DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E483\n\ 475 + \ 4C082C03D83028EFBF93A3C23940CA8D"; 476 + case Digestif.sha256 ~message:"sample" 477 + ~k: 478 + "180AE9F9AEC5438A44BC159A1FCB277C7BE54FA20E7CF404B490650A8ACC414E\n\ 479 + \ 375572342863C899F9F2EDF9747A9B60" 480 + ~r: 481 + "21B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33\n\ 482 + \ BDE1E888E63355D92FA2B3C36D8FB2CD" 483 + ~s: 484 + "F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEB\n\ 485 + \ EFDC63ECCD1AC42EC0CB8668A4FA0AB0"; 486 + case Digestif.sha384 ~message:"sample" 487 + ~k: 488 + "94ED910D1A099DAD3254E9242AE85ABDE4BA15168EAF0CA87A555FD56D10FBCA\n\ 489 + \ 2907E3E83BA95368623B8C4686915CF9" 490 + ~r: 491 + "94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C\n\ 492 + \ 81A648152E44ACF96E36DD1E80FABE46" 493 + ~s: 494 + "99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94F\n\ 495 + \ A329C145786E679E7B82C71A38628AC8"; 496 + case Digestif.sha512 ~message:"sample" 497 + ~k: 498 + "92FC3C7183A883E24216D1141F1A8976C5B0DD797DFA597E3D7B32198BD35331\n\ 499 + \ A4E966532593A52980D0E3AAA5E10EC3" 500 + ~r: 501 + "ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799C\n\ 502 + \ FE30F35CC900056D7C99CD7882433709" 503 + ~s: 504 + "512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112\n\ 505 + \ DC7CC3EF3446DEFCEB01A45C2667FDD5"; 506 + case Digestif.sha1 ~message:"test" 507 + ~k: 508 + "66CC2C8F4D303FC962E5FF6A27BD79F84EC812DDAE58CF5243B64A4AD8094D47\n\ 509 + \ EC3727F3A3C186C15054492E30698497" 510 + ~r: 511 + "4BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678\n\ 512 + \ ACD9D29876DAF46638645F7F404B11C7" 513 + ~s: 514 + "D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A29916\n\ 515 + \ 95BA1C84541327E966FA7B50F7382282"; 516 + case Digestif.sha224 ~message:"test" 517 + ~k: 518 + "18FA39DB95AA5F561F30FA3591DC59C0FA3653A80DAFFA0B48D1A4C6DFCBFF6E\n\ 519 + \ 3D33BE4DC5EB8886A8ECD093F2935726" 520 + ~r: 521 + "E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E624\n\ 522 + \ 64A9A817C47FF78B8C11066B24080E72" 523 + ~s: 524 + "07041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C614\n\ 525 + \ 1C53EA5ABEF0D8231077A04540A96B66"; 526 + case Digestif.sha256 ~message:"test" 527 + ~k: 528 + "0CFAC37587532347DC3389FDC98286BBA8C73807285B184C83E62E26C401C0FA\n\ 529 + \ A48DD070BA79921A3457ABFF2D630AD7" 530 + ~r: 531 + "6D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559\n\ 532 + \ F918EEDAF2293BE5B475CC8F0188636B" 533 + ~s: 534 + "2D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D\n\ 535 + \ 51AB373F9845C0514EEFB14024787265"; 536 + case Digestif.sha384 ~message:"test" 537 + ~k: 538 + "015EE46A5BF88773ED9123A5AB0807962D193719503C527B031B4C2D225092AD\n\ 539 + \ A71F4A459BC0DA98ADB95837DB8312EA" 540 + ~r: 541 + "8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB\n\ 542 + \ 0542A7F0812998DA8F1DD3CA3CF023DB" 543 + ~s: 544 + "DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E0\n\ 545 + \ 6A739F040649A667BF3B828246BAA5A5"; 546 + case Digestif.sha512 ~message:"test" 547 + ~k: 548 + "3780C4F67CB15518B6ACAE34C9F83568D2E12E47DEAB6C50A4E4EE5319D1E8CE\n\ 549 + \ 0E2CC8A136036DC4B9C00E6888F66B6C" 550 + ~r: 551 + "A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D0\n\ 552 + \ 6FB6495CD21B4B6E340FC236584FB277" 553 + ~s: 554 + "976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B22463\n\ 555 + \ 4A2092CD3792E0159AD9CEE37659C736"; 556 + ] 557 + in 558 + ("public key matches", `Quick, pub_rfc) 559 + :: ( "public key compression and decompression", 560 + `Quick, 561 + pub_key_compression (module P384.Dsa) ) 562 + :: List.mapi 563 + (fun i c -> ("RFC 6979 A.2.6 " ^ string_of_int i, `Quick, c)) 564 + cases 443 565 444 566 let ecdsa_rfc6979_p521 = 445 567 (* A.2.7 - P 521 *) 446 - let of_h b = of_hex ((String.make 1 '0') ^ b) in 568 + let of_h b = of_hex (String.make 1 '0' ^ b) in 447 569 let priv, pub = 448 - let data = of_h 449 - "0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75C 450 - AA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83 451 - 538" 570 + let data = 571 + of_h 572 + "0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75C\n\ 573 + \ \ 574 + AA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83\n\ 575 + \ 538" 452 576 in 453 577 match P521.Dsa.priv_of_octets data with 454 - | Ok p -> p, P521.Dsa.pub_of_priv p 578 + | Ok p -> (p, P521.Dsa.pub_of_priv p) 455 579 | Error _ -> assert false 456 580 in 457 581 let pub_rfc () = 458 582 let fst = String.make 1 '\004' in 459 - let ux = of_h 460 - "1894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD3 461 - 71123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F502 462 - 3A4" 463 - and uy = of_h 464 - "0493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A2 465 - 8A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDF 466 - CF5" 583 + let ux = 584 + of_h 585 + "1894550D0785932E00EAA23B694F213F8C3121F86DC97A04E5A7167DB4E5BCD3\n\ 586 + \ \ 587 + 71123D46E45DB6B5D5370A7F20FB633155D38FFA16D2BD761DCAC474B9A2F502\n\ 588 + \ 3A4" 589 + and uy = 590 + of_h 591 + "0493101C962CD4D2FDDF782285E64584139C2F91B47F87FF82354D6630F746A2\n\ 592 + \ \ 593 + 8A0DB25741B5B34A828008B22ACC23F924FAAFBD4D33F81EA66956DFEAA2BFDF\n\ 594 + \ CF5" 467 595 in 468 596 match P521.Dsa.pub_of_octets (fst ^ ux ^ uy) with 469 597 | Ok p -> 470 - let pub_eq = 471 - String.equal (P521.Dsa.pub_to_octets pub) (P521.Dsa.pub_to_octets p) 472 - in 473 - Alcotest.(check bool __LOC__ true pub_eq) 598 + let pub_eq = 599 + String.equal (P521.Dsa.pub_to_octets pub) (P521.Dsa.pub_to_octets p) 600 + in 601 + Alcotest.(check bool __LOC__ true pub_eq) 474 602 | Error _ -> Alcotest.fail "bad public key" 475 603 in 476 604 let case (type a) (hash : a Digestif.hash) ~message ~k ~r ~s () = 477 605 let msg = Digestif.(digest_string hash message |> to_raw_string hash) 478 - and k = of_h k 479 - in 606 + and k = of_h k in 480 607 let k' = 481 608 let module H = (val Digestif.module_of hash) in 482 609 let module K = P521.Dsa.K_gen (H) in ··· 489 616 let sig' = P521.Dsa.sign ~key:priv ~k msg in 490 617 Alcotest.(check bool __LOC__ true (sig_eq sig')) 491 618 in 492 - let cases = [ 493 - 494 - case Digestif.sha1 ~message:"sample" 495 - ~k:"089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB 496 - 42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D 497 - 0F9" 498 - ~r:"0343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910 499 - FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D 500 - 75D" 501 - ~s:"0E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D 502 - 5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5 503 - D16"; 504 - 505 - case Digestif.sha224 ~message:"sample" 506 - ~k:"121415EC2CD7726330A61F7F3FA5DE14BE9436019C4DB8CB4041F3B54CF31BE0 507 - 493EE3F427FB906393D895A19C9523F3A1D54BB8702BD4AA9C99DAB2597B9211 508 - 3F3" 509 - ~r:"1776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A3 510 - 0715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2E 511 - D2E" 512 - ~s:"050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17B 513 - A41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B 514 - 41F"; 515 - 516 - case Digestif.sha256 ~message:"sample" 517 - ~k:"0EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C3257576 518 - 1793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E 519 - 1A0" 520 - ~r:"1511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659 521 - D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E 522 - 1A7" 523 - ~s:"04A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916 524 - E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7E 525 - CFC"; 526 - 527 - case Digestif.sha384 ~message:"sample" 528 - ~k:"1546A108BC23A15D6F21872F7DED661FA8431DDBD922D0DCDB77CC878C8553FF 529 - AD064C95A920A750AC9137E527390D2D92F153E66196966EA554D9ADFCB109C4 530 - 211" 531 - ~r:"1EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4 532 - B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C67 533 - 451" 534 - ~s:"1F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5 535 - FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65 536 - D61"; 537 - 538 - case Digestif.sha512 ~message:"sample" 539 - ~k:"1DAE2EA071F8110DC26882D4D5EAE0621A3256FC8847FB9022E2B7D28E6F1019 540 - 8B1574FDD03A9053C08A1854A168AA5A57470EC97DD5CE090124EF52A2F7ECBF 541 - FD3" 542 - ~r:"0C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F1 543 - 74E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E37 544 - 7FA" 545 - ~s:"0617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF2 546 - 82623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A 547 - 67A"; 548 - 549 - case Digestif.sha1 ~message:"test" 550 - ~k:"0BB9F2BF4FE1038CCF4DABD7139A56F6FD8BB1386561BD3C6A4FC818B20DF5DD 551 - BA80795A947107A1AB9D12DAA615B1ADE4F7A9DC05E8E6311150F47F5C57CE8B 552 - 222" 553 - ~r:"13BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0 554 - 693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D0 555 - 367" 556 - ~s:"1E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90 557 - F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC91679 558 - 7FF"; 559 - 560 - case Digestif.sha224 ~message:"test" 561 - ~k:"040D09FCF3C8A5F62CF4FB223CBBB2B9937F6B0577C27020A99602C25A011369 562 - 87E452988781484EDBBCF1C47E554E7FC901BC3085E5206D9F619CFF07E73D6F 563 - 706" 564 - ~r:"1C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086 565 - BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE1 566 - 7FB" 567 - ~s:"177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5 568 - BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD51 569 - 9A4"; 570 - 571 - case Digestif.sha256 ~message:"test" 572 - ~k:"01DE74955EFAABC4C4F17F8E84D881D1310B5392D7700275F82F145C61E84384 573 - 1AF09035BF7A6210F5A431A6A9E81C9323354A9E69135D44EBD2FCAA7731B909 574 - 258" 575 - ~r:"00E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D807104 576 - 2EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656 577 - AA8" 578 - ~s:"0CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9 579 - FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694 580 - E86"; 581 - 582 - case Digestif.sha384 ~message:"test" 583 - ~k:"1F1FC4A349A7DA9A9E116BFDD055DC08E78252FF8E23AC276AC88B1770AE0B5D 584 - CEB1ED14A4916B769A523CE1E90BA22846AF11DF8B300C38818F713DADD85DE0 585 - C88" 586 - ~r:"14BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C 587 - 89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF60755 588 - 78C" 589 - ~s:"133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0E 590 - D94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B 591 - 979"; 592 - 593 - case Digestif.sha512 ~message:"test" 594 - ~k:"16200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1 595 - B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC 596 - 56D" 597 - ~r:"13E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10 598 - CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47E 599 - E6D" 600 - ~s:"1FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78 601 - A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4D 602 - CE3" 603 - 604 - ] in 605 - ("public key matches", `Quick, pub_rfc) :: 606 - ("public key compression and decompression", `Quick, pub_key_compression (module P521.Dsa)) :: 607 - List.mapi (fun i c -> "RFC 6979 A.2.7 " ^ string_of_int i, `Quick, c) cases 619 + let cases = 620 + [ 621 + case Digestif.sha1 ~message:"sample" 622 + ~k: 623 + "089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB\n\ 624 + \ \ 625 + 42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D\n\ 626 + \ 0F9" 627 + ~r: 628 + "0343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910\n\ 629 + \ \ 630 + FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D\n\ 631 + \ 75D" 632 + ~s: 633 + "0E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D\n\ 634 + \ \ 635 + 5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5\n\ 636 + \ D16"; 637 + case Digestif.sha224 ~message:"sample" 638 + ~k: 639 + "121415EC2CD7726330A61F7F3FA5DE14BE9436019C4DB8CB4041F3B54CF31BE0\n\ 640 + \ \ 641 + 493EE3F427FB906393D895A19C9523F3A1D54BB8702BD4AA9C99DAB2597B9211\n\ 642 + \ 3F3" 643 + ~r: 644 + "1776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A3\n\ 645 + \ \ 646 + 0715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2E\n\ 647 + \ D2E" 648 + ~s: 649 + "050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17B\n\ 650 + \ \ 651 + A41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B\n\ 652 + \ 41F"; 653 + case Digestif.sha256 ~message:"sample" 654 + ~k: 655 + "0EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C3257576\n\ 656 + \ \ 657 + 1793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E\n\ 658 + \ 1A0" 659 + ~r: 660 + "1511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659\n\ 661 + \ \ 662 + D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E\n\ 663 + \ 1A7" 664 + ~s: 665 + "04A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916\n\ 666 + \ \ 667 + E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7E\n\ 668 + \ CFC"; 669 + case Digestif.sha384 ~message:"sample" 670 + ~k: 671 + "1546A108BC23A15D6F21872F7DED661FA8431DDBD922D0DCDB77CC878C8553FF\n\ 672 + \ \ 673 + AD064C95A920A750AC9137E527390D2D92F153E66196966EA554D9ADFCB109C4\n\ 674 + \ 211" 675 + ~r: 676 + "1EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4\n\ 677 + \ \ 678 + B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C67\n\ 679 + \ 451" 680 + ~s: 681 + "1F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5\n\ 682 + \ \ 683 + FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65\n\ 684 + \ D61"; 685 + case Digestif.sha512 ~message:"sample" 686 + ~k: 687 + "1DAE2EA071F8110DC26882D4D5EAE0621A3256FC8847FB9022E2B7D28E6F1019\n\ 688 + \ \ 689 + 8B1574FDD03A9053C08A1854A168AA5A57470EC97DD5CE090124EF52A2F7ECBF\n\ 690 + \ FD3" 691 + ~r: 692 + "0C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F1\n\ 693 + \ \ 694 + 74E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E37\n\ 695 + \ 7FA" 696 + ~s: 697 + "0617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF2\n\ 698 + \ \ 699 + 82623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A\n\ 700 + \ 67A"; 701 + case Digestif.sha1 ~message:"test" 702 + ~k: 703 + "0BB9F2BF4FE1038CCF4DABD7139A56F6FD8BB1386561BD3C6A4FC818B20DF5DD\n\ 704 + \ \ 705 + BA80795A947107A1AB9D12DAA615B1ADE4F7A9DC05E8E6311150F47F5C57CE8B\n\ 706 + \ 222" 707 + ~r: 708 + "13BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0\n\ 709 + \ \ 710 + 693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D0\n\ 711 + \ 367" 712 + ~s: 713 + "1E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90\n\ 714 + \ \ 715 + F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC91679\n\ 716 + \ 7FF"; 717 + case Digestif.sha224 ~message:"test" 718 + ~k: 719 + "040D09FCF3C8A5F62CF4FB223CBBB2B9937F6B0577C27020A99602C25A011369\n\ 720 + \ \ 721 + 87E452988781484EDBBCF1C47E554E7FC901BC3085E5206D9F619CFF07E73D6F\n\ 722 + \ 706" 723 + ~r: 724 + "1C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086\n\ 725 + \ \ 726 + BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE1\n\ 727 + \ 7FB" 728 + ~s: 729 + "177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5\n\ 730 + \ \ 731 + BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD51\n\ 732 + \ 9A4"; 733 + case Digestif.sha256 ~message:"test" 734 + ~k: 735 + "01DE74955EFAABC4C4F17F8E84D881D1310B5392D7700275F82F145C61E84384\n\ 736 + \ \ 737 + 1AF09035BF7A6210F5A431A6A9E81C9323354A9E69135D44EBD2FCAA7731B909\n\ 738 + \ 258" 739 + ~r: 740 + "00E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D807104\n\ 741 + \ \ 742 + 2EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656\n\ 743 + \ AA8" 744 + ~s: 745 + "0CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9\n\ 746 + \ \ 747 + FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694\n\ 748 + \ E86"; 749 + case Digestif.sha384 ~message:"test" 750 + ~k: 751 + "1F1FC4A349A7DA9A9E116BFDD055DC08E78252FF8E23AC276AC88B1770AE0B5D\n\ 752 + \ \ 753 + CEB1ED14A4916B769A523CE1E90BA22846AF11DF8B300C38818F713DADD85DE0\n\ 754 + \ C88" 755 + ~r: 756 + "14BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C\n\ 757 + \ \ 758 + 89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF60755\n\ 759 + \ 78C" 760 + ~s: 761 + "133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0E\n\ 762 + \ \ 763 + D94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B\n\ 764 + \ 979"; 765 + case Digestif.sha512 ~message:"test" 766 + ~k: 767 + "16200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1\n\ 768 + \ \ 769 + B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC\n\ 770 + \ 56D" 771 + ~r: 772 + "13E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10\n\ 773 + \ \ 774 + CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47E\n\ 775 + \ E6D" 776 + ~s: 777 + "1FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78\n\ 778 + \ \ 779 + A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4D\n\ 780 + \ CE3"; 781 + ] 782 + in 783 + ("public key matches", `Quick, pub_rfc) 784 + :: ( "public key compression and decompression", 785 + `Quick, 786 + pub_key_compression (module P521.Dsa) ) 787 + :: List.mapi 788 + (fun i c -> ("RFC 6979 A.2.7 " ^ string_of_int i, `Quick, c)) 789 + cases 608 790 609 791 let x25519 () = 610 792 (* RFC 7748, 6.1 *) 611 - let a = of_hex "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a" 612 - and apub = of_hex "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a" 613 - and b = of_hex "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb" 614 - and bpub = of_hex "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f" 615 - and shared = of_hex "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742" 793 + let a = 794 + of_hex "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a" 795 + and apub = 796 + of_hex "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a" 797 + and b = 798 + of_hex "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb" 799 + and bpub = 800 + of_hex "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f" 801 + and shared = 802 + of_hex "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742" 616 803 in 617 - let of_octets cs = match X25519.secret_of_octets cs with 618 - | Ok (a, b) -> a, b 804 + let of_octets cs = 805 + match X25519.secret_of_octets cs with 806 + | Ok (a, b) -> (a, b) 619 807 | Error _ -> Alcotest.fail "couldn't decode secret" 620 808 in 621 809 let apriv, apub' = of_octets a in ··· 623 811 let bpriv, bpub' = of_octets b in 624 812 Alcotest.(check bool __LOC__ true (String.equal bpub bpub')); 625 813 (match X25519.key_exchange apriv bpub with 626 - | Ok shared' -> 627 - Alcotest.(check bool __LOC__ true (String.equal shared shared')) 628 - | Error e -> 629 - Alcotest.failf "X25519 key exchange apriv bpub failed %a" pp_error e); 814 + | Ok shared' -> 815 + Alcotest.(check bool __LOC__ true (String.equal shared shared')) 816 + | Error e -> 817 + Alcotest.failf "X25519 key exchange apriv bpub failed %a" pp_error e); 630 818 match X25519.key_exchange bpriv apub with 631 819 | Ok shared' -> 632 - Alcotest.(check bool __LOC__ true (String.equal shared shared')) 820 + Alcotest.(check bool __LOC__ true (String.equal shared shared')) 633 821 | Error e -> 634 - Alcotest.failf "X25519 key exchange bpriv apub failed %a" pp_error e 822 + Alcotest.failf "X25519 key exchange bpriv apub failed %a" pp_error e 635 823 636 824 let ed25519 = 637 825 let test secret public msg signature = 638 826 Alcotest.( 639 - check string "public key is ok" (Ed25519.pub_to_octets public) 827 + check string "public key is ok" 828 + (Ed25519.pub_to_octets public) 640 829 Ed25519.(pub_to_octets (pub_of_priv secret))); 641 - Alcotest.(check string "signature is ok" signature (Ed25519.sign ~key:secret msg)); 642 - Alcotest.(check bool "verify is ok" true 643 - (Ed25519.verify ~key:public signature ~msg)) 830 + Alcotest.( 831 + check string "signature is ok" signature (Ed25519.sign ~key:secret msg)); 832 + Alcotest.( 833 + check bool "verify is ok" true (Ed25519.verify ~key:public signature ~msg)) 644 834 in 645 835 let case i ~secret ~public ~msg ~signature = 646 - "RFC 8032 " ^ string_of_int i, `Quick, fun () -> 647 - let s = 648 - match Ed25519.priv_of_octets (of_hex secret) with 649 - | Ok p -> 650 - Alcotest.(check string "private key encoding is good" 651 - (of_hex secret) (Ed25519.priv_to_octets p)); 652 - p 653 - | Error _ -> Alcotest.fail "failed to decode private key" 654 - and p = 655 - match Ed25519.pub_of_octets (of_hex public) with 656 - | Ok p -> 657 - Alcotest.(check string "public key encoding is good" 658 - (of_hex public) (Ed25519.pub_to_octets p)); 659 - p 660 - | Error _ -> Alcotest.fail "failed to decode public key" 661 - and m = of_hex msg 662 - and si = of_hex signature 663 - in 664 - test s p m si 836 + ( "RFC 8032 " ^ string_of_int i, 837 + `Quick, 838 + fun () -> 839 + let s = 840 + match Ed25519.priv_of_octets (of_hex secret) with 841 + | Ok p -> 842 + Alcotest.( 843 + check string "private key encoding is good" (of_hex secret) 844 + (Ed25519.priv_to_octets p)); 845 + p 846 + | Error _ -> Alcotest.fail "failed to decode private key" 847 + and p = 848 + match Ed25519.pub_of_octets (of_hex public) with 849 + | Ok p -> 850 + Alcotest.( 851 + check string "public key encoding is good" (of_hex public) 852 + (Ed25519.pub_to_octets p)); 853 + p 854 + | Error _ -> Alcotest.fail "failed to decode public key" 855 + and m = of_hex msg 856 + and si = of_hex signature in 857 + test s p m si ) 665 858 in 666 859 [ 667 860 case 1 ··· 810 1003 let g = Point.generator in 811 1004 let g_bytes = Point.to_octets g in 812 1005 (* Generator serialized should not be just the identity point *) 813 - Alcotest.(check bool) "generator has non-trivial encoding" 814 - true (String.length g_bytes > 1) 1006 + Alcotest.(check bool) 1007 + "generator has non-trivial encoding" true 1008 + (String.length g_bytes > 1) 815 1009 in 816 1010 let test_point_serialization_roundtrip () = 817 1011 (* Generate a key pair and check that the public key roundtrips through Point *) ··· 819 1013 let pub_bytes = Dsa.pub_to_octets pub in 820 1014 match Point.of_octets pub_bytes with 821 1015 | Ok point -> 822 - let point_bytes = Point.to_octets point in 823 - Alcotest.(check string) "point roundtrip" pub_bytes point_bytes 1016 + let point_bytes = Point.to_octets point in 1017 + Alcotest.(check string) "point roundtrip" pub_bytes point_bytes 824 1018 | Error e -> Alcotest.failf "of_octets failed: %a" pp_error e 825 1019 in 826 1020 let test_point_compressed_serialization () = 827 1021 let _priv, pub = Dsa.generate () in 828 1022 let pub_bytes = Dsa.pub_to_octets pub in 829 1023 match Point.of_octets pub_bytes with 830 - | Ok point -> 831 - let compressed = Point.to_octets ~compress:true point in 832 - (* Compressed form should be shorter *) 833 - Alcotest.(check bool) "compressed is shorter" 834 - true (String.length compressed < String.length pub_bytes); 835 - (* Should be able to decode compressed form *) 836 - (match Point.of_octets compressed with 837 - | Ok point' -> 838 - let uncompressed = Point.to_octets point' in 839 - Alcotest.(check string) "compressed roundtrip" pub_bytes uncompressed 840 - | Error e -> Alcotest.failf "compressed of_octets failed: %a" pp_error e) 1024 + | Ok point -> ( 1025 + let compressed = Point.to_octets ~compress:true point in 1026 + (* Compressed form should be shorter *) 1027 + Alcotest.(check bool) 1028 + "compressed is shorter" true 1029 + (String.length compressed < String.length pub_bytes); 1030 + (* Should be able to decode compressed form *) 1031 + match Point.of_octets compressed with 1032 + | Ok point' -> 1033 + let uncompressed = Point.to_octets point' in 1034 + Alcotest.(check string) 1035 + "compressed roundtrip" pub_bytes uncompressed 1036 + | Error e -> Alcotest.failf "compressed of_octets failed: %a" pp_error e 1037 + ) 841 1038 | Error e -> Alcotest.failf "of_octets failed: %a" pp_error e 842 1039 in 843 1040 let test_scalar_serialization_roundtrip () = ··· 846 1043 let secret_bytes = Dh.secret_to_octets secret in 847 1044 match Point.scalar_of_octets secret_bytes with 848 1045 | Ok scalar -> 849 - let scalar_bytes = Point.scalar_to_octets scalar in 850 - Alcotest.(check string) "scalar roundtrip" secret_bytes scalar_bytes 1046 + let scalar_bytes = Point.scalar_to_octets scalar in 1047 + Alcotest.(check string) "scalar roundtrip" secret_bytes scalar_bytes 851 1048 | Error e -> Alcotest.failf "scalar_of_octets failed: %a" pp_error e 852 1049 in 853 1050 let test_scalar_mult_with_generator () = ··· 857 1054 let pub_bytes = Dsa.pub_to_octets pub in 858 1055 match Point.scalar_of_octets priv_bytes with 859 1056 | Ok scalar -> 860 - let computed_pub = Point.scalar_mult scalar Point.generator in 861 - let computed_bytes = Point.to_octets computed_pub in 862 - Alcotest.(check string) "scalar_mult generator" pub_bytes computed_bytes 1057 + let computed_pub = Point.scalar_mult scalar Point.generator in 1058 + let computed_bytes = Point.to_octets computed_pub in 1059 + Alcotest.(check string) "scalar_mult generator" pub_bytes computed_bytes 863 1060 | Error e -> Alcotest.failf "scalar_of_octets failed: %a" pp_error e 864 1061 in 865 1062 let test_point_add () = ··· 874 1071 in 875 1072 match Point.scalar_of_octets two with 876 1073 | Ok scalar_2 -> 877 - let two_g = Point.scalar_mult scalar_2 g in 878 - Alcotest.(check string) "G + G = 2G" 879 - (Point.to_octets g_plus_g) (Point.to_octets two_g) 1074 + let two_g = Point.scalar_mult scalar_2 g in 1075 + Alcotest.(check string) 1076 + "G + G = 2G" (Point.to_octets g_plus_g) (Point.to_octets two_g) 880 1077 | Error e -> Alcotest.failf "scalar_of_octets 2 failed: %a" pp_error e 881 1078 in 882 1079 [ 883 - name ^ " Point generator", `Quick, test_generator_not_identity; 884 - name ^ " Point serialization roundtrip", `Quick, test_point_serialization_roundtrip; 885 - name ^ " Point compressed serialization", `Quick, test_point_compressed_serialization; 886 - name ^ " Scalar serialization roundtrip", `Quick, test_scalar_serialization_roundtrip; 887 - name ^ " scalar_mult with generator", `Quick, test_scalar_mult_with_generator; 888 - name ^ " Point add", `Quick, test_point_add; 1080 + (name ^ " Point generator", `Quick, test_generator_not_identity); 1081 + ( name ^ " Point serialization roundtrip", 1082 + `Quick, 1083 + test_point_serialization_roundtrip ); 1084 + ( name ^ " Point compressed serialization", 1085 + `Quick, 1086 + test_point_compressed_serialization ); 1087 + ( name ^ " Scalar serialization roundtrip", 1088 + `Quick, 1089 + test_scalar_serialization_roundtrip ); 1090 + ( name ^ " scalar_mult with generator", 1091 + `Quick, 1092 + test_scalar_mult_with_generator ); 1093 + (name ^ " Point add", `Quick, test_point_add); 889 1094 ] 890 1095 891 1096 let p521_regression () = 892 - let key = of_hex 893 - "04 01 e4 f8 8a 40 3d fe 2f 65 a0 20 50 01 9b 87 894 - 86 2c 30 2f 64 58 de 68 63 ab 92 72 88 04 c6 20 895 - 7b 6f 9a 52 95 2d ff c7 80 df 50 44 b1 c4 91 e3 896 - a7 65 39 e6 9c cf ed d2 2a eb 47 84 ea 0f 3d 05 897 - dd 25 0e 00 95 6e 19 fb 7f b7 ce 47 5a 59 01 5f 898 - 35 33 fc 85 ac 34 1a b0 7a 67 86 e8 3e 31 fe 38 899 - 35 5c bb a1 b5 74 f4 47 a3 4c 0a f0 5f 6d 68 47 900 - 85 0f e9 79 74 23 e8 75 47 6e 2b e5 ea 1b 0a 36 901 - b9 c3 94 ca b0" 902 - and data = of_hex 903 - "a8 98 57 b9 3f 58 02 c7 9a 37 e2 d7 89 d8 0b f4 904 - 2d 84 c2 24 7c 7f ff 5f 7b 65 c5 17 cf 79 7d 36 905 - ff d3 9d 47 5e 68 90 57 f1 61 48 18 04 c3 fe ee 906 - 59 b2 15 2d 75 8b 9a 3c 52 60 96 5c 52 a8 55 9c" 907 - and sigr = of_hex 908 - "3a 2c 99 0b 61 a1 da 06 20 bf 6c fe 1f d3 f8 2a 909 - cb f1 e5 0f 78 11 61 58 22 e4 a0 5f 18 81 8d 98 910 - f8 7a ca 8b f8 f8 cc b8 95 f7 6f 03 54 1b 66 6e 911 - cf c5 cb f1 7b 48 82 d2 c3 0e 0e 1b b4 ad e6 a4 912 - 5c" 913 - and sigs = of_hex 914 - "01 7b 8c 82 a5 aa 80 c5 ee 23 0f 91 55 89 a7 b0 915 - 3c 46 7f 56 ff b4 52 89 52 99 59 1e 5e b7 f2 c1 916 - df f8 a0 4f d3 dd 1d f0 07 78 3a 2f 29 d6 61 61 917 - 55 dc 3b be 14 82 93 75 c2 0d be 7e ca 50 e4 3c 918 - 98 88" 1097 + let key = 1098 + of_hex 1099 + "04 01 e4 f8 8a 40 3d fe 2f 65 a0 20 50 01 9b 87\n\ 1100 + 86 2c 30 2f 64 58 de 68 63 ab 92 72 88 04 c6 20\n\ 1101 + 7b 6f 9a 52 95 2d ff c7 80 df 50 44 b1 c4 91 e3\n\ 1102 + a7 65 39 e6 9c cf ed d2 2a eb 47 84 ea 0f 3d 05\n\ 1103 + dd 25 0e 00 95 6e 19 fb 7f b7 ce 47 5a 59 01 5f\n\ 1104 + 35 33 fc 85 ac 34 1a b0 7a 67 86 e8 3e 31 fe 38\n\ 1105 + 35 5c bb a1 b5 74 f4 47 a3 4c 0a f0 5f 6d 68 47\n\ 1106 + 85 0f e9 79 74 23 e8 75 47 6e 2b e5 ea 1b 0a 36\n\ 1107 + b9 c3 94 ca b0" 1108 + and data = 1109 + of_hex 1110 + "a8 98 57 b9 3f 58 02 c7 9a 37 e2 d7 89 d8 0b f4\n\ 1111 + 2d 84 c2 24 7c 7f ff 5f 7b 65 c5 17 cf 79 7d 36\n\ 1112 + ff d3 9d 47 5e 68 90 57 f1 61 48 18 04 c3 fe ee\n\ 1113 + 59 b2 15 2d 75 8b 9a 3c 52 60 96 5c 52 a8 55 9c" 1114 + and sigr = 1115 + of_hex 1116 + "3a 2c 99 0b 61 a1 da 06 20 bf 6c fe 1f d3 f8 2a\n\ 1117 + cb f1 e5 0f 78 11 61 58 22 e4 a0 5f 18 81 8d 98\n\ 1118 + f8 7a ca 8b f8 f8 cc b8 95 f7 6f 03 54 1b 66 6e\n\ 1119 + cf c5 cb f1 7b 48 82 d2 c3 0e 0e 1b b4 ad e6 a4\n\ 1120 + 5c" 1121 + and sigs = 1122 + of_hex 1123 + "01 7b 8c 82 a5 aa 80 c5 ee 23 0f 91 55 89 a7 b0\n\ 1124 + 3c 46 7f 56 ff b4 52 89 52 99 59 1e 5e b7 f2 c1\n\ 1125 + df f8 a0 4f d3 dd 1d f0 07 78 3a 2f 29 d6 61 61\n\ 1126 + 55 dc 3b be 14 82 93 75 c2 0d be 7e ca 50 e4 3c\n\ 1127 + 98 88" 919 1128 in 920 1129 match P521.Dsa.pub_of_octets key with 921 1130 | Ok key -> 922 - Alcotest.check Alcotest.bool "regression 1" true 923 - (P521.Dsa.verify ~key (sigr, sigs) data) 1131 + Alcotest.check Alcotest.bool "regression 1" true 1132 + (P521.Dsa.verify ~key (sigr, sigs) data) 924 1133 | Error _ -> Alcotest.fail "regression failed" 925 1134 926 1135 let () = ··· 935 1144 ("ECDSA RFC 6979 P256", ecdsa_rfc6979_p256); 936 1145 ("ECDSA RFC 6979 P384", ecdsa_rfc6979_p384); 937 1146 ("ECDSA RFC 6979 P521", ecdsa_rfc6979_p521); 938 - ("X25519", [ "RFC 7748", `Quick, x25519 ]); 1147 + ("X25519", [ ("RFC 7748", `Quick, x25519) ]); 939 1148 ("ED25519", ed25519); 940 - ("ECDSA P521 regression", [ "regreesion1", `Quick, p521_regression ]); 1149 + ("ECDSA P521 regression", [ ("regreesion1", `Quick, p521_regression) ]); 941 1150 ("P256 Point module", point_module_tests (module P256) "P256"); 942 1151 ("P384 Point module", point_module_tests (module P384) "P384"); 943 1152 ("P521 Point module", point_module_tests (module P521) "P521");
+132 -137
tests/test_ec_wycheproof.ml
··· 1 1 open Wycheproof 2 - 3 2 open Crypto_ec 4 3 5 4 let ( let* ) = Result.bind 6 - 7 5 let hex = Alcotest.testable Wycheproof.pp_hex Wycheproof.equal_hex 8 6 9 7 module Asn = struct ··· 11 9 let seq2 a b = Asn.S.(sequence2 (required a) (required b)) in 12 10 let term = Asn.S.(seq2 (seq2 oid oid) bit_string_octets) in 13 11 let ec_public_key = Asn.OID.(base 1 2 <|| [ 840; 10045; 2; 1 ]) in 14 - let prime_oid = match curve with 12 + let prime_oid = 13 + match curve with 15 14 | "secp256r1" -> Asn.OID.(base 1 2 <|| [ 840; 10045; 3; 1; 7 ]) 16 15 | "secp384r1" -> Asn.OID.(base 1 3 <|| [ 132; 0; 34 ]) 17 16 | "secp521r1" -> Asn.OID.(base 1 3 <|| [ 132; 0; 35 ]) ··· 20 19 match Asn.decode (Asn.codec Asn.ber term) s with 21 20 | Error _ -> Error "ASN1 parse error" 22 21 | Ok (((oid1, oid2), data), rest) -> 23 - if String.length rest <> 0 then Error "ASN1 leftover" 24 - else if not (Asn.OID.equal oid1 ec_public_key) then 25 - Error "ASN1: wrong oid 1" 26 - else if not (Asn.OID.equal oid2 prime_oid) then Error "ASN1: wrong oid 2" 27 - else Ok data 22 + if String.length rest <> 0 then Error "ASN1 leftover" 23 + else if not (Asn.OID.equal oid1 ec_public_key) then 24 + Error "ASN1: wrong oid 1" 25 + else if not (Asn.OID.equal oid2 prime_oid) then 26 + Error "ASN1: wrong oid 2" 27 + else Ok data 28 28 29 29 let parse_signature cs = 30 - let asn = Asn.S.(sequence2 (required unsigned_integer) (required unsigned_integer)) in 30 + let asn = 31 + Asn.S.(sequence2 (required unsigned_integer) (required unsigned_integer)) 32 + in 31 33 match Asn.(decode (codec der asn) cs) with 32 34 | Error _ -> Error "ASN1 parse error" 33 35 | Ok (r_s, rest) -> 34 - if String.length rest <> 0 then Error "ASN1 leftover" 35 - else 36 - Ok r_s 36 + if String.length rest <> 0 then Error "ASN1 leftover" else Ok r_s 37 37 end 38 38 39 39 let to_string_result ~pp_error = function ··· 46 46 match total_len - String.length buf with 47 47 | 0 -> Ok buf 48 48 | n when n < 0 -> 49 - let is_zero = ref true in 50 - for i = 0 to abs n - 1 do 51 - if Bytes.(get_uint8 (Bytes.unsafe_of_string buf) i) <> 0 then 52 - is_zero := false 53 - done; 54 - if !is_zero then 55 - Ok (String.sub buf (abs n) total_len) 56 - else 57 - Error "input is too long" 58 - | pad_len -> 59 - Ok (String.make pad_len '\000' ^ buf) 49 + let is_zero = ref true in 50 + for i = 0 to abs n - 1 do 51 + if Bytes.(get_uint8 (Bytes.unsafe_of_string buf) i) <> 0 then 52 + is_zero := false 53 + done; 54 + if !is_zero then Ok (String.sub buf (abs n) total_len) 55 + else Error "input is too long" 56 + | pad_len -> Ok (String.make pad_len '\000' ^ buf) 60 57 61 58 let len = function 62 59 | "secp256r1" -> 32 ··· 68 65 let total_len = len curve in 69 66 pad ~total_len s 70 67 71 - type test = { 72 - public_key : string; 73 - raw_private_key : string; 74 - expected : string; 75 - } 68 + type test = { public_key : string; raw_private_key : string; expected : string } 76 69 77 70 let perform_key_exchange curve ~public_key ~raw_private_key = 78 71 to_string_result ~pp_error 79 72 (match curve with 80 - | "secp256r1" -> 81 - begin match P256.Dh.secret_of_octets raw_private_key with 82 - | Ok (p, _) -> P256.Dh.key_exchange p public_key 83 - | Error _ -> assert false 84 - end 85 - | "secp384r1" -> 86 - begin match P384.Dh.secret_of_octets raw_private_key with 87 - | Ok (p, _) -> P384.Dh.key_exchange p public_key 88 - | Error _ -> assert false 89 - end 90 - | "secp521r1" -> 91 - begin match P521.Dh.secret_of_octets raw_private_key with 92 - | Ok (p, _) -> P521.Dh.key_exchange p public_key 93 - | Error _ -> assert false 94 - end 95 - | _ -> assert false) 73 + | "secp256r1" -> begin 74 + match P256.Dh.secret_of_octets raw_private_key with 75 + | Ok (p, _) -> P256.Dh.key_exchange p public_key 76 + | Error _ -> assert false 77 + end 78 + | "secp384r1" -> begin 79 + match P384.Dh.secret_of_octets raw_private_key with 80 + | Ok (p, _) -> P384.Dh.key_exchange p public_key 81 + | Error _ -> assert false 82 + end 83 + | "secp521r1" -> begin 84 + match P521.Dh.secret_of_octets raw_private_key with 85 + | Ok (p, _) -> P521.Dh.key_exchange p public_key 86 + | Error _ -> assert false 87 + end 88 + | _ -> assert false) 96 89 97 90 let interpret_test ~tcId curve { public_key; raw_private_key; expected } () = 98 91 match perform_key_exchange curve ~public_key ~raw_private_key with 99 92 | Ok got -> Alcotest.check hex __LOC__ expected got 100 93 | Error err -> 101 - Printf.ksprintf (fun s -> Alcotest.fail s) "While parsing %d: %s" tcId err 94 + Printf.ksprintf (fun s -> Alcotest.fail s) "While parsing %d: %s" tcId err 102 95 103 96 type invalid_test = { public : string; private_ : string } 104 97 ··· 115 108 type strategy = Test of test | Invalid_test of invalid_test | Skip 116 109 117 110 let make_ecdh_test curve (test : ecdh_test) = 118 - let ignored_flags = ["UnnamedCurve"] in 111 + let ignored_flags = [ "UnnamedCurve" ] in 119 112 let curve_compression_test curve = 120 - let curves = ["secp256r1"; "secp384r1"; "secp521r1"] in 113 + let curves = [ "secp256r1"; "secp384r1"; "secp521r1" ] in 121 114 test.tcId = 2 && List.exists (fun x -> String.equal x curve) curves 122 115 in 123 116 match test.result with ··· 125 118 | Invalid -> 126 119 Ok (Invalid_test { public = test.public; private_ = test.private_ }) 127 120 | Acceptable when curve_compression_test curve -> 128 - let* public_key = Asn.parse_point curve test.public in 129 - let* raw_private_key = parse_secret curve test.private_ in 130 - Ok (Test { public_key; raw_private_key; expected = test.shared }) 121 + let* public_key = Asn.parse_point curve test.public in 122 + let* raw_private_key = parse_secret curve test.private_ in 123 + Ok (Test { public_key; raw_private_key; expected = test.shared }) 131 124 | Acceptable -> Ok Skip 132 125 | Valid -> 133 - let* public_key = Asn.parse_point curve test.public in 134 - let* raw_private_key = parse_secret curve test.private_ in 135 - Ok (Test { public_key; raw_private_key; expected = test.shared }) 126 + let* public_key = Asn.parse_point curve test.public in 127 + let* raw_private_key = parse_secret curve test.private_ in 128 + Ok (Test { public_key; raw_private_key; expected = test.shared }) 136 129 137 130 let to_ecdh_tests curve (x : ecdh_test) = 138 131 let name = Printf.sprintf "%d - %s" x.tcId x.comment in ··· 147 140 let groups : ecdh_test_group list = 148 141 List.map ecdh_test_group_exn data.testGroups 149 142 in 150 - List.concat_map (fun (group : ecdh_test_group) -> 143 + List.concat_map 144 + (fun (group : ecdh_test_group) -> 151 145 List.concat_map (to_ecdh_tests group.curve) group.tests) 152 146 groups 153 147 ··· 165 159 in 166 160 String.sub dgst 0 (min size (String.length dgst)) 167 161 in 168 - let verified (r,s) = 162 + let verified (r, s) = 169 163 match curve with 170 - | "secp256r1" -> 171 - begin match P256.Dsa.pub_of_octets key with 164 + | "secp256r1" -> begin 165 + match P256.Dsa.pub_of_octets key with 172 166 | Ok key -> P256.Dsa.verify ~key (r, s) msg 173 167 | Error _ -> assert false 174 168 end 175 - | "secp384r1" -> 176 - begin match P384.Dsa.pub_of_octets key with 169 + | "secp384r1" -> begin 170 + match P384.Dsa.pub_of_octets key with 177 171 | Ok key -> P384.Dsa.verify ~key (r, s) msg 178 172 | Error _ -> assert false 179 173 end 180 - | "secp521r1" -> 181 - begin match P521.Dsa.pub_of_octets key with 174 + | "secp521r1" -> begin 175 + match P521.Dsa.pub_of_octets key with 182 176 | Ok key -> P521.Dsa.verify ~key (r, s) msg 183 177 | Error _ -> assert false 184 178 end 185 179 | _ -> assert false 186 180 in 187 181 match tst.result with 188 - | Acceptable 189 - | Invalid -> 190 - let f () = 191 - match Asn.parse_signature tst.sig_ with 192 - | Ok (r, s) -> Alcotest.(check bool __LOC__ false (verified (r, s))) 193 - | Error _s -> () 194 - in 195 - name, `Quick, f 182 + | Acceptable | Invalid -> 183 + let f () = 184 + match Asn.parse_signature tst.sig_ with 185 + | Ok (r, s) -> Alcotest.(check bool __LOC__ false (verified (r, s))) 186 + | Error _s -> () 187 + in 188 + (name, `Quick, f) 196 189 | Valid -> 197 - let f () = 198 - match Asn.parse_signature tst.sig_ with 199 - | Ok (r, s) -> Alcotest.(check bool __LOC__ true (verified (r, s))) 200 - | Error s -> Alcotest.fail s 201 - in 202 - name, `Quick, f 190 + let f () = 191 + match Asn.parse_signature tst.sig_ with 192 + | Ok (r, s) -> Alcotest.(check bool __LOC__ true (verified (r, s))) 193 + | Error s -> Alcotest.fail s 194 + in 195 + (name, `Quick, f) 203 196 204 197 let to_ecdsa_tests (x : ecdsa_test_group) = 205 - List.map 206 - (make_ecdsa_test x.key.curve x.key.uncompressed x.sha) 207 - x.tests 198 + List.map (make_ecdsa_test x.key.curve x.key.uncompressed x.sha) x.tests 208 199 209 200 let ecdsa_tests file = 210 201 let data = load_file_exn file in ··· 222 213 in 223 214 match x.result with 224 215 | Acceptable -> 225 - let f () = 226 - match 227 - X25519.key_exchange priv x.public, 228 - has_ignored_flag x ~ignored_flags:[ "LowOrderPublic" ] 229 - with 230 - | Ok _, true -> Alcotest.fail "acceptable should have errored" 231 - | Ok r, false -> 232 - Alcotest.(check bool __LOC__ true (String.equal r x.shared)) 233 - | Error _, true -> () 234 - | Error e, false -> Alcotest.failf "acceptable errored %a" pp_error e 235 - in 236 - name, `Quick, f 216 + let f () = 217 + match 218 + ( X25519.key_exchange priv x.public, 219 + has_ignored_flag x ~ignored_flags:[ "LowOrderPublic" ] ) 220 + with 221 + | Ok _, true -> Alcotest.fail "acceptable should have errored" 222 + | Ok r, false -> 223 + Alcotest.(check bool __LOC__ true (String.equal r x.shared)) 224 + | Error _, true -> () 225 + | Error e, false -> Alcotest.failf "acceptable errored %a" pp_error e 226 + in 227 + (name, `Quick, f) 237 228 | Invalid -> 238 - let f () = 239 - match X25519.key_exchange priv x.public with 240 - | Ok r -> Alcotest.(check bool __LOC__ false (String.equal r x.shared)) 241 - | Error e -> Alcotest.failf "invalid errored %a" pp_error e 242 - in 243 - name, `Quick, f 229 + let f () = 230 + match X25519.key_exchange priv x.public with 231 + | Ok r -> Alcotest.(check bool __LOC__ false (String.equal r x.shared)) 232 + | Error e -> Alcotest.failf "invalid errored %a" pp_error e 233 + in 234 + (name, `Quick, f) 244 235 | Valid -> 245 - let f () = 246 - match X25519.key_exchange priv x.public with 247 - | Ok r -> Alcotest.(check bool __LOC__ true (String.equal r x.shared)) 248 - | Error e -> Alcotest.failf "valid errored %a" pp_error e 249 - in 250 - name, `Quick, f 236 + let f () = 237 + match X25519.key_exchange priv x.public with 238 + | Ok r -> Alcotest.(check bool __LOC__ true (String.equal r x.shared)) 239 + | Error e -> Alcotest.failf "valid errored %a" pp_error e 240 + in 241 + (name, `Quick, f) 251 242 252 243 let x25519_tests = 253 244 let data = load_file_exn "x25519_test.json" in 254 245 let groups : ecdh_test_group list = 255 246 List.map ecdh_test_group_exn data.testGroups 256 247 in 257 - List.concat_map (fun (group : ecdh_test_group) -> 258 - List.map to_x25519_test group.tests) 248 + List.concat_map 249 + (fun (group : ecdh_test_group) -> List.map to_x25519_test group.tests) 259 250 groups 260 251 261 252 let to_ed25519_test (priv, pub) (x : dsa_test) = 262 253 let name = Printf.sprintf "%d - %s" x.tcId x.comment in 263 254 match x.result with 264 255 | Invalid -> 265 - let f () = 266 - Alcotest.(check bool __LOC__ false (Ed25519.verify ~key:pub x.sig_ ~msg:x.msg)); 267 - let s = Ed25519.sign ~key:priv x.msg in 268 - Alcotest.(check bool __LOC__ false (String.equal s x.sig_)) 269 - in 270 - name, `Quick, f 256 + let f () = 257 + Alcotest.( 258 + check bool __LOC__ false (Ed25519.verify ~key:pub x.sig_ ~msg:x.msg)); 259 + let s = Ed25519.sign ~key:priv x.msg in 260 + Alcotest.(check bool __LOC__ false (String.equal s x.sig_)) 261 + in 262 + (name, `Quick, f) 271 263 | Valid -> 272 - let f () = 273 - Alcotest.(check bool __LOC__ true (Ed25519.verify ~key:pub x.sig_ ~msg:x.msg)); 274 - let s = Ed25519.sign ~key:priv x.msg in 275 - Alcotest.(check bool __LOC__ true (String.equal s x.sig_)) 276 - in 277 - name, `Quick, f 264 + let f () = 265 + Alcotest.( 266 + check bool __LOC__ true (Ed25519.verify ~key:pub x.sig_ ~msg:x.msg)); 267 + let s = Ed25519.sign ~key:priv x.msg in 268 + Alcotest.(check bool __LOC__ true (String.equal s x.sig_)) 269 + in 270 + (name, `Quick, f) 278 271 | Acceptable -> assert false 279 272 280 273 let to_ed25519_keys (key : eddsa_key) = 281 - match Ed25519.priv_of_octets key.sk, Ed25519.pub_of_octets key.pk with 274 + match (Ed25519.priv_of_octets key.sk, Ed25519.pub_of_octets key.pk) with 282 275 | Ok priv, Ok pub -> 283 - assert (String.equal Ed25519.(pub_to_octets (pub_of_priv priv)) key.pk); 284 - priv, pub 276 + assert (String.equal Ed25519.(pub_to_octets (pub_of_priv priv)) key.pk); 277 + (priv, pub) 285 278 | _ -> assert false 286 279 287 280 let ed25519_tests = ··· 289 282 let groups : eddsa_test_group list = 290 283 List.map eddsa_test_group_exn data.testGroups 291 284 in 292 - List.concat_map (fun (group : eddsa_test_group) -> 285 + List.concat_map 286 + (fun (group : eddsa_test_group) -> 293 287 let keys = to_ed25519_keys group.key in 294 288 List.map (to_ed25519_test keys) group.tests) 295 289 groups 296 290 297 291 let () = 298 - Alcotest.run "Wycheproof NIST curves" [ 299 - ("ECDH P256 test vectors", ecdh_tests "ecdh_secp256r1_test.json") ; 300 - ("ECDSA P256 test vectors (SHA256)", 301 - ecdsa_tests "ecdsa_secp256r1_sha256_test.json") ; 302 - ("ECDSA P256 test vectors (SHA512)", 303 - ecdsa_tests "ecdsa_secp256r1_sha512_test.json") ; 304 - ("ECDH P384 test vectors", ecdh_tests "ecdh_secp384r1_test.json") ; 305 - ("ECDSA P384 test vectors (SHA384)", 306 - ecdsa_tests "ecdsa_secp384r1_sha384_test.json") ; 307 - ("ECDSA P384 test vectors (SHA512)", 308 - ecdsa_tests "ecdsa_secp384r1_sha512_test.json") ; 309 - ("ECDH P521 test vectors", ecdh_tests "ecdh_secp521r1_test.json") ; 310 - ("ECDSA P521 test vectors (SHA512)", 311 - ecdsa_tests "ecdsa_secp521r1_sha512_test.json") ; 312 - ("X25519 test vectors", x25519_tests) ; 313 - ("ED25519 test vectors", ed25519_tests) ; 314 - ] 292 + Alcotest.run "Wycheproof NIST curves" 293 + [ 294 + ("ECDH P256 test vectors", ecdh_tests "ecdh_secp256r1_test.json"); 295 + ( "ECDSA P256 test vectors (SHA256)", 296 + ecdsa_tests "ecdsa_secp256r1_sha256_test.json" ); 297 + ( "ECDSA P256 test vectors (SHA512)", 298 + ecdsa_tests "ecdsa_secp256r1_sha512_test.json" ); 299 + ("ECDH P384 test vectors", ecdh_tests "ecdh_secp384r1_test.json"); 300 + ( "ECDSA P384 test vectors (SHA384)", 301 + ecdsa_tests "ecdsa_secp384r1_sha384_test.json" ); 302 + ( "ECDSA P384 test vectors (SHA512)", 303 + ecdsa_tests "ecdsa_secp384r1_sha512_test.json" ); 304 + ("ECDH P521 test vectors", ecdh_tests "ecdh_secp521r1_test.json"); 305 + ( "ECDSA P521 test vectors (SHA512)", 306 + ecdsa_tests "ecdsa_secp521r1_sha512_test.json" ); 307 + ("X25519 test vectors", x25519_tests); 308 + ("ED25519 test vectors", ed25519_tests); 309 + ]
+18 -18
tests/test_entropy.ml
··· 1 - 2 1 let data = ref "" 3 2 4 3 let cpu_bootstrap_check () = 5 4 match Crypto_rng.Entropy.cpu_rng_bootstrap with 6 5 | Error `Not_supported -> print_endline "no CPU RNG available" 7 - | Ok cpu_rng_bootstrap -> 8 - match cpu_rng_bootstrap 1 with 9 - | exception Failure _ -> print_endline "bad CPU RNG" 10 - | data' -> 11 - data := data'; 12 - for i = 0 to 10 do 13 - try 14 - let data' = cpu_rng_bootstrap 1 in 15 - if String.equal !data data' then begin 16 - Ohex.pp Format.std_formatter data'; 17 - failwith ("same data from CPU bootstrap at " ^ string_of_int i); 18 - end; 19 - data := data' 20 - with Failure _ -> print_endline ("CPU RNG failed at " ^ string_of_int i) 21 - done 6 + | Ok cpu_rng_bootstrap -> ( 7 + match cpu_rng_bootstrap 1 with 8 + | exception Failure _ -> print_endline "bad CPU RNG" 9 + | data' -> 10 + data := data'; 11 + for i = 0 to 10 do 12 + try 13 + let data' = cpu_rng_bootstrap 1 in 14 + if String.equal !data data' then begin 15 + Ohex.pp Format.std_formatter data'; 16 + failwith ("same data from CPU bootstrap at " ^ string_of_int i) 17 + end; 18 + data := data' 19 + with Failure _ -> 20 + print_endline ("CPU RNG failed at " ^ string_of_int i) 21 + done) 22 22 23 23 let whirlwind_bootstrap_check () = 24 24 for i = 0 to 10 do 25 25 let data' = Crypto_rng.Entropy.whirlwind_bootstrap 1 in 26 26 if String.equal !data data' then begin 27 27 Ohex.pp Format.std_formatter data'; 28 - failwith ("same data from whirlwind bootstrap at " ^ string_of_int i); 28 + failwith ("same data from whirlwind bootstrap at " ^ string_of_int i) 29 29 end; 30 30 data := data' 31 31 done ··· 35 35 let data' = Crypto_rng.Entropy.interrupt_hook () in 36 36 if String.equal !data data' then begin 37 37 Ohex.pp Format.std_formatter data'; 38 - failwith ("same data from timer at " ^ string_of_int i); 38 + failwith ("same data from timer at " ^ string_of_int i) 39 39 end; 40 40 data := data' 41 41 done
+39 -36
tests/test_numeric.ml
··· 1 1 open OUnit2 2 - 3 2 open Crypto.Uncommon 4 3 open Crypto_pk 5 - 6 4 open Test_common 7 5 8 6 let n_encode_decode_selftest ~typ ~bound n = 9 - typ ^ "selftest" >:: times ~n @@ fun _ -> 10 - let r = Z_extra.gen bound in 11 - let s = Z_extra.(of_octets_be @@ to_octets_be r) 12 - and t = Z_extra.(of_octets_be @@ to_octets_be ~size:24 r) in 13 - assert_equal r s; 14 - assert_equal r t 7 + typ ^ "selftest" 8 + >:: times ~n @@ fun _ -> 9 + let r = Z_extra.gen bound in 10 + let s = Z_extra.(of_octets_be @@ to_octets_be r) 11 + and t = Z_extra.(of_octets_be @@ to_octets_be ~size:24 r) in 12 + assert_equal r s; 13 + assert_equal r t 15 14 16 15 let n_decode_reencode_selftest ~typ ~bytes n = 17 - typ ^ " selftest" >:: times ~n @@ fun _ -> 18 - let cs = Crypto_rng.generate bytes in 19 - let cs' = Z_extra.(to_octets_be ~size:bytes @@ of_octets_be cs) in 20 - assert_oct_equal cs cs' 16 + typ ^ " selftest" 17 + >:: times ~n @@ fun _ -> 18 + let cs = Crypto_rng.generate bytes in 19 + let cs' = Z_extra.(to_octets_be ~size:bytes @@ of_octets_be cs) in 20 + assert_oct_equal cs cs' 21 21 22 22 let random_n_selftest ~typ n bounds = 23 - typ ^ " selftest" >::: ( 24 - bounds |> List.map @@ fun (lo, hi) -> 25 - "selftest" >:: times ~n @@ fun _ -> 26 - let x = Z_extra.gen_r lo hi in 27 - if x < lo || x >= hi then assert_failure "range error" 28 - ) 23 + typ ^ " selftest" 24 + >::: (bounds 25 + |> List.map @@ fun (lo, hi) -> 26 + "selftest" 27 + >:: times ~n @@ fun _ -> 28 + let x = Z_extra.gen_r lo hi in 29 + if x < lo || x >= hi then assert_failure "range error") 29 30 30 - let int_safe_bytes = Sys.word_size // 8 - 1 31 + let int_safe_bytes = (Sys.word_size // 8) - 1 31 32 32 - let suite = [ 33 - "Numeric extraction 1" >::: [ 34 - n_encode_decode_selftest 35 - ~typ:"z" ~bound:Z.(of_int64 Int64.max_int) 2000 ; 36 - ] ; 37 - 38 - "Numeric extraction 2" >::: [ 39 - n_decode_reencode_selftest ~typ:"z" ~bytes:37 2000 ; 40 - ]; 41 - 42 - "RNG extraction" >::: [ 43 - random_n_selftest ~typ:"Z" 1000 [ 44 - Z.(of_int 7, of_int 135); 45 - Z.(of_int 0, of_int 536870913); 46 - Z.(of_int 0, of_int64 2305843009213693953L) 47 - ] ; 33 + let suite = 34 + [ 35 + "Numeric extraction 1" 36 + >::: [ 37 + n_encode_decode_selftest ~typ:"z" 38 + ~bound:Z.(of_int64 Int64.max_int) 39 + 2000; 40 + ]; 41 + "Numeric extraction 2" 42 + >::: [ n_decode_reencode_selftest ~typ:"z" ~bytes:37 2000 ]; 43 + "RNG extraction" 44 + >::: [ 45 + random_n_selftest ~typ:"Z" 1000 46 + [ 47 + Z.(of_int 7, of_int 135); 48 + Z.(of_int 0, of_int 536870913); 49 + Z.(of_int 0, of_int64 2305843009213693953L); 50 + ]; 51 + ]; 48 52 ] 49 - ]
+7 -6
tests/test_pk_runner.ml
··· 1 1 open OUnit2 2 2 3 3 let suite = 4 - "All" >::: [ 5 - "Numeric" >::: Test_numeric.suite; 6 - "DHE" >::: Test_dh.suite; 7 - "DSA" >::: Test_dsa.suite; 8 - "RSA" >::: Test_rsa.suite; 9 - ] 4 + "All" 5 + >::: [ 6 + "Numeric" >::: Test_numeric.suite; 7 + "DHE" >::: Test_dh.suite; 8 + "DSA" >::: Test_dsa.suite; 9 + "RSA" >::: Test_rsa.suite; 10 + ] 10 11 11 12 let () = 12 13 Crypto_rng_unix.use_default ();
+95 -79
tests/test_random_runner.ml
··· 1 1 open OUnit2 2 - 3 2 open Crypto 4 - 5 3 open Test_common 6 4 7 5 let sample arr = 8 - let ix = 9 - Randomconv.int ~bound:(Array.length arr) Crypto_rng.generate 10 - in 6 + let ix = Randomconv.int ~bound:(Array.length arr) Crypto_rng.generate in 11 7 arr.(ix) 12 8 13 9 (* randomized selfies *) 14 10 15 11 let ecb_selftest (m : (module Block.ECB)) n = 16 - let module C = ( val m ) in 17 - "selftest" >:: times ~n @@ fun _ -> 18 - let data = Crypto_rng.generate (C.block_size * 8) 19 - and key = C.of_secret @@ Crypto_rng.generate (sample C.key_sizes) in 20 - let data' = 21 - C.( data |> encrypt ~key |> encrypt ~key 22 - |> decrypt ~key |> decrypt ~key ) in 23 - assert_oct_equal ~msg:"ecb mismatch" data data' 12 + let module C = (val m) in 13 + "selftest" 14 + >:: times ~n @@ fun _ -> 15 + let data = Crypto_rng.generate (C.block_size * 8) 16 + and key = C.of_secret @@ Crypto_rng.generate (sample C.key_sizes) in 17 + let data' = 18 + C.(data |> encrypt ~key |> encrypt ~key |> decrypt ~key |> decrypt ~key) 19 + in 20 + assert_oct_equal ~msg:"ecb mismatch" data data' 24 21 25 - let cbc_selftest (m : (module Block.CBC)) n = 26 - let module C = ( val m ) in 27 - "selftest" >:: times ~n @@ fun _ -> 28 - let data = Crypto_rng.generate (C.block_size * 8) 29 - and iv = Crypto_rng.generate C.block_size 30 - and key = C.of_secret @@ Crypto_rng.generate (sample C.key_sizes) in 31 - assert_oct_equal ~msg:"CBC e->e->d->d" data 32 - C.( data |> encrypt ~key ~iv |> encrypt ~key ~iv 33 - |> decrypt ~key ~iv |> decrypt ~key ~iv ); 34 - let (d1, d2) = 35 - String.sub data 0 (C.block_size * 4), 36 - String.sub data (C.block_size * 4) (String.length data - C.block_size * 4) 37 - in 38 - assert_oct_equal ~msg:"CBC chain" 39 - C.(encrypt ~key ~iv data) 40 - C.( let e1 = encrypt ~key ~iv d1 in 22 + let cbc_selftest (m : (module Block.CBC)) n = 23 + let module C = (val m) in 24 + "selftest" 25 + >:: times ~n @@ fun _ -> 26 + let data = Crypto_rng.generate (C.block_size * 8) 27 + and iv = Crypto_rng.generate C.block_size 28 + and key = C.of_secret @@ Crypto_rng.generate (sample C.key_sizes) in 29 + assert_oct_equal ~msg:"CBC e->e->d->d" data 30 + C.( 31 + data |> encrypt ~key ~iv |> encrypt ~key ~iv |> decrypt ~key ~iv 32 + |> decrypt ~key ~iv); 33 + let d1, d2 = 34 + ( String.sub data 0 (C.block_size * 4), 35 + String.sub data (C.block_size * 4) 36 + (String.length data - (C.block_size * 4)) ) 37 + in 38 + assert_oct_equal ~msg:"CBC chain" 39 + C.(encrypt ~key ~iv data) 40 + C.( 41 + let e1 = encrypt ~key ~iv d1 in 41 42 e1 ^ encrypt ~key ~iv:(next_iv ~iv e1) d2) 42 43 43 44 let ctr_selftest (m : (module Block.CTR)) n = 44 45 let module M = (val m) in 45 46 let bs = M.block_size in 46 - "selftest" >:: times ~n @@ fun _ -> 47 - let key = M.of_secret @@ Crypto_rng.generate (sample M.key_sizes) 48 - and ctr = Crypto_rng.generate bs |> M.ctr_of_octets 49 - and data = Crypto_rng.(generate @@ bs + Randomconv.int ~bound:(20 * bs) Crypto_rng.generate) in 50 - let enc = M.encrypt ~key ~ctr data in 51 - let dec = M.decrypt ~key ~ctr enc in 52 - assert_oct_equal ~msg:"CTR e->d" data dec; 53 - let (d1, d2) = 54 - let s = bs * Randomconv.int ~bound:(String.length data / bs) Crypto_rng.generate in 55 - String.sub data 0 s, String.sub data s (String.length data - s) 56 - in 57 - assert_oct_equal ~msg:"CTR chain" enc @@ 58 - M.encrypt ~key ~ctr d1 ^ M.encrypt ~key ~ctr:(M.next_ctr ~ctr d1) d2 47 + "selftest" 48 + >:: times ~n @@ fun _ -> 49 + let key = M.of_secret @@ Crypto_rng.generate (sample M.key_sizes) 50 + and ctr = Crypto_rng.generate bs |> M.ctr_of_octets 51 + and data = 52 + Crypto_rng.( 53 + generate @@ (bs + Randomconv.int ~bound:(20 * bs) Crypto_rng.generate)) 54 + in 55 + let enc = M.encrypt ~key ~ctr data in 56 + let dec = M.decrypt ~key ~ctr enc in 57 + assert_oct_equal ~msg:"CTR e->d" data dec; 58 + let d1, d2 = 59 + let s = 60 + bs 61 + * Randomconv.int ~bound:(String.length data / bs) Crypto_rng.generate 62 + in 63 + (String.sub data 0 s, String.sub data s (String.length data - s)) 64 + in 65 + assert_oct_equal ~msg:"CTR chain" enc 66 + @@ M.encrypt ~key ~ctr d1 67 + ^ M.encrypt ~key ~ctr:(M.next_ctr ~ctr d1) d2 59 68 60 69 let ctr_offsets (type c) ~zero (m : (module Block.CTR with type ctr = c)) n = 61 70 let module M = (val m) in 62 71 "offsets" >:: fun _ -> 63 - let key = M.of_secret @@ Crypto_rng.generate M.key_sizes.(0) in 64 - for i = 0 to n - 1 do 65 - let ctr = match i with 66 - | 0 -> M.add_ctr zero (-1L) 67 - | _ -> Crypto_rng.generate M.block_size |> M.ctr_of_octets 68 - and gap = Randomconv.int ~bound:64 Crypto_rng.generate in 69 - let s1 = M.stream ~key ~ctr ((gap + 1) * M.block_size) 70 - and s2 = M.stream ~key ~ctr:(M.add_ctr ctr (Int64.of_int gap)) M.block_size in 71 - assert_oct_equal ~msg:"shifted stream" 72 - String.(sub s1 (gap * M.block_size) M.block_size) s2 73 - done 72 + let key = M.of_secret @@ Crypto_rng.generate M.key_sizes.(0) in 73 + for i = 0 to n - 1 do 74 + let ctr = 75 + match i with 76 + | 0 -> M.add_ctr zero (-1L) 77 + | _ -> Crypto_rng.generate M.block_size |> M.ctr_of_octets 78 + and gap = Randomconv.int ~bound:64 Crypto_rng.generate in 79 + let s1 = M.stream ~key ~ctr ((gap + 1) * M.block_size) 80 + and s2 = 81 + M.stream ~key ~ctr:(M.add_ctr ctr (Int64.of_int gap)) M.block_size 82 + in 83 + assert_oct_equal ~msg:"shifted stream" 84 + String.(sub s1 (gap * M.block_size) M.block_size) 85 + s2 86 + done 74 87 75 88 let xor_selftest n = 76 - "selftest" >:: times ~n @@ fun _ -> 89 + "selftest" 90 + >:: times ~n @@ fun _ -> 91 + let n = Randomconv.int ~bound:30 Crypto_rng.generate in 92 + let x, y, z = Crypto_rng.(generate n, generate n, generate n) in 77 93 78 - let n = Randomconv.int ~bound:30 Crypto_rng.generate in 79 - let (x, y, z) = Crypto_rng.(generate n, generate n, generate n) in 94 + let xyz = Uncommon.(xor (xor x y) z) 95 + and xyz' = Uncommon.(xor x (xor y z)) in 96 + let x1 = Uncommon.(xor xyz (xor y z)) 97 + and x2 = Uncommon.(xor (xor z y) xyz) in 80 98 81 - let xyz = Uncommon.(xor (xor x y) z) 82 - and xyz' = Uncommon.(xor x (xor y z)) in 83 - let x1 = Uncommon.(xor xyz (xor y z)) 84 - and x2 = Uncommon.(xor (xor z y) xyz) in 85 - 86 - assert_oct_equal ~msg:"assoc" xyz xyz' ; 87 - assert_oct_equal ~msg:"invert" x x1 ; 88 - assert_oct_equal ~msg:"commut" x1 x2 99 + assert_oct_equal ~msg:"assoc" xyz xyz'; 100 + assert_oct_equal ~msg:"invert" x x1; 101 + assert_oct_equal ~msg:"commut" x1 x2 89 102 90 103 let suite = 91 - "All" >::: [ 92 - "XOR" >::: [ xor_selftest 300 ] ; 93 - "3DES-ECB" >::: [ ecb_selftest (module DES.ECB) 100 ] ; 94 - 95 - "3DES-CBC" >::: [ cbc_selftest (module DES.CBC) 100 ] ; 96 - 97 - "3DES-CTR" >::: [ ctr_selftest (module DES.CTR) 100; 98 - ctr_offsets (module DES.CTR) 100 ~zero:0L; ] ; 99 - 100 - "AES-ECB" >::: [ ecb_selftest (module AES.ECB) 100 ] ; 101 - "AES-CBC" >::: [ cbc_selftest (module AES.CBC) 100 ] ; 102 - "AES-CTR" >::: [ ctr_selftest (module AES.CTR) 100; 103 - ctr_offsets (module AES.CTR) 100 ~zero:(0L, 0L) ] ; 104 - 105 - ] 104 + "All" 105 + >::: [ 106 + "XOR" >::: [ xor_selftest 300 ]; 107 + "3DES-ECB" >::: [ ecb_selftest (module DES.ECB) 100 ]; 108 + "3DES-CBC" >::: [ cbc_selftest (module DES.CBC) 100 ]; 109 + "3DES-CTR" 110 + >::: [ 111 + ctr_selftest (module DES.CTR) 100; 112 + ctr_offsets (module DES.CTR) 100 ~zero:0L; 113 + ]; 114 + "AES-ECB" >::: [ ecb_selftest (module AES.ECB) 100 ]; 115 + "AES-CBC" >::: [ cbc_selftest (module AES.CBC) 100 ]; 116 + "AES-CTR" 117 + >::: [ 118 + ctr_selftest (module AES.CTR) 100; 119 + ctr_offsets (module AES.CTR) 100 ~zero:(0L, 0L); 120 + ]; 121 + ] 106 122 107 123 let () = 108 124 Crypto_rng_unix.use_default ();
+278 -220
tests/test_rsa.ml
··· 1 1 open OUnit2 2 - 3 2 open Crypto.Uncommon 4 3 open Crypto_pk 5 - 6 4 open Test_common 7 5 8 6 let vz = Z.of_string_base 16 9 7 10 8 module Null = struct 11 - 12 9 type g = string ref 13 10 14 11 let block = 1 15 - 16 12 let create ?time:_ () = ref "" 17 13 18 14 let generate_into ~g buf ~off n = ··· 22 18 with Invalid_argument _ -> raise Crypto_rng.Unseeded_generator 23 19 24 20 let reseed ~g buf = g := !g ^ buf 25 - 26 21 let seeded ~g = String.length !g > 0 27 - 28 22 let accumulate ~g _source = `Acc (reseed ~g) 29 - 30 23 let pools = 0 31 24 end 32 25 33 - let random_is seed = 34 - Crypto_rng.create ~seed:seed (module Null) 26 + let random_is seed = Crypto_rng.create ~seed (module Null) 35 27 36 28 let gen_rsa ~bits = 37 - let e = Z.(if bits < 24 then ~$3 else ~$0x10001) in 38 - let key = Rsa.(generate ~e ~bits ()) in 29 + let e = Z.(if bits < 24 then ~$3 else ~$0x10001) in 30 + let key = Rsa.(generate ~e ~bits ()) in 39 31 assert_equal 40 32 ~msg:Printf.(sprintf "key size not %d bits" bits) 41 - bits Rsa.(priv_bits key); 33 + bits 34 + Rsa.(priv_bits key); 42 35 key 43 36 44 37 let rsa_priv_of_primes_regression _ = 45 38 let e = Z.of_string "65537" 46 39 and p = Z.of_string "63541376186162969" 47 - and q = Z.of_string "31114890003960709" 48 - in 40 + and q = Z.of_string "31114890003960709" in 49 41 match Rsa.priv_of_primes ~e ~p ~q with 50 42 | exception _ -> assert_failure "expected an error" 51 - | Error _ -> () (* expected since there's no multiplicative inverse of e with p and q (e is not coprime to q-1) *) 43 + | Error _ -> 44 + () 45 + (* expected since there's no multiplicative inverse of e with p and q (e is not coprime to q-1) *) 52 46 | Ok _ -> assert_failure "expected an error" 53 47 54 48 let rsa_priv_of_primes_regression_62 _ = 55 49 (* reported in https://github.com/mirage/mirage-crypto/issues/62 *) 56 50 let e = Z.of_string "65537" 57 - and d = Z.of_string "3108431922676000487023821479912741349223115124336455693119108686758268939583975029271734799300422643496417197940166373626629291080744953934921341465364968117931378406446980227029856589807773725566867068344285160902403880508627911649654611750749193657211787605701986962527879646827816649512856008836705430283000626732452720870471763615388887743731833942366593788032394353874580439986226556671690116837426402890882760501726581078126288439928304880443426230837881572485961139412262011517513033934716366580117961709814170065275361576176352257579474519828879342959023237100172806323217608845596279839036960301580039126471" 58 - and p = Z.of_string "153903575880038685371306078431309624429262243098160628077155385424784731704538502041682563231842507936315834999272165353754081206847521073697105321898935865522941018859502063500927758809727634595752231111149172755709224739427971151799944749671230555614514021717987321482212474581192462617805386071920647746527" 59 - and q = Z.of_string "147755586168842154977618773600930512327712333912540690382962931855233965897097814139102488669702400832893695675498969512696944576662243412004204531041931249551207758395795244675585651830739018019197553505240463928167645984560980989768623533294470387237934457819888352229242173694504296968786124698140038767907" 51 + and d = 52 + Z.of_string 53 + "3108431922676000487023821479912741349223115124336455693119108686758268939583975029271734799300422643496417197940166373626629291080744953934921341465364968117931378406446980227029856589807773725566867068344285160902403880508627911649654611750749193657211787605701986962527879646827816649512856008836705430283000626732452720870471763615388887743731833942366593788032394353874580439986226556671690116837426402890882760501726581078126288439928304880443426230837881572485961139412262011517513033934716366580117961709814170065275361576176352257579474519828879342959023237100172806323217608845596279839036960301580039126471" 54 + and p = 55 + Z.of_string 56 + "153903575880038685371306078431309624429262243098160628077155385424784731704538502041682563231842507936315834999272165353754081206847521073697105321898935865522941018859502063500927758809727634595752231111149172755709224739427971151799944749671230555614514021717987321482212474581192462617805386071920647746527" 57 + and q = 58 + Z.of_string 59 + "147755586168842154977618773600930512327712333912540690382962931855233965897097814139102488669702400832893695675498969512696944576662243412004204531041931249551207758395795244675585651830739018019197553505240463928167645984560980989768623533294470387237934457819888352229242173694504296968786124698140038767907" 60 60 in 61 61 match Rsa.priv_of_primes ~e ~p ~q with 62 62 | exception _ -> assert_failure "expected ok" ··· 65 65 66 66 let rsa_priv_of_primes_regression_openssl _ = 67 67 let e = Z.of_string "65537" 68 - and d = Z.of_string "21364966876797335224937981624977347791305770821352826744474497613118281825259093305200082888709328664041494911511266059341542974088052755771514853303591832823929488189866359158215383109671205375680439686889619887327157945061169995481249526193538164572824333945969914914389168250738641676992853978375324165227210205971488866002577771580610214948106221456525289283949750296156474480874426885065689443846254958870114957680850339336866525023540164187023510310849878330359224986984785647477789876024460216392539430087762483228942540109987168856343992537776070047681434965518603440527188618027182112877268689620116969210881" 69 - and n = Z.of_string "26003711217261578550621411093788590465379160983527099623976249862031215614567566726273034808107255370042109943463095563849992606559609134476057069066550866318424151608276781565055186325047761889573394045234279585405785949661514281355247375815212099164453968239368389736365243837028903903448365174400765513065279734735815019879815099687407795902081216735845663253559329668423470162638675450802885820025108018425582646833277581392446992199509644421030247759098658756879463797225451870622102492377704722852444790028849818045531971545099489092363404165512101521453346604003075697381546910357245133314194790971809369935729" 70 - and p = Z.of_string "167173249562998285344683400251639903569188485523881465771532263785652572249038345452185825418846021360573529483365315302293816993785521941622864243995179759923984427691147261149068664025532174455772795926386901753396733517983474861943826134177458663773607339275619054052496007070211507365125143035209397925137" 71 - and q = Z.of_string "155549475081910328806496663071699269060677442531084543754539870945308062234020815068226104598610337898669482436828867339638346797527566740356018599563448611471831039630098224992256888467779107812081557864642282199069694603496263731994138092467683330232979926332910833392744391017831937213832896615543518213217" 72 - and dp = Z.of_string "132755002521578387208427344594600716257302676970335642531907550489959907687702391789577781987250291220069407638925560669432220144720901230294648011268216967903380465305980866674430162359351152591303223998548604831679503169353677551841013279935481616452288331251969392085510508445032389174215678839807099891905" 73 - and dq = Z.of_string "152169667453904159646778469559422238388806519569028538897642778063026012695267963386624048157997842343979683651561853178299789862671237414352891045879600543621061437719219486685819703226188594826677829613436846951019352886368859676966296527494096180039169354974776267777118591655496269139424576967397677391457" 74 - and q' = Z.of_string "71680879219372822058570738508033808601658137476144867031269752035545521971293179931151996149323998570187762489030494773672093398051821155138733159825225031201464935294877263527756698979264488516898115736148932950739809310843167520947847241161602397933518005104012950660916455073023725039529353919943223042903" 68 + and d = 69 + Z.of_string 70 + "21364966876797335224937981624977347791305770821352826744474497613118281825259093305200082888709328664041494911511266059341542974088052755771514853303591832823929488189866359158215383109671205375680439686889619887327157945061169995481249526193538164572824333945969914914389168250738641676992853978375324165227210205971488866002577771580610214948106221456525289283949750296156474480874426885065689443846254958870114957680850339336866525023540164187023510310849878330359224986984785647477789876024460216392539430087762483228942540109987168856343992537776070047681434965518603440527188618027182112877268689620116969210881" 71 + and n = 72 + Z.of_string 73 + "26003711217261578550621411093788590465379160983527099623976249862031215614567566726273034808107255370042109943463095563849992606559609134476057069066550866318424151608276781565055186325047761889573394045234279585405785949661514281355247375815212099164453968239368389736365243837028903903448365174400765513065279734735815019879815099687407795902081216735845663253559329668423470162638675450802885820025108018425582646833277581392446992199509644421030247759098658756879463797225451870622102492377704722852444790028849818045531971545099489092363404165512101521453346604003075697381546910357245133314194790971809369935729" 74 + and p = 75 + Z.of_string 76 + "167173249562998285344683400251639903569188485523881465771532263785652572249038345452185825418846021360573529483365315302293816993785521941622864243995179759923984427691147261149068664025532174455772795926386901753396733517983474861943826134177458663773607339275619054052496007070211507365125143035209397925137" 77 + and q = 78 + Z.of_string 79 + "155549475081910328806496663071699269060677442531084543754539870945308062234020815068226104598610337898669482436828867339638346797527566740356018599563448611471831039630098224992256888467779107812081557864642282199069694603496263731994138092467683330232979926332910833392744391017831937213832896615543518213217" 80 + and dp = 81 + Z.of_string 82 + "132755002521578387208427344594600716257302676970335642531907550489959907687702391789577781987250291220069407638925560669432220144720901230294648011268216967903380465305980866674430162359351152591303223998548604831679503169353677551841013279935481616452288331251969392085510508445032389174215678839807099891905" 83 + and dq = 84 + Z.of_string 85 + "152169667453904159646778469559422238388806519569028538897642778063026012695267963386624048157997842343979683651561853178299789862671237414352891045879600543621061437719219486685819703226188594826677829613436846951019352886368859676966296527494096180039169354974776267777118591655496269139424576967397677391457" 86 + and q' = 87 + Z.of_string 88 + "71680879219372822058570738508033808601658137476144867031269752035545521971293179931151996149323998570187762489030494773672093398051821155138733159825225031201464935294877263527756698979264488516898115736148932950739809310843167520947847241161602397933518005104012950660916455073023725039529353919943223042903" 75 89 in 76 90 match Rsa.priv ~e ~d ~n ~p ~q ~dp ~dq ~q' with 77 91 | exception _ -> assert_failure "expected ok" ··· 79 93 | Ok _ -> () 80 94 81 95 let rsa_selftest ~bits n = 82 - "selftest" >:: times ~n @@ fun _ -> 83 - let msg = 84 - let size = bits // 8 in 85 - let buf = Bytes.create size in 86 - Crypto_rng.generate_into buf ~off:0 size; 87 - let i = 1 + Randomconv.int ~bound:(pred size) Crypto_rng.generate in 88 - Bytes.set_uint8 buf 0 0; 89 - Bytes.(set_uint8 buf i (get_uint8 buf i lor 2)); 90 - Bytes.unsafe_to_string buf 91 - in 92 - let key = gen_rsa ~bits in 93 - let enc = Rsa.(encrypt ~key:(pub_of_priv key) msg) in 94 - let dec = Rsa.(decrypt ~key enc) in 96 + "selftest" 97 + >:: times ~n @@ fun _ -> 98 + let msg = 99 + let size = bits // 8 in 100 + let buf = Bytes.create size in 101 + Crypto_rng.generate_into buf ~off:0 size; 102 + let i = 1 + Randomconv.int ~bound:(pred size) Crypto_rng.generate in 103 + Bytes.set_uint8 buf 0 0; 104 + Bytes.(set_uint8 buf i (get_uint8 buf i lor 2)); 105 + Bytes.unsafe_to_string buf 106 + in 107 + let key = gen_rsa ~bits in 108 + let enc = Rsa.(encrypt ~key:(pub_of_priv key) msg) in 109 + let dec = Rsa.(decrypt ~key enc) in 95 110 96 - assert_oct_equal 97 - ~msg:Printf.(sprintf "failed decryption with") 98 - msg dec 111 + assert_oct_equal ~msg:Printf.(sprintf "failed decryption with") msg dec 99 112 100 - let show_key_size key = 101 - Printf.sprintf "(%d bits)" (Rsa.priv_bits key) 113 + let show_key_size key = Printf.sprintf "(%d bits)" (Rsa.priv_bits key) 102 114 103 115 let pkcs_message_for_bits bits = 104 116 let padding = 12 in 105 - let size = bits // 8 - padding in 106 - assert (size >= 0) ; Crypto_rng.generate size 117 + let size = (bits // 8) - padding in 118 + assert (size >= 0); 119 + Crypto_rng.generate size 107 120 108 121 let rsa_pkcs1_encode_selftest ~bits n = 109 - "selftest" >:: times ~n @@ fun _ -> 110 - let key = gen_rsa ~bits 111 - and msg = pkcs_message_for_bits bits in 112 - let sgn = Rsa.PKCS1.sig_encode ~key msg in 113 - match Rsa.(PKCS1.sig_decode ~key:(pub_of_priv key) sgn) with 114 - | None -> assert_failure ("unpad failure " ^ show_key_size key) 115 - | Some dec -> assert_oct_equal msg dec 116 - ~msg:("recovery failure " ^ show_key_size key) 122 + "selftest" 123 + >:: times ~n @@ fun _ -> 124 + let key = gen_rsa ~bits and msg = pkcs_message_for_bits bits in 125 + let sgn = Rsa.PKCS1.sig_encode ~key msg in 126 + match Rsa.(PKCS1.sig_decode ~key:(pub_of_priv key) sgn) with 127 + | None -> assert_failure ("unpad failure " ^ show_key_size key) 128 + | Some dec -> 129 + assert_oct_equal msg dec ~msg:("recovery failure " ^ show_key_size key) 117 130 118 131 let rsa_pkcs1_sign_selftest n = 119 132 let open Digestif.SHA1 in 120 - "selftest" >:: times ~n @@ fun _ -> 121 - let key = gen_rsa ~bits:(Rsa.PKCS1.min_key `SHA1) 122 - and msg = Crypto_rng.generate 47 in 123 - let pkey = Rsa.pub_of_priv key in 124 - assert_bool "invert 1" Rsa.PKCS1.( 125 - verify ~key:pkey ~hashp:any (`Message msg) 126 - ~signature:(sign ~hash:`SHA1 ~key (`Digest (digest_string msg |> to_raw_string))) ); 127 - assert_bool "invert 2" Rsa.PKCS1.( 128 - verify ~key:pkey ~hashp:any (`Digest (digest_string msg |> to_raw_string)) 129 - ~signature:(sign ~hash:`SHA1 ~key (`Message msg)) ) 133 + "selftest" 134 + >:: times ~n @@ fun _ -> 135 + let key = gen_rsa ~bits:(Rsa.PKCS1.min_key `SHA1) 136 + and msg = Crypto_rng.generate 47 in 137 + let pkey = Rsa.pub_of_priv key in 138 + assert_bool "invert 1" 139 + Rsa.PKCS1.( 140 + verify ~key:pkey ~hashp:any (`Message msg) 141 + ~signature: 142 + (sign ~hash:`SHA1 ~key 143 + (`Digest (digest_string msg |> to_raw_string)))); 144 + assert_bool "invert 2" 145 + Rsa.PKCS1.( 146 + verify ~key:pkey ~hashp:any 147 + (`Digest (digest_string msg |> to_raw_string)) 148 + ~signature:(sign ~hash:`SHA1 ~key (`Message msg))) 130 149 131 150 let rsa_pkcs1_encrypt_selftest ~bits n = 132 - "selftest" >:: times ~n @@ fun _ -> 133 - let key = gen_rsa ~bits 134 - and msg = pkcs_message_for_bits bits in 135 - let enc = Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg) in 136 - match Rsa.PKCS1.decrypt ~key enc with 137 - | None -> assert_failure ("unpad failure " ^ show_key_size key) 138 - | Some dec -> assert_oct_equal msg dec 139 - ~msg:("recovery failure " ^ show_key_size key) 151 + "selftest" 152 + >:: times ~n @@ fun _ -> 153 + let key = gen_rsa ~bits and msg = pkcs_message_for_bits bits in 154 + let enc = Rsa.(PKCS1.encrypt ~key:(pub_of_priv key) msg) in 155 + match Rsa.PKCS1.decrypt ~key enc with 156 + | None -> assert_failure ("unpad failure " ^ show_key_size key) 157 + | Some dec -> 158 + assert_oct_equal msg dec ~msg:("recovery failure " ^ show_key_size key) 140 159 141 160 let rsa_oaep_encrypt_selftest ~bits n = 142 161 let module OAEP_MD5 = Rsa.OAEP (Digestif.MD5) in ··· 144 163 let module OAEP_SHA224 = Rsa.OAEP (Digestif.SHA224) in 145 164 let module OAEP_SHA256 = Rsa.OAEP (Digestif.SHA256) in 146 165 let module OAEP_SHA384 = Rsa.OAEP (Digestif.SHA384) in 147 - "selftest" >:: times ~n @@ fun _ -> 148 - let key = gen_rsa ~bits in 149 - let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.MD5.digest_size - 2) in 150 - let enc = OAEP_MD5.encrypt ~key:(Rsa.pub_of_priv key) msg in 151 - (match OAEP_MD5.decrypt ~key enc with 152 - | None -> assert_failure "unpad failure" 153 - | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 154 - let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA1.digest_size - 2) in 155 - let enc = OAEP_SHA1.encrypt ~key:(Rsa.pub_of_priv key) msg in 156 - (match OAEP_SHA1.decrypt ~key enc with 157 - | None -> assert_failure "unpad failure" 158 - | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 159 - let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA224.digest_size - 2) in 160 - let enc = OAEP_SHA224.encrypt ~key:(Rsa.pub_of_priv key) msg in 161 - (match OAEP_SHA224.decrypt ~key enc with 162 - | None -> assert_failure "unpad failure" 163 - | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 164 - let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA256.digest_size - 2) in 165 - let enc = OAEP_SHA256.encrypt ~key:(Rsa.pub_of_priv key) msg in 166 - (match OAEP_SHA256.decrypt ~key enc with 167 - | None -> assert_failure "unpad failure" 168 - | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 169 - let msg = Crypto_rng.generate (bits // 8 - 2 * Digestif.SHA384.digest_size - 2) in 170 - let enc = OAEP_SHA384.encrypt ~key:(Rsa.pub_of_priv key) msg in 171 - (match OAEP_SHA384.decrypt ~key enc with 172 - | None -> assert_failure "unpad failure" 173 - | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure") 166 + "selftest" 167 + >:: times ~n @@ fun _ -> 168 + let key = gen_rsa ~bits in 169 + let msg = 170 + Crypto_rng.generate ((bits // 8) - (2 * Digestif.MD5.digest_size) - 2) 171 + in 172 + let enc = OAEP_MD5.encrypt ~key:(Rsa.pub_of_priv key) msg in 173 + (match OAEP_MD5.decrypt ~key enc with 174 + | None -> assert_failure "unpad failure" 175 + | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 176 + let msg = 177 + Crypto_rng.generate ((bits // 8) - (2 * Digestif.SHA1.digest_size) - 2) 178 + in 179 + let enc = OAEP_SHA1.encrypt ~key:(Rsa.pub_of_priv key) msg in 180 + (match OAEP_SHA1.decrypt ~key enc with 181 + | None -> assert_failure "unpad failure" 182 + | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 183 + let msg = 184 + Crypto_rng.generate ((bits // 8) - (2 * Digestif.SHA224.digest_size) - 2) 185 + in 186 + let enc = OAEP_SHA224.encrypt ~key:(Rsa.pub_of_priv key) msg in 187 + (match OAEP_SHA224.decrypt ~key enc with 188 + | None -> assert_failure "unpad failure" 189 + | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 190 + let msg = 191 + Crypto_rng.generate ((bits // 8) - (2 * Digestif.SHA256.digest_size) - 2) 192 + in 193 + let enc = OAEP_SHA256.encrypt ~key:(Rsa.pub_of_priv key) msg in 194 + (match OAEP_SHA256.decrypt ~key enc with 195 + | None -> assert_failure "unpad failure" 196 + | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure"); 197 + let msg = 198 + Crypto_rng.generate ((bits // 8) - (2 * Digestif.SHA384.digest_size) - 2) 199 + in 200 + let enc = OAEP_SHA384.encrypt ~key:(Rsa.pub_of_priv key) msg in 201 + match OAEP_SHA384.decrypt ~key enc with 202 + | None -> assert_failure "unpad failure" 203 + | Some dec -> assert_oct_equal msg dec ~msg:"recovery failure" 174 204 175 205 let rsa_pss_sign_selftest ~bits n = 176 206 let module Pss_sha1 = Rsa.PSS (Digestif.SHA1) in 177 - "selftest" >:: times ~n @@ fun _ -> 178 - let key = gen_rsa ~bits 179 - and msg = Crypto_rng.generate 1024 in 180 - let pkey = Rsa.pub_of_priv key in 181 - let dgst = Digestif.SHA1.(digest_string msg |> to_raw_string) in 182 - let signature = Pss_sha1.sign ~key (`Digest dgst) in 183 - Pss_sha1.(verify ~key:pkey (`Message msg) ~signature) |> assert_bool "invert 1" ; 184 - Pss_sha1.(verify ~key:pkey (`Digest dgst) 185 - ~signature:(Pss_sha1.sign ~key (`Message msg))) 186 - |> assert_bool "invert 2" 207 + "selftest" 208 + >:: times ~n @@ fun _ -> 209 + let key = gen_rsa ~bits and msg = Crypto_rng.generate 1024 in 210 + let pkey = Rsa.pub_of_priv key in 211 + let dgst = Digestif.SHA1.(digest_string msg |> to_raw_string) in 212 + let signature = Pss_sha1.sign ~key (`Digest dgst) in 213 + Pss_sha1.(verify ~key:pkey (`Message msg) ~signature) 214 + |> assert_bool "invert 1"; 215 + Pss_sha1.( 216 + verify ~key:pkey (`Digest dgst) 217 + ~signature:(Pss_sha1.sign ~key (`Message msg))) 218 + |> assert_bool "invert 2" 187 219 188 220 let rsa_pkcs1_cases = 189 221 let key () = 190 - let n = vz "c8a2069182394a2ab7c3f4190c15589c56a2d4bc42dca675b34cc950e24663048441e8aa593b2bc59e198b8c257e882120c62336e5cc745012c7ffb063eebe53f3c6504cba6cfe51baa3b6d1074b2f398171f4b1982f4d65caf882ea4d56f32ab57d0c44e6ad4e9cf57a4339eb6962406e350c1b15397183fbf1f0353c9fc991" 191 - and d = vz "5dfcb111072d29565ba1db3ec48f57645d9d8804ed598a4d470268a89067a2c921dff24ba2e37a3ce834555000dc868ee6588b7493303528b1b3a94f0b71730cf1e86fca5aeedc3afa16f65c0189d810ddcd81049ebbd0391868c50edec958b3a2aaeff6a575897e2f20a3ab5455c1bfa55010ac51a7799b1ff8483644a3d425" 192 - and e = vz "10001" 193 - in 222 + let n = 223 + vz 224 + "c8a2069182394a2ab7c3f4190c15589c56a2d4bc42dca675b34cc950e24663048441e8aa593b2bc59e198b8c257e882120c62336e5cc745012c7ffb063eebe53f3c6504cba6cfe51baa3b6d1074b2f398171f4b1982f4d65caf882ea4d56f32ab57d0c44e6ad4e9cf57a4339eb6962406e350c1b15397183fbf1f0353c9fc991" 225 + and d = 226 + vz 227 + "5dfcb111072d29565ba1db3ec48f57645d9d8804ed598a4d470268a89067a2c921dff24ba2e37a3ce834555000dc868ee6588b7493303528b1b3a94f0b71730cf1e86fca5aeedc3afa16f65c0189d810ddcd81049ebbd0391868c50edec958b3a2aaeff6a575897e2f20a3ab5455c1bfa55010ac51a7799b1ff8483644a3d425" 228 + and e = vz "10001" in 194 229 match Rsa.priv_of_exp ~e ~d ~n () with 195 230 | Error (`Msg m) -> invalid_arg "bad key %s" m 196 - | Ok key -> key, Rsa.pub_of_priv key 231 + | Ok key -> (key, Rsa.pub_of_priv key) 197 232 in 198 233 199 - let case ~hash ~msg ~sgn = test_case @@ fun _ -> 234 + let case ~hash ~msg ~sgn = 235 + test_case @@ fun _ -> 200 236 let msg = vx msg and sgn = vx sgn in 201 237 let key, public = key () in 202 238 Rsa.(PKCS1.sign ~hash ~key (`Message msg)) 203 - |> assert_oct_equal ~msg:"recomputing sig:" sgn ; 239 + |> assert_oct_equal ~msg:"recomputing sig:" sgn; 204 240 Rsa.(PKCS1.verify ~hashp:any ~key:public ~signature:sgn (`Message msg)) 205 - |> assert_bool "sig verification" in 241 + |> assert_bool "sig verification" 242 + in 206 243 207 - "FIPS 186-2 Test Vectors (1024 bits)" >::: [ 208 - 209 - case ~hash:`SHA1 210 - ~msg:"e8312742ae23c456ef28a23142c4490895832765dadce02afe5be5d31b0048fbeee2cf218b1747ad4fd81a2e17e124e6af17c3888e6d2d40c00807f423a233cad62ce9eaefb709856c94af166dba08e7a06965d7fc0d8e5cb26559c460e47bc088589d2242c9b3e62da4896fab199e144ec136db8d84ab84bcba04ca3b90c8e5" 211 - ~sgn:"28928e19eb86f9c00070a59edf6bf8433a45df495cd1c73613c2129840f48c4a2c24f11df79bc5c0782bcedde97dbbb2acc6e512d19f085027cd575038453d04905413e947e6e1dddbeb3535cdb3d8971fe0200506941056f21243503c83eadde053ed866c0e0250beddd927a08212aa8ac0efd61631ef89d8d049efb36bb35f" 212 - 213 - ; case ~hash:`SHA1 214 - ~msg:"4c95073dac19d0256eaadff3505910e431dd50018136afeaf690b7d18069fcc980f6f54135c30acb769bee23a7a72f6ce6d90cbc858c86dbbd64ba48a07c6d7d50c0e9746f97086ad6c68ee38a91bbeeeb2221aa2f2fb4090fd820d4c0ce5ff025ba8adf43ddef89f5f3653de15edcf3aa8038d4686960fc55b2917ec8a8f9a8" 215 - ~sgn:"53ab600a41c71393a271b0f32f521963087e56ebd7ad040e4ee8aa7c450ad18ac3c6a05d4ae8913e763cfe9623bd9cb1eb4bed1a38200500fa7df3d95dea485f032a0ab0c6589678f9e8391b5c2b1392997ac9f82f1d168878916aace9ac7455808056af8155231a29f42904b7ab87a5d71ed6395ee0a9d024b0ca3d01fd7150" 216 - 217 - ; case ~hash:`SHA1 218 - ~msg:"e075ad4b0f9b5b20376e467a1a35e308793ba38ed983d03887b8b82eda630e68b8618dc45b93de5555d7bcfed23756401e61f5516757de6ec3687a71755fb4a66cfaa3db0c9e69b631485b4c71c762eea229a0469c7357a440950792ba9cd7ae022a36b9a923c2ebd2aa69897f4cceba0e7aee97033d03810725a9b731833f27" 219 - ~sgn:"642609ce084f479271df596480252e2f892b3e7982dff95994c3eeda787f80f3f6198bbce33ec5515378d4b571d7186078b75b43aed11d342547386c5696eb3799a0b28475e54cd4ca7d036dcd8a11f5e10806f7d3b8cc4fcb3e93e857be958344a34e126809c15b3d33661cf57bf5c338f07acced60f14019335c152d86b3b2" 220 - 221 - ; case ~hash:`SHA224 222 - ~msg:"e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 223 - ~sgn:"5aa5033381bdd0acce332dd314daf008acaa9e835f832979891d1bda2b55d5eae35c479c06cac5bf33f432c8c0a5549d1d1b29c5e2589024d27800a0c235a61532c203cbc406ac6ecf63f52ae771b97c08e4b108ec916900e5a11b1d48cca86ca5a5a799ed32e99c815cef04cf8eb55223bfd4d9c3449264b60061bc3684bc82" 224 - 225 - ; case ~hash:`SHA256 226 - ~msg:"e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 227 - ~sgn:"0e7cdd121e40323ca6115d1ec6d1f9561738455f0e9e1cd858e8b566ae2da5e8ee63d8f15c3cdd88027e13406db609369c88ca99b34fa156c7ee62bc5a3923bb5a1edabd45c1a422aafcbb47e0947f35cfef87970b4b713162b21916cafb8c864a3e5b9ffc989401d4eae992312a32c5bc88abbb45f99ac885b54d6b8e61b6ec" 228 - 229 - ; case ~hash:`SHA384 230 - ~msg:"e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 231 - ~sgn:"1689a8523919ac77cc997ebc59cb908872d88b2855a309ead2779b888b22b4232da9b93bb19b32c1db77ad738c6e43361e9eb6b1a37c49a8f3c7c7ae7e784d19a62138741293e49b1831c0c3617eb43c56706d83314953470636441086419ab9e6fd1ec4f9d5cc6544815d1e02ed96a3ae64c6998b2cf238e79a12164352d12a" 232 - 233 - ; case ~hash:`SHA512 234 - ~msg:"e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 235 - ~sgn:"bf3ff2c69675f1b8ed421021801fb4ce29a757f7f8869ce436d0d75ab749efc8b903d9f9cb214686147f12f3335fa936689c192f310ae3c5d75493f44b24bc1cd3501584aaa5004b65a8716d1eda7240ad8a529d5a0cf169f4054b450e076ee0d41a0011c557aa69a84a8104c909201d60fe39c79e684347ef4d144ea18f7a4e" 236 - ] 244 + "FIPS 186-2 Test Vectors (1024 bits)" 245 + >::: [ 246 + case ~hash:`SHA1 247 + ~msg: 248 + "e8312742ae23c456ef28a23142c4490895832765dadce02afe5be5d31b0048fbeee2cf218b1747ad4fd81a2e17e124e6af17c3888e6d2d40c00807f423a233cad62ce9eaefb709856c94af166dba08e7a06965d7fc0d8e5cb26559c460e47bc088589d2242c9b3e62da4896fab199e144ec136db8d84ab84bcba04ca3b90c8e5" 249 + ~sgn: 250 + "28928e19eb86f9c00070a59edf6bf8433a45df495cd1c73613c2129840f48c4a2c24f11df79bc5c0782bcedde97dbbb2acc6e512d19f085027cd575038453d04905413e947e6e1dddbeb3535cdb3d8971fe0200506941056f21243503c83eadde053ed866c0e0250beddd927a08212aa8ac0efd61631ef89d8d049efb36bb35f"; 251 + case ~hash:`SHA1 252 + ~msg: 253 + "4c95073dac19d0256eaadff3505910e431dd50018136afeaf690b7d18069fcc980f6f54135c30acb769bee23a7a72f6ce6d90cbc858c86dbbd64ba48a07c6d7d50c0e9746f97086ad6c68ee38a91bbeeeb2221aa2f2fb4090fd820d4c0ce5ff025ba8adf43ddef89f5f3653de15edcf3aa8038d4686960fc55b2917ec8a8f9a8" 254 + ~sgn: 255 + "53ab600a41c71393a271b0f32f521963087e56ebd7ad040e4ee8aa7c450ad18ac3c6a05d4ae8913e763cfe9623bd9cb1eb4bed1a38200500fa7df3d95dea485f032a0ab0c6589678f9e8391b5c2b1392997ac9f82f1d168878916aace9ac7455808056af8155231a29f42904b7ab87a5d71ed6395ee0a9d024b0ca3d01fd7150"; 256 + case ~hash:`SHA1 257 + ~msg: 258 + "e075ad4b0f9b5b20376e467a1a35e308793ba38ed983d03887b8b82eda630e68b8618dc45b93de5555d7bcfed23756401e61f5516757de6ec3687a71755fb4a66cfaa3db0c9e69b631485b4c71c762eea229a0469c7357a440950792ba9cd7ae022a36b9a923c2ebd2aa69897f4cceba0e7aee97033d03810725a9b731833f27" 259 + ~sgn: 260 + "642609ce084f479271df596480252e2f892b3e7982dff95994c3eeda787f80f3f6198bbce33ec5515378d4b571d7186078b75b43aed11d342547386c5696eb3799a0b28475e54cd4ca7d036dcd8a11f5e10806f7d3b8cc4fcb3e93e857be958344a34e126809c15b3d33661cf57bf5c338f07acced60f14019335c152d86b3b2"; 261 + case ~hash:`SHA224 262 + ~msg: 263 + "e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 264 + ~sgn: 265 + "5aa5033381bdd0acce332dd314daf008acaa9e835f832979891d1bda2b55d5eae35c479c06cac5bf33f432c8c0a5549d1d1b29c5e2589024d27800a0c235a61532c203cbc406ac6ecf63f52ae771b97c08e4b108ec916900e5a11b1d48cca86ca5a5a799ed32e99c815cef04cf8eb55223bfd4d9c3449264b60061bc3684bc82"; 266 + case ~hash:`SHA256 267 + ~msg: 268 + "e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 269 + ~sgn: 270 + "0e7cdd121e40323ca6115d1ec6d1f9561738455f0e9e1cd858e8b566ae2da5e8ee63d8f15c3cdd88027e13406db609369c88ca99b34fa156c7ee62bc5a3923bb5a1edabd45c1a422aafcbb47e0947f35cfef87970b4b713162b21916cafb8c864a3e5b9ffc989401d4eae992312a32c5bc88abbb45f99ac885b54d6b8e61b6ec"; 271 + case ~hash:`SHA384 272 + ~msg: 273 + "e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 274 + ~sgn: 275 + "1689a8523919ac77cc997ebc59cb908872d88b2855a309ead2779b888b22b4232da9b93bb19b32c1db77ad738c6e43361e9eb6b1a37c49a8f3c7c7ae7e784d19a62138741293e49b1831c0c3617eb43c56706d83314953470636441086419ab9e6fd1ec4f9d5cc6544815d1e02ed96a3ae64c6998b2cf238e79a12164352d12a"; 276 + case ~hash:`SHA512 277 + ~msg: 278 + "e567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba" 279 + ~sgn: 280 + "bf3ff2c69675f1b8ed421021801fb4ce29a757f7f8869ce436d0d75ab749efc8b903d9f9cb214686147f12f3335fa936689c192f310ae3c5d75493f44b24bc1cd3501584aaa5004b65a8716d1eda7240ad8a529d5a0cf169f4054b450e076ee0d41a0011c557aa69a84a8104c909201d60fe39c79e684347ef4d144ea18f7a4e"; 281 + ] 237 282 238 283 let rsa_pss_cases = 239 284 let key () = 240 - let n = vz "bcb47b2e0dafcba81ff2a2b5cb115ca7e757184c9d72bcdcda707a146b3b4e29989ddc660bd694865b932b71ca24a335cf4d339c719183e6222e4c9ea6875acd528a49ba21863fe08147c3a47e41990b51a03f77d22137f8d74c43a5a45f4e9e18a2d15db051dc89385db9cf8374b63a8cc88113710e6d8179075b7dc79ee76b" 241 - and d = vz "383a6f19e1ea27fd08c7fbc3bfa684bd6329888c0bbe4c98625e7181f411cfd0853144a3039404dda41bce2e31d588ec57c0e148146f0fa65b39008ba5835f829ba35ae2f155d61b8a12581b99c927fd2f22252c5e73cba4a610db3973e019ee0f95130d4319ed413432f2e5e20d5215cdd27c2164206b3f80edee51938a25c1" 242 - and e = vz "10001" 243 - in 285 + let n = 286 + vz 287 + "bcb47b2e0dafcba81ff2a2b5cb115ca7e757184c9d72bcdcda707a146b3b4e29989ddc660bd694865b932b71ca24a335cf4d339c719183e6222e4c9ea6875acd528a49ba21863fe08147c3a47e41990b51a03f77d22137f8d74c43a5a45f4e9e18a2d15db051dc89385db9cf8374b63a8cc88113710e6d8179075b7dc79ee76b" 288 + and d = 289 + vz 290 + "383a6f19e1ea27fd08c7fbc3bfa684bd6329888c0bbe4c98625e7181f411cfd0853144a3039404dda41bce2e31d588ec57c0e148146f0fa65b39008ba5835f829ba35ae2f155d61b8a12581b99c927fd2f22252c5e73cba4a610db3973e019ee0f95130d4319ed413432f2e5e20d5215cdd27c2164206b3f80edee51938a25c1" 291 + and e = vz "10001" in 244 292 match Rsa.priv_of_exp ~e ~d ~n () with 245 293 | Error (`Msg m) -> invalid_arg "bad key %s" m 246 - | Ok key -> key, Rsa.pub_of_priv key 247 - and salt = "6f2841166a64471d4f0b8ed0dbb7db32161da13b" 248 - in 294 + | Ok key -> (key, Rsa.pub_of_priv key) 295 + and salt = "6f2841166a64471d4f0b8ed0dbb7db32161da13b" in 249 296 250 - let case (type a) ~(hash : a Digestif.hash) ~msg ~sgn = test_case @@ fun _ -> 297 + let case (type a) ~(hash : a Digestif.hash) ~msg ~sgn = 298 + test_case @@ fun _ -> 251 299 let module H = (val Digestif.module_of hash) in 252 300 let module Pss = Rsa.PSS (H) in 253 301 let msg = vx msg and sgn = vx sgn and salt = vx salt in 254 302 let key, public = key () in 255 303 let slen = String.length salt in 256 304 Pss.sign ~g:(random_is salt) ~slen ~mask:`No ~key (`Message msg) 257 - |> assert_oct_equal ~msg:"recomputing sig:" sgn ; 305 + |> assert_oct_equal ~msg:"recomputing sig:" sgn; 258 306 Pss.verify ~key:public ~slen ~signature:sgn (`Message msg) 259 - |> assert_bool "sig verification" in 307 + |> assert_bool "sig verification" 308 + in 260 309 261 - "FIPS 186-2 Test Vectors (1024 bits)" >::: [ 262 - 263 - case ~hash:Digestif.sha1 264 - ~msg:"1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 265 - ~sgn:"682cf53c1145d22a50caa9eb1a9ba70670c5915e0fdfde6457a765de2a8fe12de9794172a78d14e668d498acedad616504bb1764d094607070080592c3a69c343d982bd77865873d35e24822caf43443cc10249af6a1e26ef344f28b9ef6f14e09ad839748e5148bcceb0fd2aa63709cb48975cbf9c7b49abc66a1dc6cb5b31a" 266 - 267 - ; case ~hash:Digestif.sha1 268 - ~msg:"9968809a557bb4f892039ff2b6a0efcd06523624bc3b9ad359a7cf143c4942e874c797b9d37a563d436fe19d5db1aad738caa2617f87f50fc7fcf4361fc85212e89a9465e7f4c361982f64c8c5c0aa5258b9e94f6e934e8dac2ace7cd6095c909de85fe7b973632c384d0ebb165556050d28f236aee70e16b13a432d8a94c62b" 269 - ~sgn:"8f5ea7037367e0db75670504085790acd6d97d96f51e76df916a0c2e4cd66e1ab51c4cd8e2c3e4ef781f638ad65dc49c8d6d7f6930f80b6ae199ea283a8924925a50edab79bb3f34861ffa8b2f96fdf9f8cad3d3f8f025478c81f316da61b0d6a7f71b9068efdfb33c21983a922f4669280d8e84f963ff885ef56dd3f50381db" 270 - 271 - ; case ~hash:Digestif.sha224 272 - ~msg:"1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 273 - ~sgn:"53d859c9f10abf1c00284a4b55bf2bd84d8e313b4f3c35b8dec7bc3afe39b9b8a155418ead1931895769ce2340be2091f2385bbcf10d9e92bcf5d0e2960d10e792e7d865c64e50d19ffa13e52817d7d8d8db34392c2374a2e9b69184f92a4ad9b1b8bae99ca614d204b65a438e38dbbfc8c7cc44ed5677af70ce6c4f951f0244" 274 - 275 - ; case ~hash:Digestif.sha256 276 - ~msg:"1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 277 - ~sgn:"7b1d37278e549898d4084e2210c4a9961edfe7b5963550cca1904248c8681513539017820f0e9bd074b9f8a067b9fefff7f1fa20bf2d0c75015ff020b2210cc7f79034fedf68e8d44a007abf4dd82c26e8b00393723aea15abfbc22941c8cf79481718c008da713fb8f54cb3fca890bde1137314334b9b0a18515bfa48e5ccd0" 278 - 279 - ; case ~hash:Digestif.sha384 280 - ~msg:"1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 281 - ~sgn:"8f16c807bef3ed6f74ee7ff5c360a5428c6c2f105178b58ff7d073e566dad6e7718d3129c768cd5a9666de2b6c947177b45709dc7cd0f43b0ba6fc75578e1196acc15ca3afe4a78c144cb6885c1cc815f7f98925bc04ad2ff20fc1068b045d9450e2a1dcf5a161ceabba2b0b66c7354fdb80fa1d729e5f976387f24a697a7e56" 310 + "FIPS 186-2 Test Vectors (1024 bits)" 311 + >::: [ 312 + case ~hash:Digestif.sha1 313 + ~msg: 314 + "1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 315 + ~sgn: 316 + "682cf53c1145d22a50caa9eb1a9ba70670c5915e0fdfde6457a765de2a8fe12de9794172a78d14e668d498acedad616504bb1764d094607070080592c3a69c343d982bd77865873d35e24822caf43443cc10249af6a1e26ef344f28b9ef6f14e09ad839748e5148bcceb0fd2aa63709cb48975cbf9c7b49abc66a1dc6cb5b31a"; 317 + case ~hash:Digestif.sha1 318 + ~msg: 319 + "9968809a557bb4f892039ff2b6a0efcd06523624bc3b9ad359a7cf143c4942e874c797b9d37a563d436fe19d5db1aad738caa2617f87f50fc7fcf4361fc85212e89a9465e7f4c361982f64c8c5c0aa5258b9e94f6e934e8dac2ace7cd6095c909de85fe7b973632c384d0ebb165556050d28f236aee70e16b13a432d8a94c62b" 320 + ~sgn: 321 + "8f5ea7037367e0db75670504085790acd6d97d96f51e76df916a0c2e4cd66e1ab51c4cd8e2c3e4ef781f638ad65dc49c8d6d7f6930f80b6ae199ea283a8924925a50edab79bb3f34861ffa8b2f96fdf9f8cad3d3f8f025478c81f316da61b0d6a7f71b9068efdfb33c21983a922f4669280d8e84f963ff885ef56dd3f50381db"; 322 + case ~hash:Digestif.sha224 323 + ~msg: 324 + "1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 325 + ~sgn: 326 + "53d859c9f10abf1c00284a4b55bf2bd84d8e313b4f3c35b8dec7bc3afe39b9b8a155418ead1931895769ce2340be2091f2385bbcf10d9e92bcf5d0e2960d10e792e7d865c64e50d19ffa13e52817d7d8d8db34392c2374a2e9b69184f92a4ad9b1b8bae99ca614d204b65a438e38dbbfc8c7cc44ed5677af70ce6c4f951f0244"; 327 + case ~hash:Digestif.sha256 328 + ~msg: 329 + "1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 330 + ~sgn: 331 + "7b1d37278e549898d4084e2210c4a9961edfe7b5963550cca1904248c8681513539017820f0e9bd074b9f8a067b9fefff7f1fa20bf2d0c75015ff020b2210cc7f79034fedf68e8d44a007abf4dd82c26e8b00393723aea15abfbc22941c8cf79481718c008da713fb8f54cb3fca890bde1137314334b9b0a18515bfa48e5ccd0"; 332 + case ~hash:Digestif.sha384 333 + ~msg: 334 + "1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 335 + ~sgn: 336 + "8f16c807bef3ed6f74ee7ff5c360a5428c6c2f105178b58ff7d073e566dad6e7718d3129c768cd5a9666de2b6c947177b45709dc7cd0f43b0ba6fc75578e1196acc15ca3afe4a78c144cb6885c1cc815f7f98925bc04ad2ff20fc1068b045d9450e2a1dcf5a161ceabba2b0b66c7354fdb80fa1d729e5f976387f24a697a7e56"; 337 + case ~hash:Digestif.sha512 338 + ~msg: 339 + "1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 340 + ~sgn: 341 + "a833ba31634f8773e4fe6ea0c69e1a23766a939d34b32fc78b774b22e46a646c25e6e1062d234ed48b1aba0f830529ff6afc296cc8dc207bbc15391623beac5f6c3db557ca49d0e42c962de95b5ff548cff970f5c73f439cfe82d3907be60240f56b6a4259cc96dfd8fe02a0bfa26e0223f68214428fff0ae40162198cc5cbd1"; 342 + ] 282 343 283 - ; case ~hash:Digestif.sha512 284 - ~msg:"1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e075c104858f2f6e6cfd6abdedf015a821d03608bf4eba3169a6725ec422cd9069498b5515a9608ae7cc30e3d2ecfc1db6825f3e996ce9a5092926bc1cf61aa42d7f240e6f7aa0edb38bf81aa929d66bb5d890018088458720d72d569247b0c" 285 - ~sgn:"a833ba31634f8773e4fe6ea0c69e1a23766a939d34b32fc78b774b22e46a646c25e6e1062d234ed48b1aba0f830529ff6afc296cc8dc207bbc15391623beac5f6c3db557ca49d0e42c962de95b5ff548cff970f5c73f439cfe82d3907be60240f56b6a4259cc96dfd8fe02a0bfa26e0223f68214428fff0ae40162198cc5cbd1" 344 + let suite = 345 + [ 346 + "RSA" 347 + >::: [ 348 + rsa_selftest ~bits:89 100; 349 + rsa_selftest ~bits:131 100; 350 + rsa_selftest ~bits:1024 10; 351 + rsa_selftest ~bits:2048 10; 352 + ]; 353 + "RSA-PKCS1-ENC" 354 + >::: [ 355 + rsa_pkcs1_encrypt_selftest ~bits:111 1000; 356 + rsa_pkcs1_encrypt_selftest ~bits:512 10; 357 + ]; 358 + "RSA-PKCS1-SIGN" 359 + >::: [ 360 + rsa_pkcs1_encode_selftest ~bits:111 100; 361 + rsa_pkcs1_encode_selftest ~bits:512 10; 362 + rsa_pkcs1_sign_selftest 10; 363 + rsa_pkcs1_cases; 364 + ]; 365 + "RSA-OAEP(SHA1)-ENC" 366 + >::: [ 367 + rsa_oaep_encrypt_selftest ~bits:1023 15; 368 + rsa_oaep_encrypt_selftest ~bits:1024 15; 369 + rsa_oaep_encrypt_selftest ~bits:1025 15; 370 + ]; 371 + "RSA-PSS(SHA1)-END" 372 + >::: [ 373 + rsa_pss_sign_selftest ~bits:511 15; 374 + rsa_pss_sign_selftest ~bits:512 15; 375 + rsa_pss_sign_selftest ~bits:513 15; 376 + rsa_pss_cases; 377 + ]; 378 + "RSA-regression" 379 + >::: [ 380 + test_case rsa_priv_of_primes_regression; 381 + test_case rsa_priv_of_primes_regression_62; 382 + test_case rsa_priv_of_primes_regression_openssl; 383 + ]; 286 384 ] 287 - 288 - let suite = [ 289 - "RSA" >::: [ 290 - rsa_selftest ~bits:89 100 ; 291 - rsa_selftest ~bits:131 100 ; 292 - rsa_selftest ~bits:1024 10 ; 293 - rsa_selftest ~bits:2048 10 ; 294 - ] ; 295 - 296 - "RSA-PKCS1-ENC" >::: [ 297 - rsa_pkcs1_encrypt_selftest ~bits:111 1000 ; 298 - rsa_pkcs1_encrypt_selftest ~bits:512 10 ; 299 - ] ; 300 - 301 - "RSA-PKCS1-SIGN" >::: [ 302 - rsa_pkcs1_encode_selftest ~bits:111 100 ; 303 - rsa_pkcs1_encode_selftest ~bits:512 10 ; 304 - rsa_pkcs1_sign_selftest 10; 305 - rsa_pkcs1_cases; 306 - ] ; 307 - 308 - "RSA-OAEP(SHA1)-ENC" >::: [ 309 - rsa_oaep_encrypt_selftest ~bits:1023 15 ; 310 - rsa_oaep_encrypt_selftest ~bits:1024 15 ; 311 - rsa_oaep_encrypt_selftest ~bits:1025 15 ; 312 - ] ; 313 - 314 - "RSA-PSS(SHA1)-END" >::: [ 315 - rsa_pss_sign_selftest ~bits:511 15 ; 316 - rsa_pss_sign_selftest ~bits:512 15 ; 317 - rsa_pss_sign_selftest ~bits:513 15 ; 318 - rsa_pss_cases 319 - ] ; 320 - 321 - "RSA-regression" >::: [ 322 - test_case rsa_priv_of_primes_regression ; 323 - test_case rsa_priv_of_primes_regression_62 ; 324 - test_case rsa_priv_of_primes_regression_openssl ; 325 - ] ; 326 - ]
+6 -9
tests/test_symmetric_runner.ml
··· 2 2 3 3 let () = 4 4 Format.printf "accel: %a\n%!" 5 - (fun ppf -> List.iter @@ fun x -> 6 - Format.fprintf ppf "%s " @@ 7 - match x with `XOR -> "XOR" | `AES -> "AES" | `GHASH -> "GHASH") 5 + (fun ppf -> 6 + List.iter @@ fun x -> 7 + Format.fprintf ppf "%s " 8 + @@ match x with `XOR -> "XOR" | `AES -> "AES" | `GHASH -> "GHASH") 8 9 Crypto.accelerated 9 10 10 11 let suite = 11 - "All" >::: [ 12 - "Basic" >::: Test_base.suite; 13 - "Cipher" >::: Test_cipher.suite; 14 - ] 12 + "All" >::: [ "Basic" >::: Test_base.suite; "Cipher" >::: Test_cipher.suite ] 15 13 16 - let () = 17 - run_test_tt_main suite 14 + let () = run_test_tt_main suite
+114 -110
tests/wycheproof/wycheproof.ml
··· 24 24 !st 25 25 and digit c = 26 26 match c with 27 - | '0'..'9' -> int_of_char c - 0x30 28 - | 'A'..'F' -> int_of_char c - 0x41 + 10 29 - | 'a'..'f' -> int_of_char c - 0x61 + 10 27 + | '0' .. '9' -> int_of_char c - 0x30 28 + | 'A' .. 'F' -> int_of_char c - 0x41 + 10 29 + | 'a' .. 'f' -> int_of_char c - 0x61 + 10 30 30 | _ -> invalid_arg "bad character" 31 31 in 32 32 let out = Bytes.create (String.length s / 2) in 33 33 let _idx, leftover = 34 - fold (fun (idx, leftover) c -> 34 + fold 35 + (fun (idx, leftover) c -> 35 36 let c = digit c in 36 37 match leftover with 37 - | None -> idx, Some (c lsl 4) 38 + | None -> (idx, Some (c lsl 4)) 38 39 | Some c' -> 39 - Bytes.set_uint8 out idx (c' lor c); 40 - succ idx, None) 40 + Bytes.set_uint8 out idx (c' lor c); 41 + (succ idx, None)) 41 42 (0, None) s 42 43 in 43 44 assert (leftover = None); ··· 50 51 ~enc:(fun h -> 51 52 (* Encode hex back to string - reverse of hex_of_string *) 52 53 let buf = Buffer.create (String.length h * 2) in 53 - String.iter (fun c -> 54 - Buffer.add_string buf (Printf.sprintf "%02x" (Char.code c)) 55 - ) h; 54 + String.iter 55 + (fun c -> Buffer.add_string buf (Printf.sprintf "%02x" (Char.code c))) 56 + h; 56 57 Buffer.contents buf) 57 58 Jsont.string 58 59 ··· 76 77 | "invalid" -> Invalid 77 78 | _ -> failwith "test_result: expected valid, acceptable, or invalid") 78 79 ~enc:(function 79 - | Valid -> "valid" 80 - | Acceptable -> "acceptable" 81 - | Invalid -> "invalid") 80 + | Valid -> "valid" | Acceptable -> "acceptable" | Invalid -> "invalid") 82 81 Jsont.string 83 82 84 83 type ecdh_test = { ··· 93 92 } 94 93 95 94 let pp_ecdh_test fmt t = 96 - Format.fprintf fmt "{ tcId = %d; comment = %S; curve = %a; public = %a; private_ = %a; shared = %a; result = %a; flags = [%s] }" 95 + Format.fprintf fmt 96 + "{ tcId = %d; comment = %S; curve = %a; public = %a; private_ = %a; shared \ 97 + = %a; result = %a; flags = [%s] }" 97 98 t.tcId t.comment 98 - (Format.pp_print_option pp_json) t.curve 99 - pp_hex t.public 100 - pp_hex t.private_ 101 - pp_hex t.shared 102 - pp_test_result t.result 99 + (Format.pp_print_option pp_json) 100 + t.curve pp_hex t.public pp_hex t.private_ pp_hex t.shared pp_test_result 101 + t.result 103 102 (String.concat "; " (List.map (fun s -> "\"" ^ s ^ "\"") t.flags)) 104 103 105 - let show_ecdh_test t = 106 - Format.asprintf "%a" pp_ecdh_test t 104 + let show_ecdh_test t = Format.asprintf "%a" pp_ecdh_test t 107 105 108 106 let ecdh_test_jsont = 109 107 Jsont.Object.map ~kind:"ecdh_test" 110 108 (fun tcId comment curve public private_ shared result flags -> 111 - { tcId; comment; curve; public; private_; shared; result; 112 - flags = Option.value ~default:[] flags }) 109 + { 110 + tcId; 111 + comment; 112 + curve; 113 + public; 114 + private_; 115 + shared; 116 + result; 117 + flags = Option.value ~default:[] flags; 118 + }) 113 119 |> Jsont.Object.mem "tcId" Jsont.int ~enc:(fun t -> t.tcId) 114 120 |> Jsont.Object.mem "comment" Jsont.string ~enc:(fun t -> t.comment) 115 121 |> Jsont.Object.opt_mem "curve" Jsont.json ~enc:(fun t -> t.curve) ··· 117 123 |> Jsont.Object.mem "private" hex_jsont ~enc:(fun t -> t.private_) 118 124 |> Jsont.Object.mem "shared" hex_jsont ~enc:(fun t -> t.shared) 119 125 |> Jsont.Object.mem "result" test_result_jsont ~enc:(fun t -> t.result) 120 - |> Jsont.Object.opt_mem "flags" (Jsont.list Jsont.string) 121 - ~enc:(fun t -> if t.flags = [] then None else Some t.flags) 122 - |> Jsont.Object.skip_unknown 123 - |> Jsont.Object.finish 126 + |> Jsont.Object.opt_mem "flags" (Jsont.list Jsont.string) ~enc:(fun t -> 127 + if t.flags = [] then None else Some t.flags) 128 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 124 129 125 130 let has_ignored_flag test ~ignored_flags = 126 131 List.exists ··· 135 140 } 136 141 137 142 let pp_ecdh_test_group fmt t = 138 - Format.fprintf fmt "{ curve = %S; tests = [%d tests]; encoding = %a; type_ = %a }" 139 - t.curve (List.length t.tests) 140 - (Format.pp_print_option pp_json) t.encoding 141 - (Format.pp_print_option pp_json) t.type_ 143 + Format.fprintf fmt 144 + "{ curve = %S; tests = [%d tests]; encoding = %a; type_ = %a }" t.curve 145 + (List.length t.tests) 146 + (Format.pp_print_option pp_json) 147 + t.encoding 148 + (Format.pp_print_option pp_json) 149 + t.type_ 142 150 143 - let show_ecdh_test_group t = 144 - Format.asprintf "%a" pp_ecdh_test_group t 151 + let show_ecdh_test_group t = Format.asprintf "%a" pp_ecdh_test_group t 145 152 146 153 let ecdh_test_group_jsont = 147 - Jsont.Object.map ~kind:"ecdh_test_group" 148 - (fun curve tests encoding type_ -> 154 + Jsont.Object.map ~kind:"ecdh_test_group" (fun curve tests encoding type_ -> 149 155 { curve; tests; encoding; type_ }) 150 156 |> Jsont.Object.mem "curve" Jsont.string ~enc:(fun t -> t.curve) 151 - |> Jsont.Object.mem "tests" (Jsont.list ecdh_test_jsont) ~enc:(fun t -> t.tests) 157 + |> Jsont.Object.mem "tests" (Jsont.list ecdh_test_jsont) ~enc:(fun t -> 158 + t.tests) 152 159 |> Jsont.Object.opt_mem "encoding" Jsont.json ~enc:(fun t -> t.encoding) 153 160 |> Jsont.Object.opt_mem "type" Jsont.json ~enc:(fun t -> t.type_) 154 - |> Jsont.Object.skip_unknown 155 - |> Jsont.Object.finish 161 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 156 162 157 163 type ecdsa_key = { 158 164 curve : string; ··· 164 170 } 165 171 166 172 let pp_ecdsa_key fmt t = 167 - Format.fprintf fmt "{ curve = %S; keySize = %d; type_ = %a; uncompressed = %a; wx = %a; wy = %a }" 168 - t.curve t.keySize 169 - pp_json t.type_ 170 - pp_hex t.uncompressed 171 - pp_hex t.wx 172 - pp_hex t.wy 173 + Format.fprintf fmt 174 + "{ curve = %S; keySize = %d; type_ = %a; uncompressed = %a; wx = %a; wy = \ 175 + %a }" 176 + t.curve t.keySize pp_json t.type_ pp_hex t.uncompressed pp_hex t.wx pp_hex 177 + t.wy 173 178 174 - let show_ecdsa_key t = 175 - Format.asprintf "%a" pp_ecdsa_key t 179 + let show_ecdsa_key t = Format.asprintf "%a" pp_ecdsa_key t 176 180 177 181 let ecdsa_key_jsont = 178 182 Jsont.Object.map ~kind:"ecdsa_key" ··· 184 188 |> Jsont.Object.mem "uncompressed" hex_jsont ~enc:(fun t -> t.uncompressed) 185 189 |> Jsont.Object.mem "wx" hex_jsont ~enc:(fun t -> t.wx) 186 190 |> Jsont.Object.mem "wy" hex_jsont ~enc:(fun t -> t.wy) 187 - |> Jsont.Object.skip_unknown 188 - |> Jsont.Object.finish 191 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 189 192 190 193 type dsa_test = { 191 194 tcId : int; ··· 197 200 } 198 201 199 202 let pp_dsa_test fmt t = 200 - Format.fprintf fmt "{ tcId = %d; comment = %S; msg = %a; sig_ = %a; result = %a; flags = [%s] }" 201 - t.tcId t.comment 202 - pp_hex t.msg 203 - pp_hex t.sig_ 204 - pp_test_result t.result 203 + Format.fprintf fmt 204 + "{ tcId = %d; comment = %S; msg = %a; sig_ = %a; result = %a; flags = [%s] \ 205 + }" 206 + t.tcId t.comment pp_hex t.msg pp_hex t.sig_ pp_test_result t.result 205 207 (String.concat "; " (List.map (fun s -> "\"" ^ s ^ "\"") t.flags)) 206 208 207 - let show_dsa_test t = 208 - Format.asprintf "%a" pp_dsa_test t 209 + let show_dsa_test t = Format.asprintf "%a" pp_dsa_test t 209 210 210 211 let dsa_test_jsont = 211 - Jsont.Object.map ~kind:"dsa_test" 212 - (fun tcId comment msg sig_ result flags -> 213 - { tcId; comment; msg; sig_; result; 214 - flags = Option.value ~default:[] flags }) 212 + Jsont.Object.map ~kind:"dsa_test" (fun tcId comment msg sig_ result flags -> 213 + { 214 + tcId; 215 + comment; 216 + msg; 217 + sig_; 218 + result; 219 + flags = Option.value ~default:[] flags; 220 + }) 215 221 |> Jsont.Object.mem "tcId" Jsont.int ~enc:(fun t -> t.tcId) 216 222 |> Jsont.Object.mem "comment" Jsont.string ~enc:(fun t -> t.comment) 217 223 |> Jsont.Object.mem "msg" hex_jsont ~enc:(fun t -> t.msg) 218 224 |> Jsont.Object.mem "sig" hex_jsont ~enc:(fun t -> t.sig_) 219 225 |> Jsont.Object.mem "result" test_result_jsont ~enc:(fun t -> t.result) 220 - |> Jsont.Object.opt_mem "flags" (Jsont.list Jsont.string) 221 - ~enc:(fun t -> if t.flags = [] then None else Some t.flags) 222 - |> Jsont.Object.skip_unknown 223 - |> Jsont.Object.finish 226 + |> Jsont.Object.opt_mem "flags" (Jsont.list Jsont.string) ~enc:(fun t -> 227 + if t.flags = [] then None else Some t.flags) 228 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 224 229 225 230 type ecdsa_test_group = { 226 231 key : ecdsa_key; ··· 232 237 } 233 238 234 239 let pp_ecdsa_test_group fmt t = 235 - Format.fprintf fmt "{ key = %a; keyDer = %S; keyPem = %S; sha = %S; tests = [%d tests]; type_ = %a }" 236 - pp_ecdsa_key t.key 237 - t.keyDer t.keyPem t.sha 238 - (List.length t.tests) 239 - (Format.pp_print_option pp_json) t.type_ 240 + Format.fprintf fmt 241 + "{ key = %a; keyDer = %S; keyPem = %S; sha = %S; tests = [%d tests]; type_ \ 242 + = %a }" 243 + pp_ecdsa_key t.key t.keyDer t.keyPem t.sha (List.length t.tests) 244 + (Format.pp_print_option pp_json) 245 + t.type_ 240 246 241 - let show_ecdsa_test_group t = 242 - Format.asprintf "%a" pp_ecdsa_test_group t 247 + let show_ecdsa_test_group t = Format.asprintf "%a" pp_ecdsa_test_group t 243 248 244 249 let ecdsa_test_group_jsont = 245 250 Jsont.Object.map ~kind:"ecdsa_test_group" ··· 249 254 |> Jsont.Object.mem "keyDer" Jsont.string ~enc:(fun t -> t.keyDer) 250 255 |> Jsont.Object.mem "keyPem" Jsont.string ~enc:(fun t -> t.keyPem) 251 256 |> Jsont.Object.mem "sha" Jsont.string ~enc:(fun t -> t.sha) 252 - |> Jsont.Object.mem "tests" (Jsont.list dsa_test_jsont) ~enc:(fun t -> t.tests) 257 + |> Jsont.Object.mem "tests" (Jsont.list dsa_test_jsont) ~enc:(fun t -> 258 + t.tests) 253 259 |> Jsont.Object.opt_mem "type" Jsont.json ~enc:(fun t -> t.type_) 254 - |> Jsont.Object.skip_unknown 255 - |> Jsont.Object.finish 260 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 256 261 257 262 type eddsa_key = { 258 263 curve : string; ··· 263 268 } 264 269 265 270 let pp_eddsa_key fmt t = 266 - Format.fprintf fmt "{ curve = %S; keySize = %d; pk = %a; sk = %a; type_ = %a }" 267 - t.curve t.keySize 268 - pp_hex t.pk 269 - pp_hex t.sk 270 - pp_json t.type_ 271 + Format.fprintf fmt 272 + "{ curve = %S; keySize = %d; pk = %a; sk = %a; type_ = %a }" t.curve 273 + t.keySize pp_hex t.pk pp_hex t.sk pp_json t.type_ 271 274 272 - let show_eddsa_key t = 273 - Format.asprintf "%a" pp_eddsa_key t 275 + let show_eddsa_key t = Format.asprintf "%a" pp_eddsa_key t 274 276 275 277 let eddsa_key_jsont = 276 - Jsont.Object.map ~kind:"eddsa_key" 277 - (fun curve keySize pk sk type_ -> 278 + Jsont.Object.map ~kind:"eddsa_key" (fun curve keySize pk sk type_ -> 278 279 { curve; keySize; pk; sk; type_ }) 279 280 |> Jsont.Object.mem "curve" Jsont.string ~enc:(fun t -> t.curve) 280 281 |> Jsont.Object.mem "keySize" Jsont.int ~enc:(fun t -> t.keySize) 281 282 |> Jsont.Object.mem "pk" hex_jsont ~enc:(fun t -> t.pk) 282 283 |> Jsont.Object.mem "sk" hex_jsont ~enc:(fun t -> t.sk) 283 284 |> Jsont.Object.mem "type" Jsont.json ~enc:(fun t -> t.type_) 284 - |> Jsont.Object.skip_unknown 285 - |> Jsont.Object.finish 285 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 286 286 287 287 type eddsa_test_group = { 288 288 jwk : json; ··· 294 294 } 295 295 296 296 let pp_eddsa_test_group fmt t = 297 - Format.fprintf fmt "{ jwk = %a; key = %a; keyDer = %S; keyPem = %S; type_ = %a; tests = [%d tests] }" 298 - pp_json t.jwk 299 - pp_eddsa_key t.key 300 - t.keyDer t.keyPem 301 - pp_json t.type_ 297 + Format.fprintf fmt 298 + "{ jwk = %a; key = %a; keyDer = %S; keyPem = %S; type_ = %a; tests = [%d \ 299 + tests] }" 300 + pp_json t.jwk pp_eddsa_key t.key t.keyDer t.keyPem pp_json t.type_ 302 301 (List.length t.tests) 303 302 304 - let show_eddsa_test_group t = 305 - Format.asprintf "%a" pp_eddsa_test_group t 303 + let show_eddsa_test_group t = Format.asprintf "%a" pp_eddsa_test_group t 306 304 307 305 let eddsa_test_group_jsont = 308 306 Jsont.Object.map ~kind:"eddsa_test_group" ··· 313 311 |> Jsont.Object.mem "keyDer" Jsont.string ~enc:(fun t -> t.keyDer) 314 312 |> Jsont.Object.mem "keyPem" Jsont.string ~enc:(fun t -> t.keyPem) 315 313 |> Jsont.Object.mem "type" Jsont.json ~enc:(fun t -> t.type_) 316 - |> Jsont.Object.mem "tests" (Jsont.list dsa_test_jsont) ~enc:(fun t -> t.tests) 317 - |> Jsont.Object.skip_unknown 318 - |> Jsont.Object.finish 314 + |> Jsont.Object.mem "tests" (Jsont.list dsa_test_jsont) ~enc:(fun t -> 315 + t.tests) 316 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 319 317 320 318 type test_file = { 321 319 algorithm : json; ··· 328 326 } 329 327 330 328 let pp_test_file fmt t = 331 - Format.fprintf fmt "{ algorithm = %a; generatorVersion = %a; header = %a; notes = %a; numberOfTests = %a; schema = %a; testGroups = [%d groups] }" 332 - pp_json t.algorithm 333 - pp_json t.generatorVersion 334 - pp_json t.header 335 - pp_json t.notes 336 - pp_json t.numberOfTests 337 - pp_json t.schema 338 - (List.length t.testGroups) 329 + Format.fprintf fmt 330 + "{ algorithm = %a; generatorVersion = %a; header = %a; notes = %a; \ 331 + numberOfTests = %a; schema = %a; testGroups = [%d groups] }" 332 + pp_json t.algorithm pp_json t.generatorVersion pp_json t.header pp_json 333 + t.notes pp_json t.numberOfTests pp_json t.schema (List.length t.testGroups) 339 334 340 - let show_test_file t = 341 - Format.asprintf "%a" pp_test_file t 335 + let show_test_file t = Format.asprintf "%a" pp_test_file t 342 336 343 337 let test_file_jsont = 344 338 Jsont.Object.map ~kind:"test_file" 345 - (fun algorithm generatorVersion header notes numberOfTests schema testGroups -> 346 - { algorithm; generatorVersion; header; notes; numberOfTests; schema; testGroups }) 339 + (fun 340 + algorithm generatorVersion header notes numberOfTests schema testGroups -> 341 + { 342 + algorithm; 343 + generatorVersion; 344 + header; 345 + notes; 346 + numberOfTests; 347 + schema; 348 + testGroups; 349 + }) 347 350 |> Jsont.Object.mem "algorithm" Jsont.json ~enc:(fun t -> t.algorithm) 348 - |> Jsont.Object.mem "generatorVersion" Jsont.json ~enc:(fun t -> t.generatorVersion) 351 + |> Jsont.Object.mem "generatorVersion" Jsont.json ~enc:(fun t -> 352 + t.generatorVersion) 349 353 |> Jsont.Object.mem "header" Jsont.json ~enc:(fun t -> t.header) 350 354 |> Jsont.Object.mem "notes" Jsont.json ~enc:(fun t -> t.notes) 351 355 |> Jsont.Object.mem "numberOfTests" Jsont.json ~enc:(fun t -> t.numberOfTests) 352 356 |> Jsont.Object.mem "schema" Jsont.json ~enc:(fun t -> t.schema) 353 - |> Jsont.Object.mem "testGroups" (Jsont.list Jsont.json) ~enc:(fun t -> t.testGroups) 354 - |> Jsont.Object.skip_unknown 355 - |> Jsont.Object.finish 357 + |> Jsont.Object.mem "testGroups" (Jsont.list Jsont.json) ~enc:(fun t -> 358 + t.testGroups) 359 + |> Jsont.Object.skip_unknown |> Jsont.Object.finish 356 360 357 361 let get_result = function Ok x -> x | Error s -> failwith s 358 362
-6
tests/wycheproof/wycheproof.mli
··· 1 1 type json 2 - 3 2 type hex = string 4 3 5 4 val equal_hex : hex -> hex -> bool ··· 23 22 24 23 val pp_ecdh_test : Format.formatter -> ecdh_test -> unit 25 24 val show_ecdh_test : ecdh_test -> string 26 - 27 25 val has_ignored_flag : ecdh_test -> ignored_flags:string list -> bool 28 26 29 27 type ecdh_test_group = { ··· 107 105 108 106 val pp_test_file : Format.formatter -> test_file -> unit 109 107 val show_test_file : test_file -> string 110 - 111 108 val load_file_exn : string -> test_file 112 - 113 109 val ecdh_test_group_exn : json -> ecdh_test_group 114 - 115 110 val ecdsa_test_group_exn : json -> ecdsa_test_group 116 - 117 111 val eddsa_test_group_exn : json -> eddsa_test_group