Basic SSL connection going
[hcoop/domtool2.git] / openssl / openssl_sml.c
... / ...
CommitLineData
1#include "openssl/bio.h"
2#include "openssl/ssl.h"
3#include "openssl/err.h"
4
5#include <sys/types.h>
6#include <sys/socket.h>
7#include <unistd.h>
8#include <netinet/in.h>
9
10void OpenSSL_SML_init() {
11 SSL_library_init();
12}
13
14void OpenSSL_SML_load_error_strings() {
15 SSL_load_error_strings();
16 ERR_load_X509_strings();
17}
18
19void OpenSSL_SML_load_BIO_strings() {
20 ERR_load_BIO_strings();
21}
22
23int OpenSSL_SML_get_error() {
24 return ERR_get_error();
25}
26
27const char *OpenSSL_SML_lib_error_string(int err) {
28 return ERR_lib_error_string(err);
29}
30
31const char *OpenSSL_SML_func_error_string(int err) {
32 return ERR_func_error_string(err);
33}
34
35const char *OpenSSL_SML_reason_error_string(int err) {
36 return ERR_reason_error_string(err);
37}
38
39int OpenSSL_SML_read(BIO *b, void *data, int len) {
40 return BIO_read(b, data, len);
41}
42
43int OpenSSL_SML_write(BIO *b, const void *data, int len) {
44 return BIO_write(b, data, len);
45}
46
47BIO *OpenSSL_SML_new_connect(char *addr) {
48 return BIO_new_connect(addr);
49}
50
51BIO *OpenSSL_SML_new_accept(char *addr) {
52 return BIO_new_accept(addr);
53}
54
55void OpenSSL_SML_free_all(BIO *b) {
56 BIO_free_all(b);
57}
58
59int OpenSSL_SML_do_connect(BIO *b) {
60 return BIO_do_connect(b);
61}
62
63int OpenSSL_SML_do_accept(BIO *b) {
64 return BIO_do_accept(b);
65}
66
67SSL_CTX *OpenSSL_SML_CTX_new(SSL_METHOD *meth) {
68 SSL_CTX *ctx = SSL_CTX_new(meth);
69 SSL_CTX_set_verify(ctx,
70 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
71 0);
72 return ctx;
73}
74
75void OpenSSL_SML_CTX_free(SSL_CTX *ctx) {
76 return SSL_CTX_free(ctx);
77}
78
79SSL_METHOD *OpenSSL_SML_SSLv23_method() {
80 return SSLv23_method();
81}
82
83int OpenSSL_SML_load_verify_locations(SSL_CTX *ctx, const char *trust, const char *certs) {
84 return SSL_CTX_load_verify_locations(ctx, trust, certs);
85}
86
87BIO *OpenSSL_SML_new_ssl_connect(SSL_CTX *ctx) {
88 BIO *bio = BIO_new_ssl_connect(ctx);
89 SSL *ssl;
90
91 BIO_get_ssl(bio, &ssl);
92 SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
93
94 return bio;
95}
96
97
98SSL *OpenSSL_SML_get_ssl(BIO *bio) {
99 SSL *ssl;
100
101 if (BIO_get_ssl(bio, &ssl) <= 0)
102 return NULL;
103 else
104 return ssl;
105}
106
107int OpenSSL_SML_set_conn_hostname(BIO *bio, char *hostname) {
108 BIO_set_conn_hostname(bio, hostname);
109}
110
111int OpenSSL_SML_set_accept_port(BIO *bio, char *port) {
112 BIO_set_accept_port(bio, port);
113}
114
115int OpenSSL_SML_tcp_listen(int port, int qsize) {
116 int sock;
117 struct sockaddr_in sin;
118 int val=1;
119
120 if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
121 return -1;
122
123 memset(&sin,0,sizeof(sin));
124 sin.sin_addr.s_addr=INADDR_ANY;
125 sin.sin_family=AF_INET;
126 sin.sin_port=htons(port);
127 setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,
128 &val,sizeof(val));
129
130 if(bind(sock,(struct sockaddr *)&sin,
131 sizeof(sin))<0)
132 return -1;
133 listen(sock, qsize);
134
135 return sock;
136}
137
138int OpenSSL_SML_accept(int sock) {
139 return accept(sock, 0, 0);
140}
141
142BIO *OpenSSL_SML_new_socket(int sock) {
143 return BIO_new_socket(sock, BIO_NOCLOSE);
144}
145
146SSL *OpenSSL_SML_SSL_new(SSL_CTX *ctx) {
147 SSL *ssl = SSL_new(ctx);
148
149 return ssl;
150}
151
152int OpenSSL_SML_SSL_shutdown(SSL *ssl) {
153 return SSL_shutdown(ssl);
154}
155
156void OpenSSL_SML_shutdown(int sock) {
157 shutdown(sock, 1);
158}
159
160void OpenSSL_SML_SSL_set_bio(SSL *ssl, BIO *b1, BIO *b2) {
161 SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
162 SSL_set_bio(ssl, b1, b2);
163}
164
165int OpenSSL_SML_use_PrivateKey_file(SSL_CTX *ctx, char *keyfile) {
166 return SSL_CTX_use_PrivateKey_file(ctx,
167 keyfile,
168 SSL_FILETYPE_PEM);
169}
170
171int OpenSSL_SML_SSL_accept(SSL *ssl) {
172 return SSL_accept(ssl);
173}
174
175int OpenSSL_SML_use_certificate_chain_file(SSL_CTX *ctx, char *keyfile) {
176 return SSL_CTX_use_certificate_chain_file(ctx,
177 keyfile);
178}
179
180static unsigned char subject[] = "Subject";
181
182const char *OpenSSL_SML_get_peer_name(SSL *ssl) {
183 X509 *x = SSL_get_peer_certificate(ssl);
184 unsigned char *name = subject;
185 X509_NAME *nm;
186
187 if (x) {
188 X509_NAME *name = X509_get_subject_name(x);
189
190 if (name) {
191 unsigned char *out;
192 X509_NAME_ENTRY *ne;
193
194 ne = X509_NAME_get_entry(name, 3);
195
196 if (ne) {
197 ASN1_STRING *s = X509_NAME_ENTRY_get_data(ne);
198 static char ret[1024];
199
200 if (M_ASN1_STRING_length(s) >= sizeof ret)
201 return NULL;
202 else {
203 memcpy(ret, M_ASN1_STRING_data(s), M_ASN1_STRING_length(s));
204 ret[M_ASN1_STRING_length(s)] = 0;
205 return ret;
206 }
207 } else
208 return NULL;
209 } else
210 return NULL;
211 } else
212 return NULL;
213}