1#ifndef __KINESIS_VIDEO_WEBRTC_CLIENT_CRYPTO_CRYPTO__
2#define __KINESIS_VIDEO_WEBRTC_CLIENT_CRYPTO_CRYPTO__
11#include <openssl/opensslv.h>
20#if OPENSSL_VERSION_NUMBER >= 0x30000000L
21#define KVS_SSL_GET_PEER_CERTIFICATE(ssl) SSL_get1_peer_certificate(ssl)
23#define KVS_SSL_GET_PEER_CERTIFICATE(ssl) SSL_get_peer_certificate(ssl)
26#define KVS_RSA_F4 RSA_F4
27#define KVS_MD5_DIGEST_LENGTH MD5_DIGEST_LENGTH
28#define KVS_SHA1_DIGEST_LENGTH SHA_DIGEST_LENGTH
31#if OPENSSL_VERSION_NUMBER >= 0x30000000L
32#define KVS_MD5_DIGEST(m, mlen, ob) \
33 CHK(1 == EVP_Q_digest(NULL, "MD5", NULL, (m), (mlen), (ob), NULL), STATUS_ICE_FAILED_TO_COMPUTE_MD5_FOR_LONG_TERM_CREDENTIAL);
35#define KVS_MD5_DIGEST(m, mlen, ob) CHK(NULL != MD5((m), (mlen), (ob)), STATUS_ICE_FAILED_TO_COMPUTE_MD5_FOR_LONG_TERM_CREDENTIAL);
39#if OPENSSL_VERSION_NUMBER >= 0x30000000L
40STATUS kvsSha1Hmac(
const PBYTE pKey,
size_t keyLen,
const PBYTE pMessage,
size_t messageLen, PBYTE pOutput, PUINT32 pOutputLen);
41#define KVS_SHA1_HMAC(k, klen, m, mlen, ob, plen) \
42 CHK_STATUS(kvsSha1Hmac((const PBYTE)(k), (size_t) (klen), (const PBYTE)(m), (size_t) (mlen), (ob), (plen)));
44#define KVS_SHA1_HMAC(k, klen, m, mlen, ob, plen) \
45 CHK(NULL != HMAC(EVP_sha1(), (k), (INT32) (klen), (m), (mlen), (ob), (plen)), STATUS_HMAC_GENERATION_ERROR);
53#if OPENSSL_VERSION_NUMBER >= 0x30000000L
54#define KVS_CRYPTO_INIT() \
56 OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_NO_ATEXIT, NULL); \
59#define KVS_CRYPTO_INIT() \
61 OpenSSL_add_ssl_algorithms(); \
62 SSL_load_error_strings(); \
67#define LOG_OPENSSL_ERROR(s) \
68 while ((sslErr = ERR_get_error()) != 0) { \
69 if (sslErr != SSL_ERROR_WANT_WRITE && sslErr != SSL_ERROR_WANT_READ) { \
70 DLOGW("%s failed with %s", (s), ERR_error_string(sslErr, NULL)); \
75 KVS_SRTP_PROFILE_AES128_CM_HMAC_SHA1_80 = SRTP_AES128_CM_SHA1_80,
76 KVS_SRTP_PROFILE_AES128_CM_HMAC_SHA1_32 = SRTP_AES128_CM_SHA1_32,
79#define KVS_RSA_F4 0x10001L
80#define KVS_MD5_DIGEST_LENGTH 16
81#define KVS_SHA1_DIGEST_LENGTH 20
84#define KVS_MD5_DIGEST(m, mlen, ob) \
85 CHK(0 == mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), (m), (mlen), (ob)), STATUS_ICE_FAILED_TO_COMPUTE_MD5_FOR_LONG_TERM_CREDENTIAL);
86#define KVS_SHA1_HMAC(k, klen, m, mlen, ob, plen) \
87 CHK(0 == mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), (k), (klen), (m), (mlen), (ob)), STATUS_HMAC_GENERATION_ERROR); \
88 *(plen) = mbedtls_md_get_size(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1));
89#if MBEDTLS_VERSION_MAJOR >= 4
93#define KVS_CRYPTO_INIT() \
95 (void) psa_crypto_init(); \
98#define KVS_CRYPTO_INIT() \
102#define LOG_MBEDTLS_ERROR(s, ret) \
104 CHAR __mbedtlsErr[1024]; \
105 if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { \
106 mbedtls_strerror(ret, __mbedtlsErr, SIZEOF(__mbedtlsErr)); \
107 DLOGW("%s failed with %s", (s), __mbedtlsErr); \
112 KVS_SRTP_PROFILE_AES128_CM_HMAC_SHA1_80 = MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80,
113 KVS_SRTP_PROFILE_AES128_CM_HMAC_SHA1_32 = MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32,
116#error "A Crypto implementation is required."