xref: /minix3/crypto/external/bsd/openssl/dist/demos/ssl/inetdsrv.cpp (revision ebfedea0ce5bbe81e252ddf32d732e40fb633fae)
1*ebfedea0SLionel Sambuc /* inetdserv.cpp  -  Minimal ssleay server for Unix inetd.conf
2*ebfedea0SLionel Sambuc  * 30.9.1996, Sampo Kellomaki <sampo@iki.fi>
3*ebfedea0SLionel Sambuc  * From /etc/inetd.conf:
4*ebfedea0SLionel Sambuc  *     1111 stream tcp nowait sampo /usr/users/sampo/demo/inetdserv inetdserv
5*ebfedea0SLionel Sambuc  */
6*ebfedea0SLionel Sambuc 
7*ebfedea0SLionel Sambuc #include <stdio.h>
8*ebfedea0SLionel Sambuc #include <errno.h>
9*ebfedea0SLionel Sambuc 
10*ebfedea0SLionel Sambuc #include "rsa.h"       /* SSLeay stuff */
11*ebfedea0SLionel Sambuc #include <openssl/crypto.h>
12*ebfedea0SLionel Sambuc #include <openssl/x509.h>
13*ebfedea0SLionel Sambuc #include <openssl/pem.h>
14*ebfedea0SLionel Sambuc #include <openssl/ssl.h>
15*ebfedea0SLionel Sambuc #include <openssl/err.h>
16*ebfedea0SLionel Sambuc 
17*ebfedea0SLionel Sambuc #define HOME "/usr/users/sampo/demo/"
18*ebfedea0SLionel Sambuc #define CERTF HOME "plain-cert.pem"
19*ebfedea0SLionel Sambuc #define KEYF  HOME "plain-key.pem"
20*ebfedea0SLionel Sambuc 
21*ebfedea0SLionel Sambuc #define CHK_NULL(x) if ((x)==NULL) exit (1)
22*ebfedea0SLionel Sambuc #define CHK_ERR(err,s) if ((err)==-1) \
23*ebfedea0SLionel Sambuc                          { fprintf(log, "%s %d\n", (s), errno); exit(1); }
24*ebfedea0SLionel Sambuc #define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(log); exit(2); }
25*ebfedea0SLionel Sambuc 
main()26*ebfedea0SLionel Sambuc void main ()
27*ebfedea0SLionel Sambuc {
28*ebfedea0SLionel Sambuc   int err;
29*ebfedea0SLionel Sambuc   SSL_CTX* ctx;
30*ebfedea0SLionel Sambuc   SSL*     ssl;
31*ebfedea0SLionel Sambuc   X509*    client_cert;
32*ebfedea0SLionel Sambuc   char*    str;
33*ebfedea0SLionel Sambuc   char     buf [4096];
34*ebfedea0SLionel Sambuc   FILE* log;
35*ebfedea0SLionel Sambuc 
36*ebfedea0SLionel Sambuc   log = fopen ("/dev/console", "a");                     CHK_NULL(log);
37*ebfedea0SLionel Sambuc   fprintf (log, "inetdserv %ld\n", (long)getpid());
38*ebfedea0SLionel Sambuc 
39*ebfedea0SLionel Sambuc   SSL_load_error_strings();
40*ebfedea0SLionel Sambuc   ctx = SSL_CTX_new (); CHK_NULL(ctx);
41*ebfedea0SLionel Sambuc 
42*ebfedea0SLionel Sambuc   err = SSL_CTX_use_RSAPrivateKey_file (ctx, KEYF,  SSL_FILETYPE_PEM);
43*ebfedea0SLionel Sambuc   CHK_SSL (err);
44*ebfedea0SLionel Sambuc 
45*ebfedea0SLionel Sambuc   err = SSL_CTX_use_certificate_file   (ctx, CERTF, SSL_FILETYPE_PEM);
46*ebfedea0SLionel Sambuc   CHK_SSL (err);
47*ebfedea0SLionel Sambuc 
48*ebfedea0SLionel Sambuc   /* inetd has already opened the TCP connection, so we can get right
49*ebfedea0SLionel Sambuc      down to business. */
50*ebfedea0SLionel Sambuc 
51*ebfedea0SLionel Sambuc   ssl = SSL_new (ctx);  CHK_NULL(ssl);
52*ebfedea0SLionel Sambuc   SSL_set_fd (ssl,  fileno(stdin));
53*ebfedea0SLionel Sambuc   err = SSL_accept (ssl);                                CHK_SSL(err);
54*ebfedea0SLionel Sambuc 
55*ebfedea0SLionel Sambuc   /* Get the cipher - opt */
56*ebfedea0SLionel Sambuc 
57*ebfedea0SLionel Sambuc   fprintf (log, "SSL connection using %s\n", SSL_get_cipher (ssl));
58*ebfedea0SLionel Sambuc 
59*ebfedea0SLionel Sambuc   /* Get client's certificate (note: beware of dynamic allocation) - opt */
60*ebfedea0SLionel Sambuc 
61*ebfedea0SLionel Sambuc   client_cert = SSL_get_peer_certificate (ssl);
62*ebfedea0SLionel Sambuc   if (client_cert != NULL) {
63*ebfedea0SLionel Sambuc     fprintf (log, "Client certificate:\n");
64*ebfedea0SLionel Sambuc 
65*ebfedea0SLionel Sambuc     str = X509_NAME_oneline (X509_get_subject_name (client_cert));
66*ebfedea0SLionel Sambuc     CHK_NULL(str);
67*ebfedea0SLionel Sambuc     fprintf (log, "\t subject: %s\n", str);
68*ebfedea0SLionel Sambuc     OPENSSL_free (str);
69*ebfedea0SLionel Sambuc 
70*ebfedea0SLionel Sambuc     str = X509_NAME_oneline (X509_get_issuer_name  (client_cert));
71*ebfedea0SLionel Sambuc     CHK_NULL(str);
72*ebfedea0SLionel Sambuc     fprintf (log, "\t issuer: %s\n", str);
73*ebfedea0SLionel Sambuc     OPENSSL_free (str);
74*ebfedea0SLionel Sambuc 
75*ebfedea0SLionel Sambuc     /* We could do all sorts of certificate verification stuff here before
76*ebfedea0SLionel Sambuc        deallocating the certificate. */
77*ebfedea0SLionel Sambuc 
78*ebfedea0SLionel Sambuc     X509_free (client_cert);
79*ebfedea0SLionel Sambuc   } else
80*ebfedea0SLionel Sambuc     fprintf (log, "Client doe not have certificate.\n");
81*ebfedea0SLionel Sambuc 
82*ebfedea0SLionel Sambuc   /* ------------------------------------------------- */
83*ebfedea0SLionel Sambuc   /* DATA EXCHANGE: Receive message and send reply  */
84*ebfedea0SLionel Sambuc 
85*ebfedea0SLionel Sambuc   err = SSL_read (ssl, buf, sizeof(buf) - 1);  CHK_SSL(err);
86*ebfedea0SLionel Sambuc   buf[err] = '\0';
87*ebfedea0SLionel Sambuc   fprintf (log, "Got %d chars:'%s'\n", err, buf);
88*ebfedea0SLionel Sambuc 
89*ebfedea0SLionel Sambuc   err = SSL_write (ssl, "Loud and clear.", strlen("Loud and clear."));
90*ebfedea0SLionel Sambuc   CHK_SSL(err);
91*ebfedea0SLionel Sambuc 
92*ebfedea0SLionel Sambuc   /* Clean up. */
93*ebfedea0SLionel Sambuc 
94*ebfedea0SLionel Sambuc   fclose (log);
95*ebfedea0SLionel Sambuc   SSL_free (ssl);
96*ebfedea0SLionel Sambuc   SSL_CTX_free (ctx);
97*ebfedea0SLionel Sambuc }
98*ebfedea0SLionel Sambuc /* EOF - inetdserv.cpp */
99