END_TEST START_TEST(test_util_base16_decode) { gsize sz = 0; guchar *out = purple_base16_decode("21646c726f77202c6f6c6c656800", &sz); fail_unless(sz == 14, NULL); fail_unless(strcmp("!dlrow ,olleh", out) == 0, NULL); g_free(out); }
qq_im_format *qq_im_fmt_new_by_purple(const gchar *msg) { qq_im_format *fmt; const gchar *start, *end, *last; GData *attribs; gchar *tmp; unsigned char *rgb; g_return_val_if_fail(msg != NULL, NULL); fmt = qq_im_fmt_new(); last = msg; while (purple_markup_find_tag("font", last, &start, &end, &attribs)) { tmp = g_datalist_get_data(&attribs, "face"); if (tmp && strlen(tmp) > 0) { if (fmt->font) g_free(fmt->font); fmt->font_len = strlen(tmp); fmt->font = g_strdup(tmp); } tmp = g_datalist_get_data(&attribs, "size"); if (tmp) { fmt->attr = atoi(tmp) * 3 + 1; fmt->attr &= 0x0f; } tmp = g_datalist_get_data(&attribs, "color"); if (tmp && strlen(tmp) > 1) { rgb = purple_base16_decode(tmp + 1, NULL); g_memmove(fmt->rgb, rgb, 3); g_free(rgb); } g_datalist_clear(&attribs); last = end + 1; } if (purple_markup_find_tag("b", msg, &start, &end, &attribs)) { fmt->attr |= 0x20; g_datalist_clear(&attribs); } if (purple_markup_find_tag("i", msg, &start, &end, &attribs)) { fmt->attr |= 0x40; g_datalist_clear(&attribs); } if (purple_markup_find_tag("u", msg, &start, &end, &attribs)) { fmt->attr |= 0x80; g_datalist_clear(&attribs); } return fmt; }
static void cipher_test_aes(void) { PurpleCipher *cipher; int i = 0; gboolean fail = FALSE; purple_debug_info("cipher-test", "Running AES tests\n"); cipher = purple_aes_cipher_new(); if (cipher == NULL) { purple_debug_error("cipher-test", "AES cipher not found\n"); fail = TRUE; } while (!fail && aes_tests[i].cipher) { aes_test *test = &aes_tests[i]; gsize key_size; guchar *key; guchar cipher_s[1024], decipher_s[1024]; ssize_t cipher_len, decipher_len; gchar *cipher_b16, *deciphered; purple_debug_info("cipher-test", "Test %02d:\n", i); purple_debug_info("cipher-test", "\tTesting '%s' (%" G_GSIZE_FORMAT "bit) \n", test->plaintext ? test->plaintext : "(null)", strlen(test->key) * 8 / 2); i++; purple_cipher_reset(cipher); if (test->iv) { gsize iv_size; guchar *iv = purple_base16_decode(test->iv, &iv_size); g_assert(iv != NULL); purple_cipher_set_iv(cipher, iv, iv_size); g_free(iv); } key = purple_base16_decode(test->key, &key_size); g_assert(key != NULL); purple_cipher_set_key(cipher, key, key_size); g_free(key); if (purple_cipher_get_key_size(cipher) != key_size) { purple_debug_info("cipher-test", "\tinvalid key size\n"); fail = TRUE; continue; } cipher_len = purple_cipher_encrypt(cipher, (const guchar*)(test->plaintext ? test->plaintext : ""), test->plaintext ? (strlen(test->plaintext) + 1) : 0, cipher_s, sizeof(cipher_s)); if (cipher_len < 0) { purple_debug_info("cipher-test", "\tencryption failed\n"); fail = TRUE; continue; } cipher_b16 = purple_base16_encode(cipher_s, cipher_len); purple_debug_info("cipher-test", "\tGot: %s\n", cipher_b16); purple_debug_info("cipher-test", "\tWanted: %s\n", test->cipher); if (g_strcmp0(cipher_b16, test->cipher) != 0) { purple_debug_info("cipher-test", "\tencrypted data doesn't match\n"); g_free(cipher_b16); fail = TRUE; continue; } g_free(cipher_b16); decipher_len = purple_cipher_decrypt(cipher, cipher_s, cipher_len, decipher_s, sizeof(decipher_s)); if (decipher_len < 0) { purple_debug_info("cipher-test", "\tdecryption failed\n"); fail = TRUE; continue; } deciphered = (decipher_len > 0) ? (gchar*)decipher_s : NULL; if (g_strcmp0(deciphered, test->plaintext) != 0) { purple_debug_info("cipher-test", "\tdecrypted data doesn't match\n"); fail = TRUE; continue; } purple_debug_info("cipher-test", "\tTest OK\n"); } if (cipher != NULL) g_object_unref(cipher); if (fail) purple_debug_info("cipher-test", "AES tests FAILED\n\n"); else purple_debug_info("cipher-test", "AES tests completed successfully\n\n"); }