/*
 * Unit tests for SHA functions
 *
 * Copyright (c) 2004 Filip Navara
 *
 * 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 <stdio.h>

#include "wine/test.h"
#include "windef.h"
#include "winbase.h"
#include "winerror.h"

typedef struct {
   ULONG Unknown[6];
   ULONG State[5];
   ULONG Count[2];
   UCHAR Buffer[64];
} SHA_CTX, *PSHA_CTX;

typedef VOID (WINAPI *fnA_SHAInit)(PSHA_CTX Context);
typedef VOID (WINAPI *fnA_SHAUpdate)(PSHA_CTX Context, PCHAR Buffer, UINT BufferSize);
typedef VOID (WINAPI *fnA_SHAFinal)(PSHA_CTX Context, PULONG Result);

fnA_SHAInit pA_SHAInit;
fnA_SHAUpdate pA_SHAUpdate;
fnA_SHAFinal pA_SHAFinal;

#define ctxcmp(a,b) memcmp((char*)a, (char*)b, FIELD_OFFSET(SHA_CTX, Buffer))

void test_sha_ctx()
{
   PCHAR test_buffer = "In our Life there's If"
                       "In our beliefs there's Lie"
                       "In our business there is Sin"
                       "In our bodies, there is Die";
   ULONG test_buffer_size = strlen(test_buffer);
   HMODULE hmod;
   SHA_CTX ctx;
   SHA_CTX ctx_initialized = {{0, 0, 0, 0, 0}, {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}, {0, 0}};
   SHA_CTX ctx_update1 = {{0, 0, 0, 0, 0}, {0xdbe5eba8, 0x6b4335ca, 0xf7c94abe, 0xc9f34e31, 0x311023f0}, {0, 0x67}};
   SHA_CTX ctx_update2 = {{0, 0, 0, 0, 0}, {0x5ecc818d, 0x52498169, 0xf6758559, 0xd035a164, 0x871dd125}, {0, 0xce}};
   ULONG result[5];
   ULONG result_correct[5] = {0xe014f93, 0xe09791ec, 0x6dcf96c8, 0x8e9385fc, 0x1611c1bb};

   hmod = LoadLibrary("advapi32.dll");
   pA_SHAInit = (fnA_SHAInit)GetProcAddress(hmod, "A_SHAInit");
   pA_SHAUpdate = (fnA_SHAUpdate)GetProcAddress(hmod, "A_SHAUpdate");
   pA_SHAFinal = (fnA_SHAFinal)GetProcAddress(hmod, "A_SHAFinal");

   RtlZeroMemory(&ctx, sizeof(ctx));
   pA_SHAInit(&ctx);
   ok(!ctxcmp(&ctx, &ctx_initialized), "invalid initialization\n");

   pA_SHAUpdate(&ctx, test_buffer, test_buffer_size);
   ok(!ctxcmp(&ctx, &ctx_update1), "update doesn't work correctly\n");

   pA_SHAUpdate(&ctx, test_buffer, test_buffer_size);
   ok(!ctxcmp(&ctx, &ctx_update2), "update doesn't work correctly\n");

   pA_SHAFinal(&ctx, result);
   ok(!ctxcmp(&ctx, &ctx_initialized), "context hasn't been reinitialized\n");
   ok(!memcmp(result, result_correct, sizeof(result)), "incorrect result\n");

   FreeLibrary(hmod);
}

START_TEST(crypt_sha)
{
    test_sha_ctx();
}
