public static HKDF extractedFrom(byte[] salt, byte[] ikm) {
        validateExtractionParams(salt, ikm);
        /*
          RFC-5869, Step 2.2, Extract:

          HKDF-Extract(salt, IKM) -> PRK

          Options:
             Hash     a hash function; HashLen denotes the length of the
                      hash function output in octets

          Inputs:
             salt     optional salt value (a non-secret random value);
                      if not provided, it is set to a string of HashLen zeros.
             IKM      input keying material

          Output:
             PRK      a pseudorandom key (of HashLen octets)

          The output PRK is calculated as follows:

          PRK = HMAC-Hash(salt, IKM)
        */
        var mac = createKeyedHmacSha256(salt); // Note: HKDF is initially keyed on the salt, _not_ on ikm!
        mac.update(ikm);
        return new HKDF(/*PRK = */ mac.doFinal());
    }
Creates and returns a new HKDF instance extracted from the given salt and key.

<p>Both the salt and input key value may be of arbitrary size, but it is recommended
to have both be at least 16 bytes in size.</p>

@param salt a non-secret salt value. Should ideally be high entropy and functionally
            "as if random". May not be empty, use {@link #unsaltedExtractedFrom(byte[])}
            if unsalted extraction is desired (though this is not recommended).
@param ikm secret initial Input Keying Material value.
@return a new HKDF instance ready for deriving keys based on the salt and IKM.
security-utils/src/main/java/com/yahoo/security/HKDF.java