Skip to content

Commit a505f88

Browse files
fbomlisboazhuizhuhaomeng
authored andcommitted
feature: added support for 80 bytes key
1 parent 62e06be commit a505f88

File tree

11 files changed

+429
-23
lines changed

11 files changed

+429
-23
lines changed

.travis.yml

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
dist: bionic
2+
3+
branches:
4+
only:
5+
- "master"
6+
7+
os: linux
8+
9+
language: c
10+
11+
compiler:
12+
- gcc
13+
14+
addons:
15+
apt:
16+
packages:
17+
- ack
18+
- axel
19+
- cpanminus
20+
- libtest-base-perl
21+
- libtext-diff-perl
22+
- liburi-perl
23+
- libwww-perl
24+
- libtest-longstring-perl
25+
- liblist-moreutils-perl
26+
27+
cache:
28+
directories:
29+
- download-cache
30+
31+
env:
32+
global:
33+
- JOBS=3
34+
- NGX_BUILD_JOBS=$JOBS
35+
- LUAJIT_PREFIX=/opt/luajit21
36+
- LUAJIT_LIB=$LUAJIT_PREFIX/lib
37+
- LUAJIT_INC=$LUAJIT_PREFIX/include/luajit-2.1
38+
- LUA_INCLUDE_DIR=$LUAJIT_INC
39+
- PCRE_VER=8.45
40+
- PCRE_PREFIX=/opt/pcre
41+
- PCRE_LIB=$PCRE_PREFIX/lib
42+
- PCRE_INC=$PCRE_PREFIX/include
43+
- OPENSSL_PREFIX=/opt/ssl
44+
- OPENSSL_LIB=$OPENSSL_PREFIX/lib
45+
- OPENSSL_INC=$OPENSSL_PREFIX/include
46+
- LD_LIBRARY_PATH=$LUAJIT_LIB:$LD_LIBRARY_PATH
47+
- TEST_NGINX_SLEEP=0.006
48+
jobs:
49+
- NGINX_VERSION=1.21.4 OPENSSL_VER=1.1.1s OPENSSL_PATCH_VER=1.1.1f
50+
51+
before_install:
52+
- sudo apt update
53+
- sudo apt install --only-upgrade ca-certificates
54+
- '! grep -n -P ''(?<=.{80}).+'' --color `find src -name ''*.c''` `find . -name ''*.h''` || (echo "ERROR: Found C source lines exceeding 80 columns." > /dev/stderr; exit 1)'
55+
- '! grep -n -P ''\t+'' --color `find src -name ''*.c''` `find . -name ''*.h''` || (echo "ERROR: Cannot use tabs." > /dev/stderr; exit 1)'
56+
- /usr/bin/env perl $(command -v cpanm) --sudo --notest Test::Nginx IPC::Run > build.log 2>&1 || (cat build.log && exit 1)
57+
- pyenv global 2.7
58+
install:
59+
- if [ ! -f download-cache/pcre-$PCRE_VER.tar.gz ]; then wget -P download-cache https://downloads.sourceforge.net/project/pcre/pcre/${PCRE_VER}/pcre-${PCRE_VER}.tar.gz; fi
60+
- if [ ! -f download-cache/openssl-$OPENSSL_VER.tar.gz ]; then wget -P download-cache https://www.openssl.org/source/openssl-$OPENSSL_VER.tar.gz || wget -P download-cache https://www.openssl.org/source/old/${OPENSSL_VER//[a-z]/}/openssl-$OPENSSL_VER.tar.gz; fi
61+
- git clone https://github.com/openresty/test-nginx.git
62+
- git clone https://github.com/openresty/openresty.git ../openresty
63+
- git clone https://github.com/openresty/no-pool-nginx.git ../no-pool-nginx
64+
- git clone https://github.com/openresty/openresty-devel-utils.git
65+
- git clone https://github.com/openresty/mockeagain.git
66+
- git clone https://github.com/openresty/lua-resty-lock ../lua-resty-lock
67+
- git clone https://github.com/openresty/lua-resty-memcached ../lua-resty-memcached
68+
- git clone https://github.com/openresty/lua-resty-memcached-shdict ../lua-resty-memcached-shdict
69+
- git clone https://github.com/openresty/lua-resty-shdict-simple ../lua-resty-shdict-simple
70+
- git clone https://github.com/openresty/echo-nginx-module.git ../echo-nginx-module
71+
- git clone https://github.com/openresty/nginx-eval-module.git ../nginx-eval-module
72+
- git clone https://github.com/simpl/ngx_devel_kit.git ../ndk-nginx-module
73+
- git clone https://github.com/FRiCKLE/ngx_coolkit.git ../coolkit-nginx-module
74+
- git clone https://github.com/openresty/set-misc-nginx-module.git ../set-misc-nginx-module
75+
- git clone https://github.com/openresty/lua-resty-core.git ../lua-resty-core
76+
- git clone https://github.com/openresty/lua-resty-lrucache.git ../lua-resty-lrucache
77+
- git clone https://github.com/spacewander/lua-resty-rsa.git ../lua-resty-rsa
78+
- git clone https://github.com/openresty/lua-resty-string.git ../lua-resty-string
79+
- git clone https://github.com/openresty/lua-nginx-module.git ../lua-nginx-module
80+
- git clone -b v2.1-agentzh https://github.com/openresty/luajit2.git luajit2
81+
82+
script:
83+
- export PATH=$PWD/work/nginx/sbin:$PWD/openresty-devel-utils:$PATH
84+
- ngx-releng > check.txt || true
85+
- lines=`wc -l check.txt | awk '{print $1}'`; if [ $lines -gt 5 ]; then cat check.txt; exit 1; fi
86+
- sudo sysctl -w kernel.pid_max=10000
87+
- cd luajit2/
88+
- make -j$JOBS CCDEBUG=-g Q= PREFIX=$LUAJIT_PREFIX CC=$CC XCFLAGS='-DLUA_USE_APICHECK -DLUA_USE_ASSERT -msse4.2' > build.log 2>&1 || (cat build.log && exit 1)
89+
- sudo make install PREFIX=$LUAJIT_PREFIX > build.log 2>&1 || (cat build.log && exit 1)
90+
- cd ../mockeagain/ && make CC=$CC -j$JOBS && cd ..
91+
- tar zxf download-cache/pcre-$PCRE_VER.tar.gz
92+
- cd pcre-$PCRE_VER/
93+
- ./configure --prefix=$PCRE_PREFIX --enable-jit --enable-utf --enable-unicode-properties > build.log 2>&1 || (cat build.log && exit 1)
94+
- make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)
95+
- sudo PATH=$PATH make install > build.log 2>&1 || (cat build.log && exit 1)
96+
- cd ..
97+
- tar zxf download-cache/openssl-$OPENSSL_VER.tar.gz
98+
- cd openssl-$OPENSSL_VER/
99+
- patch -p1 < ../../openresty/patches/openssl-$OPENSSL_PATCH_VER-sess_set_get_cb_yield.patch
100+
- ./config shared enable-ssl3 enable-ssl3-method -g --prefix=$OPENSSL_PREFIX -DPURIFY > build.log 2>&1 || (cat build.log && exit 1)
101+
- make -j$JOBS > build.log 2>&1 || (cat build.log && exit 1)
102+
- sudo make PATH=$PATH install_sw > build.log 2>&1 || (cat build.log && exit 1)
103+
- cd ..
104+
- export NGX_BUILD_CC=$CC
105+
- sh util/build.sh $NGINX_VERSION > build.log 2>&1 || (cat build.log && exit 1)
106+
- nginx -V
107+
- ldd `which nginx`|grep -E 'luajit|ssl|pcre'
108+
- export LD_PRELOAD=$PWD/mockeagain/mockeagain.so
109+
- export LD_LIBRARY_PATH=$PWD/mockeagain:$LD_LIBRARY_PATH
110+
- export TEST_NGINX_RESOLVER=8.8.4.4
111+
- /usr/bin/env perl $(command -v prove) -I. -Itest-nginx/lib -r t/

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ http {
4646
4747
memc_conn_max_idle_time = 1 * 1000, -- in ms, for in-pool connections,
4848
-- optional, default to nil
49+
key_length = 48 -- in bytes, optional, default 48, possible 80 if using with
50+
-- nginx > 1.12.0, any other values it will
51+
-- fallback to default length
4952
}
5053
}
5154
@@ -61,6 +64,7 @@ http {
6164
# Put a dummy key to trigger external ticket key usage in nginx/OpenSSL
6265
# init_by_lua* will replace this dummy key with existing cached keys
6366
# or a random key if cached keys are not available.
67+
# If key_length was set to 80 bytes in init_by_lua*, the dummy key needs to be 80 bytes too.
6468
ssl_session_ticket_key dummy.key;
6569
6670
...

lualib/ngx/ssl/session/ticket.lua

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ ffi.cdef[[
2323
int ngx_http_lua_ffi_get_ssl_ctx_count(void);
2424
int ngx_http_lua_ffi_get_ssl_ctx_list(void **buf);
2525
int ngx_http_lua_ffi_update_ticket_encryption_key(void *ctx,
26-
const unsigned char *key, unsigned int nkeys, char **err);
26+
const unsigned char *key, const unsigned int nkeys,
27+
const unsigned int key_length, char **err);
2728
int ngx_http_lua_ffi_update_last_ticket_decryption_key(void *ctx,
28-
const unsigned char *key, char **err);
29+
const unsigned char *key, const unsigned int key_length, char **err);
2930
]]
3031

3132

@@ -61,14 +62,15 @@ function _M.update_ticket_encryption_key(key, nkeys)
6162
-- OpenSSL session ticket key is 48 bytes.
6263
-- key structure:
6364
-- 16 bytes key name, 16 bytes AES key, 16 bytes HMAC key.
64-
if not key or #key ~= 48 then
65+
if not key or (#key ~= 48 and #key ~= 80) then
6566
return nil, 'invalid ticket key'
6667
end
6768

6869
for _, ctx in ipairs(ctxs) do
6970
local rc = C.ngx_http_lua_ffi_update_ticket_encryption_key(ctx,
7071
key,
7172
nkeys,
73+
#key,
7274
errmsg)
7375
if rc ~= 0 then -- not NGX_OK
7476
return nil, ffi_str(errmsg[0])
@@ -88,13 +90,14 @@ function _M.update_last_ticket_decryption_key(key)
8890
end
8991

9092
-- OpenSSL session ticket key is 48 bytes.
91-
if not key or #key ~= 48 then
93+
if not key or (#key ~= 48 and #key ~= 80) then
9294
return nil, 'invalid ticket key'
9395
end
9496

9597
for _, ctx in ipairs(ctxs) do
9698
local rc = C.ngx_http_lua_ffi_update_last_ticket_decryption_key(ctx,
9799
key,
100+
#key,
98101
errmsg)
99102
if rc ~= 0 then -- not NGX_OK
100103
return nil, ffi_str(errmsg[0])

lualib/ngx/ssl/session/ticket/key_rotation.lua

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ local function shdict_get_and_decrypt(ctx, idx)
9999
-- Ideally we should protect the ticket key with some encryption.
100100
-- key = decrypt(key, key_encryption_key)
101101

102-
if #key ~= 48 then
102+
if #key ~= 48 and #key ~= 80 then
103103
return fail("malformed key: #key ", #key)
104104
end
105105

@@ -132,7 +132,7 @@ local function memc_get_and_decrypt(ctx, idx, offset)
132132
-- Ideally we should protect the ticket key with some encryption.
133133
-- key = decrypt(key, key_encryption_key)
134134

135-
if #key ~= 48 then
135+
if #key ~= 48 and #key ~= 80 then
136136
return fail("malformed key: #key ", #key)
137137
end
138138

@@ -256,8 +256,14 @@ function _M.init(opts)
256256

257257
local memc_conn_max_idle_time = opts.memc_conn_max_idle_time
258258

259+
local key_length = opts.key_length
260+
259261
local frandom = assert(io.open("/dev/urandom", "rb"))
260-
fallback_random_key = frandom:read(48)
262+
-- if key_length is not set or is different from 48 or 80, use default 48 bytes
263+
if not key_length or (key_length ~= 48 and key_length ~= 80) then
264+
key_length = 48
265+
end
266+
fallback_random_key = frandom:read(key_length)
261267
frandom:close()
262268

263269
nkeys = floor(ticket_ttl / time_slot) + 2

src/ngx_http_lua_ssl_module.c

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ ngx_http_lua_ffi_get_ssl_ctx_list(SSL_CTX **buf)
183183

184184
int
185185
ngx_http_lua_ffi_update_ticket_encryption_key(SSL_CTX *ctx,
186-
const unsigned char *key, const ngx_uint_t nkeys, char **err)
186+
const unsigned char *key, const ngx_uint_t nkeys,
187+
const unsigned int key_length, char **err)
187188
{
188189
#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB
189190

@@ -226,12 +227,25 @@ ngx_http_lua_ffi_update_ticket_encryption_key(SSL_CTX *ctx,
226227
* key. */
227228
if (keys->nelts > 0) {
228229
pkey = keys->elts;
229-
if (ngx_memcmp(pkey->name, key, 16) == 0
230-
&& ngx_memcmp(pkey->aes_key, key + 16, 16) == 0
231-
&& ngx_memcmp(pkey->hmac_key, key + 32, 16) == 0)
232-
{
233-
dd("duplicate ticket key");
234-
return NGX_OK;
230+
if (key_length == 48) {
231+
dd("key size is 48");
232+
if (ngx_memcmp(pkey->name, key, 16) == 0
233+
&& ngx_memcmp(pkey->aes_key, key + 16, 16) == 0
234+
&& ngx_memcmp(pkey->hmac_key, key + 32, 16) == 0)
235+
{
236+
dd("duplicate ticket key");
237+
return NGX_OK;
238+
}
239+
240+
} else if (key_length == 80) {
241+
dd("key size is 80");
242+
if (ngx_memcmp(pkey->name, key, 16) == 0
243+
&& ngx_memcmp(pkey->aes_key, key + 16, 32) == 0
244+
&& ngx_memcmp(pkey->hmac_key, key + 48, 32) == 0)
245+
{
246+
dd("duplicate ticket key");
247+
return NGX_OK;
248+
}
235249
}
236250
}
237251

@@ -255,13 +269,23 @@ ngx_http_lua_ffi_update_ticket_encryption_key(SSL_CTX *ctx,
255269
}
256270

257271
/* copy the new key */
258-
ngx_memcpy(pkey->name, key, 16);
259-
ngx_memcpy(pkey->aes_key, key + 16, 16);
260-
ngx_memcpy(pkey->hmac_key, key + 32, 16);
272+
if (key_length == 48) {
273+
ngx_memcpy(pkey->name, key, 16);
274+
ngx_memcpy(pkey->aes_key, key + 16, 16);
275+
ngx_memcpy(pkey->hmac_key, key + 32, 16);
261276
#if (nginx_version >= 1011008)
262277
pkey->size = 48;
263278
#endif
264279

280+
} else if (key_length == 80) {
281+
ngx_memcpy(pkey->name, key, 16);
282+
ngx_memcpy(pkey->aes_key, key + 16, 32);
283+
ngx_memcpy(pkey->hmac_key, key + 48, 32);
284+
#if (nginx_version >= 1011008)
285+
pkey->size = 80;
286+
#endif
287+
}
288+
265289
return NGX_OK;
266290

267291
#else
@@ -275,7 +299,7 @@ ngx_http_lua_ffi_update_ticket_encryption_key(SSL_CTX *ctx,
275299

276300
int
277301
ngx_http_lua_ffi_update_last_ticket_decryption_key(SSL_CTX *ctx,
278-
const unsigned char *key, char **err)
302+
const unsigned char *key, const unsigned int key_length, char **err)
279303
{
280304
ngx_array_t *keys;
281305
ngx_ssl_session_ticket_key_t *pkey;
@@ -306,13 +330,23 @@ ngx_http_lua_ffi_update_last_ticket_decryption_key(SSL_CTX *ctx,
306330
pkey = &pkey[keys->nelts - 1];
307331

308332
dd("replace the last key");
309-
ngx_memcpy(pkey->name, key, 16);
310-
ngx_memcpy(pkey->aes_key, key + 16, 16);
311-
ngx_memcpy(pkey->hmac_key, key + 32, 16);
333+
if (key_length == 48) {
334+
ngx_memcpy(pkey->name, key, 16);
335+
ngx_memcpy(pkey->aes_key, key + 16, 16);
336+
ngx_memcpy(pkey->hmac_key, key + 32, 16);
312337
#if (nginx_version >= 1011008)
313338
pkey->size = 48;
314339
#endif
315340

341+
} else if (key_length == 80) {
342+
ngx_memcpy(pkey->name, key, 16);
343+
ngx_memcpy(pkey->aes_key, key + 16, 32);
344+
ngx_memcpy(pkey->hmac_key, key + 48, 32);
345+
#if (nginx_version >= 1011008)
346+
pkey->size = 80;
347+
#endif
348+
}
349+
316350
return NGX_OK;
317351

318352
#else

t/cert/dummy-48.key

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
׎�"��~���w�-L�W8�_a�.چE�J��7"�Y��7�Z��y�m��ٗ

t/cert/dummy-80.key

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
��h�Vl|S��+����m��ԋ�L*��:����fiHc���c.}��9/O'P����H��ɩ�E3 ]�x$��񝥂��`

t/cert/test.crt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIGETCCA/mgAwIBAgIUE3pqyVuRQL+qGuSFAUCLq4g7pt4wDQYJKoZIhvcNAQEL
3+
BQAwgZcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH
4+
DA1TYW4gRnJhbmNpc2NvMRIwEAYDVQQKDAlPcGVuUmVzdHkxEjAQBgNVBAsMCU9w
5+
ZW5SZXN0eTERMA8GA1UEAwwIdGVzdC5jb20xIDAeBgkqhkiG9w0BCQEWEWFnZW50
6+
emhAZ21haWwuY29tMB4XDTIyMDUyOTA2MTk1N1oXDTMyMDUyNjA2MTk1N1owgZcx
7+
CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1TYW4g
8+
RnJhbmNpc2NvMRIwEAYDVQQKDAlPcGVuUmVzdHkxEjAQBgNVBAsMCU9wZW5SZXN0
9+
eTERMA8GA1UEAwwIdGVzdC5jb20xIDAeBgkqhkiG9w0BCQEWEWFnZW50emhAZ21h
10+
aWwuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyLzMbnMBcxYB
11+
2W0uEqPKo2lOJdUQTnakipVLqRvZIJv7NkZgU76pxdFwoSxPpvJcpJ4rsosBZvhV
12+
dkGoKmuVfIFU0lYcdaccq88aT7E9XfTXiiyB2tkT6jS6wr+QxDj7KW47zdUBUT9O
13+
6ClNyY2o1gZldElTG0Bwk4j2sAkXuWGmyncTOJ4ge3mWVksAQYbL5pwfdfyqgDmK
14+
B4nLJHBkorLbF7nm7pK2HzQCtaEUJpQKpJdCULcOHrydjVAwHUQsZAb9XXjQWPTb
15+
A0BSplbgMSI6saT9uA2RjLBzpYKj8J1rWGadWteSyQAf6XooQrquTPuR+OWF6t/m
16+
2vkTcJlh1ukPPAPZBvlAQX9VSLWk5fmAQZA5BxYXNVWcMGVNO7UtilRmjqK1nCmv
17+
oyDXHzpE5RZPBZH4ecOqTscUgmS72ItPGWMtEtCQYbzWyMAa1cpCvK40YRa4814r
18+
XgffWgWJQfqyVvRjzpWIUiqwjUX3/p3W3pxX/GNHOv2ZH/pebcODOl7EFxzv5eQc
19+
z9vW5+RfiCSzs5bGG7qw58dMFROeAJbwR6t2o6GRd0HfgTTwSDcrrpcdLP/PaL+v
20+
twnrNa9r7rIwXnDWxYo3KiGpqEfG2WwW+lJsUzZOi9eI9kYPyvFmNFLugZbHMi+h
21+
ICCb8AQB2thON5X4N7FtP5GVfMR9vIkCAwEAAaNTMFEwHQYDVR0OBBYEFDEy866N
22+
WPHPTJKeL/96VYoczkINMB8GA1UdIwQYMBaAFDEy866NWPHPTJKeL/96VYoczkIN
23+
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAHJgyS6/OyRqzqwd
24+
+6DnntGV+MTo9WBNvNs/fekJghnrr85oG330GasYENQLi0wF20to7FMan2U9kwgV
25+
cbhDwe70JD0jg8htYof/uXOMBVWT4iZ+eXn60mP3iLsSutwt/drXBBzbxMYbUC12
26+
CIiadkV8aMPIN6oGnF7TLF4AvBqYYp2qAVGXr/ZQm3L7NPB0jkSktSe6obnaq1tO
27+
ug18ImhzAqkn1UGnLRiTADOba5HuKtovwWtLblNBODdnv1E7IK1A6jpqwiYjlbU5
28+
4v9ZzFzEJw+GqYHkTRmJGCA2Uw7HNEUFeno1BTp19Ce9fvrkofTWYmLp/NAvEp6E
29+
aFnBdCjY4tWzI2Iig7IjDIM7F6igGODybeN9ijD7oSyEDtNE7ECLSuXhgekiQJ8c
30+
NYALgbbNPxWx8zJcNiYy1NDYdIjO5vYFOpbn+rQObKVCX/X+Al9fT126ciTT1xAF
31+
fZtkGPpp3Wjgws9UDSzetvWHYt0Rs70m351LFPHyR4tQLHoDFqnA2buG/mSvKZ9U
32+
to0JQ/8QPRIYv0FUJcF0+/xQRYrIqvmjiCpfL2hwJyRViq7f8z0/tmMoLxFlPo/k
33+
GC+gvh3WwTB622h9JEqS48lllcYZIQWOX2mbFtUtNFdzUtSRmZMa8RmcYr5So2OH
34+
9QLIIjC6ntPFjWq+uLJAJ8uazRt7
35+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)