MediaWiki REL1_35
CryptHKDF Class Reference
Collaboration diagram for CryptHKDF:

Public Member Functions

 __construct ( $secretKeyMaterial, $algorithm, BagOStuff $cache, $context)
 
 __destruct ()
 Save the last block generated, so the next user will compute a different PRK from the same SKM.
 
 generate ( $bytes, $context='')
 Produce $bytes of secure random data.
 

Static Public Member Functions

static HKDF ( $hash, $ikm, $salt, $info, $L)
 RFC5869 defines HKDF in 2 steps, extraction and expansion.
 

Static Public Attributes

static int[] $hashLength
 Round count is computed based on the hash'es output length, which neither php nor openssl seem to provide easily.
 

Protected Member Functions

 getSaltUsingCache ()
 MW specific salt, cached from last run.
 

Protected Attributes

string $algorithm = null
 The hash algorithm being used.
 
BagOStuff $cache = null
 The persistent cache.
 
string $cacheKey = null
 Cache key we'll use for our salt.
 
array $context = []
 a "context information" string CTXinfo (which may be null) See http://eprint.iacr.org/2010/264.pdf Section 4.1
 
string $lastK
 The last block (K(i)) of the most recent expanded key.
 
string $salt = ''
 binary string, the salt for the HKDF
 

Static Private Member Functions

static HKDFExpand ( $hash, $prk, $info, $bytes, &$lastK='')
 Expand the key with the given context.
 
static HKDFExtract ( $hash, $salt, $ikm)
 Extract the PRK, PRK = HMAC(XTS, SKM) Note that the hmac is keyed with XTS (the salt), and the SKM (source key material) is the "data".
 

Private Attributes

string $prk = ''
 The pseudorandom key.
 
string $skm
 The secret key material.
 

Detailed Description

Definition at line 33 of file CryptHKDF.php.

Constructor & Destructor Documentation

◆ __construct()

CryptHKDF::__construct (   $secretKeyMaterial,
  $algorithm,
BagOStuff  $cache,
  $context 
)
Parameters
string$secretKeyMaterial
string$algorithmName of hashing algorithm
BagOStuff$cache
string | array$contextContext to mix into HKDF context
Exceptions
InvalidArgumentExceptionif secret key material is too short

Definition at line 109 of file CryptHKDF.php.

References $cache.

◆ __destruct()

CryptHKDF::__destruct ( )

Save the last block generated, so the next user will compute a different PRK from the same SKM.

This should keep things unpredictable even if an attacker is able to influence CTXinfo.

Definition at line 129 of file CryptHKDF.php.

Member Function Documentation

◆ generate()

CryptHKDF::generate (   $bytes,
  $context = '' 
)

Produce $bytes of secure random data.

As a side-effect, $this->lastK is set to the last hashLen block of key material.

Parameters
int$bytesNumber of bytes of data
string$contextContext to mix into CTXinfo
Returns
string Binary string of length $bytes

Definition at line 165 of file CryptHKDF.php.

References getSaltUsingCache().

◆ getSaltUsingCache()

CryptHKDF::getSaltUsingCache ( )
protected

MW specific salt, cached from last run.

Returns
string Binary string

Definition at line 139 of file CryptHKDF.php.

Referenced by generate().

◆ HKDF()

static CryptHKDF::HKDF (   $hash,
  $ikm,
  $salt,
  $info,
  $L 
)
static

RFC5869 defines HKDF in 2 steps, extraction and expansion.

From http://eprint.iacr.org/2010/264.pdf:

The scheme HKDF is specifed as: HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t) where the values K(i) are defined as follows: PRK = HMAC(XTS, SKM) K(1) = HMAC(PRK, CTXinfo || 0); K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t; where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits; the counter i is non-wrapping and of a given fixed size, e.g., a single byte. Note that the length of the HMAC output is the same as its key length and therefore the scheme is well defined.

XTS is the "extractor salt" SKM is the "secret keying material"

N.B. http://eprint.iacr.org/2010/264.pdf seems to differ from RFC 5869 in that the test vectors from RFC 5869 only work if K(0) = '' and K(1) = HMAC(PRK, K(0) || CTXinfo || 1)

Parameters
string$hashThe hashing function to use (e.g., sha256)
string$ikmThe input keying material
string$saltThe salt to add to the ikm, to get the prk
string$infoOptional context (change the output without affecting the randomness properties of the output)
int$LNumber of bytes to return
Returns
string Cryptographically secure pseudorandom binary string

Definition at line 215 of file CryptHKDF.php.

◆ HKDFExpand()

static CryptHKDF::HKDFExpand (   $hash,
  $prk,
  $info,
  $bytes,
$lastK = '' 
)
staticprivate

Expand the key with the given context.

Parameters
string$hashHashing Algorithm
string$prkA pseudorandom key of at least HashLen octets (usually, the output from the extract step)
string$infoOptional context and application specific information (can be a zero-length string)
int$bytesLength of output keying material in bytes (<= 255*HashLen)
string&$lastKSet by this function to the last block of the expansion. In MediaWiki, this is used to seed future Extractions.
Returns
string Cryptographically secure random string $bytes long
Exceptions
InvalidArgumentException

Definition at line 250 of file CryptHKDF.php.

◆ HKDFExtract()

static CryptHKDF::HKDFExtract (   $hash,
  $salt,
  $ikm 
)
staticprivate

Extract the PRK, PRK = HMAC(XTS, SKM) Note that the hmac is keyed with XTS (the salt), and the SKM (source key material) is the "data".

Parameters
string$hashThe hashing function to use (e.g., sha256)
string$saltThe salt to add to the ikm, to get the prk
string$ikmThe input keying material
Returns
string Binary string (pseudorandm key) used as input to HKDFExpand

Definition at line 231 of file CryptHKDF.php.

Member Data Documentation

◆ $algorithm

string CryptHKDF::$algorithm = null
protected

The hash algorithm being used.

Definition at line 48 of file CryptHKDF.php.

◆ $cache

BagOStuff CryptHKDF::$cache = null
protected

The persistent cache.

Definition at line 38 of file CryptHKDF.php.

◆ $cacheKey

string CryptHKDF::$cacheKey = null
protected

Cache key we'll use for our salt.

Definition at line 43 of file CryptHKDF.php.

◆ $context

array CryptHKDF::$context = []
protected

a "context information" string CTXinfo (which may be null) See http://eprint.iacr.org/2010/264.pdf Section 4.1

Definition at line 80 of file CryptHKDF.php.

◆ $hashLength

int [] CryptHKDF::$hashLength
static
Initial value:
= [
'md5' => 16,
'sha1' => 20,
'sha224' => 28,
'sha256' => 32,
'sha384' => 48,
'sha512' => 64,
'ripemd128' => 16,
'ripemd160' => 20,
'ripemd256' => 32,
'ripemd320' => 40,
'whirlpool' => 64,
]

Round count is computed based on the hash'es output length, which neither php nor openssl seem to provide easily.

Definition at line 88 of file CryptHKDF.php.

◆ $lastK

string CryptHKDF::$lastK
protected

The last block (K(i)) of the most recent expanded key.

Definition at line 72 of file CryptHKDF.php.

◆ $prk

string CryptHKDF::$prk = ''
private

The pseudorandom key.

Definition at line 59 of file CryptHKDF.php.

◆ $salt

string CryptHKDF::$salt = ''
protected

binary string, the salt for the HKDF

See also
getSaltUsingCache

Definition at line 54 of file CryptHKDF.php.

◆ $skm

string CryptHKDF::$skm
private

The secret key material.

This must be kept secret to preserve the security properties of this RNG.

Definition at line 67 of file CryptHKDF.php.


The documentation for this class was generated from the following file: