PluginProbe ʕ •ᴥ•ʔ
JetBackup – Backup, Restore & Migrate / 3.1.13.4
JetBackup – Backup, Restore & Migrate v3.1.13.4
3.1.22.4 3.1.22.3 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.8.1 1.4.9 1.5.0 1.5.1 1.5.1.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.10 1.6.11 1.6.12 1.6.13 1.6.15 1.6.5.1 1.6.8.8 1.6.9 1.6.9.1 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7.5 2.0.8.7 2.0.9.11 2.0.9.14 2.0.9.15 2.0.9.6 2.0.9.7 2.0.9.9 3.1.10.7 3.1.11.1 3.1.12.3 3.1.13.4 3.1.14.17 3.1.15.4 3.1.16.1 3.1.17.5 3.1.18.10 3.1.18.8 3.1.18.9 3.1.19.8 3.1.20.3 3.1.21.3 3.1.7.9 3.1.9.2 trunk 1.1.90 1.1.91 1.2.0 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt / ChaCha20.php
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt Last commit date
Common 9 months ago DH 9 months ago DSA 9 months ago EC 9 months ago RSA 9 months ago .htaccess 9 months ago AES.php 9 months ago Blowfish.php 9 months ago ChaCha20.php 9 months ago DES.php 9 months ago DH.php 9 months ago DSA.php 9 months ago EC.php 9 months ago Hash.php 9 months ago PublicKeyLoader.php 9 months ago RC2.php 9 months ago RC4.php 9 months ago RSA.php 9 months ago Random.php 9 months ago Rijndael.php 9 months ago Salsa20.php 9 months ago TripleDES.php 9 months ago Twofish.php 9 months ago index.html 9 months ago web.config 9 months ago
ChaCha20.php
789 lines
1 <?php
2
3 /**
4 * Pure-PHP implementation of ChaCha20.
5 *
6 * PHP version 5
7 *
8 * @author Jim Wigginton <terrafrost@php.net>
9 * @copyright 2019 Jim Wigginton
10 * @license http://www.opensource.org/licenses/mit-license.html MIT License
11 * @link http://phpseclib.sourceforge.net
12 */
13
14 declare(strict_types=1);
15
16 namespace phpseclib3\Crypt;
17
18 use phpseclib3\Exception\BadDecryptionException;
19 use phpseclib3\Exception\InsufficientSetupException;
20 use phpseclib3\Exception\LengthException;
21 use phpseclib3\Exception\UnexpectedValueException;
22
23 /**
24 * Pure-PHP implementation of ChaCha20.
25 *
26 * @author Jim Wigginton <terrafrost@php.net>
27 */
28 class ChaCha20 extends Salsa20
29 {
30 /**
31 * The OpenSSL specific name of the cipher
32 *
33 * @var string
34 */
35 protected $cipher_name_openssl = 'chacha20';
36
37 /**
38 * Test for engine validity
39 *
40 * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine()
41 *
42 * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct()
43 */
44 protected function isValidEngineHelper(int $engine): bool
45 {
46 switch ($engine) {
47 case self::ENGINE_LIBSODIUM:
48 // PHP 7.2.0 (30 Nov 2017) added support for libsodium
49
50 // we could probably make it so that if $this->counter == 0 then the first block would be done with either OpenSSL
51 // or PHP and then subsequent blocks would then be done with libsodium but idk - it's not a high priority atm
52
53 // we could also make it so that if $this->counter == 0 and $this->continuousBuffer then do the first string
54 // with libsodium and subsequent strings with openssl or pure-PHP but again not a high priority
55 return function_exists('sodium_crypto_aead_chacha20poly1305_ietf_encrypt') &&
56 $this->key_length == 32 &&
57 (($this->usePoly1305 && !isset($this->poly1305Key) && $this->counter == 0) || $this->counter == 1) &&
58 !$this->continuousBuffer;
59 case self::ENGINE_OPENSSL:
60 // OpenSSL 1.1.0 (released 25 Aug 2016) added support for chacha20.
61 // PHP didn't support OpenSSL 1.1.0 until 7.0.19 (11 May 2017)
62
63 // if you attempt to provide openssl with a 128 bit key (as opposed to a 256 bit key) openssl will null
64 // pad the key to 256 bits and still use the expansion constant for 256-bit keys. the fact that
65 // openssl treats the IV as both the counter and nonce, however, let's us use openssl in continuous mode
66 // whereas libsodium does not
67 if ($this->key_length != 32) {
68 return false;
69 }
70 }
71
72 return parent::isValidEngineHelper($engine);
73 }
74
75 /**
76 * Encrypts a message.
77 *
78 * @return string $ciphertext
79 * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt()
80 * @see self::crypt()
81 */
82 public function encrypt(string $plaintext): string
83 {
84 $this->setup();
85
86 if ($this->engine == self::ENGINE_LIBSODIUM) {
87 return $this->encrypt_with_libsodium($plaintext);
88 }
89
90 return parent::encrypt($plaintext);
91 }
92
93 /**
94 * Decrypts a message.
95 *
96 * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)).
97 * At least if the continuous buffer is disabled.
98 *
99 * @return string $plaintext
100 * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt()
101 * @see self::crypt()
102 */
103 public function decrypt(string $ciphertext): string
104 {
105 $this->setup();
106
107 if ($this->engine == self::ENGINE_LIBSODIUM) {
108 return $this->decrypt_with_libsodium($ciphertext);
109 }
110
111 return parent::decrypt($ciphertext);
112 }
113
114 /**
115 * Encrypts a message with libsodium
116 *
117 * @return string $text
118 * @see self::encrypt()
119 */
120 private function encrypt_with_libsodium(string $plaintext): string
121 {
122 $params = [$plaintext, $this->aad, $this->nonce, $this->key];
123 $ciphertext = strlen($this->nonce) == 8 ?
124 sodium_crypto_aead_chacha20poly1305_encrypt(...$params) :
125 sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params);
126 if (!$this->usePoly1305) {
127 return substr($ciphertext, 0, strlen($plaintext));
128 }
129
130 $newciphertext = substr($ciphertext, 0, strlen($plaintext));
131
132 $this->newtag = $this->usingGeneratedPoly1305Key && strlen($this->nonce) == 12 ?
133 substr($ciphertext, strlen($plaintext)) :
134 $this->poly1305($newciphertext);
135
136 return $newciphertext;
137 }
138
139 /**
140 * Decrypts a message with libsodium
141 *
142 * @return string $text
143 * @see self::decrypt()
144 */
145 private function decrypt_with_libsodium(string $ciphertext): string
146 {
147 $params = [$ciphertext, $this->aad, $this->nonce, $this->key];
148
149 if (isset($this->poly1305Key)) {
150 if ($this->oldtag === false) {
151 throw new InsufficientSetupException('Authentication Tag has not been set');
152 }
153 if ($this->usingGeneratedPoly1305Key && strlen($this->nonce) == 12) {
154 $plaintext = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(...$params);
155 $this->oldtag = false;
156 if ($plaintext === false) {
157 throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match');
158 }
159 return $plaintext;
160 }
161 $newtag = $this->poly1305($ciphertext);
162 if ($this->oldtag != substr($newtag, 0, strlen($this->oldtag))) {
163 $this->oldtag = false;
164 throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match');
165 }
166 $this->oldtag = false;
167 }
168
169 $plaintext = strlen($this->nonce) == 8 ?
170 sodium_crypto_aead_chacha20poly1305_encrypt(...$params) :
171 sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params);
172
173 return substr($plaintext, 0, strlen($ciphertext));
174 }
175
176 /**
177 * Sets the nonce.
178 */
179 public function setNonce(string $nonce): void
180 {
181 if (!is_string($nonce)) {
182 throw new UnexpectedValueException('The nonce should be a string');
183 }
184
185 /*
186 from https://tools.ietf.org/html/rfc7539#page-7
187
188 "Note also that the original ChaCha had a 64-bit nonce and 64-bit
189 block count. We have modified this here to be more consistent with
190 recommendations in Section 3.2 of [RFC5116]."
191 */
192 switch (strlen($nonce)) {
193 case 8: // 64 bits
194 case 12: // 96 bits
195 break;
196 default:
197 throw new LengthException('Nonce of size ' . strlen($nonce) . ' not supported by this algorithm. Only 64-bit nonces or 96-bit nonces are supported');
198 }
199
200 $this->nonce = $nonce;
201 $this->changed = true;
202 $this->setEngine();
203 }
204
205 /**
206 * Setup the self::ENGINE_INTERNAL $engine
207 *
208 * (re)init, if necessary, the internal cipher $engine
209 *
210 * _setup() will be called each time if $changed === true
211 * typically this happens when using one or more of following public methods:
212 *
213 * - setKey()
214 *
215 * - setNonce()
216 *
217 * - First run of encrypt() / decrypt() with no init-settings
218 *
219 * @see self::setKey()
220 * @see self::setNonce()
221 * @see self::disableContinuousBuffer()
222 */
223 protected function setup(): void
224 {
225 if (!$this->changed) {
226 return;
227 }
228
229 $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'counter' => $this->counter];
230
231 $this->changed = $this->nonIVChanged = false;
232
233 if ($this->nonce === false) {
234 throw new InsufficientSetupException('No nonce has been defined');
235 }
236
237 if ($this->key === false) {
238 throw new InsufficientSetupException('No key has been defined');
239 }
240
241 if ($this->usePoly1305 && !isset($this->poly1305Key)) {
242 $this->usingGeneratedPoly1305Key = true;
243 if ($this->engine == self::ENGINE_LIBSODIUM) {
244 return;
245 }
246 $this->createPoly1305Key();
247 }
248
249 $key = $this->key;
250 if (strlen($key) == 16) {
251 $constant = 'expand 16-byte k';
252 $key .= $key;
253 } else {
254 $constant = 'expand 32-byte k';
255 }
256
257 $this->p1 = $constant . $key;
258 $this->p2 = $this->nonce;
259 if (strlen($this->nonce) == 8) {
260 $this->p2 = "\0\0\0\0" . $this->p2;
261 }
262 }
263
264 /**
265 * The quarterround function
266 */
267 protected static function quarterRound(int &$a, int &$b, int &$c, int &$d): void
268 {
269 // in https://datatracker.ietf.org/doc/html/rfc7539#section-2.1 the addition,
270 // xor'ing and rotation are all on the same line so i'm keeping it on the same
271 // line here as well
272 // @codingStandardsIgnoreStart
273 $a+= $b; $d = self::leftRotate(intval($d) ^ intval($a), 16);
274 $c+= $d; $b = self::leftRotate(intval($b) ^ intval($c), 12);
275 $a+= $b; $d = self::leftRotate(intval($d) ^ intval($a), 8);
276 $c+= $d; $b = self::leftRotate(intval($b) ^ intval($c), 7);
277 // @codingStandardsIgnoreEnd
278 }
279
280 /**
281 * The doubleround function
282 *
283 * @param int $x0 (by reference)
284 * @param int $x1 (by reference)
285 * @param int $x2 (by reference)
286 * @param int $x3 (by reference)
287 * @param int $x4 (by reference)
288 * @param int $x5 (by reference)
289 * @param int $x6 (by reference)
290 * @param int $x7 (by reference)
291 * @param int $x8 (by reference)
292 * @param int $x9 (by reference)
293 * @param int $x10 (by reference)
294 * @param int $x11 (by reference)
295 * @param int $x12 (by reference)
296 * @param int $x13 (by reference)
297 * @param int $x14 (by reference)
298 * @param int $x15 (by reference)
299 */
300 protected static function doubleRound(int &$x0, int &$x1, int &$x2, int &$x3, int &$x4, int &$x5, int &$x6, int &$x7, int &$x8, int &$x9, int &$x10, int &$x11, int &$x12, int &$x13, int &$x14, int &$x15): void
301 {
302 // columnRound
303 static::quarterRound($x0, $x4, $x8, $x12);
304 static::quarterRound($x1, $x5, $x9, $x13);
305 static::quarterRound($x2, $x6, $x10, $x14);
306 static::quarterRound($x3, $x7, $x11, $x15);
307 // rowRound
308 static::quarterRound($x0, $x5, $x10, $x15);
309 static::quarterRound($x1, $x6, $x11, $x12);
310 static::quarterRound($x2, $x7, $x8, $x13);
311 static::quarterRound($x3, $x4, $x9, $x14);
312 }
313
314 /**
315 * The Salsa20 hash function function
316 *
317 * On my laptop this loop unrolled / function dereferenced version of parent::salsa20 encrypts 1mb of text in
318 * 0.65s vs the 0.85s that it takes with the parent method.
319 *
320 * If we were free to assume that the host OS would always be 64-bits then the if condition in leftRotate could
321 * be eliminated and we could knock this done to 0.60s.
322 *
323 * For comparison purposes, RC4 takes 0.16s and AES in CTR mode with the Eval engine takes 0.48s.
324 * AES in CTR mode with the PHP engine takes 1.19s. Salsa20 / ChaCha20 do not benefit as much from the Eval
325 * approach due to the fact that there are a lot less variables to de-reference, fewer loops to unroll, etc
326 */
327 protected static function salsa20(string $x)
328 {
329 [, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15] = unpack('V*', $x);
330 $z0 = $x0;
331 $z1 = $x1;
332 $z2 = $x2;
333 $z3 = $x3;
334 $z4 = $x4;
335 $z5 = $x5;
336 $z6 = $x6;
337 $z7 = $x7;
338 $z8 = $x8;
339 $z9 = $x9;
340 $z10 = $x10;
341 $z11 = $x11;
342 $z12 = $x12;
343 $z13 = $x13;
344 $z14 = $x14;
345 $z15 = $x15;
346
347 // @codingStandardsIgnoreStart
348 // columnRound
349 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
350 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
351 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
352 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
353
354 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
355 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
356 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
357 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
358
359 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
360 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
361 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
362 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
363
364 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
365 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
366 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
367 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
368
369 // rowRound
370 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
371 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
372 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
373 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
374
375 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
376 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
377 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
378 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
379
380 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
381 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
382 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
383 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
384
385 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
386 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
387 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
388 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
389
390 // columnRound
391 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
392 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
393 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
394 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
395
396 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
397 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
398 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
399 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
400
401 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
402 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
403 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
404 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
405
406 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
407 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
408 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
409 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
410
411 // rowRound
412 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
413 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
414 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
415 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
416
417 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
418 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
419 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
420 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
421
422 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
423 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
424 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
425 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
426
427 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
428 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
429 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
430 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
431
432 // columnRound
433 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
434 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
435 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
436 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
437
438 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
439 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
440 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
441 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
442
443 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
444 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
445 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
446 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
447
448 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
449 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
450 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
451 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
452
453 // rowRound
454 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
455 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
456 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
457 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
458
459 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
460 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
461 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
462 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
463
464 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
465 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
466 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
467 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
468
469 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
470 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
471 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
472 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
473
474 // columnRound
475 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
476 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
477 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
478 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
479
480 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
481 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
482 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
483 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
484
485 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
486 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
487 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
488 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
489
490 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
491 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
492 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
493 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
494
495 // rowRound
496 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
497 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
498 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
499 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
500
501 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
502 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
503 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
504 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
505
506 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
507 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
508 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
509 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
510
511 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
512 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
513 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
514 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
515
516 // columnRound
517 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
518 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
519 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
520 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
521
522 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
523 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
524 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
525 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
526
527 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
528 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
529 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
530 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
531
532 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
533 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
534 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
535 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
536
537 // rowRound
538 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
539 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
540 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
541 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
542
543 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
544 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
545 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
546 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
547
548 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
549 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
550 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
551 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
552
553 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
554 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
555 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
556 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
557
558 // columnRound
559 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
560 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
561 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
562 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
563
564 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
565 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
566 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
567 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
568
569 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
570 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
571 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
572 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
573
574 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
575 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
576 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
577 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
578
579 // rowRound
580 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
581 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
582 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
583 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
584
585 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
586 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
587 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
588 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
589
590 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
591 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
592 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
593 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
594
595 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
596 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
597 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
598 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
599
600 // columnRound
601 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
602 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
603 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
604 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
605
606 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
607 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
608 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
609 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
610
611 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
612 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
613 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
614 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
615
616 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
617 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
618 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
619 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
620
621 // rowRound
622 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
623 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
624 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
625 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
626
627 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
628 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
629 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
630 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
631
632 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
633 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
634 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
635 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
636
637 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
638 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
639 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
640 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
641
642 // columnRound
643 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
644 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
645 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
646 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
647
648 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
649 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
650 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
651 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
652
653 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
654 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
655 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
656 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
657
658 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
659 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
660 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
661 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
662
663 // rowRound
664 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
665 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
666 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
667 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
668
669 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
670 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
671 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
672 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
673
674 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
675 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
676 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
677 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
678
679 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
680 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
681 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
682 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
683
684 // columnRound
685 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
686 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
687 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
688 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
689
690 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
691 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
692 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
693 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
694
695 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
696 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
697 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
698 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
699
700 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
701 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
702 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
703 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
704
705 // rowRound
706 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
707 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
708 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
709 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
710
711 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
712 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
713 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
714 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
715
716 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
717 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
718 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
719 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
720
721 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
722 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
723 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
724 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
725
726 // columnRound
727 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16);
728 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12);
729 $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8);
730 $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7);
731
732 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16);
733 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12);
734 $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8);
735 $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7);
736
737 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16);
738 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12);
739 $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8);
740 $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7);
741
742 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16);
743 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12);
744 $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8);
745 $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7);
746
747 // rowRound
748 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16);
749 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12);
750 $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8);
751 $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7);
752
753 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16);
754 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12);
755 $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8);
756 $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7);
757
758 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16);
759 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12);
760 $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8);
761 $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7);
762
763 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16);
764 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12);
765 $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8);
766 $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7);
767 // @codingStandardsIgnoreEnd
768
769 $x0 += $z0;
770 $x1 += $z1;
771 $x2 += $z2;
772 $x3 += $z3;
773 $x4 += $z4;
774 $x5 += $z5;
775 $x6 += $z6;
776 $x7 += $z7;
777 $x8 += $z8;
778 $x9 += $z9;
779 $x10 += $z10;
780 $x11 += $z11;
781 $x12 += $z12;
782 $x13 += $z13;
783 $x14 += $z14;
784 $x15 += $z15;
785
786 return pack('V*', $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15);
787 }
788 }
789