James Turner wrote: > Roger, > > I don't have any reference code, but I have included the password > checking code I use in Zipfusion. > I arrived at this solution partially from code analysis and partially > from experimentation using the debugger to watch variables. > > James Turner > SKARO.NET > > > procedure EnterPassword(WND:HWND; Attempts:integer); > { The file pointer is assumed to be located at the start } > { of the file data or the 12-byte encryption prefix. } > { Failure will raise an exception. } > type TCryptBlock = array [0..(SizeOf(TZipCryptKey) div 2) - 1] of > Word; > > function Decrypt(CryptBlock:TCryptBlock):Boolean; > { CryptBlock must be passed as a value parameter otherwise the } > { password has to be entered correctly at the first attempt. } > const InitKey : TZipCryptKey = (305419896,591751049,878082192); > var i : integer; > w : Word; > begin > Result := False; if Password = '' then exit; > CryptKey := InitKey; > > for i := 1 to Length(Password) do > UpdateCryptKey(byte(Password[i])); > > DecryptBuff(@CryptBlock,SizeOf(CryptBlock)); > w := CryptBlock[High(CryptBlock)]; > > with Header do if Flags and 8 = 0 then result := w = > HiWord(CRC32) else result := > w = LoWord(FileDate); end; > > var CryptBlock : TCryptBlock; > begin { EnterPassword } > if (Header.Flags and 1) = 0 then exit; { Not password protected } > > { If AutoRun is true, SkipFile should always be called } > if not AutoRun then begin > InfileRead(CryptBlock,SizeOf(CryptBlock)); > > if Password <> '' then inc(Attempts); > > repeat > if Decrypt(CryptBlock) then Exit; > > if (Attempts > 0) then begin > dec(Attempts); > case > DialogBoxParam(HInstance,'DIALOG_Password',WND,@DP_Password,0) of > ID_OK : Continue; > ID_No : Break; { Skip button : return false } > ID_Cancel : SkipFile('',sfAbort); > else end; > end > else Break; > > until false; > end; > > SkipFile(SourceFileName,sfWrongPassword); > end; > > > ----------- > To unsubscribe from this list, send an empty e-mail > message to: > delphizip-request@xxxxxxxxxxxxx > and put the word unsubscribe in the subject. I got the impression that this is not the complete code Missing -> DecryptBuff(@CryptBlock, SizeOf(CryptBlock); I presume this is the replacement of decrypt_byte probably the most important part Missing->UpdateCryptKey( byte(Password[i])); Maybe I did look gooed enough ? Roger Aelbrecht http://web.wanadoo.be/driehoeksw ----------- To unsubscribe from this list, send an empty e-mail message to: delphizip-request@xxxxxxxxxxxxx and put the word unsubscribe in the subject.