void test_aes_generate(void) { MegaAesKey *pk, *mk, *k1, *k2; // create and verify key from password pk = mega_aes_key_new_from_password(PASSWORD); g_assert(mega_aes_key_is_loaded(pk)); g_assert_cmpstr(PASSWORD_KEY, ==, mega_aes_key_get_ubase64(pk)); // create master key from encrypted UBase64, and verify against decrypted mk = mega_aes_key_new_from_enc_ubase64(ENC_MASTER_KEY, pk); g_assert(mega_aes_key_is_loaded(mk)); g_assert_cmpstr(DEC_MASTER_KEY, ==, mega_aes_key_get_ubase64(mk)); g_assert_cmpstr(ENC_MASTER_KEY, ==, mega_aes_key_get_enc_ubase64(mk, pk)); g_object_unref(mk); g_object_unref(pk); // create random keys and compare k1 = mega_aes_key_new_generated(); k2 = mega_aes_key_new_generated(); g_assert(mega_aes_key_is_loaded(k1)); g_assert(mega_aes_key_is_loaded(k2)); g_assert_cmpstr(mega_aes_key_get_ubase64(k1), !=, mega_aes_key_get_ubase64(k2)); g_object_unref(k1); g_object_unref(k2); // check if long passwords work pk = mega_aes_key_new_from_password(PASSWORD_BUG); g_assert(mega_aes_key_is_loaded(pk)); }
void test_aes_construction(void) { MegaAesKey *k, *ek; // VALID USES: // create empty key, check that it is not laoded k = mega_aes_key_new(); g_assert(MEGA_IS_AES_KEY(k)); g_assert(!mega_aes_key_is_loaded(k)); g_object_unref(k); // create key from UBase64 k = mega_aes_key_new_from_ubase64(KEY_UBASE64); g_assert(MEGA_IS_AES_KEY(k)); g_assert(mega_aes_key_is_loaded(k)); g_assert_cmpstr(KEY_UBASE64, ==, mega_aes_key_get_ubase64(k)); g_object_unref(k); // create key from Binary data (use as dec_key below) ek = mega_aes_key_new_from_binary(KEY_BINARY); g_assert(MEGA_IS_AES_KEY(ek)); g_assert(mega_aes_key_is_loaded(ek)); g_assert(memcmp(KEY_BINARY, mega_aes_key_get_binary(ek), 16) == 0); g_assert_cmpstr(KEY_UBASE64, ==, mega_aes_key_get_ubase64(ek)); // create key from encrypted UBase64 k = mega_aes_key_new_from_enc_ubase64(KEY_UBASE64, ek); g_assert(MEGA_IS_AES_KEY(k)); g_assert(mega_aes_key_is_loaded(k)); g_assert_cmpstr(KEY_UBASE64, ==, mega_aes_key_get_enc_ubase64(k, ek)); g_object_unref(k); // create key from encrypted Binary data k = mega_aes_key_new_from_enc_binary(KEY_BINARY, ek); g_assert(MEGA_IS_AES_KEY(k)); g_assert(mega_aes_key_is_loaded(k)); g_assert(memcmp(KEY_BINARY, mega_aes_key_get_enc_binary(k, ek), 16) == 0); g_object_unref(k); g_object_unref(ek); // INVALID USES k = mega_aes_key_new_from_ubase64(KEY_LONG); g_assert(MEGA_IS_AES_KEY(k)); g_assert(!mega_aes_key_is_loaded(k)); g_object_unref(k); k = mega_aes_key_new_from_ubase64(KEY_SHORT); g_assert(MEGA_IS_AES_KEY(k)); g_assert(!mega_aes_key_is_loaded(k)); g_object_unref(k); k = mega_aes_key_new_from_ubase64(KEY_INVALID); g_assert(MEGA_IS_AES_KEY(k)); g_assert(!mega_aes_key_is_loaded(k)); g_object_unref(k); k = mega_aes_key_new_from_ubase64(KEY_NULL); g_assert(MEGA_IS_AES_KEY(k)); g_assert(!mega_aes_key_is_loaded(k)); g_object_unref(k); g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "*data != NULL*"); k = mega_aes_key_new_from_ubase64(NULL); g_test_assert_expected_messages(); g_assert(MEGA_IS_AES_KEY(k)); g_assert(!mega_aes_key_is_loaded(k)); g_object_unref(k); }
/** * mega_filesystem_load: * @filesystem: a #MegaFilesystem * @error: Error. * * Load data into the filesystem from the session. * * Returns: TRUE on success. */ gboolean mega_filesystem_load(MegaFilesystem* filesystem, GError** error) { MegaFilesystemPrivate* priv; MegaAesKey* master_key; GError* local_err = NULL; gchar* f_node; GList* list = NULL; MegaSession* session = NULL; g_return_val_if_fail(MEGA_IS_FILESYSTEM(filesystem), FALSE); g_return_val_if_fail(error == NULL || *error == NULL, FALSE); priv = filesystem->priv; session = mega_filesystem_get_session(filesystem); master_key = mega_session_get_master_key(session); if (!session || !master_key) { g_clear_object(&session); return FALSE; } f_node = mega_api_call_simple(mega_session_get_api(session), 'o', &local_err, "{a:f, c:1}"); if (!f_node) { g_propagate_error(error, local_err); g_clear_object(&session); return FALSE; } // process 'ok' array const gchar* ok_array = s_json_path(f_node, ".ok!a"); if (ok_array) { S_JSON_FOREACH_ELEMENT(ok_array, ok) if (s_json_get_type(ok) != S_JSON_TYPE_OBJECT) continue; gchar* h = s_json_get_member_string(ok, "h"); // h.8 gchar* ha = s_json_get_member_string(ok, "ha"); // b64(aes(h.8 h.8, master_key)) gchar* k = s_json_get_member_string(ok, "k"); // b64(aes(share_key_for_h, master_key)) if (h && ha && k) { if (handle_auth(h, ha, master_key)) { MegaAesKey* key = mega_aes_key_new_from_enc_ubase64(k, master_key); mega_filesystem_add_share_key(filesystem, h, key); g_object_unref(key); } else g_printerr("WARNING: Skipping import of a key %s because its authentication failed\n", h); } else g_printerr("WARNING: Skipping import of a key %s because it is missing required attributes\n", h); g_free(h); g_free(ha); g_free(k); S_JSON_FOREACH_END() } // process 'f' array const gchar* f_array = s_json_path(f_node, ".f!a"); if (f_array) { S_JSON_FOREACH_ELEMENT(f_array, f) if (s_json_get_type(f) != S_JSON_TYPE_OBJECT) continue; MegaNode* node = mega_node_new(filesystem); if (mega_node_load(node, f, &local_err)) list = g_list_prepend(list, node); else { g_printerr("WARNING: Skipping import of node: %s\n", local_err ? local_err->message : "unknown reason"); g_clear_error(&local_err); g_object_unref(node); } S_JSON_FOREACH_END() } // import special root node for contacts list = g_list_prepend(list, mega_node_new_contacts(filesystem)); // process 'u' array const gchar* u_array = s_json_path(f_node, ".u!a"); if (u_array) { S_JSON_FOREACH_ELEMENT(u_array, u) if (s_json_get_type(u) != S_JSON_TYPE_OBJECT) continue; // skip self and removed gint64 c = s_json_get_member_int(u, "c", 0); if (c != 1) continue; MegaNode* node = mega_node_new(filesystem); if (mega_node_load_user(node, u, &local_err)) list = g_list_prepend(list, node); else { g_printerr("WARNING: Skipping import of node: %s\n", local_err ? local_err->message : "unknown reason"); g_clear_error(&local_err); g_object_unref(node); } S_JSON_FOREACH_END() } g_free(f_node); g_list_free_full(priv->nodes, (GDestroyNotify)g_object_unref); priv->nodes = g_list_reverse(list); update_maps(filesystem); priv->last_refresh = time(NULL); g_clear_object(&session); return TRUE; }