aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--checks/bench.cpp15
-rw-r--r--checks/validate.dat520
-rwxr-xr-xconfigure.py19
-rw-r--r--doc/log.txt3
-rw-r--r--readme.txt2
-rw-r--r--src/block/idea/idea.cpp23
-rw-r--r--src/build-data/buildh.in7
-rw-r--r--src/build-data/os/aix.txt4
-rw-r--r--src/build-data/os/beos.txt4
-rw-r--r--src/build-data/os/cygwin.txt12
-rw-r--r--src/build-data/os/darwin.txt4
-rw-r--r--src/build-data/os/dragonfly.txt4
-rw-r--r--src/build-data/os/freebsd.txt4
-rw-r--r--src/build-data/os/hpux.txt4
-rw-r--r--src/build-data/os/hurd.txt5
-rw-r--r--src/build-data/os/irix.txt4
-rw-r--r--src/build-data/os/linux.txt5
-rw-r--r--src/build-data/os/mingw.txt2
-rw-r--r--src/build-data/os/netbsd.txt4
-rw-r--r--src/build-data/os/openbsd.txt4
-rw-r--r--src/build-data/os/qnx.txt4
-rw-r--r--src/build-data/os/solaris.txt4
-rw-r--r--src/build-data/os/tru64.txt4
-rw-r--r--src/build-data/os/windows.txt4
-rw-r--r--src/pk_pad/eme1/eme1.cpp40
-rw-r--r--src/utils/cpuid.cpp5
26 files changed, 609 insertions, 101 deletions
diff --git a/checks/bench.cpp b/checks/bench.cpp
index 9b917c99d..d03193971 100644
--- a/checks/bench.cpp
+++ b/checks/bench.cpp
@@ -182,10 +182,17 @@ bool bench_algo(const std::string& algo,
std::string cipher = algo_parts[0];
- u32bit cipher_keylen =
- af.prototype_block_cipher(cipher)->MAXIMUM_KEYLENGTH;
- u32bit cipher_ivlen =
- af.prototype_block_cipher(cipher)->BLOCK_SIZE;
+ const Botan::BlockCipher* proto_cipher =
+ af.prototype_block_cipher(cipher);
+
+ if(!proto_cipher)
+ {
+ std::cout << "Unknown algorithm " << cipher << "\n";
+ return false;
+ }
+
+ u32bit cipher_keylen = proto_cipher->MAXIMUM_KEYLENGTH;
+ u32bit cipher_ivlen = proto_cipher->BLOCK_SIZE;
if(algo_parts[1] == "XTS")
cipher_keylen *= 2; // hack!
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/configure.py b/configure.py
index 416083abc..9aa8b0cec 100755
--- a/configure.py
+++ b/configure.py
@@ -40,9 +40,9 @@ class BuildConfigurationInformation(object):
"""
version_major = 1
version_minor = 9
- version_patch = 7
- version_so_patch = 7
- version_suffix = ''
+ version_patch = 8
+ version_so_patch = 8
+ version_suffix = '-dev'
version_string = '%d.%d.%d%s' % (
version_major, version_minor, version_patch, version_suffix)
@@ -725,7 +725,7 @@ class CompilerInfo(object):
class OsInfo(object):
def __init__(self, infofile):
lex_me_harder(infofile, self,
- ['aliases', 'target_features', 'supports_shared'],
+ ['aliases', 'target_features'],
{ 'os_type': None,
'obj_suffix': 'o',
'so_suffix': 'so',
@@ -736,12 +736,18 @@ class OsInfo(object):
'header_dir': 'include',
'lib_dir': 'lib',
'doc_dir': 'share/doc',
+ 'build_shared': 'yes',
'install_cmd_data': 'install -m 644',
'install_cmd_exec': 'install -m 755'
})
self.ar_needs_ranlib = bool(self.ar_needs_ranlib)
+ if self.build_shared == 'yes':
+ self.build_shared = True
+ else:
+ self.build_shared = False
+
def ranlib_command(self):
if self.ar_needs_ranlib:
return 'ranlib'
@@ -1481,6 +1487,11 @@ def main(argv = None):
archinfo[options.arch],
options)
+ if not osinfo[options.os].build_shared:
+ if options.build_shared_lib:
+ logging.info('Disabling shared lib on %s' % (options.os))
+ options.build_shared_lib = False
+
build_config = BuildConfigurationInformation(options, modules_to_use)
build_config.public_headers.append(
os.path.join(build_config.build_dir, 'build.h'))
diff --git a/doc/log.txt b/doc/log.txt
index 5df146912..1b70d3dc4 100644
--- a/doc/log.txt
+++ b/doc/log.txt
@@ -1,4 +1,7 @@
+* 1.9.8-dev, ????-??-??
+ - Use constant time multiplication in IDEA
+
* 1.9.7, 2010-04-27
- TLS: Support reading SSLv2 client hellos
- TLS: Add support for SEED ciphersuites (RFC 4162)
diff --git a/readme.txt b/readme.txt
index 2dcf4737a..ded0d9222 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
-Botan 1.9.7, 2010-04-27
+Botan 1.9.8-dev, ????-??-??
Botan is a C++ class library for performing a wide variety of
cryptographic operations.
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);
}
/*
diff --git a/src/build-data/buildh.in b/src/build-data/buildh.in
index 724801040..90d274d58 100644
--- a/src/build-data/buildh.in
+++ b/src/build-data/buildh.in
@@ -35,6 +35,13 @@
#define BOTAN_USE_GCC_INLINE_ASM 0
#endif
+#ifdef __GNUC__
+ #define BOTAN_GCC_VERSION \
+ (__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCH__)
+#else
+ #define BOTAN_GCC_VERSION 0
+#endif
+
/* Target identification and feature test macros */
%{target_os_defines}
diff --git a/src/build-data/os/aix.txt b/src/build-data/os/aix.txt
index 312377096..369b720c4 100644
--- a/src/build-data/os/aix.txt
+++ b/src/build-data/os/aix.txt
@@ -3,7 +3,3 @@ os_type unix
<target_features>
gettimeofday
</target_features>
-
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/beos.txt b/src/build-data/os/beos.txt
index f6a06b7af..4a16b6326 100644
--- a/src/build-data/os/beos.txt
+++ b/src/build-data/os/beos.txt
@@ -9,10 +9,6 @@ doc_dir documentation
gettimeofday
</target_features>
-<supports_shared>
-all
-</supports_shared>
-
<aliases>
haiku
</aliases>
diff --git a/src/build-data/os/cygwin.txt b/src/build-data/os/cygwin.txt
index f7c1f49ed..9ec86736d 100644
--- a/src/build-data/os/cygwin.txt
+++ b/src/build-data/os/cygwin.txt
@@ -1,15 +1,13 @@
os_type unix
+# Cygwin supports shared libs fine, but there are problems with making a Botan
+# shared library when libraries it depends on are static-only (such as libz).
+# So until I can figure out a work-around, it's disabled.
+build_shared no
+
install_root c:\Botan
doc_dir docs
<target_features>
gettimeofday
</target_features>
-
-# Cygwin supports shared libs fine, but there are problems with making a Botan
-# shared library when libraries it depends on are static-only (such as libz).
-# So until I can figure out a work-around, it's disabled.
-<supports_shared>
-#all
-</supports_shared>
diff --git a/src/build-data/os/darwin.txt b/src/build-data/os/darwin.txt
index af60e1bed..b63abf32c 100644
--- a/src/build-data/os/darwin.txt
+++ b/src/build-data/os/darwin.txt
@@ -12,10 +12,6 @@ doc_dir doc
gettimeofday
</target_features>
-<supports_shared>
-all
-</supports_shared>
-
<aliases>
macosx
</aliases>
diff --git a/src/build-data/os/dragonfly.txt b/src/build-data/os/dragonfly.txt
index 7a002a65d..ff8f41d2a 100644
--- a/src/build-data/os/dragonfly.txt
+++ b/src/build-data/os/dragonfly.txt
@@ -5,7 +5,3 @@ clock_gettime
gettimeofday
posix_mlock
</target_features>
-
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/freebsd.txt b/src/build-data/os/freebsd.txt
index 3bcf58d62..14e6c63e2 100644
--- a/src/build-data/os/freebsd.txt
+++ b/src/build-data/os/freebsd.txt
@@ -4,7 +4,3 @@ os_type unix
posix_mlock
gettimeofday
</target_features>
-
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/hpux.txt b/src/build-data/os/hpux.txt
index e7aa30e9c..19c230d77 100644
--- a/src/build-data/os/hpux.txt
+++ b/src/build-data/os/hpux.txt
@@ -6,10 +6,6 @@ so_suffix sl
gettimeofday
</target_features>
-<supports_shared>
-all
-</supports_shared>
-
<aliases>
hp-ux
</aliases>
diff --git a/src/build-data/os/hurd.txt b/src/build-data/os/hurd.txt
index f0ab18a98..e3906f63a 100644
--- a/src/build-data/os/hurd.txt
+++ b/src/build-data/os/hurd.txt
@@ -4,11 +4,6 @@ os_type unix
posix_mlock
</target_features>
-# Is this correct?
-<supports_shared>
-all
-</supports_shared>
-
<aliases>
gnu
</aliases>
diff --git a/src/build-data/os/irix.txt b/src/build-data/os/irix.txt
index 312377096..369b720c4 100644
--- a/src/build-data/os/irix.txt
+++ b/src/build-data/os/irix.txt
@@ -3,7 +3,3 @@ os_type unix
<target_features>
gettimeofday
</target_features>
-
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/linux.txt b/src/build-data/os/linux.txt
index 2f59fb9d1..8bfacd4c9 100644
--- a/src/build-data/os/linux.txt
+++ b/src/build-data/os/linux.txt
@@ -6,8 +6,3 @@ gettimeofday
posix_mlock
gmtime_r
</target_features>
-
-# Is this correct?
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/mingw.txt b/src/build-data/os/mingw.txt
index 1b30e0b3a..08f85b4db 100644
--- a/src/build-data/os/mingw.txt
+++ b/src/build-data/os/mingw.txt
@@ -4,6 +4,8 @@ obj_suffix o
so_suffix dll
static_suffix a
+build_shared no
+
ar_command "ar crs"
ar_needs_ranlib yes
diff --git a/src/build-data/os/netbsd.txt b/src/build-data/os/netbsd.txt
index 312377096..369b720c4 100644
--- a/src/build-data/os/netbsd.txt
+++ b/src/build-data/os/netbsd.txt
@@ -3,7 +3,3 @@ os_type unix
<target_features>
gettimeofday
</target_features>
-
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/openbsd.txt b/src/build-data/os/openbsd.txt
index 312377096..369b720c4 100644
--- a/src/build-data/os/openbsd.txt
+++ b/src/build-data/os/openbsd.txt
@@ -3,7 +3,3 @@ os_type unix
<target_features>
gettimeofday
</target_features>
-
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/qnx.txt b/src/build-data/os/qnx.txt
index 312377096..369b720c4 100644
--- a/src/build-data/os/qnx.txt
+++ b/src/build-data/os/qnx.txt
@@ -3,7 +3,3 @@ os_type unix
<target_features>
gettimeofday
</target_features>
-
-<supports_shared>
-all
-</supports_shared>
diff --git a/src/build-data/os/solaris.txt b/src/build-data/os/solaris.txt
index df951d4fc..47e7bccbc 100644
--- a/src/build-data/os/solaris.txt
+++ b/src/build-data/os/solaris.txt
@@ -5,10 +5,6 @@ posix_mlock
gettimeofday
</target_features>
-<supports_shared>
-all
-</supports_shared>
-
<aliases>
sunos
</aliases>
diff --git a/src/build-data/os/tru64.txt b/src/build-data/os/tru64.txt
index 677c38955..a442743bc 100644
--- a/src/build-data/os/tru64.txt
+++ b/src/build-data/os/tru64.txt
@@ -4,10 +4,6 @@ os_type unix
gettimeofday
</target_features>
-<supports_shared>
-all
-</supports_shared>
-
<aliases>
osf1
</aliases>
diff --git a/src/build-data/os/windows.txt b/src/build-data/os/windows.txt
index 23838eb6d..2d435535c 100644
--- a/src/build-data/os/windows.txt
+++ b/src/build-data/os/windows.txt
@@ -17,10 +17,6 @@ win32_query_perf_counter
win32_virtual_lock
</target_features>
-<supports_shared>
-all
-</supports_shared>
-
<aliases>
win32
MSWin32
diff --git a/src/pk_pad/eme1/eme1.cpp b/src/pk_pad/eme1/eme1.cpp
index d99ffaf58..9eab16d6c 100644
--- a/src/pk_pad/eme1/eme1.cpp
+++ b/src/pk_pad/eme1/eme1.cpp
@@ -1,12 +1,13 @@
/*
-* EME1
-* (C) 1999-2007 Jack Lloyd
+* EME1 (aka OAEP)
+* (C) 1999-2010 Jack Lloyd
*
* Distributed under the terms of the Botan license
*/
#include <botan/eme1.h>
#include <botan/mgf1.h>
+#include <botan/mem_ops.h>
#include <memory>
namespace Botan {
@@ -50,11 +51,17 @@ SecureVector<byte> EME1::unpad(const byte in[], u32bit in_length,
find the secret key, as described in "A Chosen Ciphertext Attack on
RSA Optimal Asymmetric Encryption Padding (OAEP) as Standardized in
PKCS #1 v2.0", James Manger, Crypto 2001
+
+ Also have to be careful about timing attacks! Pointed out by Falko
+ Strenzke.
*/
key_length /= 8;
+
+ // Invalid input: truncate to zero length input, causing later
+ // checks to fail
if(in_length > key_length)
- throw Decoding_Error("Invalid EME1 encoding");
+ in_length = 0;
SecureVector<byte> tmp(key_length);
tmp.copy(key_length - in_length, in, in_length);
@@ -62,20 +69,29 @@ SecureVector<byte> EME1::unpad(const byte in[], u32bit in_length,
mgf->mask(tmp + HASH_LENGTH, tmp.size() - HASH_LENGTH, tmp, HASH_LENGTH);
mgf->mask(tmp, HASH_LENGTH, tmp + HASH_LENGTH, tmp.size() - HASH_LENGTH);
- for(u32bit j = 0; j != Phash.size(); ++j)
- if(tmp[j+HASH_LENGTH] != Phash[j])
- throw Decoding_Error("Invalid EME1 encoding");
+ const bool phash_ok = same_mem(&tmp[HASH_LENGTH], &Phash[0], Phash.size());
- for(u32bit j = HASH_LENGTH + Phash.size(); j != tmp.size(); ++j)
+ bool delim_ok = true;
+ u32bit delim_idx = 0;
+
+ // Is this vulnerable to timing attacks?
+ for(u32bit i = HASH_LENGTH + Phash.size(); i != tmp.size(); ++i)
{
- if(tmp[j] && tmp[j] != 0x01)
- throw Decoding_Error("Invalid EME1 encoding");
- if(tmp[j] && tmp[j] == 0x01)
+ if(tmp[i] && !delim_idx)
{
- SecureVector<byte> retval(tmp + j + 1, tmp.size() - j - 1);
- return retval;
+ if(tmp[i] == 0x01)
+ delim_idx = i;
+ else
+ delim_ok = false;
}
}
+
+ if(delim_idx && delim_ok && phash_ok)
+ {
+ return SecureVector<byte>(tmp + delim_idx + 1,
+ tmp.size() - delim_idx - 1);
+ }
+
throw Decoding_Error("Invalid EME1 encoding");
}
diff --git a/src/utils/cpuid.cpp b/src/utils/cpuid.cpp
index 8d801b75f..19a2db788 100644
--- a/src/utils/cpuid.cpp
+++ b/src/utils/cpuid.cpp
@@ -26,12 +26,15 @@
#include <ia32intrin.h>
#define CALL_CPUID(type, out) do { __cpuid(out, type); } while(0);
-#elif defined(BOTAN_BUILD_COMPILER_IS_GCC)
+#elif BOTAN_GCC_VERSION >= 430
+ // Only available starting in GCC 4.3
#include <cpuid.h>
#define CALL_CPUID(type, out) \
do { __get_cpuid(type, out, out+1, out+2, out+3); } while(0);
+#else
+ #warning "No method of calling CPUID for this compiler"
#endif
#endif