• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2   This file is part of libmicrohttpd
3   Copyright (C) 2007 Christian Grothoff
4 
5   libmicrohttpd is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published
7   by the Free Software Foundation; either version 3, or (at your
8   option) any later version.
9 
10   libmicrohttpd is distributed in the hope that it will be useful, but
11   WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   General Public License for more details.
14 
15   You should have received a copy of the GNU General Public License
16   along with libmicrohttpd; see the file COPYING.  If not, write to the
17   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18   Boston, MA 02111-1307, USA.
19 */
20 
21 /**
22  * @file test_https_get.c
23  * @brief  Testcase for libmicrohttpd HTTPS GET operations
24  * @author Sagie Amir
25  */
26 
27 #include "platform.h"
28 #include "microhttpd.h"
29 #include <limits.h>
30 #include <sys/stat.h>
31 #include <curl/curl.h>
32 #include <gcrypt.h>
33 #include "tls_test_common.h"
34 
35 extern const char srv_key_pem[];
36 extern const char srv_self_signed_cert_pem[];
37 extern const char srv_signed_cert_pem[];
38 extern const char srv_signed_key_pem[];
39 
40 
41 static int
test_cipher_option(FILE * test_fd,const char * cipher_suite,int proto_version)42 test_cipher_option (FILE * test_fd,
43 		    const char *cipher_suite,
44 		    int proto_version)
45 {
46 
47   int ret;
48   struct MHD_Daemon *d;
49   d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_SSL |
50                         MHD_USE_DEBUG, 4233,
51                         NULL, NULL, &http_ahc, NULL,
52                         MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
53                         MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
54                         MHD_OPTION_END);
55 
56   if (d == NULL)
57     {
58       fprintf (stderr, MHD_E_SERVER_INIT);
59       return -1;
60     }
61 
62   ret = test_https_transfer (test_fd, cipher_suite, proto_version);
63 
64   MHD_stop_daemon (d);
65   return ret;
66 }
67 
68 
69 /* perform a HTTP GET request via SSL/TLS */
70 static int
test_secure_get(FILE * test_fd,const char * cipher_suite,int proto_version)71 test_secure_get (FILE * test_fd,
72 		 const char *cipher_suite,
73 		 int proto_version)
74 {
75   int ret;
76   struct MHD_Daemon *d;
77 
78   d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_SSL |
79                         MHD_USE_DEBUG, 4233,
80                         NULL, NULL, &http_ahc, NULL,
81                         MHD_OPTION_HTTPS_MEM_KEY, srv_signed_key_pem,
82                         MHD_OPTION_HTTPS_MEM_CERT, srv_signed_cert_pem,
83                         MHD_OPTION_END);
84 
85   if (d == NULL)
86     {
87       fprintf (stderr, MHD_E_SERVER_INIT);
88       return -1;
89     }
90 
91   ret = test_https_transfer (test_fd, cipher_suite, proto_version);
92 
93   MHD_stop_daemon (d);
94   return ret;
95 }
96 
97 
98 int
main(int argc,char * const * argv)99 main (int argc, char *const *argv)
100 {
101   unsigned int errorCount = 0;
102   const char *aes256_sha_tlsv1   = "AES256-SHA";
103   const char *des_cbc3_sha_tlsv1 = "DES-CBC3-SHA";
104 
105   gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
106 #ifdef GCRYCTL_INITIALIZATION_FINISHED
107   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
108 #endif
109   if (0 != curl_global_init (CURL_GLOBAL_ALL))
110     {
111       fprintf (stderr, "Error: %s\n", strerror (errno));
112       return -1;
113     }
114 
115   if (curl_uses_nss_ssl() == 0)
116     {
117       aes256_sha_tlsv1 = "rsa_aes_256_sha";
118       des_cbc3_sha_tlsv1 = "rsa_aes_128_sha";
119     }
120 
121   errorCount +=
122     test_secure_get (NULL, aes256_sha_tlsv1, CURL_SSLVERSION_TLSv1);
123   errorCount +=
124     test_cipher_option (NULL, des_cbc3_sha_tlsv1, CURL_SSLVERSION_TLSv1);
125   print_test_result (errorCount, argv[0]);
126 
127   curl_global_cleanup ();
128 
129   return errorCount != 0;
130 }
131