angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

Ctx.php (4792B)


      1 <?php
      2 
      3 if (class_exists('ParagonIE_Sodium_Core_ChaCha20_Ctx', false)) {
      4     return;
      5 }
      6 
      7 /**
      8  * Class ParagonIE_Sodium_Core32_ChaCha20_Ctx
      9  */
     10 class ParagonIE_Sodium_Core32_ChaCha20_Ctx extends ParagonIE_Sodium_Core32_Util implements ArrayAccess
     11 {
     12     /**
     13      * @var SplFixedArray internally, <int, ParagonIE_Sodium_Core32_Int32>
     14      */
     15     protected $container;
     16 
     17     /**
     18      * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor.
     19      *
     20      * @internal You should not use this directly from another application
     21      *
     22      * @param string $key     ChaCha20 key.
     23      * @param string $iv      Initialization Vector (a.k.a. nonce).
     24      * @param string $counter The initial counter value.
     25      *                        Defaults to 8 0x00 bytes.
     26      * @throws InvalidArgumentException
     27      * @throws SodiumException
     28      * @throws TypeError
     29      */
     30     public function __construct($key = '', $iv = '', $counter = '')
     31     {
     32         if (self::strlen($key) !== 32) {
     33             throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.');
     34         }
     35         if (self::strlen($iv) !== 8) {
     36             throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.');
     37         }
     38         $this->container = new SplFixedArray(16);
     39 
     40         /* "expand 32-byte k" as per ChaCha20 spec */
     41         $this->container[0]  = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865));
     42         $this->container[1]  = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e));
     43         $this->container[2]  = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32));
     44         $this->container[3]  = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574));
     45 
     46         $this->container[4]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4));
     47         $this->container[5]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 4, 4));
     48         $this->container[6]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 8, 4));
     49         $this->container[7]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4));
     50         $this->container[8]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4));
     51         $this->container[9]  = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4));
     52         $this->container[10] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4));
     53         $this->container[11] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4));
     54 
     55         if (empty($counter)) {
     56             $this->container[12] = new ParagonIE_Sodium_Core32_Int32();
     57             $this->container[13] = new ParagonIE_Sodium_Core32_Int32();
     58         } else {
     59             $this->container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4));
     60             $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 4, 4));
     61         }
     62         $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4));
     63         $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4));
     64     }
     65 
     66     /**
     67      * @internal You should not use this directly from another application
     68      *
     69      * @param int $offset
     70      * @param int|ParagonIE_Sodium_Core32_Int32 $value
     71      * @return void
     72      */
     73     public function offsetSet($offset, $value)
     74     {
     75         if (!is_int($offset)) {
     76             throw new InvalidArgumentException('Expected an integer');
     77         }
     78         if ($value instanceof ParagonIE_Sodium_Core32_Int32) {
     79             /*
     80         } elseif (is_int($value)) {
     81             $value = ParagonIE_Sodium_Core32_Int32::fromInt($value);
     82             */
     83         } else {
     84             throw new InvalidArgumentException('Expected an integer');
     85         }
     86         $this->container[$offset] = $value;
     87     }
     88 
     89     /**
     90      * @internal You should not use this directly from another application
     91      *
     92      * @param int $offset
     93      * @return bool
     94      * @psalm-suppress MixedArrayOffset
     95      */
     96     public function offsetExists($offset)
     97     {
     98         return isset($this->container[$offset]);
     99     }
    100 
    101     /**
    102      * @internal You should not use this directly from another application
    103      *
    104      * @param int $offset
    105      * @return void
    106      * @psalm-suppress MixedArrayOffset
    107      */
    108     public function offsetUnset($offset)
    109     {
    110         unset($this->container[$offset]);
    111     }
    112 
    113     /**
    114      * @internal You should not use this directly from another application
    115      *
    116      * @param int $offset
    117      * @return mixed|null
    118      * @psalm-suppress MixedArrayOffset
    119      */
    120     public function offsetGet($offset)
    121     {
    122         return isset($this->container[$offset])
    123             ? $this->container[$offset]
    124             : null;
    125     }
    126 }