Coverage Report

Created: 2025-04-24 06:18

/src/hostap/src/crypto/sha1-prf.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * SHA1-based PRF
3
 * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi>
4
 *
5
 * This software may be distributed under the terms of the BSD license.
6
 * See README for more details.
7
 */
8
9
#include "includes.h"
10
11
#include "common.h"
12
#include "sha1.h"
13
#include "crypto.h"
14
15
16
/**
17
 * sha1_prf - SHA1-based Pseudo-Random Function (PRF) (IEEE 802.11i, 8.5.1.1)
18
 * @key: Key for PRF
19
 * @key_len: Length of the key in bytes
20
 * @label: A unique label for each purpose of the PRF
21
 * @data: Extra data to bind into the key
22
 * @data_len: Length of the data
23
 * @buf: Buffer for the generated pseudo-random key
24
 * @buf_len: Number of bytes of key to generate
25
 * Returns: 0 on success, -1 of failure
26
 *
27
 * This function is used to derive new, cryptographically separate keys from a
28
 * given key (e.g., PMK in IEEE 802.11i).
29
 */
30
int sha1_prf(const u8 *key, size_t key_len, const char *label,
31
       const u8 *data, size_t data_len, u8 *buf, size_t buf_len)
32
9.48k
{
33
9.48k
  u8 counter = 0;
34
9.48k
  size_t pos, plen;
35
9.48k
  u8 hash[SHA1_MAC_LEN];
36
9.48k
  size_t label_len = os_strlen(label) + 1;
37
9.48k
  const unsigned char *addr[3];
38
9.48k
  size_t len[3];
39
40
9.48k
  addr[0] = (u8 *) label;
41
9.48k
  len[0] = label_len;
42
9.48k
  addr[1] = data;
43
9.48k
  len[1] = data_len;
44
9.48k
  addr[2] = &counter;
45
9.48k
  len[2] = 1;
46
47
9.48k
  pos = 0;
48
28.4k
  while (pos < buf_len) {
49
28.4k
    plen = buf_len - pos;
50
28.4k
    if (plen >= SHA1_MAC_LEN) {
51
18.9k
      if (hmac_sha1_vector(key, key_len, 3, addr, len,
52
18.9k
               &buf[pos]))
53
0
        return -1;
54
18.9k
      pos += SHA1_MAC_LEN;
55
18.9k
    } else {
56
9.48k
      if (hmac_sha1_vector(key, key_len, 3, addr, len,
57
9.48k
               hash))
58
0
        return -1;
59
9.48k
      os_memcpy(&buf[pos], hash, plen);
60
9.48k
      break;
61
9.48k
    }
62
18.9k
    counter++;
63
18.9k
  }
64
9.48k
  forced_memzero(hash, sizeof(hash));
65
66
9.48k
  return 0;
67
9.48k
}