Skip to content

Commit fc5b9b1

Browse files
authored
Merge pull request #61 from CyberShadow/pu
2020 roll-up
2 parents c315767 + 5cec50d commit fc5b9b1

File tree

6 files changed

+329
-47
lines changed

6 files changed

+329
-47
lines changed

C/applink.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#define APPLINK_STDIN 1
2+
#define APPLINK_STDOUT 2
3+
#define APPLINK_STDERR 3
4+
#define APPLINK_FPRINTF 4
5+
#define APPLINK_FGETS 5
6+
#define APPLINK_FREAD 6
7+
#define APPLINK_FWRITE 7
8+
#define APPLINK_FSETMOD 8
9+
#define APPLINK_FEOF 9
10+
#define APPLINK_FCLOSE 10 /* should not be used */
11+
12+
#define APPLINK_FOPEN 11 /* solely for completeness */
13+
#define APPLINK_FSEEK 12
14+
#define APPLINK_FTELL 13
15+
#define APPLINK_FFLUSH 14
16+
#define APPLINK_FERROR 15
17+
#define APPLINK_CLEARERR 16
18+
#define APPLINK_FILENO 17 /* to be used with below */
19+
20+
#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */
21+
#define APPLINK_READ 19
22+
#define APPLINK_WRITE 20
23+
#define APPLINK_LSEEK 21
24+
#define APPLINK_CLOSE 22
25+
#define APPLINK_MAX 22 /* always same as last macro */
26+
27+
#ifndef APPMACROS_ONLY
28+
#include <stdio.h>
29+
#include <io.h>
30+
#include <fcntl.h>
31+
32+
static void *app_stdin(void) { return stdin; }
33+
static void *app_stdout(void) { return stdout; }
34+
static void *app_stderr(void) { return stderr; }
35+
static int app_feof(FILE *fp) { return feof(fp); }
36+
static int app_ferror(FILE *fp) { return ferror(fp); }
37+
static void app_clearerr(FILE *fp) { clearerr(fp); }
38+
static int app_fileno(FILE *fp) { return _fileno(fp); }
39+
static int app_fsetmod(FILE *fp,char mod)
40+
{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); }
41+
42+
#ifdef __cplusplus
43+
extern "C" {
44+
#endif
45+
46+
__declspec(dllexport)
47+
void **
48+
#if defined(__BORLANDC__)
49+
__stdcall /* __stdcall appears to be the only way to get the name
50+
* decoration right with Borland C. Otherwise it works
51+
* purely incidentally, as we pass no parameters. */
52+
#else
53+
__cdecl
54+
#endif
55+
OPENSSL_Applink(void)
56+
{ static int once=1;
57+
static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX};
58+
59+
if (once)
60+
{ OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin;
61+
OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout;
62+
OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr;
63+
OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf;
64+
OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets;
65+
OPENSSL_ApplinkTable[APPLINK_FREAD] = fread;
66+
OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite;
67+
OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod;
68+
OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof;
69+
OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose;
70+
71+
OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen;
72+
OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek;
73+
OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell;
74+
OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush;
75+
OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror;
76+
OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr;
77+
OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno;
78+
79+
OPENSSL_ApplinkTable[APPLINK_OPEN] = _open;
80+
OPENSSL_ApplinkTable[APPLINK_READ] = _read;
81+
OPENSSL_ApplinkTable[APPLINK_WRITE] = _write;
82+
OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek;
83+
OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close;
84+
85+
once = 0;
86+
}
87+
88+
return OPENSSL_ApplinkTable;
89+
}
90+
91+
#ifdef __cplusplus
92+
}
93+
#endif
94+
#endif

deimos/openssl/applink.d

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
module deimos.openssl.applink;
2+
import core.stdc.stdio;
3+
import std.stdio : _fileno, _setmode, _O_BINARY;
4+
import core.sys.posix.fcntl;
5+
import core.sys.posix.unistd;
6+
import core.stdc.stdio;
7+
8+
enum APPLINK_STDIN =1;
9+
enum APPLINK_STDOUT =2;
10+
enum APPLINK_STDERR =3;
11+
enum APPLINK_FPRINTF =4;
12+
enum APPLINK_FGETS =5;
13+
enum APPLINK_FREAD =6;
14+
enum APPLINK_FWRITE =7;
15+
enum APPLINK_FSETMOD =8;
16+
enum APPLINK_FEOF =9;
17+
enum APPLINK_FCLOSE =10; /* should not be used */
18+
19+
enum APPLINK_FOPEN =11; /* solely for completeness */
20+
enum APPLINK_FSEEK =12;
21+
enum APPLINK_FTELL =13;
22+
enum APPLINK_FFLUSH =14;
23+
enum APPLINK_FERROR =15;
24+
enum APPLINK_CLEARERR =16;
25+
enum APPLINK_FILENO =17; /* to be used with below */
26+
27+
enum APPLINK_OPEN =18; /* formally can't be used, as flags can vary */
28+
enum APPLINK_READ =19;
29+
enum APPLINK_WRITE =20;
30+
enum APPLINK_LSEEK =21;
31+
enum APPLINK_CLOSE =22;
32+
enum APPLINK_MAX =22; /* always same as last macro */
33+
34+
enum _O_TEXT = 0x4000;
35+
36+
extern(C)
37+
{
38+
void *app_stdin()
39+
{
40+
return cast(void*)stdin;
41+
}
42+
43+
void *app_stdout()
44+
{
45+
return cast(void*)stdout;
46+
}
47+
48+
void *app_stderr()
49+
{
50+
return cast(void*)stderr;
51+
}
52+
53+
int app_feof(FILE *fp)
54+
{
55+
return feof(fp);
56+
}
57+
58+
int app_ferror(FILE *fp)
59+
{
60+
return ferror(fp);
61+
}
62+
63+
void app_clearerr(FILE *fp)
64+
{
65+
clearerr(fp);
66+
}
67+
68+
int app_fileno(FILE *fp)
69+
{
70+
return _fileno(fp);
71+
}
72+
73+
int app_fsetmod(FILE *fp, char mod)
74+
{
75+
return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT);
76+
}
77+
78+
__gshared bool once = true;
79+
__gshared void*[APPLINK_MAX+1] OPENSSL_ApplinkTable = cast(void*)APPLINK_MAX;
80+
81+
export void** OPENSSL_Applink()
82+
{
83+
if (once)
84+
{
85+
OPENSSL_ApplinkTable[APPLINK_STDIN] = &app_stdin;
86+
OPENSSL_ApplinkTable[APPLINK_STDOUT] = &app_stdout;
87+
OPENSSL_ApplinkTable[APPLINK_STDERR] = &app_stderr;
88+
OPENSSL_ApplinkTable[APPLINK_FPRINTF] = &fprintf;
89+
OPENSSL_ApplinkTable[APPLINK_FGETS] = &fgets;
90+
OPENSSL_ApplinkTable[APPLINK_FREAD] = &fread;
91+
OPENSSL_ApplinkTable[APPLINK_FWRITE] = &fwrite;
92+
OPENSSL_ApplinkTable[APPLINK_FSETMOD] = &app_fsetmod;
93+
OPENSSL_ApplinkTable[APPLINK_FEOF] = &app_feof;
94+
OPENSSL_ApplinkTable[APPLINK_FCLOSE] = &fclose;
95+
96+
OPENSSL_ApplinkTable[APPLINK_FOPEN] = &fopen;
97+
OPENSSL_ApplinkTable[APPLINK_FSEEK] = &fseek;
98+
OPENSSL_ApplinkTable[APPLINK_FTELL] = &ftell;
99+
OPENSSL_ApplinkTable[APPLINK_FFLUSH] = &fflush;
100+
OPENSSL_ApplinkTable[APPLINK_FERROR] = &app_ferror;
101+
OPENSSL_ApplinkTable[APPLINK_CLEARERR] = &app_clearerr;
102+
OPENSSL_ApplinkTable[APPLINK_FILENO] = &app_fileno;
103+
104+
OPENSSL_ApplinkTable[APPLINK_OPEN] = &fopen;
105+
OPENSSL_ApplinkTable[APPLINK_READ] = &fread;
106+
OPENSSL_ApplinkTable[APPLINK_WRITE] = &fwrite;
107+
OPENSSL_ApplinkTable[APPLINK_LSEEK] = &fseek;
108+
OPENSSL_ApplinkTable[APPLINK_CLOSE] = &fclose;
109+
110+
once = false;
111+
}
112+
113+
return OPENSSL_ApplinkTable.ptr;
114+
}
115+
}

deimos/openssl/bio.d

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ enum BIO_FLAGS_MEM_RDONLY = 0x200;
239239

240240
alias bio_st BIO;
241241

242+
int BIO_get_new_index();
242243
void BIO_set_flags(BIO* b, int flags);
243244
int BIO_test_flags(const(BIO)* b, int flags);
244245
void BIO_clear_flags(BIO* b, int flags);
@@ -306,6 +307,7 @@ const(char)* BIO_method_name(const(BIO)* b);
306307
int BIO_method_type(const(BIO)* b);
307308

308309
alias typeof(*(ExternC!(void function(bio_st*, int, const(char)*, int, c_long, c_long))).init) bio_info_cb;
310+
alias BIO_info_cb = bio_info_cb;
309311

310312
struct bio_method_st {
311313
int type;
@@ -485,7 +487,7 @@ auto BIO_get_conn_ip()(BIO* b) { return { return BIO_ptr_ctrl(b,BIO_C_GET_CONNEC
485487
auto BIO_get_conn_int_port()(BIO* b) { return { return BIO_int_ctrl(b,BIO_C_GET_CONNECT,3,0); }; }
486488

487489

488-
auto BIO_set_nbio()(BIO* b,n) { return BIO_ctrl(b,BIO_C_SET_NBIO,(n),null); }
490+
auto BIO_set_nbio()(BIO* b, int n) { return BIO_ctrl(b,BIO_C_SET_NBIO,(n),null); }
489491

490492
/* BIO_s_accept_socket() */
491493
auto BIO_set_accept_port()(BIO* b,char* name) { return BIO_ctrl(b,BIO_C_SET_ACCEPT,0,name); }
@@ -763,6 +765,30 @@ int BIO_vprintf(BIO* bio, const(char)* format, va_list args);
763765
int BIO_snprintf(char* buf, size_t n, const(char)* format, ...);
764766
int BIO_vsnprintf(char* buf, size_t n, const(char)* format, va_list args);
765767

768+
BIO_METHOD *BIO_meth_new(int type, const char *name);
769+
void BIO_meth_free(BIO_METHOD *biom);
770+
int function(BIO_METHOD *biom) BIO_meth_get_write(BIO *, const char *, int);
771+
int BIO_meth_set_write(BIO_METHOD *biom,
772+
int function(BIO *, const char *, int) write);
773+
int function(BIO_METHOD *biom) BIO_meth_get_read(BIO *, char *, int);
774+
int BIO_meth_set_read(BIO_METHOD *biom,
775+
int function(BIO *, char *, int) read);
776+
int function(BIO_METHOD *biom) BIO_meth_get_puts(BIO *, const char *);
777+
int BIO_meth_set_puts(BIO_METHOD *biom,
778+
int function(BIO *, const char *) puts);
779+
int function(BIO_METHOD *biom) BIO_meth_get_gets(BIO *, char *, int);
780+
int BIO_meth_set_gets(BIO_METHOD *biom,
781+
int function(BIO *, char *, int) gets);
782+
long function(BIO_METHOD *biom) BIO_meth_get_ctrl(BIO *, int, long, void *);
783+
int BIO_meth_set_ctrl(BIO_METHOD *biom,
784+
long function(BIO *, int, long, void *) ctrl);
785+
int function(BIO_METHOD *bion) BIO_meth_get_create(BIO *);
786+
int BIO_meth_set_create(BIO_METHOD *biom, int function(BIO *) create);
787+
int function(BIO_METHOD *biom) BIO_meth_get_destroy(BIO *);
788+
int BIO_meth_set_destroy(BIO_METHOD *biom, int function(BIO *) destroy);
789+
long function(BIO *, int, BIO_info_cb *) BIO_meth_get_callback_ctrl(BIO_METHOD *biom);
790+
int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, long function(BIO *, int, BIO_info_cb *) callback_ctrl);
791+
766792
/* BEGIN ERROR CODES */
767793
/* The following lines are auto generated by the script mkerr.pl. Any changes
768794
* made after this point may be overwritten when the script is next run.

deimos/openssl/ssl.d

Lines changed: 71 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -661,24 +661,12 @@ enum SSL_MODE_SEND_SERVERHELLO_TIME = 0x00000040L;
661661
/* Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value,
662662
* they cannot be used to clear bits. */
663663

664-
auto SSL_CTX_set_options()(SSL_CTX* ctx, c_long op) {
665-
return SSL_CTX_ctrl(ctx,SSL_CTRL_OPTIONS,op,null);
666-
}
667-
auto SSL_CTX_clear_options()(SSL_CTX* ctx, c_long op) {
668-
return SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_OPTIONS,op,null);
669-
}
670-
auto SSL_CTX_get_options()(SSL_CTX* ctx) {
671-
return SSL_CTX_ctrl(ctx,SSL_CTRL_OPTIONS,0,null);
672-
}
673-
auto SSL_set_options()(SSL* ssl, c_long op) {
674-
return SSL_ctrl(ssl,SSL_CTRL_OPTIONS,op,null);
675-
}
676-
auto SSL_clear_options()(SSL* ssl, c_long op) {
677-
return SSL_ctrl(ssl,SSL_CTRL_CLEAR_OPTIONS,op,null);
678-
}
679-
auto SSL_get_options()(SSL* ssl) {
680-
return SSL_ctrl(ssl,SSL_CTRL_OPTIONS,0,null);
681-
}
664+
c_ulong SSL_CTX_get_options(const SSL_CTX *ctx);
665+
c_ulong SSL_get_options(const SSL *s);
666+
c_ulong SSL_CTX_clear_options(SSL_CTX *ctx, c_ulong op);
667+
c_ulong SSL_clear_options(SSL *s, c_ulong op);
668+
c_ulong SSL_CTX_set_options(SSL_CTX *ctx, c_ulong op);
669+
c_ulong SSL_set_options(SSL *s, c_ulong op);
682670

683671
auto SSL_CTX_set_mode()(SSL_CTX* ctx, c_long op) {
684672
return SSL_CTX_ctrl(ctx,SSL_CTRL_MODE,op,null);
@@ -1442,6 +1430,60 @@ auto SSL_SESSION_get_app_data()(const(SSL_SESSION)* s) { return (SSL_SESSION_get
14421430
auto SSL_CTX_get_app_data()(const(SSL_CTX)* ctx) { return (SSL_CTX_get_ex_data(ctx,0)); }
14431431
auto SSL_CTX_set_app_data()(SSL_CTX* ctx, char* arg) { return (SSL_CTX_set_ex_data(ctx,0,arg)); }
14441432

1433+
/*
1434+
* The valid handshake states (one for each type message sent and one for each
1435+
* type of message received). There are also two "special" states:
1436+
* TLS = TLS or DTLS state
1437+
* DTLS = DTLS specific state
1438+
* CR/SR = Client Read/Server Read
1439+
* CW/SW = Client Write/Server Write
1440+
*
1441+
* The "special" states are:
1442+
* TLS_ST_BEFORE = No handshake has been initiated yet
1443+
* TLS_ST_OK = A handshake has been successfully completed
1444+
*/
1445+
enum
1446+
{
1447+
TLS_ST_BEFORE,
1448+
TLS_ST_OK,
1449+
DTLS_ST_CR_HELLO_VERIFY_REQUEST,
1450+
TLS_ST_CR_SRVR_HELLO,
1451+
TLS_ST_CR_CERT,
1452+
TLS_ST_CR_CERT_STATUS,
1453+
TLS_ST_CR_KEY_EXCH,
1454+
TLS_ST_CR_CERT_REQ,
1455+
TLS_ST_CR_SRVR_DONE,
1456+
TLS_ST_CR_SESSION_TICKET,
1457+
TLS_ST_CR_CHANGE,
1458+
TLS_ST_CR_FINISHED,
1459+
TLS_ST_CW_CLNT_HELLO,
1460+
TLS_ST_CW_CERT,
1461+
TLS_ST_CW_KEY_EXCH,
1462+
TLS_ST_CW_CERT_VRFY,
1463+
TLS_ST_CW_CHANGE,
1464+
TLS_ST_CW_NEXT_PROTO,
1465+
TLS_ST_CW_FINISHED,
1466+
TLS_ST_SW_HELLO_REQ,
1467+
TLS_ST_SR_CLNT_HELLO,
1468+
DTLS_ST_SW_HELLO_VERIFY_REQUEST,
1469+
TLS_ST_SW_SRVR_HELLO,
1470+
TLS_ST_SW_CERT,
1471+
TLS_ST_SW_KEY_EXCH,
1472+
TLS_ST_SW_CERT_REQ,
1473+
TLS_ST_SW_SRVR_DONE,
1474+
TLS_ST_SR_CERT,
1475+
TLS_ST_SR_KEY_EXCH,
1476+
TLS_ST_SR_CERT_VRFY,
1477+
TLS_ST_SR_NEXT_PROTO,
1478+
TLS_ST_SR_CHANGE,
1479+
TLS_ST_SR_FINISHED,
1480+
TLS_ST_SW_SESSION_TICKET,
1481+
TLS_ST_SW_CERT_STATUS,
1482+
TLS_ST_SW_CHANGE,
1483+
TLS_ST_SW_FINISHED
1484+
}
1485+
alias OSSL_HANDSHAKE_STATE = typeof(TLS_ST_BEFORE);
1486+
14451487
/* The following are the possible values for ssl->state are are
14461488
* used to indicate where we are up to in the SSL connection establishment.
14471489
* The macros that follow are about the only things you should need to use
@@ -1472,12 +1514,11 @@ enum SSL_CB_HANDSHAKE_START = 0x10;
14721514
enum SSL_CB_HANDSHAKE_DONE = 0x20;
14731515

14741516
/* Is the SSL_connection established? */
1475-
auto SSL_get_state()(const(SSL)* a) { return SSL_state(a); }
1476-
auto SSL_is_init_finished()(const(SSL)* a) { return (SSL_state(a) == SSL_ST_OK); }
1477-
auto SSL_in_init()(const(SSL)* a) { return (SSL_state(a)&SSL_ST_INIT); }
1478-
auto SSL_in_before()(const(SSL)* a) { return (SSL_state(a)&SSL_ST_BEFORE); }
1479-
auto SSL_in_connect_init()(const(SSL)* a) { return (SSL_state(a)&SSL_ST_CONNECT); }
1480-
auto SSL_in_accept_init()(const(SSL)* a) { return (SSL_state(a)&SSL_ST_ACCEPT); }
1517+
bool SSL_in_connect_init()(const(SSL)* a) { return SSL_in_init(a) && !SSL_is_server(a); }
1518+
bool SSL_in_accept_init()(const(SSL)* a) { return SSL_in_init(a) && SSL_is_server(a); }
1519+
int SSL_in_init(SSL *s);
1520+
int SSL_in_before(SSL *s);
1521+
int SSL_is_init_finished(SSL *s);
14811522

14821523
/* The following 2 states are kept in ssl->rstate when reads fail,
14831524
* you should not need these */
@@ -1900,6 +1941,11 @@ int SSL_set_purpose(SSL* s, int purpose);
19001941
int SSL_CTX_set_trust(SSL_CTX* s, int trust);
19011942
int SSL_set_trust(SSL* s, int trust);
19021943

1944+
int SSL_set1_host(SSL* s, const(char)* hostname);
1945+
int SSL_add1_host(SSL* s, const(char)* hostname);
1946+
const(char)* SSL_get0_peername(SSL* s);
1947+
void SSL_set_hostflags(SSL* s, uint flags);
1948+
19031949
int SSL_CTX_set1_param(SSL_CTX* ctx, X509_VERIFY_PARAM* vpm);
19041950
int SSL_set1_param(SSL* ssl, X509_VERIFY_PARAM* vpm);
19051951

@@ -2023,8 +2069,7 @@ SSL_CTX* SSL_set_SSL_CTX(SSL* ssl, SSL_CTX* ctx);
20232069
void SSL_set_info_callback(SSL* ssl,
20242070
ExternC!(void function(const(SSL)* ssl,int type,int val)) cb);
20252071
ExternC!(void function(const(SSL)* ssl,int type,int val)) SSL_get_info_callback(const(SSL)* ssl);
2026-
int SSL_state(const(SSL)* ssl);
2027-
void SSL_set_state(SSL *ssl, int state);
2072+
OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl);
20282073

20292074
void SSL_set_verify_result(SSL* ssl,c_long v);
20302075
c_long SSL_get_verify_result(const(SSL)* ssl);

0 commit comments

Comments
 (0)