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);
}
|