4747
4848#include "mbedtls/md5.h"
4949#include "mbedtls/sha1.h"
50+ #include "mbedtls/platform.h"
5051
5152err_t
5253snmpv3_auth (struct snmp_pbuf_stream * stream , u16_t length ,
@@ -59,19 +60,24 @@ snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length,
5960 struct snmp_pbuf_stream read_stream ;
6061 snmp_pbuf_stream_init (& read_stream , stream -> pbuf , stream -> offset , stream -> length );
6162
63+ #if defined(MBEDTLS_PLATFORM_C )
64+ if (mbedtls_platform_setup (NULL ) != 0 ) {
65+ return ERR_ARG ;
66+ }
67+ #endif /* MBEDTLS_PLATFORM_C */
6268 if (algo == SNMP_V3_AUTH_ALGO_MD5 ) {
6369 md_info = mbedtls_md_info_from_type (MBEDTLS_MD_MD5 );
6470 key_len = SNMP_V3_MD5_LEN ;
6571 } else if (algo == SNMP_V3_AUTH_ALGO_SHA ) {
6672 md_info = mbedtls_md_info_from_type (MBEDTLS_MD_SHA1 );
6773 key_len = SNMP_V3_SHA_LEN ;
6874 } else {
69- return ERR_ARG ;
75+ goto platform_teardown ;
7076 }
7177
7278 mbedtls_md_init (& ctx );
7379 if (mbedtls_md_setup (& ctx , md_info , 1 ) != 0 ) {
74- return ERR_ARG ;
80+ goto platform_teardown ;
7581 }
7682
7783 if (mbedtls_md_hmac_starts (& ctx , key , key_len ) != 0 ) {
@@ -95,10 +101,17 @@ snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length,
95101 }
96102
97103 mbedtls_md_free (& ctx );
104+ #if defined(MBEDTLS_PLATFORM_C )
105+ mbedtls_platform_teardown (NULL );
106+ #endif /* MBEDTLS_PLATFORM_C */
98107 return ERR_OK ;
99108
100109free_md :
101110 mbedtls_md_free (& ctx );
111+ platform_teardown :
112+ #if defined(MBEDTLS_PLATFORM_C )
113+ mbedtls_platform_teardown (NULL );
114+ #endif /* MBEDTLS_PLATFORM_C */
102115 return ERR_ARG ;
103116}
104117
@@ -117,6 +130,11 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length,
117130 struct snmp_pbuf_stream write_stream ;
118131 snmp_pbuf_stream_init (& read_stream , stream -> pbuf , stream -> offset , stream -> length );
119132 snmp_pbuf_stream_init (& write_stream , stream -> pbuf , stream -> offset , stream -> length );
133+ #if defined(MBEDTLS_PLATFORM_C )
134+ if (mbedtls_platform_setup (NULL ) != 0 ) {
135+ return ERR_ARG ;
136+ }
137+ #endif /* MBEDTLS_PLATFORM_C */
120138 mbedtls_cipher_init (& ctx );
121139
122140 if (algo == SNMP_V3_PRIV_ALGO_DES ) {
@@ -126,15 +144,15 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length,
126144
127145 /* RFC 3414 mandates padding for DES */
128146 if ((length & 0x07 ) != 0 ) {
129- return ERR_ARG ;
147+ goto platform_teardown ;
130148 }
131149
132150 cipher_info = mbedtls_cipher_info_from_type (MBEDTLS_CIPHER_DES_CBC );
133151 if (mbedtls_cipher_setup (& ctx , cipher_info ) != 0 ) {
134- return ERR_ARG ;
152+ goto platform_teardown
135153 }
136154 if (mbedtls_cipher_set_padding_mode (& ctx , MBEDTLS_PADDING_NONE ) != 0 ) {
137- return ERR_ARG ;
155+ goto platform_teardown ;
138156 }
139157 if (mbedtls_cipher_setkey (& ctx , key , 8 * 8 , (mode == SNMP_V3_PRIV_MODE_ENCRYPT )? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT ) != 0 ) {
140158 goto error ;
@@ -174,7 +192,7 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length,
174192
175193 cipher_info = mbedtls_cipher_info_from_type (MBEDTLS_CIPHER_AES_128_CFB128 );
176194 if (mbedtls_cipher_setup (& ctx , cipher_info ) != 0 ) {
177- return ERR_ARG ;
195+ goto platform_teardown ;
178196 }
179197 if (mbedtls_cipher_setkey (& ctx , key , 16 * 8 , (mode == SNMP_V3_PRIV_MODE_ENCRYPT )? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT ) != 0 ) {
180198 goto error ;
@@ -209,15 +227,19 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length,
209227 snmp_pbuf_stream_write (& write_stream , out_byte );
210228 }
211229 } else {
212- return ERR_ARG ;
230+ goto platform_teardown ;
213231 }
214232
215233 mbedtls_cipher_free (& ctx );
216234 return ERR_OK ;
217235
218236error :
219237 mbedtls_cipher_free (& ctx );
220- return ERR_OK ;
238+ platform_teardown :
239+ #if defined(MBEDTLS_PLATFORM_C )
240+ mbedtls_platform_teardown (NULL );
241+ #endif /* MBEDTLS_PLATFORM_C */
242+ return ERR_ARG ;
221243}
222244
223245#endif /* LWIP_SNMP_V3_CRYPTO */
@@ -237,6 +259,11 @@ snmpv3_password_to_key_md5(
237259 u8_t i ;
238260 u32_t count = 0 ;
239261
262+ #if defined(MBEDTLS_PLATFORM_C )
263+ if (mbedtls_platform_setup (NULL ) != 0 ) {
264+ goto end ;
265+ }
266+ #endif /* MBEDTLS_PLATFORM_C */
240267 mbedtls_md5_init (& MD ); /* initialize MD5 */
241268 mbedtls_md5_starts (& MD );
242269
@@ -272,6 +299,11 @@ snmpv3_password_to_key_md5(
272299 mbedtls_md5_finish (& MD , key );
273300
274301 mbedtls_md5_free (& MD );
302+
303+ end :
304+ #if defined(MBEDTLS_PLATFORM_C )
305+ mbedtls_platform_teardown (NULL );
306+ #endif /* MBEDTLS_PLATFORM_C */
275307 return ;
276308}
277309
@@ -290,6 +322,11 @@ snmpv3_password_to_key_sha(
290322 u8_t i ;
291323 u32_t count = 0 ;
292324
325+ #if defined(MBEDTLS_PLATFORM_C )
326+ if (mbedtls_platform_setup (NULL ) != 0 ) {
327+ goto end ;
328+ }
329+ #endif /* MBEDTLS_PLATFORM_C */
293330 mbedtls_sha1_init (& SH ); /* initialize SHA */
294331 mbedtls_sha1_starts (& SH );
295332
@@ -325,6 +362,11 @@ snmpv3_password_to_key_sha(
325362 mbedtls_sha1_finish (& SH , key );
326363
327364 mbedtls_sha1_free (& SH );
365+
366+ end :
367+ #if defined(MBEDTLS_PLATFORM_C )
368+ mbedtls_platform_teardown (NULL );
369+ #endif /* MBEDTLS_PLATFORM_C */
328370 return ;
329371}
330372
0 commit comments