Coverage Report

Created: 2025-12-14 06:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rtpproxy/external/libre/src/hmac/hmac_sha1.c
Line
Count
Source
1
/**
2
 * @file hmac_sha1.c  Implements HMAC-SHA1 as of RFC 2202
3
 *
4
 * Copyright (C) 2010 Creytiv.com
5
 */
6
#include <string.h>
7
#include <re_types.h>
8
#ifdef USE_OPENSSL
9
#include <openssl/sha.h>
10
#include <openssl/hmac.h>
11
#include <openssl/err.h>
12
#else
13
#include <re_sha.h>
14
#endif
15
#include <re_hmac.h>
16
17
18
/** SHA-1 Block size */
19
#ifndef SHA_BLOCKSIZE
20
#define SHA_BLOCKSIZE   64
21
#endif
22
23
24
/**
25
 * Function to compute the digest
26
 *
27
 * @param k   Secret key
28
 * @param lk  Length of the key in bytes
29
 * @param d   Data
30
 * @param ld  Length of data in bytes
31
 * @param out Digest output
32
 * @param t   Size of digest output
33
 */
34
void hmac_sha1(const uint8_t *k,  /* secret key */
35
         size_t   lk,       /* length of the key in bytes */
36
         const uint8_t *d,  /* data */
37
         size_t   ld,       /* length of data in bytes */
38
         uint8_t *out,      /* output buffer, at least "t" bytes */
39
         size_t   t)
40
2
{
41
2
#ifdef USE_OPENSSL
42
2
  (void)t;
43
44
2
  if (!HMAC(EVP_sha1(), k, (int)lk, d, ld, out, NULL))
45
0
    ERR_clear_error();
46
#else
47
  SHA_CTX ictx, octx;
48
  uint8_t isha[SHA_DIGEST_LENGTH], osha[SHA_DIGEST_LENGTH];
49
  uint8_t key[SHA_DIGEST_LENGTH];
50
  uint8_t buf[SHA_BLOCKSIZE];
51
  size_t  i;
52
53
  if (lk > SHA_BLOCKSIZE) {
54
    SHA_CTX tctx;
55
56
    SHA1_Init(&tctx);
57
    SHA1_Update(&tctx, k, lk);
58
    SHA1_Final(key, &tctx);
59
60
    k = key;
61
    lk = SHA_DIGEST_LENGTH;
62
  }
63
64
  /**** Inner Digest ****/
65
66
  SHA1_Init(&ictx);
67
68
  /* Pad the key for inner digest */
69
  for (i = 0 ; i < lk ; ++i)
70
    buf[i] = k[i] ^ 0x36;
71
  for (i = lk ; i < SHA_BLOCKSIZE ; ++i)
72
    buf[i] = 0x36;
73
74
  SHA1_Update(&ictx, buf, SHA_BLOCKSIZE);
75
  SHA1_Update(&ictx, d, ld);
76
77
  SHA1_Final(isha, &ictx);
78
79
  /**** Outer Digest ****/
80
81
  SHA1_Init(&octx);
82
83
  /* Pad the key for outter digest */
84
85
  for (i = 0 ; i < lk ; ++i)
86
    buf[i] = k[i] ^ 0x5c;
87
  for (i = lk ; i < SHA_BLOCKSIZE ; ++i)
88
    buf[i] = 0x5c;
89
90
  SHA1_Update(&octx, buf, SHA_BLOCKSIZE);
91
  SHA1_Update(&octx, isha, SHA_DIGEST_LENGTH);
92
93
  SHA1_Final(osha, &octx);
94
95
  /* truncate and print the results */
96
  t = t > SHA_DIGEST_LENGTH ? SHA_DIGEST_LENGTH : t;
97
  memcpy(out, osha, t);
98
#endif
99
2
}