Blame egg/test-padding.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/* test-padding.c: Test padding functionality
Packit b00eeb
Packit b00eeb
   Copyright (C) 2007 Stefan Walter
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   see <http://www.gnu.org/licenses/>.
Packit b00eeb
Packit b00eeb
   Author: Stef Walter <stef@memberwebs.com>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-padding.h"
Packit b00eeb
#include "egg/egg-testing.h"
Packit b00eeb
Packit b00eeb
#include <gcrypt.h>
Packit b00eeb
Packit b00eeb
#include <stdlib.h>
Packit b00eeb
#include <stdio.h>
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
check_padding (EggPadding padding, gsize block, gconstpointer input,
Packit b00eeb
               gsize n_input, gconstpointer output, gsize n_output)
Packit b00eeb
{
Packit b00eeb
	gpointer result;
Packit b00eeb
	gsize n_result;
Packit b00eeb
Packit b00eeb
	if (!(padding) (NULL, block, input, n_input, &result, &n_result)) {
Packit b00eeb
		g_assert (output == NULL);
Packit b00eeb
		return;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
	egg_assert_cmpsize (n_output, ==, n_result);
Packit b00eeb
	g_assert (memcmp (output, result, n_output) == 0);
Packit b00eeb
	g_free (result);
Packit b00eeb
Packit b00eeb
	/* Now make sure it can tell us the right length */
Packit b00eeb
	if (!(padding) (NULL, block, input, n_input, NULL, &n_result))
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
Packit b00eeb
	egg_assert_cmpsize (n_output, ==, n_result);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_zero_padding (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x00, 0x00, 0x00, 'T', 'E', 'S', 'T' };
Packit b00eeb
	gchar raw[] = "TEST";
Packit b00eeb
	check_padding (egg_padding_zero_pad, 8, raw, 4, padded, 8);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_zero_padding_no_data (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { };
Packit b00eeb
	gchar raw[] = "";
Packit b00eeb
	check_padding (egg_padding_zero_pad, 8, raw, 0, padded, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs1_one_padding (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x01, 0xFF, 0x00, 'T', 'E', 'S', 'T' };
Packit b00eeb
	gchar raw[] = "TEST";
Packit b00eeb
	check_padding (egg_padding_pkcs1_pad_01, 8, raw, 4, padded, 8);
Packit b00eeb
	check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, raw, 4);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs1_one_padding_no_data (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 };
Packit b00eeb
	gchar raw[] = "";
Packit b00eeb
	check_padding (egg_padding_pkcs1_pad_01, 8, raw, 0, padded, 8);
Packit b00eeb
	check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, raw, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs1_two_padding (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x02, 0x77, 0x66, 0x55, 0x00, 'T', 'E', };
Packit b00eeb
	gchar raw[] = "TE";
Packit b00eeb
	guchar *result;
Packit b00eeb
	gpointer vesult;
Packit b00eeb
	gsize n_result;
Packit b00eeb
Packit b00eeb
	check_padding (egg_padding_pkcs1_unpad_02, 8, padded, 8, raw, 2);
Packit b00eeb
Packit b00eeb
	/* PKCS#1 02 padding is unpredictable */
Packit b00eeb
	if (!egg_padding_pkcs1_pad_02 (NULL, 8, raw, 2, &vesult, &n_result))
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
	result = vesult;
Packit b00eeb
	g_assert (result != NULL);
Packit b00eeb
	egg_assert_cmpsize (n_result, ==, 8);
Packit b00eeb
	g_assert (result[0] == 0x00);
Packit b00eeb
	g_assert (result[1] == 0x02);
Packit b00eeb
	g_assert (result[2] != 0x00);
Packit b00eeb
	g_assert (result[3] != 0x00);
Packit b00eeb
	g_assert (result[4] != 0x00);
Packit b00eeb
	g_assert (result[5] == 0x00);
Packit b00eeb
	g_assert (result[6] == 'T');
Packit b00eeb
	g_assert (result[7] == 'E');
Packit b00eeb
Packit b00eeb
	g_free (vesult);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs1_padding_invalid_prefix (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x01, 0x04, 0x04, 0x04 };
Packit b00eeb
	check_padding (egg_padding_pkcs1_unpad_01, 4, padded, 4, NULL, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs1_padding_invalid_type (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x03, 0xFF, 0x00, 'T', 'E', 'S', 'T' };
Packit b00eeb
	check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, NULL, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs1_padding_invalid_no_zero (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x01, 0xFF, 0xFF, 'T', 'E', 'S', 'T' };
Packit b00eeb
	check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 8, NULL, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs1_padding_invalid_length (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x01, 0xFF, 0xFF, 'T', 'E', 'S' };
Packit b00eeb
	check_padding (egg_padding_pkcs1_unpad_01, 8, padded, 7, NULL, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs7_padding (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 'T', 'E', 'S', 'T', 0x04, 0x04, 0x04, 0x04 };
Packit b00eeb
	gchar raw[] = "TEST";
Packit b00eeb
Packit b00eeb
	check_padding (egg_padding_pkcs7_pad, 8, raw, 4, padded, 8);
Packit b00eeb
	check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, raw, 4);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs7_padding_equal_block (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 'T', 'E', 'S', 'T', 'T', 'E', 'S', 'T', 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 };
Packit b00eeb
	gchar raw[] = "TESTTEST";
Packit b00eeb
Packit b00eeb
	check_padding (egg_padding_pkcs7_pad, 8, raw, 8, padded, 16);
Packit b00eeb
	check_padding (egg_padding_pkcs7_unpad, 8, padded, 16, raw, 8);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs7_padding_zero (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 };
Packit b00eeb
	gchar raw[] = "";
Packit b00eeb
Packit b00eeb
	check_padding (egg_padding_pkcs7_pad, 8, raw, 0, padded, 8);
Packit b00eeb
	check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, raw, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs7_padding_invalid_zero (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Packit b00eeb
	check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, NULL, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs7_padding_invalid_too_long (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 };
Packit b00eeb
	check_padding (egg_padding_pkcs7_unpad, 4, padded, 8, NULL, 0);
Packit b00eeb
	check_padding (egg_padding_pkcs7_unpad, 4, padded, 4, NULL, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs7_padding_invalid_different (void)
Packit b00eeb
{
Packit b00eeb
	guchar padded[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
Packit b00eeb
	check_padding (egg_padding_pkcs7_unpad, 8, padded, 8, NULL, 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
int
Packit b00eeb
main (int argc, char **argv)
Packit b00eeb
{
Packit b00eeb
	g_test_init (&argc, &argv, NULL);
Packit b00eeb
Packit b00eeb
	g_test_add_func ("/padding/zero_padding", test_zero_padding);
Packit b00eeb
	g_test_add_func ("/padding/zero_padding_no_data", test_zero_padding_no_data);
Packit b00eeb
	g_test_add_func ("/padding/pkcs1_one_padding", test_pkcs1_one_padding);
Packit b00eeb
	g_test_add_func ("/padding/pkcs1_one_padding_no_data", test_pkcs1_one_padding_no_data);
Packit b00eeb
	g_test_add_func ("/padding/pkcs1_two_padding", test_pkcs1_two_padding);
Packit b00eeb
	g_test_add_func ("/padding/pkcs1_padding_invalid_prefix", test_pkcs1_padding_invalid_prefix);
Packit b00eeb
	g_test_add_func ("/padding/pkcs1_padding_invalid_type", test_pkcs1_padding_invalid_type);
Packit b00eeb
	g_test_add_func ("/padding/pkcs1_padding_invalid_no_zero", test_pkcs1_padding_invalid_no_zero);
Packit b00eeb
	g_test_add_func ("/padding/pkcs1_padding_invalid_length", test_pkcs1_padding_invalid_length);
Packit b00eeb
	g_test_add_func ("/padding/pkcs7_padding", test_pkcs7_padding);
Packit b00eeb
	g_test_add_func ("/padding/pkcs7_padding_equal_block", test_pkcs7_padding_equal_block);
Packit b00eeb
	g_test_add_func ("/padding/pkcs7_padding_zero", test_pkcs7_padding_zero);
Packit b00eeb
	g_test_add_func ("/padding/pkcs7_padding_invalid_zero", test_pkcs7_padding_invalid_zero);
Packit b00eeb
	g_test_add_func ("/padding/pkcs7_padding_invalid_too_long", test_pkcs7_padding_invalid_too_long);
Packit b00eeb
	g_test_add_func ("/padding/pkcs7_padding_invalid_different", test_pkcs7_padding_invalid_different);
Packit b00eeb
Packit b00eeb
	return g_test_run ();
Packit b00eeb
}