1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Tiger hashing Algorithm
7 * Copyright (C) 1998 Free Software Foundation, Inc.
9 * The Tiger algorithm was developed by Ross Anderson and Eli Biham.
10 * It was optimized for 64-bit processors while still delievering
11 * decent performance on 32 and 16-bit processors.
13 * This version is derived from the GnuPG implementation and the
14 * Tiger-Perl interface written by Rafael Sevilla
16 * Adapted for Linux Kernel Crypto by Aaron Grothe
17 * ajgrothe@yahoo.com, February 22, 2005
19 #include <crypto/internal/hash.h>
20 #include <linux/init.h>
21 #include <linux/module.h>
23 #include <linux/types.h>
24 #include <asm/byteorder.h>
25 #include <asm/unaligned.h>
27 #define TGR192_DIGEST_SIZE 24
28 #define TGR160_DIGEST_SIZE 20
29 #define TGR128_DIGEST_SIZE 16
31 #define TGR192_BLOCK_SIZE 64
40 static const u64 sbox1
[256] = {
41 0x02aab17cf7e90c5eULL
, 0xac424b03e243a8ecULL
, 0x72cd5be30dd5fcd3ULL
,
42 0x6d019b93f6f97f3aULL
, 0xcd9978ffd21f9193ULL
, 0x7573a1c9708029e2ULL
,
43 0xb164326b922a83c3ULL
, 0x46883eee04915870ULL
, 0xeaace3057103ece6ULL
,
44 0xc54169b808a3535cULL
, 0x4ce754918ddec47cULL
, 0x0aa2f4dfdc0df40cULL
,
45 0x10b76f18a74dbefaULL
, 0xc6ccb6235ad1ab6aULL
, 0x13726121572fe2ffULL
,
46 0x1a488c6f199d921eULL
, 0x4bc9f9f4da0007caULL
, 0x26f5e6f6e85241c7ULL
,
47 0x859079dbea5947b6ULL
, 0x4f1885c5c99e8c92ULL
, 0xd78e761ea96f864bULL
,
48 0x8e36428c52b5c17dULL
, 0x69cf6827373063c1ULL
, 0xb607c93d9bb4c56eULL
,
49 0x7d820e760e76b5eaULL
, 0x645c9cc6f07fdc42ULL
, 0xbf38a078243342e0ULL
,
50 0x5f6b343c9d2e7d04ULL
, 0xf2c28aeb600b0ec6ULL
, 0x6c0ed85f7254bcacULL
,
51 0x71592281a4db4fe5ULL
, 0x1967fa69ce0fed9fULL
, 0xfd5293f8b96545dbULL
,
52 0xc879e9d7f2a7600bULL
, 0x860248920193194eULL
, 0xa4f9533b2d9cc0b3ULL
,
53 0x9053836c15957613ULL
, 0xdb6dcf8afc357bf1ULL
, 0x18beea7a7a370f57ULL
,
54 0x037117ca50b99066ULL
, 0x6ab30a9774424a35ULL
, 0xf4e92f02e325249bULL
,
55 0x7739db07061ccae1ULL
, 0xd8f3b49ceca42a05ULL
, 0xbd56be3f51382f73ULL
,
56 0x45faed5843b0bb28ULL
, 0x1c813d5c11bf1f83ULL
, 0x8af0e4b6d75fa169ULL
,
57 0x33ee18a487ad9999ULL
, 0x3c26e8eab1c94410ULL
, 0xb510102bc0a822f9ULL
,
58 0x141eef310ce6123bULL
, 0xfc65b90059ddb154ULL
, 0xe0158640c5e0e607ULL
,
59 0x884e079826c3a3cfULL
, 0x930d0d9523c535fdULL
, 0x35638d754e9a2b00ULL
,
60 0x4085fccf40469dd5ULL
, 0xc4b17ad28be23a4cULL
, 0xcab2f0fc6a3e6a2eULL
,
61 0x2860971a6b943fcdULL
, 0x3dde6ee212e30446ULL
, 0x6222f32ae01765aeULL
,
62 0x5d550bb5478308feULL
, 0xa9efa98da0eda22aULL
, 0xc351a71686c40da7ULL
,
63 0x1105586d9c867c84ULL
, 0xdcffee85fda22853ULL
, 0xccfbd0262c5eef76ULL
,
64 0xbaf294cb8990d201ULL
, 0xe69464f52afad975ULL
, 0x94b013afdf133e14ULL
,
65 0x06a7d1a32823c958ULL
, 0x6f95fe5130f61119ULL
, 0xd92ab34e462c06c0ULL
,
66 0xed7bde33887c71d2ULL
, 0x79746d6e6518393eULL
, 0x5ba419385d713329ULL
,
67 0x7c1ba6b948a97564ULL
, 0x31987c197bfdac67ULL
, 0xde6c23c44b053d02ULL
,
68 0x581c49fed002d64dULL
, 0xdd474d6338261571ULL
, 0xaa4546c3e473d062ULL
,
69 0x928fce349455f860ULL
, 0x48161bbacaab94d9ULL
, 0x63912430770e6f68ULL
,
70 0x6ec8a5e602c6641cULL
, 0x87282515337ddd2bULL
, 0x2cda6b42034b701bULL
,
71 0xb03d37c181cb096dULL
, 0xe108438266c71c6fULL
, 0x2b3180c7eb51b255ULL
,
72 0xdf92b82f96c08bbcULL
, 0x5c68c8c0a632f3baULL
, 0x5504cc861c3d0556ULL
,
73 0xabbfa4e55fb26b8fULL
, 0x41848b0ab3baceb4ULL
, 0xb334a273aa445d32ULL
,
74 0xbca696f0a85ad881ULL
, 0x24f6ec65b528d56cULL
, 0x0ce1512e90f4524aULL
,
75 0x4e9dd79d5506d35aULL
, 0x258905fac6ce9779ULL
, 0x2019295b3e109b33ULL
,
76 0xf8a9478b73a054ccULL
, 0x2924f2f934417eb0ULL
, 0x3993357d536d1bc4ULL
,
77 0x38a81ac21db6ff8bULL
, 0x47c4fbf17d6016bfULL
, 0x1e0faadd7667e3f5ULL
,
78 0x7abcff62938beb96ULL
, 0xa78dad948fc179c9ULL
, 0x8f1f98b72911e50dULL
,
79 0x61e48eae27121a91ULL
, 0x4d62f7ad31859808ULL
, 0xeceba345ef5ceaebULL
,
80 0xf5ceb25ebc9684ceULL
, 0xf633e20cb7f76221ULL
, 0xa32cdf06ab8293e4ULL
,
81 0x985a202ca5ee2ca4ULL
, 0xcf0b8447cc8a8fb1ULL
, 0x9f765244979859a3ULL
,
82 0xa8d516b1a1240017ULL
, 0x0bd7ba3ebb5dc726ULL
, 0xe54bca55b86adb39ULL
,
83 0x1d7a3afd6c478063ULL
, 0x519ec608e7669eddULL
, 0x0e5715a2d149aa23ULL
,
84 0x177d4571848ff194ULL
, 0xeeb55f3241014c22ULL
, 0x0f5e5ca13a6e2ec2ULL
,
85 0x8029927b75f5c361ULL
, 0xad139fabc3d6e436ULL
, 0x0d5df1a94ccf402fULL
,
86 0x3e8bd948bea5dfc8ULL
, 0xa5a0d357bd3ff77eULL
, 0xa2d12e251f74f645ULL
,
87 0x66fd9e525e81a082ULL
, 0x2e0c90ce7f687a49ULL
, 0xc2e8bcbeba973bc5ULL
,
88 0x000001bce509745fULL
, 0x423777bbe6dab3d6ULL
, 0xd1661c7eaef06eb5ULL
,
89 0xa1781f354daacfd8ULL
, 0x2d11284a2b16affcULL
, 0xf1fc4f67fa891d1fULL
,
90 0x73ecc25dcb920adaULL
, 0xae610c22c2a12651ULL
, 0x96e0a810d356b78aULL
,
91 0x5a9a381f2fe7870fULL
, 0xd5ad62ede94e5530ULL
, 0xd225e5e8368d1427ULL
,
92 0x65977b70c7af4631ULL
, 0x99f889b2de39d74fULL
, 0x233f30bf54e1d143ULL
,
93 0x9a9675d3d9a63c97ULL
, 0x5470554ff334f9a8ULL
, 0x166acb744a4f5688ULL
,
94 0x70c74caab2e4aeadULL
, 0xf0d091646f294d12ULL
, 0x57b82a89684031d1ULL
,
95 0xefd95a5a61be0b6bULL
, 0x2fbd12e969f2f29aULL
, 0x9bd37013feff9fe8ULL
,
96 0x3f9b0404d6085a06ULL
, 0x4940c1f3166cfe15ULL
, 0x09542c4dcdf3defbULL
,
97 0xb4c5218385cd5ce3ULL
, 0xc935b7dc4462a641ULL
, 0x3417f8a68ed3b63fULL
,
98 0xb80959295b215b40ULL
, 0xf99cdaef3b8c8572ULL
, 0x018c0614f8fcb95dULL
,
99 0x1b14accd1a3acdf3ULL
, 0x84d471f200bb732dULL
, 0xc1a3110e95e8da16ULL
,
100 0x430a7220bf1a82b8ULL
, 0xb77e090d39df210eULL
, 0x5ef4bd9f3cd05e9dULL
,
101 0x9d4ff6da7e57a444ULL
, 0xda1d60e183d4a5f8ULL
, 0xb287c38417998e47ULL
,
102 0xfe3edc121bb31886ULL
, 0xc7fe3ccc980ccbefULL
, 0xe46fb590189bfd03ULL
,
103 0x3732fd469a4c57dcULL
, 0x7ef700a07cf1ad65ULL
, 0x59c64468a31d8859ULL
,
104 0x762fb0b4d45b61f6ULL
, 0x155baed099047718ULL
, 0x68755e4c3d50baa6ULL
,
105 0xe9214e7f22d8b4dfULL
, 0x2addbf532eac95f4ULL
, 0x32ae3909b4bd0109ULL
,
106 0x834df537b08e3450ULL
, 0xfa209da84220728dULL
, 0x9e691d9b9efe23f7ULL
,
107 0x0446d288c4ae8d7fULL
, 0x7b4cc524e169785bULL
, 0x21d87f0135ca1385ULL
,
108 0xcebb400f137b8aa5ULL
, 0x272e2b66580796beULL
, 0x3612264125c2b0deULL
,
109 0x057702bdad1efbb2ULL
, 0xd4babb8eacf84be9ULL
, 0x91583139641bc67bULL
,
110 0x8bdc2de08036e024ULL
, 0x603c8156f49f68edULL
, 0xf7d236f7dbef5111ULL
,
111 0x9727c4598ad21e80ULL
, 0xa08a0896670a5fd7ULL
, 0xcb4a8f4309eba9cbULL
,
112 0x81af564b0f7036a1ULL
, 0xc0b99aa778199abdULL
, 0x959f1ec83fc8e952ULL
,
113 0x8c505077794a81b9ULL
, 0x3acaaf8f056338f0ULL
, 0x07b43f50627a6778ULL
,
114 0x4a44ab49f5eccc77ULL
, 0x3bc3d6e4b679ee98ULL
, 0x9cc0d4d1cf14108cULL
,
115 0x4406c00b206bc8a0ULL
, 0x82a18854c8d72d89ULL
, 0x67e366b35c3c432cULL
,
116 0xb923dd61102b37f2ULL
, 0x56ab2779d884271dULL
, 0xbe83e1b0ff1525afULL
,
117 0xfb7c65d4217e49a9ULL
, 0x6bdbe0e76d48e7d4ULL
, 0x08df828745d9179eULL
,
118 0x22ea6a9add53bd34ULL
, 0xe36e141c5622200aULL
, 0x7f805d1b8cb750eeULL
,
119 0xafe5c7a59f58e837ULL
, 0xe27f996a4fb1c23cULL
, 0xd3867dfb0775f0d0ULL
,
120 0xd0e673de6e88891aULL
, 0x123aeb9eafb86c25ULL
, 0x30f1d5d5c145b895ULL
,
121 0xbb434a2dee7269e7ULL
, 0x78cb67ecf931fa38ULL
, 0xf33b0372323bbf9cULL
,
122 0x52d66336fb279c74ULL
, 0x505f33ac0afb4eaaULL
, 0xe8a5cd99a2cce187ULL
,
123 0x534974801e2d30bbULL
, 0x8d2d5711d5876d90ULL
, 0x1f1a412891bc038eULL
,
124 0xd6e2e71d82e56648ULL
, 0x74036c3a497732b7ULL
, 0x89b67ed96361f5abULL
,
125 0xffed95d8f1ea02a2ULL
, 0xe72b3bd61464d43dULL
, 0xa6300f170bdc4820ULL
,
126 0xebc18760ed78a77aULL
129 static const u64 sbox2
[256] = {
130 0xe6a6be5a05a12138ULL
, 0xb5a122a5b4f87c98ULL
, 0x563c6089140b6990ULL
,
131 0x4c46cb2e391f5dd5ULL
, 0xd932addbc9b79434ULL
, 0x08ea70e42015aff5ULL
,
132 0xd765a6673e478cf1ULL
, 0xc4fb757eab278d99ULL
, 0xdf11c6862d6e0692ULL
,
133 0xddeb84f10d7f3b16ULL
, 0x6f2ef604a665ea04ULL
, 0x4a8e0f0ff0e0dfb3ULL
,
134 0xa5edeef83dbcba51ULL
, 0xfc4f0a2a0ea4371eULL
, 0xe83e1da85cb38429ULL
,
135 0xdc8ff882ba1b1ce2ULL
, 0xcd45505e8353e80dULL
, 0x18d19a00d4db0717ULL
,
136 0x34a0cfeda5f38101ULL
, 0x0be77e518887caf2ULL
, 0x1e341438b3c45136ULL
,
137 0xe05797f49089ccf9ULL
, 0xffd23f9df2591d14ULL
, 0x543dda228595c5cdULL
,
138 0x661f81fd99052a33ULL
, 0x8736e641db0f7b76ULL
, 0x15227725418e5307ULL
,
139 0xe25f7f46162eb2faULL
, 0x48a8b2126c13d9feULL
, 0xafdc541792e76eeaULL
,
140 0x03d912bfc6d1898fULL
, 0x31b1aafa1b83f51bULL
, 0xf1ac2796e42ab7d9ULL
,
141 0x40a3a7d7fcd2ebacULL
, 0x1056136d0afbbcc5ULL
, 0x7889e1dd9a6d0c85ULL
,
142 0xd33525782a7974aaULL
, 0xa7e25d09078ac09bULL
, 0xbd4138b3eac6edd0ULL
,
143 0x920abfbe71eb9e70ULL
, 0xa2a5d0f54fc2625cULL
, 0xc054e36b0b1290a3ULL
,
144 0xf6dd59ff62fe932bULL
, 0x3537354511a8ac7dULL
, 0xca845e9172fadcd4ULL
,
145 0x84f82b60329d20dcULL
, 0x79c62ce1cd672f18ULL
, 0x8b09a2add124642cULL
,
146 0xd0c1e96a19d9e726ULL
, 0x5a786a9b4ba9500cULL
, 0x0e020336634c43f3ULL
,
147 0xc17b474aeb66d822ULL
, 0x6a731ae3ec9baac2ULL
, 0x8226667ae0840258ULL
,
148 0x67d4567691caeca5ULL
, 0x1d94155c4875adb5ULL
, 0x6d00fd985b813fdfULL
,
149 0x51286efcb774cd06ULL
, 0x5e8834471fa744afULL
, 0xf72ca0aee761ae2eULL
,
150 0xbe40e4cdaee8e09aULL
, 0xe9970bbb5118f665ULL
, 0x726e4beb33df1964ULL
,
151 0x703b000729199762ULL
, 0x4631d816f5ef30a7ULL
, 0xb880b5b51504a6beULL
,
152 0x641793c37ed84b6cULL
, 0x7b21ed77f6e97d96ULL
, 0x776306312ef96b73ULL
,
153 0xae528948e86ff3f4ULL
, 0x53dbd7f286a3f8f8ULL
, 0x16cadce74cfc1063ULL
,
154 0x005c19bdfa52c6ddULL
, 0x68868f5d64d46ad3ULL
, 0x3a9d512ccf1e186aULL
,
155 0x367e62c2385660aeULL
, 0xe359e7ea77dcb1d7ULL
, 0x526c0773749abe6eULL
,
156 0x735ae5f9d09f734bULL
, 0x493fc7cc8a558ba8ULL
, 0xb0b9c1533041ab45ULL
,
157 0x321958ba470a59bdULL
, 0x852db00b5f46c393ULL
, 0x91209b2bd336b0e5ULL
,
158 0x6e604f7d659ef19fULL
, 0xb99a8ae2782ccb24ULL
, 0xccf52ab6c814c4c7ULL
,
159 0x4727d9afbe11727bULL
, 0x7e950d0c0121b34dULL
, 0x756f435670ad471fULL
,
160 0xf5add442615a6849ULL
, 0x4e87e09980b9957aULL
, 0x2acfa1df50aee355ULL
,
161 0xd898263afd2fd556ULL
, 0xc8f4924dd80c8fd6ULL
, 0xcf99ca3d754a173aULL
,
162 0xfe477bacaf91bf3cULL
, 0xed5371f6d690c12dULL
, 0x831a5c285e687094ULL
,
163 0xc5d3c90a3708a0a4ULL
, 0x0f7f903717d06580ULL
, 0x19f9bb13b8fdf27fULL
,
164 0xb1bd6f1b4d502843ULL
, 0x1c761ba38fff4012ULL
, 0x0d1530c4e2e21f3bULL
,
165 0x8943ce69a7372c8aULL
, 0xe5184e11feb5ce66ULL
, 0x618bdb80bd736621ULL
,
166 0x7d29bad68b574d0bULL
, 0x81bb613e25e6fe5bULL
, 0x071c9c10bc07913fULL
,
167 0xc7beeb7909ac2d97ULL
, 0xc3e58d353bc5d757ULL
, 0xeb017892f38f61e8ULL
,
168 0xd4effb9c9b1cc21aULL
, 0x99727d26f494f7abULL
, 0xa3e063a2956b3e03ULL
,
169 0x9d4a8b9a4aa09c30ULL
, 0x3f6ab7d500090fb4ULL
, 0x9cc0f2a057268ac0ULL
,
170 0x3dee9d2dedbf42d1ULL
, 0x330f49c87960a972ULL
, 0xc6b2720287421b41ULL
,
171 0x0ac59ec07c00369cULL
, 0xef4eac49cb353425ULL
, 0xf450244eef0129d8ULL
,
172 0x8acc46e5caf4deb6ULL
, 0x2ffeab63989263f7ULL
, 0x8f7cb9fe5d7a4578ULL
,
173 0x5bd8f7644e634635ULL
, 0x427a7315bf2dc900ULL
, 0x17d0c4aa2125261cULL
,
174 0x3992486c93518e50ULL
, 0xb4cbfee0a2d7d4c3ULL
, 0x7c75d6202c5ddd8dULL
,
175 0xdbc295d8e35b6c61ULL
, 0x60b369d302032b19ULL
, 0xce42685fdce44132ULL
,
176 0x06f3ddb9ddf65610ULL
, 0x8ea4d21db5e148f0ULL
, 0x20b0fce62fcd496fULL
,
177 0x2c1b912358b0ee31ULL
, 0xb28317b818f5a308ULL
, 0xa89c1e189ca6d2cfULL
,
178 0x0c6b18576aaadbc8ULL
, 0xb65deaa91299fae3ULL
, 0xfb2b794b7f1027e7ULL
,
179 0x04e4317f443b5bebULL
, 0x4b852d325939d0a6ULL
, 0xd5ae6beefb207ffcULL
,
180 0x309682b281c7d374ULL
, 0xbae309a194c3b475ULL
, 0x8cc3f97b13b49f05ULL
,
181 0x98a9422ff8293967ULL
, 0x244b16b01076ff7cULL
, 0xf8bf571c663d67eeULL
,
182 0x1f0d6758eee30da1ULL
, 0xc9b611d97adeb9b7ULL
, 0xb7afd5887b6c57a2ULL
,
183 0x6290ae846b984fe1ULL
, 0x94df4cdeacc1a5fdULL
, 0x058a5bd1c5483affULL
,
184 0x63166cc142ba3c37ULL
, 0x8db8526eb2f76f40ULL
, 0xe10880036f0d6d4eULL
,
185 0x9e0523c9971d311dULL
, 0x45ec2824cc7cd691ULL
, 0x575b8359e62382c9ULL
,
186 0xfa9e400dc4889995ULL
, 0xd1823ecb45721568ULL
, 0xdafd983b8206082fULL
,
187 0xaa7d29082386a8cbULL
, 0x269fcd4403b87588ULL
, 0x1b91f5f728bdd1e0ULL
,
188 0xe4669f39040201f6ULL
, 0x7a1d7c218cf04adeULL
, 0x65623c29d79ce5ceULL
,
189 0x2368449096c00bb1ULL
, 0xab9bf1879da503baULL
, 0xbc23ecb1a458058eULL
,
190 0x9a58df01bb401eccULL
, 0xa070e868a85f143dULL
, 0x4ff188307df2239eULL
,
191 0x14d565b41a641183ULL
, 0xee13337452701602ULL
, 0x950e3dcf3f285e09ULL
,
192 0x59930254b9c80953ULL
, 0x3bf299408930da6dULL
, 0xa955943f53691387ULL
,
193 0xa15edecaa9cb8784ULL
, 0x29142127352be9a0ULL
, 0x76f0371fff4e7afbULL
,
194 0x0239f450274f2228ULL
, 0xbb073af01d5e868bULL
, 0xbfc80571c10e96c1ULL
,
195 0xd267088568222e23ULL
, 0x9671a3d48e80b5b0ULL
, 0x55b5d38ae193bb81ULL
,
196 0x693ae2d0a18b04b8ULL
, 0x5c48b4ecadd5335fULL
, 0xfd743b194916a1caULL
,
197 0x2577018134be98c4ULL
, 0xe77987e83c54a4adULL
, 0x28e11014da33e1b9ULL
,
198 0x270cc59e226aa213ULL
, 0x71495f756d1a5f60ULL
, 0x9be853fb60afef77ULL
,
199 0xadc786a7f7443dbfULL
, 0x0904456173b29a82ULL
, 0x58bc7a66c232bd5eULL
,
200 0xf306558c673ac8b2ULL
, 0x41f639c6b6c9772aULL
, 0x216defe99fda35daULL
,
201 0x11640cc71c7be615ULL
, 0x93c43694565c5527ULL
, 0xea038e6246777839ULL
,
202 0xf9abf3ce5a3e2469ULL
, 0x741e768d0fd312d2ULL
, 0x0144b883ced652c6ULL
,
203 0xc20b5a5ba33f8552ULL
, 0x1ae69633c3435a9dULL
, 0x97a28ca4088cfdecULL
,
204 0x8824a43c1e96f420ULL
, 0x37612fa66eeea746ULL
, 0x6b4cb165f9cf0e5aULL
,
205 0x43aa1c06a0abfb4aULL
, 0x7f4dc26ff162796bULL
, 0x6cbacc8e54ed9b0fULL
,
206 0xa6b7ffefd2bb253eULL
, 0x2e25bc95b0a29d4fULL
, 0x86d6a58bdef1388cULL
,
207 0xded74ac576b6f054ULL
, 0x8030bdbc2b45805dULL
, 0x3c81af70e94d9289ULL
,
208 0x3eff6dda9e3100dbULL
, 0xb38dc39fdfcc8847ULL
, 0x123885528d17b87eULL
,
209 0xf2da0ed240b1b642ULL
, 0x44cefadcd54bf9a9ULL
, 0x1312200e433c7ee6ULL
,
210 0x9ffcc84f3a78c748ULL
, 0xf0cd1f72248576bbULL
, 0xec6974053638cfe4ULL
,
211 0x2ba7b67c0cec4e4cULL
, 0xac2f4df3e5ce32edULL
, 0xcb33d14326ea4c11ULL
,
212 0xa4e9044cc77e58bcULL
, 0x5f513293d934fcefULL
, 0x5dc9645506e55444ULL
,
213 0x50de418f317de40aULL
, 0x388cb31a69dde259ULL
, 0x2db4a83455820a86ULL
,
214 0x9010a91e84711ae9ULL
, 0x4df7f0b7b1498371ULL
, 0xd62a2eabc0977179ULL
,
215 0x22fac097aa8d5c0eULL
218 static const u64 sbox3
[256] = {
219 0xf49fcc2ff1daf39bULL
, 0x487fd5c66ff29281ULL
, 0xe8a30667fcdca83fULL
,
220 0x2c9b4be3d2fcce63ULL
, 0xda3ff74b93fbbbc2ULL
, 0x2fa165d2fe70ba66ULL
,
221 0xa103e279970e93d4ULL
, 0xbecdec77b0e45e71ULL
, 0xcfb41e723985e497ULL
,
222 0xb70aaa025ef75017ULL
, 0xd42309f03840b8e0ULL
, 0x8efc1ad035898579ULL
,
223 0x96c6920be2b2abc5ULL
, 0x66af4163375a9172ULL
, 0x2174abdcca7127fbULL
,
224 0xb33ccea64a72ff41ULL
, 0xf04a4933083066a5ULL
, 0x8d970acdd7289af5ULL
,
225 0x8f96e8e031c8c25eULL
, 0xf3fec02276875d47ULL
, 0xec7bf310056190ddULL
,
226 0xf5adb0aebb0f1491ULL
, 0x9b50f8850fd58892ULL
, 0x4975488358b74de8ULL
,
227 0xa3354ff691531c61ULL
, 0x0702bbe481d2c6eeULL
, 0x89fb24057deded98ULL
,
228 0xac3075138596e902ULL
, 0x1d2d3580172772edULL
, 0xeb738fc28e6bc30dULL
,
229 0x5854ef8f63044326ULL
, 0x9e5c52325add3bbeULL
, 0x90aa53cf325c4623ULL
,
230 0xc1d24d51349dd067ULL
, 0x2051cfeea69ea624ULL
, 0x13220f0a862e7e4fULL
,
231 0xce39399404e04864ULL
, 0xd9c42ca47086fcb7ULL
, 0x685ad2238a03e7ccULL
,
232 0x066484b2ab2ff1dbULL
, 0xfe9d5d70efbf79ecULL
, 0x5b13b9dd9c481854ULL
,
233 0x15f0d475ed1509adULL
, 0x0bebcd060ec79851ULL
, 0xd58c6791183ab7f8ULL
,
234 0xd1187c5052f3eee4ULL
, 0xc95d1192e54e82ffULL
, 0x86eea14cb9ac6ca2ULL
,
235 0x3485beb153677d5dULL
, 0xdd191d781f8c492aULL
, 0xf60866baa784ebf9ULL
,
236 0x518f643ba2d08c74ULL
, 0x8852e956e1087c22ULL
, 0xa768cb8dc410ae8dULL
,
237 0x38047726bfec8e1aULL
, 0xa67738b4cd3b45aaULL
, 0xad16691cec0dde19ULL
,
238 0xc6d4319380462e07ULL
, 0xc5a5876d0ba61938ULL
, 0x16b9fa1fa58fd840ULL
,
239 0x188ab1173ca74f18ULL
, 0xabda2f98c99c021fULL
, 0x3e0580ab134ae816ULL
,
240 0x5f3b05b773645abbULL
, 0x2501a2be5575f2f6ULL
, 0x1b2f74004e7e8ba9ULL
,
241 0x1cd7580371e8d953ULL
, 0x7f6ed89562764e30ULL
, 0xb15926ff596f003dULL
,
242 0x9f65293da8c5d6b9ULL
, 0x6ecef04dd690f84cULL
, 0x4782275fff33af88ULL
,
243 0xe41433083f820801ULL
, 0xfd0dfe409a1af9b5ULL
, 0x4325a3342cdb396bULL
,
244 0x8ae77e62b301b252ULL
, 0xc36f9e9f6655615aULL
, 0x85455a2d92d32c09ULL
,
245 0xf2c7dea949477485ULL
, 0x63cfb4c133a39ebaULL
, 0x83b040cc6ebc5462ULL
,
246 0x3b9454c8fdb326b0ULL
, 0x56f56a9e87ffd78cULL
, 0x2dc2940d99f42bc6ULL
,
247 0x98f7df096b096e2dULL
, 0x19a6e01e3ad852bfULL
, 0x42a99ccbdbd4b40bULL
,
248 0xa59998af45e9c559ULL
, 0x366295e807d93186ULL
, 0x6b48181bfaa1f773ULL
,
249 0x1fec57e2157a0a1dULL
, 0x4667446af6201ad5ULL
, 0xe615ebcacfb0f075ULL
,
250 0xb8f31f4f68290778ULL
, 0x22713ed6ce22d11eULL
, 0x3057c1a72ec3c93bULL
,
251 0xcb46acc37c3f1f2fULL
, 0xdbb893fd02aaf50eULL
, 0x331fd92e600b9fcfULL
,
252 0xa498f96148ea3ad6ULL
, 0xa8d8426e8b6a83eaULL
, 0xa089b274b7735cdcULL
,
253 0x87f6b3731e524a11ULL
, 0x118808e5cbc96749ULL
, 0x9906e4c7b19bd394ULL
,
254 0xafed7f7e9b24a20cULL
, 0x6509eadeeb3644a7ULL
, 0x6c1ef1d3e8ef0edeULL
,
255 0xb9c97d43e9798fb4ULL
, 0xa2f2d784740c28a3ULL
, 0x7b8496476197566fULL
,
256 0x7a5be3e6b65f069dULL
, 0xf96330ed78be6f10ULL
, 0xeee60de77a076a15ULL
,
257 0x2b4bee4aa08b9bd0ULL
, 0x6a56a63ec7b8894eULL
, 0x02121359ba34fef4ULL
,
258 0x4cbf99f8283703fcULL
, 0x398071350caf30c8ULL
, 0xd0a77a89f017687aULL
,
259 0xf1c1a9eb9e423569ULL
, 0x8c7976282dee8199ULL
, 0x5d1737a5dd1f7abdULL
,
260 0x4f53433c09a9fa80ULL
, 0xfa8b0c53df7ca1d9ULL
, 0x3fd9dcbc886ccb77ULL
,
261 0xc040917ca91b4720ULL
, 0x7dd00142f9d1dcdfULL
, 0x8476fc1d4f387b58ULL
,
262 0x23f8e7c5f3316503ULL
, 0x032a2244e7e37339ULL
, 0x5c87a5d750f5a74bULL
,
263 0x082b4cc43698992eULL
, 0xdf917becb858f63cULL
, 0x3270b8fc5bf86ddaULL
,
264 0x10ae72bb29b5dd76ULL
, 0x576ac94e7700362bULL
, 0x1ad112dac61efb8fULL
,
265 0x691bc30ec5faa427ULL
, 0xff246311cc327143ULL
, 0x3142368e30e53206ULL
,
266 0x71380e31e02ca396ULL
, 0x958d5c960aad76f1ULL
, 0xf8d6f430c16da536ULL
,
267 0xc8ffd13f1be7e1d2ULL
, 0x7578ae66004ddbe1ULL
, 0x05833f01067be646ULL
,
268 0xbb34b5ad3bfe586dULL
, 0x095f34c9a12b97f0ULL
, 0x247ab64525d60ca8ULL
,
269 0xdcdbc6f3017477d1ULL
, 0x4a2e14d4decad24dULL
, 0xbdb5e6d9be0a1eebULL
,
270 0x2a7e70f7794301abULL
, 0xdef42d8a270540fdULL
, 0x01078ec0a34c22c1ULL
,
271 0xe5de511af4c16387ULL
, 0x7ebb3a52bd9a330aULL
, 0x77697857aa7d6435ULL
,
272 0x004e831603ae4c32ULL
, 0xe7a21020ad78e312ULL
, 0x9d41a70c6ab420f2ULL
,
273 0x28e06c18ea1141e6ULL
, 0xd2b28cbd984f6b28ULL
, 0x26b75f6c446e9d83ULL
,
274 0xba47568c4d418d7fULL
, 0xd80badbfe6183d8eULL
, 0x0e206d7f5f166044ULL
,
275 0xe258a43911cbca3eULL
, 0x723a1746b21dc0bcULL
, 0xc7caa854f5d7cdd3ULL
,
276 0x7cac32883d261d9cULL
, 0x7690c26423ba942cULL
, 0x17e55524478042b8ULL
,
277 0xe0be477656a2389fULL
, 0x4d289b5e67ab2da0ULL
, 0x44862b9c8fbbfd31ULL
,
278 0xb47cc8049d141365ULL
, 0x822c1b362b91c793ULL
, 0x4eb14655fb13dfd8ULL
,
279 0x1ecbba0714e2a97bULL
, 0x6143459d5cde5f14ULL
, 0x53a8fbf1d5f0ac89ULL
,
280 0x97ea04d81c5e5b00ULL
, 0x622181a8d4fdb3f3ULL
, 0xe9bcd341572a1208ULL
,
281 0x1411258643cce58aULL
, 0x9144c5fea4c6e0a4ULL
, 0x0d33d06565cf620fULL
,
282 0x54a48d489f219ca1ULL
, 0xc43e5eac6d63c821ULL
, 0xa9728b3a72770dafULL
,
283 0xd7934e7b20df87efULL
, 0xe35503b61a3e86e5ULL
, 0xcae321fbc819d504ULL
,
284 0x129a50b3ac60bfa6ULL
, 0xcd5e68ea7e9fb6c3ULL
, 0xb01c90199483b1c7ULL
,
285 0x3de93cd5c295376cULL
, 0xaed52edf2ab9ad13ULL
, 0x2e60f512c0a07884ULL
,
286 0xbc3d86a3e36210c9ULL
, 0x35269d9b163951ceULL
, 0x0c7d6e2ad0cdb5faULL
,
287 0x59e86297d87f5733ULL
, 0x298ef221898db0e7ULL
, 0x55000029d1a5aa7eULL
,
288 0x8bc08ae1b5061b45ULL
, 0xc2c31c2b6c92703aULL
, 0x94cc596baf25ef42ULL
,
289 0x0a1d73db22540456ULL
, 0x04b6a0f9d9c4179aULL
, 0xeffdafa2ae3d3c60ULL
,
290 0xf7c8075bb49496c4ULL
, 0x9cc5c7141d1cd4e3ULL
, 0x78bd1638218e5534ULL
,
291 0xb2f11568f850246aULL
, 0xedfabcfa9502bc29ULL
, 0x796ce5f2da23051bULL
,
292 0xaae128b0dc93537cULL
, 0x3a493da0ee4b29aeULL
, 0xb5df6b2c416895d7ULL
,
293 0xfcabbd25122d7f37ULL
, 0x70810b58105dc4b1ULL
, 0xe10fdd37f7882a90ULL
,
294 0x524dcab5518a3f5cULL
, 0x3c9e85878451255bULL
, 0x4029828119bd34e2ULL
,
295 0x74a05b6f5d3ceccbULL
, 0xb610021542e13ecaULL
, 0x0ff979d12f59e2acULL
,
296 0x6037da27e4f9cc50ULL
, 0x5e92975a0df1847dULL
, 0xd66de190d3e623feULL
,
297 0x5032d6b87b568048ULL
, 0x9a36b7ce8235216eULL
, 0x80272a7a24f64b4aULL
,
298 0x93efed8b8c6916f7ULL
, 0x37ddbff44cce1555ULL
, 0x4b95db5d4b99bd25ULL
,
299 0x92d3fda169812fc0ULL
, 0xfb1a4a9a90660bb6ULL
, 0x730c196946a4b9b2ULL
,
300 0x81e289aa7f49da68ULL
, 0x64669a0f83b1a05fULL
, 0x27b3ff7d9644f48bULL
,
301 0xcc6b615c8db675b3ULL
, 0x674f20b9bcebbe95ULL
, 0x6f31238275655982ULL
,
302 0x5ae488713e45cf05ULL
, 0xbf619f9954c21157ULL
, 0xeabac46040a8eae9ULL
,
303 0x454c6fe9f2c0c1cdULL
, 0x419cf6496412691cULL
, 0xd3dc3bef265b0f70ULL
,
304 0x6d0e60f5c3578a9eULL
307 static const u64 sbox4
[256] = {
308 0x5b0e608526323c55ULL
, 0x1a46c1a9fa1b59f5ULL
, 0xa9e245a17c4c8ffaULL
,
309 0x65ca5159db2955d7ULL
, 0x05db0a76ce35afc2ULL
, 0x81eac77ea9113d45ULL
,
310 0x528ef88ab6ac0a0dULL
, 0xa09ea253597be3ffULL
, 0x430ddfb3ac48cd56ULL
,
311 0xc4b3a67af45ce46fULL
, 0x4ececfd8fbe2d05eULL
, 0x3ef56f10b39935f0ULL
,
312 0x0b22d6829cd619c6ULL
, 0x17fd460a74df2069ULL
, 0x6cf8cc8e8510ed40ULL
,
313 0xd6c824bf3a6ecaa7ULL
, 0x61243d581a817049ULL
, 0x048bacb6bbc163a2ULL
,
314 0xd9a38ac27d44cc32ULL
, 0x7fddff5baaf410abULL
, 0xad6d495aa804824bULL
,
315 0xe1a6a74f2d8c9f94ULL
, 0xd4f7851235dee8e3ULL
, 0xfd4b7f886540d893ULL
,
316 0x247c20042aa4bfdaULL
, 0x096ea1c517d1327cULL
, 0xd56966b4361a6685ULL
,
317 0x277da5c31221057dULL
, 0x94d59893a43acff7ULL
, 0x64f0c51ccdc02281ULL
,
318 0x3d33bcc4ff6189dbULL
, 0xe005cb184ce66af1ULL
, 0xff5ccd1d1db99beaULL
,
319 0xb0b854a7fe42980fULL
, 0x7bd46a6a718d4b9fULL
, 0xd10fa8cc22a5fd8cULL
,
320 0xd31484952be4bd31ULL
, 0xc7fa975fcb243847ULL
, 0x4886ed1e5846c407ULL
,
321 0x28cddb791eb70b04ULL
, 0xc2b00be2f573417fULL
, 0x5c9590452180f877ULL
,
322 0x7a6bddfff370eb00ULL
, 0xce509e38d6d9d6a4ULL
, 0xebeb0f00647fa702ULL
,
323 0x1dcc06cf76606f06ULL
, 0xe4d9f28ba286ff0aULL
, 0xd85a305dc918c262ULL
,
324 0x475b1d8732225f54ULL
, 0x2d4fb51668ccb5feULL
, 0xa679b9d9d72bba20ULL
,
325 0x53841c0d912d43a5ULL
, 0x3b7eaa48bf12a4e8ULL
, 0x781e0e47f22f1ddfULL
,
326 0xeff20ce60ab50973ULL
, 0x20d261d19dffb742ULL
, 0x16a12b03062a2e39ULL
,
327 0x1960eb2239650495ULL
, 0x251c16fed50eb8b8ULL
, 0x9ac0c330f826016eULL
,
328 0xed152665953e7671ULL
, 0x02d63194a6369570ULL
, 0x5074f08394b1c987ULL
,
329 0x70ba598c90b25ce1ULL
, 0x794a15810b9742f6ULL
, 0x0d5925e9fcaf8c6cULL
,
330 0x3067716cd868744eULL
, 0x910ab077e8d7731bULL
, 0x6a61bbdb5ac42f61ULL
,
331 0x93513efbf0851567ULL
, 0xf494724b9e83e9d5ULL
, 0xe887e1985c09648dULL
,
332 0x34b1d3c675370cfdULL
, 0xdc35e433bc0d255dULL
, 0xd0aab84234131be0ULL
,
333 0x08042a50b48b7eafULL
, 0x9997c4ee44a3ab35ULL
, 0x829a7b49201799d0ULL
,
334 0x263b8307b7c54441ULL
, 0x752f95f4fd6a6ca6ULL
, 0x927217402c08c6e5ULL
,
335 0x2a8ab754a795d9eeULL
, 0xa442f7552f72943dULL
, 0x2c31334e19781208ULL
,
336 0x4fa98d7ceaee6291ULL
, 0x55c3862f665db309ULL
, 0xbd0610175d53b1f3ULL
,
337 0x46fe6cb840413f27ULL
, 0x3fe03792df0cfa59ULL
, 0xcfe700372eb85e8fULL
,
338 0xa7be29e7adbce118ULL
, 0xe544ee5cde8431ddULL
, 0x8a781b1b41f1873eULL
,
339 0xa5c94c78a0d2f0e7ULL
, 0x39412e2877b60728ULL
, 0xa1265ef3afc9a62cULL
,
340 0xbcc2770c6a2506c5ULL
, 0x3ab66dd5dce1ce12ULL
, 0xe65499d04a675b37ULL
,
341 0x7d8f523481bfd216ULL
, 0x0f6f64fcec15f389ULL
, 0x74efbe618b5b13c8ULL
,
342 0xacdc82b714273e1dULL
, 0xdd40bfe003199d17ULL
, 0x37e99257e7e061f8ULL
,
343 0xfa52626904775aaaULL
, 0x8bbbf63a463d56f9ULL
, 0xf0013f1543a26e64ULL
,
344 0xa8307e9f879ec898ULL
, 0xcc4c27a4150177ccULL
, 0x1b432f2cca1d3348ULL
,
345 0xde1d1f8f9f6fa013ULL
, 0x606602a047a7ddd6ULL
, 0xd237ab64cc1cb2c7ULL
,
346 0x9b938e7225fcd1d3ULL
, 0xec4e03708e0ff476ULL
, 0xfeb2fbda3d03c12dULL
,
347 0xae0bced2ee43889aULL
, 0x22cb8923ebfb4f43ULL
, 0x69360d013cf7396dULL
,
348 0x855e3602d2d4e022ULL
, 0x073805bad01f784cULL
, 0x33e17a133852f546ULL
,
349 0xdf4874058ac7b638ULL
, 0xba92b29c678aa14aULL
, 0x0ce89fc76cfaadcdULL
,
350 0x5f9d4e0908339e34ULL
, 0xf1afe9291f5923b9ULL
, 0x6e3480f60f4a265fULL
,
351 0xeebf3a2ab29b841cULL
, 0xe21938a88f91b4adULL
, 0x57dfeff845c6d3c3ULL
,
352 0x2f006b0bf62caaf2ULL
, 0x62f479ef6f75ee78ULL
, 0x11a55ad41c8916a9ULL
,
353 0xf229d29084fed453ULL
, 0x42f1c27b16b000e6ULL
, 0x2b1f76749823c074ULL
,
354 0x4b76eca3c2745360ULL
, 0x8c98f463b91691bdULL
, 0x14bcc93cf1ade66aULL
,
355 0x8885213e6d458397ULL
, 0x8e177df0274d4711ULL
, 0xb49b73b5503f2951ULL
,
356 0x10168168c3f96b6bULL
, 0x0e3d963b63cab0aeULL
, 0x8dfc4b5655a1db14ULL
,
357 0xf789f1356e14de5cULL
, 0x683e68af4e51dac1ULL
, 0xc9a84f9d8d4b0fd9ULL
,
358 0x3691e03f52a0f9d1ULL
, 0x5ed86e46e1878e80ULL
, 0x3c711a0e99d07150ULL
,
359 0x5a0865b20c4e9310ULL
, 0x56fbfc1fe4f0682eULL
, 0xea8d5de3105edf9bULL
,
360 0x71abfdb12379187aULL
, 0x2eb99de1bee77b9cULL
, 0x21ecc0ea33cf4523ULL
,
361 0x59a4d7521805c7a1ULL
, 0x3896f5eb56ae7c72ULL
, 0xaa638f3db18f75dcULL
,
362 0x9f39358dabe9808eULL
, 0xb7defa91c00b72acULL
, 0x6b5541fd62492d92ULL
,
363 0x6dc6dee8f92e4d5bULL
, 0x353f57abc4beea7eULL
, 0x735769d6da5690ceULL
,
364 0x0a234aa642391484ULL
, 0xf6f9508028f80d9dULL
, 0xb8e319a27ab3f215ULL
,
365 0x31ad9c1151341a4dULL
, 0x773c22a57bef5805ULL
, 0x45c7561a07968633ULL
,
366 0xf913da9e249dbe36ULL
, 0xda652d9b78a64c68ULL
, 0x4c27a97f3bc334efULL
,
367 0x76621220e66b17f4ULL
, 0x967743899acd7d0bULL
, 0xf3ee5bcae0ed6782ULL
,
368 0x409f753600c879fcULL
, 0x06d09a39b5926db6ULL
, 0x6f83aeb0317ac588ULL
,
369 0x01e6ca4a86381f21ULL
, 0x66ff3462d19f3025ULL
, 0x72207c24ddfd3bfbULL
,
370 0x4af6b6d3e2ece2ebULL
, 0x9c994dbec7ea08deULL
, 0x49ace597b09a8bc4ULL
,
371 0xb38c4766cf0797baULL
, 0x131b9373c57c2a75ULL
, 0xb1822cce61931e58ULL
,
372 0x9d7555b909ba1c0cULL
, 0x127fafdd937d11d2ULL
, 0x29da3badc66d92e4ULL
,
373 0xa2c1d57154c2ecbcULL
, 0x58c5134d82f6fe24ULL
, 0x1c3ae3515b62274fULL
,
374 0xe907c82e01cb8126ULL
, 0xf8ed091913e37fcbULL
, 0x3249d8f9c80046c9ULL
,
375 0x80cf9bede388fb63ULL
, 0x1881539a116cf19eULL
, 0x5103f3f76bd52457ULL
,
376 0x15b7e6f5ae47f7a8ULL
, 0xdbd7c6ded47e9ccfULL
, 0x44e55c410228bb1aULL
,
377 0xb647d4255edb4e99ULL
, 0x5d11882bb8aafc30ULL
, 0xf5098bbb29d3212aULL
,
378 0x8fb5ea14e90296b3ULL
, 0x677b942157dd025aULL
, 0xfb58e7c0a390acb5ULL
,
379 0x89d3674c83bd4a01ULL
, 0x9e2da4df4bf3b93bULL
, 0xfcc41e328cab4829ULL
,
380 0x03f38c96ba582c52ULL
, 0xcad1bdbd7fd85db2ULL
, 0xbbb442c16082ae83ULL
,
381 0xb95fe86ba5da9ab0ULL
, 0xb22e04673771a93fULL
, 0x845358c9493152d8ULL
,
382 0xbe2a488697b4541eULL
, 0x95a2dc2dd38e6966ULL
, 0xc02c11ac923c852bULL
,
383 0x2388b1990df2a87bULL
, 0x7c8008fa1b4f37beULL
, 0x1f70d0c84d54e503ULL
,
384 0x5490adec7ece57d4ULL
, 0x002b3c27d9063a3aULL
, 0x7eaea3848030a2bfULL
,
385 0xc602326ded2003c0ULL
, 0x83a7287d69a94086ULL
, 0xc57a5fcb30f57a8aULL
,
386 0xb56844e479ebe779ULL
, 0xa373b40f05dcbce9ULL
, 0xd71a786e88570ee2ULL
,
387 0x879cbacdbde8f6a0ULL
, 0x976ad1bcc164a32fULL
, 0xab21e25e9666d78bULL
,
388 0x901063aae5e5c33cULL
, 0x9818b34448698d90ULL
, 0xe36487ae3e1e8abbULL
,
389 0xafbdf931893bdcb4ULL
, 0x6345a0dc5fbbd519ULL
, 0x8628fe269b9465caULL
,
390 0x1e5d01603f9c51ecULL
, 0x4de44006a15049b7ULL
, 0xbf6c70e5f776cbb1ULL
,
391 0x411218f2ef552bedULL
, 0xcb0c0708705a36a3ULL
, 0xe74d14754f986044ULL
,
392 0xcd56d9430ea8280eULL
, 0xc12591d7535f5065ULL
, 0xc83223f1720aef96ULL
,
393 0xc3a0396f7363a51fULL
397 static void tgr192_round(u64
* ra
, u64
* rb
, u64
* rc
, u64 x
, int mul
)
404 a
-= sbox1
[c
& 0xff] ^ sbox2
[(c
>> 16) & 0xff]
405 ^ sbox3
[(c
>> 32) & 0xff] ^ sbox4
[(c
>> 48) & 0xff];
406 b
+= sbox4
[(c
>> 8) & 0xff] ^ sbox3
[(c
>> 24) & 0xff]
407 ^ sbox2
[(c
>> 40) & 0xff] ^ sbox1
[(c
>> 56) & 0xff];
416 static void tgr192_pass(u64
* ra
, u64
* rb
, u64
* rc
, u64
* x
, int mul
)
422 tgr192_round(&a
, &b
, &c
, x
[0], mul
);
423 tgr192_round(&b
, &c
, &a
, x
[1], mul
);
424 tgr192_round(&c
, &a
, &b
, x
[2], mul
);
425 tgr192_round(&a
, &b
, &c
, x
[3], mul
);
426 tgr192_round(&b
, &c
, &a
, x
[4], mul
);
427 tgr192_round(&c
, &a
, &b
, x
[5], mul
);
428 tgr192_round(&a
, &b
, &c
, x
[6], mul
);
429 tgr192_round(&b
, &c
, &a
, x
[7], mul
);
437 static void tgr192_key_schedule(u64
* x
)
439 x
[0] -= x
[7] ^ 0xa5a5a5a5a5a5a5a5ULL
;
442 x
[3] -= x
[2] ^ ((~x
[1]) << 19);
445 x
[6] -= x
[5] ^ ((~x
[4]) >> 23);
448 x
[1] -= x
[0] ^ ((~x
[7]) << 19);
451 x
[4] -= x
[3] ^ ((~x
[2]) >> 23);
454 x
[7] -= x
[6] ^ 0x0123456789abcdefULL
;
459 * Transform the message DATA which consists of 512 bytes (8 words)
462 static void tgr192_transform(struct tgr192_ctx
*tctx
, const u8
* data
)
464 u64 a
, b
, c
, aa
, bb
, cc
;
468 for (i
= 0; i
< 8; i
++)
469 x
[i
] = get_unaligned_le64(data
+ i
* sizeof(__le64
));
476 tgr192_pass(&a
, &b
, &c
, x
, 5);
477 tgr192_key_schedule(x
);
478 tgr192_pass(&c
, &a
, &b
, x
, 7);
479 tgr192_key_schedule(x
);
480 tgr192_pass(&b
, &c
, &a
, x
, 9);
493 static int tgr192_init(struct shash_desc
*desc
)
495 struct tgr192_ctx
*tctx
= shash_desc_ctx(desc
);
497 tctx
->a
= 0x0123456789abcdefULL
;
498 tctx
->b
= 0xfedcba9876543210ULL
;
499 tctx
->c
= 0xf096a5b4c3b2e187ULL
;
507 /* Update the message digest with the contents
508 * of INBUF with length INLEN. */
509 static int tgr192_update(struct shash_desc
*desc
, const u8
*inbuf
,
512 struct tgr192_ctx
*tctx
= shash_desc_ctx(desc
);
514 if (tctx
->count
== 64) { /* flush the buffer */
515 tgr192_transform(tctx
, tctx
->hash
);
523 for (; len
&& tctx
->count
< 64; len
--) {
524 tctx
->hash
[tctx
->count
++] = *inbuf
++;
526 tgr192_update(desc
, NULL
, 0);
534 tgr192_transform(tctx
, inbuf
);
540 for (; len
&& tctx
->count
< 64; len
--) {
541 tctx
->hash
[tctx
->count
++] = *inbuf
++;
549 /* The routine terminates the computation */
550 static int tgr192_final(struct shash_desc
*desc
, u8
* out
)
552 struct tgr192_ctx
*tctx
= shash_desc_ctx(desc
);
553 __be64
*dst
= (__be64
*)out
;
558 tgr192_update(desc
, NULL
, 0); /* flush */
562 if ((lsb
= t
<< 6) < t
) { /* multiply by 64 to make a byte count */
567 if ((lsb
= t
+ tctx
->count
) < t
) { /* add the count */
571 if ((lsb
= t
<< 3) < t
) { /* multiply by 8 to make a bit count */
576 if (tctx
->count
< 56) { /* enough room */
577 tctx
->hash
[tctx
->count
++] = 0x01; /* pad */
578 while (tctx
->count
< 56) {
579 tctx
->hash
[tctx
->count
++] = 0; /* pad */
581 } else { /* need one extra block */
582 tctx
->hash
[tctx
->count
++] = 0x01; /* pad character */
583 while (tctx
->count
< 64) {
584 tctx
->hash
[tctx
->count
++] = 0;
586 tgr192_update(desc
, NULL
, 0); /* flush */
587 memset(tctx
->hash
, 0, 56); /* fill next block with zeroes */
589 /* append the 64 bit count */
590 le32p
= (__le32
*)&tctx
->hash
[56];
591 le32p
[0] = cpu_to_le32(lsb
);
592 le32p
[1] = cpu_to_le32(msb
);
594 tgr192_transform(tctx
, tctx
->hash
);
596 be64p
= (__be64
*)tctx
->hash
;
597 dst
[0] = be64p
[0] = cpu_to_be64(tctx
->a
);
598 dst
[1] = be64p
[1] = cpu_to_be64(tctx
->b
);
599 dst
[2] = be64p
[2] = cpu_to_be64(tctx
->c
);
604 static int tgr160_final(struct shash_desc
*desc
, u8
* out
)
608 tgr192_final(desc
, D
);
609 memcpy(out
, D
, TGR160_DIGEST_SIZE
);
610 memzero_explicit(D
, TGR192_DIGEST_SIZE
);
615 static int tgr128_final(struct shash_desc
*desc
, u8
* out
)
619 tgr192_final(desc
, D
);
620 memcpy(out
, D
, TGR128_DIGEST_SIZE
);
621 memzero_explicit(D
, TGR192_DIGEST_SIZE
);
626 static struct shash_alg tgr_algs
[3] = { {
627 .digestsize
= TGR192_DIGEST_SIZE
,
629 .update
= tgr192_update
,
630 .final
= tgr192_final
,
631 .descsize
= sizeof(struct tgr192_ctx
),
633 .cra_name
= "tgr192",
634 .cra_driver_name
= "tgr192-generic",
635 .cra_blocksize
= TGR192_BLOCK_SIZE
,
636 .cra_module
= THIS_MODULE
,
639 .digestsize
= TGR160_DIGEST_SIZE
,
641 .update
= tgr192_update
,
642 .final
= tgr160_final
,
643 .descsize
= sizeof(struct tgr192_ctx
),
645 .cra_name
= "tgr160",
646 .cra_driver_name
= "tgr160-generic",
647 .cra_blocksize
= TGR192_BLOCK_SIZE
,
648 .cra_module
= THIS_MODULE
,
651 .digestsize
= TGR128_DIGEST_SIZE
,
653 .update
= tgr192_update
,
654 .final
= tgr128_final
,
655 .descsize
= sizeof(struct tgr192_ctx
),
657 .cra_name
= "tgr128",
658 .cra_driver_name
= "tgr128-generic",
659 .cra_blocksize
= TGR192_BLOCK_SIZE
,
660 .cra_module
= THIS_MODULE
,
664 static int __init
tgr192_mod_init(void)
666 return crypto_register_shashes(tgr_algs
, ARRAY_SIZE(tgr_algs
));
669 static void __exit
tgr192_mod_fini(void)
671 crypto_unregister_shashes(tgr_algs
, ARRAY_SIZE(tgr_algs
));
674 MODULE_ALIAS_CRYPTO("tgr192");
675 MODULE_ALIAS_CRYPTO("tgr160");
676 MODULE_ALIAS_CRYPTO("tgr128");
678 subsys_initcall(tgr192_mod_init
);
679 module_exit(tgr192_mod_fini
);
681 MODULE_LICENSE("GPL");
682 MODULE_DESCRIPTION("Tiger Message Digest Algorithm");