1 #include <openssl/ossl_typ.h>
2 #include <openssl/ssl.h>
3 #include <openssl/err.h>
4 #include <openssl/asn1.h>
8 #include <sys/socket.h>
10 #include <netinet/in.h>
12 void OpenSSL_SML_init() {
16 void OpenSSL_SML_load_error_strings() {
17 SSL_load_error_strings();
18 ERR_load_X509_strings();
21 void OpenSSL_SML_load_BIO_strings() {
22 ERR_load_BIO_strings();
25 int OpenSSL_SML_get_error() {
26 return ERR_get_error();
29 int OpenSSL_SML_should_retry(BIO
*b
) {
30 return BIO_should_retry(b
);
33 const char *OpenSSL_SML_lib_error_string(int err
) {
34 return ERR_lib_error_string(err
);
37 const char *OpenSSL_SML_func_error_string(int err
) {
38 return ERR_func_error_string(err
);
41 const char *OpenSSL_SML_reason_error_string(int err
) {
42 return ERR_reason_error_string(err
);
45 int OpenSSL_SML_read(BIO
*b
, void *data
, int len
) {
46 return BIO_read(b
, data
, len
);
49 int OpenSSL_SML_write(BIO
*b
, const void *data
, int len
) {
50 return BIO_write(b
, data
, len
);
53 BIO
*OpenSSL_SML_new_connect(char *addr
) {
54 return BIO_new_connect(addr
);
57 void OpenSSL_SML_free_all(BIO
*b
) {
61 int OpenSSL_SML_do_connect(BIO
*b
) {
62 return BIO_do_connect(b
);
65 int OpenSSL_SML_do_accept(BIO
*b
) {
66 return BIO_do_accept(b
);
69 int OpenSSL_SML_do_handshake(BIO
*b
) {
70 return BIO_do_handshake(b
);
73 SSL_CTX
*OpenSSL_SML_CTX_new(SSL_METHOD
*meth
) {
74 SSL_CTX
*ctx
= SSL_CTX_new(meth
);
75 SSL_CTX_set_verify(ctx
,
76 SSL_VERIFY_PEER
| SSL_VERIFY_FAIL_IF_NO_PEER_CERT
,
78 SSL_CTX_set_verify_depth(ctx
,
83 void OpenSSL_SML_CTX_free(SSL_CTX
*ctx
) {
84 return SSL_CTX_free(ctx
);
87 const SSL_METHOD
*OpenSSL_SML_SSLv23_method() {
88 return SSLv23_method();
91 int OpenSSL_SML_load_verify_locations(SSL_CTX
*ctx
, const char *trust
, const char *certs
) {
92 return SSL_CTX_load_verify_locations(ctx
, trust
, certs
);
95 BIO
*OpenSSL_SML_new_ssl_connect(SSL_CTX
*ctx
) {
96 BIO
*bio
= BIO_new_ssl_connect(ctx
);
99 BIO_get_ssl(bio
, &ssl
);
100 SSL_set_mode(ssl
, SSL_MODE_AUTO_RETRY
);
105 BIO
*OpenSSL_SML_new_ssl(SSL_CTX
*ctx
) {
106 BIO
*bio
= BIO_new_ssl_connect(ctx
);
109 BIO_get_ssl(bio
, &ssl
);
110 SSL_set_mode(ssl
, SSL_MODE_AUTO_RETRY
);
115 BIO
*OpenSSL_SML_new_accept(SSL_CTX
*ctx
, char *port
) {
116 BIO
*sbio
= BIO_new_ssl(ctx
, 0);
117 BIO
*acpt
= BIO_new_accept(port
);
119 BIO_set_accept_bios(acpt
, sbio
);
124 SSL
*OpenSSL_SML_get_ssl(BIO
*bio
) {
127 if (BIO_get_ssl(bio
, &ssl
) <= 0)
133 int OpenSSL_SML_set_conn_hostname(BIO
*bio
, char *hostname
) {
134 BIO_set_conn_hostname(bio
, hostname
);
137 int OpenSSL_SML_set_accept_port(BIO
*bio
, char *port
) {
138 BIO_set_accept_port(bio
, port
);
141 int OpenSSL_SML_tcp_listen(int port
, int qsize
) {
143 struct sockaddr_in sin
;
146 if((sock
=socket(AF_INET
,SOCK_STREAM
,0))<0)
149 memset(&sin
,0,sizeof(sin
));
150 sin
.sin_addr
.s_addr
=INADDR_ANY
;
151 sin
.sin_family
=AF_INET
;
152 sin
.sin_port
=htons(port
);
153 setsockopt(sock
,SOL_SOCKET
,SO_REUSEADDR
,
156 if(bind(sock
,(struct sockaddr
*)&sin
,
164 int OpenSSL_SML_accept(int sock
) {
165 return accept(sock
, 0, 0);
168 BIO
*OpenSSL_SML_new_socket(int sock
) {
169 return BIO_new_socket(sock
, BIO_NOCLOSE
);
172 SSL
*OpenSSL_SML_SSL_new(SSL_CTX
*ctx
) {
173 SSL
*ssl
= SSL_new(ctx
);
178 int OpenSSL_SML_SSL_shutdown(SSL
*ssl
) {
179 return SSL_shutdown(ssl
);
182 void OpenSSL_SML_shutdown(int sock
) {
186 void OpenSSL_SML_SSL_set_bio(SSL
*ssl
, BIO
*b1
, BIO
*b2
) {
187 SSL_set_mode(ssl
, SSL_MODE_AUTO_RETRY
);
188 SSL_set_bio(ssl
, b1
, b2
);
189 BIO_set_ssl(b1
, ssl
, BIO_NOCLOSE
);
192 int OpenSSL_SML_use_PrivateKey_file(SSL_CTX
*ctx
, char *keyfile
) {
193 return SSL_CTX_use_PrivateKey_file(ctx
,
198 int OpenSSL_SML_SSL_accept(SSL
*ssl
) {
199 return SSL_accept(ssl
);
202 int OpenSSL_SML_use_certificate_chain_file(SSL_CTX
*ctx
, char *keyfile
) {
203 return SSL_CTX_use_certificate_chain_file(ctx
,
207 const char *OpenSSL_SML_get_peer_name(SSL
*ssl
) {
208 X509
*x
= SSL_get_peer_certificate(ssl
);
211 X509_NAME
*name
= X509_get_subject_name(x
);
216 ne
= X509_NAME_get_entry(name
, 0);
219 ASN1_STRING
*s
= X509_NAME_ENTRY_get_data(ne
);
220 static char ret
[1024];
222 if (ASN1_STRING_length(s
) >= sizeof ret
)
225 memcpy(ret
, ASN1_STRING_get0_data(s
), ASN1_STRING_length(s
));
226 ret
[ASN1_STRING_length(s
)] = 0;
230 printf("Null entry\n");
234 printf("Null name\n");
238 printf("Null certificate\n");
243 BIO
*OpenSSL_SML_pop(BIO
*b
) {
247 BIO
*OpenSSL_SML_next(BIO
*b
) {
251 int OpenSSL_SML_puts(BIO
*b
, const char *buf
) {
252 return BIO_puts(b
, buf
);