|
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 |
}
|