diff options
author | lloyd <[email protected]> | 2010-04-30 16:25:01 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-04-30 16:25:01 +0000 |
commit | 1e10b45b171fde455d32ed34a3aafa0bf90f3b4e (patch) | |
tree | 8444300de580a32744ba32aec5a9e77c5d66e607 | |
parent | 18d5d5fa3f58d2ecd15ac130eda909f44d9c6f71 (diff) |
Modify the implementation of multiplication mod 65537 used in IDEA to
be branch-free. This reduces performance noticably on my Core2 (from
32 MiB/s to a bit over 27 MiB), but so it goes.
The IDEA implementation using SSE2 is already branch-free here, and
runs at about 135 MiB/s on my machine.
Also add more IDEA tests, generated by OpenSSL
-rw-r--r-- | checks/validate.dat | 520 | ||||
-rw-r--r-- | doc/log.txt | 1 | ||||
-rw-r--r-- | src/block/idea/idea.cpp | 23 |
3 files changed, 534 insertions, 10 deletions
diff --git a/checks/validate.dat b/checks/validate.dat index 0269c7e69..775367abb 100644 --- a/checks/validate.dat +++ b/checks/validate.dat @@ -4805,6 +4805,526 @@ FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328:\ 85DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09:\ 00010002000300040005000600070008 +# Randomly generated by OpenSSL +A1F4C5FC0AF894FB:1F88AD254A1653CB:69E2F555209FCA21ED36E0243F043537 +55E31A38B2C91116:8D57CB7AFB401E55:BC0ED7C4A90FE4760B3D971F0F2589F6 +6C63D3EFB9E767E2:5FECC51182CFA3EA:E0903EB04098B1193779E7837EF374D8 +07E16715F575C6AD:81EBE19020C63877:78A2E29FCFF77C6934B7C0D7F9460D65 +AF16AF335D1C53F0:6E7F0349BA9A2F99:53B644EADCA240EF4FB193A4FEAD3C7E +4BAF9D1CA9564352:1BC57C3D253EA065:AB33C28DBED80BE30F88F56BAF75F18D +2C03EB635242836C:45568161D2A6B3BC:1C878288A669E69F656E8B8D4FA60C1D +4645D6FD4B431D49:DA31365F4FE20B03:09F745F9D80E874001C4008995657B20 +65FD887479EF85E9:590F2F58016B29E0:5E5A441ADEBB77B5548150D65BA74DC0 +1B7503845C01C69B:0116653D1E4771ED:21986D04FED8F785438D4A7F0AD67E84 +B192B778DB10F094:FF4E8C609577BF85:1D2257B3AC17EF9A823D599097E634A4 +6538A21F7261A796:7AF53C7D0D2621C5:6E7A13AE1390E83C40803CB2D79B0C34 +374283BA8FED5710:20378450E2DDA9E8:21EFC7A3A3201371A48119DBA1C9660D +2CD068FD837909FC:EF3FFF871FE5E8CB:6EF803708E8E6403A994BCB639FF5A53 +F19905A6B0C7F1B0:42C993EADBC0F90D:772FCA0BE2265EFDE56A1995F458DEB1 +2FC8EB4404380042:259EDC1951191AB0:70BD64087B18BE3EC0559A2CFDA3E192 +4CA2060D4DE998E4:73C1905EF950BA3B:7ECF0B93035A2DE807F51E5B2E277379 +733BCA91EBB85351:B9F6B1C7F328552B:798F64226CDBD83728D75A43C7BB1AB0 +2ED93449D2D9AB3A:F06B2E9D94997C93:2DDD0BA7F3F7693679D55B98A22CCC3E +F1A2FBC4FDAC6F02:DEEFBBD448842BE7:F31BD19412BF7A97DEC264E90DD14E99 +CDAC1D020B9BB4EB:639B4D4EC1E3FC8F:226D0AD448F8E5079FEAB206179A38EB +0FC2061537F6CDB7:DEA26F56AB3D71E4:B023E8B5627738F655280AB14768569C +0AD0F7ECB7470F6B:11704E9F8D98D9FB:C6A319DCECC13FB4F22E9B9D60BD0EDD +281A1B2461363A64:DAC5D4E8E380B604:6FC37F80D03EC7FF1ABB39AD57FEEF34 +A323BFD529B106F2:C8B452EBA3EAC1F7:2E90E4BD3B0BC846CE40BCDA46B99B9F +7F707ED4B2317EFF:2B4FAEF56F09598A:AC2F2007D0263D4BC6D15CA76094CC1D +864EA8E4528FDEA6:DE47CD0ECE03A7AC:A14EEDEBCA1A938997A4E11137D6552F +4CF5E2391DA8C6BF:C44AB604C4DA9CA3:0075696D1F9554F6B10BABD8A04D90EB +3EC6651C50DDD961:FCE10C5093AFC8FD:354B4929963917272B53C79D33558C33 +06E48DB5ED0894C9:A3D93B6558B290E5:A5E048C95424FADFC5E5406585273662 +4A22DAE25C7878DA:A920F8208EE65ECE:75A944A0A97A7BDCE371BA0FA1665FAC +D9C0EBA7F6CE3065:9917CE029BB7A5DA:15227F375BA59F5E69BC2F6C668A98E4 +6FA8111B12652436:E605449753A66A1C:AFE2D0EF5F64861DA13BE5EC6CBCC70C +F4BC17D0578D7507:D22BC6485392A026:8881DD1044ECEDD9D4E7FC97FAD92FD0 +4BA7280181F4B3AB:12DD636191A47981:A0EA022FEF899E36435DF969F1F3E4B6 +9CC6F4CF3EBF7246:9BBF1E0D107A06F4:CC287CF7E36F70591D5E67FCD7BF4BC9 +98839DD58F08952E:9F928A91E928383F:A835B2A0502F5AABA3992C063B0E1C30 +6D6A06A129272985:864667E4DAC671E5:3DEF6557F2C753A5FC87A540F7A2557B +80CBC5085F87A69A:126748837E2FEDF5:E8409A5C304760EBC6B260C75C9EDEF2 +89F8C4D164BBBD01:AB8A227357D184BC:8C736D86BE799E87F1C1CC35E5EEF6AE +2B96920DD5A6F2C8:94E03FB08F83296B:E4A20A94B1E7068974CEE5E2580E15D9 +11D5722A2E1CF306:FA90183D4CDF8CB7:81CAC6E859BE54B8CE81ED7B07C271FA +41B3C351152390FA:3CE8A7D2232F93C6:7B0B045B44D79CB025DEDB0E85D160BE +D8F830B019895550:07DC1606AB5F8F4D:1422160720C9BD46404FEFB8EF4E2C4A +8D30F965EA9BFCAA:CCDC2F07B5DEA3E5:5CCD1802EA48F00211A1EFA909F30538 +C513A5932E08D791:BD668AC3EC4C47CE:2FFF4098384EE4546E93238C0F426668 +4D85463A62844915:5E2248C33CBFD913:4C4F6F82FE2518EE3A99F76E04C8499A +7726B39BD69776A3:6A8704EB3291EDA6:FC3D1A043ECABA559309E64B064B0446 +97EEA1C90CE93D1C:729BF317F46E2418:56ABF74AA472BF0CB06610D12A018877 +1A0CB89B6E03E337:7702BED5FBAF6E7B:8E5126BD9FE220ECBC2153CDEDA49FD9 +26B71F27904E140F:CDCC5F2849977C1D:2C18883E1F19A980AD4A58DB9F2D12D9 +BEB0D17F512C5730:BFCFA36E02B0B2BB:F6BB19FE9DD4A7719881A38625D1455D +F47B9D6A20D7B889:FB73C16CEB58CEB0:6A624B6FDC084DA5A509988B14436092 +31DC5A59C38C6CC9:A1EF35EAFD03DFD9:107DC93EC9E886F16FA922A3D82DC9DC +9E0D57C76D2BC40D:48B35198E0C58C36:6EDB60CBF889596C42DF6655C84B2DD1 +8A2A1818B39A6122:7FE7C18658678A8E:08327A955B100FF0A7FA52EFE78FDBF8 +AC0EA182D4D22207:E5377B9CB0EDCEFB:FA541FD32F11D73934B6E53309DB89FA +F4AA78E30D4375E5:1D29D101F192843C:36F11D98390A7EB5AA4C4EFD3AE9BB9E +B337AF7DB5339DA6:E6136A8BC04D20DE:DA1FF6FA235D6067AF99F3462A16BAD8 +867BEF1B45DBD114:B78595C1B5CB812A:B51BF3480873947E698F71D9EF21D75E +18CEA1A2B234320D:A6064120EDDC07D5:178BF50C7CE2A00C6AB48CE3569FDA58 +47F33BBEAF84E34A:F575D48B7CCCC578:28EA779EB6C91650B52102935DE37AAC +5FFC2BAB521A603F:37CBDE6E69F5AB5F:766D0648B278DF1C0C41698287162A03 +35B116F3F4481906:D001E3ACD70AF4BA:FEDF724C31DB14EB591C156C67EF6750 +281F4D0A68E4E87C:A54B8A84FDAFDF5C:801481FE995D9E75205D8A6D0D510E90 +8A2DE90960587781:F2BD898AFF28D968:505E0077E52C5729F73182ACDF34E9BC +50D31FB5A2F057CA:C85C933B348F1008:5057B6FF91D6B4C2375B2A6F4A2FBF7E +4EB2A5C16C4706DD:73EEECB5E25EC480:964818358CC500A2F781BCDC7AC66916 +64F00EA613578183:DC583C63E88943DC:D5765D05E10F5B7AD1FDAA2351AFF84C +25E266652BEEA0FE:294EF257ACA9A0DB:413A2CBED2D4D93C7B46E7AB5A43875C +AB3869040AEC6682:82035F37DBE794AC:EC2F93A4E069F36926E36FDB584A5637 +6DF6A322B10646EE:D0BC320330F3C642:A82DDD856546FD0634CD8BBF241864B6 +916202B8E932EECF:894C0ADA76AFDD24:A7BA17A0D592EED086A170100C9918E5 +71CA562E57FDF716:F070CD1AB26DBB0E:D701ED927D25B3A6DE2F017DF630F7EF +D7745FEA5883955E:E71065382556D351:FE0A9320AEE0B0510D84186EC805CC80 +B57ECB0D0AB5BE27:DB84A6443E85C873:BB330B162D990B33CE1E60583EF23225 +82724F9780EDE924:31D9744D66BFF613:FF7E72A5D193A35A2093717DAA3CD4EF +8307456C3AE8C4E8:02C4F752D9BEE3AC:B2BFD1313C129C13A35A4B59F608F930 +1A81AC5339D80170:FD6CF5D07C7A9A76:8D533208F3316C4CD216D42EB1BC5D0A +23F4D1448E8C2302:A6D4756A911311FC:403F55A1621DDD6F78A33893F0762D8E +15E5476B963232EA:39474EF9B640AC8B:5F319D855168FC8153E29633111794A9 +331A8615EE6239AE:7DA9F36C7BA77B5F:99C0AE0DEEF10CC2E6673D106DDA6871 +D2C818116B98D56A:0AAD3489968B1C6A:B24AA6EA353F9E7BFFF2DCB8BE9B7A52 +3299ED7461B4A3F2:94453FE1A0A1EDA7:8BEED6720296F7E9FBF7BD1B07ED9762 +4D042C1E63DA6200:188E679808DDDD46:815ECDF71E3996E437DF4C976B527862 +7102E6F388639C00:269AA83817DB1985:A6DD5F374508255677C19FC396E134CD +D4CB7FEC03126E6A:9789ED9BE3491CB1:BB6A08BAF6F14C33BBED0F775CDA3020 +DECC7ACF2A42B8EF:BC081CF6F5A629C0:6221926E9528A75155B2BF6ED12DB1F6 +A598473440C9A21F:24B0514DA6EDEA34:8A5D51CBBF6BE005F9878F3ED6B61729 +0A4202140AE807A6:1728AB88720894DC:FD6286C960579D105AD239774C91368F +F0920407531D711F:B41EBF00195D90AF:20B923BD442044E6A2BBF8F00D079B88 +5BD41996465764CB:BCEFFE91A2F6FE87:3E70468A0D26E01832F5A6E35D3FBD99 +E33A034F8014AF17:420C903E06671BA8:7500E220E0A3E58BEF63AA137D307794 +7B85CBB342D56D2B:147E04274EACF056:40FB6C1F452CE0611D34E73D73629B78 +5E74CE033490E610:4F910CEAB804E971:492C60D310221CBBAF3BFCC04E595225 +7ABC6034C9E6B95C:21CF5A0D1A5BA08C:F057A5BB95F19EED5ED31BA0C3B71121 +E7604AA5ACAF6E29:5A48559ACECEF95E:C658B4CB59FC9F9794B17DC994790797 +DC3B63395657191A:1FF2C84F7F1EF838:8FC30F8C24F6C644916C9E3460BA5289 +5C51EF1CAE759BA1:7D0B65F194116C8A:BA445EF71240F3AFFD91B79A5FA8AB81 +285CE845695AA8FE:8E7EC2D0D3A836BC:5D753304438FDC2D035BC07820076AD5 +DC977E1613710FA8:7667822C280FC236:72A06AAFD85DE66B9293B50E6AE8B28B +34841A026684E7C7:529003250F713079:0306706ABEF3D7225DFB146DE5EFB29B +F10FB61FE6EB85A0:E4A62E2C4775D5AB:FFDAB83F911295F1F99E684DD9FF0B18 +D4BA2913B79C5B8F:7886BB8D9FB046D4:DC5D319F729E73ED847FB468EDDCE977 +EABD3EB7B477D262:366D6CC9503798EB:C8B0948B2A5ED4812F1FBE21ABB609A1 +8FF4BFD40B22E74E:30C7A64C5C6861A5:09853AEE4B50B52B3086C3860B8BDF97 +0EF4B58DC8DB9AB7:98254A729AB2957B:F44422594AF65EEEA95CB013E8244A3F +69F168F103621CE2:6071635D378F7B72:6DD7F582664163682678561417A645BC +D16F65826AA18FE6:2226A7D8D6981F2E:7746A113E13987DBD18B394F67D1821E +E652CB782CB22176:995B99DC17FDC5EC:892C8B9C34C5FFBC75E15316F1585D7F +44EC60577E52EF53:DEADF8476A61ACB2:EB2140E309DF68D184A31E5853314488 +95C4BA55E48ACB41:23995FC714AA8A4F:1ABD37DF22EFAC175DF941CC0EDD29F0 +23EBEF88C86BC886:56E06DD1032256D9:D0C38AE628CCA13070A1633150381F91 +493C1E2E04FF04D2:7E042D9E5AC1F3EC:48AC07496841116306D48764C1E705F9 +C2B35E68716744E7:0B47ADA35271DD5E:66566C2E4449EC7A02A7C930F65940B0 +FFC6A8AD209956AB:7E64EC4D49B958F5:7AA0B380E4414CA991E141BD6231CC0C +0471B06CA4FCAADB:A6F22D9C1E923746:70354888F66B6C0AD28E682DE32C39E5 +C05931E79316A4F1:2998E9FE07ACCC1F:E4CCD004C11D238E3A03EDECEDD65988 +C8E7076836A52774:6D5C280418972012:DA829DE8347A0778DC215BF2540089D4 +C26400002E57C5A4:A08AD2CEB56A4B19:1E96A8A8BB01AA88FEB15712F0A6DA8D +5E5ED4AE448BCE09:AC419DC48C0E6E7D:87F756A77FEDBD8031B0086EA344AE6B +A755EF02795F7CBF:4E01D7A7B8689D99:81D79E0EC9D881149AB6D41DE9200F04 +C569F03D3FEC14AF:9CCBCE811D222ECB:6EEC3E96D32CA0BC967AF758FB6805EF +7AEB6D193C727CCE:981F83863C75A8AD:07B0FC3E6308EB4A5298163E80600120 +95B563DC5D7A4995:6F165E831FE132F1:C810A5C61CA63CCB8BE9E0590959CD90 +79AC1C7EC0745282:31FE39BCD41067C0:1E76304D445E8BB18117B1EA3E750EDB +DBED2CD9B003FD2F:BF698BF256DFAB35:E466F39C4B58269CF854A4221D2A5CEC +900D341BD28B335B:0858DB68F69BEFD0:59A6E62DB5E1F41DDB228D1CBD60D950 +6FD7FABEF3F68ADA:20E9497D9A98F12B:68A0AB43F383E1CA7E9B96B70E010016 +0B16023CA7F3320D:008127A50C977A3E:939A4D66FD3CABBE37DBE25F404D7FD3 +B91AF472920780F9:C5493F95C16A4953:00A20A1EE48FD2341B1F7F1DCE810755 +2DFBCF72932B1513:96465C98AE90B56D:C0808AC11EDFCE49EAC9A05B503C156C +8C83A23C871952CE:958433FEEF466F82:840492015802ED28322683A1B4FD3059 +1A24D2868B8229C2:B2A10B890DC9E641:ABC74042E5B79998889438020ACDA9FB +85563E107D1AC98E:D4448D4099E6D02A:4F19664B83FC466B03A936D6C3B6F522 +61AC5FD8DF0FA3DC:58EAFB1779142C2D:391AA3DF9ECE4160E0BB9AE663EB326B +2AEA3358CA197938:98EEDF26EFA4C614:505E946D9C6568E6DA133F9615AFC0B3 +57138F04DCF6AE31:716AD93EF3236735:8836B04E34F67B894D28C30DA60328F8 +B57776534391612D:5300738AB7F94CE0:0AD06D65EF01D64C0D8227AF7A7F4295 +8625E74BCDBFC00D:98C27F1B9A9ABAE7:6DBBEC86D97D7FC0DB27BF6423659E4E +14E2DD1CF23B2B0F:1814A2577534D5E8:FB924FC8A20249EF71C470ADCBB2AE13 +322E55BB623E0FC4:F219520BAF8B676B:467AED141F65682959BFD457939F23EB +931320B39312BF72:DC355192DC7B11E7:140B0407B8717834F2C0707102D67A41 +04F5E2A164655DB1:3B9A799A75792D85:F4FC422DDB7B0E13DFE5C92E5DB69BC3 +22B6A63021AE2763:5F1DC1759615BE32:72081E59495031A370FB1CCD08B61743 +729C1EBCB2E563B4:41CA6A52CAC6A9BC:3F8253356F0DFFDA9F7E961132D9B2CD +252AA0E1EF450353:DC44622F3A805838:9036A0142CBD1850E1CC093DB58AE579 +10A5F919718785BF:B3E6ED4A5C006A75:7A01C0B58B936543B8201D9AA9BC3163 +05C62E7F7FE4CF2C:1C939D9192E83462:E0B0427FE2C90210C1603F7C0C9474C5 +CB12A73FD1165172:67AA122DAFAC90D5:B85945DC5F787A3BCDCBABE014B7A573 +1A686808A77106E4:9D81B526A87880AA:2CED2179B30725A0E819AEA55CE68B61 +0AE5D2C3A631D879:020605D916B40B84:D6F034BD03CE80931D88EA75752EF08B +A7AA74C2607781EF:91D215BA6DBC21D5:F9C00FAF37163FF1FA5B8F433F685836 +FC2A91EB756D481E:60DA8ADD7547CBC0:1DFF21EDEBC139D7B7CBCDE6F4A34584 +A6BCDDEE18C6819E:9805E419C2F2BB3E:46A7578EFAD674A224FAC4E2BED579AC +D682589A7FB9AE31:3439865A758C9678:BC31A699CC327FD5E140C9A6C0211028 +E83BEA1B7970658A:1662B5047011D310:B527197C6B375AF0EE863BBD0759EB96 +E20D2FED40630E50:10F47ABBC320281F:FD990F2F4439E65D4FFEF0420D18CCB8 +63444C8712811AB2:994FE928C4321878:3869A36D42923E94724D1B05BB875AB0 +9A558554C9163EEE:555154F50F57CCF1:E64049A1F719AF0D499135129095C8FD +42F2A3FE0437BC5C:2BAA4CAD9FC4E082:F36AC6126F70DEB39DA8729D5B22ACA8 +862C924495BA12A7:4C3660678AF3AD0D:E1B6991593A5D361C08C3CB0812D6944 +8C67D089B29FA40D:4CDBF023BEEB2916:B2ADD4040673D0FE3ADA0B00E013194A +256BB416AFB1BB22:8F730A9BFE8A6D92:6A707425E5BC3011AD82574D5C6EA9F1 +AC3D85D4C4E32C77:65A0A4681E370092:D2E59FFE11A6EB98F9AC07AEA56238EC +ABA6D4DA0781086A:1D2305C43699ECCC:BE2217AA1919BC76A43F575E9C395525 +CB39BD9B648C27BC:F4BCD97D736E7143:B209ECCEBE3C1B39EE99D881213606E6 +77ABA9017A2F6678:6881CF5F4B920808:5062054F6D1C6261C3C1E4EC854BA49E +79740D3FDFA6CDBB:AE662AF4D41E106E:5ED1E657D8AB1A468B1C5B39A48BE0A5 +CDEF858FE5E0B0A4:F11AA4D6CC002412:AA224B767B062DE29709F4E10B777BE5 +B9B1EF495E954F66:F8A33058962BA146:DA32F95EEBB72A127F79122819234BFC +DB9C0ABFA81C0D80:9856D1DAF01C992E:3775682058F6BC094A96C4877A7F9657 +BE447A6EBA16A7A2:986C7B461B5102FC:E366C94CB0971CBA20791BD358EABCBB +CA564022587EC839:D3AAFF01F19DB316:07BB49AA8F9A13F2025E9DD758B1E764 +E2929C1DE30E4B15:EB1A484E5C81DEF9:9124A3C9DF4CED607FDCBAB5027B5B93 +35F3D96407C21EF9:C7244325B6DD77F6:39A2D8A3047C1DFACBEB37861E8B43D6 +1BAE4770DE602791:4E662AC45C3B2119:FB4502BA2C86D59FBF6FA8C5FAA87183 +2B1CEEF376A5E4B0:FBDDEE951ABB0314:DD010D18C37746B65AFF34083A4146A5 +3CBF8B60D71FB10A:9A8FBD56DC0EA257:72D53C88260E3566882813053E1AE5ED +47C4AC498293BF13:7E1398E65A69E038:C2C97338FBD29E50FD37205751B3C6A6 +120997CB681C2C4F:7968DB51E243F084:5F0E47261B6DEE64439879EDCD39E85B +DB1698876385005F:2AA4C93967E4F698:4ADC396F403CF5C12F850BB907A344D0 +AAA50519795B86B7:6A1096066173528C:8822968CE682CEB0DD9E913B77578C49 +2CA4D5AA24A0064B:EF4FF1117DEBB3B3:1F42C3C5D30F64964D86FD6F212E3EBC +637B3EFDC062ABB5:9AEC362D13402BF3:3863E37A03F33E5C010B10BD83F3D63A +E0C32EAAF6E27FE3:03FF41F08C2B4F85:34DE1C4A720E1C519FF9B3B5AF1FC23F +70DF29326A19F0AA:1EE92ABEC6D87204:E4B43787664CE36DD85A904AC8437EE3 +AA2623FEF71A6FF4:581D8645CF5C04F2:87472BF040EAC616FC3186A071E75472 +79397AEA3D9A815A:DE4315993AC9D4AB:7A34E8066CCD634F810CE2AA6916E9F5 +CC3E9F4728AC9653:5A359381C542D310:527D10ED0649948237D77BB836B90312 +12E1E88F656032FB:FEDD8EF190D4DCB2:3C89E04C0CFD726FC81158CFB3567C66 +7199333B8F1726EF:9ED8AA463A0DE876:781AD832234CA52B7DB7EF037CA6840F +FEE0782CFABE980B:2DA0DBB1BBB8FED3:AF3CDA80C37352B53A00290FFFE66EED +C5C8E3ED1C1B1B16:6EB4148C4BF47628:A7976FE071BC4C2C4EDC90669970AF6D +545164FC513490D5:39398B0CB44C30FC:9B8349BBB21480212BBA391113EE4251 +177992889360D533:C9E1D8EF29C5DD0E:AE08A1563F6CB18E5CC29DCFD94F9E50 +78CCE5F4022F5F38:986D99D2B90474F7:F9395E856A8C8712DB0E1D9BCF35F2C0 +8D89708C4486A4A9:C27F30929D508EA2:F83192CFDFFC02CAC0B109AE5CF28AEF +EF0CE502FE9F2E65:A5680B7651E10453:ADC0100230B5DAAB8F4C0D5C3A99A220 +43078217088A3B74:C81DAE4CE6588027:6642EFA393625B328A6D56806F97B06C +28A2DF1C597A04BE:7444940ED63BB2CA:2341CCBCFDBA06C1253111C60BE2EDDF +6C8BBC0168E7D0AE:7A8027A6DA52F0EC:78BBB2E2171B41352E11F39072B4E758 +30004B05206CDB1D:A46A041AFEEDBF40:CC8EAF044C0F14E0D3E55238E5B4998C +F912DC1D46120017:8159899680CFB85D:4C09C4DF6B6CB3A0518E75A3110C00A6 +0177139E2A42ECE3:54329CA36D7BB6A0:92C6277D7458B8829ABA3694C1E57023 +F91991F3D9344291:31CC16538CAD3B09:6C220265056BC8669851FA3F4CFDE20C +C3111EC8062BEE07:F1F5176541E23DA8:07D0B4472B194B6F45235002141B33C9 +8EAE7470FD58E40F:73407FEC8B5F9CEC:5BAF6F94066F39A8E17F81A88BCA2796 +919C2933E680FA63:F9CFFBE679B632AF:AFB398D08C965498A868DEAC783D8B80 +5A0C5CF55E5FB1AE:FF4FF500A7B1D85A:44E3E8AC53DA1946F65A48245A971929 +3B365723C86441BD:4575F4EC34C2003B:6F2716CC391B9F0C7549266C68342F17 +078E1AF25A6E3789:BE784416E9E60086:21E16892CEFF320DA6ABD1BE4DED257F +F5725A15102E12A5:DC5EF80C3DEF85DB:716B9680A132954B598DA6E5A8BB8FE5 +4892E6A118C98D0C:9DB54C62F330CD19:F226C53CA0B076A19A11B9AC778EA80B +075A3B54B6AE5238:9D91D515D7E76D18:B98400EACDD225EFAA3B29B6F72C022E +A0FDC39F4644E6FE:7629ADF27EE957A7:634EA1C85D5961B4064F79852A11895D +668BFBAE93632D2E:9C047ECD1D88CE54:03EE4BCBA4086C212CAF28CD82C1A761 +5E29070652D84B8B:AFAF619C3C3B3EA9:34243F927E529230DC4B5AA91D29B9A1 +AB8F3263F732EC68:E196D05DAA04340C:3BF57A19C8A578663AA2194B3DFC8D5E +BF5B8209F7E51A4C:A8E625E6F01A991F:718E5A9042D2002E803E7D8A95FF685B +3950FBC2A4D4B08F:54993FCAE1E3A2C9:9F791471044D714BE42BF1A8379BFC4E +440032587CCAEBBB:BAFCF4891F7B36ED:1BA3B781AD0C56BC2238657F9E0ECCAF +BF985E7D8CC0E9F6:150F02B73459DB7C:29564761914E2EB3B5C43D445A1FA586 +E3A691DBF1AA6542:8945528C8A6A7C42:1B97452D22DF6133A1065A0D6ACEF22F +20FCF337280FE0A1:2BBEE84B85AEE536:F5DA75F1C6D67254F00A1B526C97398B +28FDBF9CB423D8C0:FD07C80CCAE8AFDD:F5319B677CEAEF0DC3ED3171A821685B +627E00241301B398:8B3B0207D07C9E44:5E080A6AE298F8AC3D973F2290C476D0 +CD0A751D2A6AE1A3:02E6D0E6A8D8989F:990FB6F8400592914B84894BE4E21A10 +C4D06F926C611932:C8E6C4A166B0F504:904BFA4707A8EEE73D4576D5AB8D1A23 +96DABE49F56D7565:2915EDFF6F1517C6:3BC2F67E113C0DF4FE2C49B09A73E989 +9796DF8FF33629A6:C696AC43D47D184B:A30C3A933E1730816EF1D34518584B55 +ACA911063728C943:0E11408AAD0D31A9:8475D6C9961A26235244A253FA965A97 +0D445D5AD38DD6AF:FF6821F5BA54A2EF:438DC01CF937135B19F6046872B91E43 +5C42CE355071C8E1:74C716E95331967A:A62D9F85B36F780D2083C2EF8EF07ACD +2DA11D3A751C0205:FF14E8E0BD5EDA1B:ACF3AFEF6A098D23C702F057749B8910 +DC033BFDED9C70DF:E1328AC8450969A6:9C5AB450156A1C0128FE670A186ED675 +1D59C57CE84AEA8A:A5885ACE3498599A:657940713BA4A55E8F675814131833A4 +CF264D0BD49DF66E:27ABE5E153A4C3D2:C842C6F7692D4D35BB450E4E7C25D62B +1893406AE69D2DFC:AAD72C276D9E69D3:3EB0E4E5092BEBEBAEF96276F47CE468 +44B5AAF4D5D79A92:B28D5F8AA0A1C8D5:CD5C440B413C62D84A4C519636B9C0C6 +845D5EF1F9C1BFFA:90B3C70D906525E9:6AA1376D5ABB85B745D01A6D8A78C493 +3494ECC94DDAE854:A98639C5B52E3628:A049D4719E78ED18131B626CB9806840 +7915E2553D0581F7:DE0EC36C073CC537:0B5D4EE79C26227E934F4FD4A369BF73 +2BB7F7432BEB3411:530FE0CCFD2A8C4C:F0F851C1B5575A54A2D542590C492E2A +F34831E1A02E5A6A:3833E804F421A8EA:76CA1B648BA4C687BBE674BC55E55A9E +F1F2DB3BED1C265D:83D9F9ABFE402754:248A15A95F5EF2F53F7712FA6E9762B3 +F668409DEE092798:C0036965EED4C79F:39A675C7C8309641E75F42642F98539B +D9F33E0E10E47FF3:07065B582D4F41ED:77EDF425AB34448E2D207CFA63A7572B +6B21BD7F255183F0:8556839147C9C697:07988D4DCBDC5856D0B16ECED076FE89 +D92C1326029B5E9C:5F1BF1FC637CFEC4:CFFEE541307F3ABF60965DFB9851F638 +3417EB62AAA8F79D:15EE04C3C203FA24:C03CFEDB59CEB0FCC1C1A9C85B3F2DC1 +020A44BBDBFD626E:CDB9F1AF2717197B:F22FC0E8E591A93B781B967E17236F94 +F8541C9B31FFE235:116AF4FE8BDACAF7:7215ADA2904083156A49DFC72EA6B783 +3019034342F842ED:61B1176EC9E01187:7890F2AB2D5337CE85B8D52CC8A039E4 +CE00C04C6C8437AC:28525C77AD6FC0B8:1B97DA37CFD018E4D2C8A619FFC35F50 +68C4BCDDF19BAA36:A6E0CAF72EE75906:935332BD00F2DFE776C9662C8F4A0CC3 +4B323E423FF15160:AD3D825F885DC436:200E81A5D15A938ECEDD9ABEACBA1EF3 +73C78A6B18AA5763:ACF80ADEE2980877:FF9744CA77C270C1753B7BFBD16F2F0C +1EC549094DC418BB:0B660CCC9E2FD121:05CE1F98BAF5BF73A4DE0877DA21BA44 +E4B7EC33C430F7BE:109B7807CE1E146D:D90C92A972C201D184F0C85CD21B0C96 +32F022B9930C0D36:F8F4F8A2E16177B9:6E1985A8066D60CFC21FF3A620F9B376 + +00E7E77150176B72:63F6FDD518E8D982:0000B3569BE5A91E94BF6684443B1D5A +ED0020DB7F893F9E:DADB6760EF0C5D45:390000E7291B05E590F733F60FE32D6B +9E30007B23AE1904:6F80890BFFAB514E:4F2A0000F702A704238482F6DDE12624 +E41E5900820EDC94:2809809E29782F4F:CC301B0000C6E838CAC91B972CD843E8 +6CDF6488005C518F:D2E83193787C1A8B:C111A9EF00003832E8388A614D717759 +45086AD893004084:8D7DD8F46D2E21D8:64BE7002EE0000594EA205424036AC8D +7610D7883D750033:6377DF4C959B088E:B04BA96B0C2B00004414D2523B079870 +E036C15C24544100:045EB493788F0157:CF87BB9A6AB1CB0000BA666EC4BCC4D7 +00D5E98F37D74ECB:B0B861C2CC285A41:7A91ECA485D4A7A80000A7AA40E6C6CC +09000C87CFFBC0D5:F765ED0254553E8E:81956FF834D487A8810000084AEE7D1C +475A00BC0B2FF249:677FD2F453362DF4:EFB78A788A0E0C571DD80000E23558B3 +9851E4006BF265C8:15058A03573F3A4B:495F198853B2A602FF46B30000F71F2C +6353FEB6005C7715:72195116B5244D9E:DF597069EE83B6E29B0D298E0000ECB0 +E62D3D732A00854F:A9B997921FE91757:5F8334EBD1A4B51387B8BE6D5E000090 +D0796D8D7487009C:0A69FE9C2FDB99FE:4B9B76C00E4F2E431CD70A572EE20000 +0F7A885CBDD6B700:360B140CFE90F66B:00FB0FA1A19B42750C43F869251DA800 +0069D3A0691CF423:57930C18EBF855AC:00009F0A1C5F738C9A0067FFF353F7D2 +1900A63E56603D9A:A37093DA9BCAE8D1:5B0000794F371B08EB82008CADB108DD +8FAF0024EA437E2C:023D8A583DFDEB04:0016000047DACA0F7A1B3E45B2DE2903 +F8956000F44C9363:D8E6AD7DEFF79268:CE24E90000A13DF8ACA26B543552C6CC +81E55C21009FE23B:782E42ABEB69CEA4:4E4FC3CC000001A50FEC6AB8E9912502 +2F16443A8000DC47:5A3EF28BD1AA787F:FB9E06BA2800004F0980DDA5D4505784 +2676AC2DFC7900DA:7D181E6251E6A7B3:C809C47A6C2A0000BD5AAB3395DE471C +89967E5A8D04F500:F3DE18BF33466F72:D80272B7E308F60000D0D45553FA51DC +00A697D30C1CCFD6:D8BD6BEF7C28D098:1FC5705EF403560900006741E6AF1C50 +A200462288D91DEE:057F522F2457C7CB:6D40571DFB56841494000011F89FFAAE +083000BB9A0FFFE9:6A881071A5920D4B:5A11649D78F485A4C70A00009576B4EE +0BCF11006855317D:DFE70DEAE707F002:AF7A363699FAD5095F50EC0000A47EEC +9877931D00DA961B:6D44D2CE87076D60:4ECAF61E5C67E184CC5E70CF0000D5FC +EBC8BB40090003A7:8E06F01F564B0E3E:AF81444CC1ECFDB56D1225DF6700007D +B5B93F01E2E70047:5D941B605FA7426E:AF4D154BFE14606A91F96BF529FE0000 +A42551007EDA4C00:F0D12E7B0E7792F1:0096BB79FAF812308F905CC4B52ED800 +005D08AA73C9FB8A:43E76E1A3EFEB592:0000DCF81BF9E570FCECB62D215A75D4 +F8007FF8EDD8AFB9:9B7AD7CA57EF5DF1:330000563D5804F2140305F57D6EFE19 +F9A300633200B23F:487FE441C62B0423:AEB90000A3F2754576F2E81D014AB3B1 +0BB04400FE649D25:9202DD63C1113DE1:00BAF10000DAFF62549D46978E84578A +0E7DCDE700F8523B:05BF95F4AE49BD3C:23B1692100001EB81F704895BA6F89CF +418E5BAC2A006BF3:9357E91A3C3476D7:025B180C1400004DCF61FCC41D77507F +972EBBC6250D0009:39189DEA6E9D4B5B:88E2B14CF33000000896F148369ACC0A +E6B82D0009772100:F35ED1CE8C15594F:E77F27457BD13400006BA9C12435B21F +00096C31CA9679BD:3D1E54F215E69460:787B47B4BA5C7AE900000E3F96FFECDF +CB00931CC816A2E5:1A7F7AD46F16F9BB:44F07CDCD86B29F2780000E3908EC0D7 +B1A1004237BE2C18:A226C2A0F5D69DA7:5107A9E297BD6ED07574000055A5F0AF +EA9BB2009DAD4912:D2EA98B2940FB5E3:7A518CB4D637F7DFD41A5D0000345714 +F30367A7001B1005:EC80878CB6FE880F:9F331C8575022F9A0DAFE6080000C99A +854DF822B2006EBB:9B7BB2D159B2F37F:D40EBDA6FC5A7FAB29EEAF2AF5000071 +2A520D5857BB00FB:25F14A7C7E1E02B3:F324FAD327E9D959584E3862E13F0000 +03D2A2E706C6A900:433725BED51C4F54:009C9874395C88CF04C826EED65C4D00 +00B98EA1D39C6842:25DFA84D24B46CAA:0000C8F8D6BB801FDE22B197F1A6E5B4 +DA00E23270D329F5:719781009013272A:D7000081F51FAC169A6ED69956E456B7 +0F39006D63151F90:FF573BA8C9540D7E:18FC0000E21DA381CDC71C3DD15B97C5 +53121D00E40F624D:7CC255708A07395B:844061000076D6202283A9742E0BBD13 +CBF8147800190019:B51D90162BFA3B52:2E538ED40000A15D3FFFA23A617B347E +977B10EE1D003712:AD84DC81A5EA50A6:B513E999B3000082DB6F5801E9650D61 +F4D0A7BA7DB0000A:C5426D2C403ED09D:66DEE1483BD3000003917E8882D77BB0 +E544BB76CD2B5100:6C653919A1E0C084:7AE9F41279784900001B00232FBD1920 +004F3E11A0F560FF:FF17EDE487849114:CA1AB422157D74910000378557D44536 +E200F25C642D4289:41310F914A105C70:9425BDC0B2EBF4CDF50000A492AEEE77 +A2F2005D26A79D60:25C7FC5B80757200:FE310906BEEEDE55DEDE0000A061154F +849D1000A79DC401:DBAFFB54900B99CC:EACB3CB4D4A533BB66BE6A0000AB20B3 +EE0A880F00D1CC3C:1D45B4C072EC3893:F26EF5DB480C4569E0977A3D0000E88C +01BA9AECDB005371:35418199AF42D87A:E0CADEF2B7C8DA97EFC25140DA0000AC +D75932EE169300D0:F52B8E07CD95D128:D3CF5C2F4C97CCED75BE446ED6270000 +D183FC38324CDA00:ECBC71EB2E17DC5A:003F188C1904B6B7F6C14EA393599800 +00F63B1551CE3FB1:DCCDCE980B8F53FB:00008F330E389D6D8C759025A73B0F4D +73007315B631D42C:FEFB6E47E0913958:E80000B995B8B5B7012331DEB18B17E3 +918A00AC1FE3BEB7:96E18EBBBC84F820:E9470000D586B0B87E62B9F2AA0CEDCB +6C4BE70034417166:2233574BBFB37A47:0B722500005C3BF867275AE43912CB41 +579D81C500B37B08:284761ECA5AE4D8D:CBFC29E10000A00051235EDAA9B4E90C +B0632CA13B006D91:77A21967A910E4B0:47F3F9CEB300008A411860CA30676173 +110AB0B74835001F:A0C0B6A90315B41B:B49E9FB3667A00008D35B8302A2E3FE5 +FB631C5B0D8A6D00:3C21A854AD831504:BBC8596413675B00006897EF67EDD14D +00F05A000352CA7F:CB164FEF25E0D62A:8329212347EA2EB400001CBBD08CF5DE +780070AACA69878C:7F789323A50DDE56:A055853B4E0843152C00005F452804D4 +1DD700413C203186:CC355BD664B0A9C1:2BCBC21612DA339F979100007EBAB0E4 +2BB01100705AD581:AE453CCAEEDFABCE:DD6F4817817D8AABF9C3A90000668450 +5FB94F850063181F:03833C51E297D936:009ED73BC35BF76DD480342600001440 +46C17CAACB00A242:EC6EFF8167F35D74:762307A655DB2DED925F1AD5D5000090 +1F9C7CBA044000DB:E383EEFA935DCBFE:5762D3C970C7D7140CF5E1C6DDEE0000 +6658A1F0D70A2100:839F662509406DA2:003121CE9826F685AC5DCBD51FA81C00 +0084C508986E2762:C45D727344BCA366:0000BAFC3B6684E9CAE26E2A51B8D2B7 +49005892EA319D10:FB4D505B13FBBAED:2E00000EAAB656F92F0007965ABA6D6C +A8E7005578C53974:D0D4DD42CA42B8B7:92980000CBE225278A7B3C7A7DE69A35 +97756B00255781BE:CDE5C028BB80CEF4:F20D660000A5D7647224CE32F139ADEE +1E57BBF90019301C:6CBE3727B8B0C3A3:9102EEEC0000793BFD15C30AA5EAA94A +249B4EDA62005187:0E66EDEEC9093E1B:FF93238C670000B99C2E91E15939D6B1 +605BF46181D700F0:07D0EE1AB4F82F05:D005C51DE6700000D26AAE0442CAB9C4 +5999811287EFF300:A767C32D85CB0311:9E3A2695908A89000090E75D1AB81EDD +00B9486C88FA039F:49852C9BF77952A1:C4ABF59B7185DD460000E0EBEAEF136F +4700605F3130BE76:D04C0BD08DC431A4:0C235BEC758B4D46DE0000DDAFE816E2 +B17A00CB2A5C5EA0:E990AF9440CAA261:64DADE3DE21483B352F30000173BB8AD +3A75A600BE66B998:F79AAFDDBFB00ED7:9D3D66E09D5E5A11F67B940000031BC0 +D7FED4EC00AF9516:03641077F0CFC0D3:9ABB92CE570A884BF048E7180000B852 +BE22BC11AF002EB2:8E64899F1DCA1784:71E6A68A90875150CB9D110958000066 +D3137A569D910073:3EECE97BB80D548A:83207306634833B4F7592EC4CA7E0000 +5BF3EE3BF5E7DC00:15ED3B45209747A8:00C41B6795275751DB42AF77442F5700 +00A709FBF07436DF:3571E5635D0BF407:00004EF57C7E3A7BA01419C60C080F2D +06004AEB60290B42:4F21AFAD884330BB:5F000045014A6ECF98F421DD289C55E6 +7BDA00CD32B3B1FF:520937683AD5675C:12CE000033406D9AF884C84CD6DDCD21 +838374006643B143:47BB11AF631FFB5D:35C251000040AAC84B90B889D0A24D8B +77C34A1500E95667:88DB931F156F5445:370567E0000026DF3BB5BAB73207C749 +BE620F73AC0068BE:ABE4640EABBFE340:640455AE31000092B9386D9CFE4ADA20 +48CDF31F6C0A009B:084203C1BD3A658C:5B13FD6446290000CCA1F2F0D341C718 +23399EC96B9B4100:BE3E576D35FCA745:88B89A7EAD61670000D8C490A0C4FA36 +00DDACBA7C185AC9:52BD247982A561E2:0BB8A5C30B7ADF860000E55F515B2926 +B50045B0FEF1621E:763B83D026874BFE:96DCCA0A25EFD962960000AF7DD4254E +B6880059216DB5A9:E665B554ED12D8C6:6601F4C2AC654C1381BA000073447B02 +39521B00F3D72E95:60F3EA47071F5306:5D494C989D3665352EA74B0000CA342F +953CA28D00AD9898:0F2C05BA11B2B8F4:79FBED035100F698DDE99EEC00005DDD +FE4A28C143008952:6973F45BC603F9BA:EE04B71567F014F7F763F0ADE400005D +8890123697F5000C:A95049D6AC47E7AE:63597101B3A8336FE99E8A76875B0000 +95533AA66EB7CB00:391CF1D308C67292:0012B2CB4F003EF195BC1414D6540400 +003D8F50A0E537A1:22C19CF341DB7CE1:00002DB7D757486930606F2FC7045F64 +3D00863574901463:E5F948AC91493AD7:2900009BB26F083A61B0026163042AE7 +597300AE3E2440A3:2055962B4045F983:C6D60000E4538CF8C0456846DEF4F62D +4A4471000EB0F045:343F5A228725CB59:37DF430000F338B8995333A55F08241D +95E4A397007E0C98:9B7A68A66565BF92:21F6AC3200000AC6134F909B262ABF45 +49B954C71700B39B:4ED5370451EFE68F:85C5A3A2A5000092B1200B7A21026857 +F37CCCA968E600A2:19B7CF5AAA1B3982:978A0012E5D70000C4DD7951439D9075 +66826CD1026EB800:EB43FEF9EF68F5E8:08FEE636F11EE9000023E7C6E6391CE1 +0038F00D37D87617:B5FB0F31785A62E7:22FB9C48B908873D0000CC334F8ECAD4 +3E002551E14202FE:E60B4B8827C32C45:A6674F378AEA5615820000158D7F428F +D0FF0072DDBA174E:03FB49171B487274:58870F8E541EAA612B5700004E0CCFD3 +4AFBF200DC1CA63C:E86F1ED9B5F2BDE9:DD9E8B78F04A65AFCBF1AC0000EEB486 +C9ECD9EA00FD7324:3C929A746C599E13:C13A59987AEF8C4B4EC3A87700004629 +03738D499B001F95:A10BAC400EA235D3:EF39A0BBDDB2F976795853A6A70000A2 +5A5BC6AA243C001D:ABBF1B2A1B1C7EDB:EF70882E7E3B1286B1115DCB8B2E0000 +640598E874440000:FB5B53FFDA4AE2B1:00268897396591A96671BAE6835CEE00 +00F195A06A3A8DEE:21870177D8463B27:0000FA74B64B61582897AA5F85A580D0 +CF0095E2C5BB96A3:49FC16F142F6B04D:920000751D3E04FC3D70848FEE2C8A4A +EC5300EF494C40A0:53F5E36D9C42526F:9CF30000A0259B7A8CBCAA62D9326400 +A5A6E800A291949F:9C93982278A28B8F:3FF4A700001DE8887802A58848039E14 +7505A80B006EC907:CCC97DB1F9700494:8831C67B0000C629DE8F43A2842DCE45 +BFE978B8C900A7BA:8450C52D333152BC:3FABC6EA510000549F6EA0ABED81761A +2123D1105B2000C8:4F1DA3B7848F7A00:913F4029C2FD0000A0C526F4ADE6C876 +9517D1A98BFC6900:61B272A808305B45:A501B4B7AF5BF00000E38350CAE4AF92 +00101D45B3B4F245:5FA1D7209BAD5FD2:6ABFBD71ECE9D8120000C6ECB50EBBBF +8C005E7AD75D5D78:199B787CA91776D8:5B657D628773EBC999000077F8E75435 +2EEC00C410CC826F:278A95BF49240E42:2AF96D2E03087B4AF6000000BCF73EDA +4904D500D78A9F0E:397E12BE77633D76:2AFD4E989C9CC10D821FA4000002F95B +0614FC13005971AB:C1CC70E18E244A6A:4ED02D605500B6B98D5EC7180000F61F +B928318683002594:61F26AF133A64689:39685AB8B0B0787B5761F8477F0000E6 +427F4CBAB9C40023:DAB73E5C3E533D71:156652C914C9CABD835EAC0C02A50000 +B5AAF71A1D863200:4017699A8336070D:00B52760FF461B21EAD6D68F8B6E6100 +002B3D27CE1DEDEC:9567515235BAD0EC:00001B2B3DC232FA625F5542C16C59E0 +FC003F97BA171F07:273B74F309D5C6AB:230000CFA6068E57307ACCDA2B550748 +FFF60003BE4510BD:1EAE8EDC01F5FF11:8B210000D8C532EE1E016738D7AD1689 +1A05730041342D4B:B92F6C453B192ADB:A4959A00000326639A573B79C5857DA3 +AEB42C6900628B42:A7489C7D07147226:B28CC4130000F85DC68AE7A87C1DBE97 +5DB907497C008FEE:22F54C713A076B1D:76DE82835900000820D5DB67DB8E65B0 +7C2860EE183600A5:49892090BC7F0551:23E9FA3F7DFF0000904A028020985348 +0D5222ED6F816100:C1103CC4549AA574:DFA73EB8D9A6D9000049FC581CACFF59 +00E3F77B95074963:97D6FEC499DA8B04:F2CC3E9A54C972AF00001ED95A7136DC +EA0020AE7F1610A8:8F6589E66FD224CE:7623606A0EE1F8AFE900004AAFD16505 +B922006F9152E846:8A77F6831E030CBB:28A6BFA833FE45F96C7F00006364D2E8 +124FCF005D4B9516:5C5497CD35FAD71B:BD24A27EE9F5A9D7C070270000E375B7 +7BE5B07C0019E760:587AD202A11B3DC0:59B26F3A3D381643C6BF305E000017B9 +86EE9343E700BF3B:5B1A0B6C08AC87C6:6683A3DFD65AE3090DFDF4CC0F0000CF +849631C57F710077:656B5C536FB6CC79:532B823D801D590FC11588E1E9C00000 +4BB2914542E2FB00:CFC0815374FD0C1B:00EF36B04F6A32447C3436594E618B00 +00E5B6AE4E1F04BC:B889980FB94C6B43:000079E7BDFCB56E6CD2504326F7A05E +8000550EE1F4163B:F15C9759B51FE740:9D000090BBA22501CC3D289620344CFE +7B880038C192AF9D:43C2B447D3BA0C59:9E150000BD4147F02B1774E627B4B629 +5B35710020F18DF9:127D3522FECBA756:6BED1E00007411FEE04065CDFFFA6BCF +52223B3700E9D842:03B749CFF1E6C4C5:55EAF5DF000000BD649B386531093092 +77D33E252B00796E:CD4E93288046C1FE:BCDEB8A0AB0000BC2B61484D72F74261 +C201377F005800AC:35886B5494D1077F:C4E9F884CFF600006B2118DBD4C23172 +4203C3683617C700:AD4E16B645BD381C:111B4112EE4B430000EA7572062FE19B +00A925E6CDCA8787:C1874B1A18A25AD9:9B6AED103D1247820000B4F12B8A6570 +8100027ADFE381CB:9E1E67617BE12123:D31D1824E780FA7D1C000072040C4E4D +43AC007918BEC51E:8954A8628F6073A0:E766029C528400A81CF000006D4A819A +F1394C005E54D8C9:CA83AD379209D949:C755621F8B81EDA16C094C0000340D28 +921F09A5006C9C5D:E050650A0EFF64AE:1A5FACF05ED2356D3A5FD23D00004B8A +9C2DC2DB4D001297:A4CA5E9D472CFF6C:30AFD17D4AB9E6D148EA8A92E40000EF +E79FB1B4A49700F1:F75468D5CC3954BA:02322ACAE0B6700E7D82445B7AE60000 +D400A5AAC4BAB700:1AC41DA1F48BBEBC:000001D4F9600F91B2CD1975EAD58100 +00852E54441918B1:65185050DDE7C809:00009E8291898B9E961C3B2BEE43316F +01007EF2BB26A601:A866E8FE026031F7:57000019D59FB182721C98FA4C8E8159 +77E90016E2D57409:AD476E7180FC80F1:09B90000B8AA6CB18683542EB1E1FF4C +D73DD20032F3AD08:28F91CF76FA4DF45:F8031C00007891A8A240FCA992D0B913 +83DAF01E0006CB29:69143710EE5A8C73:87BD381600003DE9342FED8F961D979C +AE2CF2733B00D3B6:643546FE48876F41:ACA61121BE000027F1B6D102FD3961A6 +1F9A8F74B9B900EC:7C7DE0F4A345D90F:79368D955A5B0000541E1EDFD47D6032 +8B6248D2FD693F00:777B184E2D373FD2:3994D0035AB18E0000E14EBF062253DE +004383DA5687DD0F:2E33EE3C80B03AA3:CB05F743DDDDBB1800000CDABA6F7082 +4700DBB3C47A79D9:A9FEEC660D58F74F:7B8034C0387A15C2890000B8B7EE44AB +DC8A00992CB890BE:00768BB855022EB8:A7B9EEF171C2BD96193000002A452412 +CF6F0B00E8BE9CBB:50EF6E3D4C8186FA:4966648D0D24BD8A47137900000FF58F +8CEB523F00FEBD62:47A692CBB77E3094:D313A88DFC9919BC83A5F70C0000CBEE +DFE43077AF0046D2:C49D7ED471A33390:2C7334D72D28BD4991B27976F10000A3 +A80A61EA43ED00FF:71CD051906E9A827:6F8B3E9B3EE594685B1BAB08E81E0000 +3356F9540109D200:6477D5BF8948F942:0087A1D456585893EA218FFAB998F200 +0015F9BA89E0070E:E411797E5ACA7A34:00002BB85339EF5E5D18F0E8008F42FE +7400869928902188:591CDBE69845DECA:810000551FA49B6E0257DF16F60120DB +CA4400FB5B4F3CCD:F21BA22C66243D7F:56CF000016BB754C80DCF86B50E0BCE9 +079CC900CE8D9824:89D4843D4E496542:6EAF8800004AE2758A491A45F3A49F60 +7CD8815F00823DF1:294EFEE87CD9F6EA:4E7980B70000F3B9625F09D08DC9D536 +E993C60ABB0036CD:ED87467617F4715E:B24B949D0D00005E79CFB4C695CC7682 +F1116845981A0041:90D6DDF669F5A4AB:36990D8EB4CF0000A61D7AC92953D590 +1630B706F44C6B00:34B15DF951D3114E:310024F6D3C390000095EE57E871D83D +006352FFEEDFA3E0:ADEDB3A6C0472082:69627F5EF0294C160000051D531728BC +E600F2A11F1D60E9:546494BF27CF9BAD:535549708D93FFFAAE0000C47F66AD22 +12100060BB5A7C60:BAECA338CCA4A540:87C4B4C31EE8568D6EF40000D66986CF +2DADEF00AF8FFD13:58E3E38C6DFD23CE:D20E0C0EB3DD4C92A18806000028A92C +43263CD0005E45D2:A1CB693BB73C8282:7E660BF195FC3D651C927F8E000085BD +915C2A153900C3AE:2C324F7AD676DD01:A18B8DF4228195D6273289252A0000C7 +16973A764ED700CC:0042D6D810E51234:89F557F3DCC2478682F9A746B70B0000 +729FCEB1769F2700:3B8DD866347F3C12:004D652ACB1F74CD984174350CC88400 +00940B86CB15DBCC:91DF44E34428321B:0000F2708A6D18D1BAEEEF6C618C0EEC +1E009CACCE5E4B57:36A72C67FEA71DD6:3600005455F0F4BFEBE03E37F1A5D391 +DB630084270EEA71:5A75F5BCB581F078:EC70000086CA353F3F38784B440E7B2B +48A0C900DCCFFC53:FC779AFD4EE05356:D3D8C9000055C5FA0B09530819ECC2D0 +B2D763CB004D729A:39C55AC867CBBD0E:45F4D2B80000E78E7199F0F0B2E2A67B +E8C2AE5BE70052A9:7B842C4E1B4360CF:EA730C0680000039A13B4069D0718FA1 +38C71268B7150070:AEC3A0ED452221A1:DC340096A4CE000032B772BF3F706A0A +0CF17BC67C288900:19C197698A765E06:D58DD7A445FC2500007CC749B73823D4 +0054DE83BDFDDEAB:6E01249199FE3322:48EA721821935A9700006EA093FE21AF +6700F2050642E50B:CBE6CDFB6289FD7A:C6A697FD248B8476B300009DF15FBE5B +370F009211C51E13:F80008FCD23823A6:4E92C17C0552C32915AB00001488853C +E3D4FB006D7E2048:8E8F8CF995C71171:6E7B7F4D9C6E74297E93C30000AEC95A +266CCE370000B7D9:8392D507AEF1C999:7156D4AFAC1C2716D4C493FF0000E0A3 +89715DD84B00A877:DB319D867BE6F5EA:6BA79216829469E486A15E58BE0000AB +4D2DAAD3FA020031:7497F67FFE71486A:5ABF097E08456B3D2365C54D7AD80000 +2A9EC46663F40E00:DC9777DD2553296F:0086298EB766301EC6E64DF9BF3A1800 +00F1F54E9A6DC02F:DD3780BA7B16263E:00002F79F90D1DC67F047452CB95E1C4 +74000A0E9ACB88AF:E77A9B550D731164:7F0000FE37B43BAFC74D392E5FA06975 +94360078C737AAD7:04A17234628802E8:BE21000089A1840B71A5C68F4A4A32F1 +8BF4F800EE7BFF5D:F244EAEEC5072D9B:ED65970000BD224C0437DC9F010C44F1 +826837CD00BB0898:05DB95245B3B175F:51F7E6350000931538B48D6F0A8270CB +E4412B7327002012:989AF943448FF64D:25A16F78BD00003EDEAC10D86E59A0C3 +D71D7109FECB0072:A1389295EBAF0F72:E3701E3714A200000AB226A55C447407 +767EF7AEF3CAA900:ECE04FCCBFDA84DB:E4A0AC28EA269700009DAD6CD2E1F0C2 +0085CEC40E37DE72:D506ED9634352AF9:EA46F14603B3F1B3000089DB9A07A212 +7E00B573B2B56DB0:3C7D916C612D6C6D:EE042F10350A3F824100004759009A0B +409900D3F359A7AA:0402B0D166C562FB:6BF869D7953D476E3F7B0000E9A2F766 +8BEEB6000757F14A:803B9943069DE4CC:948986E810FED4CDC434270000887908 +85218E2800777319:5D4D710B47111D9E:DF75364489CE5CA5499C1E9900007956 +D4659B115000E6F5:F1535CDCD422F70F:7297F8C7A3E983D47CCA04098A000083 +2A0D9FBA320D009D:A830EC0A0C700181:43A74F8F64AE65BA6915D95EAC620000 +0EAFF9E79E22E400:E8C444A639C28AED:00224C24A7D084B77FC18ED3EA2E0B00 +008B322DF1816D52:0F810DA2BD5E2203:0000D712F43ADCFED1A9CBCB22CF4E2B +21006874A08B7DA9:D2E3EED16501E0F1:AC000016255D3D8E7F9DC60844C8E5EB +3D600001421332C9:5ADA46B4E6ED7396:31230000FDCE8D418A2AD59630E3B54A +1925E700BCBE480D:DD75CA1376BF4E43:87AD9B00002C142672046D7D1914832A +FE95691300B4B938:5EAF07F852F1335A:A0D2AE630000E673148BA974CACB74CF +4A51204D1D00A7BD:D369B44DE778C5AC:C29993616D0000F6B88C40426C971CB0 +010264DC3159009A:6050FFF2D7DE8517:AE011C7A16E8000094130EB7C82CD4B6 +54C23864C6E67100:C846131ECD974EAF:D1918B16DD54970000844052BCC2B288 +005CA93A9FA5CEA9:E225EC5890787888:40C3D98253E2C06F00005628F914678C +BA00792365BE88AE:6A8C12DA66EA9595:37B0B3CD389C875BBF000091411E61CA +DFEE00E54435255E:39CC7776BEC81C90:4DA603D49F6830E3B14F000001B18BFD +BE9BB6004AFDB5B1:E70AB60E29A55AA4:5A7CC2861C3989B5F09B9100000E03F2 +6C2C99C80044DBBC:DD165030CFB74177:9E93015F09085EB4FBFD352400006A3F +BAD143510100BBC6:847E7BAC90EF08A9:014C89D7790CE632665EB557B600008C +108B4CAD993300BE:949B5376E26551DA:94A2FA1B3BDABE5F4E4B6945AF9A0000 +C779A209E5254E00:030B0A813E7302E2:0098EC83BC69794459037F407F240900 + # Test vectors taken from ARIB STD-T63-35.203 V6.0.0 [KASUMI] EA024714AD5C4D84:DF1F9B251C0BF45F:2BD6459F82C5B300952C49104881FF48 diff --git a/doc/log.txt b/doc/log.txt index 83adaeb5f..1b70d3dc4 100644 --- a/doc/log.txt +++ b/doc/log.txt @@ -1,5 +1,6 @@ * 1.9.8-dev, ????-??-?? + - Use constant time multiplication in IDEA * 1.9.7, 2010-04-27 - TLS: Support reading SSLv2 client hellos diff --git a/src/block/idea/idea.cpp b/src/block/idea/idea.cpp index 15ff7c0ec..0c5dfed42 100644 --- a/src/block/idea/idea.cpp +++ b/src/block/idea/idea.cpp @@ -1,6 +1,6 @@ /* * IDEA -* (C) 1999-2007 Jack Lloyd +* (C) 1999-2010 Jack Lloyd * * Distributed under the terms of the Botan license */ @@ -17,15 +17,18 @@ namespace { */ inline u16bit mul(u16bit x, u16bit y) { - if(x && y) - { - u32bit T = static_cast<u32bit>(x) * y; - x = static_cast<u16bit>(T >> 16); - y = static_cast<u16bit>(T & 0xFFFF); - return static_cast<u16bit>(y - x + ((y < x) ? 1 : 0)); - } - else - return static_cast<u16bit>(1 - x - y); + const u32bit P = static_cast<u32bit>(x) * y; + + // P ? 0xFFFF : 0 + const u16bit P_mask = !P - 1; + + const u32bit P_hi = P >> 16; + const u32bit P_lo = P & 0xFFFF; + + const u16bit r_1 = (P_lo - P_hi) + (P_lo < P_hi); + const u16bit r_2 = 1 - x - y; + + return (r_1 & P_mask) | (r_2 & ~P_mask); } /* |