1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** NetX Secure Component */
16 /** */
17 /** Datagram Transport Layer Security (DTLS) */
18 /** */
19 /**************************************************************************/
20 /**************************************************************************/
21
22 #define NX_SECURE_SOURCE_CODE
23
24 #include "nx_secure_dtls.h"
25
26 /**************************************************************************/
27 /* */
28 /* FUNCTION RELEASE */
29 /* */
30 /* _nxe_secure_dtls_server_create PORTABLE C */
31 /* 6.1 */
32 /* AUTHOR */
33 /* */
34 /* Timothy Stapko, Microsoft Corporation */
35 /* */
36 /* DESCRIPTION */
37 /* */
38 /* This function checks for errors when creating a DTLS Server. */
39 /* */
40 /* INPUT */
41 /* */
42 /* server_ptr DTLS server control block */
43 /* ip_ptr Pointer to IP instance */
44 /* port Server port */
45 /* timeout Timeout value */
46 /* session_buffer DTLS sessions buffer */
47 /* session_buffer_size Size of DTLS sessions buffer */
48 /* crypto_table Crypto table */
49 /* crypto_metadata_buffer Encryption metadata buffer */
50 /* crypto_metadata_size Encryption metadata size */
51 /* packet_reassembly_buffer DTLS reassembly buffer */
52 /* packet_reassembly_buffer_size Size of reassembly buffer */
53 /* connect_notify Callback for new connections */
54 /* receive_notify Callback for received data */
55 /* */
56 /* OUTPUT */
57 /* */
58 /* status Completion status */
59 /* */
60 /* CALLS */
61 /* */
62 /* _nx_secure_dtls_server_create Actual function call */
63 /* */
64 /* CALLED BY */
65 /* */
66 /* Application Code */
67 /* */
68 /* RELEASE HISTORY */
69 /* */
70 /* DATE NAME DESCRIPTION */
71 /* */
72 /* 05-19-2020 Timothy Stapko Initial Version 6.0 */
73 /* 09-30-2020 Timothy Stapko Modified comment(s), */
74 /* resulting in version 6.1 */
75 /* */
76 /**************************************************************************/
_nxe_secure_dtls_server_create(NX_SECURE_DTLS_SERVER * server_ptr,NX_IP * ip_ptr,UINT port,ULONG timeout,VOID * session_buffer,UINT session_buffer_size,const NX_SECURE_TLS_CRYPTO * crypto_table,VOID * crypto_metadata_buffer,ULONG crypto_metadata_size,UCHAR * packet_reassembly_buffer,UINT packet_reassembly_buffer_size,UINT (* connect_notify)(NX_SECURE_DTLS_SESSION * dtls_session,NXD_ADDRESS * ip_address,UINT port),UINT (* receive_notify)(NX_SECURE_DTLS_SESSION * dtls_session))77 UINT _nxe_secure_dtls_server_create(NX_SECURE_DTLS_SERVER *server_ptr, NX_IP *ip_ptr, UINT port, ULONG timeout,
78 VOID *session_buffer, UINT session_buffer_size,
79 const NX_SECURE_TLS_CRYPTO *crypto_table,
80 VOID *crypto_metadata_buffer, ULONG crypto_metadata_size,
81 UCHAR *packet_reassembly_buffer, UINT packet_reassembly_buffer_size,
82 UINT (*connect_notify)(NX_SECURE_DTLS_SESSION *dtls_session, NXD_ADDRESS *ip_address, UINT port),
83 UINT (*receive_notify)(NX_SECURE_DTLS_SESSION *dtls_session))
84 {
85 #ifdef NX_SECURE_ENABLE_DTLS
86 UINT status;
87 UINT i;
88 UINT num_sessions;
89 NX_SECURE_DTLS_SESSION *current_session;
90 NX_SECURE_DTLS_SESSION *created_dtls_session;
91 NX_SECURE_DTLS_SERVER *created_dtls_server;
92 ULONG created_count;
93
94
95 /* Figure out number of sessions. */
96 num_sessions = session_buffer_size / sizeof(NX_SECURE_DTLS_SESSION);
97
98 /* Check pointers. */
99 if(server_ptr == NX_NULL || ip_ptr == NX_NULL || session_buffer == NX_NULL ||
100 crypto_metadata_buffer == NX_NULL || packet_reassembly_buffer == NX_NULL ||
101 connect_notify == NX_NULL || receive_notify == NX_NULL)
102 {
103 return(NX_PTR_ERROR);
104 }
105
106 /* Loop to check for the DTLS server already created. */
107 created_dtls_server = _nx_secure_dtls_server_created_ptr;
108 created_count = _nx_secure_dtls_server_created_count;
109 while (created_count--)
110 {
111
112 /* Is the new DTLS server already created? */
113 if (server_ptr == created_dtls_server)
114 {
115
116 /* Duplicate DTLS server created, return an error! */
117 return(NX_PTR_ERROR);
118 }
119
120 /* Move to next entry. */
121 created_dtls_server = created_dtls_server -> nx_dtls_server_created_next;
122 }
123
124 /* Check all the sessions. */
125 for(i = 0; i < num_sessions; ++i)
126 {
127
128 /* Get the current session. */
129 current_session = &((NX_SECURE_DTLS_SESSION *)session_buffer)[i];
130
131 /* Loop to check for the DTLS session already created. */
132 created_dtls_session = _nx_secure_dtls_created_ptr;
133 created_count = _nx_secure_dtls_created_count;
134 while (created_count--)
135 {
136
137 /* Is the new DTLS already created? */
138 if (current_session == created_dtls_session)
139 {
140
141 /* Duplicate DTLS session created, return an error! */
142 return(NX_PTR_ERROR);
143 }
144
145 /* Move to next entry. */
146 created_dtls_session = created_dtls_session -> nx_secure_dtls_created_next;
147 }
148 }
149
150 /* Call the actual function. */
151 status = _nx_secure_dtls_server_create(server_ptr, ip_ptr, port, timeout,
152 session_buffer, session_buffer_size, crypto_table,
153 crypto_metadata_buffer, crypto_metadata_size,
154 packet_reassembly_buffer, packet_reassembly_buffer_size,
155 connect_notify, receive_notify);
156
157 return(status);
158 #else
159 NX_PARAMETER_NOT_USED(server_ptr);
160 NX_PARAMETER_NOT_USED(ip_ptr);
161 NX_PARAMETER_NOT_USED(port);
162 NX_PARAMETER_NOT_USED(timeout);
163 NX_PARAMETER_NOT_USED(session_buffer);
164 NX_PARAMETER_NOT_USED(session_buffer_size);
165 NX_PARAMETER_NOT_USED(crypto_table);
166 NX_PARAMETER_NOT_USED(crypto_metadata_buffer);
167 NX_PARAMETER_NOT_USED(crypto_metadata_size);
168 NX_PARAMETER_NOT_USED(packet_reassembly_buffer);
169 NX_PARAMETER_NOT_USED(packet_reassembly_buffer_size);
170 NX_PARAMETER_NOT_USED(connect_notify);
171 NX_PARAMETER_NOT_USED(receive_notify);
172
173
174 return(NX_NOT_SUPPORTED);
175 #endif /* NX_SECURE_ENABLE_DTLS */
176 }
177
178