/* * Unit tests for MD4 functions * * Copyright 2004 Hans Leidekker * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "wine/test.h" #include "windef.h" #include "winbase.h" #include "winerror.h" typedef struct { unsigned int buf[4]; unsigned int i[2]; unsigned char in[64]; unsigned char digest[16]; } MD4_CTX; typedef VOID (WINAPI *fnMD4Init)( MD4_CTX *ctx ); typedef VOID (WINAPI *fnMD4Update)( MD4_CTX *ctx, const unsigned char *src, const int len ); typedef VOID (WINAPI *fnMD4Final)( MD4_CTX *ctx ); fnMD4Init pMD4Init; fnMD4Update pMD4Update; fnMD4Final pMD4Final; #define ctxcmp( a, b ) memcmp( (char*)a, (char*)b, FIELD_OFFSET( MD4_CTX, in ) ) void test_md4_ctx() { static unsigned char message[] = "In our Life there's If" "In our beliefs there's Lie" "In our business there is Sin" "In our bodies, there is Die"; int size = strlen( message ); HMODULE module; MD4_CTX ctx; MD4_CTX ctx_initialized = { { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }, { 0, 0 } }; MD4_CTX ctx_update1 = { { 0x5e592ef7, 0xbdcb1567, 0x2b626d17, 0x7d1198bd }, { 0x00000338, 0 } }; MD4_CTX ctx_update2 = { { 0x05dcfd65, 0xb3711c0d, 0x9e3369c2, 0x903ead11 }, { 0x00000670, 0 } }; unsigned char expect[16] = { 0x5f, 0xd3, 0x9b, 0x29, 0x47, 0x53, 0x47, 0xaf, 0xa5, 0xba, 0x0c, 0x05, 0xff, 0xc0, 0xc7, 0xda }; if (!(module = LoadLibrary( "advapi32.dll" ))) return; pMD4Init = (fnMD4Init)GetProcAddress( module, "MD4Init" ); pMD4Update = (fnMD4Update)GetProcAddress( module, "MD4Update" ); pMD4Final = (fnMD4Final)GetProcAddress( module, "MD4Final" ); if (!pMD4Init || !pMD4Update || !pMD4Final) goto out; memset( &ctx, 0, sizeof(ctx) ); pMD4Init( &ctx ); ok( !ctxcmp( &ctx, &ctx_initialized ), "invalid initialization\n" ); pMD4Update( &ctx, message, size ); ok( !ctxcmp( &ctx, &ctx_update1 ), "update doesn't work correctly\n" ); pMD4Update( &ctx, message, size ); ok( !ctxcmp( &ctx, &ctx_update2 ), "update doesn't work correctly\n" ); pMD4Final( &ctx ); ok( ctxcmp( &ctx, &ctx_initialized ), "context has changed\n" ); ok( !memcmp( ctx.digest, expect, sizeof(expect) ), "incorrect result\n" ); out: FreeLibrary( module ); } START_TEST(crypt_md4) { test_md4_ctx(); }