Patching advapi32.spec to add the stubs looks correct. Go ahead and submit to wine-patches.
--Juan
_______________________________ Do you Yahoo!? Declare Yourself - Register online to vote today! http://vote.yahoo.com
Juan Lang wrote:
Patching advapi32.spec to add the stubs looks correct. Go ahead and submit to wine-patches.
Just for the record... If anyone wants to implement the SHA functions (s)he can make use of the attached code.
Regards, Filip
/* * ADVAPI32 Secure Hash Algorithm Test * Copyright 2003 Filip Navara * Based on public domain SHA code by Steve Reid steve@edmweb.com */
#include <windows.h> #include <stdio.h>
/* SHA Context Structure Declaration ******************************************/
typedef struct { ULONG Unknown[6]; ULONG State[5]; ULONG Count[2]; UCHAR Buffer[64]; } SHA_CONTEXT, *PSHA_CONTEXT;
/* SHA1 Helper Macros *********************************************************/
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
/* FIXME: This definition of blk0 is little endian specific! */ #define blk0(i) (Block[i] = (rol(Block[i],24)&0xFF00FF00)|(rol(Block[i],8)&0x00FF00FF)) #define blk1(i) (Block[i&15] = rol(Block[(i+13)&15]^Block[(i+8)&15]^Block[(i+2)&15]^Block[i&15],1))
#define f1(x,y,z) (z^(x&(y^z))) #define f2(x,y,z) (x^y^z) #define f3(x,y,z) ((x&y)|(z&(x|y))) #define f4(x,y,z) (x^y^z)
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ #define R0(v,w,x,y,z,i) z+=f1(w,x,y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R1(v,w,x,y,z,i) z+=f1(w,x,y)+blk1(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=f3(w,x,y)+blk1(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=f4(w,x,y)+blk1(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
/* Hash a single 512-bit block. This is the core of the algorithm. */ void SHA1Transform(ULONG State[5], CHAR Buffer[64]) { ULONG a, b, c, d, e; ULONG *Block;
Block = (ULONG*)Buffer;
/* Copy Context->State[] to working variables */ a = State[0]; b = State[1]; c = State[2]; d = State[3]; e = State[4];
/* 4 rounds of 20 operations each. Loop unrolled. */ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
/* Add the working variables back into Context->State[] */ State[0] += a; State[1] += b; State[2] += c; State[3] += d; State[4] += e;
/* Wipe variables */ a = b = c = d = e = 0; }
/* SHA Functions **************************************************************/
/* * @implemented */ VOID STDCALL FiN_A_SHAInit(PSHA_CONTEXT Context) { /* SHA1 initialization constants */ Context->State[0] = 0x67452301; Context->State[1] = 0xEFCDAB89; Context->State[2] = 0x98BADCFE; Context->State[3] = 0x10325476; Context->State[4] = 0xC3D2E1F0; Context->Count[0] = Context->Count[1] = 0; }
/* * @implemented */ VOID STDCALL FiN_A_SHAUpdate(PSHA_CONTEXT Context, PCHAR Buffer, UINT BufferSize) { unsigned int i, j; ULONG BufferContentSize;
BufferContentSize = Context->Count[1] & 63; Context->Count[1] += BufferSize; if (Context->Count[1] < BufferSize) Context->Count[0]++; Context->Count[0] += (BufferSize >> 29);
if (BufferContentSize + BufferSize > 63) { RtlCopyMemory(&Context->Buffer[j], Buffer, (i = 64 - j)); SHA1Transform(Context->State, Context->Buffer); for (; i + 63 < BufferSize; i += 64) SHA1Transform(Context->State, &Buffer[i]); j = 0; } else { i = 0; }
if (BufferSize > i) RtlCopyMemory(&Context->Buffer[j], &Buffer[i], BufferSize - i); }
/* * @unimplemented */ VOID STDCALL FiN_A_SHAFinal(PSHA_CONTEXT Context, PULONG Result) { /* FIXME: Do some finalization! */
RtlCopyMemory(Result, Context->State, sizeof(ULONG) * 5); FiN_A_SHAInit(Context); }
/* Test Functions *************************************************************/
typedef VOID (STDCALL *SHAInitFunc)(PSHA_CONTEXT Context); typedef VOID (STDCALL *SHAUpdateFunc)(PSHA_CONTEXT Context, PCHAR Buffer, UINT BufferSize); typedef VOID (STDCALL *SHAFinalFunc)(PSHA_CONTEXT Context, PULONG Result);
VOID FASTCALL PrintSHAContext(PSHA_CONTEXT Context) { printf("State: %x %x %x %x %x\n", Context->State[0], Context->State[1], Context->State[2], Context->State[3], Context->State[4]); printf("Count: %d %d\n", Context->Count[0], Context->Count[1]); }
int main() { SHA_CONTEXT Context, Context2; ULONG ResultBuffer[5]; PCHAR TestBuffer = "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 TestBufferSize = strlen(TestBuffer);
HMODULE hLibrary; SHAInitFunc A_SHAInit; SHAUpdateFunc A_SHAUpdate; SHAFinalFunc A_SHAFinal;
hLibrary = LoadLibrary("advapi32.dll"); A_SHAInit = (SHAInitFunc)GetProcAddress(hLibrary, "A_SHAInit"); A_SHAUpdate = (SHAUpdateFunc)GetProcAddress(hLibrary, "A_SHAUpdate"); A_SHAFinal = (SHAFinalFunc)GetProcAddress(hLibrary, "A_SHAFinal");
RtlZeroMemory(&Context, sizeof(Context)); RtlZeroMemory(&Context2, sizeof(Context2));
printf("A_SHAInit\n"); A_SHAInit(&Context); PrintSHAContext(&Context);
printf("FiN_A_SHAInit\n"); FiN_A_SHAInit(&Context2); PrintSHAContext(&Context2);
printf("\n");
printf("A_SHAUpdate\n"); A_SHAUpdate(&Context, TestBuffer, TestBufferSize); PrintSHAContext(&Context);
printf("FiN_A_SHAUpdate\n"); FiN_A_SHAUpdate(&Context2, TestBuffer, TestBufferSize); PrintSHAContext(&Context2);
printf("\n");
printf("A_SHAFinal\n"); A_SHAFinal(&Context, ResultBuffer); PrintSHAContext(&Context); printf("Result: %x %x %x %x %x\n", ResultBuffer[0], ResultBuffer[1], ResultBuffer[2], ResultBuffer[3], ResultBuffer[4]);
printf("FiN_A_SHAFinal\n"); FiN_A_SHAFinal(&Context2, ResultBuffer); PrintSHAContext(&Context2); printf("Result: %x %x %x %x %x\n", ResultBuffer[0], ResultBuffer[1], ResultBuffer[2], ResultBuffer[3], ResultBuffer[4]);
FreeLibrary(hLibrary);
return 0; }
On Wed, Sep 15, 2004 at 08:06:43PM +0200, Filip Navara wrote:
Juan Lang wrote:
Patching advapi32.spec to add the stubs looks correct. Go ahead and submit to wine-patches.
Just for the record... If anyone wants to implement the SHA functions (s)he can make use of the attached code.
Regards, Filip
/*
- ADVAPI32 Secure Hash Algorithm Test
- Copyright 2003 Filip Navara
- Based on public domain SHA code by Steve Reid steve@edmweb.com
*/
This code needs a proper LGPL or other permissive license on it to be usable. Being based on public domain code and then copyrighted by yourself grants no permissions to anyone else.
Hi Ryan,
--- Ryan Underwood nemesis-lists@icequake.net wrote:
This code needs a proper LGPL or other permissive license on it to be usable. Being based on public domain code and then copyrighted by yourself grants no permissions to anyone else.
Sure it does. Thats the idea behind Public Domain. We already have some public domain based code in wine. The __CxxFrameHandler comes to mind. If I remeber correctly it is based off of a example found on codeproject and all of the code there is licensed as Public Domain.
Thanks Steven
__________________________________ Do you Yahoo!? Yahoo! Mail - 50x more storage than other providers! http://promotions.yahoo.com/new_mail
--- Ryan Underwood nemesis-lists@icequake.net wrote:
This code needs a proper LGPL or other permissive license on it to be usable. Being based on public domain code and then copyrighted by yourself grants no permissions to anyone else.
Oh sorry you just mean the license header needs to be added. Filip has always licensed his code in the past as LGPL. But you are right I guess. It just seems like he meant "Do what thou wilt with this code" but I guess it does need a public domain notice of its own for his changes.
Thanks Steven
__________________________________ Do you Yahoo!? Yahoo! Mail Address AutoComplete - You start. We finish. http://promotions.yahoo.com/new_mail
Ryan Underwood wrote:
/*
- ADVAPI32 Secure Hash Algorithm Test
- Copyright 2003 Filip Navara
- Based on public domain SHA code by Steve Reid steve@edmweb.com
*/
This code needs a proper LGPL or other permissive license on it to be usable. Being based on public domain code and then copyrighted by yourself grants no permissions to anyone else.
Damn legal stuff. What do I need to do to? Just put an LGPL license header to the file or even make my code public domain?
Thanks, Filip
On Thu, Sep 16, 2004 at 06:39:42AM +0200, Filip Navara wrote:
This code needs a proper LGPL or other permissive license on it to be usable. Being based on public domain code and then copyrighted by yourself grants no permissions to anyone else.
Damn legal stuff. What do I need to do to? Just put an LGPL license header to the file or even make my code public domain?
You did the right thing. It is arguable that if public domain is the intent, then a copyright notice with a BSD/MIT license is more legally secure than public domain, but for this little code it is ok.