config: warn that changing localRoot will not work currently
[hcoop/domtool2.git] / openssl / openssl_sml.c
index 201d816..d934217 100644 (file)
@@ -1,7 +1,8 @@
-#include "openssl/bio.h"
-#include "openssl/ssl.h"
-#include "openssl/err.h"
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <openssl/asn1.h>
 
+#include <string.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <unistd.h>
@@ -24,6 +25,10 @@ int OpenSSL_SML_get_error() {
   return ERR_get_error();
 }
 
+int OpenSSL_SML_should_retry(BIO *b) {
+  return BIO_should_retry(b);
+}
+
 const char *OpenSSL_SML_lib_error_string(int err) {
   return ERR_lib_error_string(err);
 }
@@ -48,10 +53,6 @@ BIO *OpenSSL_SML_new_connect(char *addr) {
   return BIO_new_connect(addr);
 }
 
-BIO *OpenSSL_SML_new_accept(char *addr) {
-  return BIO_new_accept(addr);
-}
-
 void OpenSSL_SML_free_all(BIO *b) {
   BIO_free_all(b);
 }
@@ -64,11 +65,17 @@ int OpenSSL_SML_do_accept(BIO *b) {
   return BIO_do_accept(b);
 }
 
+int OpenSSL_SML_do_handshake(BIO *b) {
+  return BIO_do_handshake(b);
+}
+
 SSL_CTX *OpenSSL_SML_CTX_new(SSL_METHOD *meth) {
   SSL_CTX *ctx = SSL_CTX_new(meth);
   SSL_CTX_set_verify(ctx,
                     SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
                     0);
+  SSL_CTX_set_verify_depth(ctx,
+                          2);
   return ctx;
 }
 
@@ -76,7 +83,7 @@ void OpenSSL_SML_CTX_free(SSL_CTX *ctx) {
   return SSL_CTX_free(ctx);
 }
 
-SSL_METHOD *OpenSSL_SML_SSLv23_method() {
+const SSL_METHOD *OpenSSL_SML_SSLv23_method() {
   return SSLv23_method();
 }
 
@@ -94,6 +101,24 @@ BIO *OpenSSL_SML_new_ssl_connect(SSL_CTX *ctx) {
   return bio;
 }
 
+BIO *OpenSSL_SML_new_ssl(SSL_CTX *ctx) {
+  BIO *bio = BIO_new_ssl_connect(ctx);
+  SSL *ssl;
+
+  BIO_get_ssl(bio, &ssl);
+  SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
+
+  return bio;
+}
+
+BIO *OpenSSL_SML_new_accept(SSL_CTX *ctx, char *port) {
+  BIO *sbio = BIO_new_ssl(ctx, 0);
+  BIO *acpt = BIO_new_accept(port);
+
+  BIO_set_accept_bios(acpt, sbio);
+
+  return acpt;
+}
 
 SSL *OpenSSL_SML_get_ssl(BIO *bio) {
   SSL *ssl;
@@ -160,6 +185,7 @@ void OpenSSL_SML_shutdown(int sock) {
 void OpenSSL_SML_SSL_set_bio(SSL *ssl, BIO *b1, BIO *b2) {
   SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
   SSL_set_bio(ssl, b1, b2);
+  BIO_set_ssl(b1, ssl, BIO_NOCLOSE);
 }
 
 int OpenSSL_SML_use_PrivateKey_file(SSL_CTX *ctx, char *keyfile) {
@@ -177,37 +203,50 @@ int OpenSSL_SML_use_certificate_chain_file(SSL_CTX *ctx, char *keyfile) {
                                            keyfile);
 }
 
-static unsigned char subject[] = "Subject";
-
 const char *OpenSSL_SML_get_peer_name(SSL *ssl) {
   X509 *x = SSL_get_peer_certificate(ssl);
-  unsigned char *name = subject;
-  X509_NAME *nm;
 
   if (x) {
     X509_NAME *name = X509_get_subject_name(x);
 
     if (name) {
-      unsigned char *out;
       X509_NAME_ENTRY *ne;
 
-      ne = X509_NAME_get_entry(name, 3);
+      ne = X509_NAME_get_entry(name, 0);
 
       if (ne) {
        ASN1_STRING *s = X509_NAME_ENTRY_get_data(ne);
        static char ret[1024];
 
-       if (M_ASN1_STRING_length(s) >= sizeof ret)
+       if (ASN1_STRING_length(s) >= sizeof ret)
          return NULL;
        else {
-         memcpy(ret, M_ASN1_STRING_data(s), M_ASN1_STRING_length(s));
-         ret[M_ASN1_STRING_length(s)] = 0;
+         memcpy(ret, ASN1_STRING_get0_data(s), ASN1_STRING_length(s));
+         ret[ASN1_STRING_length(s)] = 0;
          return ret;
        }
-      } else
+      } else {
+       printf("Null entry\n");
        return NULL;
-    } else
+      }
+    } else {
+      printf("Null name\n");
       return NULL;
-  } else
+    }
+  } else {
+    printf("Null certificate\n");
     return NULL;
+  }
+}
+
+BIO *OpenSSL_SML_pop(BIO *b) {
+  return BIO_pop(b);
+}
+
+BIO *OpenSSL_SML_next(BIO *b) {
+  return BIO_next(b);
+}
+
+int OpenSSL_SML_puts(BIO *b, const char *buf) {
+  return BIO_puts(b, buf);
 }