Diff: STRATO-apps/wordpress_03/app/wp-includes/sodium_compat/src/Core/AEGIS256.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 +
3 + if (!defined('SODIUM_COMPAT_AEGIS_C0')) {
4 + define('SODIUM_COMPAT_AEGIS_C0', "\x00\x01\x01\x02\x03\x05\x08\x0d\x15\x22\x37\x59\x90\xe9\x79\x62");
5 + }
6 + if (!defined('SODIUM_COMPAT_AEGIS_C1')) {
7 + define('SODIUM_COMPAT_AEGIS_C1', "\xdb\x3d\x18\x55\x6d\xc2\x2f\xf1\x20\x11\x31\x42\x73\xb5\x28\xdd");
8 + }
9 +
10 + class ParagonIE_Sodium_Core_AEGIS256 extends ParagonIE_Sodium_Core_AES
11 + {
12 + /**
13 + * @param string $ct
14 + * @param string $tag
15 + * @param string $ad
16 + * @param string $key
17 + * @param string $nonce
18 + * @return string
19 + * @throws SodiumException
20 + */
21 + public static function decrypt($ct, $tag, $ad, $key, $nonce)
22 + {
23 + $state = self::init($key, $nonce);
24 +
25 + // ad_blocks = Split(ZeroPad(ad, 128), 128)
26 + $ad_blocks = (self::strlen($ad) + 15) >> 4;
27 + // for ai in ad_blocks:
28 + // Absorb(ai)
29 + for ($i = 0; $i < $ad_blocks; ++$i) {
30 + $ai = self::substr($ad, $i << 4, 16);
31 + if (self::strlen($ai) < 16) {
32 + $ai = str_pad($ai, 16, "\0", STR_PAD_RIGHT);
33 + }
34 + $state->absorb($ai);
35 + }
36 +
37 + $msg = '';
38 + $cn = self::strlen($ct) & 15;
39 + $ct_blocks = self::strlen($ct) >> 4;
40 + // ct_blocks = Split(ZeroPad(ct, 128), 128)
41 + // cn = Tail(ct, |ct| mod 128)
42 + for ($i = 0; $i < $ct_blocks; ++$i) {
43 + $msg .= $state->dec(self::substr($ct, $i << 4, 16));
44 + }
45 + // if cn is not empty:
46 + // msg = msg || DecPartial(cn)
47 + if ($cn) {
48 + $start = $ct_blocks << 4;
49 + $msg .= $state->decPartial(self::substr($ct, $start, $cn));
50 + }
51 + $expected_tag = $state->finalize(
52 + self::strlen($ad) << 3,
53 + self::strlen($msg) << 3
54 + );
55 + if (!self::hashEquals($expected_tag, $tag)) {
56 + try {
57 + // The RFC says to erase msg, so we shall try:
58 + ParagonIE_Sodium_Compat::memzero($msg);
59 + } catch (SodiumException $ex) {
60 + // Do nothing if we cannot memzero
61 + }
62 + throw new SodiumException('verification failed');
63 + }
64 + return $msg;
65 + }
66 +
67 + /**
68 + * @param string $msg
69 + * @param string $ad
70 + * @param string $key
71 + * @param string $nonce
72 + * @return array
73 + * @throws SodiumException
74 + */
75 + public static function encrypt($msg, $ad, $key, $nonce)
76 + {
77 + $state = self::init($key, $nonce);
78 + $ad_len = self::strlen($ad);
79 + $msg_len = self::strlen($msg);
80 + $ad_blocks = ($ad_len + 15) >> 4;
81 + for ($i = 0; $i < $ad_blocks; ++$i) {
82 + $ai = self::substr($ad, $i << 4, 16);
83 + if (self::strlen($ai) < 16) {
84 + $ai = str_pad($ai, 16, "\0", STR_PAD_RIGHT);
85 + }
86 + $state->absorb($ai);
87 + }
88 +
89 + $ct = '';
90 + $msg_blocks = ($msg_len + 15) >> 4;
91 + for ($i = 0; $i < $msg_blocks; ++$i) {
92 + $xi = self::substr($msg, $i << 4, 16);
93 + if (self::strlen($xi) < 16) {
94 + $xi = str_pad($xi, 16, "\0", STR_PAD_RIGHT);
95 + }
96 + $ct .= $state->enc($xi);
97 + }
98 + $tag = $state->finalize(
99 + $ad_len << 3,
100 + $msg_len << 3
101 + );
102 + return array(
103 + self::substr($ct, 0, $msg_len),
104 + $tag
105 + );
106 +
107 + }
108 +
109 + /**
110 + * @param string $key
111 + * @param string $nonce
112 + * @return ParagonIE_Sodium_Core_AEGIS_State256
113 + */
114 + public static function init($key, $nonce)
115 + {
116 + return ParagonIE_Sodium_Core_AEGIS_State256::init($key, $nonce);
117 + }
118 + }
119 +