Example #1
0
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));
}
Example #2
0
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);
}
Example #3
0
/**
 * 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;
}