Skip to content

Commit 141ff46

Browse files
Lukasaweissi
authored andcommitted
Use BoringSSL for TLS. (#59)
Motivation: Requiring the system's SSL library was a constant source of problems. Modifications: This is the patch that transitions swift-nio-ssl to use BoringSSL, as discussed in [the Swift forums](https://forums.swift.org/t/rfc-moving-swiftnio-ssl-to-boringssl/18280). Result: Easier SSL support
1 parent 73c8380 commit 141ff46

File tree

588 files changed

+417604
-950
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

588 files changed

+417604
-950
lines changed

NOTICE.txt

+19
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,22 @@ This product contains a derivation of the Tony Stone's 'process_test_files.rb'.
4141
* https://www.apache.org/licenses/LICENSE-2.0
4242
* HOMEPAGE:
4343
* https://codegists.com/snippet/ruby/generate_xctest_linux_runnerrb_tonystone_ruby
44+
45+
---
46+
47+
This product contains code derived from grpc-swift.
48+
49+
* LICENSE (Apache License 2.0):
50+
* https://github.com/grpc/grpc-swift/blob/0.7.0/LICENSE
51+
* HOMEPAGE:
52+
* https://github.com/grpc/grpc-swift
53+
54+
---
55+
56+
This product contains code from boringssl.
57+
58+
* LICENSE (Combination ISC and OpenSSL license)
59+
* https://boringssl.googlesource.com/boringssl/+/refs/heads/master/LICENSE
60+
* HOMEPAGE:
61+
* https://boringssl.googlesource.com/boringssl/
62+

Package.swift

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version:4.0
1+
// swift-tools-version:5.0
22
//===----------------------------------------------------------------------===//
33
//
44
// This source file is part of the SwiftNIO open source project
@@ -20,16 +20,18 @@ let package = Package(
2020
products: [
2121
.library(name: "NIOOpenSSL", targets: ["NIOOpenSSL"]),
2222
.executable(name: "NIOTLSServer", targets: ["NIOTLSServer"]),
23+
.library(name: "CNIOBoringSSL", type: .static, targets: ["CNIOBoringSSL"]),
2324
],
2425
dependencies: [
25-
.package(url: "https://github.com/apple/swift-nio.git", from: "1.12.0"),
26-
.package(url: "https://github.com/apple/swift-nio-ssl-support.git", from: "1.0.0"),
26+
.package(url: "https://github.com/apple/swift-nio.git", .branch("master")),
2727
],
2828
targets: [
29-
.target(name: "CNIOOpenSSL"),
29+
.target(name: "CNIOBoringSSL"),
30+
.target(name: "CNIOBoringSSLShims", dependencies: ["CNIOBoringSSL"]),
3031
.target(name: "NIOOpenSSL",
31-
dependencies: ["NIO", "NIOConcurrencyHelpers", "CNIOOpenSSL", "NIOTLS"]),
32+
dependencies: ["NIO", "NIOConcurrencyHelpers", "CNIOBoringSSL", "CNIOBoringSSLShims", "NIOTLS", "_NIO1APIShims"]),
3233
.target(name: "NIOTLSServer", dependencies: ["NIO", "NIOOpenSSL", "NIOConcurrencyHelpers"]),
3334
.testTarget(name: "NIOOpenSSLTests", dependencies: ["NIOTLS", "NIOOpenSSL"]),
34-
]
35+
],
36+
cxxLanguageStandard: .cxx11
3537
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
/* Copyright (C) 1995-1998 Eric Young ([email protected])
2+
* All rights reserved.
3+
*
4+
* This package is an SSL implementation written
5+
* by Eric Young ([email protected]).
6+
* The implementation was written so as to conform with Netscapes SSL.
7+
*
8+
* This library is free for commercial and non-commercial use as long as
9+
* the following conditions are aheared to. The following conditions
10+
* apply to all code found in this distribution, be it the RC4, RSA,
11+
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
12+
* included with this distribution is covered by the same copyright terms
13+
* except that the holder is Tim Hudson ([email protected]).
14+
*
15+
* Copyright remains Eric Young's, and as such any Copyright notices in
16+
* the code are not to be removed.
17+
* If this package is used in a product, Eric Young should be given attribution
18+
* as the author of the parts of the library used.
19+
* This can be in the form of a textual message at program startup or
20+
* in documentation (online or textual) provided with the package.
21+
*
22+
* Redistribution and use in source and binary forms, with or without
23+
* modification, are permitted provided that the following conditions
24+
* are met:
25+
* 1. Redistributions of source code must retain the copyright
26+
* notice, this list of conditions and the following disclaimer.
27+
* 2. Redistributions in binary form must reproduce the above copyright
28+
* notice, this list of conditions and the following disclaimer in the
29+
* documentation and/or other materials provided with the distribution.
30+
* 3. All advertising materials mentioning features or use of this software
31+
* must display the following acknowledgement:
32+
* "This product includes cryptographic software written by
33+
* Eric Young ([email protected])"
34+
* The word 'cryptographic' can be left out if the rouines from the library
35+
* being used are not cryptographic related :-).
36+
* 4. If you include any Windows specific code (or a derivative thereof) from
37+
* the apps directory (application code) you must include an acknowledgement:
38+
* "This product includes software written by Tim Hudson ([email protected])"
39+
*
40+
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43+
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46+
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50+
* SUCH DAMAGE.
51+
*
52+
* The licence and distribution terms for any publically available version or
53+
* derivative of this code cannot be changed. i.e. this code cannot simply be
54+
* copied and put under another distribution licence
55+
* [including the GNU Public Licence.] */
56+
57+
#include "openssl/asn1.h"
58+
59+
#include "limits.h"
60+
#include "string.h"
61+
62+
#include "openssl/err.h"
63+
#include "openssl/mem.h"
64+
65+
#include "../internal.h"
66+
67+
68+
int ASN1_BIT_STRING_set(ASN1_BIT_STRING *x, unsigned char *d, int len)
69+
{
70+
return M_ASN1_BIT_STRING_set(x, d, len);
71+
}
72+
73+
int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp)
74+
{
75+
int ret, j, bits, len;
76+
unsigned char *p, *d;
77+
78+
if (a == NULL)
79+
return (0);
80+
81+
len = a->length;
82+
83+
if (len > 0) {
84+
if (a->flags & ASN1_STRING_FLAG_BITS_LEFT) {
85+
bits = (int)a->flags & 0x07;
86+
} else {
87+
for (; len > 0; len--) {
88+
if (a->data[len - 1])
89+
break;
90+
}
91+
j = a->data[len - 1];
92+
if (j & 0x01)
93+
bits = 0;
94+
else if (j & 0x02)
95+
bits = 1;
96+
else if (j & 0x04)
97+
bits = 2;
98+
else if (j & 0x08)
99+
bits = 3;
100+
else if (j & 0x10)
101+
bits = 4;
102+
else if (j & 0x20)
103+
bits = 5;
104+
else if (j & 0x40)
105+
bits = 6;
106+
else if (j & 0x80)
107+
bits = 7;
108+
else
109+
bits = 0; /* should not happen */
110+
}
111+
} else
112+
bits = 0;
113+
114+
ret = 1 + len;
115+
if (pp == NULL)
116+
return (ret);
117+
118+
p = *pp;
119+
120+
*(p++) = (unsigned char)bits;
121+
d = a->data;
122+
OPENSSL_memcpy(p, d, len);
123+
p += len;
124+
if (len > 0)
125+
p[-1] &= (0xff << bits);
126+
*pp = p;
127+
return (ret);
128+
}
129+
130+
ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,
131+
const unsigned char **pp, long len)
132+
{
133+
ASN1_BIT_STRING *ret = NULL;
134+
const unsigned char *p;
135+
unsigned char *s;
136+
int padding;
137+
138+
if (len < 1) {
139+
OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_SHORT);
140+
goto err;
141+
}
142+
143+
if (len > INT_MAX) {
144+
OPENSSL_PUT_ERROR(ASN1, ASN1_R_STRING_TOO_LONG);
145+
goto err;
146+
}
147+
148+
if ((a == NULL) || ((*a) == NULL)) {
149+
if ((ret = M_ASN1_BIT_STRING_new()) == NULL)
150+
return (NULL);
151+
} else
152+
ret = (*a);
153+
154+
p = *pp;
155+
padding = *(p++);
156+
if (padding > 7) {
157+
OPENSSL_PUT_ERROR(ASN1, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
158+
goto err;
159+
}
160+
161+
/*
162+
* We do this to preserve the settings. If we modify the settings, via
163+
* the _set_bit function, we will recalculate on output
164+
*/
165+
ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear */
166+
ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | padding); /* set */
167+
168+
if (len-- > 1) { /* using one because of the bits left byte */
169+
s = (unsigned char *)OPENSSL_malloc((int)len);
170+
if (s == NULL) {
171+
OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
172+
goto err;
173+
}
174+
OPENSSL_memcpy(s, p, (int)len);
175+
s[len - 1] &= (0xff << padding);
176+
p += len;
177+
} else
178+
s = NULL;
179+
180+
ret->length = (int)len;
181+
if (ret->data != NULL)
182+
OPENSSL_free(ret->data);
183+
ret->data = s;
184+
ret->type = V_ASN1_BIT_STRING;
185+
if (a != NULL)
186+
(*a) = ret;
187+
*pp = p;
188+
return (ret);
189+
err:
190+
if ((ret != NULL) && ((a == NULL) || (*a != ret)))
191+
M_ASN1_BIT_STRING_free(ret);
192+
return (NULL);
193+
}
194+
195+
/*
196+
* These next 2 functions from Goetz Babin-Ebell <[email protected]>
197+
*/
198+
int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value)
199+
{
200+
int w, v, iv;
201+
unsigned char *c;
202+
203+
w = n / 8;
204+
v = 1 << (7 - (n & 0x07));
205+
iv = ~v;
206+
if (!value)
207+
v = 0;
208+
209+
if (a == NULL)
210+
return 0;
211+
212+
a->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear, set on write */
213+
214+
if ((a->length < (w + 1)) || (a->data == NULL)) {
215+
if (!value)
216+
return (1); /* Don't need to set */
217+
if (a->data == NULL)
218+
c = (unsigned char *)OPENSSL_malloc(w + 1);
219+
else
220+
c = (unsigned char *)OPENSSL_realloc(a->data, w + 1);
221+
if (c == NULL) {
222+
OPENSSL_PUT_ERROR(ASN1, ERR_R_MALLOC_FAILURE);
223+
return 0;
224+
}
225+
if (w + 1 - a->length > 0)
226+
OPENSSL_memset(c + a->length, 0, w + 1 - a->length);
227+
a->data = c;
228+
a->length = w + 1;
229+
}
230+
a->data[w] = ((a->data[w]) & iv) | v;
231+
while ((a->length > 0) && (a->data[a->length - 1] == 0))
232+
a->length--;
233+
return (1);
234+
}
235+
236+
int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n)
237+
{
238+
int w, v;
239+
240+
w = n / 8;
241+
v = 1 << (7 - (n & 0x07));
242+
if ((a == NULL) || (a->length < (w + 1)) || (a->data == NULL))
243+
return (0);
244+
return ((a->data[w] & v) != 0);
245+
}
246+
247+
/*
248+
* Checks if the given bit string contains only bits specified by
249+
* the flags vector. Returns 0 if there is at least one bit set in 'a'
250+
* which is not specified in 'flags', 1 otherwise.
251+
* 'len' is the length of 'flags'.
252+
*/
253+
int ASN1_BIT_STRING_check(ASN1_BIT_STRING *a,
254+
unsigned char *flags, int flags_len)
255+
{
256+
int i, ok;
257+
/* Check if there is one bit set at all. */
258+
if (!a || !a->data)
259+
return 1;
260+
261+
/*
262+
* Check each byte of the internal representation of the bit string.
263+
*/
264+
ok = 1;
265+
for (i = 0; i < a->length && ok; ++i) {
266+
unsigned char mask = i < flags_len ? ~flags[i] : 0xff;
267+
/* We are done if there is an unneeded bit set. */
268+
ok = (a->data[i] & mask) == 0;
269+
}
270+
return ok;
271+
}

0 commit comments

Comments
 (0)