AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung in SHA-1 Code

Ein Thema von cmrudolph · begonnen am 14. Jul 2008 · letzter Beitrag vom 14. Jul 2008
Antwort Antwort
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#1

Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 15:41
Hi,
ich habe mir mal das RFC 3174 geschnappt und in Delphi eine Funktion geschrieben, die über einen Speicherbereich den SHA-1 Hash berechnet.
Das Ergebnis ist auch korrekt, nur bekomme ich eine Zugriffsverletzung, wenn ich größere Daten hashen möchte.
Ich habe beispielsweise den Puffer mit 4194209 4194304 Bytes (4 MB) gefüllt. Beim 16376. Byte bekomme ich jedoch eine Zugriffsverletzung.
Um das ganze am Code zu zeigen, hier die Funktion:
Delphi-Quellcode:
type
  THash = Array [0..4] of Cardinal;
  PHash = ^THash;
.
.
.
procedure SHA1(data: Pointer;const mlen_lo:Cardinal;hash: PHash);
  function rollL(k: Cardinal;const amount: Byte): Cardinal;
  var
    l: Cardinal;
  begin
    l:=k shl amount;
    k:=k shr (32-amount);
    Result:=l or k;
  end;
var
  W: Array [0..79] of Cardinal;
  h0,h1,h2,h3,h4: Cardinal;
  a,b,c,d,e: Cardinal;
  temp,i,n: Cardinal;
  t: Byte;
  paddeddata: Pointer;
  pposB: PByte;

  padc: Byte;
  m_lenbits: Cardinal;

  mb: Byte;
begin
  h0 := $67452301;
  h1 := $EFCDAB89;
  h2 := $98BADCFE;
  h3 := $10325476;
  h4 := $C3D2E1F0;

  paddeddata:=GetMemory(mlen_lo+72);
  CopyMemory(paddeddata,data,mlen_lo);
  pposB:=paddeddata;
  inc(pposB,mlen_lo);
  pposB^:=$80;
  inc(pposB);

  padc:=64-(mlen_lo+9) mod 64;
  if padc>0 then begin
    for t:=1 to padc do begin
      pposB^:=$00;
      inc(pposB);
    end;
  end;
  n:=(mlen_lo+padc+9) div 64;

  m_lenbits:=mlen_lo shl 3;
  PCardinal(pposB)^:=$00000000;
  inc(pposB,4);
  pposB^:=m_lenbits shr 24;
  inc(pposB);
  pposB^:=m_lenbits shr 16;
  inc(pposB);
  pposB^:=m_lenbits shr 8;
  inc(pposB);
  pposB^:=m_lenbits;
  pposB:=paddeddata;

  //Beginn Debugcode
  for i:=0 to 4096 do begin
    for t:=0 to 15 do begin
      mb:=pposB^;
      if mb=0 then;
      if Cardinal(pposB)=431800320 then
        ShowMessage(IntToStr(i));
      inc(pposB);
    end;
  end;

  pposB:=paddeddata;
  //Ende Debugcode

  for i:=0 to n-1 do begin
    for t:=0 to 15 do begin
      try
      //hier kommt die Zugriffsverletzung
      W[t]:=pposB^ shl 24;
      inc(pposB);
      W[t]:=W[t] or (pposB^ shl 16);
      inc(pposB);
      W[t]:=W[t] or (pposB^ shl 8);
      inc(pposB);
      W[t]:=W[t] or pposB^;
      inc(pposB);
      except showmessage(IntToStr(Cardinal(paddeddata))+' '+IntToStr(Cardinal(pposB)));
      end;
    end;

    for t:=16 to 79 do begin
      W[t]:=rollL(W[t-3] XOR W[t-8] XOR W[t-14] XOR W[t-16],1);
    end;

    a:=h0;
    b:=h1;
    c:=h2;
    d:=h3;
    e:=h4;

    for t:=0 to 19 do begin
      temp:=rollL(a,5) + ((b AND c) OR ((NOT b) AND d)) + e + W[t] + $5A827999;

      e:=d;
      d:=c;
      c:=rollL(b,30);
      b:=a;
      a:=temp;
    end;
    for t:=20 to 39 do begin
      temp:=rollL(a,5) + (b XOR c XOR d) + e + W[t] + $6ED9EBA1;

      e:=d;
      d:=c;
      c:=rollL(b,30);
      b:=a;
      a:=temp;
    end;
    for t:=40 to 59 do begin
      temp:=rollL(a,5) + ((b AND c) OR (b AND d) OR (c AND d)) + e + W[t] + $8F1BBCDC;

      e:=d;
      d:=c;
      c:=rollL(b,30);
      b:=a;
      a:=temp;
    end;
    for t:=60 to 79 do begin
      temp:=rollL(a,5) + (b XOR c XOR d) + e + W[t] + $CA62C1D6;
      
      e:=d;
      d:=c;
      c:=rollL(b,30);
      b:=a;
      a:=temp;
    end;

    FreeMemory(paddeddata);

    h0:=h0+a;
    h1:=h1+b;
    h2:=h2+c;
    h3:=h3+d;
    h4:=h4+e;
  end;

  hash^[0]:=h0;
  hash^[1]:=h1;
  hash^[2]:=h2;
  hash^[3]:=h3;
  hash^[4]:=h4;
end;
Die Zeilen 64-76 sind Debugcode. Die Zugriffsverletzung kommt bei Adresse 431800320 in Zeile 82. Ich habe versucht, den Wert vorher in eine andere Variable zu übertragen, also statt der direkten Zuweisung in das Array W erst in eine tempvariable. Doch dann kommt die Zugriffsverletzung bei dieser Operation.

Der Debugcode zeigt aber, dass der Speicher eigentlich zugreifbar sein müsste. Ich lasse mir im Debugcode auch den Wert an dieser Adresse ausgeben lassen, der stimmt auch mit den Eingabedaten überein.

Irgend etwas muss ich übersehen haben. Ich bin für jede Hilfe dankbar.

mfG,
Christian

Edit: die Bytezahl stimmte nicht, auch wenn es wohl nicht von Belang ist. Aber der Korrektheit halber...
Edit2: Da ich nicht wusste, dass man die Zeilennummern nicht immer sieht, habe ich den Quellcode um drei kleine Kommentare erweitert und die Zeilennummern unter dem Code angepasst.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:02
In welcher Zeile
Markus Kinzler
  Mit Zitat antworten Zitat
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#3

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:06
Die Zugriffsverletzung kommt in Zeile 79, wie es oben auch steht
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:08
Zitat von cmrudolph:
Die Zugriffsverletzung kommt in Zeile 79, wie es oben auch steht
Super.
Und welche Zeile ist das genau?
Was steht da für Code drin?
Ich fang bestimmt nicht an Zeilen zu zählen...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:11
sind die bei euch nicht durchnummeriert?
<<-- hier steht ne 1       W[t]:=pposB^ shl 24;
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:12
Zitat von dominikkv:
sind die bei euch nicht durchnummeriert?
Nein ich seh keine Zeilennummern.

Kann man das irgendwo einstellen?
Aber eigentlich will ich die Zeilennummern auch nicht sehen.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#7

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:17
Ich habe nicht gewusst, dass man die Zeilennummern deaktivieren kann. (Die Option ist unter DP Info & Services -> erw. Profil bearbeiten -> Thread und Forenansicht -> Zeilennummern)

Nun ja, der besagte Quellcode wurde jetzt ja gepostet. Die Zeilennummern sollen jetzt nicht das Problem sein.

Hier noch einmal ein Auszug mit einem Kontext:
Delphi-Quellcode:
  for i:=0 to n-1 do begin
    for t:=0 to 15 do begin
      try
      W[t]:=pposB^ shl 24;
      inc(pposB);
      W[t]:=W[t] or (pposB^ shl 16);
      inc(pposB);
      W[t]:=W[t] or (pposB^ shl 8);
      inc(pposB);
      W[t]:=W[t] or pposB^;
      inc(pposB);
      except showmessage(IntToStr(Cardinal(paddeddata))+' '+IntToStr(Cardinal(pposB)));
      end;
    end;
Es ist die Zeile direkt unter dem "try".
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:19
ähm, ok, ich sehe gerade das die bei mir nur durchnummeriert werden wenn man den Quelltext "aufklappen" kann. Also oben bei meinem Beitrag steht doch keine 1
Ich habe bei "erw. Profil bearbeiten" hier in der DP "Code-Folding" und "Zeilennummern" aktiviert.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#9

Re: Zugriffsverletzung in SHA-1 Code

  Alt 14. Jul 2008, 16:50
Tut mir Leid, dass ich euch bemüht habe, ich habe den Fehler nun gefunden.

Es ist die kleine Zeile
FreeMemory(paddeddata); , die ein Stück zu hoch gerutscht ist. Sie gehört eigentlich hinter das darauf folgende end und ist somit nicht mehr in der Schleife.

mfG,
Christian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz