Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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