1
10
13
14
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
99
100
101
102
103
104
109
114
115
120
121
122
123
124
125
129
130
131
132
133
134
135
136
137
138
139
140
141
146
147
148
149
150
151
152
153
154
155
156
157
161
165
166
167
...
...
...
#define NX_SECURE_SOURCE_CODE
#include "nx_secure_dtls.h"
#ifdef NX_SECURE_ENABLE_DTLS
static UCHAR _generated_hash[NX_SECURE_TLS_MAX_HASH_SIZE];
...
UINT _nx_secure_dtls_verify_mac(NX_SECURE_DTLS_SESSION *dtls_session, UCHAR *header_data,
USHORT header_length, UCHAR *data, UINT *length)
{
UCHAR *mac_secret;
USHORT hash_size;
UINT status;
INT compare_result;
USHORT data_length;
UCHAR *received_hash;
UINT hash_length;
UCHAR header[20];
NX_SECURE_TLS_SESSION *tls_session;
tls_session = &dtls_session -> nx_secure_dtls_tls_session;
if (tls_session -> nx_secure_tls_session_ciphersuite == NX_NULL)
{
return(NX_SECURE_TLS_UNKNOWN_CIPHERSUITE);
}if (tls_session -> nx_secure_tls_session_ciphersuite == NX_NULL) { ... }
hash_size = tls_session -> nx_secure_tls_session_ciphersuite -> nx_secure_tls_hash_size;
if (tls_session -> nx_secure_tls_socket_type == NX_SECURE_TLS_SESSION_TYPE_SERVER)
{
mac_secret = tls_session -> nx_secure_tls_key_material.nx_secure_tls_client_write_mac_secret;
}if (tls_session -> nx_secure_tls_socket_type == NX_SECURE_TLS_SESSION_TYPE_SERVER) { ... }
else
{
mac_secret = tls_session -> nx_secure_tls_key_material.nx_secure_tls_server_write_mac_secret;
}else { ... }
if (hash_size >= *length)
{
return(NX_SECURE_TLS_HASH_MAC_VERIFY_FAILURE);
}if (hash_size >= *length) { ... }
data_length = (USHORT)(*length - hash_size);
if (header_length > sizeof(header))
{
return(NX_SECURE_TLS_HASH_MAC_VERIFY_FAILURE);
}if (header_length > sizeof(header)) { ... }
NX_SECURE_MEMCPY(header, header_data, header_length);
header[11] = (UCHAR)((data_length >> 8) & 0x00FF);
header[12] = (UCHAR)(data_length & 0x00FF);
status = _nx_secure_dtls_hash_record(dtls_session, tls_session -> nx_secure_tls_remote_sequence_number, header, header_length,
data, (USHORT)(data_length), _generated_hash, &hash_length, mac_secret);
if (status != NX_SUCCESS)
{
return(NX_SECURE_TLS_HASH_MAC_VERIFY_FAILURE);
}if (status != NX_SUCCESS) { ... }
received_hash = &data[data_length];
compare_result = NX_SECURE_MEMCMP(received_hash, _generated_hash, hash_size);
*length = data_length;
if (compare_result == 0)
{
return(NX_SECURE_TLS_SUCCESS);
}if (compare_result == 0) { ... }
else
{
return(NX_SECURE_TLS_HASH_MAC_VERIFY_FAILURE);
}else { ... }
}_nx_secure_dtls_verify_mac (NX_SECURE_DTLS_SESSION *dtls_session, UCHAR *header_data, USHORT header_length, UCHAR *data, UINT *length) { ... }
/* ... */#endif