ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-key.c in libmongocrypt-helper-1.7.4.0.1002 vs ext/libmongocrypt/libmongocrypt/test/test-mongocrypt-key.c in libmongocrypt-helper-1.8.0.0.1001

- old
+ new

@@ -18,265 +18,217 @@ #include "bson/bson.h" #include "test-mongocrypt.h" /* Create a basis key document, but exclude some fields. */ -static void -_recreate_excluding (_mongocrypt_tester_t *tester, bson_t *out, va_list args) -{ - bson_t tmp; +static void _recreate_excluding(_mongocrypt_tester_t *tester, bson_t *out, va_list args) { + bson_t tmp; - BSON_ASSERT (_mongocrypt_binary_to_bson ( - TEST_FILE ("./test/data/key-document-full.json"), &tmp)); + BSON_ASSERT(_mongocrypt_binary_to_bson(TEST_FILE("./test/data/key-document-full.json"), &tmp)); - /* copy to out */ - bson_destroy (out); - bson_init (out); - bson_copy_to_excluding_noinit_va (&tmp, out, "", args); + /* copy to out */ + bson_destroy(out); + bson_init(out); + bson_copy_to_excluding_noinit_va(&tmp, out, "", args); } -static void -_recreate_and_reset (_mongocrypt_tester_t *tester, - bson_t *key_bson, - mongocrypt_status_t *status, - ...) -{ - va_list args; +static void _recreate_and_reset(_mongocrypt_tester_t *tester, bson_t *key_bson, mongocrypt_status_t *status, ...) { + va_list args; - va_start (args, status); - _recreate_excluding (tester, key_bson, args); - va_end (args); - _mongocrypt_status_reset (status); + va_start(args, status); + _recreate_excluding(tester, key_bson, args); + va_end(args); + _mongocrypt_status_reset(status); } - -static void -_parse_ok (bson_t *key_bson, mongocrypt_status_t *status) -{ - _mongocrypt_key_doc_t *key_doc = _mongocrypt_key_new (); - ASSERT_OK_STATUS (_mongocrypt_key_parse_owned (key_bson, key_doc, status), - status); - _mongocrypt_key_destroy (key_doc); +static void _parse_ok(bson_t *key_bson, mongocrypt_status_t *status) { + _mongocrypt_key_doc_t *key_doc = _mongocrypt_key_new(); + ASSERT_OK_STATUS(_mongocrypt_key_parse_owned(key_bson, key_doc, status), status); + _mongocrypt_key_destroy(key_doc); } +static void _parse_fails(bson_t *key_bson, mongocrypt_status_t *status, const char *msg) { + _mongocrypt_key_doc_t *key_doc = _mongocrypt_key_new(); -static void -_parse_fails (bson_t *key_bson, mongocrypt_status_t *status, const char *msg) -{ - _mongocrypt_key_doc_t *key_doc = _mongocrypt_key_new (); - - ASSERT_FAILS_STATUS ( - _mongocrypt_key_parse_owned (key_bson, key_doc, status), status, msg); - _mongocrypt_key_destroy (key_doc); + ASSERT_FAILS_STATUS(_mongocrypt_key_parse_owned(key_bson, key_doc, status), status, msg); + _mongocrypt_key_destroy(key_doc); } +static void test_mongocrypt_key_parsing(_mongocrypt_tester_t *tester) { + bson_t key_bson = BSON_INITIALIZER; + mongocrypt_status_t *status; + mongocrypt_binary_t *uuid; -static void -test_mongocrypt_key_parsing (_mongocrypt_tester_t *tester) -{ - bson_t key_bson = BSON_INITIALIZER; - mongocrypt_status_t *status; - mongocrypt_binary_t *uuid; + uuid = TEST_BIN(16); + status = mongocrypt_status_new(); - uuid = TEST_BIN (16); - status = mongocrypt_status_new (); + /* successful case. */ + _recreate_and_reset(tester, &key_bson, status, NULL); + _parse_ok(&key_bson, status); - /* successful case. */ - _recreate_and_reset (tester, &key_bson, status, NULL); - _parse_ok (&key_bson, status); + /* unrecognized fields */ + _recreate_and_reset(tester, &key_bson, status, NULL); + BSON_APPEND_INT32(&key_bson, "invalid", 123); + _parse_fails(&key_bson, status, "unrecognized field 'invalid'"); - /* unrecognized fields */ - _recreate_and_reset (tester, &key_bson, status, NULL); - BSON_APPEND_INT32 (&key_bson, "invalid", 123); - _parse_fails (&key_bson, status, "unrecognized field 'invalid'"); + /* malformed BSON */ + _recreate_and_reset(tester, &key_bson, status, NULL); + /* mess with the length to corrupt the BSON. */ + ((uint8_t *)bson_get_data(&key_bson))[4] = 0xFF; + _parse_fails(&key_bson, status, "invalid BSON"); - /* malformed BSON */ - _recreate_and_reset (tester, &key_bson, status, NULL); - /* mess with the length to corrupt the BSON. */ - ((uint8_t *) bson_get_data (&key_bson))[4] = 0xFF; - _parse_fails (&key_bson, status, "invalid BSON"); + /* _id: missing. */ + _recreate_and_reset(tester, &key_bson, status, "_id", NULL); + _parse_fails(&key_bson, status, "invalid key, no '_id'"); + /* _id: wrong type. */ + _recreate_and_reset(tester, &key_bson, status, "_id", NULL); + BSON_APPEND_INT32(&key_bson, "_id", 123); + _parse_fails(&key_bson, status, "invalid key, '_id' is not a UUID"); + /* _id: invalid binary subtype. */ + _recreate_and_reset(tester, &key_bson, status, "_id", NULL); + BSON_APPEND_BINARY(&key_bson, "_id", BSON_SUBTYPE_BINARY, uuid->data, uuid->len); + _parse_fails(&key_bson, status, "invalid key, '_id' is not a UUID"); + /* _id: invalid UUID length. */ + _recreate_and_reset(tester, &key_bson, status, "_id", NULL); + BSON_APPEND_BINARY(&key_bson, "_id", BSON_SUBTYPE_UUID, uuid->data, 5); + _parse_fails(&key_bson, status, "invalid key, '_id' is not a UUID"); - /* _id: missing. */ - _recreate_and_reset (tester, &key_bson, status, "_id", NULL); - _parse_fails (&key_bson, status, "invalid key, no '_id'"); - /* _id: wrong type. */ - _recreate_and_reset (tester, &key_bson, status, "_id", NULL); - BSON_APPEND_INT32 (&key_bson, "_id", 123); - _parse_fails (&key_bson, status, "invalid key, '_id' is not a UUID"); - /* _id: invalid binary subtype. */ - _recreate_and_reset (tester, &key_bson, status, "_id", NULL); - BSON_APPEND_BINARY ( - &key_bson, "_id", BSON_SUBTYPE_BINARY, uuid->data, uuid->len); - _parse_fails (&key_bson, status, "invalid key, '_id' is not a UUID"); - /* _id: invalid UUID length. */ - _recreate_and_reset (tester, &key_bson, status, "_id", NULL); - BSON_APPEND_BINARY (&key_bson, "_id", BSON_SUBTYPE_UUID, uuid->data, 5); - _parse_fails (&key_bson, status, "invalid key, '_id' is not a UUID"); + /* version: missing (ok) */ + _recreate_and_reset(tester, &key_bson, status, "version", NULL); + _parse_ok(&key_bson, status); + /* version: wrong type */ + _recreate_and_reset(tester, &key_bson, status, "version", NULL); + BSON_APPEND_UTF8(&key_bson, "version", "abc"); + _parse_fails(&key_bson, status, "invalid 'version'"); + /* version: > 0 */ + _recreate_and_reset(tester, &key_bson, status, "version", NULL); + BSON_APPEND_INT32(&key_bson, "version", 1); + _parse_fails(&key_bson, status, "unsupported key document version"); - /* version: missing (ok) */ - _recreate_and_reset (tester, &key_bson, status, "version", NULL); - _parse_ok (&key_bson, status); - /* version: wrong type */ - _recreate_and_reset (tester, &key_bson, status, "version", NULL); - BSON_APPEND_UTF8 (&key_bson, "version", "abc"); - _parse_fails (&key_bson, status, "invalid 'version'"); - /* version: > 0 */ - _recreate_and_reset (tester, &key_bson, status, "version", NULL); - BSON_APPEND_INT32 (&key_bson, "version", 1); - _parse_fails (&key_bson, status, "unsupported key document version"); + /* keyMaterial: missing. */ + _recreate_and_reset(tester, &key_bson, status, "keyMaterial", NULL); + _parse_fails(&key_bson, status, "invalid key, no 'keyMaterial'"); + /* keyMaterial: wrong type. */ + _recreate_and_reset(tester, &key_bson, status, "keyMaterial", NULL); + BSON_APPEND_INT32(&key_bson, "keyMaterial", 1); + _parse_fails(&key_bson, status, "invalid 'keyMaterial', expected binary"); + /* keyMaterial: wrong subtype. */ + _recreate_and_reset(tester, &key_bson, status, "keyMaterial", NULL); + BSON_APPEND_BINARY(&key_bson, "keyMaterial", BSON_SUBTYPE_UUID, uuid->data, uuid->len); + _parse_fails(&key_bson, status, "invalid 'keyMaterial', expected subtype 0"); - /* keyMaterial: missing. */ - _recreate_and_reset (tester, &key_bson, status, "keyMaterial", NULL); - _parse_fails (&key_bson, status, "invalid key, no 'keyMaterial'"); - /* keyMaterial: wrong type. */ - _recreate_and_reset (tester, &key_bson, status, "keyMaterial", NULL); - BSON_APPEND_INT32 (&key_bson, "keyMaterial", 1); - _parse_fails (&key_bson, status, "invalid 'keyMaterial', expected binary"); - /* keyMaterial: wrong subtype. */ - _recreate_and_reset (tester, &key_bson, status, "keyMaterial", NULL); - BSON_APPEND_BINARY ( - &key_bson, "keyMaterial", BSON_SUBTYPE_UUID, uuid->data, uuid->len); - _parse_fails ( - &key_bson, status, "invalid 'keyMaterial', expected subtype 0"); + /* masterKey: missing. */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + _parse_fails(&key_bson, status, "invalid key, no 'masterKey'"); + /* masterKey: missing provider. */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + bson_concat(&key_bson, TMP_BSON("{'masterKey': { }}")); + _parse_fails(&key_bson, status, "expected UTF-8 provider"); + /* masterKey: wrong provider. */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + bson_concat(&key_bson, TMP_BSON("{'masterKey': { 'provider': 'bad' }}")); + _parse_fails(&key_bson, status, "unrecognized KMS provider"); + /* masterKey: provider=aws, missing key */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + bson_concat(&key_bson, TMP_BSON("{'masterKey': { 'provider': 'aws', 'region': 'us-east-1' }}")); + _parse_fails(&key_bson, status, "expected UTF-8 key"); + /* masterKey: provider=aws, missing region */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + bson_concat(&key_bson, TMP_BSON("{'masterKey': { 'provider': 'aws', 'key': 'cmk-string' }}")); + _parse_fails(&key_bson, status, "expected UTF-8 region"); + /* masterKey: provider=aws, bad region */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + bson_concat(&key_bson, + TMP_BSON("{'masterKey': { 'provider': 'aws', " + "'key': 'cmk-string', 'region': 1 }}")); + _parse_fails(&key_bson, status, "expected UTF-8 region"); - /* masterKey: missing. */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - _parse_fails (&key_bson, status, "invalid key, no 'masterKey'"); - /* masterKey: missing provider. */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - bson_concat (&key_bson, TMP_BSON ("{'masterKey': { }}")); - _parse_fails (&key_bson, status, "expected UTF-8 provider"); - /* masterKey: wrong provider. */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - bson_concat (&key_bson, TMP_BSON ("{'masterKey': { 'provider': 'bad' }}")); - _parse_fails (&key_bson, status, "unrecognized KMS provider"); - /* masterKey: provider=aws, missing key */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - bson_concat ( - &key_bson, - TMP_BSON ("{'masterKey': { 'provider': 'aws', 'region': 'us-east-1' }}")); - _parse_fails (&key_bson, status, "expected UTF-8 key"); - /* masterKey: provider=aws, missing region */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - bson_concat ( - &key_bson, - TMP_BSON ("{'masterKey': { 'provider': 'aws', 'key': 'cmk-string' }}")); - _parse_fails (&key_bson, status, "expected UTF-8 region"); - /* masterKey: provider=aws, bad region */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - bson_concat (&key_bson, - TMP_BSON ("{'masterKey': { 'provider': 'aws', " - "'key': 'cmk-string', 'region': 1 }}")); - _parse_fails (&key_bson, status, "expected UTF-8 region"); + /* creationDate: missing */ + _recreate_and_reset(tester, &key_bson, status, "creationDate", NULL); + _parse_fails(&key_bson, status, "invalid key, no 'creationDate'"); + /* creationDate: wrong type */ + _recreate_and_reset(tester, &key_bson, status, "creationDate", NULL); + BSON_APPEND_UTF8(&key_bson, "creationDate", "abc"); + _parse_fails(&key_bson, status, "invalid 'creationDate', expect datetime"); - /* creationDate: missing */ - _recreate_and_reset (tester, &key_bson, status, "creationDate", NULL); - _parse_fails (&key_bson, status, "invalid key, no 'creationDate'"); - /* creationDate: wrong type */ - _recreate_and_reset (tester, &key_bson, status, "creationDate", NULL); - BSON_APPEND_UTF8 (&key_bson, "creationDate", "abc"); - _parse_fails (&key_bson, status, "invalid 'creationDate', expect datetime"); + /* updateDate: missing */ + _recreate_and_reset(tester, &key_bson, status, "updateDate", NULL); + _parse_fails(&key_bson, status, "invalid key, no 'updateDate'"); - /* updateDate: missing */ - _recreate_and_reset (tester, &key_bson, status, "updateDate", NULL); - _parse_fails (&key_bson, status, "invalid key, no 'updateDate'"); + /* updateDate: wrong type */ + _recreate_and_reset(tester, &key_bson, status, "updateDate", NULL); + BSON_APPEND_UTF8(&key_bson, "updateDate", "abc"); + _parse_fails(&key_bson, status, "invalid 'updateDate', expect datetime"); - /* updateDate: wrong type */ - _recreate_and_reset (tester, &key_bson, status, "updateDate", NULL); - BSON_APPEND_UTF8 (&key_bson, "updateDate", "abc"); - _parse_fails (&key_bson, status, "invalid 'updateDate', expect datetime"); + /* status: missing */ + _recreate_and_reset(tester, &key_bson, status, "status", NULL); + _parse_fails(&key_bson, status, "invalid key, no 'status'"); - /* status: missing */ - _recreate_and_reset (tester, &key_bson, status, "status", NULL); - _parse_fails (&key_bson, status, "invalid key, no 'status'"); + /* masterKey: azure */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + bson_concat(&key_bson, + TMP_BSON("{'masterKey': { 'provider': 'azure', 'keyVaultEndpoint': " + "'abc.example.com', 'keyName': 'test', 'keyVersion': 'abc' }}")); + _parse_ok(&key_bson, status); - /* masterKey: azure */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - bson_concat ( - &key_bson, - TMP_BSON ( - "{'masterKey': { 'provider': 'azure', 'keyVaultEndpoint': " - "'abc.example.com', 'keyName': 'test', 'keyVersion': 'abc' }}")); - _parse_ok (&key_bson, status); + /* masterKey: gcp */ + _recreate_and_reset(tester, &key_bson, status, "masterKey", NULL); + bson_concat(&key_bson, + TMP_BSON("{'masterKey': { 'provider': 'gcp', 'endpoint': " + "'abc.example.com', 'projectId': 'project', 'location': " + "'global', 'keyRing': 'ring', 'keyName': 'name' }}")); + _parse_ok(&key_bson, status); - /* masterKey: gcp */ - _recreate_and_reset (tester, &key_bson, status, "masterKey", NULL); - bson_concat ( - &key_bson, - TMP_BSON ("{'masterKey': { 'provider': 'gcp', 'endpoint': " - "'abc.example.com', 'projectId': 'project', 'location': " - "'global', 'keyRing': 'ring', 'keyName': 'name' }}")); - _parse_ok (&key_bson, status); - - mongocrypt_status_destroy (status); - bson_destroy (&key_bson); + mongocrypt_status_destroy(status); + bson_destroy(&key_bson); } -static void -test_mongocrypt_key_alt_name_from_iter (_mongocrypt_tester_t *tester) -{ - mongocrypt_status_t *status; - bson_iter_t iter; - bson_t *test; - _mongocrypt_key_alt_name_t *key_alt_names; +static void test_mongocrypt_key_alt_name_from_iter(_mongocrypt_tester_t *tester) { + mongocrypt_status_t *status; + bson_iter_t iter; + bson_t *test; + _mongocrypt_key_alt_name_t *key_alt_names; - status = mongocrypt_status_new (); + status = mongocrypt_status_new(); - /* Empty alt names */ - test = TMP_BSON ("{'test': []}"); - bson_iter_init_find (&iter, test, "test"); - ASSERT_OK_STATUS ( - _mongocrypt_key_alt_name_from_iter (&iter, &key_alt_names, status), - status); - BSON_ASSERT (NULL == key_alt_names); + /* Empty alt names */ + test = TMP_BSON("{'test': []}"); + bson_iter_init_find(&iter, test, "test"); + ASSERT_OK_STATUS(_mongocrypt_key_alt_name_from_iter(&iter, &key_alt_names, status), status); + BSON_ASSERT(NULL == key_alt_names); - /* One alt name */ - test = TMP_BSON ("{'test': ['a']}"); - bson_iter_init_find (&iter, test, "test"); - ASSERT_OK_STATUS ( - _mongocrypt_key_alt_name_from_iter (&iter, &key_alt_names, status), - status); - BSON_ASSERT ( - 0 == strcmp ("a", _mongocrypt_key_alt_name_get_string (key_alt_names))); - BSON_ASSERT (NULL == key_alt_names->next); - _mongocrypt_key_alt_name_destroy_all (key_alt_names); + /* One alt name */ + test = TMP_BSON("{'test': ['a']}"); + bson_iter_init_find(&iter, test, "test"); + ASSERT_OK_STATUS(_mongocrypt_key_alt_name_from_iter(&iter, &key_alt_names, status), status); + BSON_ASSERT(0 == strcmp("a", _mongocrypt_key_alt_name_get_string(key_alt_names))); + BSON_ASSERT(NULL == key_alt_names->next); + _mongocrypt_key_alt_name_destroy_all(key_alt_names); - /* Two alt names */ - test = TMP_BSON ("{'test': ['a', 'b']}"); - bson_iter_init_find (&iter, test, "test"); - ASSERT_OK_STATUS ( - _mongocrypt_key_alt_name_from_iter (&iter, &key_alt_names, status), - status); - BSON_ASSERT ( - 0 == strcmp ("b", _mongocrypt_key_alt_name_get_string (key_alt_names))); - BSON_ASSERT ( - 0 == - strcmp ("a", _mongocrypt_key_alt_name_get_string (key_alt_names->next))); - BSON_ASSERT (NULL == key_alt_names->next->next); - _mongocrypt_key_alt_name_destroy_all (key_alt_names); + /* Two alt names */ + test = TMP_BSON("{'test': ['a', 'b']}"); + bson_iter_init_find(&iter, test, "test"); + ASSERT_OK_STATUS(_mongocrypt_key_alt_name_from_iter(&iter, &key_alt_names, status), status); + BSON_ASSERT(0 == strcmp("b", _mongocrypt_key_alt_name_get_string(key_alt_names))); + BSON_ASSERT(0 == strcmp("a", _mongocrypt_key_alt_name_get_string(key_alt_names->next))); + BSON_ASSERT(NULL == key_alt_names->next->next); + _mongocrypt_key_alt_name_destroy_all(key_alt_names); - /* Invalid alt names */ - test = TMP_BSON ("{'test': ['a', 1]}"); - bson_iter_init_find (&iter, test, "test"); - ASSERT_FAILS_STATUS ( - _mongocrypt_key_alt_name_from_iter (&iter, &key_alt_names, status), - status, - "unexpected non-UTF8"); + /* Invalid alt names */ + test = TMP_BSON("{'test': ['a', 1]}"); + bson_iter_init_find(&iter, test, "test"); + ASSERT_FAILS_STATUS(_mongocrypt_key_alt_name_from_iter(&iter, &key_alt_names, status), + status, + "unexpected non-UTF8"); - /* Duplicate alt names */ - test = TMP_BSON ("{'test': ['b', 'a', 'c', 'a']}"); - bson_iter_init_find (&iter, test, "test"); - ASSERT_FAILS_STATUS ( - _mongocrypt_key_alt_name_from_iter (&iter, &key_alt_names, status), - status, - "duplicate"); + /* Duplicate alt names */ + test = TMP_BSON("{'test': ['b', 'a', 'c', 'a']}"); + bson_iter_init_find(&iter, test, "test"); + ASSERT_FAILS_STATUS(_mongocrypt_key_alt_name_from_iter(&iter, &key_alt_names, status), status, "duplicate"); - mongocrypt_status_destroy (status); + mongocrypt_status_destroy(status); } - -void -_mongocrypt_tester_install_key (_mongocrypt_tester_t *tester) -{ - INSTALL_TEST (test_mongocrypt_key_parsing); - INSTALL_TEST (test_mongocrypt_key_alt_name_from_iter); +void _mongocrypt_tester_install_key(_mongocrypt_tester_t *tester) { + INSTALL_TEST(test_mongocrypt_key_parsing); + INSTALL_TEST(test_mongocrypt_key_alt_name_from_iter); }