1 /* 2 * This code, as well as the Edon-R algorithm itself are public domain. 3 */ 4 5 #include "fsys_zfs.h" 6 #include <string.h> 7 8 /* Specific algorithm definitions */ 9 #define EdonR224_DIGEST_SIZE 28 10 #define EdonR224_BLOCK_SIZE 64 11 #define EdonR256_DIGEST_SIZE 32 12 #define EdonR256_BLOCK_SIZE 64 13 #define EdonR384_DIGEST_SIZE 48 14 #define EdonR384_BLOCK_SIZE 128 15 #define EdonR512_DIGEST_SIZE 64 16 #define EdonR512_BLOCK_SIZE 128 17 18 static void 19 my_memset(void *ptr, int c, size_t n) 20 { 21 uint8_t *p; 22 size_t i; 23 24 for (i = 0; i < n; i++) 25 p[i] = c; 26 } 27 28 typedef struct { 29 uint32_t DoublePipe[32]; 30 uint8_t LastPart[EdonR256_BLOCK_SIZE * 2]; 31 } EdonRData256; 32 33 typedef struct { 34 uint64_t DoublePipe[32]; 35 uint8_t LastPart[EdonR512_BLOCK_SIZE * 2]; 36 } EdonRData512; 37 38 typedef struct { 39 size_t hashbitlen; 40 41 /* algorithm specific parameters */ 42 uint64_t bits_processed; 43 union { 44 EdonRData256 p256[1]; 45 EdonRData512 p512[1]; 46 } pipe[1]; 47 int unprocessed_bits; 48 } EdonRHashState; 49 50 #define rotl32(x,n) (((x) << n) | ((x) >> (32 - n))) 51 #define rotr32(x,n) (((x) >> n) | ((x) << (32 - n))) 52 53 #define rotl64(x,n) (((x) << n) | ((x) >> (64 - n))) 54 #define rotr64(x,n) (((x) >> n) | ((x) << (64 - n))) 55 56 /* EdonR224 initial double chaining pipe */ 57 static const uint32_t i224p2[16] = { 58 0x00010203ul, 0x04050607ul, 0x08090a0bul, 0x0c0d0e0ful, 59 0x10111213ul, 0x14151617ul, 0x18191a1bul, 0x1c1d1e1ful, 60 0x20212223ul, 0x24252627ul, 0x28292a2bul, 0x2c2d2e2ful, 61 0x30313233ul, 0x24353637ul, 0x38393a3bul, 0x3c3d3e3ful 62 }; 63 64 /* EdonR256 initial double chaining pipe */ 65 static const uint32_t i256p2[16] = { 66 0x40414243ul, 0x44454647ul, 0x48494a4bul, 0x4c4d4e4ful, 67 0x50515253ul, 0x54555657ul, 0x58595a5bul, 0x5c5d5e5ful, 68 0x60616263ul, 0x64656667ul, 0x68696a6bul, 0x6c6d6e6ful, 69 0x70717273ul, 0x74757677ul, 0x78797a7bul, 0x7c7d7e7ful 70 }; 71 72 /* EdonR384 initial double chaining pipe */ 73 static const uint64_t i384p2[16] = { 74 0x0001020304050607ull, 0x08090a0b0c0d0e0full, 75 0x1011121314151617ull, 0x18191a1b1c1d1e1full, 76 0x2021222324252627ull, 0x28292a2b2c2d2e2full, 77 0x3031323324353637ull, 0x38393a3b3c3d3e3full, 78 0x4041424344454647ull, 0x48494a4b4c4d4e4full, 79 0x5051525354555657ull, 0x58595a5b5c5d5e5full, 80 0x6061626364656667ull, 0x68696a6b6c6d6e6full, 81 0x7071727374757677ull, 0x78797a7b7c7d7e7full 82 }; 83 84 /* EdonR512 initial double chaining pipe */ 85 const uint64_t i512p2[16] = { 86 0x8081828384858687ull, 0x88898a8b8c8d8e8full, 87 0x9091929394959697ull, 0x98999a9b9c9d9e9full, 88 0xa0a1a2a3a4a5a6a7ull, 0xa8a9aaabacadaeafull, 89 0xb0b1b2b3b4b5b6b7ull, 0xb8b9babbbcbdbebfull, 90 0xc0c1c2c3c4c5c6c7ull, 0xc8c9cacbcccdcecfull, 91 0xd0d1d2d3d4d5d6d7ull, 0xd8d9dadbdcdddedfull, 92 0xe0e1e2e3e4e5e6e7ull, 0xe8e9eaebecedeeefull, 93 0xf0f1f2f3f4f5f6f7ull, 0xf8f9fafbfcfdfeffull 94 }; 95 96 #define hashState224(x) ((x)->pipe->p256) 97 #define hashState256(x) ((x)->pipe->p256) 98 #define hashState384(x) ((x)->pipe->p512) 99 #define hashState512(x) ((x)->pipe->p512) 100 101 #define Q256(x0, x1, x2, x3, x4, x5, x6, x7, \ 102 y0, y1, y2, y3, y4, y5, y6, y7, \ 103 z0, z1, z2, z3, z4, z5, z6, z7) \ 104 {\ 105 /* First Latin Square\ 106 0 7 1 3 2 4 6 5\ 107 4 1 7 6 3 0 5 2\ 108 7 0 4 2 5 3 1 6\ 109 1 4 0 5 6 2 7 3\ 110 2 3 6 7 1 5 0 4\ 111 5 2 3 1 7 6 4 0\ 112 3 6 5 0 4 7 2 1\ 113 6 5 2 4 0 1 3 7\ 114 */\ 115 t8 = x0 + x4;\ 116 t9 = x1 + x7;\ 117 t12 = t8 + t9;\ 118 t10 = x2 + x3;\ 119 t11 = x5 + x6;\ 120 t13 = t10 + t11;\ 121 t0 = 0xaaaaaaaa + t12 + x2;\ 122 t1 = t12 + x3;\ 123 t1 = rotl32((t1), 5);\ 124 t2 = t12 + x6;\ 125 t2 = rotl32((t2),11);\ 126 t3 = t13 + x7;\ 127 t3 = rotl32((t3),13);\ 128 t4 = x1 + t13;\ 129 t4 = rotl32((t4),17);\ 130 t5 = t8 + t10 + x5;\ 131 t5 = rotl32((t5),19);\ 132 t6 = x0 + t9 + t11;\ 133 t6 = rotl32((t6),29);\ 134 t7 = t13 +x4;\ 135 t7 = rotl32((t7),31);\ 136 \ 137 t16 = t0 ^ t4;\ 138 t17 = t1 ^ t7;\ 139 t18 = t2 ^ t3;\ 140 t19 = t5 ^ t6;\ 141 t8 = t3 ^ t19;\ 142 t9 = t2 ^ t19;\ 143 t10 = t18 ^ t5;\ 144 t11 = t16^ t1;\ 145 t12 = t16 ^ t7;\ 146 t13 = t17 ^ t6;\ 147 t14 = t18 ^ t4;\ 148 t15 = t0 ^ t17;\ 149 \ 150 /* Second Orthogonal Latin Square\ 151 0 4 2 3 1 6 5 7\ 152 7 6 3 2 5 4 1 0\ 153 5 3 1 6 0 2 7 4\ 154 1 0 5 4 3 7 2 6\ 155 2 1 0 7 4 5 6 3\ 156 3 5 7 0 6 1 4 2\ 157 4 7 6 1 2 0 3 5\ 158 6 2 4 5 7 3 0 1\ 159 */\ 160 t16 = y0 + y1;\ 161 t17 = y2 + y5;\ 162 t20 = t16 + t17;\ 163 t18 = y3 + y4;\ 164 t22 = t16 + t18;\ 165 t19 = y6 + y7;\ 166 t21 = t18 + t19;\ 167 t23 = t17 + t19;\ 168 t0 = 0x55555555 + t20 + y7;\ 169 t1 = t22 + y6;\ 170 t1 = rotl32((t1), 3);\ 171 t2 = t20 + y3;\ 172 t2 = rotl32((t2), 7);\ 173 t3 = y2 + t21;\ 174 t3 = rotl32((t3),11);\ 175 t4 = t22 + y5;\ 176 t4 = rotl32((t4),17);\ 177 t5 = t23 + y4;\ 178 t5 = rotl32((t5),19);\ 179 t6 = y1 + t23;\ 180 t6 = rotl32((t6),23);\ 181 t7 = y0 + t21;\ 182 t7 = rotl32((t7),29);\ 183 \ 184 t16 = t0 ^ t1;\ 185 t17 = t2 ^ t5;\ 186 t18 = t3 ^ t4;\ 187 t19 = t6 ^ t7;\ 188 z5 = t8 + (t18 ^ t6);\ 189 z6 = t9 + (t17 ^ t7);\ 190 z7 = t10 + (t4 ^ t19);\ 191 z0 = t11 + (t16 ^ t5);\ 192 z1 = t12 + (t2 ^ t19);\ 193 z2 = t13 + (t16 ^ t3);\ 194 z3 = t14 + (t0 ^ t18);\ 195 z4 = t15 + (t1 ^ t17);\ 196 } 197 198 #define Q512(x0, x1, x2, x3, x4, x5, x6, x7, \ 199 y0, y1, y2, y3, y4, y5, y6, y7,\ 200 z0, z1, z2, z3, z4, z5, z6, z7) \ 201 {\ 202 /* First Latin Square\ 203 0 7 1 3 2 4 6 5\ 204 4 1 7 6 3 0 5 2\ 205 7 0 4 2 5 3 1 6\ 206 1 4 0 5 6 2 7 3\ 207 2 3 6 7 1 5 0 4\ 208 5 2 3 1 7 6 4 0\ 209 3 6 5 0 4 7 2 1\ 210 6 5 2 4 0 1 3 7\ 211 */\ 212 tt8 = x0 + x4;\ 213 tt9 = x1 + x7;\ 214 tt12 = tt8 + tt9;\ 215 tt10 = x2 + x3;\ 216 tt11 = x5 + x6;\ 217 tt13 = tt10 + tt11;\ 218 tt0 = 0xaaaaaaaaaaaaaaaaull + tt12 + x2;\ 219 tt1 = tt12 + x3;\ 220 tt1 = rotl64((tt1), 5);\ 221 tt2 = tt12 + x6;\ 222 tt2 = rotl64((tt2),19);\ 223 tt3 = tt13 + x7;\ 224 tt3 = rotl64((tt3),29);\ 225 tt4 = x1 + tt13;\ 226 tt4 = rotl64((tt4),31);\ 227 tt5 = tt8 + tt10 + x5;\ 228 tt5 = rotl64((tt5),41);\ 229 tt6 = x0 + tt9 + tt11;\ 230 tt6 = rotl64((tt6),57);\ 231 tt7 = tt13 + x4;\ 232 tt7 = rotl64((tt7),61);\ 233 \ 234 tt16 = tt0 ^ tt4;\ 235 tt17 = tt1 ^ tt7;\ 236 tt18 = tt2 ^ tt3;\ 237 tt19 = tt5 ^ tt6;\ 238 tt8 = tt3 ^ tt19;\ 239 tt9 = tt2 ^ tt19;\ 240 tt10 = tt18 ^ tt5;\ 241 tt11 = tt16 ^ tt1;\ 242 tt12 = tt16 ^ tt7;\ 243 tt13 = tt17 ^ tt6;\ 244 tt14 = tt18 ^ tt4;\ 245 tt15 = tt0 ^ tt17;\ 246 \ 247 /* Second Orthogonal Latin Square\ 248 0 4 2 3 1 6 5 7\ 249 7 6 3 2 5 4 1 0\ 250 5 3 1 6 0 2 7 4\ 251 1 0 5 4 3 7 2 6\ 252 2 1 0 7 4 5 6 3\ 253 3 5 7 0 6 1 4 2\ 254 4 7 6 1 2 0 3 5\ 255 6 2 4 5 7 3 0 1\ 256 */\ 257 tt16 = y0 + y1;\ 258 tt17 = y2 + y5;\ 259 tt20 = tt16 + tt17;\ 260 tt18 = y3 + y4;\ 261 tt22 = tt16 + tt18;\ 262 tt19 = y6 + y7;\ 263 tt21 = tt18 + tt19;\ 264 tt23 = tt17 + tt19;\ 265 tt0 = 0x5555555555555555ull + tt20 + y7;\ 266 tt1 = tt22 + y6;\ 267 tt1 = rotl64((tt1), 3);\ 268 tt2 = tt20 + y3;\ 269 tt2 = rotl64((tt2),17);\ 270 tt3 = y2 + tt21;\ 271 tt3 = rotl64((tt3),23);\ 272 tt4 = tt22 + y5;\ 273 tt4 = rotl64((tt4),31);\ 274 tt5 = tt23+ y4;\ 275 tt5 = rotl64((tt5),37);\ 276 tt6 = y1 + tt23;\ 277 tt6 = rotl64((tt6),45);\ 278 tt7 = y0 + tt21;\ 279 tt7 = rotl64((tt7),59);\ 280 \ 281 tt16 = tt0 ^ tt1;\ 282 tt17 = tt2 ^ tt5;\ 283 tt18 = tt3 ^ tt4;\ 284 tt19 = tt6 ^ tt7;\ 285 z5 = tt8 + (tt18 ^ tt6);\ 286 z6 = tt9 + (tt17 ^ tt7);\ 287 z7 = tt10 + (tt4 ^ tt19);\ 288 z0 = tt11 + (tt16 ^ tt5);\ 289 z1 = tt12 + (tt2 ^ tt19);\ 290 z2 = tt13 + (tt16 ^ tt3);\ 291 z3 = tt14 + (tt0 ^ tt18);\ 292 z4 = tt15 + (tt1 ^ tt17);\ 293 } 294 295 static void 296 EdonRInit(EdonRHashState *state, int hashbitlen) 297 { 298 switch (hashbitlen) { 299 case 224: 300 state->hashbitlen = 224; 301 state->bits_processed = 0; 302 state->unprocessed_bits = 0; 303 memcpy(hashState224(state)->DoublePipe, i224p2, 304 16 * sizeof (uint32_t)); 305 break; 306 307 case 256: 308 state->hashbitlen = 256; 309 state->bits_processed = 0; 310 state->unprocessed_bits = 0; 311 memcpy(hashState256(state)->DoublePipe, i256p2, 312 16 * sizeof (uint32_t)); 313 break; 314 315 case 384: 316 state->hashbitlen = 384; 317 state->bits_processed = 0; 318 state->unprocessed_bits = 0; 319 memcpy(hashState384(state)->DoublePipe, i384p2, 320 16 * sizeof (uint64_t)); 321 break; 322 323 case 512: 324 state->hashbitlen = 512; 325 state->bits_processed = 0; 326 state->unprocessed_bits = 0; 327 memcpy(hashState224(state)->DoublePipe, i512p2, 328 16 * sizeof (uint64_t)); 329 break; 330 } 331 } 332 333 static void 334 EdonRUpdate(EdonRHashState *state, const uint8_t *data, size_t databitlen) 335 { 336 uint32_t *data32, *p256; 337 uint32_t t0, t1, t2, t3, t4, t5, t6, t7; 338 uint32_t t8, t9, t10, t11, t12, t13, t14, t15; 339 uint32_t t16, t17, t18, t19, t20, t21, t22, t23; 340 uint32_t p16, p17, p18, p19, p20, p21, p22, p23; 341 uint32_t p24, p25, p26, p27, p28, p29, p30, p31; 342 343 uint64_t *data64, *p512; 344 uint64_t tt0, tt1, tt2, tt3, tt4, tt5, tt6, tt7; 345 uint64_t tt8, tt9, tt10, tt11, tt12, tt13, tt14, tt15; 346 uint64_t tt16, tt17, tt18, tt19, tt20, tt21, tt22, tt23; 347 uint64_t pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23; 348 uint64_t pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31; 349 350 int LastBytes; 351 352 switch (state->hashbitlen) { 353 case 224: 354 case 256: 355 if (state->unprocessed_bits > 0) { 356 /* LastBytes = databitlen / 8 */ 357 LastBytes = (int) databitlen >> 3; 358 memcpy(hashState256(state)->LastPart + 359 (state->unprocessed_bits >> 3), data, LastBytes); 360 state->unprocessed_bits += (int) databitlen; 361 databitlen = state->unprocessed_bits; 362 data32 = (uint32_t *) hashState256(state)->LastPart; 363 } else 364 data32 = (uint32_t *) data; 365 366 p256 = hashState256(state)->DoublePipe; 367 while (databitlen >= EdonR256_BLOCK_SIZE * 8) { 368 databitlen -= EdonR256_BLOCK_SIZE * 8; 369 370 state->bits_processed += EdonR256_BLOCK_SIZE * 8; 371 372 /* First row of quasigroup e-transformations */ 373 Q256(data32[15], data32[14], data32[13], data32[12], 374 data32[11], data32[10], data32[9], data32[8], 375 data32[0], data32[1], data32[2], data32[3], 376 data32[4], data32[5], data32[6], data32[7], p16, 377 p17, p18, p19, p20, p21, p22, p23); 378 Q256(p16, p17, p18, p19, p20, p21, p22, p23, data32[8], 379 data32[9], data32[10], data32[11], data32[12], 380 data32[13], data32[14], data32[15], p24, p25, p26, 381 p27, p28, p29, p30, p31); 382 383 /* Second row of quasigroup e-transformations */ 384 Q256(p256[8], p256[9], p256[10], p256[11], p256[12], 385 p256[13], p256[14], p256[15], p16, p17, p18, p19, 386 p20, p21, p22, p23, p16, p17, p18, p19, p20, p21, 387 p22, p23); 388 Q256(p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, 389 p26, p27, p28, p29, p30, p31, p24, p25, p26, p27, 390 p28, p29, p30, p31); 391 392 /* Third row of quasigroup e-transformations */ 393 Q256(p16, p17, p18, p19, p20, p21, p22, p23, 394 p256[0], p256[1], p256[2], p256[3], p256[4], 395 p256[5], p256[6], p256[7], p16, p17, p18, p19, p20, 396 p21, p22, p23); 397 Q256(p24, p25, p26, p27, p28, p29, p30, p31, p16, p17, 398 p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, 399 p28, p29, p30, p31); 400 401 /* Fourth row of quasigroup e-transformations */ 402 Q256(data32[7], data32[6], data32[5], data32[4], 403 data32[3], data32[2], data32[1], data32[0], p16, 404 p17, p18, p19, p20, p21, p22, p23, p256[0], p256[1], 405 p256[2], p256[3], p256[4], p256[5], p256[6], 406 p256[7]); 407 Q256(p256[0], p256[1], p256[2], p256[3], p256[4], 408 p256[5], p256[6], p256[7], p24, p25, p26, p27, p28, 409 p29, p30, p31, p256[8], p256[9], p256[10], p256[11], 410 p256[12], p256[13], p256[14], p256[15]); 411 412 data32 += 16; 413 } 414 state->unprocessed_bits = (int) databitlen; 415 if (databitlen > 0) { 416 /* LastBytes = Ceil(databitlen / 8) */ 417 LastBytes = ((~(((-(int) databitlen) >> 3) & 0x01ff)) + 418 1) & 0x01ff; 419 memcpy(hashState256(state)->LastPart, data32, 420 LastBytes); 421 } 422 break; 423 424 425 case 384: 426 case 512: 427 if (state->unprocessed_bits > 0) { 428 /* LastBytes = databitlen / 8 */ 429 LastBytes = (int) databitlen >> 3; 430 memcpy(hashState512(state)->LastPart + 431 (state->unprocessed_bits >> 3), data, LastBytes); 432 state->unprocessed_bits += (int) databitlen; 433 databitlen = state->unprocessed_bits; 434 data64 = (uint64_t *) hashState512(state)->LastPart; 435 } else 436 data64 = (uint64_t *) data; 437 438 p512 = hashState512(state)->DoublePipe; 439 while (databitlen >= EdonR512_BLOCK_SIZE * 8) { 440 databitlen -= EdonR512_BLOCK_SIZE * 8; 441 442 state->bits_processed += EdonR512_BLOCK_SIZE * 8; 443 444 /* First row of quasigroup e-transformations */ 445 Q512(data64[15], data64[14], data64[13], data64[12], 446 data64[11], data64[10], data64[9], data64[8], 447 data64[0], data64[1], data64[2], data64[3], 448 data64[4], data64[5], data64[6], data64[7], pp16, 449 pp17, pp18, pp19, pp20, pp21, pp22, pp23); 450 Q512(pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 451 data64[8], data64[9], data64[10], data64[11], 452 data64[12], data64[13], data64[14], data64[15], 453 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31); 454 455 /* Second row of quasigroup e-transformations */ 456 Q512(p512[8], p512[9], p512[10], p512[11], p512[12], 457 p512[13], p512[14], p512[15], pp16, pp17, pp18, 458 pp19, pp20, pp21, pp22, pp23, pp16, pp17, pp18, 459 pp19, pp20, pp21, pp22, pp23); 460 Q512(pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 461 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31, 462 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31); 463 464 /* Third row of quasigroup e-transformations */ 465 Q512(pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 466 p512[0], p512[1], p512[2], p512[3], p512[4], 467 p512[5], p512[6], p512[7], pp16, pp17, pp18, pp19, 468 pp20, pp21, pp22, pp23); 469 Q512(pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31, 470 pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 471 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31); 472 473 /* Fourth row of quasigroup e-transformations */ 474 Q512(data64[7], data64[6], data64[5], data64[4], 475 data64[3], data64[2], data64[1], data64[0], pp16, 476 pp17, pp18, pp19, pp20, pp21, pp22, pp23, p512[0], 477 p512[1], p512[2], p512[3], p512[4], p512[5], 478 p512[6], p512[7]); 479 Q512(p512[0], p512[1], p512[2], p512[3], p512[4], 480 p512[5], p512[6], p512[7], pp24, pp25, pp26, pp27, 481 pp28, pp29, pp30, pp31, p512[8], p512[9], p512[10], 482 p512[11], p512[12], p512[13], p512[14], p512[15]); 483 484 data64 += 16; 485 } 486 state->unprocessed_bits = (int) databitlen; 487 if (databitlen > 0) { 488 /* LastBytes = Ceil(databitlen / 8) */ 489 LastBytes = ((~(((-(int) databitlen) >> 3) & 0x03ff)) + 490 1) & 0x03ff; 491 memcpy(hashState512(state)->LastPart, data64, 492 LastBytes); 493 } 494 break; 495 } 496 } 497 498 static void 499 EdonRFinal(EdonRHashState * state, uint8_t *hashval) 500 { 501 uint32_t *data32, *p256; 502 uint32_t t0, t1, t2, t3, t4, t5, t6, t7; 503 uint32_t t8, t9, t10, t11, t12, t13, t14, t15; 504 uint32_t t16, t17, t18, t19, t20, t21, t22, t23; 505 uint32_t p16, p17, p18, p19, p20, p21, p22, p23; 506 uint32_t p24, p25, p26, p27, p28, p29, p30, p31; 507 508 uint64_t *data64, *p512; 509 uint64_t tt0, tt1, tt2, tt3, tt4, tt5, tt6, tt7; 510 uint64_t tt8, tt9, tt10, tt11, tt12, tt13, tt14, tt15; 511 uint64_t tt16, tt17, tt18, tt19, tt20, tt21, tt22, tt23; 512 uint64_t pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23; 513 uint64_t pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31; 514 515 size_t databitlen; 516 517 int LastByte, PadOnePosition; 518 519 switch (state->hashbitlen) { 520 case 224: 521 case 256: 522 LastByte = (int) state->unprocessed_bits >> 3; 523 PadOnePosition = 7 - (state->unprocessed_bits & 0x07); 524 hashState256(state)->LastPart[LastByte] = 525 hashState256(state)-> 526 LastPart[LastByte] & (0xff << (PadOnePosition + 1)) 527 ^ (0x01 << PadOnePosition); 528 data64 = (uint64_t *) hashState256(state)->LastPart; 529 530 if (state->unprocessed_bits < 448) { 531 my_memset((hashState256(state)->LastPart) + LastByte + 532 1, 0x00, EdonR256_BLOCK_SIZE - LastByte - 9); 533 databitlen = EdonR256_BLOCK_SIZE * 8; 534 data64[7] = 535 state->bits_processed + state->unprocessed_bits; 536 } else { 537 my_memset((hashState256(state)->LastPart) + LastByte + 538 1, 0x00, EdonR256_BLOCK_SIZE * 2 - LastByte - 9); 539 databitlen = EdonR256_BLOCK_SIZE * 16; 540 data64[15] = 541 state->bits_processed + state->unprocessed_bits; 542 } 543 544 data32 = (uint32_t *) hashState256(state)->LastPart; 545 p256 = hashState256(state)->DoublePipe; 546 while (databitlen >= EdonR256_BLOCK_SIZE * 8) { 547 databitlen -= EdonR256_BLOCK_SIZE * 8; 548 549 /* First row of quasigroup e-transformations */ 550 Q256(data32[15], data32[14], data32[13], data32[12], 551 data32[11], data32[10], data32[9], data32[8], 552 data32[0], data32[1], data32[2], data32[3], 553 data32[4], data32[5], data32[6], data32[7], p16, 554 p17, p18, p19, p20, p21, p22, p23); 555 Q256(p16, p17, p18, p19, p20, p21, p22, p23, data32[8], 556 data32[9], data32[10], data32[11], data32[12], 557 data32[13], data32[14], data32[15], p24, p25, p26, 558 p27, p28, p29, p30, p31); 559 560 /* Second row of quasigroup e-transformations */ 561 Q256(p256[8], p256[9], p256[10], p256[11], p256[12], 562 p256[13], p256[14], p256[15], p16, p17, p18, p19, 563 p20, p21, p22, p23, p16, p17, p18, p19, p20, p21, 564 p22, p23); 565 Q256(p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, 566 p26, p27, p28, p29, p30, p31, p24, p25, p26, p27, 567 p28, p29, p30, p31); 568 569 /* Third row of quasigroup e-transformations */ 570 Q256(p16, p17, p18, p19, p20, p21, p22, p23, 571 p256[0], p256[1], p256[2], p256[3], p256[4], 572 p256[5], p256[6], p256[7], p16, p17, p18, p19, p20, 573 p21, p22, p23); 574 Q256(p24, p25, p26, p27, p28, p29, p30, p31, p16, p17, 575 p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, 576 p28, p29, p30, p31); 577 578 /* Fourth row of quasigroup e-transformations */ 579 Q256(data32[7], data32[6], data32[5], data32[4], 580 data32[3], data32[2], data32[1], data32[0], p16, 581 p17, p18, p19, p20, p21, p22, p23, p256[0], p256[1], 582 p256[2], p256[3], p256[4], p256[5], p256[6], 583 p256[7]); 584 Q256(p256[0], p256[1], p256[2], p256[3], p256[4], 585 p256[5], p256[6], p256[7], p24, p25, p26, p27, p28, 586 p29, p30, p31, p256[8], p256[9], p256[10], p256[11], 587 p256[12], p256[13], p256[14], p256[15]); 588 589 590 data32 += 16; 591 } 592 break; 593 594 case 384: 595 case 512: 596 LastByte = (int) state->unprocessed_bits >> 3; 597 PadOnePosition = 7 - (state->unprocessed_bits & 0x07); 598 hashState512(state)->LastPart[LastByte] = 599 hashState512(state)-> 600 LastPart[LastByte] & (0xff << (PadOnePosition + 1)) 601 ^ (0x01 << PadOnePosition); 602 data64 = (uint64_t *) hashState512(state)->LastPart; 603 604 if (state->unprocessed_bits < 960) { 605 my_memset((hashState512(state)->LastPart) + LastByte + 606 1, 0x00, EdonR512_BLOCK_SIZE - LastByte - 9); 607 databitlen = EdonR512_BLOCK_SIZE * 8; 608 data64[15] = 609 state->bits_processed + state->unprocessed_bits; 610 } else { 611 my_memset((hashState512(state)->LastPart) + LastByte + 612 1, 0x00, EdonR512_BLOCK_SIZE * 2 - LastByte - 9); 613 databitlen = EdonR512_BLOCK_SIZE * 16; 614 data64[31] = 615 state->bits_processed + state->unprocessed_bits; 616 } 617 618 p512 = hashState512(state)->DoublePipe; 619 while (databitlen >= EdonR512_BLOCK_SIZE * 8) { 620 databitlen -= EdonR512_BLOCK_SIZE * 8; 621 /* First row of quasigroup e-transformations */ 622 Q512(data64[15], data64[14], data64[13], data64[12], 623 data64[11], data64[10], data64[9], data64[8], 624 data64[0], data64[1], data64[2], data64[3], 625 data64[4], data64[5], data64[6], data64[7], pp16, 626 pp17, pp18, pp19, pp20, pp21, pp22, pp23); 627 Q512(pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 628 data64[8], data64[9], data64[10], data64[11], 629 data64[12], data64[13], data64[14], data64[15], 630 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31); 631 632 /* Second row of quasigroup e-transformations */ 633 Q512(p512[8], p512[9], p512[10], p512[11], p512[12], 634 p512[13], p512[14], p512[15], pp16, pp17, pp18, 635 pp19, pp20, pp21, pp22, pp23, pp16, pp17, pp18, 636 pp19, pp20, pp21, pp22, pp23); 637 Q512(pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 638 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31, 639 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31); 640 641 /* Third row of quasigroup e-transformations */ 642 Q512(pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 643 p512[0], p512[1], p512[2], p512[3], p512[4], 644 p512[5], p512[6], p512[7], pp16, pp17, pp18, pp19, 645 pp20, pp21, pp22, pp23); 646 Q512(pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31, 647 pp16, pp17, pp18, pp19, pp20, pp21, pp22, pp23, 648 pp24, pp25, pp26, pp27, pp28, pp29, pp30, pp31); 649 650 /* Fourth row of quasigroup e-transformations */ 651 Q512(data64[7], data64[6], data64[5], data64[4], 652 data64[3], data64[2], data64[1], data64[0], pp16, 653 pp17, pp18, pp19, pp20, pp21, pp22, pp23, p512[0], 654 p512[1], p512[2], p512[3], p512[4], p512[5], 655 p512[6], p512[7]); 656 Q512(p512[0], p512[1], p512[2], p512[3], p512[4], 657 p512[5], p512[6], p512[7], pp24, pp25, pp26, pp27, 658 pp28, pp29, pp30, pp31, p512[8], p512[9], p512[10], 659 p512[11], p512[12], p512[13], p512[14], p512[15]); 660 661 data64 += 16; 662 } 663 break; 664 } 665 666 switch (state->hashbitlen) { 667 case 224: 668 memcpy(hashval, p256 + 9, EdonR224_DIGEST_SIZE); 669 break; 670 case 256: 671 memcpy(hashval, p256 + 8, EdonR256_DIGEST_SIZE); 672 break; 673 case 384: 674 memcpy(hashval, p512 + 10, EdonR384_DIGEST_SIZE); 675 break; 676 case 512: 677 memcpy(hashval, p512 + 8, EdonR512_DIGEST_SIZE); 678 break; 679 } 680 } 681 682 static void 683 EdonRHash(size_t hashbitlen, const uint8_t* data, size_t databitlen, 684 uint8_t *hashval) 685 { 686 EdonRHashState state; 687 688 EdonRInit(&state, hashbitlen); 689 EdonRUpdate(&state, data, databitlen); 690 EdonRFinal(&state, hashval); 691 } 692 693 void 694 zio_checksum_EdonR512_256(const void *buf, uint64_t size, zio_cksum_t *zcp) 695 { 696 uint8_t hash[EdonR512_DIGEST_SIZE]; 697 698 EdonRHash(512, buf, size * 8, hash); 699 memcpy(&zcp->zc_word[0], &hash[000], sizeof (zcp->zc_word[0])); 700 memcpy(&zcp->zc_word[1], &hash[010], sizeof (zcp->zc_word[1])); 701 memcpy(&zcp->zc_word[2], &hash[020], sizeof (zcp->zc_word[2])); 702 memcpy(&zcp->zc_word[3], &hash[030], sizeof (zcp->zc_word[3])); 703 } 704 705 void 706 zio_checksum_EdonR512_256_byteswap(const void *buf, uint64_t size, 707 zio_cksum_t *zcp) 708 { 709 zio_checksum_EdonR512_256(buf, size, zcp); 710 zcp->zc_word[0] = BSWAP_64(zcp->zc_word[0]); 711 zcp->zc_word[1] = BSWAP_64(zcp->zc_word[1]); 712 zcp->zc_word[2] = BSWAP_64(zcp->zc_word[2]); 713 zcp->zc_word[3] = BSWAP_64(zcp->zc_word[3]); 714 }