2013-11-26 4 views
1

고통스러운 디버깅 세션 후에 나는 TIdHashSHA1.HashStream이 그 ASize 인수를 존중하지 않는다는 것을 발견했습니다. 다음 코드를 고려하십시오.Delphi 2010에서 TIdHashSHA1.HashStream이 깨졌습니다?

var 
    Hasher: TIdHashSHA1; 
    MS: TMemoryStream; 
begin 
    MS := TMemoryStream.Create; 
    Hasher := TIdHashSHA1.Create; 
    try 
    MS.LoadFromFile('C:\windows\notepad.exe'); 
    MS.Position := 0; 
    ShowMessage(Hasher.HashStreamAsHex(MS)); 
    MS.Position := 0; 
    ShowMessage(Hasher.HashStreamAsHex(MS, 0, MS.Size - 10)); 
    finally 
    Hasher.Free; 
    MS.Free; 
    end; 
end; 

결과는 같습니다. 이 버그입니까 아니면 내가 잘못하고있는 거지? 실제로 버그 일 경우 해시를 원하는 스트림을 복사하지 않고 주위를 둘러 보는 가장 쉬운 방법은 무엇입니까?

답변

1

TIdHashSHA1 (특히 TIdHashSHA1.NativeGetHashBytes() 메서드)은 ASize 매개 변수를 무시합니다. 64 바이트 미만이 읽힐 때까지 입력 스트림에서 읽습니다. 그건 해결해야 할 버그 인 것처럼 보입니다. 실제로 요구 된 것 이상을 읽으면 안됩니다. Indy의 버그 추적기에 표를 열었습니다. 버그 데이터의 실제 해싱을하고 같은 방법에 있기 때문에 내가 공식 수정 IdHashSHA.pasNativeGetHashBytes() 직접 수정하고 당신이 경우 다음, 인디을 다시 컴파일 (또는하는 것입니다 놓을 때까지

는 유일한 해결 방법은 당신이 할 수있는 런타임 패키지를 사용하지 않는 경우 IdHashSHA.pas의 로컬 복사본을 만들어 프로젝트에 추가 한 다음 복사본을 수정할 수 있습니다.

+0

누군가의 골동품을위한 티켓 : http://indy.codeplex.com/workitem/24912 – eis

+0

또한 http://code.google.com/p/indyproject/issues/detail?id=270 –

+0

@ ThijsvanDien : Indy의 SVN에서 TIdHashSHA1에 대한 업데이트를 확인했습니다. 일단 수정 프로그램이 작동 중임을 확인하면 티켓을 닫을 것입니다. –

1

이제는 버그 인 것으로 확인되었으므로 TGpStreamWindow을 사용하여 문제를 해결했습니다.

관련 문제