|
5 | 5 | // SSL_MAX_MD_SIZE is size of the largest hash function used in TLS, SHA-384. |
6 | 6 | #define SSL_MAX_MD_SIZE 48 |
7 | 7 |
|
| 8 | +// memory layout from boringssl repo ssl/internal.h |
| 9 | +// struct SSL_HANDSHAKE |
| 10 | +// |
| 11 | +// ── Android ≤ 15 (TLS 1.3 secrets are private raw arrays) ───────────────── |
| 12 | +// uint16_t max_version; // public, 2 bytes @ BSSL__SSL_HANDSHAKE_MAX_VERSION |
| 13 | +// // private (aligned to 8): |
| 14 | +// size_t hash_len_; // 8 bytes |
| 15 | +// uint8_t secret_[48]; // 48 bytes ← SSL_HANDSHAKE_SECRET_ |
| 16 | +// uint8_t early_traffic_secret_[48]; // step = 48 |
| 17 | +// ... |
| 18 | +// |
| 19 | +// ── Android 16+ (TLS 1.3 secrets are public InplaceVector<uint8_t,48>) ──── |
| 20 | +// uint16_t max_version; // public, 2 bytes |
| 21 | +// InplaceVector<uint8_t,48> secret; // ← SSL_HANDSHAKE_SECRET_ |
| 22 | +// InplaceVector<uint8_t,48> early_traffic_secret; // step = 49 |
| 23 | +// ... |
| 24 | +// |
| 25 | +// InplaceVector<uint8_t,N> memory layout (alignof=1, no padding): |
| 26 | +// [0 .. N-1] storage_[N] — actual data bytes (same address as struct base) |
| 27 | +// [N] size_ — uint8_t (equivalent of hash_len_) |
| 28 | +// |
| 29 | +// SSL_SESSION_ST_SSL_VERSION is defined only in android16 kern headers and |
| 30 | +// serves as the version feature-flag here. |
| 31 | +// ──────────────────────────────────────────────────────────────────────────── |
8 | 32 |
|
9 | | -// memory layout from boringssl repo ssl/internal.h line 1720 |
10 | | -// struct of struct SSL_HANDSHAKE |
11 | | -/* |
12 | | - // via boringssl source code src/ssl/internal.h : line 1585 |
13 | | -
|
14 | | - // max_version is the maximum accepted protocol version, taking account both |
15 | | - // |SSL_OP_NO_*| and |SSL_CTX_set_max_proto_version| APIs. |
16 | | - uint16_t max_version = 0; |
17 | | -
|
18 | | - private: |
19 | | - size_t hash_len_ = 0;x |
20 | | - uint8_t secret_[SSL_MAX_MD_SIZE] = {0}; |
21 | | - uint8_t early_traffic_secret_[SSL_MAX_MD_SIZE] = {0}; |
22 | | - uint8_t client_handshake_secret_[SSL_MAX_MD_SIZE] = {0}; |
23 | | - uint8_t server_handshake_secret_[SSL_MAX_MD_SIZE] = {0}; |
24 | | - uint8_t client_traffic_secret_0_[SSL_MAX_MD_SIZE] = {0}; |
25 | | - uint8_t server_traffic_secret_0_[SSL_MAX_MD_SIZE] = {0}; |
26 | | - uint8_t expected_client_finished_[SSL_MAX_MD_SIZE] = {0}; |
27 | | - */ |
28 | | -// In BoringSSL, TLS 1.3 keys are private fields, so direct offsetof |
29 | | -// calculation is not possible. Compute the offset by finding the address |
30 | | -// of the field preceding the private section (max_version at offset 30), |
31 | | -// then the first private field (size_t hash_len_) sits at offset 32 after |
32 | | -// alignment. secret_ is at 32 + sizeof(size_t) = 40, and subsequent |
33 | | -// fields are at SSL_MAX_MD_SIZE increments. |
34 | | - |
35 | | - |
36 | | -// uint16_t max_version = 0; |
37 | | -// sizeof(uint16_t) = 2 |
38 | | -#define SSL_HANDSHAKE_HASH_LEN_ roundup(BSSL__SSL_HANDSHAKE_MAX_VERSION+2,8) |
39 | | - |
40 | | -// ssl_st->s3->hs |
41 | | -// bssl::SSL_HANDSHAKE->secret_ |
42 | | -#define SSL_HANDSHAKE_SECRET_ SSL_HANDSHAKE_HASH_LEN_+8 |
43 | | - |
44 | | -// bssl::SSL_HANDSHAKE->early_traffic_secret_ |
45 | | -#define SSL_HANDSHAKE_EARLY_TRAFFIC_SECRET_ SSL_HANDSHAKE_SECRET_+SSL_MAX_MD_SIZE*1 |
46 | | - |
47 | | -// bssl::SSL_HANDSHAKE->client_handshake_secret_ |
48 | | -#define SSL_HANDSHAKE_CLIENT_HANDSHAKE_SECRET_ SSL_HANDSHAKE_SECRET_+SSL_MAX_MD_SIZE*2 |
49 | | - |
50 | | -// bssl::SSL_HANDSHAKE->server_handshake_secret_ |
51 | | -#define SSL_HANDSHAKE_SERVER_HANDSHAKE_SECRET_ SSL_HANDSHAKE_SECRET_+SSL_MAX_MD_SIZE*3 |
52 | | - |
53 | | -// bssl::SSL_HANDSHAKE->client_traffic_secret_0_ |
54 | | -#define SSL_HANDSHAKE_CLIENT_TRAFFIC_SECRET_0_ SSL_HANDSHAKE_SECRET_+SSL_MAX_MD_SIZE*4 |
55 | | - |
56 | | -// bssl::SSL_HANDSHAKE->server_traffic_secret_0_ |
57 | | -#define SSL_HANDSHAKE_SERVER_TRAFFIC_SECRET_0_ SSL_HANDSHAKE_SECRET_+SSL_MAX_MD_SIZE*5 |
58 | | - |
59 | | -// bssl::SSL_HANDSHAKE->expected_client_finished_ |
60 | | -#define SSL_HANDSHAKE_EXPECTED_CLIENT_FINISHED_ SSL_HANDSHAKE_SECRET_+SSL_MAX_MD_SIZE*6 |
| 33 | +#ifdef SSL_SESSION_ST_SSL_VERSION |
| 34 | +// ── Android 16+: three root values differ from older versions ─────────────── |
| 35 | + |
| 36 | +// secret.storage_ starts right after max_version (alignof InplaceVector = 1, no gap) |
| 37 | +#define SSL_HANDSHAKE_SECRET_ (BSSL__SSL_HANDSHAKE_MAX_VERSION + 2) |
| 38 | + |
| 39 | +// hash_len is now secret.size_: the uint8_t sitting right after secret.storage_[48] |
| 40 | +#define SSL_HANDSHAKE_HASH_LEN_ (SSL_HANDSHAKE_SECRET_ + SSL_MAX_MD_SIZE) |
| 41 | + |
| 42 | +// Each InplaceVector<uint8_t,48> occupies 49 bytes (48 data + 1 size_) |
| 43 | +#define SSL_HANDSHAKE_FIELD_STEP (SSL_MAX_MD_SIZE + 1) |
| 44 | + |
| 45 | +#else |
| 46 | +// ── Android ≤ 15: original layout ─────────────────────────────────────────── |
| 47 | + |
| 48 | +// hash_len_ is a size_t aligned to 8, sitting right after max_version |
| 49 | +#define SSL_HANDSHAKE_HASH_LEN_ roundup(BSSL__SSL_HANDSHAKE_MAX_VERSION + 2, 8) |
| 50 | + |
| 51 | +// secret_ follows hash_len_ (size_t = 8 bytes) |
| 52 | +#define SSL_HANDSHAKE_SECRET_ (SSL_HANDSHAKE_HASH_LEN_ + 8) |
| 53 | + |
| 54 | +// Each raw uint8_t[48] field occupies exactly 48 bytes, no extra size field |
| 55 | +#define SSL_HANDSHAKE_FIELD_STEP SSL_MAX_MD_SIZE |
| 56 | + |
| 57 | +#endif // SSL_SESSION_ST_SSL_VERSION |
| 58 | + |
| 59 | +// ── Downstream offsets: identical formula for all versions ────────────────── |
| 60 | +// All fields are laid out consecutively starting from SSL_HANDSHAKE_SECRET_, |
| 61 | +// each spaced SSL_HANDSHAKE_FIELD_STEP bytes apart. |
| 62 | + |
| 63 | +#define SSL_HANDSHAKE_EARLY_TRAFFIC_SECRET_ (SSL_HANDSHAKE_SECRET_ + SSL_HANDSHAKE_FIELD_STEP * 1) |
| 64 | +#define SSL_HANDSHAKE_CLIENT_HANDSHAKE_SECRET_ (SSL_HANDSHAKE_SECRET_ + SSL_HANDSHAKE_FIELD_STEP * 2) |
| 65 | +#define SSL_HANDSHAKE_SERVER_HANDSHAKE_SECRET_ (SSL_HANDSHAKE_SECRET_ + SSL_HANDSHAKE_FIELD_STEP * 3) |
| 66 | +#define SSL_HANDSHAKE_CLIENT_TRAFFIC_SECRET_0_ (SSL_HANDSHAKE_SECRET_ + SSL_HANDSHAKE_FIELD_STEP * 4) |
| 67 | +#define SSL_HANDSHAKE_SERVER_TRAFFIC_SECRET_0_ (SSL_HANDSHAKE_SECRET_ + SSL_HANDSHAKE_FIELD_STEP * 5) |
| 68 | +#define SSL_HANDSHAKE_EXPECTED_CLIENT_FINISHED_ (SSL_HANDSHAKE_SECRET_ + SSL_HANDSHAKE_FIELD_STEP * 6) |
61 | 69 |
|
62 | 70 | /////////////////////////// END /////////////////////////// |
0 commit comments