saccept.c revision 296465
1/* NOCW */ 2/* demos/bio/saccept.c */ 3 4/*- 5 * A minimal program to server an SSL connection. 6 * It uses blocking. 7 * saccept host:port 8 * host is the interface IP to use. If any interface, use *:port 9 * The default it *:4433 10 * 11 * cc -I../../include saccept.c -L../.. -lssl -lcrypto 12 */ 13 14#include <stdio.h> 15#include <signal.h> 16#include <openssl/err.h> 17#include <openssl/ssl.h> 18 19#define CERT_FILE "server.pem" 20 21BIO *in = NULL; 22 23void close_up() 24{ 25 if (in != NULL) 26 BIO_free(in); 27} 28 29int main(argc, argv) 30int argc; 31char *argv[]; 32{ 33 char *port = NULL; 34 BIO *ssl_bio, *tmp; 35 SSL_CTX *ctx; 36 SSL *ssl; 37 char buf[512]; 38 int ret = 1, i; 39 40 if (argc <= 1) 41 port = "*:4433"; 42 else 43 port = argv[1]; 44 45 signal(SIGINT, close_up); 46 47 SSL_load_error_strings(); 48 49#ifdef WATT32 50 dbug_init(); 51 sock_init(); 52#endif 53 54 /* Add ciphers and message digests */ 55 OpenSSL_add_ssl_algorithms(); 56 57 ctx = SSL_CTX_new(SSLv23_server_method()); 58 if (!SSL_CTX_use_certificate_file(ctx, CERT_FILE, SSL_FILETYPE_PEM)) 59 goto err; 60 if (!SSL_CTX_use_PrivateKey_file(ctx, CERT_FILE, SSL_FILETYPE_PEM)) 61 goto err; 62 if (!SSL_CTX_check_private_key(ctx)) 63 goto err; 64 65 /* Setup server side SSL bio */ 66 ssl = SSL_new(ctx); 67 ssl_bio = BIO_new_ssl(ctx, 0); 68 69 if ((in = BIO_new_accept(port)) == NULL) 70 goto err; 71 72 /* 73 * This means that when a new connection is acceptede on 'in', The 74 * ssl_bio will be 'dupilcated' and have the new socket BIO push into it. 75 * Basically it means the SSL BIO will be automatically setup 76 */ 77 BIO_set_accept_bios(in, ssl_bio); 78 79 again: 80 /* 81 * The first call will setup the accept socket, and the second will get a 82 * socket. In this loop, the first actual accept will occur in the 83 * BIO_read() function. 84 */ 85 86 if (BIO_do_accept(in) <= 0) 87 goto err; 88 89 for (;;) { 90 i = BIO_read(in, buf, 512); 91 if (i == 0) { 92 /* 93 * If we have finished, remove the underlying BIO stack so the 94 * next time we call any function for this BIO, it will attempt 95 * to do an accept 96 */ 97 printf("Done\n"); 98 tmp = BIO_pop(in); 99 BIO_free_all(tmp); 100 goto again; 101 } 102 if (i < 0) 103 goto err; 104 fwrite(buf, 1, i, stdout); 105 fflush(stdout); 106 } 107 108 ret = 0; 109 err: 110 if (ret) { 111 ERR_print_errors_fp(stderr); 112 } 113 if (in != NULL) 114 BIO_free(in); 115 exit(ret); 116 return (!ret); 117} 118