@@ -32,6 +32,7 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
3232{
3333 int ret = 0 ;
3434 word32 index = 0 ;
35+ int keyInit = 0 , rngInit = 0 ;
3536
3637 Cert newCert ;
3738 RsaKey key ;
@@ -42,10 +43,10 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
4243 XFILE file ;
4344 XFILE pemFile ;
4445 byte * keyBuf ;
45- int certBufSz ;
46- byte * certBuf ;
46+ int certBufSz = 0 ;
47+ byte * certBuf = NULL ;
4748 int pemBufSz ;
48- byte * pemBuf ;
49+ byte * pemBuf = NULL ;
4950
5051 keyFile = XFOPEN (keyPath , "rb" );
5152 if (keyFile == NULL ) {
@@ -62,6 +63,7 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
6263 }
6364 if (XFSEEK (keyFile , 0 , SEEK_SET ) != 0 || (int )XFREAD (keyBuf , 1 , keyFileSz , keyFile ) != keyFileSz ) {
6465 XFCLOSE (keyFile );
66+ XFREE (keyBuf , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
6567 return WOLFCLU_FAILURE ;
6668 }
6769 XFCLOSE (keyFile );
@@ -72,19 +74,22 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
7274 XFREE (keyBuf , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
7375 return ret ;
7476 }
77+ keyInit = 1 ;
7578
7679 ret = wc_InitRng (& rng );
7780 if (ret != 0 ) {
7881 wolfCLU_LogError ("Failed to initialize rng.\nRET: %d" , ret );
7982 XFREE (keyBuf , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
83+ wc_FreeRsaKey (& key );
8084 return ret ;
8185 }
86+ rngInit = 1 ;
8287
8388 ret = wc_RsaPrivateKeyDecode (keyBuf , & index , & key , keyFileSz );
8489 XFREE (keyBuf , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
8590 if (ret != 0 ) {
8691 wolfCLU_LogError ("Failed to decode private key.\nRET: %d" , ret );
87- return ret ;
92+ goto cleanup ;
8893 }
8994
9095 wc_InitCert (& newCert );
@@ -99,36 +104,44 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
99104
100105 WOLFCLU_LOG (WOLFCLU_L0 , "Enter your countries 2 digit code (ex: United States -> US): " );
101106 if (XFGETS (country ,CTC_NAME_SIZE , stdin ) == NULL ) {
102- return WOLFCLU_FAILURE ;
107+ ret = WOLFCLU_FAILURE ;
108+ goto cleanup ;
103109 }
104110 country [CTC_NAME_SIZE - 1 ] = '\0' ;
105111 WOLFCLU_LOG (WOLFCLU_L0 , "Enter the name of the province you are located at: " );
106112 if (XFGETS (province ,CTC_NAME_SIZE , stdin ) == NULL ) {
107- return WOLFCLU_FAILURE ;
113+ ret = WOLFCLU_FAILURE ;
114+ goto cleanup ;
108115 }
109116 WOLFCLU_LOG (WOLFCLU_L0 , "Enter the name of the city you are located at: " );
110117 if (XFGETS (city ,CTC_NAME_SIZE , stdin ) == NULL ) {
111- return WOLFCLU_FAILURE ;
118+ ret = WOLFCLU_FAILURE ;
119+ goto cleanup ;
112120 }
113121 WOLFCLU_LOG (WOLFCLU_L0 , "Enter the name of your orginization: " );
114122 if (XFGETS (org ,CTC_NAME_SIZE , stdin ) == NULL ) {
115- return WOLFCLU_FAILURE ;
123+ ret = WOLFCLU_FAILURE ;
124+ goto cleanup ;
116125 }
117126 WOLFCLU_LOG (WOLFCLU_L0 , "Enter the name of your unit: " );
118127 if (XFGETS (unit ,CTC_NAME_SIZE , stdin ) == NULL ) {
119- return WOLFCLU_FAILURE ;
128+ ret = WOLFCLU_FAILURE ;
129+ goto cleanup ;
120130 }
121131 WOLFCLU_LOG (WOLFCLU_L0 , "Enter the common name of your domain: " );
122132 if (XFGETS (commonName ,CTC_NAME_SIZE , stdin ) == NULL ) {
123- return WOLFCLU_FAILURE ;
133+ ret = WOLFCLU_FAILURE ;
134+ goto cleanup ;
124135 }
125136 WOLFCLU_LOG (WOLFCLU_L0 , "Enter your email address: " );
126137 if (XFGETS (email ,CTC_NAME_SIZE , stdin ) == NULL ) {
127- return WOLFCLU_FAILURE ;
138+ ret = WOLFCLU_FAILURE ;
139+ goto cleanup ;
128140 }
129141 WOLFCLU_LOG (WOLFCLU_L0 , "Enter the number of days this certificate should be valid: " );
130142 if (XFGETS (daysValid ,CTC_NAME_SIZE , stdin ) == NULL ) {
131- return WOLFCLU_FAILURE ;
143+ ret = WOLFCLU_FAILURE ;
144+ goto cleanup ;
132145 }
133146
134147 XSTRNCPY (newCert .subject .country , country , CTC_NAME_SIZE );
@@ -162,22 +175,23 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
162175 certBuf = (byte * ) XMALLOC (FOURK_SZ , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
163176 if (certBuf == NULL ) {
164177 wolfCLU_LogError ("Failed to initialize buffer to stort certificate." );
165- return -1 ;
178+ ret = -1 ;
179+ goto cleanup ;
166180 }
167181 XMEMSET (certBuf , 0 , FOURK_SZ );
168182
169183 ret = wc_MakeCert (& newCert , certBuf , FOURK_SZ , & key , NULL , & rng );
170184 if (ret < 0 ) {
171185 wolfCLU_LogError ("Failed to make certificate." );
172- return ret ;
186+ goto cleanup ;
173187 }
174188 WOLFCLU_LOG (WOLFCLU_L0 , "MakeCert returned %d" , ret );
175189
176- ret = wc_SignCert (newCert .bodySz , newCert .sigType , certBuf , FOURK_SZ , & key ,
190+ ret = wc_SignCert (newCert .bodySz , newCert .sigType , certBuf , FOURK_SZ , & key ,
177191 NULL , & rng );
178192 if (ret < 0 ) {
179193 wolfCLU_LogError ("Failed to sign certificate." );
180- return ret ;
194+ goto cleanup ;
181195 }
182196 WOLFCLU_LOG (WOLFCLU_L0 , "SignCert returned %d" , ret );
183197
@@ -189,7 +203,8 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
189203 file = XFOPEN (certOut , "wb" );
190204 if (!file ) {
191205 wolfCLU_LogError ("failed to open file: %s" , certOut );
192- return -1 ;
206+ ret = -1 ;
207+ goto cleanup ;
193208 }
194209
195210 ret = (int )XFWRITE (certBuf , 1 , certBufSz , file );
@@ -205,30 +220,44 @@ int make_self_signed_rsa_certificate(char* keyPath, char* certOut, int oid)
205220 pemBuf = (byte * )XMALLOC (FOURK_SZ , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
206221 if (pemBuf == NULL ) {
207222 wolfCLU_LogError ("Failed to initialize pem buffer." );
208- return -1 ;
223+ ret = -1 ;
224+ goto cleanup ;
209225 }
210226 XMEMSET (pemBuf , 0 , FOURK_SZ );
211227
212228 pemBufSz = wc_DerToPem (certBuf , certBufSz , pemBuf , FOURK_SZ , CERT_TYPE );
213229 if (pemBufSz < 0 ) {
214230 wolfCLU_LogError ("Failed to convert from der to pem." );
215- return -1 ;
231+ ret = -1 ;
232+ goto cleanup ;
216233 }
217234
218235 WOLFCLU_LOG (WOLFCLU_L0 , "Resulting pem buffer is %d bytes" , pemBufSz );
219236
220237 pemFile = XFOPEN (certOut , "wb" );
221238 if (!pemFile ) {
222239 wolfCLU_LogError ("failed to open file: %s" , certOut );
223- return -1 ;
240+ ret = -1 ;
241+ goto cleanup ;
224242 }
225243 XFWRITE (pemBuf , 1 , pemBufSz , pemFile );
226244 XFCLOSE (pemFile );
227245 WOLFCLU_LOG (WOLFCLU_L0 , "Successfully converted the der to pem. Result is in: %s\n" ,
228246 certOut );
229247
230- free_things_rsa (& pemBuf , & certBuf , NULL , & key , NULL , & rng );
231- return 1 ;
248+ ret = 1 ;
249+
250+ cleanup :
251+ if (pemBuf != NULL )
252+ XFREE (pemBuf , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
253+ if (certBuf != NULL )
254+ XFREE (certBuf , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
255+ if (keyInit )
256+ wc_FreeRsaKey (& key );
257+ if (rngInit )
258+ wc_FreeRng (& rng );
259+
260+ return ret ;
232261}
233262
234263void free_things_rsa (byte * * a , byte * * b , byte * * c , RsaKey * d , RsaKey * e ,
0 commit comments