1/* 2 3PKZIP Kernels for Hashcat (c) 2018, European Union 4 5PKZIP Kernels for Hashcat has been developed by the Joint Research Centre of the European Commission. 6It is released as open source software under the MIT License. 7 8PKZIP Kernels for Hashcat makes use of a primary external components, which continue to be subject 9to the terms and conditions stipulated in the respective licences they have been released under. These 10external components include, but are not necessarily limited to, the following: 11 12----- 13 141. Hashcat: MIT License 15 16Copyright (c) 2015-2018 Jens Steube 17 18Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 19associated documentation files (the "Software"), to deal in the Software without restriction, including 20without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 21copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to 22the following conditions: 23 24The above copyright notice and this permission notice shall be included in all copies or substantial 25portions of the Software. 26 27THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 28LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 29NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 30WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 31SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 32 33----- 34 35The European Union disclaims all liability related to or arising out of the use made by third parties of 36any external components and dependencies which may be included with PKZIP Kernels for Hashcat. 37 38----- 39 40The MIT License 41 42Copyright (c) 2018, EUROPEAN UNION 43 44Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 45documentation files (the "Software"), to deal in the Software without restriction, including without 46limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 47the Software, and to permit persons to whom the Software is furnished to do so, subject to the following 48conditions: 49 50The above copyright notice and this permission notice shall be included in all copies or substantial 51portions of the Software. 52 53THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 54LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 55NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 56WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 57SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 58 59Author: Sein Coray 60Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp5g= 61 62*/ 63 64#include "inc_vendor.h" 65#include "inc_types.h" 66#include "inc_platform.cl" 67#include "inc_common.cl" 68#include "inc_simd.cl" 69 70typedef struct pkzip_extra 71{ 72 u32 buf[2]; 73 u32 len; 74 75} pkzip_extra_t; 76 77#define MSB(x) ((x) >> 24) 78#define CRC32(x,c,t) (((x) >> 8) ^ (t)[((x) ^ (c)) & 0xff]) 79#define INVCRC32(x,c,t) (((x) << 8) ^ (t)[(x) >> 24] ^ ((c) & 0xff)) 80#define INVCONST 0xd94fa8cd 81#define KEY0INIT 0x12345678 82#define KEY1INIT 0x23456789 83#define KEY2INIT 0x34567890 84 85#define inv_update_key012(k0,k1,k2,c,t) \ 86 (k2) = INVCRC32 ((k2), MSB (k1), (t)); \ 87 (k1) = ((k1) - 1) * INVCONST - ((k0) & 0xff); \ 88 (k0) = INVCRC32 ((k0), (c), (t)); 89 90CONSTANT_VK u32a crc32tab[256] = 91{ 92 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 93 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 94 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 95 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 96 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 97 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 98 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 99 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 100 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 101 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 102 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 103 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 104 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 105 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 106 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 107 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 108 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 109 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 110 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 111 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 112 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 113 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 114 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 115 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 116 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 117 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 118 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 119 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 120 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 121 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 122 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 123 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 124 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 125 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 126 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 127 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 128 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 129 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 130 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 131 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 132 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 133 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 134 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 135 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 136 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 137 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 138 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 139 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 140 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 141 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 142 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 143 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 144 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 145 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 146 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 147 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 148 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 149 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 150 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 151 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 152 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 153 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 154 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 155 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 156}; 157 158CONSTANT_VK u32a icrc32tab[256] = 159{ 160 0x00000000, 0xdb710641, 0x6d930ac3, 0xb6e20c82, 161 0xdb261586, 0x005713c7, 0xb6b51f45, 0x6dc41904, 162 0x6d3d2d4d, 0xb64c2b0c, 0x00ae278e, 0xdbdf21cf, 163 0xb61b38cb, 0x6d6a3e8a, 0xdb883208, 0x00f93449, 164 0xda7a5a9a, 0x010b5cdb, 0xb7e95059, 0x6c985618, 165 0x015c4f1c, 0xda2d495d, 0x6ccf45df, 0xb7be439e, 166 0xb74777d7, 0x6c367196, 0xdad47d14, 0x01a57b55, 167 0x6c616251, 0xb7106410, 0x01f26892, 0xda836ed3, 168 0x6f85b375, 0xb4f4b534, 0x0216b9b6, 0xd967bff7, 169 0xb4a3a6f3, 0x6fd2a0b2, 0xd930ac30, 0x0241aa71, 170 0x02b89e38, 0xd9c99879, 0x6f2b94fb, 0xb45a92ba, 171 0xd99e8bbe, 0x02ef8dff, 0xb40d817d, 0x6f7c873c, 172 0xb5ffe9ef, 0x6e8eefae, 0xd86ce32c, 0x031de56d, 173 0x6ed9fc69, 0xb5a8fa28, 0x034af6aa, 0xd83bf0eb, 174 0xd8c2c4a2, 0x03b3c2e3, 0xb551ce61, 0x6e20c820, 175 0x03e4d124, 0xd895d765, 0x6e77dbe7, 0xb506dda6, 176 0xdf0b66ea, 0x047a60ab, 0xb2986c29, 0x69e96a68, 177 0x042d736c, 0xdf5c752d, 0x69be79af, 0xb2cf7fee, 178 0xb2364ba7, 0x69474de6, 0xdfa54164, 0x04d44725, 179 0x69105e21, 0xb2615860, 0x048354e2, 0xdff252a3, 180 0x05713c70, 0xde003a31, 0x68e236b3, 0xb39330f2, 181 0xde5729f6, 0x05262fb7, 0xb3c42335, 0x68b52574, 182 0x684c113d, 0xb33d177c, 0x05df1bfe, 0xdeae1dbf, 183 0xb36a04bb, 0x681b02fa, 0xdef90e78, 0x05880839, 184 0xb08ed59f, 0x6bffd3de, 0xdd1ddf5c, 0x066cd91d, 185 0x6ba8c019, 0xb0d9c658, 0x063bcada, 0xdd4acc9b, 186 0xddb3f8d2, 0x06c2fe93, 0xb020f211, 0x6b51f450, 187 0x0695ed54, 0xdde4eb15, 0x6b06e797, 0xb077e1d6, 188 0x6af48f05, 0xb1858944, 0x076785c6, 0xdc168387, 189 0xb1d29a83, 0x6aa39cc2, 0xdc419040, 0x07309601, 190 0x07c9a248, 0xdcb8a409, 0x6a5aa88b, 0xb12baeca, 191 0xdcefb7ce, 0x079eb18f, 0xb17cbd0d, 0x6a0dbb4c, 192 0x6567cb95, 0xbe16cdd4, 0x08f4c156, 0xd385c717, 193 0xbe41de13, 0x6530d852, 0xd3d2d4d0, 0x08a3d291, 194 0x085ae6d8, 0xd32be099, 0x65c9ec1b, 0xbeb8ea5a, 195 0xd37cf35e, 0x080df51f, 0xbeeff99d, 0x659effdc, 196 0xbf1d910f, 0x646c974e, 0xd28e9bcc, 0x09ff9d8d, 197 0x643b8489, 0xbf4a82c8, 0x09a88e4a, 0xd2d9880b, 198 0xd220bc42, 0x0951ba03, 0xbfb3b681, 0x64c2b0c0, 199 0x0906a9c4, 0xd277af85, 0x6495a307, 0xbfe4a546, 200 0x0ae278e0, 0xd1937ea1, 0x67717223, 0xbc007462, 201 0xd1c46d66, 0x0ab56b27, 0xbc5767a5, 0x672661e4, 202 0x67df55ad, 0xbcae53ec, 0x0a4c5f6e, 0xd13d592f, 203 0xbcf9402b, 0x6788466a, 0xd16a4ae8, 0x0a1b4ca9, 204 0xd098227a, 0x0be9243b, 0xbd0b28b9, 0x667a2ef8, 205 0x0bbe37fc, 0xd0cf31bd, 0x662d3d3f, 0xbd5c3b7e, 206 0xbda50f37, 0x66d40976, 0xd03605f4, 0x0b4703b5, 207 0x66831ab1, 0xbdf21cf0, 0x0b101072, 0xd0611633, 208 0xba6cad7f, 0x611dab3e, 0xd7ffa7bc, 0x0c8ea1fd, 209 0x614ab8f9, 0xba3bbeb8, 0x0cd9b23a, 0xd7a8b47b, 210 0xd7518032, 0x0c208673, 0xbac28af1, 0x61b38cb0, 211 0x0c7795b4, 0xd70693f5, 0x61e49f77, 0xba959936, 212 0x6016f7e5, 0xbb67f1a4, 0x0d85fd26, 0xd6f4fb67, 213 0xbb30e263, 0x6041e422, 0xd6a3e8a0, 0x0dd2eee1, 214 0x0d2bdaa8, 0xd65adce9, 0x60b8d06b, 0xbbc9d62a, 215 0xd60dcf2e, 0x0d7cc96f, 0xbb9ec5ed, 0x60efc3ac, 216 0xd5e91e0a, 0x0e98184b, 0xb87a14c9, 0x630b1288, 217 0x0ecf0b8c, 0xd5be0dcd, 0x635c014f, 0xb82d070e, 218 0xb8d43347, 0x63a53506, 0xd5473984, 0x0e363fc5, 219 0x63f226c1, 0xb8832080, 0x0e612c02, 0xd5102a43, 220 0x0f934490, 0xd4e242d1, 0x62004e53, 0xb9714812, 221 0xd4b55116, 0x0fc45757, 0xb9265bd5, 0x62575d94, 222 0x62ae69dd, 0xb9df6f9c, 0x0f3d631e, 0xd44c655f, 223 0xb9887c5b, 0x62f97a1a, 0xd41b7698, 0x0f6a70d9, 224}; 225 226CONSTANT_VK u32a lsbk0[256] = 227{ 228 0x00, 0x56, 0xac, 0x21, 0x77, 0xcd, 0x42, 0x98, 229 0xee, 0x0d, 0x63, 0xb9, 0x2e, 0x84, 0xda, 0x4f, 230 0xa5, 0xfb, 0x1a, 0x70, 0xc6, 0x3b, 0x91, 0xe7, 231 0x06, 0x5c, 0xb2, 0x27, 0x7d, 0xd3, 0x48, 0x9e, 232 0xf4, 0x13, 0x69, 0xbf, 0x34, 0x8a, 0xe0, 0x55, 233 0xab, 0x20, 0x76, 0xcc, 0x41, 0x97, 0xed, 0x0c, 234 0x62, 0xb8, 0x2d, 0x83, 0xd9, 0x4e, 0xa4, 0xfa, 235 0x19, 0x6f, 0xc5, 0x3a, 0x90, 0xe6, 0x05, 0x5b, 236 0xb1, 0x26, 0x7c, 0xd2, 0x47, 0x9d, 0xf3, 0x12, 237 0x68, 0xbe, 0x33, 0x89, 0xdf, 0x54, 0xaa, 0x1f, 238 0x75, 0xcb, 0x40, 0x96, 0xec, 0x0b, 0x61, 0xb7, 239 0x2c, 0x82, 0xd8, 0x4d, 0xa3, 0xf9, 0x18, 0x6e, 240 0xc4, 0x39, 0x8f, 0xe5, 0x04, 0x5a, 0xb0, 0x25, 241 0x7b, 0xd1, 0x46, 0x9c, 0xf2, 0x11, 0x67, 0xbd, 242 0x32, 0x88, 0xde, 0x53, 0xa9, 0xff, 0x1e, 0x74, 243 0xca, 0x3f, 0x95, 0xeb, 0x0a, 0x60, 0xb6, 0x2b, 244 0x81, 0xd7, 0x4c, 0xa2, 0xf8, 0x17, 0x6d, 0xc3, 245 0x38, 0x8e, 0xe4, 0x03, 0x59, 0xaf, 0x24, 0x7a, 246 0xd0, 0x45, 0x9b, 0xf1, 0x10, 0x66, 0xbc, 0x31, 247 0x87, 0xdd, 0x52, 0xa8, 0xfe, 0x1d, 0x73, 0xc9, 248 0x3e, 0x94, 0xea, 0x09, 0x5f, 0xb5, 0x2a, 0x80, 249 0xd6, 0x4b, 0xa1, 0xf7, 0x16, 0x6c, 0xc2, 0x37, 250 0x8d, 0xe3, 0x02, 0x58, 0xae, 0x23, 0x79, 0xcf, 251 0x44, 0x9a, 0xf0, 0x0f, 0x65, 0xbb, 0x30, 0x86, 252 0xdc, 0x51, 0xa7, 0xfd, 0x1c, 0x72, 0xc8, 0x3d, 253 0x93, 0xe9, 0x08, 0x5e, 0xb4, 0x29, 0x7f, 0xd5, 254 0x4a, 0xa0, 0xf6, 0x15, 0x6b, 0xc1, 0x36, 0x8c, 255 0xe2, 0x01, 0x57, 0xad, 0x22, 0x78, 0xce, 0x43, 256 0x99, 0xef, 0x0e, 0x64, 0xba, 0x2f, 0x85, 0xdb, 257 0x50, 0xa6, 0xfc, 0x1b, 0x71, 0xc7, 0x3c, 0x92, 258 0xe8, 0x07, 0x5d, 0xb3, 0x28, 0x7e, 0xd4, 0x49, 259 0x9f, 0xf5, 0x14, 0x6a, 0xc0, 0x35, 0x8b, 0xe1 260}; 261 262CONSTANT_VK int lsbk0_count0[256] = 263{ 264 0, 2, 3, 3, 4, 6, 6, 7, 265 8, 9, 11, 12, 12, 13, 15, 15, 266 16, 17, 18, 20, 21, 21, 22, 24, 267 25, 26, 27, 27, 29, 30, 30, 31, 268 33, 34, 35, 36, 36, 38, 39, 39, 269 40, 41, 42, 43, 44, 44, 46, 47, 270 48, 49, 50, 50, 52, 53, 53, 54, 271 56, 57, 58, 59, 59, 61, 62, 63, 272 64, 65, 66, 67, 68, 68, 70, 71, 273 72, 73, 74, 75, 76, 77, 77, 79, 274 79, 80, 81, 82, 83, 84, 85, 86, 275 88, 88, 89, 90, 91, 92, 93, 94, 276 95, 97, 97, 98, 99, 100, 101, 103, 277 103, 104, 105, 106, 107, 108, 109, 110, 278 112, 112, 113, 114, 115, 116, 117, 118, 279 119, 121, 121, 122, 123, 124, 126, 127, 280 127, 128, 130, 130, 131, 132, 133, 135, 281 136, 136, 137, 139, 140, 141, 142, 142, 282 144, 145, 145, 146, 148, 149, 150, 151, 283 151, 152, 154, 154, 155, 156, 157, 159, 284 160, 160, 161, 163, 164, 165, 166, 166, 285 168, 169, 169, 170, 172, 173, 174, 175, 286 175, 177, 178, 179, 180, 181, 182, 183, 287 184, 184, 186, 187, 188, 189, 190, 191, 288 192, 193, 193, 195, 196, 197, 198, 199, 289 200, 201, 202, 203, 204, 205, 206, 207, 290 208, 208, 210, 211, 212, 213, 214, 215, 291 216, 217, 218, 220, 220, 221, 222, 223, 292 224, 225, 226, 227, 229, 229, 230, 231, 293 232, 233, 234, 235, 236, 238, 238, 239, 294 240, 241, 243, 244, 244, 245, 247, 247, 295 248, 249, 250, 252, 253, 253, 254, 255 296}; 297 298CONSTANT_VK int lsbk0_count1[256] = 299{ 300 2, 3, 3, 4, 6, 6, 7, 8, 301 9, 11, 12, 12, 13, 15, 15, 16, 302 17, 18, 20, 21, 21, 22, 24, 25, 303 26, 27, 27, 29, 30, 30, 31, 33, 304 34, 35, 36, 36, 38, 39, 39, 40, 305 41, 42, 43, 44, 44, 46, 47, 48, 306 49, 50, 50, 52, 53, 53, 54, 56, 307 57, 58, 59, 59, 61, 62, 63, 64, 308 65, 66, 67, 68, 68, 70, 71, 72, 309 73, 74, 75, 76, 77, 77, 79, 79, 310 80, 81, 82, 83, 84, 85, 86, 88, 311 88, 89, 90, 91, 92, 93, 94, 95, 312 97, 97, 98, 99, 100, 101, 103, 103, 313 104, 105, 106, 107, 108, 109, 110, 112, 314 112, 113, 114, 115, 116, 117, 118, 119, 315 121, 121, 122, 123, 124, 126, 127, 127, 316 128, 130, 130, 131, 132, 133, 135, 136, 317 136, 137, 139, 140, 141, 142, 142, 144, 318 145, 145, 146, 148, 149, 150, 151, 151, 319 152, 154, 154, 155, 156, 157, 159, 160, 320 160, 161, 163, 164, 165, 166, 166, 168, 321 169, 169, 170, 172, 173, 174, 175, 175, 322 177, 178, 179, 180, 181, 182, 183, 184, 323 184, 186, 187, 188, 189, 190, 191, 192, 324 193, 193, 195, 196, 197, 198, 199, 200, 325 201, 202, 203, 204, 205, 206, 207, 208, 326 208, 210, 211, 212, 213, 214, 215, 216, 327 217, 218, 220, 220, 221, 222, 223, 224, 328 225, 226, 227, 229, 229, 230, 231, 232, 329 233, 234, 235, 236, 238, 238, 239, 240, 330 241, 243, 244, 244, 245, 247, 247, 248, 331 249, 250, 252, 253, 253, 254, 255, 256 332}; 333 334DECLSPEC int derivelast6bytes (const u32x k0, const u32x k1, const u32x k2, u32 *password, LOCAL_AS u32 *l_crc32tab, LOCAL_AS u32 *l_icrc32tab, LOCAL_AS u32 *l_lsbk0, LOCAL_AS int *l_lsbk0_count0, LOCAL_AS int *l_lsbk0_count1) 335{ 336 // step 1 337 const u32 k2_1 = INVCRC32 (k2, (k1 >> 24), l_icrc32tab); 338 const u32 k1_1 = (k1 - 1) * INVCONST - (k0 & 0xff); 339 const u32 k2_2 = INVCRC32 (k2_1, (k1_1 >> 24), l_icrc32tab); 340 341 // step 2 342 u32 k2_3 = INVCRC32 (k2_2, 0, l_icrc32tab); 343 u32 k2_4 = INVCRC32 (k2_3, 0, l_icrc32tab); 344 u32 k2_5 = INVCRC32 (k2_4, 0, l_icrc32tab); 345 346 // step 3 347 const u32 k1_5 = ((u32)((0x90) ^ l_icrc32tab[(k2_5 >> 24)])) << 24; 348 k2_5 = CRC32 (KEY2INIT, (k1_5 >> 24), l_crc32tab); 349 const u32 k1_4 = ((u32)((k2_5 & 0xFF) ^ l_icrc32tab[(k2_4 >> 24)])) << 24; 350 k2_4 = CRC32 (k2_5 , (k1_4 >> 24), l_crc32tab); 351 const u32 k1_3 = ((u32)((k2_4 & 0xFF) ^ l_icrc32tab[(k2_3 >> 24)])) << 24; 352 k2_3 = CRC32 (k2_4 , (k1_3 >> 24), l_crc32tab); 353 const u32 k1_2 = ((u32)((k2_3 & 0xFF) ^ l_icrc32tab[(k2_2 >> 24)])) << 24; 354 355 // step 5.2 356 357 #define IDX(x) ((x) & 0xff) 358 359 const u32 rhs_step1_0 = (k1_1 - 1) * INVCONST; 360 361 u32 diff0 = ((rhs_step1_0 - 1) * INVCONST - (k1_3 & 0xff000000)) >> 24; 362 363 for (int c0 = 0; c0 < 2; c0++, diff0--) 364 { 365 for (int i0 = l_lsbk0_count0[IDX (diff0)]; i0 < l_lsbk0_count1[IDX (diff0)]; i0++) 366 { 367 if (((rhs_step1_0 - l_lsbk0[i0]) >> 24) != (k1_2 >> 24)) continue; 368 369 const u32 rhs_step1_1 = (rhs_step1_0 - l_lsbk0[i0] - 1) * INVCONST; 370 371 u32 diff1 = ((rhs_step1_1 - 1) * INVCONST - (k1_4 & 0xff000000)) >> 24; 372 373 for (int c1 = 0; c1 < 2; c1++, diff1--) 374 { 375 for (int i1 = l_lsbk0_count0[IDX (diff1)]; i1 < l_lsbk0_count1[IDX (diff1)]; i1++) 376 { 377 if (((rhs_step1_1 - l_lsbk0[i1]) >> 24) != (k1_3 >> 24)) continue; 378 379 const u32 rhs_step1_2 = (rhs_step1_1 - l_lsbk0[i1] - 1) * INVCONST; 380 381 u32 diff2 = ((rhs_step1_2 - 1) * INVCONST - (k1_5 & 0xff000000)) >> 24; 382 383 for (int c2 = 0; c2 < 2; c2++, diff2--) 384 { 385 for (int i2 = l_lsbk0_count0[IDX (diff2)]; i2 < l_lsbk0_count1[IDX (diff2)]; i2++) 386 { 387 if (((rhs_step1_2 - l_lsbk0[i2]) >> 24) != (k1_4 >> 24)) continue; 388 389 const u32 rhs_step1_3 = (rhs_step1_2 - l_lsbk0[i2] - 1) * INVCONST; 390 391 u32 diff3 = ((rhs_step1_3 - 1) * INVCONST - (0x23000000)) >> 24; 392 393 for (int c3 = 0; c3 < 2; c3++, diff3--) 394 { 395 for (int i3 = l_lsbk0_count0[IDX (diff3)]; i3 < l_lsbk0_count1[IDX (diff3)]; i3++) 396 { 397 if (((rhs_step1_3 - l_lsbk0[i3]) >> 24) != (k1_5 >> 24)) continue; 398 399 const u32 rhs_step1_4 = (rhs_step1_3 - l_lsbk0[i3] - 1) * INVCONST; 400 401 u32 diff4 = ((rhs_step1_4 - 1) * INVCONST - (0x05000000)) >> 24; 402 403 for (int c4 = 0; c4 < 2; c4++, diff4--) 404 { 405 for (int i4 = l_lsbk0_count0[IDX (diff4)]; i4 < l_lsbk0_count1[IDX (diff4)]; i4++) 406 { 407 if ((rhs_step1_4 - l_lsbk0[i4]) != KEY1INIT) continue; 408 409 u32 kk; 410 411 u32 t5 = ((l_lsbk0[i0]) ^ l_icrc32tab[k0 >> 24]) & 0xff; 412 413 kk = INVCRC32 (k0, t5, l_icrc32tab); 414 415 u32 t4 = ((l_lsbk0[i1]) ^ l_icrc32tab[kk >> 24]) & 0xff; 416 417 kk = INVCRC32 (kk, t4, l_icrc32tab); 418 419 u32 t3 = ((l_lsbk0[i2]) ^ l_icrc32tab[kk >> 24]) & 0xff; 420 421 kk = INVCRC32 (kk, t3, l_icrc32tab); 422 423 u32 t2 = ((l_lsbk0[i3]) ^ l_icrc32tab[kk >> 24]) & 0xff; 424 425 kk = INVCRC32 (kk, t2, l_icrc32tab); 426 427 u32 t1 = ((l_lsbk0[i4]) ^ l_icrc32tab[kk >> 24]) & 0xff; 428 429 kk = INVCRC32 (kk, t1, l_icrc32tab); 430 431 u32 t0 = ((KEY0INIT) ^ l_icrc32tab[kk >> 24]) & 0xff; 432 433 if (INVCRC32 (kk, t0, l_icrc32tab) == KEY0INIT) 434 { 435 // found 436 437 password[0] = t0 << 0 438 | t1 << 8 439 | t2 << 16 440 | t3 << 24; 441 442 password[1] = t4 << 0 443 | t5 << 8; 444 445 return 1; 446 } 447 } 448 } 449 } 450 } 451 } 452 } 453 } 454 } 455 } 456 } 457 458 #undef IDX0 459 #undef IDX1 460 461 // not found 462 463 return 0; 464} 465 466KERNEL_FQ void m20510_sxx (KERN_ATTR_BASIC ()) 467{ 468 /** 469 * modifier 470 */ 471 472 const u64 gid = get_global_id (0); 473 const u64 lid = get_local_id (0); 474 const u64 lsz = get_local_size (0); 475 476 /** 477 * sbox, kbox 478 */ 479 480 LOCAL_VK u32 l_crc32tab[256]; 481 482 for (int i = lid; i < 256; i += lsz) 483 { 484 l_crc32tab[i] = crc32tab[i]; 485 } 486 487 LOCAL_VK u32 l_icrc32tab[256]; 488 489 for (int i = lid; i < 256; i += lsz) 490 { 491 l_icrc32tab[i] = icrc32tab[i]; 492 } 493 494 LOCAL_VK u32 l_lsbk0[256]; 495 496 for (int i = lid; i < 256; i += lsz) 497 { 498 l_lsbk0[i] = lsbk0[i]; 499 } 500 501 LOCAL_VK int l_lsbk0_count0[256]; 502 LOCAL_VK int l_lsbk0_count1[256]; 503 504 for (int i = lid; i < 256; i += lsz) 505 { 506 l_lsbk0_count0[i] = lsbk0_count0[i]; 507 l_lsbk0_count1[i] = lsbk0_count1[i]; 508 } 509 510 SYNC_THREADS (); 511 512 if (gid >= gid_max) return; 513 514 /** 515 * digest 516 */ 517 518 const u32 search[4] = 519 { 520 KEY0INIT, // static initial values 521 KEY1INIT, // should remain unchanged 522 KEY2INIT, 523 0 524 }; 525 526 /** 527 * reverse 528 */ 529 530 u32 prep0 = hc_swap32_S (digests_buf[DIGESTS_OFFSET].digest_buf[0]); 531 u32 prep1 = hc_swap32_S (digests_buf[DIGESTS_OFFSET].digest_buf[1]); 532 u32 prep2 = hc_swap32_S (digests_buf[DIGESTS_OFFSET].digest_buf[2]); 533 534 /** 535 * loop 536 */ 537 538 u32 pws_pw_len = pws[gid].pw_len; 539 540 u32x w[64] = { 0 }; 541 542 for (int i = 0, idx = 0; i < pws_pw_len; i += 4, idx += 1) 543 { 544 w[idx] = pws[gid].i[idx]; 545 } 546 547 for (u32 il_pos = 0; il_pos < il_cnt; il_pos += VECT_SIZE) 548 { 549 u32x key0 = prep0; 550 u32x key1 = prep1; 551 u32x key2 = prep2; 552 553 for (int pos = combs_buf[il_pos].pw_len - 1; pos >= 0; pos--) 554 { 555 const u32 t = hc_bfe_S (combs_buf[il_pos].i[pos / 4], (pos & 3) * 8, 8); 556 557 inv_update_key012 (key0, key1, key2, t, l_icrc32tab); 558 } 559 560 for (int pos = pws_pw_len - 1; pos >= 0; pos--) 561 { 562 const u32 t = hc_bfe_S (w[pos / 4], (pos & 3) * 8, 8); 563 564 inv_update_key012 (key0, key1, key2, t, l_icrc32tab); 565 } 566 567 u32 password[2]; 568 569 if (derivelast6bytes (key0, key1, key2, password, l_crc32tab, l_icrc32tab, l_lsbk0, l_lsbk0_count0, l_lsbk0_count1) == 1) 570 { 571 GLOBAL_AS pkzip_extra_t *pkzip_extra = (GLOBAL_AS pkzip_extra_t *) tmps; 572 573 pkzip_extra[gid].buf[0] = password[0]; 574 pkzip_extra[gid].buf[1] = password[1]; 575 576 pkzip_extra[gid].len = 6; 577 578 const u32x r0 = KEY0INIT; 579 const u32x r1 = KEY1INIT; 580 const u32x r2 = KEY2INIT; 581 const u32x r3 = 0; 582 583 COMPARE_S_SIMD (r0, r1, r2, r3); 584 } 585 } 586} 587 588KERNEL_FQ void m20510_mxx (KERN_ATTR_BASIC ()) 589{ 590 /** 591 * modifier 592 */ 593 594 const u64 gid = get_global_id (0); 595 const u64 lid = get_local_id (0); 596 const u64 lsz = get_local_size (0); 597 598 /** 599 * NOT AVAILABLE 600 */ 601} 602 603#undef MSB 604#undef CRC32 605#undef INVCRC32 606#undef INVCONST 607#undef KEY0INIT 608#undef KEY1INIT 609#undef KEY2INIT 610#undef inv_update_key012 611