mirror of
https://git.freebsd.org/ports.git
synced 2025-04-30 18:46:38 -04:00
Obtained from: https://chromium-review.googlesource.com/c/chromiumos/third_party/tlsdate/+/549533
332 lines
9.2 KiB
C
332 lines
9.2 KiB
C
Obtained from: https://chromium-review.googlesource.com/c/chromiumos/third_party/tlsdate/+/549533
|
|
|
|
--- src/proxy-bio.c.orig 2015-05-28 18:49:40 UTC
|
|
+++ src/proxy-bio.c
|
|
@@ -35,6 +35,7 @@
|
|
#include "src/common/strnlen.h"
|
|
#endif
|
|
|
|
+#include "src/openssl_compat.h"
|
|
#include "src/proxy-bio.h"
|
|
|
|
int socks4a_connect (BIO *b);
|
|
@@ -50,29 +51,29 @@ int proxy_new (BIO *b)
|
|
ctx->connect = NULL;
|
|
ctx->host = NULL;
|
|
ctx->port = 0;
|
|
- b->init = 1;
|
|
- b->flags = 0;
|
|
- b->ptr = ctx;
|
|
+ BIO_set_init(b, 1);
|
|
+ BIO_clear_flags(b, ~0);
|
|
+ BIO_set_data(b, ctx);
|
|
return 1;
|
|
}
|
|
|
|
int proxy_free (BIO *b)
|
|
{
|
|
struct proxy_ctx *c;
|
|
- if (!b || !b->ptr)
|
|
+ if (!b || !BIO_get_data(b))
|
|
return 1;
|
|
- c = (struct proxy_ctx *) b->ptr;
|
|
+ c = (struct proxy_ctx *) BIO_get_data(b);
|
|
if (c->host)
|
|
free (c->host);
|
|
c->host = NULL;
|
|
- b->ptr = NULL;
|
|
+ BIO_set_data(b, NULL);
|
|
free (c);
|
|
return 1;
|
|
}
|
|
|
|
int socks4a_connect (BIO *b)
|
|
{
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
int r;
|
|
unsigned char buf[NI_MAXHOST + 16];
|
|
uint16_t port_n = htons (ctx->port);
|
|
@@ -102,13 +103,13 @@ int socks4a_connect (BIO *b)
|
|
|
|
memcpy (buf + sz, ctx->host, strlen (ctx->host) + 1);
|
|
sz += strlen (ctx->host) + 1;
|
|
- r = BIO_write (b->next_bio, buf, sz);
|
|
+ r = BIO_write (BIO_next(b), buf, sz);
|
|
if ( -1 == r )
|
|
return -1;
|
|
if ( (size_t) r != sz)
|
|
return 0;
|
|
/* server reply: 1 + 1 + 2 + 4 */
|
|
- r = BIO_read (b->next_bio, buf, 8);
|
|
+ r = BIO_read (BIO_next(b), buf, 8);
|
|
if ( -1 == r )
|
|
return -1;
|
|
if ( (size_t) r != 8)
|
|
@@ -126,7 +127,7 @@ int socks5_connect (BIO *b)
|
|
{
|
|
unsigned char buf[NI_MAXHOST + 16];
|
|
int r;
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
uint16_t port_n = htons (ctx->port);
|
|
size_t sz = 0;
|
|
/* the length for SOCKS addresses is only one byte. */
|
|
@@ -145,10 +146,10 @@ int socks5_connect (BIO *b)
|
|
buf[0] = 0x05;
|
|
buf[1] = 0x01;
|
|
buf[2] = 0x00;
|
|
- r = BIO_write (b->next_bio, buf, 3);
|
|
+ r = BIO_write (BIO_next(b), buf, 3);
|
|
if (r != 3)
|
|
return 0;
|
|
- r = BIO_read (b->next_bio, buf, 2);
|
|
+ r = BIO_read (BIO_next(b), buf, 2);
|
|
if (r != 2)
|
|
return 0;
|
|
if (buf[0] != 0x05 || buf[1] != 0x00)
|
|
@@ -175,7 +176,7 @@ int socks5_connect (BIO *b)
|
|
sz += strlen (ctx->host);
|
|
memcpy (buf + sz, &port_n, sizeof (port_n));
|
|
sz += sizeof (port_n);
|
|
- r = BIO_write (b->next_bio, buf, sz);
|
|
+ r = BIO_write (BIO_next(b), buf, sz);
|
|
if ( -1 == r )
|
|
return -1;
|
|
if ( (size_t) r != sz)
|
|
@@ -190,7 +191,7 @@ int socks5_connect (BIO *b)
|
|
* 2b: port, network byte order
|
|
*/
|
|
/* grab up through the addr type */
|
|
- r = BIO_read (b->next_bio, buf, 4);
|
|
+ r = BIO_read (BIO_next(b), buf, 4);
|
|
if ( -1 == r )
|
|
return -1;
|
|
if (r != 4)
|
|
@@ -203,14 +204,14 @@ int socks5_connect (BIO *b)
|
|
if (buf[3] == 0x03)
|
|
{
|
|
unsigned int len;
|
|
- r = BIO_read (b->next_bio, buf + 4, 1);
|
|
+ r = BIO_read (BIO_next(b), buf + 4, 1);
|
|
if (r != 1)
|
|
return 0;
|
|
/* host (buf[4] bytes) + port (2 bytes) */
|
|
len = buf[4] + 2;
|
|
while (len)
|
|
{
|
|
- r = BIO_read (b->next_bio, buf + 5, min (len, sizeof (buf)));
|
|
+ r = BIO_read (BIO_next(b), buf + 5, min (len, sizeof (buf)));
|
|
if (r <= 0)
|
|
return 0;
|
|
len -= min (len, r);
|
|
@@ -219,7 +220,7 @@ int socks5_connect (BIO *b)
|
|
else if (buf[3] == 0x01)
|
|
{
|
|
/* 4 bytes ipv4 addr, 2 bytes port */
|
|
- r = BIO_read (b->next_bio, buf + 4, 6);
|
|
+ r = BIO_read (BIO_next(b), buf + 4, 6);
|
|
if (r != 6)
|
|
return 0;
|
|
}
|
|
@@ -248,30 +249,30 @@ int sock_gets (BIO *b, char *buf, size_t
|
|
int http_connect (BIO *b)
|
|
{
|
|
int r;
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
char buf[4096];
|
|
int retcode;
|
|
snprintf (buf, sizeof (buf), "CONNECT %s:%d HTTP/1.1\r\n",
|
|
ctx->host, ctx->port);
|
|
- r = BIO_write (b->next_bio, buf, strlen (buf));
|
|
+ r = BIO_write (BIO_next(b), buf, strlen (buf));
|
|
if ( -1 == r )
|
|
return -1;
|
|
if ( (size_t) r != strlen(buf))
|
|
return 0;
|
|
/* required by RFC 2616 14.23 */
|
|
snprintf (buf, sizeof (buf), "Host: %s:%d\r\n", ctx->host, ctx->port);
|
|
- r = BIO_write (b->next_bio, buf, strlen (buf));
|
|
+ r = BIO_write (BIO_next(b), buf, strlen (buf));
|
|
if ( -1 == r )
|
|
return -1;
|
|
if ( (size_t) r != strlen(buf))
|
|
return 0;
|
|
strcpy (buf, "\r\n");
|
|
- r = BIO_write (b->next_bio, buf, strlen (buf));
|
|
+ r = BIO_write (BIO_next(b), buf, strlen (buf));
|
|
if ( -1 == r )
|
|
return -1;
|
|
if ( (size_t) r != strlen(buf))
|
|
return 0;
|
|
- r = sock_gets (b->next_bio, buf, sizeof (buf));
|
|
+ r = sock_gets (BIO_next(b), buf, sizeof (buf));
|
|
if (r)
|
|
return 0;
|
|
/* use %*s to ignore the version */
|
|
@@ -279,7 +280,7 @@ int http_connect (BIO *b)
|
|
return 0;
|
|
if (retcode < 200 || retcode > 299)
|
|
return 0;
|
|
- while (! (r = sock_gets (b->next_bio, buf, sizeof (buf))))
|
|
+ while (! (r = sock_gets (BIO_next(b), buf, sizeof (buf))))
|
|
{
|
|
if (!strcmp (buf, "\r\n"))
|
|
{
|
|
@@ -294,12 +295,12 @@ int http_connect (BIO *b)
|
|
int proxy_write (BIO *b, const char *buf, int sz)
|
|
{
|
|
int r;
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
|
|
assert (buf);
|
|
if (sz <= 0)
|
|
return 0;
|
|
- if (!b->next_bio)
|
|
+ if (!BIO_next(b))
|
|
return 0;
|
|
if (!ctx->connected)
|
|
{
|
|
@@ -307,7 +308,7 @@ int proxy_write (BIO *b, const char *buf
|
|
if (!ctx->connect (b))
|
|
return 0;
|
|
}
|
|
- r = BIO_write (b->next_bio, buf, sz);
|
|
+ r = BIO_write (BIO_next(b), buf, sz);
|
|
BIO_clear_retry_flags (b);
|
|
BIO_copy_next_retry (b);
|
|
return r;
|
|
@@ -316,10 +317,10 @@ int proxy_write (BIO *b, const char *buf
|
|
int proxy_read (BIO *b, char *buf, int sz)
|
|
{
|
|
int r;
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
|
|
assert (buf);
|
|
- if (!b->next_bio)
|
|
+ if (!BIO_next(b))
|
|
return 0;
|
|
if (!ctx->connected)
|
|
{
|
|
@@ -327,7 +328,7 @@ int proxy_read (BIO *b, char *buf, int s
|
|
if (!ctx->connect (b))
|
|
return 0;
|
|
}
|
|
- r = BIO_read (b->next_bio, buf, sz);
|
|
+ r = BIO_read (BIO_next(b), buf, sz);
|
|
BIO_clear_retry_flags (b);
|
|
BIO_copy_next_retry (b);
|
|
return r;
|
|
@@ -337,43 +338,45 @@ long proxy_ctrl (BIO *b, int cmd, long n
|
|
{
|
|
long ret;
|
|
struct proxy_ctx *ctx;
|
|
- if (!b->next_bio)
|
|
+ if (!BIO_next(b))
|
|
return 0;
|
|
- ctx = (struct proxy_ctx *) b->ptr;
|
|
+ ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
assert (ctx);
|
|
switch (cmd)
|
|
{
|
|
case BIO_C_DO_STATE_MACHINE:
|
|
BIO_clear_retry_flags (b);
|
|
- ret = BIO_ctrl (b->next_bio, cmd, num, ptr);
|
|
+ ret = BIO_ctrl (BIO_next(b), cmd, num, ptr);
|
|
BIO_copy_next_retry (b);
|
|
break;
|
|
case BIO_CTRL_DUP:
|
|
ret = 0;
|
|
break;
|
|
default:
|
|
- ret = BIO_ctrl (b->next_bio, cmd, num, ptr);
|
|
+ ret = BIO_ctrl (BIO_next(b), cmd, num, ptr);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int proxy_gets (BIO *b, char *buf, int size)
|
|
{
|
|
- return BIO_gets (b->next_bio, buf, size);
|
|
+ return BIO_gets (BIO_next(b), buf, size);
|
|
}
|
|
|
|
int proxy_puts (BIO *b, const char *str)
|
|
{
|
|
- return BIO_puts (b->next_bio, str);
|
|
+ return BIO_puts (BIO_next(b), str);
|
|
}
|
|
|
|
long proxy_callback_ctrl (BIO *b, int cmd, bio_info_cb *fp)
|
|
{
|
|
- if (!b->next_bio)
|
|
+ if (!BIO_next(b))
|
|
return 0;
|
|
- return BIO_callback_ctrl (b->next_bio, cmd, fp);
|
|
+ return BIO_callback_ctrl (BIO_next(b), cmd, fp);
|
|
}
|
|
|
|
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
|
+
|
|
BIO_METHOD proxy_methods =
|
|
{
|
|
BIO_TYPE_MEM,
|
|
@@ -393,6 +396,29 @@ BIO_METHOD *BIO_f_proxy()
|
|
return &proxy_methods;
|
|
}
|
|
|
|
+#else
|
|
+
|
|
+static BIO_METHOD *proxy_methods;
|
|
+
|
|
+BIO_METHOD *BIO_f_proxy()
|
|
+{
|
|
+ if (!proxy_methods) {
|
|
+ proxy_methods = BIO_meth_new(BIO_TYPE_MEM, "proxy");
|
|
+ BIO_meth_set_write(proxy_methods, proxy_write);
|
|
+ BIO_meth_set_read(proxy_methods, proxy_read);
|
|
+ BIO_meth_set_puts(proxy_methods, proxy_puts);
|
|
+ BIO_meth_set_gets(proxy_methods, proxy_gets);
|
|
+ BIO_meth_set_ctrl(proxy_methods, proxy_ctrl);
|
|
+ BIO_meth_set_create(proxy_methods, proxy_new);
|
|
+ BIO_meth_set_destroy(proxy_methods, proxy_free);
|
|
+ BIO_meth_set_callback_ctrl(proxy_methods, proxy_callback_ctrl);
|
|
+ }
|
|
+
|
|
+ return proxy_methods;
|
|
+}
|
|
+
|
|
+#endif
|
|
+
|
|
/* API starts here */
|
|
|
|
BIO API *BIO_new_proxy()
|
|
@@ -402,7 +428,7 @@ BIO API *BIO_new_proxy()
|
|
|
|
int API BIO_proxy_set_type (BIO *b, const char *type)
|
|
{
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
if (!strcmp (type, "socks5"))
|
|
ctx->connect = socks5_connect;
|
|
else if (!strcmp (type, "socks4a"))
|
|
@@ -416,7 +442,7 @@ int API BIO_proxy_set_type (BIO *b, cons
|
|
|
|
int API BIO_proxy_set_host (BIO *b, const char *host)
|
|
{
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
if (strnlen (host, NI_MAXHOST) == NI_MAXHOST)
|
|
return 1;
|
|
ctx->host = strdup (host);
|
|
@@ -425,6 +451,6 @@ int API BIO_proxy_set_host (BIO *b, cons
|
|
|
|
void API BIO_proxy_set_port (BIO *b, uint16_t port)
|
|
{
|
|
- struct proxy_ctx *ctx = (struct proxy_ctx *) b->ptr;
|
|
+ struct proxy_ctx *ctx = (struct proxy_ctx *) BIO_get_data(b);
|
|
ctx->port = port;
|
|
}
|