int _SSL_recv (SSL * ssl, char *buf, int len) { int num; num = SSL_read (ssl, buf, len); switch (SSL_get_error (ssl, num)) { case SSL_ERROR_SSL: /* ??? */ __SSL_fill_err_buf ("SSL_read"); fprintf (stderr, "%s\n", err_buf); break; case SSL_ERROR_SYSCALL: /* ??? */ if (!would_block ()) perror ("SSL_read/read"); break; case SSL_ERROR_ZERO_RETURN: /* fprintf(stdeerr, "SSL closed on read\n"); */ break; } return (num); }
int _SSL_send (SSL * ssl, char *buf, int len) { int num; num = SSL_write (ssl, buf, len); switch (SSL_get_error (ssl, num)) { case SSL_ERROR_SSL: /* setup errno! */ /* ??? */ __SSL_fill_err_buf ("SSL_write"); fprintf (stderr, "%s\n", err_buf); break; case SSL_ERROR_SYSCALL: /* ??? */ perror ("SSL_write/write"); break; case SSL_ERROR_ZERO_RETURN: /* fprintf(stderr, "SSL closed on write\n"); */ break; } return (num); }
static void __SSL_critical_error (char *funcname) { __SSL_fill_err_buf (funcname); fprintf (stderr, "%s\n", err_buf); exit (1); }
char * _SSL_set_verify (SSL_CTX *ctx, void *verify_callback, char *cacert) { if (!SSL_CTX_set_default_verify_paths (ctx)) { __SSL_fill_err_buf ("SSL_CTX_set_default_verify_paths"); return (err_buf); } if (cacert) { if (!SSL_CTX_load_verify_locations (ctx, cacert, NULL)) { __SSL_fill_err_buf ("SSL_CTX_load_verify_locations"); return (err_buf); } } SSL_CTX_set_verify (ctx, SSL_VERIFY_PEER, verify_callback); return (NULL); }
static char * _SSL_add_keypair (SSL_CTX *ctx, char *privkey, char *cert) { if (SSL_CTX_use_PrivateKey_file (ctx, privkey, SSL_FILETYPE_PEM) <= 0) { __SSL_fill_err_buf ("SSL_CTX_use_PrivateKey_file"); return (err_buf); } if (SSL_CTX_use_certificate_file (ctx, cert, SSL_FILETYPE_PEM) <= 0) { __SSL_fill_err_buf ("SSL_CTX_use_certificate_file"); return (err_buf); } if (!SSL_CTX_check_private_key (ctx)) { __SSL_fill_err_buf ("Private key does not match the certificate public key\n"); return (err_buf); } return (NULL); }