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