Skip to content

Commit c8f36a6

Browse files
committed
src/examples/benchmark_https: Implement providing of a custom TLS key/certificate via the command line.
In addition, remove the hardcoded test key and certificate.
1 parent 316af7c commit c8f36a6

1 file changed

Lines changed: 73 additions & 51 deletions

File tree

src/examples/benchmark_https.c

Lines changed: 73 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
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+
4649
static unsigned int small_deltas[SMALL];
4750

4851
static 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

181162
int
182163
main (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

Comments
 (0)