4343 */
4444#define NUMBER_OF_THREADS CPU_COUNT
4545
46+ /* BUFSIZ bytes should be more than enough for a TLS key password */
47+ #define MAX_TLS_PASSWORD_LEN BUFSIZ
48+
4649static unsigned int small_deltas [SMALL ];
4750
4851static struct MHD_Response * response ;
@@ -127,68 +130,82 @@ ahc_echo (void *cls,
127130}
128131
129132
130- /* test server key */
131- const char srv_signed_key_pem [] = "-----BEGIN RSA PRIVATE KEY-----\n"
132- "MIIEowIBAAKCAQEAvfTdv+3fgvVTKRnP/HVNG81cr8TrUP/iiyuve/THMzvFXhCW\n"
133- "+K03KwEku55QvnUndwBfU/ROzLlv+5hotgiDRNFT3HxurmhouySBrJNJv7qWp8IL\n"
134- "q4sw32vo0fbMu5BZF49bUXK9L3kW2PdhTtSQPWHEzNrCxO+YgCilKHkY3vQNfdJ0\n"
135- "20Q5EAAEseD1YtWCIpRvJzYlZMpjYB1ubTl24kwrgOKUJYKqM4jmF4DVQp4oOK/6\n"
136- "QYGGh1QmHRPAy3CBII6sbb+sZT9cAqU6GYQVB35lm4XAgibXV6KgmpVxVQQ69U6x\n"
137- "yoOl204xuekZOaG9RUPId74Rtmwfi1TLbBzo2wIDAQABAoIBADu09WSICNq5cMe4\n"
138- "+NKCLlgAT1NiQpLls1gKRbDhKiHU9j8QWNvWWkJWrCya4QdUfLCfeddCMeiQmv3K\n"
139- "lJMvDs+5OjJSHFoOsGiuW2Ias7IjnIojaJalfBml6frhJ84G27IXmdz6gzOiTIer\n"
140- "DjeAgcwBaKH5WwIay2TxIaScl7AwHBauQkrLcyb4hTmZuQh6ArVIN6+pzoVuORXM\n"
141- "bpeNWl2l/HSN3VtUN6aCAKbN/X3o0GavCCMn5Fa85uJFsab4ss/uP+2PusU71+zP\n"
142- "sBm6p/2IbGvF5k3VPDA7X5YX61sukRjRBihY8xSnNYx1UcoOsX6AiPnbhifD8+xQ\n"
143- "Tlf8oJUCgYEA0BTfzqNpr9Wxw5/QXaSdw7S/0eP5a0C/nwURvmfSzuTD4equzbEN\n"
144- "d+dI/s2JMxrdj/I4uoAfUXRGaabevQIjFzC9uyE3LaOyR2zhuvAzX+vVcs6bSXeU\n"
145- "pKpCAcN+3Z3evMaX2f+z/nfSUAl2i4J2R+/LQAWJW4KwRky/m+cxpfUCgYEA6bN1\n"
146- "b73bMgM8wpNt6+fcmS+5n0iZihygQ2U2DEud8nZJL4Nrm1dwTnfZfJBnkGj6+0Q0\n"
147- "cOwj2KS0/wcEdJBP0jucU4v60VMhp75AQeHqidIde0bTViSRo3HWKXHBIFGYoU3T\n"
148- "LyPyKndbqsOObnsFXHn56Nwhr2HLf6nw4taGQY8CgYBoSW36FLCNbd6QGvLFXBGt\n"
149- "2lMhEM8az/K58kJ4WXSwOLtr6MD/WjNT2tkcy0puEJLm6BFCd6A6pLn9jaKou/92\n"
150- "SfltZjJPb3GUlp9zn5tAAeSSi7YMViBrfuFiHObij5LorefBXISLjuYbMwL03MgH\n"
151- "Ocl2JtA2ywMp2KFXs8GQWQKBgFyIVv5ogQrbZ0pvj31xr9HjqK6d01VxIi+tOmpB\n"
152- "4ocnOLEcaxX12BzprW55ytfOCVpF1jHD/imAhb3YrHXu0fwe6DXYXfZV4SSG2vB7\n"
153- "IB9z14KBN5qLHjNGFpMQXHSMek+b/ftTU0ZnPh9uEM5D3YqRLVd7GcdUhHvG8P8Q\n"
154- "C9aXAoGBAJtID6h8wOGMP0XYX5YYnhlC7dOLfk8UYrzlp3xhqVkzKthTQTj6wx9R\n"
155- "GtC4k7U1ki8oJsfcIlBNXd768fqDVWjYju5rzShMpo8OCTS6ipAblKjCxPPVhIpv\n"
156- "tWPlbSn1qj6wylstJ5/3Z+ZW5H4wIKp5jmLiioDhcP0L/Ex3Zx8O\n"
157- "-----END RSA PRIVATE KEY-----\n" ;
158-
159- /* test server CA signed certificates */
160- const char srv_signed_cert_pem [] = "-----BEGIN CERTIFICATE-----\n"
161- "MIIDGzCCAgWgAwIBAgIES0KCvTALBgkqhkiG9w0BAQUwFzEVMBMGA1UEAxMMdGVz\n"
162- "dF9jYV9jZXJ0MB4XDTEwMDEwNTAwMDcyNVoXDTQ1MDMxMjAwMDcyNVowFzEVMBMG\n"
163- "A1UEAxMMdGVzdF9jYV9jZXJ0MIIBHzALBgkqhkiG9w0BAQEDggEOADCCAQkCggEA\n"
164- "vfTdv+3fgvVTKRnP/HVNG81cr8TrUP/iiyuve/THMzvFXhCW+K03KwEku55QvnUn\n"
165- "dwBfU/ROzLlv+5hotgiDRNFT3HxurmhouySBrJNJv7qWp8ILq4sw32vo0fbMu5BZ\n"
166- "F49bUXK9L3kW2PdhTtSQPWHEzNrCxO+YgCilKHkY3vQNfdJ020Q5EAAEseD1YtWC\n"
167- "IpRvJzYlZMpjYB1ubTl24kwrgOKUJYKqM4jmF4DVQp4oOK/6QYGGh1QmHRPAy3CB\n"
168- "II6sbb+sZT9cAqU6GYQVB35lm4XAgibXV6KgmpVxVQQ69U6xyoOl204xuekZOaG9\n"
169- "RUPId74Rtmwfi1TLbBzo2wIDAQABo3YwdDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQM\n"
170- "MAoGCCsGAQUFBwMBMA8GA1UdDwEB/wQFAwMHIAAwHQYDVR0OBBYEFOFi4ilKOP1d\n"
171- "XHlWCMwmVKr7mgy8MB8GA1UdIwQYMBaAFP2olB4s2T/xuoQ5pT2RKojFwZo2MAsG\n"
172- "CSqGSIb3DQEBBQOCAQEAHVWPxazupbOkG7Did+dY9z2z6RjTzYvurTtEKQgzM2Vz\n"
173- "GQBA+3pZ3c5mS97fPIs9hZXfnQeelMeZ2XP1a+9vp35bJjZBBhVH+pqxjCgiUflg\n"
174- "A3Zqy0XwwVCgQLE2HyaU3DLUD/aeIFK5gJaOSdNTXZLv43K8kl4cqDbMeRpVTbkt\n"
175- "YmG4AyEOYRNKGTqMEJXJoxD5E3rBUNrVI/XyTjYrulxbNPcMWEHKNeeqWpKDYTFo\n"
176- "Bb01PCthGXiq/4A2RLAFosadzRa8SBpoSjPPfZ0b2w4MJpReHqKbR5+T2t6hzml6\n"
177- "4ToyOKPDmamiTuN5KzLN3cw7DQlvWMvqSOChPLnA3Q==\n"
178- "-----END CERTIFICATE-----\n" ;
133+ char *
134+ read_file (const char * filename )
135+ {
136+ struct stat file_stat_buf ;
137+ if (0 != stat (filename , & file_stat_buf ))
138+ return NULL ;
139+
140+ /* allocate a buffer with a size exactly the length of the file */
141+ char * file_buf = malloc (file_stat_buf .st_size );
142+ if (NULL == file_buf )
143+ return NULL ;
144+
145+ FILE * file = fopen (filename , "r" );
146+ if (NULL == file )
147+ {
148+ free (file_buf );
149+ return NULL ;
150+ }
151+
152+ if (file_stat_buf .st_size != fread (file_buf , sizeof (char ), file_stat_buf .st_size , file ))
153+ {
154+ free (file_buf );
155+ return NULL ;
156+ }
157+
158+ return file_buf ;
159+ }
179160
180161
181162int
182163main (int argc , char * const * argv )
183164{
184165 struct MHD_Daemon * d ;
185166 unsigned int i ;
167+ uint16_t port ;
168+ char * srv_signed_key_pem_filename , * srv_signed_cert_pem_filename ;
169+
170+ if (argc != 4 )
171+ {
172+ printf ("%s PORT TLS_KEY_PEM_FILE TLS_CERT_PEM_FILE\n" , argv [0 ]);
173+ return 1 ;
174+ }
186175
187- if (argc != 2 )
176+ port = atoi (argv [1 ]);
177+ srv_signed_key_pem_filename = argv [2 ];
178+ srv_signed_cert_pem_filename = argv [3 ];
179+
180+ char * srv_signed_key_pem = read_file (srv_signed_key_pem_filename );
181+ if (NULL == srv_signed_key_pem )
188182 {
189- printf ( "%s PORT \n" , argv [0 ] );
183+ fprintf ( stderr , "error: could not read the TLS key from file %s: %s \n" , argv [1 ], strerror ( errno ) );
190184 return 1 ;
191185 }
186+
187+ char * srv_signed_cert_pem = read_file (srv_signed_cert_pem_filename );
188+ if (NULL == srv_signed_cert_pem )
189+ {
190+ fprintf (stderr , "error: could not read the TLS certificate from file %s: %s\n" , argv [2 ], strerror (errno ));
191+ return 1 ;
192+ }
193+
194+ printf ("Enter the password for the TLS key: " );
195+ char srv_signed_key_password [MAX_TLS_PASSWORD_LEN ];
196+ if (NULL == fgets (srv_signed_key_password , MAX_TLS_PASSWORD_LEN , stdin ))
197+ {
198+ if (ferror (stdin ))
199+ perror ("error: " );
200+ else
201+ /* this is the case where the user directly sends EOF via Ctrl+D */
202+ fprintf (stderr , "error: you should enter a password\n" );
203+
204+ return 1 ;
205+ }
206+ /* strip the newline which fgets(3) preserves in the input string */
207+ srv_signed_key_password [strlen (srv_signed_key_password ) - 1 ] = '\0' ;
208+
192209 response = MHD_create_response_from_buffer (strlen (PAGE ),
193210 (void * ) PAGE ,
194211 MHD_RESPMEM_PERSISTENT );
@@ -208,11 +225,16 @@ main (int argc, char *const *argv)
208225 load the key and the certificate from file. */
209226 MHD_OPTION_HTTPS_MEM_KEY , srv_signed_key_pem ,
210227 MHD_OPTION_HTTPS_MEM_CERT , srv_signed_cert_pem ,
228+ MHD_OPTION_HTTPS_KEY_PASSWORD , srv_signed_key_password ,
211229 MHD_OPTION_END );
212230 if (d == NULL )
213231 return 1 ;
214232 (void ) getc (stdin );
215233 MHD_stop_daemon (d );
234+
235+ free (srv_signed_cert_pem );
236+ free (srv_signed_key_pem );
237+
216238 MHD_destroy_response (response );
217239 for (i = 0 ;i < SMALL ;i ++ )
218240 if (0 != small_deltas [i ])
0 commit comments