[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 <?php 2 3 if (class_exists('ParagonIE_Sodium_Core_BLAKE2b', false)) { 4 return; 5 } 6 7 /** 8 * Class ParagonIE_Sodium_Core_BLAKE2b 9 * 10 * Based on the work of Devi Mandiri in devi/salt. 11 */ 12 abstract class ParagonIE_Sodium_Core32_BLAKE2b extends ParagonIE_Sodium_Core_Util 13 { 14 /** 15 * @var SplFixedArray 16 */ 17 public static $iv; 18 19 /** 20 * @var array<int, array<int, int>> 21 */ 22 public static $sigma = array( 23 array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), 24 array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), 25 array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), 26 array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), 27 array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), 28 array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), 29 array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), 30 array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), 31 array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), 32 array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), 33 array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), 34 array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) 35 ); 36 37 const BLOCKBYTES = 128; 38 const OUTBYTES = 64; 39 const KEYBYTES = 64; 40 41 /** 42 * Turn two 32-bit integers into a fixed array representing a 64-bit integer. 43 * 44 * @internal You should not use this directly from another application 45 * 46 * @param int $high 47 * @param int $low 48 * @return ParagonIE_Sodium_Core32_Int64 49 * @throws SodiumException 50 * @throws TypeError 51 */ 52 public static function new64($high, $low) 53 { 54 return ParagonIE_Sodium_Core32_Int64::fromInts($low, $high); 55 } 56 57 /** 58 * Convert an arbitrary number into an SplFixedArray of two 32-bit integers 59 * that represents a 64-bit integer. 60 * 61 * @internal You should not use this directly from another application 62 * 63 * @param int $num 64 * @return ParagonIE_Sodium_Core32_Int64 65 * @throws SodiumException 66 * @throws TypeError 67 */ 68 protected static function to64($num) 69 { 70 list($hi, $lo) = self::numericTo64BitInteger($num); 71 return self::new64($hi, $lo); 72 } 73 74 /** 75 * Adds two 64-bit integers together, returning their sum as a SplFixedArray 76 * containing two 32-bit integers (representing a 64-bit integer). 77 * 78 * @internal You should not use this directly from another application 79 * 80 * @param ParagonIE_Sodium_Core32_Int64 $x 81 * @param ParagonIE_Sodium_Core32_Int64 $y 82 * @return ParagonIE_Sodium_Core32_Int64 83 */ 84 protected static function add64($x, $y) 85 { 86 return $x->addInt64($y); 87 } 88 89 /** 90 * @internal You should not use this directly from another application 91 * 92 * @param ParagonIE_Sodium_Core32_Int64 $x 93 * @param ParagonIE_Sodium_Core32_Int64 $y 94 * @param ParagonIE_Sodium_Core32_Int64 $z 95 * @return ParagonIE_Sodium_Core32_Int64 96 */ 97 public static function add364($x, $y, $z) 98 { 99 return $x->addInt64($y)->addInt64($z); 100 } 101 102 /** 103 * @internal You should not use this directly from another application 104 * 105 * @param ParagonIE_Sodium_Core32_Int64 $x 106 * @param ParagonIE_Sodium_Core32_Int64 $y 107 * @return ParagonIE_Sodium_Core32_Int64 108 * @throws TypeError 109 */ 110 public static function xor64(ParagonIE_Sodium_Core32_Int64 $x, ParagonIE_Sodium_Core32_Int64 $y) 111 { 112 return $x->xorInt64($y); 113 } 114 115 /** 116 * @internal You should not use this directly from another application 117 * 118 * @param ParagonIE_Sodium_Core32_Int64 $x 119 * @param int $c 120 * @return ParagonIE_Sodium_Core32_Int64 121 * @throws SodiumException 122 * @throws TypeError 123 */ 124 public static function rotr64(ParagonIE_Sodium_Core32_Int64 $x, $c) 125 { 126 return $x->rotateRight($c); 127 } 128 129 /** 130 * @internal You should not use this directly from another application 131 * 132 * @param SplFixedArray $x 133 * @param int $i 134 * @return ParagonIE_Sodium_Core32_Int64 135 * @throws SodiumException 136 * @throws TypeError 137 */ 138 public static function load64($x, $i) 139 { 140 /** @var int $l */ 141 $l = (int) ($x[$i]) 142 | ((int) ($x[$i+1]) << 8) 143 | ((int) ($x[$i+2]) << 16) 144 | ((int) ($x[$i+3]) << 24); 145 /** @var int $h */ 146 $h = (int) ($x[$i+4]) 147 | ((int) ($x[$i+5]) << 8) 148 | ((int) ($x[$i+6]) << 16) 149 | ((int) ($x[$i+7]) << 24); 150 return self::new64($h, $l); 151 } 152 153 /** 154 * @internal You should not use this directly from another application 155 * 156 * @param SplFixedArray $x 157 * @param int $i 158 * @param ParagonIE_Sodium_Core32_Int64 $u 159 * @return void 160 * @throws TypeError 161 * @psalm-suppress MixedArgument 162 * @psalm-suppress MixedAssignment 163 * @psalm-suppress MixedArrayAccess 164 * @psalm-suppress MixedArrayAssignment 165 * @psalm-suppress MixedArrayOffset 166 */ 167 public static function store64(SplFixedArray $x, $i, ParagonIE_Sodium_Core32_Int64 $u) 168 { 169 $v = clone $u; 170 $maxLength = $x->getSize() - 1; 171 for ($j = 0; $j < 8; ++$j) { 172 $k = 3 - ($j >> 1); 173 $x[$i] = $v->limbs[$k] & 0xff; 174 if (++$i > $maxLength) { 175 return; 176 } 177 $v->limbs[$k] >>= 8; 178 } 179 } 180 181 /** 182 * This just sets the $iv static variable. 183 * 184 * @internal You should not use this directly from another application 185 * 186 * @return void 187 * @throws SodiumException 188 * @throws TypeError 189 */ 190 public static function pseudoConstructor() 191 { 192 static $called = false; 193 if ($called) { 194 return; 195 } 196 self::$iv = new SplFixedArray(8); 197 self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); 198 self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); 199 self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); 200 self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); 201 self::$iv[4] = self::new64(0x510e527f, 0xade682d1); 202 self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); 203 self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); 204 self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); 205 206 $called = true; 207 } 208 209 /** 210 * Returns a fresh BLAKE2 context. 211 * 212 * @internal You should not use this directly from another application 213 * 214 * @return SplFixedArray 215 * @throws TypeError 216 * @psalm-suppress MixedArgument 217 * @psalm-suppress MixedAssignment 218 * @psalm-suppress MixedArrayAccess 219 * @psalm-suppress MixedArrayAssignment 220 * @psalm-suppress MixedArrayOffset 221 * @throws SodiumException 222 * @throws TypeError 223 */ 224 protected static function context() 225 { 226 $ctx = new SplFixedArray(6); 227 $ctx[0] = new SplFixedArray(8); // h 228 $ctx[1] = new SplFixedArray(2); // t 229 $ctx[2] = new SplFixedArray(2); // f 230 $ctx[3] = new SplFixedArray(256); // buf 231 $ctx[4] = 0; // buflen 232 $ctx[5] = 0; // last_node (uint8_t) 233 234 for ($i = 8; $i--;) { 235 $ctx[0][$i] = self::$iv[$i]; 236 } 237 for ($i = 256; $i--;) { 238 $ctx[3][$i] = 0; 239 } 240 241 $zero = self::new64(0, 0); 242 $ctx[1][0] = $zero; 243 $ctx[1][1] = $zero; 244 $ctx[2][0] = $zero; 245 $ctx[2][1] = $zero; 246 247 return $ctx; 248 } 249 250 /** 251 * @internal You should not use this directly from another application 252 * 253 * @param SplFixedArray $ctx 254 * @param SplFixedArray $buf 255 * @return void 256 * @throws SodiumException 257 * @throws TypeError 258 * @psalm-suppress MixedArgument 259 * @psalm-suppress MixedArrayAccess 260 * @psalm-suppress MixedArrayAssignment 261 * @psalm-suppress MixedAssignment 262 */ 263 protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) 264 { 265 $m = new SplFixedArray(16); 266 $v = new SplFixedArray(16); 267 268 for ($i = 16; $i--;) { 269 $m[$i] = self::load64($buf, $i << 3); 270 } 271 272 for ($i = 8; $i--;) { 273 $v[$i] = $ctx[0][$i]; 274 } 275 276 $v[ 8] = self::$iv[0]; 277 $v[ 9] = self::$iv[1]; 278 $v[10] = self::$iv[2]; 279 $v[11] = self::$iv[3]; 280 281 $v[12] = self::xor64($ctx[1][0], self::$iv[4]); 282 $v[13] = self::xor64($ctx[1][1], self::$iv[5]); 283 $v[14] = self::xor64($ctx[2][0], self::$iv[6]); 284 $v[15] = self::xor64($ctx[2][1], self::$iv[7]); 285 286 for ($r = 0; $r < 12; ++$r) { 287 $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); 288 $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); 289 $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); 290 $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); 291 $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); 292 $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); 293 $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); 294 $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); 295 } 296 297 for ($i = 8; $i--;) { 298 $ctx[0][$i] = self::xor64( 299 $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) 300 ); 301 } 302 } 303 304 /** 305 * @internal You should not use this directly from another application 306 * 307 * @param int $r 308 * @param int $i 309 * @param int $a 310 * @param int $b 311 * @param int $c 312 * @param int $d 313 * @param SplFixedArray $v 314 * @param SplFixedArray $m 315 * @return SplFixedArray 316 * @throws SodiumException 317 * @throws TypeError 318 * @psalm-suppress MixedArgument 319 * @psalm-suppress MixedArrayOffset 320 */ 321 public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) 322 { 323 $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); 324 $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); 325 $v[$c] = self::add64($v[$c], $v[$d]); 326 $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); 327 $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); 328 $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); 329 $v[$c] = self::add64($v[$c], $v[$d]); 330 $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); 331 return $v; 332 } 333 334 /** 335 * @internal You should not use this directly from another application 336 * 337 * @param SplFixedArray $ctx 338 * @param int $inc 339 * @return void 340 * @throws SodiumException 341 * @throws TypeError 342 * @psalm-suppress MixedArgument 343 * @psalm-suppress MixedArrayAccess 344 * @psalm-suppress MixedArrayAssignment 345 */ 346 public static function increment_counter($ctx, $inc) 347 { 348 if ($inc < 0) { 349 throw new SodiumException('Increasing by a negative number makes no sense.'); 350 } 351 $t = self::to64($inc); 352 # S->t is $ctx[1] in our implementation 353 354 # S->t[0] = ( uint64_t )( t >> 0 ); 355 $ctx[1][0] = self::add64($ctx[1][0], $t); 356 357 # S->t[1] += ( S->t[0] < inc ); 358 if (!($ctx[1][0] instanceof ParagonIE_Sodium_Core32_Int64)) { 359 throw new TypeError('Not an int64'); 360 } 361 /** @var ParagonIE_Sodium_Core32_Int64 $c*/ 362 $c = $ctx[1][0]; 363 if ($c->isLessThanInt($inc)) { 364 $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); 365 } 366 } 367 368 /** 369 * @internal You should not use this directly from another application 370 * 371 * @param SplFixedArray $ctx 372 * @param SplFixedArray $p 373 * @param int $plen 374 * @return void 375 * @throws SodiumException 376 * @throws TypeError 377 * @psalm-suppress MixedArgument 378 * @psalm-suppress MixedAssignment 379 * @psalm-suppress MixedArrayAccess 380 * @psalm-suppress MixedArrayAssignment 381 * @psalm-suppress MixedArrayOffset 382 * @psalm-suppress MixedMethodCall 383 * @psalm-suppress MixedOperand 384 */ 385 public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) 386 { 387 self::pseudoConstructor(); 388 389 $offset = 0; 390 while ($plen > 0) { 391 $left = $ctx[4]; 392 $fill = 256 - $left; 393 394 if ($plen > $fill) { 395 # memcpy( S->buf + left, in, fill ); /* Fill buffer */ 396 for ($i = $fill; $i--;) { 397 $ctx[3][$i + $left] = $p[$i + $offset]; 398 } 399 400 # S->buflen += fill; 401 $ctx[4] += $fill; 402 403 # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); 404 self::increment_counter($ctx, 128); 405 406 # blake2b_compress( S, S->buf ); /* Compress */ 407 self::compress($ctx, $ctx[3]); 408 409 # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ 410 for ($i = 128; $i--;) { 411 $ctx[3][$i] = $ctx[3][$i + 128]; 412 } 413 414 # S->buflen -= BLAKE2B_BLOCKBYTES; 415 $ctx[4] -= 128; 416 417 # in += fill; 418 $offset += $fill; 419 420 # inlen -= fill; 421 $plen -= $fill; 422 } else { 423 for ($i = $plen; $i--;) { 424 $ctx[3][$i + $left] = $p[$i + $offset]; 425 } 426 $ctx[4] += $plen; 427 $offset += $plen; 428 $plen -= $plen; 429 } 430 } 431 } 432 433 /** 434 * @internal You should not use this directly from another application 435 * 436 * @param SplFixedArray $ctx 437 * @param SplFixedArray $out 438 * @return SplFixedArray 439 * @throws SodiumException 440 * @throws TypeError 441 * @psalm-suppress MixedArgument 442 * @psalm-suppress MixedAssignment 443 * @psalm-suppress MixedArrayAccess 444 * @psalm-suppress MixedArrayAssignment 445 * @psalm-suppress MixedArrayOffset 446 * @psalm-suppress MixedMethodCall 447 * @psalm-suppress MixedOperand 448 */ 449 public static function finish(SplFixedArray $ctx, SplFixedArray $out) 450 { 451 self::pseudoConstructor(); 452 if ($ctx[4] > 128) { 453 self::increment_counter($ctx, 128); 454 self::compress($ctx, $ctx[3]); 455 $ctx[4] -= 128; 456 if ($ctx[4] > 128) { 457 throw new SodiumException('Failed to assert that buflen <= 128 bytes'); 458 } 459 for ($i = $ctx[4]; $i--;) { 460 $ctx[3][$i] = $ctx[3][$i + 128]; 461 } 462 } 463 464 self::increment_counter($ctx, $ctx[4]); 465 $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); 466 467 for ($i = 256 - $ctx[4]; $i--;) { 468 /** @var int $i */ 469 $ctx[3][$i + $ctx[4]] = 0; 470 } 471 472 self::compress($ctx, $ctx[3]); 473 474 $i = (int) (($out->getSize() - 1) / 8); 475 for (; $i >= 0; --$i) { 476 self::store64($out, $i << 3, $ctx[0][$i]); 477 } 478 return $out; 479 } 480 481 /** 482 * @internal You should not use this directly from another application 483 * 484 * @param SplFixedArray|null $key 485 * @param int $outlen 486 * @param SplFixedArray|null $salt 487 * @param SplFixedArray|null $personal 488 * @return SplFixedArray 489 * @throws SodiumException 490 * @throws TypeError 491 * @psalm-suppress MixedArgument 492 * @psalm-suppress MixedAssignment 493 * @psalm-suppress MixedArrayAccess 494 * @psalm-suppress MixedArrayAssignment 495 * @psalm-suppress MixedMethodCall 496 */ 497 public static function init( 498 $key = null, 499 $outlen = 64, 500 $salt = null, 501 $personal = null 502 ) { 503 self::pseudoConstructor(); 504 $klen = 0; 505 506 if ($key !== null) { 507 if (count($key) > 64) { 508 throw new SodiumException('Invalid key size'); 509 } 510 $klen = count($key); 511 } 512 513 if ($outlen > 64) { 514 throw new SodiumException('Invalid output size'); 515 } 516 517 $ctx = self::context(); 518 519 $p = new SplFixedArray(64); 520 // Zero our param buffer... 521 for ($i = 64; --$i;) { 522 $p[$i] = 0; 523 } 524 525 $p[0] = $outlen; // digest_length 526 $p[1] = $klen; // key_length 527 $p[2] = 1; // fanout 528 $p[3] = 1; // depth 529 530 if ($salt instanceof SplFixedArray) { 531 // salt: [32] through [47] 532 for ($i = 0; $i < 16; ++$i) { 533 $p[32 + $i] = (int) $salt[$i]; 534 } 535 } 536 if ($personal instanceof SplFixedArray) { 537 // personal: [48] through [63] 538 for ($i = 0; $i < 16; ++$i) { 539 $p[48 + $i] = (int) $personal[$i]; 540 } 541 } 542 543 $ctx[0][0] = self::xor64( 544 $ctx[0][0], 545 self::load64($p, 0) 546 ); 547 548 if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { 549 // We need to do what blake2b_init_param() does: 550 for ($i = 1; $i < 8; ++$i) { 551 $ctx[0][$i] = self::xor64( 552 $ctx[0][$i], 553 self::load64($p, $i << 3) 554 ); 555 } 556 } 557 558 if ($klen > 0 && $key instanceof SplFixedArray) { 559 $block = new SplFixedArray(128); 560 for ($i = 128; $i--;) { 561 $block[$i] = 0; 562 } 563 for ($i = $klen; $i--;) { 564 $block[$i] = $key[$i]; 565 } 566 self::update($ctx, $block, 128); 567 $ctx[4] = 128; 568 } 569 570 return $ctx; 571 } 572 573 /** 574 * Convert a string into an SplFixedArray of integers 575 * 576 * @internal You should not use this directly from another application 577 * 578 * @param string $str 579 * @return SplFixedArray 580 * @psalm-suppress MixedArgumentTypeCoercion 581 */ 582 public static function stringToSplFixedArray($str = '') 583 { 584 $values = unpack('C*', $str); 585 return SplFixedArray::fromArray(array_values($values)); 586 } 587 588 /** 589 * Convert an SplFixedArray of integers into a string 590 * 591 * @internal You should not use this directly from another application 592 * 593 * @param SplFixedArray $a 594 * @return string 595 */ 596 public static function SplFixedArrayToString(SplFixedArray $a) 597 { 598 /** 599 * @var array<int, string|int> 600 */ 601 $arr = $a->toArray(); 602 $c = $a->count(); 603 array_unshift($arr, str_repeat('C', $c)); 604 return (string) (call_user_func_array('pack', $arr)); 605 } 606 607 /** 608 * @internal You should not use this directly from another application 609 * 610 * @param SplFixedArray $ctx 611 * @return string 612 * @throws TypeError 613 * @psalm-suppress MixedArgument 614 * @psalm-suppress MixedArrayAccess 615 * @psalm-suppress MixedArrayAssignment 616 * @psalm-suppress MixedMethodCall 617 */ 618 public static function contextToString(SplFixedArray $ctx) 619 { 620 $str = ''; 621 /** @var array<int, ParagonIE_Sodium_Core32_Int64> $ctxA */ 622 $ctxA = $ctx[0]->toArray(); 623 624 # uint64_t h[8]; 625 for ($i = 0; $i < 8; ++$i) { 626 if (!($ctxA[$i] instanceof ParagonIE_Sodium_Core32_Int64)) { 627 throw new TypeError('Not an instance of Int64'); 628 } 629 /** @var ParagonIE_Sodium_Core32_Int64 $ctxAi */ 630 $ctxAi = $ctxA[$i]; 631 $str .= $ctxAi->toReverseString(); 632 } 633 634 # uint64_t t[2]; 635 # uint64_t f[2]; 636 for ($i = 1; $i < 3; ++$i) { 637 /** @var array<int, ParagonIE_Sodium_Core32_Int64> $ctxA */ 638 $ctxA = $ctx[$i]->toArray(); 639 /** @var ParagonIE_Sodium_Core32_Int64 $ctxA1 */ 640 $ctxA1 = $ctxA[0]; 641 /** @var ParagonIE_Sodium_Core32_Int64 $ctxA2 */ 642 $ctxA2 = $ctxA[1]; 643 644 $str .= $ctxA1->toReverseString(); 645 $str .= $ctxA2->toReverseString(); 646 } 647 648 # uint8_t buf[2 * 128]; 649 $str .= self::SplFixedArrayToString($ctx[3]); 650 651 /** @var int $ctx4 */ 652 $ctx4 = $ctx[4]; 653 654 # size_t buflen; 655 $str .= implode('', array( 656 self::intToChr($ctx4 & 0xff), 657 self::intToChr(($ctx4 >> 8) & 0xff), 658 self::intToChr(($ctx4 >> 16) & 0xff), 659 self::intToChr(($ctx4 >> 24) & 0xff), 660 "\x00\x00\x00\x00" 661 /* 662 self::intToChr(($ctx4 >> 32) & 0xff), 663 self::intToChr(($ctx4 >> 40) & 0xff), 664 self::intToChr(($ctx4 >> 48) & 0xff), 665 self::intToChr(($ctx4 >> 56) & 0xff) 666 */ 667 )); 668 # uint8_t last_node; 669 return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); 670 } 671 672 /** 673 * Creates an SplFixedArray containing other SplFixedArray elements, from 674 * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) 675 * 676 * @internal You should not use this directly from another application 677 * 678 * @param string $string 679 * @return SplFixedArray 680 * @throws SodiumException 681 * @throws TypeError 682 * @psalm-suppress MixedArrayAccess 683 * @psalm-suppress MixedArrayAssignment 684 */ 685 public static function stringToContext($string) 686 { 687 $ctx = self::context(); 688 689 # uint64_t h[8]; 690 for ($i = 0; $i < 8; ++$i) { 691 $ctx[0][$i] = ParagonIE_Sodium_Core32_Int64::fromReverseString( 692 self::substr($string, (($i << 3) + 0), 8) 693 ); 694 } 695 696 # uint64_t t[2]; 697 # uint64_t f[2]; 698 for ($i = 1; $i < 3; ++$i) { 699 $ctx[$i][1] = ParagonIE_Sodium_Core32_Int64::fromReverseString( 700 self::substr($string, 72 + (($i - 1) << 4), 8) 701 ); 702 $ctx[$i][0] = ParagonIE_Sodium_Core32_Int64::fromReverseString( 703 self::substr($string, 64 + (($i - 1) << 4), 8) 704 ); 705 } 706 707 # uint8_t buf[2 * 128]; 708 $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); 709 710 # uint8_t buf[2 * 128]; 711 $int = 0; 712 for ($i = 0; $i < 8; ++$i) { 713 $int |= self::chrToInt($string[352 + $i]) << ($i << 3); 714 } 715 $ctx[4] = $int; 716 717 return $ctx; 718 } 719 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Nov 21 01:00:03 2024 | Cross-referenced by PHPXref 0.7.1 |