-
Notifications
You must be signed in to change notification settings - Fork 96
/
Copy pathtest-mongocrypt-local-kms.c
78 lines (68 loc) · 3.29 KB
/
test-mongocrypt-local-kms.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
* Copyright 2019-present MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "test-mongocrypt.h"
static void _test_local_roundtrip(_mongocrypt_tester_t *tester) {
mongocrypt_t *crypt;
mongocrypt_ctx_t *ctx;
mongocrypt_binary_t *bin;
_mongocrypt_buffer_t encrypted_cmd;
bson_t as_bson;
bson_iter_t iter;
bin = mongocrypt_binary_new();
crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
ctx = mongocrypt_ctx_new(crypt);
/* Encrypt a document. */
ASSERT_OK(mongocrypt_ctx_encrypt_init(ctx, "test", -1, TEST_FILE("./test/example/cmd.json")), ctx);
_mongocrypt_tester_run_ctx_to(tester, ctx, MONGOCRYPT_CTX_NEED_MONGO_KEYS);
ASSERT_OK(mongocrypt_ctx_mongo_feed(ctx, TEST_FILE("./test/data/key-document-local.json")), ctx);
ASSERT_OK(mongocrypt_ctx_mongo_done(ctx), ctx);
/* Because this is local, we skip NEED_KMS and go right to READY. */
BSON_ASSERT(mongocrypt_ctx_state(ctx) == MONGOCRYPT_CTX_READY);
ASSERT_OK(mongocrypt_ctx_finalize(ctx, bin), ctx);
BSON_ASSERT(_mongocrypt_binary_to_bson(bin, &as_bson));
/* Keep a copy to decrypt later. */
_mongocrypt_buffer_copy_from_binary(&encrypted_cmd, bin);
CRYPT_TRACEF(&crypt->log, "encrypted doc: %s", tmp_json(&as_bson));
bson_iter_init(&iter, &as_bson);
bson_iter_find_descendant(&iter, "filter.ssn", &iter);
BSON_ASSERT(BSON_ITER_HOLDS_BINARY(&iter));
mongocrypt_ctx_destroy(ctx);
mongocrypt_destroy(crypt); /* destroy because of caching. */
/* Decrypt it back. */
crypt = _mongocrypt_tester_mongocrypt(TESTER_MONGOCRYPT_DEFAULT);
ctx = mongocrypt_ctx_new(crypt);
_mongocrypt_buffer_to_binary(&encrypted_cmd, bin);
ASSERT_OK(mongocrypt_ctx_decrypt_init(ctx, bin), ctx);
_mongocrypt_tester_run_ctx_to(tester, ctx, MONGOCRYPT_CTX_NEED_MONGO_KEYS);
ASSERT_OK(mongocrypt_ctx_mongo_feed(ctx, TEST_FILE("./test/data/key-document-local.json")), ctx);
ASSERT_OK(mongocrypt_ctx_mongo_done(ctx), ctx);
/* Because this is local, we skip NEED_KMS and go right to READY. */
BSON_ASSERT(mongocrypt_ctx_state(ctx) == MONGOCRYPT_CTX_READY);
ASSERT_OK(mongocrypt_ctx_finalize(ctx, bin), ctx);
BSON_ASSERT(_mongocrypt_binary_to_bson(bin, &as_bson));
CRYPT_TRACEF(&crypt->log, "decrypted doc: %s", tmp_json(&as_bson));
bson_iter_init(&iter, &as_bson);
bson_iter_find_descendant(&iter, "filter.ssn", &iter);
BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter));
BSON_ASSERT(0 == strcmp(bson_iter_utf8(&iter, NULL), _mongocrypt_tester_plaintext(tester)));
mongocrypt_binary_destroy(bin);
_mongocrypt_buffer_cleanup(&encrypted_cmd);
mongocrypt_ctx_destroy(ctx);
mongocrypt_destroy(crypt);
}
void _mongocrypt_tester_install_local_kms(_mongocrypt_tester_t *tester) {
INSTALL_TEST(_test_local_roundtrip);
}