@@ -87,6 +87,7 @@ int wolfCLU_PKCS8(int argc, char** argv)
8787 char password [MAX_PASSWORD_SIZE ];
8888 int passwordSz = MAX_PASSWORD_SIZE ;
8989 byte * pass = NULL ;
90+ byte * stdinKeyBuf = NULL ;
9091
9192 opterr = 0 ; /* do not display unrecognized options */
9293 optind = 0 ; /* start at indent 0 */
@@ -155,35 +156,44 @@ int wolfCLU_PKCS8(int argc, char** argv)
155156
156157 /* currently only supporting PKCS8 parsing, input is expected */
157158 if (ret == WOLFCLU_SUCCESS && bioIn == NULL ) {
158- byte keyBuffer [MAX_STDINSZ ];
159159 word32 keyLen = 0 ;
160160
161- XMEMSET (keyBuffer , 0 , MAX_STDINSZ );
162- keyLen = (int )XFREAD (keyBuffer , 1 , sizeof (keyBuffer ) - 1 , stdin );
163- if (keyLen <= 0 ) {
164- WOLFCLU_LOG (WOLFCLU_E0 , "Error reading private key from stdin" );
165- ret = WOLFCLU_FATAL_ERROR ;
161+ /* Heap-allocate so the buffer outlives this block; the BIO created
162+ * below stores a pointer to it and is freed at function exit. */
163+ stdinKeyBuf = (byte * )XMALLOC (MAX_STDINSZ , HEAP_HINT ,
164+ DYNAMIC_TYPE_TMP_BUFFER );
165+ if (stdinKeyBuf == NULL ) {
166+ ret = MEMORY_E ;
166167 }
167168 else {
168- /* Null-terminate the key buffer */
169- keyBuffer [keyLen ] = '\0' ;
169+ XMEMSET (stdinKeyBuf , 0 , MAX_STDINSZ );
170+ keyLen = (int )XFREAD (stdinKeyBuf , 1 , MAX_STDINSZ - 1 , stdin );
171+ if (keyLen <= 0 ) {
172+ WOLFCLU_LOG (WOLFCLU_E0 ,
173+ "Error reading private key from stdin" );
174+ ret = WOLFCLU_FATAL_ERROR ;
175+ }
176+ else {
177+ /* Null-terminate the key buffer */
178+ stdinKeyBuf [keyLen ] = '\0' ;
170179
171- bioIn = wolfSSL_BIO_new_mem_buf (keyBuffer , keyLen );
180+ bioIn = wolfSSL_BIO_new_mem_buf (stdinKeyBuf , keyLen );
172181
173- if (bioIn == NULL ) {
174- wolfCLU_LogError ("Unable to open pkcs8 file %s" ,
175- optarg );
176- ret = MEMORY_E ;
177- }
178- else if (pass == NULL ) {
179- /* Reopen terminal since we might get password data
180- * from stdin later */
181- #ifdef USE_WINDOWS_API
182- if (freopen ("CON" , "r" , stdin ) == NULL ) {
183- #else
184- if (freopen ("/dev/tty" , "r" , stdin ) == NULL ) {
185- #endif
186- ret = WOLFCLU_FATAL_ERROR ;
182+ if (bioIn == NULL ) {
183+ wolfCLU_LogError ("Unable to open pkcs8 file %s" ,
184+ optarg );
185+ ret = MEMORY_E ;
186+ }
187+ else if (pass == NULL ) {
188+ /* Reopen terminal since we might get password data
189+ * from stdin later */
190+ #ifdef USE_WINDOWS_API
191+ if (freopen ("CON" , "r" , stdin ) == NULL ) {
192+ #else
193+ if (freopen ("/dev/tty" , "r" , stdin ) == NULL ) {
194+ #endif
195+ ret = WOLFCLU_FATAL_ERROR ;
196+ }
187197 }
188198 }
189199 }
@@ -282,6 +292,10 @@ int wolfCLU_PKCS8(int argc, char** argv)
282292 wolfSSL_BIO_free (bioIn );
283293 wolfSSL_BIO_free (bioOut );
284294 wolfSSL_EVP_PKEY_free (pkey );
295+ if (stdinKeyBuf != NULL ) {
296+ wolfCLU_ForceZero (stdinKeyBuf , MAX_STDINSZ );
297+ XFREE (stdinKeyBuf , HEAP_HINT , DYNAMIC_TYPE_TMP_BUFFER );
298+ }
285299
286300 return ret ;
287301#else
0 commit comments