xref: /aosp_15_r20/external/webrtc/pc/external_hmac.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2014 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "pc/external_hmac.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <stdlib.h>  // For malloc/free.
14*d9f75844SAndroid Build Coastguard Worker #include <string.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/logging.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/zero_memory.h"
18*d9f75844SAndroid Build Coastguard Worker #include "third_party/libsrtp/include/srtp.h"
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker // Begin test case 0 */
21*d9f75844SAndroid Build Coastguard Worker static const uint8_t kExternalHmacTestCase0Key[20] = {
22*d9f75844SAndroid Build Coastguard Worker     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
23*d9f75844SAndroid Build Coastguard Worker     0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
24*d9f75844SAndroid Build Coastguard Worker 
25*d9f75844SAndroid Build Coastguard Worker static const uint8_t kExternalHmacTestCase0Data[8] = {
26*d9f75844SAndroid Build Coastguard Worker     0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65  // "Hi There"
27*d9f75844SAndroid Build Coastguard Worker };
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker static const uint8_t kExternalHmacFakeTag[10] = {0xba, 0xdd, 0xba, 0xdd, 0xba,
30*d9f75844SAndroid Build Coastguard Worker                                                  0xdd, 0xba, 0xdd, 0xba, 0xdd};
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker static const srtp_auth_test_case_t kExternalHmacTestCase0 = {
33*d9f75844SAndroid Build Coastguard Worker     20,                                                // Octets in key
34*d9f75844SAndroid Build Coastguard Worker     const_cast<uint8_t*>(kExternalHmacTestCase0Key),   // Key
35*d9f75844SAndroid Build Coastguard Worker     8,                                                 // Octets in data
36*d9f75844SAndroid Build Coastguard Worker     const_cast<uint8_t*>(kExternalHmacTestCase0Data),  // Data
37*d9f75844SAndroid Build Coastguard Worker     10,                                                // Octets in tag
38*d9f75844SAndroid Build Coastguard Worker     const_cast<uint8_t*>(kExternalHmacFakeTag),        // Tag
39*d9f75844SAndroid Build Coastguard Worker     NULL                                               // Pointer to next
40*d9f75844SAndroid Build Coastguard Worker                                                        // testcase
41*d9f75844SAndroid Build Coastguard Worker };
42*d9f75844SAndroid Build Coastguard Worker 
43*d9f75844SAndroid Build Coastguard Worker static const char kExternalHmacDescription[] =
44*d9f75844SAndroid Build Coastguard Worker     "external hmac sha-1 authentication";
45*d9f75844SAndroid Build Coastguard Worker 
46*d9f75844SAndroid Build Coastguard Worker // srtp_auth_type_t external_hmac is the hmac metaobject
47*d9f75844SAndroid Build Coastguard Worker 
48*d9f75844SAndroid Build Coastguard Worker static const srtp_auth_type_t external_hmac = {
49*d9f75844SAndroid Build Coastguard Worker     external_hmac_alloc,
50*d9f75844SAndroid Build Coastguard Worker     external_hmac_dealloc,
51*d9f75844SAndroid Build Coastguard Worker     external_hmac_init,
52*d9f75844SAndroid Build Coastguard Worker     external_hmac_compute,
53*d9f75844SAndroid Build Coastguard Worker     external_hmac_update,
54*d9f75844SAndroid Build Coastguard Worker     external_hmac_start,
55*d9f75844SAndroid Build Coastguard Worker     const_cast<char*>(kExternalHmacDescription),
56*d9f75844SAndroid Build Coastguard Worker     const_cast<srtp_auth_test_case_t*>(&kExternalHmacTestCase0),
57*d9f75844SAndroid Build Coastguard Worker     EXTERNAL_HMAC_SHA1};
58*d9f75844SAndroid Build Coastguard Worker 
external_hmac_alloc(srtp_auth_t ** a,int key_len,int out_len)59*d9f75844SAndroid Build Coastguard Worker srtp_err_status_t external_hmac_alloc(srtp_auth_t** a,
60*d9f75844SAndroid Build Coastguard Worker                                       int key_len,
61*d9f75844SAndroid Build Coastguard Worker                                       int out_len) {
62*d9f75844SAndroid Build Coastguard Worker   uint8_t* pointer;
63*d9f75844SAndroid Build Coastguard Worker 
64*d9f75844SAndroid Build Coastguard Worker   // Check key length - note that we don't support keys larger
65*d9f75844SAndroid Build Coastguard Worker   // than 20 bytes yet
66*d9f75844SAndroid Build Coastguard Worker   if (key_len > 20)
67*d9f75844SAndroid Build Coastguard Worker     return srtp_err_status_bad_param;
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker   // Check output length - should be less than 20 bytes/
70*d9f75844SAndroid Build Coastguard Worker   if (out_len > 20)
71*d9f75844SAndroid Build Coastguard Worker     return srtp_err_status_bad_param;
72*d9f75844SAndroid Build Coastguard Worker 
73*d9f75844SAndroid Build Coastguard Worker   // Allocate memory for auth and hmac_ctx_t structures.
74*d9f75844SAndroid Build Coastguard Worker   pointer = new uint8_t[(sizeof(ExternalHmacContext) + sizeof(srtp_auth_t))];
75*d9f75844SAndroid Build Coastguard Worker   if (pointer == NULL)
76*d9f75844SAndroid Build Coastguard Worker     return srtp_err_status_alloc_fail;
77*d9f75844SAndroid Build Coastguard Worker 
78*d9f75844SAndroid Build Coastguard Worker   // Set pointers
79*d9f75844SAndroid Build Coastguard Worker   *a = reinterpret_cast<srtp_auth_t*>(pointer);
80*d9f75844SAndroid Build Coastguard Worker   // `external_hmac` is const and libsrtp expects `type` to be non-const.
81*d9f75844SAndroid Build Coastguard Worker   // const conversion is required. `external_hmac` is constant because we don't
82*d9f75844SAndroid Build Coastguard Worker   // want to increase global count in Chrome.
83*d9f75844SAndroid Build Coastguard Worker   (*a)->type = const_cast<srtp_auth_type_t*>(&external_hmac);
84*d9f75844SAndroid Build Coastguard Worker   (*a)->state = pointer + sizeof(srtp_auth_t);
85*d9f75844SAndroid Build Coastguard Worker   (*a)->out_len = out_len;
86*d9f75844SAndroid Build Coastguard Worker   (*a)->key_len = key_len;
87*d9f75844SAndroid Build Coastguard Worker   (*a)->prefix_len = 0;
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker   return srtp_err_status_ok;
90*d9f75844SAndroid Build Coastguard Worker }
91*d9f75844SAndroid Build Coastguard Worker 
external_hmac_dealloc(srtp_auth_t * a)92*d9f75844SAndroid Build Coastguard Worker srtp_err_status_t external_hmac_dealloc(srtp_auth_t* a) {
93*d9f75844SAndroid Build Coastguard Worker   rtc::ExplicitZeroMemory(a, sizeof(ExternalHmacContext) + sizeof(srtp_auth_t));
94*d9f75844SAndroid Build Coastguard Worker 
95*d9f75844SAndroid Build Coastguard Worker   // Free memory
96*d9f75844SAndroid Build Coastguard Worker   delete[] a;
97*d9f75844SAndroid Build Coastguard Worker 
98*d9f75844SAndroid Build Coastguard Worker   return srtp_err_status_ok;
99*d9f75844SAndroid Build Coastguard Worker }
100*d9f75844SAndroid Build Coastguard Worker 
external_hmac_init(void * state,const uint8_t * key,int key_len)101*d9f75844SAndroid Build Coastguard Worker srtp_err_status_t external_hmac_init(void* state,
102*d9f75844SAndroid Build Coastguard Worker                                      const uint8_t* key,
103*d9f75844SAndroid Build Coastguard Worker                                      int key_len) {
104*d9f75844SAndroid Build Coastguard Worker   if (key_len > HMAC_KEY_LENGTH)
105*d9f75844SAndroid Build Coastguard Worker     return srtp_err_status_bad_param;
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker   ExternalHmacContext* context = static_cast<ExternalHmacContext*>(state);
108*d9f75844SAndroid Build Coastguard Worker   memcpy(context->key, key, key_len);
109*d9f75844SAndroid Build Coastguard Worker   context->key_length = key_len;
110*d9f75844SAndroid Build Coastguard Worker   return srtp_err_status_ok;
111*d9f75844SAndroid Build Coastguard Worker }
112*d9f75844SAndroid Build Coastguard Worker 
external_hmac_start(void *)113*d9f75844SAndroid Build Coastguard Worker srtp_err_status_t external_hmac_start(void* /*state*/) {
114*d9f75844SAndroid Build Coastguard Worker   return srtp_err_status_ok;
115*d9f75844SAndroid Build Coastguard Worker }
116*d9f75844SAndroid Build Coastguard Worker 
external_hmac_update(void *,const uint8_t *,int)117*d9f75844SAndroid Build Coastguard Worker srtp_err_status_t external_hmac_update(void* /*state*/,
118*d9f75844SAndroid Build Coastguard Worker                                        const uint8_t* /*message*/,
119*d9f75844SAndroid Build Coastguard Worker                                        int /*msg_octets*/) {
120*d9f75844SAndroid Build Coastguard Worker   return srtp_err_status_ok;
121*d9f75844SAndroid Build Coastguard Worker }
122*d9f75844SAndroid Build Coastguard Worker 
external_hmac_compute(void *,const uint8_t *,int,int tag_len,uint8_t * result)123*d9f75844SAndroid Build Coastguard Worker srtp_err_status_t external_hmac_compute(void* /*state*/,
124*d9f75844SAndroid Build Coastguard Worker                                         const uint8_t* /*message*/,
125*d9f75844SAndroid Build Coastguard Worker                                         int /*msg_octets*/,
126*d9f75844SAndroid Build Coastguard Worker                                         int tag_len,
127*d9f75844SAndroid Build Coastguard Worker                                         uint8_t* result) {
128*d9f75844SAndroid Build Coastguard Worker   memcpy(result, kExternalHmacFakeTag, tag_len);
129*d9f75844SAndroid Build Coastguard Worker   return srtp_err_status_ok;
130*d9f75844SAndroid Build Coastguard Worker }
131*d9f75844SAndroid Build Coastguard Worker 
external_crypto_init()132*d9f75844SAndroid Build Coastguard Worker srtp_err_status_t external_crypto_init() {
133*d9f75844SAndroid Build Coastguard Worker   // `external_hmac` is const. const_cast is required as libsrtp expects
134*d9f75844SAndroid Build Coastguard Worker   // non-const.
135*d9f75844SAndroid Build Coastguard Worker   srtp_err_status_t status = srtp_replace_auth_type(
136*d9f75844SAndroid Build Coastguard Worker       const_cast<srtp_auth_type_t*>(&external_hmac), EXTERNAL_HMAC_SHA1);
137*d9f75844SAndroid Build Coastguard Worker   if (status) {
138*d9f75844SAndroid Build Coastguard Worker     RTC_LOG(LS_ERROR) << "Error in replacing default auth module, error: "
139*d9f75844SAndroid Build Coastguard Worker                       << status;
140*d9f75844SAndroid Build Coastguard Worker     return srtp_err_status_fail;
141*d9f75844SAndroid Build Coastguard Worker   }
142*d9f75844SAndroid Build Coastguard Worker   return srtp_err_status_ok;
143*d9f75844SAndroid Build Coastguard Worker }
144