Skip to content

Commit 34f7fa4

Browse files
authored
MONGOCRYPT-540 Define QE v2 token types and implement token derivation (#578)
1 parent 73302cd commit 34f7fa4

File tree

3 files changed

+50
-6
lines changed

3 files changed

+50
-6
lines changed

src/mc-tokens-private.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,19 @@
2929
* Integers are represented as uint64_t in little-endian.
3030
*
3131
* CollectionsLevel1Token = HMAC(RootKey, 1)
32+
* ServerTokenDerivationLevel1Token = HMAC(RootKey, 2) <- new in v2
3233
* ServerDataEncryptionLevel1Token = HMAC(RootKey, 3)
3334
*
3435
* EDCToken = HMAC(CollectionsLevel1Token, 1)
3536
* ESCToken = HMAC(CollectionsLevel1Token, 2)
36-
* ECCToken = HMAC(CollectionsLevel1Token, 3)
37+
* ECCToken = HMAC(CollectionsLevel1Token, 3) <- deprecated in v2
3738
* ECOCToken = HMAC(CollectionsLevel1Token, 4)
3839
*
3940
* EDCDerivedFromDataToken = HMAC(EDCToken, v)
4041
* ESCDerivedFromDataToken = HMAC(ESCToken, v)
41-
* ECCDerivedFromDataToken = HMAC(ECCToken, v)
42+
* ECCDerivedFromDataToken = HMAC(ECCToken, v) <- deprecated in v2
43+
* ServerDerivedFromDataToken = HMAC(ServerTokenDerivationLevel1Token, v) <- new
44+
* in v2
4245
*
4346
* EDCDerivedFromDataTokenAndCounter = HMAC(EDCDerivedFromDataToken, u)
4447
* ESCDerivedFromDataTokenAndCounter = HMAC(ESCDerivedFromDataToken, u)
@@ -80,6 +83,8 @@
8083
mongocrypt_status_t * status)
8184

8285
DECL_TOKEN_TYPE (mc_CollectionsLevel1Token, const _mongocrypt_buffer_t *);
86+
DECL_TOKEN_TYPE (mc_ServerTokenDerivationLevel1Token,
87+
const _mongocrypt_buffer_t *);
8388
DECL_TOKEN_TYPE (mc_ServerDataEncryptionLevel1Token,
8489
const _mongocrypt_buffer_t *);
8590
DECL_TOKEN_TYPE (mc_EDCToken,
@@ -93,15 +98,16 @@ DECL_TOKEN_TYPE (mc_ECOCToken,
9398
DECL_TOKEN_TYPE (mc_EDCDerivedFromDataToken,
9499
const mc_EDCToken_t *EDCToken,
95100
const _mongocrypt_buffer_t *v);
96-
DECL_TOKEN_TYPE (mc_ECCDerivedFromDatatoken,
101+
DECL_TOKEN_TYPE (mc_ECCDerivedFromDataToken,
97102
const mc_ECCToken_t *ECCToken,
98103
const _mongocrypt_buffer_t *v);
99104
DECL_TOKEN_TYPE (mc_ESCDerivedFromDataToken,
100105
const mc_ESCToken_t *ESCToken,
101106
const _mongocrypt_buffer_t *v);
102-
DECL_TOKEN_TYPE (mc_ECCDerivedFromDataToken,
103-
const mc_ECCToken_t *ECCToken,
104-
const _mongocrypt_buffer_t *v);
107+
DECL_TOKEN_TYPE (
108+
mc_ServerDerivedFromDataToken,
109+
const mc_ServerTokenDerivationLevel1Token_t *ServerTokenDerivationToken,
110+
const _mongocrypt_buffer_t *v);
105111
DECL_TOKEN_TYPE (mc_EDCDerivedFromDataTokenAndCounter,
106112
const mc_EDCDerivedFromDataToken_t *EDCDerivedFromDataToken,
107113
uint64_t u);

src/mc-tokens.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@
8686
DEF_TOKEN_TYPE (mc_CollectionsLevel1Token, const _mongocrypt_buffer_t *RootKey)
8787
IMPL_TOKEN_NEW_CONST (mc_CollectionsLevel1Token, RootKey, 1)
8888

89+
DEF_TOKEN_TYPE (mc_ServerTokenDerivationLevel1Token,
90+
const _mongocrypt_buffer_t *RootKey)
91+
IMPL_TOKEN_NEW_CONST (mc_ServerTokenDerivationLevel1Token, RootKey, 2)
92+
8993
DEF_TOKEN_TYPE (mc_ServerDataEncryptionLevel1Token,
9094
const _mongocrypt_buffer_t *RootKey)
9195
IMPL_TOKEN_NEW_CONST (mc_ServerDataEncryptionLevel1Token, RootKey, 3)
@@ -129,6 +133,15 @@ DEF_TOKEN_TYPE (mc_ECCDerivedFromDataToken,
129133
const _mongocrypt_buffer_t *v)
130134
IMPL_TOKEN_NEW (mc_ECCDerivedFromDataToken, mc_ECCToken_get (ECCToken), v)
131135

136+
DEF_TOKEN_TYPE (
137+
mc_ServerDerivedFromDataToken,
138+
const mc_ServerTokenDerivationLevel1Token_t *ServerTokenDerivationToken,
139+
const _mongocrypt_buffer_t *v)
140+
IMPL_TOKEN_NEW (
141+
mc_ServerDerivedFromDataToken,
142+
mc_ServerTokenDerivationLevel1Token_get (ServerTokenDerivationToken),
143+
v)
144+
132145
DEF_TOKEN_TYPE (mc_EDCDerivedFromDataTokenAndCounter,
133146
const mc_EDCDerivedFromDataToken_t *EDCDerivedFromDataToken,
134147
uint64_t u)

test/test-mc-tokens.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ _test_mc_tokens (_mongocrypt_tester_t *tester)
5454
*mc_ServerDataEncryptionLevel1Token_get (ServerDataEncryptionLevel1Token),
5555
expected);
5656

57+
mc_ServerTokenDerivationLevel1Token_t *ServerTokenDerivationLevel1Token =
58+
mc_ServerTokenDerivationLevel1Token_new (crypt->crypto, &RootKey, status);
59+
ASSERT_OR_PRINT (ServerTokenDerivationLevel1Token, status);
60+
_mongocrypt_buffer_cleanup (&expected);
61+
_mongocrypt_buffer_copy_from_hex (
62+
&expected,
63+
"1adc114b462741e6ac9f52eacf3dcb8cbca19827693c571d9418fda570c29d82");
64+
ASSERT_CMPBUF (*mc_ServerTokenDerivationLevel1Token_get (
65+
ServerTokenDerivationLevel1Token),
66+
expected);
67+
5768
mc_EDCToken_t *EDCToken =
5869
mc_EDCToken_new (crypt->crypto, CollectionsLevel1Token, status);
5970
ASSERT_OR_PRINT (EDCToken, status);
@@ -120,6 +131,18 @@ _test_mc_tokens (_mongocrypt_tester_t *tester)
120131
ASSERT_CMPBUF (*mc_ECCDerivedFromDataToken_get (ECCDerivedFromDataToken),
121132
expected);
122133

134+
mc_ServerDerivedFromDataToken_t *ServerDerivedFromDataToken =
135+
mc_ServerDerivedFromDataToken_new (
136+
crypt->crypto, ServerTokenDerivationLevel1Token, &v, status);
137+
ASSERT_OR_PRINT (ServerDerivedFromDataToken, status);
138+
_mongocrypt_buffer_cleanup (&expected);
139+
_mongocrypt_buffer_copy_from_hex (
140+
&expected,
141+
"4a671dbf25d68b6c040a077dabb4e63869e03f4d466803609233b16356ec6d66");
142+
ASSERT_CMPBUF (
143+
*mc_ServerDerivedFromDataToken_get (ServerDerivedFromDataToken),
144+
expected);
145+
123146
mc_EDCDerivedFromDataTokenAndCounter_t *EDCDerivedFromDataTokenAndCounter =
124147
mc_EDCDerivedFromDataTokenAndCounter_new (
125148
crypt->crypto, EDCDerivedFromDataToken, u, status);
@@ -170,6 +193,8 @@ _test_mc_tokens (_mongocrypt_tester_t *tester)
170193
mc_ECCToken_destroy (ECCToken);
171194
mc_ESCToken_destroy (ESCToken);
172195
mc_EDCToken_destroy (EDCToken);
196+
mc_ServerTokenDerivationLevel1Token_destroy (
197+
ServerTokenDerivationLevel1Token);
173198
mc_ServerDataEncryptionLevel1Token_destroy (ServerDataEncryptionLevel1Token);
174199
mc_CollectionsLevel1Token_destroy (CollectionsLevel1Token);
175200
_mongocrypt_buffer_cleanup (&v);

0 commit comments

Comments
 (0)