1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.quic;
17
18 import io.netty.util.internal.PlatformDependent;
19 import org.jetbrains.annotations.Nullable;
20
21 final class BoringSSLSessionTicketCallback {
22
23
24 private volatile byte[][] sessionKeys;
25
26
27 byte @Nullable [] findSessionTicket(byte @Nullable [] keyname) {
28 byte[][] keys = this.sessionKeys;
29 if (keys == null || keys.length == 0) {
30 return null;
31 }
32 if (keyname == null) {
33 return keys[0];
34 }
35
36 for (int i = 0; i < keys.length; i++) {
37 byte[] key = keys[i];
38 if (PlatformDependent.equals(keyname, 0, key, 1, keyname.length)) {
39 return key;
40 }
41 }
42 return null;
43 }
44
45 void setSessionTicketKeys(SslSessionTicketKey @Nullable [] keys) {
46 if (keys != null && keys.length != 0) {
47 byte[][] sessionKeys = new byte[keys.length][];
48 for (int i = 0; i < keys.length; ++i) {
49 SslSessionTicketKey key = keys[i];
50 byte[] binaryKey = new byte[49];
51
52 binaryKey[0] = i == 0 ? (byte) 1 : (byte) 0;
53 int dstCurPos = 1;
54 System.arraycopy(key.name, 0, binaryKey, dstCurPos, 16);
55 dstCurPos += 16;
56 System.arraycopy(key.hmacKey, 0, binaryKey, dstCurPos, 16);
57 dstCurPos += 16;
58 System.arraycopy(key.aesKey, 0, binaryKey, dstCurPos, 16);
59 sessionKeys[i] = binaryKey;
60 }
61 this.sessionKeys = sessionKeys;
62 } else {
63 sessionKeys = null;
64 }
65 }
66 }