Add LEA lightweight block cipher (GH #669)

pull/670/head
Jeffrey Walton 2018-06-17 22:36:41 -04:00
parent f320e7d92a
commit 1f06c512c4
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
13 changed files with 1162 additions and 0 deletions

View File

@ -160,6 +160,8 @@ kalyna.h
keccak.cpp keccak.cpp
keccak.h keccak.h
lubyrack.h lubyrack.h
lea.cpp
lea.h
luc.cpp luc.cpp
luc.h luc.h
mars.cpp mars.cpp
@ -447,6 +449,7 @@ TestVectors/hkdf.txt
TestVectors/hmac.txt TestVectors/hmac.txt
TestVectors/kalyna.txt TestVectors/kalyna.txt
TestVectors/keccak.txt TestVectors/keccak.txt
TestVectors/lea.txt
TestVectors/mars.txt TestVectors/mars.txt
TestVectors/nr.txt TestVectors/nr.txt
TestVectors/panama.txt TestVectors/panama.txt

View File

@ -30,6 +30,7 @@ Test: TestVectors/aria.txt
Test: TestVectors/kalyna.txt Test: TestVectors/kalyna.txt
Test: TestVectors/threefish.txt Test: TestVectors/threefish.txt
Test: TestVectors/sm4.txt Test: TestVectors/sm4.txt
Test: TestVectors/lea.txt
Test: TestVectors/simon.txt Test: TestVectors/simon.txt
Test: TestVectors/speck.txt Test: TestVectors/speck.txt
Test: TestVectors/salsa.txt Test: TestVectors/salsa.txt

216
TestVectors/lea.txt Normal file
View File

@ -0,0 +1,216 @@
AlgorithmType: SymmetricCipher
Name: LEA-128/ECB
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 07AB6305B025D83F79ADDAA63AC8AD00
Plaintext: F28AE3256AAD23B415E028063B610C60
Ciphertext: 64D908FCB7EBFEF90FD670106DE7C7C5
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 56CEC76DBD39F3EB7F7AD2A492C991A0
Plaintext: 2D8CCE99726D59AF50B0375DA8C3EDACAE17FBA6932FA60E61F7FA4E265610B1
Ciphertext: 381D0BDBC808C408D1BD0C791FB08469F19F6319329F9ECD5CD6CFD0C3892BEC
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 54068DD268A46B55CA03FCD4F4C62B1C
Plaintext: D72E069A7A307910E5CB5C8C3D98B19B30A326BA9479E20D4A827D546991501A98BAF02FBC64F559D49E004720B7FCC6
Ciphertext: 6C83D52A769B4146F77EFB6F64193D9AB4763140CB560574792788D8D051A6F842A3C6A731A9D88AD0AAF959F82309C3
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 8908A3383D1544419AD5C4C34D4DE40D
Plaintext: BB64C14FA0F2A151F51AEC6518DA799B27E00B33AC9F1C5880A3D90BE9216D5D06D382E16D02056112E52AD06B29B180D1D167952A40EFBAC594C21285367571
Ciphertext: 1BB3EB3EEFB15CB8B846714332DEE0579AD3E047D1EFA108A996D3F2F0E6532C6E7449E1286B714356525BA48B8A061476B0517FD563499B4145FA62DEAFCDD4
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 42AF3BCD6CBEAAEFF1A7C26E61CD2BDE
Plaintext: 5183BE45FD2047CE315189C269B483B337A2F2FBE54C17655B09BA2944EE6F1E6DA0182B6D66ABFE8B823601DCC2208AAC52B1531FD4D42918B21CE85AB306A6EECD7E2FC43BA4B29DCFCFB92788D25E
Ciphertext: F3B6BF4AFBA7103E32B2AC2E7B46FF91E872BCBB93CF52E294ED5539871C4893D14C54088646E2FD0B7C62D583F3AF6718B0BA83C7A29E2F962DF06062121C521BB9E76D7035070719EDFB409C5B83C2
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 6A677FBC647F6AA5F04CF093ED4577E0
Plaintext: 9BB4F63948C6B9502DDE5ED1932F24983A8A6521FA74603FAB7C3C1143CC4A323EFD8B3143307241045AEA3166DF9B9EE26369672ADC3E6110EC0A4CA46F08069D5042FFFBA057EDEAE97CC1E8BFC1D92A9996773CDF8D72E944612B5A5638C3
Ciphertext: 5C1F5BE78BE59B992EBBC2C049FDEF3E46EAA59934589643468FC5B8BF96377CEC45441D00A380BB71D544D759867D7906EAC58B455292D33590D915F8722253AA2AA3D1CD26D6E5DFC4D2BFC4297BB2E74EF0592886162A17C6BC409999FE85
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 8253258BB93FF1BCA6331B6963F81DB1
Plaintext: DCD5F13978A4D4DAFC2B4A96ACAA62D1B3B13BBDC434C71702E1CF111DB1378FBEBE849526549B00124ACB75E1930E98F8108C7E66A86164C49BA0A15F1398D99AFD56748D166B4EF249EFB04238C5801B1921B4E5C3480CB50897017146C7F936396FBCF613CA2B66CFBB3017C20EF1
Ciphertext: C59436538731DFF170276D0C2B4CB36820D738B8560AAC289DBB3FA55309DAB2783A51395F1CCCB7BDA561DEE95A0389B0FE78FAA1D4202B193F3773816EF020C0011163563ECBE2A8B020BA4603DD60A6C43C5A9EAB7A540AD1DAC2C1C3646C899936D33984E7A8E8C979ED67C6FE47
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: E27301498AAC03789DD1BB199B714C55
Plaintext: 5A1BD857A97343FF348439DBA858725317C634239D8C1A0F449E15D125BDB057D04A982BEE5D5B332512709A3C23780E80BCC32C668A16387116AB1256517A655F6FB7220DF99C2D011E68561C4BA88AE6FBB54A2CCF7E5DEEE187C2785632E9CE323E234D708D5690532AF591F78A2F102B12673983DAE581A8B1CBD1F3614A
Ciphertext: 131F71B1FF2593741530236C37ECC1771C9F5B51DC1F975105C9EB9D50349EBA432DEB097D5E6239423F774CC62FCFFA364D7F82037BB0B5EB3E985705482B89948C1C1EBFC7634B80EEBA8BDE49C33931CCBEF5BD64AB808C0579D66620771A72971820D52862CEC61C2A05493EA89B8A0A3429041DCE4583E78CCD14AEEA5A
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: E63A3415F8EAB6169956BD61E14FA766
Plaintext: C8F5E36AD3CCB338F3132F13AA518EF06F30A1E2548EA0D6E6D22980547C8695D4012F3B43D58FBE0BC90B844A97414331BB8D71AA85D2FC3D6D773C34A6AF26FDF6FEC2D1C4F9DF93734D05FBEE02ABF38401AA41F7D4F267CFAE7BC7F4AB7F0B7C58E7C4C2760351B8FB7D037E5A907F330475630B2F1E2CA1D627578F010AC63D469266F690920F411FD6AB6ED05A
Ciphertext: F4E15BCF683501B1D3432CD57D246D89CCFCE6714295A16170067981F4BBEBDA8C6B144FA12E3A58FF7113B8C9453379F104F394DBC416BB35ACB036479A260958B20A97A17BC353CFC92E62139114DCE81DD50FB89A178C2F020D3A6AFDC2037AEA91CE323802E1A1EC5C70EF177EB6AB5921EE94151F37A48976992E09B9FD7544F34642B05B7E580F1A9AC6A3D9C1
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 128-bit key
Key: 9B6F9FBA56E96AEA538BF8272A9F392D
Plaintext: F6DECFABFD89CEF493B5C0F73BE7ED7110E0D96163BA0DBDA6341A63884BDC52620AFC1AD2A2B891A5BDE7C8FB10373DA52FBA52D2A6A1FEEB4547C3BBBB71E0D367D4C72D6AD7D10F019B313212382724044A76EBD4AD17EB65842F0A18803F119D5F9A5509B21D9828E41A2A147895530692B3F66DB96F6E3DDB8FBC8A91D6E455A57C94A6D2DB07DBCA6B293F7EF0FCDE99F23A984D6E3C7553CB1A382D0F
Ciphertext: 98D85D7D0D136A80CE74864469D77A03EF56EC9B24A7119DE09508A04D6F437E670B54B36E2CBDE51CDBD01E2CEA53332C2A14879FF77E02000A00F159FB1865E7DBED543357917D783F18B06FD8EFA6686D2E362BCEDE94BB7687ECFD7501B79F912740840683722466440D240EF0355604BFCFBC30F16F03D00543582A52718526079355164E6B8CEC36E346B9092D9706C48946C497629C9C9055D9D89777}
Test: Encrypt
#
#
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: 1437AF533069BD7525C1560C78BAD2A1E534671C007EF27C
Plaintext: 1CB4F4CB6C4BDB5168EA8409727BFD51
Ciphertext: 69725C6DF912F8B70EB511E6663C5870
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: BA838FE55FAEFC0ED7AF051790462F01D7A2C778FAEA2405
Plaintext: A9172C84A2041AD98EC87EDF254384A199F77ACD32198D6535E8D3B80B3E8F91
Ciphertext: C6C5F98E4C633E7463518815BF9087C0289DEB0A1B16A9AF31FEE64455A1D025
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: 9F65B0AE082B9A73683929E014A0F3C1F5B5CE242E1F9310
Plaintext: FE2E2174E86FA45E127D176DEC190789117D9AD172EED1D5B1910A06CB7FC96BFA1BB795DAA4EBD4CA0669AB95F6E882
Ciphertext: B465597F4DD76E342F8FCA5D0D095CA9479F6AB6EC86AC51F9F372448AB3CAB73F051704FBD350B2D2EB2B270B416A4D
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: 523DD99B8854A4479632355A5262B7DCF1589F012705ED5B
Plaintext: 8EA9AE4F4CE9C6C6F121EC249EFBF67E6C4157080BEFE6CCAA8DE1A217BB315C280EEF41591A28BDB6D0DD56FC0B4EE2FB6579F73E4FDDA4EE61835EF4EE3F3D
Ciphertext: 104D15C2618A9DA9AF8C563A4CB1E14ED869C864CC1EB190731042183F46C9A4FB09472B8485345F94AF5A55257DC1D7A4FA3A8CD46161C74387360061770C5E
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: 5EDC346904B296CF6BF3B418E9AB35DB0A47A11133A924CA
Plaintext: 857C8F1F04C5A068F9BB83AF95D99864D6317751AF0332D1638EDA3D322644A837870CCC9169DB43C155E6FB53B6B7E4C13330EB943CCD2CCCE3296382EEC4A4CC2A034DE10278387D4F643587727AB7
Ciphertext: 72223A93942F7359FE5E516A05C8E841C59BB74714809B13A9757B8293F9B0B420D1C5A4F440F365D08F9425E347B5DD23A9ED05F2CE1618CCB09E712C59B97B7674517FC875AE9F6F188BFA5A42BAC9
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: F2A1E6CDE17E8E540EEE986C6C282C280B0C7B8A3CB700AE
Plaintext: F754054579346A453122A2DFDDF0FEB2F1562E3E38FD059BBDD67C6AECB0FA0DF50AD21371250DF6485E6B09D2BBA4AC3CC4F3C22E94D565AA2F0FD83816EEBC4019D287B76DEE33FDFE4933060608ABB9DFF0E0951627EE9AC03AB967116425
Ciphertext: 3ED82167994A687B8B4F5FF8DBCB0F15CD3FFB743C126522577491B04FD9308EDC92ED3CD4F103A3ECC8503DD2128DCE772AEB821A518A023EAA9853D01E473EE45F979048ACFD7F832DD3A69A7B77996BB16B1D1CEBDB33AD4EBE4D24489D02
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: A02A0E8A923392621AAA4445C2FAB3182E502C81B7AA809D
Plaintext: 553107F6C2C8E5AFDCE58C024C9F83ED650965274EBF2C5964BEAF8BDA796ADCA2297E779164F8C2BEF156D92BDB483AA7C4B3C2F27CFBD823D282E847AA6C134B50A6241C0C26C60CF774F5780C69B3A78236FCF65AA9FB3234AC7E46660FA8164F87E5AAE9F6238F9EEC407A5D6EBE
Ciphertext: 5277CF7E992F5BDC4EAEBA7DC00BFE36DB3292A73DA86B230ADC91E94C021679A68C6B65FCDC370C0CF443EE945F4748FCEFB8DD1241EF6A2D2036967E9EBCAAFE636DFEBF0BB23792A0F22C9873B54726C7157666B4A331C79C709D29B2D598B86D1CED7725175E882F92AF04DDBCC8
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: 2FECF7BEA180BD2C5B8B35371ED5D904CCCE29A38423F042
Plaintext: 0F8FC8A07BF4E0C505AAFDF13D16BFD2647F26F9191E548F35749544F3E19C89547110FFC1F9472FF263517B1046385416BA86AE7D6A08B118EAD2B23D4B836125EDCA4495952964BEBFF9466336AF1C39E15D3D93E07CD33ED8E8D3AA8A2C334BAB00573FEF10CC3168FF387D0EAC91959FB48EA3A9385B70E4E09184C61F65
Ciphertext: 1EAB3C4E6B81F928D93389D808EAAB91A8B90862E63E2018E9CB50082DD172A094B6ABE3031D6DD282AD79B1AC45A9C7B9368C719EB75665D53342737C924221DB2C709723BFA91CF2070A3FE2A19262608937A23D84EF2E8089C6BD8254BF71C9263E8221609EDE733E33857C37E6A79079654715340D48FF335C133FFB03EA
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: 8F52B920073183CF13036A3BA8F7B71BF1999289F5ECC4B3
Plaintext: 74B9C1D31126E561B78AFE8635800BD52B3B43362A195922177AFF16D0D2A94112FD93809BD3058D8BFDD67410072F4642B591104C9B190ECDE8031D7E836E6F14595E8268F50753D55149CFE1EB778A201C5CB356A58048DC8BA78645269BA440742BC0C0B3741A5B2E5F80F0576B098D16AD06906115360C0DF2396EE3B84760F70122ED35D349E63D216F8571942B
Ciphertext: A466C6A0E7D3E3A3756B591C8F5302E235B0EE64F5188B4DCB51A9204B54094D4A1CC3FC34E22401C618AB8ADB28D41531762A576EBCADC956BF19E5B29701B2A77030EE100B65BCF8397853EB2074402089FF697046D538C560D10172EA8DE81299011E3FF0A0FBD87499FF50A0B3E7E59FA06753FC1BC4171046380323875C24350A9E98DDF69F6D7E37E363DDE1BA
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 192-bit key
Key: 514B8BF141F560412413ED1E40E34EC23A89E99036A4AC4A
Plaintext: 3E259684E86179593365FE5CB389E9D1EE489E1E054EE47C97D3EAF2E22888842B8FC6A86050A2F9FD090E2F2C46394F30510F1F034C03DD3E7C0C303AE8ED5F7523BAC13766987575E1C452F553D721B3D9480A8403324DF92D5733860D6643E38879B8B3CAE233649527AE56D94BB13F864FC8CE9EF9348E8ED4E10EBE78983F670B761DA5089D91CD3F2996001E669C002E402943E0FAC6468A231924ADC6
Ciphertext: 6239867F34D57B91729410F93797C69E45526F13405EC222EDFAE682B6C2D75B332430D30BC2479735ECCD3BD985657EC965EB93394BD88CDCE7A76BE81255AB3418D57082770129C3482A2B1E51F14E2C69A24E6405944487B08554D75A35043D713BAD5643F6C4FC1C5CF22B3C72479DD060AB92B4DA51B76DCA855769143608A92AE8DED684A8A6D093765F4149CF1A3753B849368E99D066D2F711C27F75}}
Test: Encrypt
#
#
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: 4F6779E2BD1E9319C63015ACFFEFD7A791F0ED59DF1B700769FE82E2F0668C35
Plaintext: DC31CAE3DA5E0A11C966B020D7CFFEDE
Ciphertext: EDA2042098F667E857A02DB8CAA7DFF2
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: E7FE92FD374D30C43F5DC204DCAE9D4EAD6C0663BD8CF5EC6318196B67C71B72
Plaintext: 66D127137801A9970F0C5472232169778CC13649AFD1DD125CEE5677F700B7CB
Ciphertext: 16BFF149DFA234BF7FBE2C59AE88A1E99A1BF8D91910A7F67D088432E1C6D790
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: D612B382EB6161E9A3B23F150DE977193FD8617DF65548EB7C8F712ACFA25951
Plaintext: FF683F34D892E223C1F88CD4E42E4F9D8F588FE6DA3FC1DF8BA4716E36D48A6CA97CD21087BFB4AB32864296EE177A69
Ciphertext: 7BC5E4E4D9C4B5C4694F5580896671B5F58324B62005C8F8A52A65AA8E1A9B01DC90BAC0817013AD6C9DD0F216403D6B
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: 44EAC86EA5B7CD5650D45F2A76BED1849BF674FE3F0E5DEBBE03694575CD7FE7
Plaintext: 263515FC9DE7F6B894C84246D589B6019E7D2DE649A767492C180AC8BF78E67EFCE27D790CF5C36D1F2722A99C5DC14B7AB906B0EDB35A2F466C2C07143E3895
Ciphertext: AB395086E9238A16012DB04844028340C21C557AAD92C0ACA2D261EF3A0F89F9F060462F79879B10C6A9A1C168DCBFE8731E5176604EEB14CA1442D15173C5CF
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: 909809CB3809BCDDB99A083D12617BCAF7530645735ABC04D2A8D7EABE4AFC96
Plaintext: A800C0DB6A4C6A702AC9FAE981BE6BE6DCF3368B23C317309973135904C2BAE80DC1AA91E9E5548F395B03952F9B1A08F3409C6B4517F21B6376E93C2DCFFBF38784CFD5FFFD03A0B0F9282965210E96
Ciphertext: 2A50FA90ED00EBFA1188CC9113DD4337B380D5F8C1582C8077EC6728EC318AB45DE5EFD1D0A62E4E870352832BEC223D8D5DCD397209C824E4A957F65D785BA5D7F9A4CC5D0B353528DBCCA63548668A
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: 02E342CD207DD62DF858607B8298451FDEF13890F2BCFD0D554A738E6B78D1FA
Plaintext: D283309AFD1E4ACE1FC281FE4B4623D4D9AFECA80B49CC3CF1F7EBAA89C7EB9A2BC96DB82422D666A25C53ADD0001A7A4167F30792CDF7974BA798660736E2E0D55D0111DDB0025D47CDDE7158EFB479DEC05693CF6F07842D0383AB2CEF4033
Ciphertext: 247F64E04D91ECA484BE9D60F678EFE6975CAE82D72EAD270F6DD2EA6D63361EB88F6FA6F58FAEBC1A16ABE6E5D92939B669E0C55EB667E9AE0052D747C0B1D5A5F71AD659C297B0D0A45EA2A5088852198FC88DBBAB1A9AB83C67F737769B60
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: 97E6F48C70F0571BD7BE2A302C3A783978631C360958836D5DB2B35F42178CFA
Plaintext: 3A0D4E10240B5C0819D640D4950BEE23D7F74DD78AAFF3B9A45D306B8FD94F9F8779188743299A8CD7BE2743D9879F9DC225F25E989DE0D0CAAC03B85C5B108943D25AD813719710D71DE76740D81210039511B27C4AD11A9746332DF0C5572039C21AEBDD0CDDFAE29C89261426CFE5
Ciphertext: BEABF62347C9DDC68D33015757F5309CC11E9CADBAE3E0BCCD25CF01FC31F68987C5055A41347C4E0D054603D3FF329CC9065923D01A11E7D95DFD5208FEF65122102F9D50B4459839F3720CE24310FDB2124C4E7CEB6D7548C6841852B7A64019D2CAC995F6B84A00BED386FCDCD96A
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: 60EEB5BD7EDD4EFFD3D4C8B19540ADCC30EF62A8E822F4B4C0E3136A9B985F82
Plaintext: A2D9E366E57FDFE745FDCB2E91F498F5EF0139F77EDA62A43999901A1F57495191FDA595FB570D3AB66A438B2D08A2033FA1A8C0E55CB1341566051EE68A15B8F4030232068E5F60EEC338B0B1A4535EE877B5EB66D168CB1BF47C5E385A4C21949203264F4B5EC1B5AFB38565F2326EB22A6B60496110D014E8FCC15FEF75F3
Ciphertext: B97E56C7BED6B27CAD1F79EEFB1B4C04559B8632BC5767734E66C402B406B6682C4DC198F0D640982789B87DBC6EDA1914A9E21AAFFDFC360CA77EA34CE73DCB1E42A61E5A3D01A9D5CB1A8D8CAEC8ADAA2317287E48F450C933EF3BF938A060929307E082D06E6061D3EEFEBBA69FCC43FEC4BA75E77F1F6331B993BB5E58D6
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: 3A53AE571EB790C5D3D6BAF19017C79C6563CF07D63330ADC9ED8E31A2701896
Plaintext: ACED0DAEBBFA7FD50FE158DF7C3E9A4EC8C9EBC8557050C9FFA939964806BE72B30928136D3BB357327892346F8D34EDA405C68C0D3FF98C81C405D69AD8EEEF164F056F7DA2B3B5044272D9B22C1CE2C1BE683947C9B15E16E7FADAE00F30759F66AEA8335807554DE8FFB68D44DA94E79DDAB94B3503A785BA218A62D20C6C14F72BA8D78537A1D51141B347FDF76A
Ciphertext: D0F21340B914957E0E5C180376F4A2B3EB50EA171514246209FF259A32EDDF71EF819AEEED2936B1E8FB5B90FB399468A498B501DEDA9280770D903CD81898ECFFD15C3F27AC0FC2C8586B7E0059E5E4FAFF0E2FEE1DA1CCB145CDFDF3CA9E12BFC5F642DFCF73F0D7146969F8C4E050F83C9FBD71CDD39EF74540BBE9FDF94EB2BA543E556202EDE13C7108A9FD50B1
Test: Encrypt
#
Source: LEA reference test vectors, file lea_vs.c
Comment: LEA-128/ECB, 256-bit key
Key: DE4923F261AC74CF97E481CE674A0B3C3EA98255B150CBFF646641B92A7EFACE
Plaintext: 6D6B4BCED1568E3E140E228F399EB44DE525BD9909E24CD9C18F06AE7CF06B275EAB5B34E25AD85DC4DF0DB31EF78F07D113E45B26634296B533987C867AD3DC77B05A0BDDE1DA926E0049245F7D25D3C919FD8351FA339E08FA00099045B8578123503D0A121D46DC18DEC84357FD1796E212F8D2CFA959828E453FE279A5FF43AB45B1B11628E2D4D0D58914AEA03C00142AA4F10B2B2FEA946F04C33D1F3C
Ciphertext: B73A0064A429EBE6A7CF35D7ADB94F24A2A0FF7A1D835522453A67EB8FB4FED63DA51D9634FF4C70A764DF3F6F3763E0D3845630774219A819C26EADFD3B93199935A95BD4A951D4467723E12FBA1CA4E8B135FA1FB9ED9FAA7FDC79D2857F78AC8D8C39C11D33D0AE58B6E5E0EF78195C0C8214AB7D3A82B91F9A7BBE89D6A0796E9DEBC69AEE8811011B9D48EECD8DB7BF71566EA6D8A0858E596432E1803D}}
Test: Encrypt

View File

@ -615,6 +615,10 @@ void Benchmark2(double t, double hertz)
BenchMarkByName<SymmetricCipher>("Kalyna-256/CTR", 64, "Kalyna-256(512)/CTR (512-bit key)"); BenchMarkByName<SymmetricCipher>("Kalyna-256/CTR", 64, "Kalyna-256(512)/CTR (512-bit key)");
BenchMarkByName<SymmetricCipher>("Kalyna-512/CTR", 64, "Kalyna-512(512)/CTR (512-bit key)"); BenchMarkByName<SymmetricCipher>("Kalyna-512/CTR", 64, "Kalyna-512(512)/CTR (512-bit key)");
BenchMarkByName<SymmetricCipher>("LEA-128/CTR", 16, "LEA-128(128)/CTR (128-bit key)");
BenchMarkByName<SymmetricCipher>("LEA-128/CTR", 24, "LEA-128(192)/CTR (192-bit key)");
BenchMarkByName<SymmetricCipher>("LEA-128/CTR", 32, "LEA-128(256)/CTR (256-bit key)");
BenchMarkByName<SymmetricCipher>("SIMON-64/CTR", 12, "SIMON-64(96)/CTR (96-bit key)"); BenchMarkByName<SymmetricCipher>("SIMON-64/CTR", 12, "SIMON-64(96)/CTR (96-bit key)");
BenchMarkByName<SymmetricCipher>("SIMON-64/CTR", 16, "SIMON-64(128)/CTR (128-bit key)"); BenchMarkByName<SymmetricCipher>("SIMON-64/CTR", 16, "SIMON-64(128)/CTR (128-bit key)");
BenchMarkByName<SymmetricCipher>("SIMON-128/CTR", 16, "SIMON-128(128)/CTR (128-bit key)"); BenchMarkByName<SymmetricCipher>("SIMON-128/CTR", 16, "SIMON-128(128)/CTR (128-bit key)");

View File

@ -242,6 +242,7 @@
<None Include="TestVectors\gcm.txt" /> <None Include="TestVectors\gcm.txt" />
<None Include="TestVectors\hkdf.txt" /> <None Include="TestVectors\hkdf.txt" />
<None Include="TestVectors\hmac.txt" /> <None Include="TestVectors\hmac.txt" />
<None Include="TestVectors\lea.txt" />
<None Include="TestVectors\kalyna.txt" /> <None Include="TestVectors\kalyna.txt" />
<None Include="TestVectors\mars.txt" /> <None Include="TestVectors\mars.txt" />
<None Include="TestVectors\nr.txt" /> <None Include="TestVectors\nr.txt" />

View File

@ -83,6 +83,9 @@
<None Include="TestVectors\kalyna.txt"> <None Include="TestVectors\kalyna.txt">
<Filter>TestVectors</Filter> <Filter>TestVectors</Filter>
</None> </None>
<None Include="TestVectors\lea.txt">
<Filter>TestVectors</Filter>
</None>
<None Include="TestVectors\mars.txt"> <None Include="TestVectors\mars.txt">
<Filter>TestVectors</Filter> <Filter>TestVectors</Filter>
</None> </None>

View File

@ -239,6 +239,7 @@
<ClCompile Include="kalyna.cpp" /> <ClCompile Include="kalyna.cpp" />
<ClCompile Include="kalynatab.cpp" /> <ClCompile Include="kalynatab.cpp" />
<ClCompile Include="keccak.cpp" /> <ClCompile Include="keccak.cpp" />
<ClCompile Include="lea.cpp" />
<ClCompile Include="luc.cpp" /> <ClCompile Include="luc.cpp" />
<ClCompile Include="mars.cpp" /> <ClCompile Include="mars.cpp" />
<ClCompile Include="marss.cpp" /> <ClCompile Include="marss.cpp" />
@ -428,6 +429,7 @@
<ClInclude Include="kalyna.h" /> <ClInclude Include="kalyna.h" />
<ClInclude Include="keccak.h" /> <ClInclude Include="keccak.h" />
<ClInclude Include="lubyrack.h" /> <ClInclude Include="lubyrack.h" />
<ClInclude Include="lea.h" />
<ClInclude Include="luc.h" /> <ClInclude Include="luc.h" />
<ClInclude Include="mars.h" /> <ClInclude Include="mars.h" />
<ClInclude Include="md2.h" /> <ClInclude Include="md2.h" />

View File

@ -215,6 +215,9 @@
<ClCompile Include="keccak.cpp"> <ClCompile Include="keccak.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="lea.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="luc.cpp"> <ClCompile Include="luc.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -678,6 +681,9 @@
<ClInclude Include="lubyrack.h"> <ClInclude Include="lubyrack.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="lea.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="luc.h"> <ClInclude Include="luc.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>

829
lea.cpp Normal file
View File

@ -0,0 +1,829 @@
// lea.cpp - written and placed in the public domain by Kim Sung Hee and Jeffrey Walton
// Based on "LEA: A 128-Bit Block Cipher for Fast Encryption on Common
// Processors" by Deukjo Hong, Jung-Keun Lee, Dong-Chan Kim, Daesung Kwon,
// Kwon Ho Ryu, and Dong-Geon Lee.
//
// This implementation is based on source files found in a zip file at the
// Korea Internet and Security Association (https://www.kisa.or.kr/eng/main.jsp).
// The zip files was downloaded from the Korean language area of the site so we
// don't have a url or english zip filename to cite. The source filename from
// the zip is lea_core.c.
//
// The LEA team appears to have applied optimizations to functions in lea_core.c.
// The implementation does not exactly follow the aglorithmic description from
// the LEA paper.
#include "pch.h"
#include "config.h"
#include "lea.h"
#include "misc.h"
ANONYMOUS_NAMESPACE_BEGIN
using CryptoPP::word32;
using CryptoPP::rotlConstant;
ANONYMOUS_NAMESPACE_END
const word32 delta[8][36] = {
{0xc3efe9db, 0x87dfd3b7, 0x0fbfa76f, 0x1f7f4ede, 0x3efe9dbc, 0x7dfd3b78, 0xfbfa76f0, 0xf7f4ede1,
0xefe9dbc3, 0xdfd3b787, 0xbfa76f0f, 0x7f4ede1f, 0xfe9dbc3e, 0xfd3b787d, 0xfa76f0fb, 0xf4ede1f7,
0xe9dbc3ef, 0xd3b787df, 0xa76f0fbf, 0x4ede1f7f, 0x9dbc3efe, 0x3b787dfd, 0x76f0fbfa, 0xede1f7f4,
0xdbc3efe9, 0xb787dfd3, 0x6f0fbfa7, 0xde1f7f4e, 0xbc3efe9d, 0x787dfd3b, 0xf0fbfa76, 0xe1f7f4eD,
0xc3efe9db, 0x87dfd3b7, 0x0fbfa76f, 0x1f7f4ede},
{0x44626b02, 0x88c4d604, 0x1189ac09, 0x23135812, 0x4626b024, 0x8c4d6048, 0x189ac091, 0x31358122,
0x626b0244, 0xc4d60488, 0x89ac0911, 0x13581223, 0x26b02446, 0x4d60488c, 0x9ac09118, 0x35812231,
0x6b024462, 0xd60488c4, 0xac091189, 0x58122313, 0xb0244626, 0x60488c4d, 0xc091189a, 0x81223135,
0x0244626b, 0x0488c4d6, 0x091189ac, 0x12231358, 0x244626b0, 0x488c4d60, 0x91189ac0, 0x22313581,
0x44626b02, 0x88c4d604, 0x1189ac09, 0x23135812},
{0x79e27c8a, 0xf3c4f914, 0xe789f229, 0xcf13e453, 0x9e27c8a7, 0x3c4f914f, 0x789f229e, 0xf13e453c,
0xe27c8a79, 0xc4f914f3, 0x89f229e7, 0x13e453cf, 0x27c8a79e, 0x4f914f3c, 0x9f229e78, 0x3e453cf1,
0x7c8a79e2, 0xf914f3c4, 0xf229e789, 0xe453cf13, 0xc8a79e27, 0x914f3c4f, 0x229e789f, 0x453cf13e,
0x8a79e27c, 0x14f3c4f9, 0x29e789f2, 0x53cf13e4, 0xa79e27c8, 0x4f3c4f91, 0x9e789f22, 0x3cf13e45,
0x79e27c8a, 0xf3c4f914, 0xe789f229, 0xcf13e453},
{0x78df30ec, 0xf1be61d8, 0xe37cc3b1, 0xc6f98763, 0x8df30ec7, 0x1be61d8f, 0x37cc3b1e, 0x6f98763c,
0xdf30ec78, 0xbe61d8f1, 0x7cc3b1e3, 0xf98763c6, 0xf30ec78d, 0xe61d8f1b, 0xcc3b1e37, 0x98763c6f,
0x30ec78df, 0x61d8f1be, 0xc3b1e37c, 0x8763c6f9, 0x0ec78df3, 0x1d8f1be6, 0x3b1e37cc, 0x763c6f98,
0xec78df30, 0xd8f1be61, 0xb1e37cc3, 0x63c6f987, 0xc78df30e, 0x8f1be61d, 0x1e37cc3b, 0x3c6f9876,
0x78df30ec, 0xf1be61d8, 0xe37cc3b1, 0xc6f98763},
{0x715ea49e, 0xe2bd493c, 0xc57a9279, 0x8af524f3, 0x15ea49e7, 0x2bd493ce, 0x57a9279c, 0xaf524f38,
0x5ea49e71, 0xbd493ce2, 0x7a9279c5, 0xf524f38a, 0xea49e715, 0xd493ce2b, 0xa9279c57, 0x524f38af,
0xa49e715e, 0x493ce2bd, 0x9279c57a, 0x24f38af5, 0x49e715ea, 0x93ce2bd4, 0x279c57a9, 0x4f38af52,
0x9e715ea4, 0x3ce2bd49, 0x79c57a92, 0xf38af524, 0xe715ea49, 0xce2bd493, 0x9c57a927, 0x38af524f,
0x715ea49e, 0xe2bd493c, 0xc57a9279, 0x8af524f3},
{0xc785da0a, 0x8f0bb415, 0x1e17682b, 0x3c2ed056, 0x785da0ac, 0xf0bb4158, 0xe17682b1, 0xc2ed0563,
0x85da0ac7, 0x0bb4158f, 0x17682b1e, 0x2ed0563c, 0x5da0ac78, 0xbb4158f0, 0x7682b1e1, 0xed0563c2,
0xda0ac785, 0xb4158f0b, 0x682b1e17, 0xd0563c2e, 0xa0ac785d, 0x4158f0bb, 0x82b1e176, 0x0563c2ed,
0x0ac785da, 0x158f0bb4, 0x2b1e1768, 0x563c2ed0, 0xac785da0, 0x58f0bb41, 0xb1e17682, 0x63c2ed05,
0xc785da0a, 0x8f0bb415, 0x1e17682b, 0x3c2ed056},
{0xe04ef22a, 0xc09de455, 0x813bc8ab, 0x02779157, 0x04ef22ae, 0x09de455c, 0x13bc8ab8, 0x27791570,
0x4ef22ae0, 0x9de455c0, 0x3bc8ab81, 0x77915702, 0xef22ae04, 0xde455c09, 0xbc8ab813, 0x79157027,
0xf22ae04e, 0xe455c09d, 0xc8ab813b, 0x91570277, 0x22ae04ef, 0x455c09de, 0x8ab813bc, 0x15702779,
0x2ae04ef2, 0x55c09de4, 0xab813bc8, 0x57027791, 0xae04ef22, 0x5c09de45, 0xb813bc8a, 0x70277915,
0xe04ef22a, 0xc09de455, 0x813bc8ab, 0x02779157},
{0xe5c40957, 0xcb8812af, 0x9710255f, 0x2e204abf, 0x5c40957e, 0xb8812afc, 0x710255f9, 0xe204abf2,
0xc40957e5, 0x8812afcb, 0x10255f97, 0x204abf2e, 0x40957e5c, 0x812afcb8, 0x0255f971, 0x04abf2e2,
0x0957e5c4, 0x12afcb88, 0x255f9710, 0x4abf2e20, 0x957e5c40, 0x2afcb881, 0x55f97102, 0xabf2e204,
0x57e5c409, 0xafcb8812, 0x5f971025, 0xbf2e204a, 0x7e5c4095, 0xfcb8812a, 0xf9710255, 0xf2e204ab,
0xe5c40957, 0xcb8812af, 0x9710255f, 0x2e204abf}
};
inline void SetKey128(word32 rkey[144], const word32 key[4])
{
rkey[ 0] = rotlConstant<1>( key[ 0] + delta[0][ 0]);
rkey[ 6] = rotlConstant<1>(rkey[ 0] + delta[1][ 1]);
rkey[ 12] = rotlConstant<1>(rkey[ 6] + delta[2][ 2]);
rkey[ 18] = rotlConstant<1>(rkey[ 12] + delta[3][ 3]);
rkey[ 24] = rotlConstant<1>(rkey[ 18] + delta[0][ 4]);
rkey[ 30] = rotlConstant<1>(rkey[ 24] + delta[1][ 5]);
rkey[ 36] = rotlConstant<1>(rkey[ 30] + delta[2][ 6]);
rkey[ 42] = rotlConstant<1>(rkey[ 36] + delta[3][ 7]);
rkey[ 48] = rotlConstant<1>(rkey[ 42] + delta[0][ 8]);
rkey[ 54] = rotlConstant<1>(rkey[ 48] + delta[1][ 9]);
rkey[ 60] = rotlConstant<1>(rkey[ 54] + delta[2][10]);
rkey[ 66] = rotlConstant<1>(rkey[ 60] + delta[3][11]);
rkey[ 72] = rotlConstant<1>(rkey[ 66] + delta[0][12]);
rkey[ 78] = rotlConstant<1>(rkey[ 72] + delta[1][13]);
rkey[ 84] = rotlConstant<1>(rkey[ 78] + delta[2][14]);
rkey[ 90] = rotlConstant<1>(rkey[ 84] + delta[3][15]);
rkey[ 96] = rotlConstant<1>(rkey[ 90] + delta[0][16]);
rkey[102] = rotlConstant<1>(rkey[ 96] + delta[1][17]);
rkey[108] = rotlConstant<1>(rkey[102] + delta[2][18]);
rkey[114] = rotlConstant<1>(rkey[108] + delta[3][19]);
rkey[120] = rotlConstant<1>(rkey[114] + delta[0][20]);
rkey[126] = rotlConstant<1>(rkey[120] + delta[1][21]);
rkey[132] = rotlConstant<1>(rkey[126] + delta[2][22]);
rkey[138] = rotlConstant<1>(rkey[132] + delta[3][23]);
rkey[ 1] = rkey[ 3] = rkey[ 5] = rotlConstant<3>( key[ 1] + delta[0][ 1]);
rkey[ 7] = rkey[ 9] = rkey[ 11] = rotlConstant<3>(rkey[ 1] + delta[1][ 2]);
rkey[ 13] = rkey[ 15] = rkey[ 17] = rotlConstant<3>(rkey[ 7] + delta[2][ 3]);
rkey[ 19] = rkey[ 21] = rkey[ 23] = rotlConstant<3>(rkey[ 13] + delta[3][ 4]);
rkey[ 25] = rkey[ 27] = rkey[ 29] = rotlConstant<3>(rkey[ 19] + delta[0][ 5]);
rkey[ 31] = rkey[ 33] = rkey[ 35] = rotlConstant<3>(rkey[ 25] + delta[1][ 6]);
rkey[ 37] = rkey[ 39] = rkey[ 41] = rotlConstant<3>(rkey[ 31] + delta[2][ 7]);
rkey[ 43] = rkey[ 45] = rkey[ 47] = rotlConstant<3>(rkey[ 37] + delta[3][ 8]);
rkey[ 49] = rkey[ 51] = rkey[ 53] = rotlConstant<3>(rkey[ 43] + delta[0][ 9]);
rkey[ 55] = rkey[ 57] = rkey[ 59] = rotlConstant<3>(rkey[ 49] + delta[1][10]);
rkey[ 61] = rkey[ 63] = rkey[ 65] = rotlConstant<3>(rkey[ 55] + delta[2][11]);
rkey[ 67] = rkey[ 69] = rkey[ 71] = rotlConstant<3>(rkey[ 61] + delta[3][12]);
rkey[ 73] = rkey[ 75] = rkey[ 77] = rotlConstant<3>(rkey[ 67] + delta[0][13]);
rkey[ 79] = rkey[ 81] = rkey[ 83] = rotlConstant<3>(rkey[ 73] + delta[1][14]);
rkey[ 85] = rkey[ 87] = rkey[ 89] = rotlConstant<3>(rkey[ 79] + delta[2][15]);
rkey[ 91] = rkey[ 93] = rkey[ 95] = rotlConstant<3>(rkey[ 85] + delta[3][16]);
rkey[ 97] = rkey[ 99] = rkey[101] = rotlConstant<3>(rkey[ 91] + delta[0][17]);
rkey[103] = rkey[105] = rkey[107] = rotlConstant<3>(rkey[ 97] + delta[1][18]);
rkey[109] = rkey[111] = rkey[113] = rotlConstant<3>(rkey[103] + delta[2][19]);
rkey[115] = rkey[117] = rkey[119] = rotlConstant<3>(rkey[109] + delta[3][20]);
rkey[121] = rkey[123] = rkey[125] = rotlConstant<3>(rkey[115] + delta[0][21]);
rkey[127] = rkey[129] = rkey[131] = rotlConstant<3>(rkey[121] + delta[1][22]);
rkey[133] = rkey[135] = rkey[137] = rotlConstant<3>(rkey[127] + delta[2][23]);
rkey[139] = rkey[141] = rkey[143] = rotlConstant<3>(rkey[133] + delta[3][24]);
rkey[ 2] = rotlConstant<6>( key[ 2] + delta[0][ 2]);
rkey[ 8] = rotlConstant<6>(rkey[ 2] + delta[1][ 3]);
rkey[ 14] = rotlConstant<6>(rkey[ 8] + delta[2][ 4]);
rkey[ 20] = rotlConstant<6>(rkey[ 14] + delta[3][ 5]);
rkey[ 26] = rotlConstant<6>(rkey[ 20] + delta[0][ 6]);
rkey[ 32] = rotlConstant<6>(rkey[ 26] + delta[1][ 7]);
rkey[ 38] = rotlConstant<6>(rkey[ 32] + delta[2][ 8]);
rkey[ 44] = rotlConstant<6>(rkey[ 38] + delta[3][ 9]);
rkey[ 50] = rotlConstant<6>(rkey[ 44] + delta[0][10]);
rkey[ 56] = rotlConstant<6>(rkey[ 50] + delta[1][11]);
rkey[ 62] = rotlConstant<6>(rkey[ 56] + delta[2][12]);
rkey[ 68] = rotlConstant<6>(rkey[ 62] + delta[3][13]);
rkey[ 74] = rotlConstant<6>(rkey[ 68] + delta[0][14]);
rkey[ 80] = rotlConstant<6>(rkey[ 74] + delta[1][15]);
rkey[ 86] = rotlConstant<6>(rkey[ 80] + delta[2][16]);
rkey[ 92] = rotlConstant<6>(rkey[ 86] + delta[3][17]);
rkey[ 98] = rotlConstant<6>(rkey[ 92] + delta[0][18]);
rkey[104] = rotlConstant<6>(rkey[ 98] + delta[1][19]);
rkey[110] = rotlConstant<6>(rkey[104] + delta[2][20]);
rkey[116] = rotlConstant<6>(rkey[110] + delta[3][21]);
rkey[122] = rotlConstant<6>(rkey[116] + delta[0][22]);
rkey[128] = rotlConstant<6>(rkey[122] + delta[1][23]);
rkey[134] = rotlConstant<6>(rkey[128] + delta[2][24]);
rkey[140] = rotlConstant<6>(rkey[134] + delta[3][25]);
rkey[ 4] = rotlConstant<11>( key[ 3] + delta[0][ 3]);
rkey[ 10] = rotlConstant<11>(rkey[ 4] + delta[1][ 4]);
rkey[ 16] = rotlConstant<11>(rkey[ 10] + delta[2][ 5]);
rkey[ 22] = rotlConstant<11>(rkey[ 16] + delta[3][ 6]);
rkey[ 28] = rotlConstant<11>(rkey[ 22] + delta[0][ 7]);
rkey[ 34] = rotlConstant<11>(rkey[ 28] + delta[1][ 8]);
rkey[ 40] = rotlConstant<11>(rkey[ 34] + delta[2][ 9]);
rkey[ 46] = rotlConstant<11>(rkey[ 40] + delta[3][10]);
rkey[ 52] = rotlConstant<11>(rkey[ 46] + delta[0][11]);
rkey[ 58] = rotlConstant<11>(rkey[ 52] + delta[1][12]);
rkey[ 64] = rotlConstant<11>(rkey[ 58] + delta[2][13]);
rkey[ 70] = rotlConstant<11>(rkey[ 64] + delta[3][14]);
rkey[ 76] = rotlConstant<11>(rkey[ 70] + delta[0][15]);
rkey[ 82] = rotlConstant<11>(rkey[ 76] + delta[1][16]);
rkey[ 88] = rotlConstant<11>(rkey[ 82] + delta[2][17]);
rkey[ 94] = rotlConstant<11>(rkey[ 88] + delta[3][18]);
rkey[100] = rotlConstant<11>(rkey[ 94] + delta[0][19]);
rkey[106] = rotlConstant<11>(rkey[100] + delta[1][20]);
rkey[112] = rotlConstant<11>(rkey[106] + delta[2][21]);
rkey[118] = rotlConstant<11>(rkey[112] + delta[3][22]);
rkey[124] = rotlConstant<11>(rkey[118] + delta[0][23]);
rkey[130] = rotlConstant<11>(rkey[124] + delta[1][24]);
rkey[136] = rotlConstant<11>(rkey[130] + delta[2][25]);
rkey[142] = rotlConstant<11>(rkey[136] + delta[3][26]);
}
inline void SetKey192(word32 rkey[168], const word32 key[6])
{
rkey[ 0] = rotlConstant<1>( key[ 0] + delta[0][ 0]);
rkey[ 6] = rotlConstant<1>(rkey[ 0] + delta[1][ 1]);
rkey[ 12] = rotlConstant<1>(rkey[ 6] + delta[2][ 2]);
rkey[ 18] = rotlConstant<1>(rkey[ 12] + delta[3][ 3]);
rkey[ 24] = rotlConstant<1>(rkey[ 18] + delta[4][ 4]);
rkey[ 30] = rotlConstant<1>(rkey[ 24] + delta[5][ 5]);
rkey[ 36] = rotlConstant<1>(rkey[ 30] + delta[0][ 6]);
rkey[ 42] = rotlConstant<1>(rkey[ 36] + delta[1][ 7]);
rkey[ 48] = rotlConstant<1>(rkey[ 42] + delta[2][ 8]);
rkey[ 54] = rotlConstant<1>(rkey[ 48] + delta[3][ 9]);
rkey[ 60] = rotlConstant<1>(rkey[ 54] + delta[4][10]);
rkey[ 66] = rotlConstant<1>(rkey[ 60] + delta[5][11]);
rkey[ 72] = rotlConstant<1>(rkey[ 66] + delta[0][12]);
rkey[ 78] = rotlConstant<1>(rkey[ 72] + delta[1][13]);
rkey[ 84] = rotlConstant<1>(rkey[ 78] + delta[2][14]);
rkey[ 90] = rotlConstant<1>(rkey[ 84] + delta[3][15]);
rkey[ 96] = rotlConstant<1>(rkey[ 90] + delta[4][16]);
rkey[102] = rotlConstant<1>(rkey[ 96] + delta[5][17]);
rkey[108] = rotlConstant<1>(rkey[102] + delta[0][18]);
rkey[114] = rotlConstant<1>(rkey[108] + delta[1][19]);
rkey[120] = rotlConstant<1>(rkey[114] + delta[2][20]);
rkey[126] = rotlConstant<1>(rkey[120] + delta[3][21]);
rkey[132] = rotlConstant<1>(rkey[126] + delta[4][22]);
rkey[138] = rotlConstant<1>(rkey[132] + delta[5][23]);
rkey[144] = rotlConstant<1>(rkey[138] + delta[0][24]);
rkey[150] = rotlConstant<1>(rkey[144] + delta[1][25]);
rkey[156] = rotlConstant<1>(rkey[150] + delta[2][26]);
rkey[162] = rotlConstant<1>(rkey[156] + delta[3][27]);
rkey[ 1] = rotlConstant<3>( key[ 1] + delta[0][ 1]);
rkey[ 7] = rotlConstant<3>(rkey[ 1] + delta[1][ 2]);
rkey[ 13] = rotlConstant<3>(rkey[ 7] + delta[2][ 3]);
rkey[ 19] = rotlConstant<3>(rkey[ 13] + delta[3][ 4]);
rkey[ 25] = rotlConstant<3>(rkey[ 19] + delta[4][ 5]);
rkey[ 31] = rotlConstant<3>(rkey[ 25] + delta[5][ 6]);
rkey[ 37] = rotlConstant<3>(rkey[ 31] + delta[0][ 7]);
rkey[ 43] = rotlConstant<3>(rkey[ 37] + delta[1][ 8]);
rkey[ 49] = rotlConstant<3>(rkey[ 43] + delta[2][ 9]);
rkey[ 55] = rotlConstant<3>(rkey[ 49] + delta[3][10]);
rkey[ 61] = rotlConstant<3>(rkey[ 55] + delta[4][11]);
rkey[ 67] = rotlConstant<3>(rkey[ 61] + delta[5][12]);
rkey[ 73] = rotlConstant<3>(rkey[ 67] + delta[0][13]);
rkey[ 79] = rotlConstant<3>(rkey[ 73] + delta[1][14]);
rkey[ 85] = rotlConstant<3>(rkey[ 79] + delta[2][15]);
rkey[ 91] = rotlConstant<3>(rkey[ 85] + delta[3][16]);
rkey[ 97] = rotlConstant<3>(rkey[ 91] + delta[4][17]);
rkey[103] = rotlConstant<3>(rkey[ 97] + delta[5][18]);
rkey[109] = rotlConstant<3>(rkey[103] + delta[0][19]);
rkey[115] = rotlConstant<3>(rkey[109] + delta[1][20]);
rkey[121] = rotlConstant<3>(rkey[115] + delta[2][21]);
rkey[127] = rotlConstant<3>(rkey[121] + delta[3][22]);
rkey[133] = rotlConstant<3>(rkey[127] + delta[4][23]);
rkey[139] = rotlConstant<3>(rkey[133] + delta[5][24]);
rkey[145] = rotlConstant<3>(rkey[139] + delta[0][25]);
rkey[151] = rotlConstant<3>(rkey[145] + delta[1][26]);
rkey[157] = rotlConstant<3>(rkey[151] + delta[2][27]);
rkey[163] = rotlConstant<3>(rkey[157] + delta[3][28]);
rkey[ 2] = rotlConstant<6>( key[ 2] + delta[0][ 2]);
rkey[ 8] = rotlConstant<6>(rkey[ 2] + delta[1][ 3]);
rkey[ 14] = rotlConstant<6>(rkey[ 8] + delta[2][ 4]);
rkey[ 20] = rotlConstant<6>(rkey[ 14] + delta[3][ 5]);
rkey[ 26] = rotlConstant<6>(rkey[ 20] + delta[4][ 6]);
rkey[ 32] = rotlConstant<6>(rkey[ 26] + delta[5][ 7]);
rkey[ 38] = rotlConstant<6>(rkey[ 32] + delta[0][ 8]);
rkey[ 44] = rotlConstant<6>(rkey[ 38] + delta[1][ 9]);
rkey[ 50] = rotlConstant<6>(rkey[ 44] + delta[2][10]);
rkey[ 56] = rotlConstant<6>(rkey[ 50] + delta[3][11]);
rkey[ 62] = rotlConstant<6>(rkey[ 56] + delta[4][12]);
rkey[ 68] = rotlConstant<6>(rkey[ 62] + delta[5][13]);
rkey[ 74] = rotlConstant<6>(rkey[ 68] + delta[0][14]);
rkey[ 80] = rotlConstant<6>(rkey[ 74] + delta[1][15]);
rkey[ 86] = rotlConstant<6>(rkey[ 80] + delta[2][16]);
rkey[ 92] = rotlConstant<6>(rkey[ 86] + delta[3][17]);
rkey[ 98] = rotlConstant<6>(rkey[ 92] + delta[4][18]);
rkey[104] = rotlConstant<6>(rkey[ 98] + delta[5][19]);
rkey[110] = rotlConstant<6>(rkey[104] + delta[0][20]);
rkey[116] = rotlConstant<6>(rkey[110] + delta[1][21]);
rkey[122] = rotlConstant<6>(rkey[116] + delta[2][22]);
rkey[128] = rotlConstant<6>(rkey[122] + delta[3][23]);
rkey[134] = rotlConstant<6>(rkey[128] + delta[4][24]);
rkey[140] = rotlConstant<6>(rkey[134] + delta[5][25]);
rkey[146] = rotlConstant<6>(rkey[140] + delta[0][26]);
rkey[152] = rotlConstant<6>(rkey[146] + delta[1][27]);
rkey[158] = rotlConstant<6>(rkey[152] + delta[2][28]);
rkey[164] = rotlConstant<6>(rkey[158] + delta[3][29]);
rkey[ 3] = rotlConstant<11>( key[ 3] + delta[0][ 3]);
rkey[ 9] = rotlConstant<11>(rkey[ 3] + delta[1][ 4]);
rkey[ 15] = rotlConstant<11>(rkey[ 9] + delta[2][ 5]);
rkey[ 21] = rotlConstant<11>(rkey[ 15] + delta[3][ 6]);
rkey[ 27] = rotlConstant<11>(rkey[ 21] + delta[4][ 7]);
rkey[ 33] = rotlConstant<11>(rkey[ 27] + delta[5][ 8]);
rkey[ 39] = rotlConstant<11>(rkey[ 33] + delta[0][ 9]);
rkey[ 45] = rotlConstant<11>(rkey[ 39] + delta[1][10]);
rkey[ 51] = rotlConstant<11>(rkey[ 45] + delta[2][11]);
rkey[ 57] = rotlConstant<11>(rkey[ 51] + delta[3][12]);
rkey[ 63] = rotlConstant<11>(rkey[ 57] + delta[4][13]);
rkey[ 69] = rotlConstant<11>(rkey[ 63] + delta[5][14]);
rkey[ 75] = rotlConstant<11>(rkey[ 69] + delta[0][15]);
rkey[ 81] = rotlConstant<11>(rkey[ 75] + delta[1][16]);
rkey[ 87] = rotlConstant<11>(rkey[ 81] + delta[2][17]);
rkey[ 93] = rotlConstant<11>(rkey[ 87] + delta[3][18]);
rkey[ 99] = rotlConstant<11>(rkey[ 93] + delta[4][19]);
rkey[105] = rotlConstant<11>(rkey[ 99] + delta[5][20]);
rkey[111] = rotlConstant<11>(rkey[105] + delta[0][21]);
rkey[117] = rotlConstant<11>(rkey[111] + delta[1][22]);
rkey[123] = rotlConstant<11>(rkey[117] + delta[2][23]);
rkey[129] = rotlConstant<11>(rkey[123] + delta[3][24]);
rkey[135] = rotlConstant<11>(rkey[129] + delta[4][25]);
rkey[141] = rotlConstant<11>(rkey[135] + delta[5][26]);
rkey[147] = rotlConstant<11>(rkey[141] + delta[0][27]);
rkey[153] = rotlConstant<11>(rkey[147] + delta[1][28]);
rkey[159] = rotlConstant<11>(rkey[153] + delta[2][29]);
rkey[165] = rotlConstant<11>(rkey[159] + delta[3][30]);
rkey[ 4] = rotlConstant<13>( key[ 4] + delta[0][ 4]);
rkey[ 10] = rotlConstant<13>(rkey[ 4] + delta[1][ 5]);
rkey[ 16] = rotlConstant<13>(rkey[ 10] + delta[2][ 6]);
rkey[ 22] = rotlConstant<13>(rkey[ 16] + delta[3][ 7]);
rkey[ 28] = rotlConstant<13>(rkey[ 22] + delta[4][ 8]);
rkey[ 34] = rotlConstant<13>(rkey[ 28] + delta[5][ 9]);
rkey[ 40] = rotlConstant<13>(rkey[ 34] + delta[0][10]);
rkey[ 46] = rotlConstant<13>(rkey[ 40] + delta[1][11]);
rkey[ 52] = rotlConstant<13>(rkey[ 46] + delta[2][12]);
rkey[ 58] = rotlConstant<13>(rkey[ 52] + delta[3][13]);
rkey[ 64] = rotlConstant<13>(rkey[ 58] + delta[4][14]);
rkey[ 70] = rotlConstant<13>(rkey[ 64] + delta[5][15]);
rkey[ 76] = rotlConstant<13>(rkey[ 70] + delta[0][16]);
rkey[ 82] = rotlConstant<13>(rkey[ 76] + delta[1][17]);
rkey[ 88] = rotlConstant<13>(rkey[ 82] + delta[2][18]);
rkey[ 94] = rotlConstant<13>(rkey[ 88] + delta[3][19]);
rkey[100] = rotlConstant<13>(rkey[ 94] + delta[4][20]);
rkey[106] = rotlConstant<13>(rkey[100] + delta[5][21]);
rkey[112] = rotlConstant<13>(rkey[106] + delta[0][22]);
rkey[118] = rotlConstant<13>(rkey[112] + delta[1][23]);
rkey[124] = rotlConstant<13>(rkey[118] + delta[2][24]);
rkey[130] = rotlConstant<13>(rkey[124] + delta[3][25]);
rkey[136] = rotlConstant<13>(rkey[130] + delta[4][26]);
rkey[142] = rotlConstant<13>(rkey[136] + delta[5][27]);
rkey[148] = rotlConstant<13>(rkey[142] + delta[0][28]);
rkey[154] = rotlConstant<13>(rkey[148] + delta[1][29]);
rkey[160] = rotlConstant<13>(rkey[154] + delta[2][30]);
rkey[166] = rotlConstant<13>(rkey[160] + delta[3][31]);
rkey[ 5] = rotlConstant<17>( key[ 5] + delta[0][ 5]);
rkey[ 11] = rotlConstant<17>(rkey[ 5] + delta[1][ 6]);
rkey[ 17] = rotlConstant<17>(rkey[ 11] + delta[2][ 7]);
rkey[ 23] = rotlConstant<17>(rkey[ 17] + delta[3][ 8]);
rkey[ 29] = rotlConstant<17>(rkey[ 23] + delta[4][ 9]);
rkey[ 35] = rotlConstant<17>(rkey[ 29] + delta[5][10]);
rkey[ 41] = rotlConstant<17>(rkey[ 35] + delta[0][11]);
rkey[ 47] = rotlConstant<17>(rkey[ 41] + delta[1][12]);
rkey[ 53] = rotlConstant<17>(rkey[ 47] + delta[2][13]);
rkey[ 59] = rotlConstant<17>(rkey[ 53] + delta[3][14]);
rkey[ 65] = rotlConstant<17>(rkey[ 59] + delta[4][15]);
rkey[ 71] = rotlConstant<17>(rkey[ 65] + delta[5][16]);
rkey[ 77] = rotlConstant<17>(rkey[ 71] + delta[0][17]);
rkey[ 83] = rotlConstant<17>(rkey[ 77] + delta[1][18]);
rkey[ 89] = rotlConstant<17>(rkey[ 83] + delta[2][19]);
rkey[ 95] = rotlConstant<17>(rkey[ 89] + delta[3][20]);
rkey[101] = rotlConstant<17>(rkey[ 95] + delta[4][21]);
rkey[107] = rotlConstant<17>(rkey[101] + delta[5][22]);
rkey[113] = rotlConstant<17>(rkey[107] + delta[0][23]);
rkey[119] = rotlConstant<17>(rkey[113] + delta[1][24]);
rkey[125] = rotlConstant<17>(rkey[119] + delta[2][25]);
rkey[131] = rotlConstant<17>(rkey[125] + delta[3][26]);
rkey[137] = rotlConstant<17>(rkey[131] + delta[4][27]);
rkey[143] = rotlConstant<17>(rkey[137] + delta[5][28]);
rkey[149] = rotlConstant<17>(rkey[143] + delta[0][29]);
rkey[155] = rotlConstant<17>(rkey[149] + delta[1][30]);
rkey[161] = rotlConstant<17>(rkey[155] + delta[2][31]);
rkey[167] = rotlConstant<17>(rkey[161] + delta[3][ 0]);
}
inline void SetKey256(word32 rkey[192], const word32 key[8])
{
rkey[ 0] = rotlConstant< 1>( key[ 0] + delta[0][ 0]);
rkey[ 8] = rotlConstant< 6>(rkey[ 0] + delta[1][ 3]);
rkey[ 16] = rotlConstant<13>(rkey[ 8] + delta[2][ 6]);
rkey[ 24] = rotlConstant< 1>(rkey[ 16] + delta[4][ 4]);
rkey[ 32] = rotlConstant< 6>(rkey[ 24] + delta[5][ 7]);
rkey[ 40] = rotlConstant<13>(rkey[ 32] + delta[6][10]);
rkey[ 48] = rotlConstant< 1>(rkey[ 40] + delta[0][ 8]);
rkey[ 56] = rotlConstant< 6>(rkey[ 48] + delta[1][11]);
rkey[ 64] = rotlConstant<13>(rkey[ 56] + delta[2][14]);
rkey[ 72] = rotlConstant< 1>(rkey[ 64] + delta[4][12]);
rkey[ 80] = rotlConstant< 6>(rkey[ 72] + delta[5][15]);
rkey[ 88] = rotlConstant<13>(rkey[ 80] + delta[6][18]);
rkey[ 96] = rotlConstant< 1>(rkey[ 88] + delta[0][16]);
rkey[104] = rotlConstant< 6>(rkey[ 96] + delta[1][19]);
rkey[112] = rotlConstant<13>(rkey[104] + delta[2][22]);
rkey[120] = rotlConstant< 1>(rkey[112] + delta[4][20]);
rkey[128] = rotlConstant< 6>(rkey[120] + delta[5][23]);
rkey[136] = rotlConstant<13>(rkey[128] + delta[6][26]);
rkey[144] = rotlConstant< 1>(rkey[136] + delta[0][24]);
rkey[152] = rotlConstant< 6>(rkey[144] + delta[1][27]);
rkey[160] = rotlConstant<13>(rkey[152] + delta[2][30]);
rkey[168] = rotlConstant< 1>(rkey[160] + delta[4][28]);
rkey[176] = rotlConstant< 6>(rkey[168] + delta[5][31]);
rkey[184] = rotlConstant<13>(rkey[176] + delta[6][ 2]);
rkey[ 1] = rotlConstant< 3>( key[ 1] + delta[0][ 1]);
rkey[ 9] = rotlConstant<11>(rkey[ 1] + delta[1][ 4]);
rkey[ 17] = rotlConstant<17>(rkey[ 9] + delta[2][ 7]);
rkey[ 25] = rotlConstant< 3>(rkey[ 17] + delta[4][ 5]);
rkey[ 33] = rotlConstant<11>(rkey[ 25] + delta[5][ 8]);
rkey[ 41] = rotlConstant<17>(rkey[ 33] + delta[6][11]);
rkey[ 49] = rotlConstant< 3>(rkey[ 41] + delta[0][ 9]);
rkey[ 57] = rotlConstant<11>(rkey[ 49] + delta[1][12]);
rkey[ 65] = rotlConstant<17>(rkey[ 57] + delta[2][15]);
rkey[ 73] = rotlConstant< 3>(rkey[ 65] + delta[4][13]);
rkey[ 81] = rotlConstant<11>(rkey[ 73] + delta[5][16]);
rkey[ 89] = rotlConstant<17>(rkey[ 81] + delta[6][19]);
rkey[ 97] = rotlConstant< 3>(rkey[ 89] + delta[0][17]);
rkey[105] = rotlConstant<11>(rkey[ 97] + delta[1][20]);
rkey[113] = rotlConstant<17>(rkey[105] + delta[2][23]);
rkey[121] = rotlConstant< 3>(rkey[113] + delta[4][21]);
rkey[129] = rotlConstant<11>(rkey[121] + delta[5][24]);
rkey[137] = rotlConstant<17>(rkey[129] + delta[6][27]);
rkey[145] = rotlConstant< 3>(rkey[137] + delta[0][25]);
rkey[153] = rotlConstant<11>(rkey[145] + delta[1][28]);
rkey[161] = rotlConstant<17>(rkey[153] + delta[2][31]);
rkey[169] = rotlConstant< 3>(rkey[161] + delta[4][29]);
rkey[177] = rotlConstant<11>(rkey[169] + delta[5][ 0]);
rkey[185] = rotlConstant<17>(rkey[177] + delta[6][ 3]);
rkey[ 2] = rotlConstant< 6>( key[ 2] + delta[0][ 2]);
rkey[ 10] = rotlConstant<13>(rkey[ 2] + delta[1][ 5]);
rkey[ 18] = rotlConstant< 1>(rkey[ 10] + delta[3][ 3]);
rkey[ 26] = rotlConstant< 6>(rkey[ 18] + delta[4][ 6]);
rkey[ 34] = rotlConstant<13>(rkey[ 26] + delta[5][ 9]);
rkey[ 42] = rotlConstant< 1>(rkey[ 34] + delta[7][ 7]);
rkey[ 50] = rotlConstant< 6>(rkey[ 42] + delta[0][10]);
rkey[ 58] = rotlConstant<13>(rkey[ 50] + delta[1][13]);
rkey[ 66] = rotlConstant< 1>(rkey[ 58] + delta[3][11]);
rkey[ 74] = rotlConstant< 6>(rkey[ 66] + delta[4][14]);
rkey[ 82] = rotlConstant<13>(rkey[ 74] + delta[5][17]);
rkey[ 90] = rotlConstant< 1>(rkey[ 82] + delta[7][15]);
rkey[ 98] = rotlConstant< 6>(rkey[ 90] + delta[0][18]);
rkey[106] = rotlConstant<13>(rkey[ 98] + delta[1][21]);
rkey[114] = rotlConstant< 1>(rkey[106] + delta[3][19]);
rkey[122] = rotlConstant< 6>(rkey[114] + delta[4][22]);
rkey[130] = rotlConstant<13>(rkey[122] + delta[5][25]);
rkey[138] = rotlConstant< 1>(rkey[130] + delta[7][23]);
rkey[146] = rotlConstant< 6>(rkey[138] + delta[0][26]);
rkey[154] = rotlConstant<13>(rkey[146] + delta[1][29]);
rkey[162] = rotlConstant< 1>(rkey[154] + delta[3][27]);
rkey[170] = rotlConstant< 6>(rkey[162] + delta[4][30]);
rkey[178] = rotlConstant<13>(rkey[170] + delta[5][ 1]);
rkey[186] = rotlConstant< 1>(rkey[178] + delta[7][31]);
rkey[ 3] = rotlConstant<11>( key[ 3] + delta[0][ 3]);
rkey[ 11] = rotlConstant<17>(rkey[ 3] + delta[1][ 6]);
rkey[ 19] = rotlConstant< 3>(rkey[ 11] + delta[3][ 4]);
rkey[ 27] = rotlConstant<11>(rkey[ 19] + delta[4][ 7]);
rkey[ 35] = rotlConstant<17>(rkey[ 27] + delta[5][10]);
rkey[ 43] = rotlConstant< 3>(rkey[ 35] + delta[7][ 8]);
rkey[ 51] = rotlConstant<11>(rkey[ 43] + delta[0][11]);
rkey[ 59] = rotlConstant<17>(rkey[ 51] + delta[1][14]);
rkey[ 67] = rotlConstant< 3>(rkey[ 59] + delta[3][12]);
rkey[ 75] = rotlConstant<11>(rkey[ 67] + delta[4][15]);
rkey[ 83] = rotlConstant<17>(rkey[ 75] + delta[5][18]);
rkey[ 91] = rotlConstant< 3>(rkey[ 83] + delta[7][16]);
rkey[ 99] = rotlConstant<11>(rkey[ 91] + delta[0][19]);
rkey[107] = rotlConstant<17>(rkey[ 99] + delta[1][22]);
rkey[115] = rotlConstant< 3>(rkey[107] + delta[3][20]);
rkey[123] = rotlConstant<11>(rkey[115] + delta[4][23]);
rkey[131] = rotlConstant<17>(rkey[123] + delta[5][26]);
rkey[139] = rotlConstant< 3>(rkey[131] + delta[7][24]);
rkey[147] = rotlConstant<11>(rkey[139] + delta[0][27]);
rkey[155] = rotlConstant<17>(rkey[147] + delta[1][30]);
rkey[163] = rotlConstant< 3>(rkey[155] + delta[3][28]);
rkey[171] = rotlConstant<11>(rkey[163] + delta[4][31]);
rkey[179] = rotlConstant<17>(rkey[171] + delta[5][ 2]);
rkey[187] = rotlConstant< 3>(rkey[179] + delta[7][ 0]);
rkey[ 4] = rotlConstant<13>( key[ 4] + delta[0][ 4]);
rkey[ 12] = rotlConstant< 1>(rkey[ 4] + delta[2][ 2]);
rkey[ 20] = rotlConstant< 6>(rkey[ 12] + delta[3][ 5]);
rkey[ 28] = rotlConstant<13>(rkey[ 20] + delta[4][ 8]);
rkey[ 36] = rotlConstant< 1>(rkey[ 28] + delta[6][ 6]);
rkey[ 44] = rotlConstant< 6>(rkey[ 36] + delta[7][ 9]);
rkey[ 52] = rotlConstant<13>(rkey[ 44] + delta[0][12]);
rkey[ 60] = rotlConstant< 1>(rkey[ 52] + delta[2][10]);
rkey[ 68] = rotlConstant< 6>(rkey[ 60] + delta[3][13]);
rkey[ 76] = rotlConstant<13>(rkey[ 68] + delta[4][16]);
rkey[ 84] = rotlConstant< 1>(rkey[ 76] + delta[6][14]);
rkey[ 92] = rotlConstant< 6>(rkey[ 84] + delta[7][17]);
rkey[100] = rotlConstant<13>(rkey[ 92] + delta[0][20]);
rkey[108] = rotlConstant< 1>(rkey[100] + delta[2][18]);
rkey[116] = rotlConstant< 6>(rkey[108] + delta[3][21]);
rkey[124] = rotlConstant<13>(rkey[116] + delta[4][24]);
rkey[132] = rotlConstant< 1>(rkey[124] + delta[6][22]);
rkey[140] = rotlConstant< 6>(rkey[132] + delta[7][25]);
rkey[148] = rotlConstant<13>(rkey[140] + delta[0][28]);
rkey[156] = rotlConstant< 1>(rkey[148] + delta[2][26]);
rkey[164] = rotlConstant< 6>(rkey[156] + delta[3][29]);
rkey[172] = rotlConstant<13>(rkey[164] + delta[4][ 0]);
rkey[180] = rotlConstant< 1>(rkey[172] + delta[6][30]);
rkey[188] = rotlConstant< 6>(rkey[180] + delta[7][ 1]);
rkey[ 5] = rotlConstant<17>( key[ 5] + delta[0][ 5]);
rkey[ 13] = rotlConstant< 3>(rkey[ 5] + delta[2][ 3]);
rkey[ 21] = rotlConstant<11>(rkey[ 13] + delta[3][ 6]);
rkey[ 29] = rotlConstant<17>(rkey[ 21] + delta[4][ 9]);
rkey[ 37] = rotlConstant< 3>(rkey[ 29] + delta[6][ 7]);
rkey[ 45] = rotlConstant<11>(rkey[ 37] + delta[7][10]);
rkey[ 53] = rotlConstant<17>(rkey[ 45] + delta[0][13]);
rkey[ 61] = rotlConstant< 3>(rkey[ 53] + delta[2][11]);
rkey[ 69] = rotlConstant<11>(rkey[ 61] + delta[3][14]);
rkey[ 77] = rotlConstant<17>(rkey[ 69] + delta[4][17]);
rkey[ 85] = rotlConstant< 3>(rkey[ 77] + delta[6][15]);
rkey[ 93] = rotlConstant<11>(rkey[ 85] + delta[7][18]);
rkey[101] = rotlConstant<17>(rkey[ 93] + delta[0][21]);
rkey[109] = rotlConstant< 3>(rkey[101] + delta[2][19]);
rkey[117] = rotlConstant<11>(rkey[109] + delta[3][22]);
rkey[125] = rotlConstant<17>(rkey[117] + delta[4][25]);
rkey[133] = rotlConstant< 3>(rkey[125] + delta[6][23]);
rkey[141] = rotlConstant<11>(rkey[133] + delta[7][26]);
rkey[149] = rotlConstant<17>(rkey[141] + delta[0][29]);
rkey[157] = rotlConstant< 3>(rkey[149] + delta[2][27]);
rkey[165] = rotlConstant<11>(rkey[157] + delta[3][30]);
rkey[173] = rotlConstant<17>(rkey[165] + delta[4][ 1]);
rkey[181] = rotlConstant< 3>(rkey[173] + delta[6][31]);
rkey[189] = rotlConstant<11>(rkey[181] + delta[7][ 2]);
rkey[ 6] = rotlConstant< 1>( key[ 6] + delta[1][ 1]);
rkey[ 14] = rotlConstant< 6>(rkey[ 6] + delta[2][ 4]);
rkey[ 22] = rotlConstant<13>(rkey[ 14] + delta[3][ 7]);
rkey[ 30] = rotlConstant< 1>(rkey[ 22] + delta[5][ 5]);
rkey[ 38] = rotlConstant< 6>(rkey[ 30] + delta[6][ 8]);
rkey[ 46] = rotlConstant<13>(rkey[ 38] + delta[7][11]);
rkey[ 54] = rotlConstant< 1>(rkey[ 46] + delta[1][ 9]);
rkey[ 62] = rotlConstant< 6>(rkey[ 54] + delta[2][12]);
rkey[ 70] = rotlConstant<13>(rkey[ 62] + delta[3][15]);
rkey[ 78] = rotlConstant< 1>(rkey[ 70] + delta[5][13]);
rkey[ 86] = rotlConstant< 6>(rkey[ 78] + delta[6][16]);
rkey[ 94] = rotlConstant<13>(rkey[ 86] + delta[7][19]);
rkey[102] = rotlConstant< 1>(rkey[ 94] + delta[1][17]);
rkey[110] = rotlConstant< 6>(rkey[102] + delta[2][20]);
rkey[118] = rotlConstant<13>(rkey[110] + delta[3][23]);
rkey[126] = rotlConstant< 1>(rkey[118] + delta[5][21]);
rkey[134] = rotlConstant< 6>(rkey[126] + delta[6][24]);
rkey[142] = rotlConstant<13>(rkey[134] + delta[7][27]);
rkey[150] = rotlConstant< 1>(rkey[142] + delta[1][25]);
rkey[158] = rotlConstant< 6>(rkey[150] + delta[2][28]);
rkey[166] = rotlConstant<13>(rkey[158] + delta[3][31]);
rkey[174] = rotlConstant< 1>(rkey[166] + delta[5][29]);
rkey[182] = rotlConstant< 6>(rkey[174] + delta[6][ 0]);
rkey[190] = rotlConstant<13>(rkey[182] + delta[7][ 3]);
rkey[ 7] = rotlConstant< 3>( key[ 7] + delta[1][ 2]);
rkey[ 15] = rotlConstant<11>(rkey[ 7] + delta[2][ 5]);
rkey[ 23] = rotlConstant<17>(rkey[ 15] + delta[3][ 8]);
rkey[ 31] = rotlConstant< 3>(rkey[ 23] + delta[5][ 6]);
rkey[ 39] = rotlConstant<11>(rkey[ 31] + delta[6][ 9]);
rkey[ 47] = rotlConstant<17>(rkey[ 39] + delta[7][12]);
rkey[ 55] = rotlConstant< 3>(rkey[ 47] + delta[1][10]);
rkey[ 63] = rotlConstant<11>(rkey[ 55] + delta[2][13]);
rkey[ 71] = rotlConstant<17>(rkey[ 63] + delta[3][16]);
rkey[ 79] = rotlConstant< 3>(rkey[ 71] + delta[5][14]);
rkey[ 87] = rotlConstant<11>(rkey[ 79] + delta[6][17]);
rkey[ 95] = rotlConstant<17>(rkey[ 87] + delta[7][20]);
rkey[103] = rotlConstant< 3>(rkey[ 95] + delta[1][18]);
rkey[111] = rotlConstant<11>(rkey[103] + delta[2][21]);
rkey[119] = rotlConstant<17>(rkey[111] + delta[3][24]);
rkey[127] = rotlConstant< 3>(rkey[119] + delta[5][22]);
rkey[135] = rotlConstant<11>(rkey[127] + delta[6][25]);
rkey[143] = rotlConstant<17>(rkey[135] + delta[7][28]);
rkey[151] = rotlConstant< 3>(rkey[143] + delta[1][26]);
rkey[159] = rotlConstant<11>(rkey[151] + delta[2][29]);
rkey[167] = rotlConstant<17>(rkey[159] + delta[3][ 0]);
rkey[175] = rotlConstant< 3>(rkey[167] + delta[5][30]);
rkey[183] = rotlConstant<11>(rkey[175] + delta[6][ 1]);
rkey[191] = rotlConstant<17>(rkey[183] + delta[7][ 4]);
}
NAMESPACE_BEGIN(CryptoPP)
void LEA::Base::UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs &params)
{
CRYPTOPP_UNUSED(params);
switch(keyLength)
{
case 16: // 128-bit key
{
m_rkey.New(144); m_temp.New(4); m_rounds = 24;
GetUserKey(LITTLE_ENDIAN_ORDER, m_temp.begin(), 4, userKey, 16);
SetKey128(m_rkey, m_temp);
break;
}
case 24: // 192-bit key
{
m_rkey.New(168); m_temp.New(6); m_rounds = 28;
GetUserKey(LITTLE_ENDIAN_ORDER, m_temp.begin(), 6, userKey, 24);
SetKey192(m_rkey, m_temp);
break;
}
case 32: // 256-bit key
{
m_rkey.New(192); m_temp.New(8); m_rounds = 32;
GetUserKey(LITTLE_ENDIAN_ORDER, m_temp.begin(), 8, userKey, 32);
SetKey256(m_rkey, m_temp);
break;
}
default:
CRYPTOPP_ASSERT(0);;
}
}
void LEA::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
{
// Do not cast the buffer. It will SIGBUS on some ARM and SPARC.
GetBlock<word32, LittleEndian> iblock(inBlock);
iblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[ 4]) + (m_temp[3] ^ m_rkey[ 5]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 2]) + (m_temp[2] ^ m_rkey[ 3]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 0]) + (m_temp[1] ^ m_rkey[ 1]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 10]) + (m_temp[0] ^ m_rkey[ 11]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[ 8]) + (m_temp[3] ^ m_rkey[ 9]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[ 6]) + (m_temp[2] ^ m_rkey[ 7]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 16]) + (m_temp[1] ^ m_rkey[ 17]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 14]) + (m_temp[0] ^ m_rkey[ 15]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 12]) + (m_temp[3] ^ m_rkey[ 13]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 22]) + (m_temp[2] ^ m_rkey[ 23]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 20]) + (m_temp[1] ^ m_rkey[ 21]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 18]) + (m_temp[0] ^ m_rkey[ 19]));
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[ 28]) + (m_temp[3] ^ m_rkey[ 29]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 26]) + (m_temp[2] ^ m_rkey[ 27]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 24]) + (m_temp[1] ^ m_rkey[ 25]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 34]) + (m_temp[0] ^ m_rkey[ 35]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[ 32]) + (m_temp[3] ^ m_rkey[ 33]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[ 30]) + (m_temp[2] ^ m_rkey[ 31]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 40]) + (m_temp[1] ^ m_rkey[ 41]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 38]) + (m_temp[0] ^ m_rkey[ 39]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 36]) + (m_temp[3] ^ m_rkey[ 37]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 46]) + (m_temp[2] ^ m_rkey[ 47]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 44]) + (m_temp[1] ^ m_rkey[ 45]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 42]) + (m_temp[0] ^ m_rkey[ 43]));
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[ 52]) + (m_temp[3] ^ m_rkey[ 53]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 50]) + (m_temp[2] ^ m_rkey[ 51]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 48]) + (m_temp[1] ^ m_rkey[ 49]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 58]) + (m_temp[0] ^ m_rkey[ 59]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[ 56]) + (m_temp[3] ^ m_rkey[ 57]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[ 54]) + (m_temp[2] ^ m_rkey[ 55]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 64]) + (m_temp[1] ^ m_rkey[ 65]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 62]) + (m_temp[0] ^ m_rkey[ 63]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 60]) + (m_temp[3] ^ m_rkey[ 61]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 70]) + (m_temp[2] ^ m_rkey[ 71]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 68]) + (m_temp[1] ^ m_rkey[ 69]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 66]) + (m_temp[0] ^ m_rkey[ 67]));
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[ 76]) + (m_temp[3] ^ m_rkey[ 77]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 74]) + (m_temp[2] ^ m_rkey[ 75]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 72]) + (m_temp[1] ^ m_rkey[ 73]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[ 82]) + (m_temp[0] ^ m_rkey[ 83]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[ 80]) + (m_temp[3] ^ m_rkey[ 81]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[ 78]) + (m_temp[2] ^ m_rkey[ 79]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[ 88]) + (m_temp[1] ^ m_rkey[ 89]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[ 86]) + (m_temp[0] ^ m_rkey[ 87]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[ 84]) + (m_temp[3] ^ m_rkey[ 85]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[ 94]) + (m_temp[2] ^ m_rkey[ 95]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[ 92]) + (m_temp[1] ^ m_rkey[ 93]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[ 90]) + (m_temp[0] ^ m_rkey[ 91]));
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[100]) + (m_temp[3] ^ m_rkey[101]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[ 98]) + (m_temp[2] ^ m_rkey[ 99]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[ 96]) + (m_temp[1] ^ m_rkey[ 97]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[106]) + (m_temp[0] ^ m_rkey[107]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[104]) + (m_temp[3] ^ m_rkey[105]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[102]) + (m_temp[2] ^ m_rkey[103]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[112]) + (m_temp[1] ^ m_rkey[113]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[110]) + (m_temp[0] ^ m_rkey[111]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[108]) + (m_temp[3] ^ m_rkey[109]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[118]) + (m_temp[2] ^ m_rkey[119]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[116]) + (m_temp[1] ^ m_rkey[117]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[114]) + (m_temp[0] ^ m_rkey[115]));
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[124]) + (m_temp[3] ^ m_rkey[125]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[122]) + (m_temp[2] ^ m_rkey[123]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[120]) + (m_temp[1] ^ m_rkey[121]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[130]) + (m_temp[0] ^ m_rkey[131]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[128]) + (m_temp[3] ^ m_rkey[129]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[126]) + (m_temp[2] ^ m_rkey[127]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[136]) + (m_temp[1] ^ m_rkey[137]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[134]) + (m_temp[0] ^ m_rkey[135]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[132]) + (m_temp[3] ^ m_rkey[133]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[142]) + (m_temp[2] ^ m_rkey[143]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[140]) + (m_temp[1] ^ m_rkey[141]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[138]) + (m_temp[0] ^ m_rkey[139]));
if(m_rounds > 24)
{
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[148]) + (m_temp[3] ^ m_rkey[149]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[146]) + (m_temp[2] ^ m_rkey[147]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[144]) + (m_temp[1] ^ m_rkey[145]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[154]) + (m_temp[0] ^ m_rkey[155]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[152]) + (m_temp[3] ^ m_rkey[153]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[150]) + (m_temp[2] ^ m_rkey[151]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[160]) + (m_temp[1] ^ m_rkey[161]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[158]) + (m_temp[0] ^ m_rkey[159]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[156]) + (m_temp[3] ^ m_rkey[157]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[166]) + (m_temp[2] ^ m_rkey[167]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[164]) + (m_temp[1] ^ m_rkey[165]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[162]) + (m_temp[0] ^ m_rkey[163]));
}
if(m_rounds > 28)
{
m_temp[3] = rotrConstant<3>((m_temp[2] ^ m_rkey[172]) + (m_temp[3] ^ m_rkey[173]));
m_temp[2] = rotrConstant<5>((m_temp[1] ^ m_rkey[170]) + (m_temp[2] ^ m_rkey[171]));
m_temp[1] = rotlConstant<9>((m_temp[0] ^ m_rkey[168]) + (m_temp[1] ^ m_rkey[169]));
m_temp[0] = rotrConstant<3>((m_temp[3] ^ m_rkey[178]) + (m_temp[0] ^ m_rkey[179]));
m_temp[3] = rotrConstant<5>((m_temp[2] ^ m_rkey[176]) + (m_temp[3] ^ m_rkey[177]));
m_temp[2] = rotlConstant<9>((m_temp[1] ^ m_rkey[174]) + (m_temp[2] ^ m_rkey[175]));
m_temp[1] = rotrConstant<3>((m_temp[0] ^ m_rkey[184]) + (m_temp[1] ^ m_rkey[185]));
m_temp[0] = rotrConstant<5>((m_temp[3] ^ m_rkey[182]) + (m_temp[0] ^ m_rkey[183]));
m_temp[3] = rotlConstant<9>((m_temp[2] ^ m_rkey[180]) + (m_temp[3] ^ m_rkey[181]));
m_temp[2] = rotrConstant<3>((m_temp[1] ^ m_rkey[190]) + (m_temp[2] ^ m_rkey[191]));
m_temp[1] = rotrConstant<5>((m_temp[0] ^ m_rkey[188]) + (m_temp[1] ^ m_rkey[189]));
m_temp[0] = rotlConstant<9>((m_temp[3] ^ m_rkey[186]) + (m_temp[0] ^ m_rkey[187]));
}
PutBlock<word32, LittleEndian> oblock(xorBlock, outBlock);
oblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
}
void LEA::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
{
// Do not cast the buffer. It will SIGBUS on some ARM and SPARC.
GetBlock<word32, LittleEndian> iblock(inBlock);
iblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
if(m_rounds > 28)
{
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[186])) ^ m_rkey[187];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[188])) ^ m_rkey[189];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[190])) ^ m_rkey[191];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[180])) ^ m_rkey[181];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[182])) ^ m_rkey[183];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[184])) ^ m_rkey[185];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[174])) ^ m_rkey[175];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[176])) ^ m_rkey[177];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[178])) ^ m_rkey[179];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[168])) ^ m_rkey[169];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[170])) ^ m_rkey[171];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[172])) ^ m_rkey[173];
}
if(m_rounds > 24)
{
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[162])) ^ m_rkey[163];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[164])) ^ m_rkey[165];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[166])) ^ m_rkey[167];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[156])) ^ m_rkey[157];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[158])) ^ m_rkey[159];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[160])) ^ m_rkey[161];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[150])) ^ m_rkey[151];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[152])) ^ m_rkey[153];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[154])) ^ m_rkey[155];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[144])) ^ m_rkey[145];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[146])) ^ m_rkey[147];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[148])) ^ m_rkey[149];
}
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[138])) ^ m_rkey[139];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[140])) ^ m_rkey[141];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[142])) ^ m_rkey[143];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[132])) ^ m_rkey[133];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[134])) ^ m_rkey[135];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[136])) ^ m_rkey[137];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[126])) ^ m_rkey[127];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[128])) ^ m_rkey[129];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[130])) ^ m_rkey[131];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[120])) ^ m_rkey[121];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[122])) ^ m_rkey[123];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[124])) ^ m_rkey[125];
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[114])) ^ m_rkey[115];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[116])) ^ m_rkey[117];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[118])) ^ m_rkey[119];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[108])) ^ m_rkey[109];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[110])) ^ m_rkey[111];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[112])) ^ m_rkey[113];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[102])) ^ m_rkey[103];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[104])) ^ m_rkey[105];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[106])) ^ m_rkey[107];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 96])) ^ m_rkey[ 97];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 98])) ^ m_rkey[ 99];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[100])) ^ m_rkey[101];
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 90])) ^ m_rkey[ 91];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 92])) ^ m_rkey[ 93];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 94])) ^ m_rkey[ 95];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 84])) ^ m_rkey[ 85];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 86])) ^ m_rkey[ 87];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 88])) ^ m_rkey[ 89];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 78])) ^ m_rkey[ 79];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 80])) ^ m_rkey[ 81];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 82])) ^ m_rkey[ 83];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 72])) ^ m_rkey[ 73];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 74])) ^ m_rkey[ 75];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 76])) ^ m_rkey[ 77];
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 66])) ^ m_rkey[ 67];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 68])) ^ m_rkey[ 69];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 70])) ^ m_rkey[ 71];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 60])) ^ m_rkey[ 61];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 62])) ^ m_rkey[ 63];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 64])) ^ m_rkey[ 65];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 54])) ^ m_rkey[ 55];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 56])) ^ m_rkey[ 57];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 58])) ^ m_rkey[ 59];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 48])) ^ m_rkey[ 49];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 50])) ^ m_rkey[ 51];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 52])) ^ m_rkey[ 53];
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 42])) ^ m_rkey[ 43];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 44])) ^ m_rkey[ 45];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 46])) ^ m_rkey[ 47];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 36])) ^ m_rkey[ 37];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 38])) ^ m_rkey[ 39];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 40])) ^ m_rkey[ 41];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 30])) ^ m_rkey[ 31];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 32])) ^ m_rkey[ 33];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 34])) ^ m_rkey[ 35];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 24])) ^ m_rkey[ 25];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 26])) ^ m_rkey[ 27];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 28])) ^ m_rkey[ 29];
m_temp[0] = (rotrConstant<9>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 18])) ^ m_rkey[ 19];
m_temp[1] = (rotlConstant<5>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 20])) ^ m_rkey[ 21];
m_temp[2] = (rotlConstant<3>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 22])) ^ m_rkey[ 23];
m_temp[3] = (rotrConstant<9>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 12])) ^ m_rkey[ 13];
m_temp[0] = (rotlConstant<5>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 14])) ^ m_rkey[ 15];
m_temp[1] = (rotlConstant<3>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 16])) ^ m_rkey[ 17];
m_temp[2] = (rotrConstant<9>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 6])) ^ m_rkey[ 7];
m_temp[3] = (rotlConstant<5>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 8])) ^ m_rkey[ 9];
m_temp[0] = (rotlConstant<3>(m_temp[0]) - (m_temp[3] ^ m_rkey[ 10])) ^ m_rkey[ 11];
m_temp[1] = (rotrConstant<9>(m_temp[1]) - (m_temp[0] ^ m_rkey[ 0])) ^ m_rkey[ 1];
m_temp[2] = (rotlConstant<5>(m_temp[2]) - (m_temp[1] ^ m_rkey[ 2])) ^ m_rkey[ 3];
m_temp[3] = (rotlConstant<3>(m_temp[3]) - (m_temp[2] ^ m_rkey[ 4])) ^ m_rkey[ 5];
PutBlock<word32, LittleEndian> oblock(xorBlock, outBlock);
oblock(m_temp[0])(m_temp[1])(m_temp[2])(m_temp[3]);
}
NAMESPACE_END

83
lea.h Normal file
View File

@ -0,0 +1,83 @@
// lea.h - written and placed in the public domain by Kim Sung Hee and Jeffrey Walton
// Based on "LEA: A 128-Bit Block Cipher for Fast Encryption on Common
// Processors" by Deukjo Hong, Jung-Keun Lee, Dong-Chan Kim, Daesung Kwon,
// Kwon Ho Ryu, and Dong-Geon Lee.
/// \file lea.h
/// \brief Classes for the LEA block cipher
/// \since Crypto++ 7.1
#ifndef CRYPTOPP_LEA_H
#define CRYPTOPP_LEA_H
#include "config.h"
#include "seckey.h"
#include "secblock.h"
#include "algparam.h"
NAMESPACE_BEGIN(CryptoPP)
/// \brief LEA block cipher information
/// \since Crypto++ 7.1
struct LEA_Info : public FixedBlockSize<16>, VariableKeyLength<16,16,32,8>
{
static const std::string StaticAlgorithmName()
{
// Format is Cipher-Blocksize
return "LEA-128";
}
};
/// \brief LEA 128-bit block cipher
/// \details LEA provides 128-bit block size. The valid key size is 128-bit and 256-bit.
/// \note Crypto++ provides a byte oriented implementation
/// \sa LEA, <a href="http://www.cryptopp.com/wiki/LEA">LEA</a>, <a href=
/// "https://seed.kisa.or.kr/html/egovframework/iwt/ds/ko/ref/LEA%20A%20128-Bit%20Block%20Cipher%20for%20Fast%20Encryption%20on%20Common%20Processors-English.pdf">
/// LEA: A 128-Bit Block Cipher for Fast Encryption on Common Processors</a>
/// \since Crypto++ 7.1
class CRYPTOPP_NO_VTABLE LEA : public LEA_Info, public BlockCipherDocumentation
{
public:
/// \brief LEA block cipher transformation functions
/// \details Provides implementation common to encryption and decryption
/// \since Crypto++ 7.1
class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<LEA_Info>
{
protected:
void UncheckedSetKey(const byte *userKey, unsigned int keyLength, const NameValuePairs &params);
SecBlock<word32> m_rkey;
mutable SecBlock<word32> m_temp;
unsigned int m_rounds;
};
/// \brief Provides implementation for encryption transformation
/// \details Enc provides implementation for encryption transformation. All key and block
/// sizes are supported.
/// \since Crypto++ 7.1
class CRYPTOPP_NO_VTABLE Enc : public Base
{
public:
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
};
/// \brief Provides implementation for encryption transformation
/// \details Dec provides implementation for decryption transformation. All key and block
/// sizes are supported.
/// \since Crypto++ 7.1
class CRYPTOPP_NO_VTABLE Dec : public Base
{
public:
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
};
typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption;
typedef BlockCipherFinal<DECRYPTION, Dec> Decryption;
};
typedef LEA::Encryption LEAEncryption;
typedef LEA::Decryption LEADecryption;
NAMESPACE_END
#endif // CRYPTOPP_LEA_H

View File

@ -32,6 +32,7 @@
#include "mars.h" #include "mars.h"
#include "kalyna.h" #include "kalyna.h"
#include "threefish.h" #include "threefish.h"
#include "lea.h"
#include "simon.h" #include "simon.h"
#include "speck.h" #include "speck.h"
#include "sm4.h" #include "sm4.h"
@ -163,6 +164,9 @@ void RegisterFactories2()
RegisterSymmetricCipherDefaultFactories<CTR_Mode<Threefish512> >(); // Benchmarks RegisterSymmetricCipherDefaultFactories<CTR_Mode<Threefish512> >(); // Benchmarks
RegisterSymmetricCipherDefaultFactories<CTR_Mode<Threefish1024> >(); // Benchmarks RegisterSymmetricCipherDefaultFactories<CTR_Mode<Threefish1024> >(); // Benchmarks
RegisterSymmetricCipherDefaultFactories<ECB_Mode<LEA> >(); // Test Vectors
RegisterSymmetricCipherDefaultFactories<CTR_Mode<LEA> >(); // Benchmarks
RegisterSymmetricCipherDefaultFactories<ECB_Mode<SIMON64> >(); // Test Vectors RegisterSymmetricCipherDefaultFactories<ECB_Mode<SIMON64> >(); // Test Vectors
RegisterSymmetricCipherDefaultFactories<CBC_Mode<SIMON64> >(); // Test Vectors RegisterSymmetricCipherDefaultFactories<CBC_Mode<SIMON64> >(); // Test Vectors
RegisterSymmetricCipherDefaultFactories<ECB_Mode<SIMON128> >(); // Test Vectors RegisterSymmetricCipherDefaultFactories<ECB_Mode<SIMON128> >(); // Test Vectors

View File

@ -42,6 +42,7 @@
#include "shacal2.h" #include "shacal2.h"
#include "camellia.h" #include "camellia.h"
#include "aria.h" #include "aria.h"
#include "lea.h"
#include "osrng.h" #include "osrng.h"
#include "drbg.h" #include "drbg.h"
#include "rdrand.h" #include "rdrand.h"
@ -170,6 +171,7 @@ bool ValidateAll(bool thorough)
pass=ValidateSerpent() && pass; pass=ValidateSerpent() && pass;
pass=ValidateSHACAL2() && pass; pass=ValidateSHACAL2() && pass;
pass=ValidateARIA() && pass; pass=ValidateARIA() && pass;
pass=ValidateLEA() && pass;
pass=ValidateCamellia() && pass; pass=ValidateCamellia() && pass;
pass=ValidateSalsa() && pass; pass=ValidateSalsa() && pass;
pass=ValidateSosemanuk() && pass; pass=ValidateSosemanuk() && pass;
@ -3386,6 +3388,13 @@ bool ValidateARIA()
return pass1 && pass2 && pass3; return pass1 && pass2 && pass3;
} }
bool ValidateLEA()
{
std::cout << "\nLEA validation suite running...\n";
return RunTestDataFile(CRYPTOPP_DATA_DIR "TestVectors/lea.txt");
}
bool ValidateCamellia() bool ValidateCamellia()
{ {
std::cout << "\nCamellia validation suite running...\n\n"; std::cout << "\nCamellia validation suite running...\n\n";

View File

@ -81,6 +81,7 @@ bool ValidateTwofish();
bool ValidateSerpent(); bool ValidateSerpent();
bool ValidateSHACAL2(); bool ValidateSHACAL2();
bool ValidateARIA(); bool ValidateARIA();
bool ValidateLEA();
bool ValidateCamellia(); bool ValidateCamellia();
bool ValidateSalsa(); bool ValidateSalsa();
bool ValidateSosemanuk(); bool ValidateSosemanuk();