/*
* Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC")
*
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id$ */
/*
* -d1 or larger shows hash or HMAC result even if correct
*/
#include <config.h>
#include <stdlib.h>
static int nprobs;
typedef void(*HASH_INIT)(void *);
typedef void(*HMAC_INIT)(void *, const unsigned char *, unsigned int);
typedef void(*UPDATE)(void *, const unsigned char *, unsigned int);
typedef void(*FINAL)(void *, const unsigned char *);
typedef void(*SIGN)(void *, const unsigned char *, unsigned int);
typedef struct {
const char *name;
const unsigned char *key;
const unsigned int key_len;
const unsigned char *str;
const unsigned int str_len;
} IN;
union {
unsigned char b[1024];
} dbuf;
typedef struct {
const char *str;
const unsigned int digest_len;
} OUT;
/*
* two ad hoc hash examples
*/
"a9993e364706816aba3e25717850c26c9cd0d89d",
"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7",
"900150983cd24fb0d6963f7d28e17f72",
16};
STR_INIT("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")};
"84983e441c3bd26ebaae4aa1f95129e5e54670f1",
"75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525",
"8215ef0796a20bcaaae116d3876c664a",
16};
/*
* three HMAC-md5 examples from RFC 2104
*/
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b};
STR_INIT("Hi There")};
"9294727a3638bb1c13f48ef8158bfc9d",
16};
STR_INIT("what do ya want for nothing?")};
"750c783e6ab0b503eaa86e310a5db738",
16};
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xDD, 0xDD};
rfc2104_3_s, sizeof(rfc2104_3_s)};
"56be34521d144c88dbb8c733f0e8b3f6",
16};
/*
* four three HMAC-SHA tests cut-and-pasted from RFC 4634 starting on page 86
*/
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
};
STR_INIT("Hi There")};
"B617318655057264E28BC0B6FB378C8EF146BE00",
"896FB1128ABBDF196832107CD49DF33F47B4B1169912BA4F53684B22",
"B0344C61D8DB38535CA8AFCEAF0BF12B881DC200C9833DA726E9376C2E32"
"CFF7",
"AFD03944D84895626B0825F4AB46907F15F9DADBE4101EC682AA034C7CEB"
"C59CFAEA9EA9076EDE7F4AF152E8B2FA9CB6",
"87AA7CDEA5EF619D4FF0B4241A1D6CB02379F4E2CE4EC2787AD0B30545E1"
"7CDEDAA833B7D6B8A702038B274EAEA3F4E4BE9D914EEB61F1702E696C20"
"3A126854",
STR_INIT("what do ya want for nothing?")};
"EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79",
"A30E01098BC6DBBF45690F3A7E9E6D0F8BBEA2A39E6148008FD05E44",
"5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC"
"3843",
"AF45D2E376484031617F78D2B58A6B1B9C7EF464F5A01B47E42EC3736322"
"445E8E2240CA5E69E2C78B3239ECFAB21649",
"164B7A7BFCF819E2E395FBE73B56E0A387BD64222E831FD610270CD7EA25"
"05549758BF75C05A994A6D034F65F8F0E6FDCAEAB1A34D4A6B4B636E070A"
"38BCE737",
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
};
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd
};
rfc4634_3_s, sizeof(rfc4634_3_s)};
"125D7342B9AC11CD91A39AF48AA17B4F63F175D3",
"7FB3CB3588C6C1F6FFA9694D7D6AD2649365B0C1F65D69D1EC8333EA",
"773EA91E36800E46854DB8EBD09181A72959098B3EF8C122D9635514CED5"
"65FE",
"88062608D3E6AD8A0AA2ACE014C8A86F0AA635D947AC9FEBE83EF4E55966"
"144B2A5AB39DC13814B94E3AB6E101A34F27",
"FA73B0089D56A284EFB0F0756C890BE9B1B5DBDD8EE81A3655F83E33B227"
"9D39BF3E848279A722C806B485A47E67C807B946A337BEE8942674278859"
"E13292FB",
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
0x15, 0x16, 0x17, 0x18, 0x19
};
0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd
};
rfc4634_4_s, sizeof(rfc4634_4_s)};
"4C9007F4026250C6BC8414F9BF50C86C2D7235DA",
"6C11506874013CAC6A2ABC1BB382627CEC6A90D86EFC012DE7AFEC5A",
"82558A389A443C0EA4CC819899F2083A85F0FAA3E578F8077A2E3FF46729"
"665B",
"3E8A69B7783C25851933AB6290AF6CA77A9981480850009CC5577C6E1F57"
"3B4E6801DD23C4A7D679CCF8A386C674CFFB",
"B0BA465637458C6990E5A8C5F61D4AF7E576D97FF94B872DE76F8050361E"
"E3DBA91CA5C11AA25EB4D679275CC5788063A5F19741120C4F2DE2ADEBEB"
"10A298DD",
static const char *
const unsigned char *d, unsigned int d_len)
{
unsigned int i, l;
l = 0;
}
if (l >= buf_len-3) {
}
return buf;
}
/*
* Compare binary digest or HMAC to string of hex digits from an RFC
*/
static void
{
const char *str_name;
unsigned int l;
if (T_debug != 0)
t_info("%s(%s)\n%9s %s\n%9s %s\n",
"is", buf,
++nprobs;
return;
}
/*
* check that the hash or HMAC is no longer than we think it is
*/
if (dbuf.b[l] != DIGEST_FILL) {
t_info("byte #%d after end of %s(%s) changed to %02x\n",
++nprobs;
break;
}
}
}
static void
{
union {
unsigned char b[1024];
} ctx;
}
/*
* isc_sha224_final has a different calling sequence
*/
static void
{
}
static void
{
}
/*
* isc_hmacmd5_sign has a different calling sequence
*/
static void
{
}
static void
{
union {
unsigned char b[1024];
} ctx;
}
static void
{
in, out_sha224);
in, out_sha256);
in, out_sha384);
in, out_sha512);
}
/*
* This will almost never fail, and so there is no need for the extra noise
* that would come from breaking it into several tests.
*/
static void
t1(void)
{
/*
* two ad hoc hash examples
*/
/*
* three HMAC-md5 examples from RFC 2104
*/
/*
* four HMAC-SHA tests from RFC 4634 starting on page 86
*/
if (nprobs != 0)
else
}
{ t1, "hashes" },
};