C++ Funktion nach Pascal konvertieren

Nabend liebe Leute,
ich mühe mich grade mit der Konvertierung eines (V)C++ Codes nach Delphi (7).
Code:
#include <windows.h>
#include <wincrypt.h>
void GetHashStr(wchar_t *Password,char *HashStr)
{
    HashStr[0]='\0';
    HCRYPTPROV  hProv = NULL;
    HCRYPTHASH  hHash = NULL;
    CryptAcquireContext(&hProv, 0,0,PROV_RSA_FULL,0);
    //  instance of hash calculation
    if(CryptCreateHash(hProv,CALG_SHA1, 0, 0,&hHash)){
        //calculation of hash value
        if(CryptHashData(hHash,(unsigned char
*)Password,(wcslen(Password)+1)*2,0)){
            // retrieve 20 bytes of hash value
            DWORD dwHashLen=20;
            BYTE Buffer[20];
           
if(CryptGetHashParam(hHash,HP_HASHVAL,Buffer,&dwHashLen,0)){
                CryptDestroyHash(hHash);
                CryptReleaseContext(hProv, 0);
                // creation of character string based on hash
                char TmpBuf[128];
                unsigned char tail=0;// variable to calculate value
for the last 2 bytes
                // convert to a character string in hexadecimal
notation
                for(int i=0;i<20;i++){
                    unsigned char c = Buffer[i];
                    tail+=c;
                    wsprintf(TmpBuf,"%s%2.2X",HashStr,c);
                    strcpy(HashStr,TmpBuf);
                }
                // add the last 2 bytes
                wsprintf(TmpBuf,"%s%2.2X",HashStr,tail);
                strcpy(HashStr,TmpBuf);
            }
        }
    }
}
Meine Konvertierung bis jetzt:
Code:
procedure GetHashStr(password : PWidechar; var hashstr : String);
var
  hProv : HCRYPTPROV;
  hHash : HCRYPTHASH;
  buffer: array[0..19] of byte;
  dwhashlen : DWord;
  i : Integer;
  tail : Byte;
begin
  tail := 0;
  CryptAcquireContext(@hProv,0,0,PROV_RSA_FULL,0);
  if CryptCreatehash(hProv, CALG_SHA1, 0, 0,@hHash) Then begin
    if CryptHashData(hHash,@password, SizeOf(password),0) Then begin //möglicherweise falsche Größe?
      dwHashLen := 20;
      If CryptGetHashParam(hHash,HP_HASHVAL,@Buffer[0],@dwHashLen,0) Then begin
        CryptDestroyHash(hHash);
        CryptReleaseContext(hProv, 0);
        For i := 0 To dwHashLen - 1 Do begin
          tail := tail + buffer[i];
          hashstr := hashstr + Format('%2.2X', [buffer[i]]);
        end;
        hashstr := hashstr + Format('%2.2X', [tail]);
      end;
    end;
  end;
end;
Beim Aufruf
Code:
GetHashStr('q',strq);
bekomme ich aber falsche ergebnisse, richtig müssste es:
Code:
C6FB044EC2BD401521D6B1082276415638196D8004
sein.
Ich vermute etweder, dass die Größe von password falsch berechnet wird oder dass ein allgemeines Problem mit PWidechar gibt.
Danke im Voraus
garfield
 
ich kenne mich mit pacscal nicht aus, aber ich vermute, sizeof() sagt dir nicht, was du wissen möchtest. der buf muss 2*([anzahlderzeichen] + 1) sein. mach doch zum testen einfach mal hardcoded ne 4 rein (1 zeichen), dann siehst du schonmal, ob's an der bufsize liegt.
ich weiss auch nicht, ob PWidechar und wchar_t identisch sind. du solltest dir mal nen paar bytefolgen als hex ausgeben lassen und vergleichen. nen wchar_t hat 2 bytes und wenn das erste 0 ist, entspricht das zweite dem ascii-wert. terminiert wird ein wchar_t-string mit nem doppelten nullbyte.

wenn das alles ok ist, musst du dir den ganzen kram für die ausgabe auch nochmal ansehen.
 
Also erstmal Danke, das war in der Tat ein Teil des Fehlers.
Man musste die fragliche Zeile durch das hier ersetzen:
Code:
 if CryptHashData(hHash,@password[0], (Length(password) + 1) * 2,0) Then begin
jetzt gehts :)
*freude*
vielen dank nochmal =)
 
Zurück
Oben