]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Return success/failure result from tls_prf_sha256()
authorJouni Malinen <j@w1.fi>
Thu, 27 Jun 2019 15:08:16 +0000 (18:08 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 9 Jul 2019 13:38:32 +0000 (16:38 +0300)
The hash functions used within this function could fail in theory, so
provide the result to the caller.

Signed-off-by: Jouni Malinen <j@w1.fi>
src/crypto/sha256-tlsprf.c
src/crypto/sha256.h

index 0528dadfdca604c3bb110319491856db417716a3..9045cd36b4893703008ba1cc2e975330de9cb092 100644 (file)
@@ -26,8 +26,8 @@
  * This function is used to derive new, cryptographically separate keys from a
  * given key in TLS. This PRF is defined in RFC 2246, Chapter 5.
  */
-void tls_prf_sha256(const u8 *secret, size_t secret_len, const char *label,
-                   const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
+int tls_prf_sha256(const u8 *secret, size_t secret_len, const char *label,
+                  const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
 {
        size_t clen;
        u8 A[SHA256_MAC_LEN];
@@ -50,12 +50,15 @@ void tls_prf_sha256(const u8 *secret, size_t secret_len, const char *label,
         * PRF(secret, label, seed) = P_SHA256(secret, label + seed)
         */
 
-       hmac_sha256_vector(secret, secret_len, 2, &addr[1], &len[1], A);
+       if (hmac_sha256_vector(secret, secret_len, 2, &addr[1], &len[1], A) < 0)
+               return -1;
 
        pos = 0;
        while (pos < outlen) {
-               hmac_sha256_vector(secret, secret_len, 3, addr, len, P);
-               hmac_sha256(secret, secret_len, A, SHA256_MAC_LEN, A);
+               if (hmac_sha256_vector(secret, secret_len, 3, addr, len, P) <
+                   0 ||
+                   hmac_sha256(secret, secret_len, A, SHA256_MAC_LEN, A) < 0)
+                       return -1;
 
                clen = outlen - pos;
                if (clen > SHA256_MAC_LEN)
@@ -63,4 +66,6 @@ void tls_prf_sha256(const u8 *secret, size_t secret_len, const char *label,
                os_memcpy(out + pos, P, clen);
                pos += clen;
        }
+
+       return 0;
 }
index 5219022edd7d636f4ff6d5abb603585bc6177a2a..8054bbe5c5141c3da3aed30d9a62715d1feafca3 100644 (file)
@@ -20,9 +20,9 @@ int sha256_prf(const u8 *key, size_t key_len, const char *label,
 int sha256_prf_bits(const u8 *key, size_t key_len, const char *label,
                    const u8 *data, size_t data_len, u8 *buf,
                    size_t buf_len_bits);
-void tls_prf_sha256(const u8 *secret, size_t secret_len,
-                   const char *label, const u8 *seed, size_t seed_len,
-                   u8 *out, size_t outlen);
+int tls_prf_sha256(const u8 *secret, size_t secret_len,
+                  const char *label, const u8 *seed, size_t seed_len,
+                  u8 *out, size_t outlen);
 int hmac_sha256_kdf(const u8 *secret, size_t secret_len,
                    const char *label, const u8 *seed, size_t seed_len,
                    u8 *out, size_t outlen);