From e748f8cdf521ff07e5979fdb31ef3dcc41809fca Mon Sep 17 00:00:00 2001 From: phantasm4489 Date: Tue, 6 Jun 2023 12:18:08 +0100 Subject: [PATCH] 1) Change default password encryption to legacy to allow downgrade capability 2) Remove very old debug code 3) Allow multiple sub directories for ftp 4) Update download directory caching to be used for ftp as well 5) Optimise ftp directory listing speed --- axenums.e | 2 +- express.e | 160 +++++++++++++++++++++------------ ftpd.e | 263 ++++++++++++++++++++++++++++++++++-------------------- sha256.e | 252 +++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 515 insertions(+), 162 deletions(-) diff --git a/axenums.e b/axenums.e index 25de8f3..68c1bf3 100644 --- a/axenums.e +++ b/axenums.e @@ -22,7 +22,7 @@ EXPORT ENUM LOGON_TYPE_LOGGED_OFF=0, LOGON_TYPE_SYSOP=1, LOGON_TYPE_LOCAL=2, LOG EXPORT ENUM RESULT_FAILURE=-1, RESULT_SUCCESS=0, RESULT_NOT_ALLOWED=1, RESULT_ABORT=-2, RESULT_TIMEOUT=-3, RESULT_NO_CARRIER=-4, RESULT_GOODBYE=-5, RESULT_SLEEP_LOGOFF=-6, RESULT_STANDARD_LOGOFF=-7, RESULT_CONNECT=-8, RESULT_NOT_TESTED=2, RESULT_LCFILES=9,RESULT_PRIVATE=10, RESULT_SIGNALLED=11, RESULT_NOT_FOUND=12 -EXPORT ENUM ERR_MEMORY,ERR_MEMORY2,ERR_MSGBASE,ERR_MEMORY3,ERR_FILELIST,ERR_NOFILES,ERR_FILEEXAMINE,ERR_WORKDIROPEN,ERR_LOCK,ERR_FREESPACE,ERR_SYMBOLS,ERR_FIB_MEMORY,ERR_NO_BULLS,ERR_NO_CONFFLAGS +EXPORT ENUM ERR_MEMORY,ERR_MEMORY2,ERR_MSGBASE,ERR_MEMORY3,ERR_FILELIST,ERR_NOFILES,ERR_FILEEXAMINE,ERR_WORKDIROPEN,ERR_LOCK,ERR_FREESPACE,ERR_SYMBOLS,ERR_FIB_MEMORY,ERR_NO_BULLS,ERR_NO_CONFFLAGS, ERR_NODEPARAM EXPORT ENUM MAIL_READ=1,MAIL_CREATE=2, MAIL_SCAN=3, MAIL_STATS=4, MAIL_SYSOP_COMMENT=6, MAIL_ZOOM=7 diff --git a/express.e b/express.e index 9e27d4d..303d85c 100644 --- a/express.e +++ b/express.e @@ -40,7 +40,7 @@ DEF serverin DEF singleNode=0: PTR TO singlePort DEF masterNode=0: PTR TO multiPort -DEF debug=FALSE + DEF consoleDebugLevel=LOG_NONE DEF debugLogLevel=LOG_ERROR DEF inputLogging=FALSE @@ -944,7 +944,7 @@ PROC setNewPassword(user:PTR TO user, userMisc:PTR TO userMisc, newpass:PTR TO C ELSEIF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','PBKDF2_10000') passType:=PWD_PBKDF2_10000 ELSE - passType:=PWD_PBKDF2_100 + passType:=PWD_LEGACY ENDIF userMisc.pwdType:=passType @@ -1559,7 +1559,7 @@ PROC getPass2(prompt: PTR TO CHAR,password:PTR TO CHAR,userPwd, max:LONG,outstr= ELSEIF checkToolType(TOOLTYPE_BBSCONFIG,0,'PASSWORD_SECURITY','PBKDF2_10000') passType:=PWD_PBKDF2_10000 ELSE - passType:=PWD_PBKDF2_100 + passType:=PWD_LEGACY ENDIF IF loggedOnUserMisc.pwdType<>passType @@ -7545,6 +7545,7 @@ PROC processInputMessage(timeout, extsig = 0,rawMode=FALSE, allowSer=TRUE) loggedOnUserMisc:=NEW loggedOnUserMisc loadAccount(1,loggedOnUser,loggedOnUserKeys,loggedOnUserMisc) masterLoadPointers(loggedOnUser) + setEnvStat(ENV_SYSOP) conferenceMaintenance() END loggedOnUser END loggedOnUserKeys @@ -12505,7 +12506,7 @@ PROC checkFIBForFileSize(fullPath:PTR TO CHAR, checkConfNum, fBlock:PTR TO filei ENDIF ENDPROC dp -PROC checkForFileSize(checkFilename:PTR TO CHAR, checkConfNum, tfsizeList:PTR TO stdlist, freeDFlagList:PTR TO stdlist, cfn:PTR TO stdlist, z) +PROC checkForFileSize(checkFilename:PTR TO CHAR, subDirs:PTR TO CHAR, checkConfNum, tfsizeList:PTR TO stdlist, freeDFlagList:PTR TO stdlist, cfn:PTR TO stdlist, z) DEF stat,pstat=1,i DEF fflag=0,wflag=0,doflag=0 @@ -12594,13 +12595,15 @@ jumpIn: IF(wflag=0) IF(sysopdl=0) StrCopy(final,path) + StrAdd(final,subDirs) + checkPathSlash(final) StrAdd(final,checkFilename) ELSE StrCopy(final,checkFilename) IF(findAssign(final)) THEN JUMP outst ENDIF StringF(ramDir,'RAM:DirCaches/Conf\dDir\d',checkConfNum,drivenum-1) - IF fileExists(ramDir) + IF (StrLen(subDirs)=0) AND (fileExists(ramDir)) ft:=Open(ramDir,MODE_OLDFILE) IF ft<>0 fLock:=NIL @@ -12629,7 +12632,7 @@ jumpIn: IF(doflag) IF fLock=NIL StringF(ramDir,'RAM:DirCaches/Conf\dDir\d',checkConfNum,drivenum-1) - IF fileExists(ramDir) + IF (StrLen(subDirs)=0) AND (fileExists(ramDir)) ft:=Open(ramDir,MODE_OLDFILE) ENDIF IF((fLock:=Lock(final,ACCESS_READ))=0) @@ -12657,6 +12660,7 @@ debugcount:=0 xit:=ExNext(fLock,fBlock)=0 ELSE xit:=(Fgets(ft,tempstr,255)=0) + IF (StrLen(tempstr)>18) AND (tempstr[8]=" ") AND (tempstr[17]=" ") THEN StrCopy(tempstr,tempstr+18) ENDIF EXIT xit @@ -12676,8 +12680,13 @@ gotit: IF(sysopdl) StrCopy(final,checkFilename) ELSE + + StrCopy(final,path) + StrAdd(final,subDirs) + checkPathSlash(final) + IF ft<>0 - StringF(final,'\s\s',path,tempstr) + StrAdd(final,tempstr) fLock2:=Lock(final,ACCESS_READ) IF fLock2 Examine(fLock2,fBlock) @@ -12686,7 +12695,7 @@ gotit: res:=FALSE ENDIF ELSE - StringF(final,'\s\s',path,fBlock.filename) + StrAdd(final,fBlock.filename) ENDIF ENDIF @@ -12827,42 +12836,6 @@ PROC regServer() DEF port:PTR TO mp DEF tempstr[255]:STRING - IF debug - cmds:=NEW cmds - AstrCopy(cmds.bbsLoc,'BBS:',41) - - loadAccount(1,tempUser,tempUserKeys,tempUserMisc) - - AstrCopy(cmds.bbsName,'somebbs',41) - - AstrCopy(cmds.sysopName,tempUser.name,31) - - StringF(mybbsLoc,'\s','someplace') - - sopt:=NEW sopt - - sopt.leftEdge:=0 - sopt.topEdge:=0 - sopt.width:=640 - sopt.height:=256 - sopt.bitPlanes:=3 - - readToolType(TOOLTYPE_NODE,node,'SCREENS',tempstr) - AstrCopy(sopt.nodeScreens,tempstr) - - sopt.statBar:=0 - - sopt.toggles[TOGGLES_RED1]:=FALSE - sopt.toggles[TOGGLES_MULTICOM]:=FALSE - sopt.iconify:=FALSE - - cmds.numConf:=4 - - cmds.openingBaud:=115200 - cmds.taskPri:=240 - RETURN - ENDIF - masterMsg.command:=SV_START WHILE((port:=FindPort('AE.Master'))=NIL) AND (SetSignal(0,SIGBREAKF_CTRL_C)=0) Delay(25) @@ -15153,12 +15126,12 @@ PROC ftpAuth(userName:PTR TO CHAR,password:PTR TO CHAR) IF StriCmp(userName,loggedOnUser.name,31)=FALSE THEN RETURN FALSE ENDPROC checkUserPassword(loggedOnUser,loggedOnUserMisc,password) -PROC ftpFindFile(filename:PTR TO CHAR,outFullFilename:PTR TO CHAR) +PROC ftpFindFile(filename:PTR TO CHAR,subdirs:PTR TO CHAR, outFullFilename:PTR TO CHAR) DEF fileList:PTR TO stdlist DEF fileItem:PTR TO flagFileItem fileList:=NEW fileList.stdlist(1) - checkForFileSize(filename,-1,NIL,NIL,fileList,0) + checkForFileSize(filename,subdirs,-1,NIL,NIL,fileList,0) IF fileList.count()>0 fileItem:=fileList.item(0) StrCopy(outFullFilename,fileItem.fileName) @@ -15755,7 +15728,7 @@ PROC checklist(lfnames: PTR TO stdlist, sizeList:PTR TO stdlist, freeDFlagList:P FOR i:=0 TO lfnames.count()-1 item:=lfnames.item(i) IF(StrLen(item.fileName)>0) - status:=checkForFileSize(item.fileName,item.confNum,sizeList,freeDFlagList,clrfinal,0) + status:=checkForFileSize(item.fileName,'',item.confNum,sizeList,freeDFlagList,clrfinal,0) IF((status=RESULT_SIGNALLED) OR (status=RESULT_PRIVATE)) THEN RETURN RESULT_SUCCESS ENDIF ENDFOR @@ -19911,7 +19884,7 @@ arestart: ENDFOR ENDIF - status:=checkForFileSize(tempStr,currentConf,tfsizes,freeDFlags,finalList,0) + status:=checkForFileSize(tempStr,'',currentConf,tfsizes,freeDFlags,finalList,0) IF((status=RESULT_FAILURE) OR (status=RESULT_SIGNALLED) OR (status=RESULT_PRIVATE)) Throw(ERR_EXCEPT,RESULT_SUCCESS) ENDIF @@ -22297,6 +22270,65 @@ PROC resizeConfDB(confnum,msgBaseNum,newSize) END cb2 ENDPROC +PROC makeFtpDirCache(confLoc:PTR TO CHAR, confnum, dirnum, dlpath:PTR TO CHAR, subdir:PTR TO CHAR) + DEF dirCache[255]:STRING + DEF fh + DEF lock + DEF f_info: PTR TO fileinfoblock + DEF stat=0 + DEF tempstr[255]:STRING + DEF tempstr2[255]:STRING + DEF i,s,t + + WriteF('dlpath=\s\n',dlpath) + + f_info:=AllocDosObject(DOS_FIB,NIL) + IF(f_info)=NIL + RETURN + ENDIF + + lock:=Lock(dlpath,ACCESS_READ) + IF(lock)=0 + FreeDosObject(DOS_FIB,f_info) + RETURN + ENDIF + + IF(Examine(lock,f_info))=0 + UnLock(lock) + FreeDosObject(DOS_FIB,f_info) + RETURN + ENDIF + + StringF(dirCache,'\sDirCaches/Conf\dDir\d\s\s',confLoc,confnum,dirnum,IF StrLen(subdir)>0 THEN '_' ELSE '',subdir) + fh:=Open(dirCache,MODE_NEWFILE) + IF fh<>0 + IF(f_info.direntrytype>0) + WHILE(((ExNext(lock,f_info))<>0)) + IF (StrCmp('.dircache',f_info.filename)=FALSE) + t:=dateStampToDateTime(f_info.datestamp) + s:=f_info.size + IF (f_info.direntrytype>0) + IF s=0 + StringF(tempstr,'\s\s/',dlpath,f_info.filename) + StringF(tempstr2,'\s\s\s',subdir,IF StrLen(subdir)>0 THEN '_' ELSE '',f_info.filename) + makeFtpDirCache(confLoc,confnum,dirnum,tempstr,tempstr2) + s:=-1 + ENDIF + ENDIF + StringF(tempstr,'\z\h[8] \z\h[8] \s\n',t,s,f_info.filename) + WriteF(tempstr) + Write(fh,tempstr,StrLen(tempstr)) + ENDIF + ENDWHILE + ENDIF + Close(fh) + ENDIF + + UnLock(lock) + FreeDosObject(DOS_FIB,f_info) + +ENDPROC + PROC conferenceMaintenance() DEF conf,flag=0,ch,size,n,f,m DEF tempstr[255]:STRING @@ -22309,6 +22341,7 @@ PROC conferenceMaintenance() DEF lock,fh DEF num,num2,match DEF msgBase + DEF flg2 conf:=1 msgBase:=1 @@ -22507,9 +22540,15 @@ PROC conferenceMaintenance() ENDWHILE IF match=FALSE - StringF(tempstr,'LIST FILES LFORMAT %N "\s" >"\sDirCaches/Conf\dDir\d"',path,confLoc,conf,num-1) - Execute(tempstr,0,0) - StringF(tempstr,'COPY "\sDirCaches/Conf\dDir\d" ram:DirCaches/',confLoc,conf,num-1) + + IF checkToolTypeExists(TOOLTYPE_CONF,conf,'FTP_NO_DIRLIST') + makeFtpDirCache(confLoc,conf,num-1,path,'') + ELSE + StringF(tempstr,'LIST FILES LFORMAT %N "\s" >"\sDirCaches/Conf\dDir\d"',path,confLoc,conf,num-1) + Execute(tempstr,0,0) + ENDIF + + StringF(tempstr,'COPY "\sDirCaches/Conf\dDir\d#?" ram:DirCaches/',confLoc,conf,num-1) Execute(tempstr,0,0) ENDIF StringF(path,'DLPATH.\d',num++) @@ -28279,6 +28318,7 @@ PROC processFtpLogon() StrCopy(sendStr,'430 That account has problems\b\n') telnetSend(sendStr,EstrLen(sendStr)) state:=STATE_LOGGING_OFF + RETURN ENDIF IF ftpAuth(userName,password)=FALSE @@ -28436,6 +28476,7 @@ PROC processFtpLoggedOnUser() DEF cnums:PTR TO stdlist DEF confULBlock:PTR TO stringlist DEF ftpData:PTR TO ftpData + DEF res setEnvStat(ENV_IDLE) @@ -28527,7 +28568,14 @@ PROC processFtpLoggedOnUser() ENDIF ENDFOR - IF readToolType(TOOLTYPE_XFERLIB,'FTP','FTPHOST',tempstr)=FALSE + res:=FALSE + FOR i:=0 TO xprLib.count()-1 + IF(StriCmp(xprLib.item(i),'FTP')) + IF readToolType(TOOLTYPE_XFERLIB,i,'FTPHOST',tempstr) THEN res:=TRUE + ENDIF + ENDFOR + + IF res=FALSE IF readToolType(TOOLTYPE_BBSCONFIG,'','FTPHOST',tempstr)=FALSE StrCopy(tempstr,'127.0.0.1') ENDIF @@ -28805,7 +28853,7 @@ PROC checkPassword() purgeLineEnd() IF(lfh:=Open('NIL:',MODE_OLDFILE))<>0 StringF(tempStr,'\sUtils/uucico -D \s -U \d -Getty -xx',cmds.bbsLoc,cmds.serDev,cmds.serDevUnit) - Execute(tempStr,IF debug THEN 0 ELSE lfh,IF debug THEN 0 ELSE lfh) + Execute(tempStr,lfh,lfh) Close(lfh) ENDIF purgeLineStart() @@ -30881,7 +30929,7 @@ PROC main() HANDLE IF StrLen(arg1)>0 node:=Val(arg1) ELSE - debug:=TRUE + Raise(ERR_NODEPARAM) ENDIF stripAnsi(0,0,1,0,ansi) @@ -31360,7 +31408,7 @@ PROC main() HANDLE SetTaskPri(FindTask(0),cmds.taskPri) ENDIF - IF (debug) OR (sopt.iconify=FALSE) THEN openExpressScreen() + IF (sopt.iconify=FALSE) THEN openExpressScreen() formatLongDateTime(getSystemTime(),tempstr) StringF(tempstr2,'####### BBS Node \d started on \s #######\n',node,tempstr) @@ -31537,6 +31585,8 @@ PROC main() HANDLE debugLog(LOG_ERROR,tempstr) CASE ERR_FDSRANGE debugLog(LOG_ERROR,'FDS Range error') + CASE ERR_NODEPARAM + WriteF('Express should not be launched manually\n.') CASE "NIL" StringF(tempstr,'NIL pointer error at line \d',exceptioninfo) debugLog(LOG_ERROR,tempstr) diff --git a/ftpd.e b/ftpd.e index 00544ca..3dd6ccc 100644 --- a/ftpd.e +++ b/ftpd.e @@ -337,11 +337,11 @@ PROC getPath(ftpData:PTR TO ftpData,confNum,subDir:PTR TO CHAR,outpath) gp(confNum,subDir,outpath) ENDPROC -PROC findFile(ftpData:PTR TO ftpData,fileName,outpath) +PROC findFile(ftpData:PTR TO ftpData,fileName,subDirs,outpath) DEF ff ff:=ftpData.findFile - ff(fileName,outpath) + ff(fileName,subDirs,outpath) ENDPROC PROC aePuts(ftpData:PTR TO ftpData, s:PTR TO CHAR) @@ -497,12 +497,8 @@ PROC getFileName(ftpData:PTR TO ftpData, filename:PTR TO CHAR,outFilename:PTR TO item:=fileList.item(i) IF StriCmp(FilePart(item.fileName),filename) THEN StrCopy(outFilename,item.fileName) ENDFOR - ELSEIF StrLen(ftpData.subDirPath)>0 - StrCopy(outFilename,ftpData.subDirPath) - checkPathSlash(outFilename) - StrAdd(outFilename,filename) ELSEIF ftpData.findFile<>NIL - findFile(ftpData,filename,outFilename) + findFile(ftpData,filename,ftpData.subDirPath,outFilename) ENDIF ENDPROC @@ -840,13 +836,10 @@ PROC downloadDir(sb,data_c, ftpData:PTR TO ftpData,cmdType) ENDPROC TRUE PROC fullDir(sb,data_c, ftpData:PTR TO ftpData,cmdType) - DEF fileNames:PTR TO stringlist - DEF fileSizes:PTR TO stdlist - DEF fileDates:PTR TO stdlist - DEF filedate:datestamp + DEF i DEF tempstr[255]:STRING DEF dirline[255]:STRING - DEF i + DEF filedate:datestamp IF (ftpData.currentConf=0) dateTimeToDateStamp(getSystemTime(),filedate) @@ -870,84 +863,144 @@ PROC fullDir(sb,data_c, ftpData:PTR TO ftpData,cmdType) callersLog(ftpData,'\tDirectory Scan via ftp') ENDIF - fileNames,fileSizes,fileDates:=makeConfFileList(ftpData) - - FOR i:=0 TO fileNames.count()-1 - - dateTimeToDateStamp(fileDates.item(i),filedate) - - IF fileSizes.item(i)=-1 - IF cmdType=CMDTYPE_MLSD - formatFileDate2(filedate,tempstr) - StringF(dirline,'Type=dir;Modify=\s;Perm=r; \s\b\n',tempstr,FilePart(fileNames.item(i))) - ELSEIF cmdType=CMDTYPE_NLST - StrCopy(dirline,fileNames.item(i)) - ELSE /*cmdType=CMDTYPE_LIST as default*/ - formatFileDate(filedate,tempstr) - StringF(dirline,'dr--r--r-- 1 root root \r\d[10] \s \s\b\n',0,tempstr,FilePart(fileNames.item(i))) - ENDIF - ELSE - IF cmdType=CMDTYPE_MLSD - formatFileDate2(filedate,tempstr) - StringF(dirline,'Type=file;Size=\d;Modify=\s;Perm=r; \s\b\n',fileSizes.item(i),tempstr,FilePart(fileNames.item(i))) - ELSEIF cmdType=CMDTYPE_NLST - StrCopy(dirline,fileNames.item(i)) - ELSE /*cmdType=CMDTYPE_LIST as default*/ - formatFileDate(filedate,tempstr) - StringF(dirline,'-r--r--r-- 1 root root \r\d[10] \s \s\b\n',fileSizes.item(i),tempstr,FilePart(fileNames.item(i))) - ENDIF + makeConfFileList(ftpData,cmdType,sb,data_c) + +ENDPROC + +PROC sendFileDetails(filename:PTR TO CHAR, fileSize, fileDate, cmdType, sb, data_c, output) + DEF filedatets:datestamp + DEF tempstr[255]:STRING + DEF dirline[255]:STRING + + dateTimeToDateStamp(fileDate,filedatets) + + IF fileSize=-1 + IF cmdType=CMDTYPE_MLSD + formatFileDate2(filedatets,tempstr) + StringF(dirline,'Type=dir;Modify=\s;Perm=r; \s\b\n',tempstr,FilePart(filename)) + ELSEIF cmdType=CMDTYPE_NLST + StrCopy(dirline,filename) + ELSE /*cmdType=CMDTYPE_LIST as default*/ + formatFileDate(filedatets,tempstr) + StringF(dirline,'dr--r--r-- 1 root root \r\d[10] \s \s\b\n',0,tempstr,FilePart(filename)) ENDIF + ELSE + IF cmdType=CMDTYPE_MLSD + formatFileDate2(filedatets,tempstr) + StringF(dirline,'Type=file;Size=\d;Modify=\s;Perm=r; \s\b\n',fileSize,tempstr,FilePart(filename)) + ELSEIF cmdType=CMDTYPE_NLST + StrCopy(dirline,filename) + ELSE /*cmdType=CMDTYPE_LIST as default*/ + formatFileDate(filedatets,tempstr) + StringF(dirline,'-r--r--r-- 1 root root \r\d[10] \s \s\b\n',fileSize,tempstr,FilePart(filename)) + ENDIF + ENDIF + IF output + IF ((EstrLen(output)+EstrLen(dirline))>StrMax(output)) + writeLineEx(sb,data_c, output) + StrCopy(output,'') + ENDIF + StrAdd(output,dirline) + ELSE writeLineEx(sb,data_c, dirline) - ENDFOR - - END fileNames - END fileSizes - END fileDates + ENDIF ENDPROC -PROC makeList(path:PTR TO CHAR, fib:PTR TO fileinfoblock, fileNames:PTR TO stringlist, fileSizes:PTR TO stdlist,fileDates:PTR TO stdlist, startDate) +PROC makeList(path:PTR TO CHAR,dirCache:PTR TO CHAR,fib:PTR TO fileinfoblock, startDate, cmdType, sb, data_c) DEF fLock - DEF d + DEF d,fh + DEF dirLine[40]:STRING + DEF tmp[10]:STRING + DEF c=FALSE + DEF mem,fs,p,cnt + DEF output + + output:=String(10000) + + fs:=FileLength(dirCache) + IF fs>0 + /*IF (mem:=New(fs+1)) + fh:=Open(dirCache,MODE_OLDFILE) + Read(fh,mem,fs) + p:=0 + WHILE (p=0 + StrCopy(dirLine,mem+p,cnt) + p:=p+cnt+1 + ELSE + StrCopy(dirLine,mem+p) + p:=fs + ENDIF + IF StrLen(dirLine)>18 + c:=TRUE + StrCopy(tmp,'$') + StrAdd(tmp,dirLine,8) + d:=Val(tmp) + IF d>=startDate + StrCopy(tmp,'$') + StrAdd(tmp,dirLine+9,8) + sendFileDetails(dirLine+18,Val(tmp),d,cmdType, sb, data_c, output) + ENDIF + ENDIF + ENDWHILE + Close(fh) + Dispose(mem) + ELSE*/ + fh:=Open(dirCache,MODE_OLDFILE) + IF fh<>0 + WHILE(Fgets(fh,dirLine,40)<>NIL) + IF StrLen(dirLine)>18 + c:=TRUE + StrCopy(tmp,'$') + StrAdd(tmp,dirLine,8) + d:=Val(tmp) + IF d>=startDate + StrCopy(tmp,'$') + StrAdd(tmp,dirLine+9,8) + sendFileDetails(dirLine+18,Val(tmp),d,cmdType, sb, data_c, output) + ENDIF + ENDIF + ENDWHILE + Close(fh) + ENDIF + //ENDIF + IF (output ANDALSO (EstrLen(output)>0)) + writeLineEx(sb,data_c, output) + ENDIF + IF c + DisposeLink(output) + RETURN + ENDIF + + ENDIF + IF((fLock:=Lock(path,ACCESS_READ))) IF((Examine(fLock,fib))) IF(fib.direntrytype > 0) WHILE(ExNext(fLock,fib)) - d:=dateStampToDateTime(fib.datestamp) - IF d>=startDate - fileNames.add(fib.filename) - IF fib.direntrytype>0 THEN fileSizes.add(-1) ELSE fileSizes.add(fib.size) - fileDates.add(d) + IF StrCmp(fib.filename,'.dircache')=FALSE + d:=dateStampToDateTime(fib.datestamp) + IF d>=startDate + sendFileDetails(fib.filename,IF fib.direntrytype>0 THEN -1 ELSE fib.size,d,cmdType, sb, data_c, output) + ENDIF ENDIF ENDWHILE ENDIF ENDIF UnLock(fLock) ENDIF + IF (output ANDALSO (EstrLen(output)>0)) THEN writeLineEx(sb,data_c, output) + DisposeLink(output) ENDPROC -PROC makeFtpListFromSubDir(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, fileSizes:PTR TO stdlist,fileDates:PTR TO stdlist, startDate) +PROC makeFtpListFromDlDirs(ftpData:PTR TO ftpData, startDate, cmdType, sb, data_c) DEF path[255]:STRING + DEF dirCache[255]:STRING DEF fib:PTR TO fileinfoblock - - StrCopy(path,ftpData.subDirPath) - - IF((fib:=AllocDosObject(DOS_FIB,NIL)))=NIL - RETURN FALSE - ENDIF - - checkPathSlash(path) - - makeList(path,fib, fileNames,fileSizes,fileDates,startDate) - - FreeDosObject(DOS_FIB,fib) -ENDPROC - -PROC makeFtpListFromDlDirs(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, fileSizes:PTR TO stdlist,fileDates:PTR TO stdlist, startDate) - DEF path[255]:STRING - DEF fib:PTR TO fileinfoblock - DEF dirNum + DEF dirNum,i IF((fib:=AllocDosObject(DOS_FIB,NIL)))=NIL RETURN FALSE @@ -957,8 +1010,15 @@ PROC makeFtpListFromDlDirs(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, StringF(path,'DLPATH.\d',dirNum++) WHILE(readToolType(TOOLTYPE_CONF,ftpData.confNums.item(ftpData.currentConf-1),path,path)) checkPathSlash(path) + IF StrLen(ftpData.subDirPath) + StrAdd(path,ftpData.subDirPath) + checkPathSlash(path) + ENDIF - makeList(path,fib, fileNames,fileSizes,fileDates,startDate) + StringF(dirCache,'RAM:DirCaches/Conf\dDir\d\s\s',ftpData.currentConf,dirNum-1,IF StrLen(ftpData.subDirPath)>0 THEN '_' ELSE '', ftpData.subDirPath) + FOR i:=14 TO StrLen(dirCache)-1 DO IF dirCache[i]="/" THEN dirCache[i]:="_" + + makeList(path,dirCache,fib,startDate,cmdType,sb,data_c) StringF(path,'DLPATH.\d',dirNum++) ENDWHILE @@ -966,7 +1026,7 @@ PROC makeFtpListFromDlDirs(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, ENDPROC -PROC makeFtpListFromDirList(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, fileSizes:PTR TO stdlist,fileDates:PTR TO stdlist, startDate) +PROC makeFtpListFromDirList(ftpData:PTR TO ftpData, startDate, cmdType, sb, data_c) DEF dtStr[20]:STRING DEF sizeStr[20]:STRING DEF dtcomp1,dtcomp2 @@ -974,9 +1034,12 @@ PROC makeFtpListFromDirList(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, DEF dirFile[255]:STRING DEF tempstr[255]:STRING DEF fh,t,sz,m,d,y + DEF output DEF maxDirs + output:=String(10000) + maxDirs:=readToolTypeInt(TOOLTYPE_CONF,ftpData.confNums.item(ftpData.currentConf-1),'NDIRS') formatLongDate(startDate,dtStr) @@ -1040,11 +1103,8 @@ PROC makeFtpListFromDirList(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, IF (InStr(sizeStr,'M')>=0) THEN sz:=Mul(sz,1048576) spPos:=InStr(tempstr,' ') - SetStr(tempstr,spPos) - - fileNames.add(tempstr) - fileSizes.add(sz) - fileDates.add(encodeDate(m,d,y)) + SetStr(tempstr,spPos) + sendFileDetails(tempstr,sz,encodeDate(m,d,y),cmdType, sb, data_c, output) ENDIF ENDIF ENDIF @@ -1056,12 +1116,11 @@ PROC makeFtpListFromDirList(ftpData:PTR TO ftpData, fileNames:PTR TO stringlist, fh:=Open(dirFile,MODE_OLDFILE) ENDIF ENDWHILE + IF (output ANDALSO (EstrLen(output)>0)) THEN writeLineEx(sb,data_c, output) + DisposeLink(output) ENDPROC -PROC makeConfFileList(ftpData:PTR TO ftpData) - DEF fileNames:PTR TO stringlist - DEF fileSizes:PTR TO stdlist - DEF fileDates:PTR TO stdlist +PROC makeConfFileList(ftpData:PTR TO ftpData, cmdType, sb, data_c) DEF startDate,dayOffset dayOffset:=readToolTypeInt(TOOLTYPE_CONF,ftpData.confNums.item(ftpData.currentConf-1),'FTP_DIR_DAYS') @@ -1070,20 +1129,17 @@ PROC makeConfFileList(ftpData:PTR TO ftpData) startDate:=getSystemDate()-dayOffset - fileNames:=NEW fileNames.stringlist(256) - fileSizes:=NEW fileSizes.stdlist(256) - fileDates:=NEW fileDates.stdlist(256) IF ftpData.currentConf>0 IF (StrLen(ftpData.subDirPath)>0) - makeFtpListFromSubDir(ftpData,fileNames,fileSizes,fileDates,startDate) + makeFtpListFromDlDirs(ftpData,startDate,cmdType, sb, data_c) ELSEIF checkToolTypeExists(TOOLTYPE_CONF,ftpData.confNums.item(ftpData.currentConf-1),'FTP_NO_DIRLIST') - makeFtpListFromDlDirs(ftpData,fileNames,fileSizes,fileDates,startDate) + makeFtpListFromDlDirs(ftpData,startDate,cmdType, sb, data_c) ELSE - makeFtpListFromDirList(ftpData,fileNames,fileSizes,fileDates,startDate) + makeFtpListFromDirList(ftpData,startDate,cmdType, sb, data_c) ENDIF ENDIF -ENDPROC fileNames,fileSizes,fileDates +ENDPROC PROC cmdUser(sb,ftp_c,params:PTR TO CHAR,ftpData:PTR TO ftpData) ->WriteF('user=\s\b\n',params) @@ -1108,10 +1164,11 @@ PROC cmdPwd(sb,ftp_c,ftpData:PTR TO ftpData) StrCopy(sendStr, '257 "/" is current directory.\b\n') writeLineEx(sb,ftp_c,sendStr) ELSE + StringF(dirName,'/\r\z\d[3]-\s',ftpData.currentConf,ftpData.confNames.item(ftpData.currentConf-1)) IF StrLen(ftpData.subDirPath)>0 StrAdd(dirName,'/') - StrAdd(dirName,FilePart(ftpData.subDirPath)) + StrAdd(dirName,ftpData.subDirPath) ENDIF StringF(sendStr, '257 "\s" is current directory.\b\n',dirName) writeLineEx(sb,ftp_c,sendStr) @@ -1142,7 +1199,7 @@ PROC cmdCwd(sb,ftp_c,ftpData:PTR TO ftpData,path:PTR TO CHAR) DEF sendStr[255]:STRING DEF temp[255]:STRING DEF outFileName[255]:STRING - DEF stat,i + DEF stat,i,p IF ftpData.mode=MODE_FULLSERVER IF StrCmp(path,'/') @@ -1156,7 +1213,13 @@ PROC cmdCwd(sb,ftp_c,ftpData:PTR TO ftpData,path:PTR TO CHAR) writeLineEx(sb,ftp_c,sendStr) IF StrLen(ftpData.subDirPath)>0 - StrCopy(ftpData.subDirPath,'') + IF InStr(ftpData.subDirPath,'/')>=0 + p:=StrLen(ftpData.subDirPath)-1 + WHILE ftpData.subDirPath[p]<>"/" DO p-- + SetStr(ftpData.subDirPath,p) + ELSE + StrCopy(ftpData.subDirPath,'') + ENDIF ELSE ftpData.currentConf:=0 ENDIF @@ -1191,33 +1254,39 @@ PROC cmdCwd(sb,ftp_c,ftpData:PTR TO ftpData,path:PTR TO CHAR) FOR i:=0 TO ftpData.confNames.count()-1 StringF(temp,'/\r\z\d[3]-\s/',i+1,ftpData.confNames.item(i)) - IF StrCmp(temp,path,StrLen(temp)) THEN stat:=i + IF StrCmp(temp,path,StrLen(temp)) + stat:=i + StrCopy(path,path+StrLen(temp)) + ENDIF ENDFOR IF stat=-1 IF ftpData.currentConf=0 FOR i:=0 TO ftpData.confNames.count()-1 StringF(temp,'\r\z\d[3]-\s/',i+1,ftpData.confNames.item(i)) - IF StrCmp(temp,path,StrLen(temp)) THEN stat:=i + IF StrCmp(temp,path,StrLen(temp)) + stat:=i + StrCopy(path,path+StrLen(temp)) + ENDIF ENDFOR ENDIF ENDIF IF stat>=0 ftpData.currentConf:=stat+1 - - getPath(ftpData,ftpData.confNums.item(ftpData.currentConf-1),FilePart(path),outFileName) + getPath(ftpData,ftpData.confNums.item(ftpData.currentConf-1),path,outFileName) IF StrLen(outFileName)>0 - StrCopy(ftpData.subDirPath,outFileName) + StrCopy(ftpData.subDirPath,path) ELSE stat:=-1 ENDIF ELSE IF ftpData.currentConf<>0 + IF StrLen(ftpData.subDirPath)>0 THEN StringF(path,'\s/\s',ftpData.subDirPath,path) getPath(ftpData,ftpData.confNums.item(ftpData.currentConf-1),path,outFileName) IF StrLen(outFileName)>0 + StrCopy(ftpData.subDirPath,path) stat:=1 - StrCopy(ftpData.subDirPath,outFileName) ENDIF ENDIF ENDIF @@ -2071,7 +2140,7 @@ EXPORT PROC ftpServerMode(ftpData:PTR TO ftpData, ftp_c,ftpHost:PTR TO CHAR,uplo ftpData.workingPath:=String(255) ftpData.uploadPath:=String(255) ftpData.hostName:=String(255) - ftpData.subDirPath:=String(255) + ftpData.subDirPath:=String(1000) ftpData.dataPorts:=ftpDataPorts ftpData.ftpDir:={fullDir} ftpData.currentConf:=0 diff --git a/sha256.e b/sha256.e index 807f4ce..e19a2d9 100644 --- a/sha256.e +++ b/sha256.e @@ -1,5 +1,8 @@ OPT MODULE +CONST SHA1_DIGEST_SIZE=20 +CONST SIZE_OF_SHA_1_CHUNK=64 + CONST SIZE_OF_SHA_256_HASH=32 CONST SIZE_OF_SHA_256_CHUNK=64 CONST TOTAL_LEN_LEN=8 @@ -13,6 +16,12 @@ OBJECT sha_256 h[8]:ARRAY OF LONG ENDOBJECT +OBJECT sha1_ctx + state[5]:ARRAY OF LONG + count[2]:ARRAY OF LONG + buffer[SIZE_OF_SHA_1_CHUNK]:ARRAY OF CHAR +ENDOBJECT + /* * Comments from pseudo-code at https://en.wikipedia.org/wiki/SHA-2 are reproduced here. * When useful for clarification, portions of the pseudo-code are reproduced here too. @@ -30,6 +39,11 @@ PROC right_rot(value, count) ROR.L D1,D0 ENDPROC D0 +PROC left_rot(value, count) + MOVE.L value,D0 + MOVE.L count,D1 + ROL.L D1,D0 +ENDPROC D0 /* * @brief Update a hash value under calculation with a new chunk of data. * @param h Pointer to the first hash item, of a total of eight. @@ -112,9 +126,192 @@ PROC consume_chunk(h:PTR TO LONG, p:PTR TO CHAR) FOR i:=0 TO 7 DO h[i]:=h[i]+ah[i] ENDPROC -/* - * Public functions. See header file for documentation. - */ +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#define blk0(i) block[i] +#define blk(i) (block[i AND 15]:= left_rot(Eor(Eor(Eor(block[(i+13) AND 15],block[(i+8) AND 15]),block[(i+2) AND 15]),block[i AND 15]),1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ + +#define r0(v, w, x, y, z, i) z:=z+Eor(w AND Eor(x,y),y)+blk0(i)+$5a827999+left_rot(v,5) +#define r1(v, w, x, y, z, i) z:=z+Eor(w AND Eor(x,y),y)+blk(i)+$5a827999+left_rot(v,5) +#define r2(v, w, x, y, z, i) z:=z+Eor(Eor(w,x),y)+blk(i)+$6ed9eba1+left_rot(v,5) +#define r3(v, w, x, y, z, i) z:=z+(((w OR x) AND y) OR (w AND x))+blk(i)+$8f1bbcdc+left_rot(v,5) +#define r4(v, w, x, y, z, i) z:=z+Eor(Eor(w,x),y)+blk(i)+$ca62c1d6+left_rot(v,5) + +PROC sha1_transform(state:PTR TO LONG,buffer:PTR TO CHAR) + DEF a,b,c,d,e + DEF block[16]:ARRAY OF LONG + + CopyMem(buffer,block,64) + + /* Copy context->state[] to working vars */ + 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);b:=left_rot(b,30) + r0(e, a, b, c, d, 1);a:=left_rot(a,30) + r0(d, e, a, b, c, 2);e:=left_rot(e,30) + r0(c, d, e, a, b, 3);d:=left_rot(d,30) + r0(b, c, d, e, a, 4);c:=left_rot(c,30) + r0(a, b, c, d, e, 5);b:=left_rot(b,30) + r0(e, a, b, c, d, 6);a:=left_rot(a,30) + r0(d, e, a, b, c, 7);e:=left_rot(e,30) + r0(c, d, e, a, b, 8);d:=left_rot(d,30) + r0(b, c, d, e, a, 9);c:=left_rot(c,30) + r0(a, b, c, d, e, 10);b:=left_rot(b,30) + r0(e, a, b, c, d, 11);a:=left_rot(a,30) + r0(d, e, a, b, c, 12);e:=left_rot(e,30) + r0(c, d, e, a, b, 13);d:=left_rot(d,30) + r0(b, c, d, e, a, 14);c:=left_rot(c,30) + r0(a, b, c, d, e, 15);b:=left_rot(b,30) + r1(e, a, b, c, d, 16);a:=left_rot(a,30) + r1(d, e, a, b, c, 17);e:=left_rot(e,30) + r1(c, d, e, a, b, 18);d:=left_rot(d,30) + r1(b, c, d, e, a, 19);c:=left_rot(c,30) + r2(a, b, c, d, e, 20);b:=left_rot(b,30) + r2(e, a, b, c, d, 21);a:=left_rot(a,30) + r2(d, e, a, b, c, 22);e:=left_rot(e,30) + r2(c, d, e, a, b, 23);d:=left_rot(d,30) + r2(b, c, d, e, a, 24);c:=left_rot(c,30) + r2(a, b, c, d, e, 25);b:=left_rot(b,30) + r2(e, a, b, c, d, 26);a:=left_rot(a,30) + r2(d, e, a, b, c, 27);e:=left_rot(e,30) + r2(c, d, e, a, b, 28);d:=left_rot(d,30) + r2(b, c, d, e, a, 29);c:=left_rot(c,30) + r2(a, b, c, d, e, 30);b:=left_rot(b,30) + r2(e, a, b, c, d, 31);a:=left_rot(a,30) + r2(d, e, a, b, c, 32);e:=left_rot(e,30) + r2(c, d, e, a, b, 33);d:=left_rot(d,30) + r2(b, c, d, e, a, 34);c:=left_rot(c,30) + r2(a, b, c, d, e, 35);b:=left_rot(b,30) + r2(e, a, b, c, d, 36);a:=left_rot(a,30) + r2(d, e, a, b, c, 37);e:=left_rot(e,30) + r2(c, d, e, a, b, 38);d:=left_rot(d,30) + r2(b, c, d, e, a, 39);c:=left_rot(c,30) + r3(a, b, c, d, e, 40);b:=left_rot(b,30) + r3(e, a, b, c, d, 41);a:=left_rot(a,30) + r3(d, e, a, b, c, 42);e:=left_rot(e,30) + r3(c, d, e, a, b, 43);d:=left_rot(d,30) + r3(b, c, d, e, a, 44);c:=left_rot(c,30) + r3(a, b, c, d, e, 45);b:=left_rot(b,30) + r3(e, a, b, c, d, 46);a:=left_rot(a,30) + r3(d, e, a, b, c, 47);e:=left_rot(e,30) + r3(c, d, e, a, b, 48);d:=left_rot(d,30) + r3(b, c, d, e, a, 49);c:=left_rot(c,30) + r3(a, b, c, d, e, 50);b:=left_rot(b,30) + r3(e, a, b, c, d, 51);a:=left_rot(a,30) + r3(d, e, a, b, c, 52);e:=left_rot(e,30) + r3(c, d, e, a, b, 53);d:=left_rot(d,30) + r3(b, c, d, e, a, 54);c:=left_rot(c,30) + r3(a, b, c, d, e, 55);b:=left_rot(b,30) + r3(e, a, b, c, d, 56);a:=left_rot(a,30) + r3(d, e, a, b, c, 57);e:=left_rot(e,30) + r3(c, d, e, a, b, 58);d:=left_rot(d,30) + r3(b, c, d, e, a, 59);c:=left_rot(c,30) + r4(a, b, c, d, e, 60);b:=left_rot(b,30) + r4(e, a, b, c, d, 61);a:=left_rot(a,30) + r4(d, e, a, b, c, 62);e:=left_rot(e,30) + r4(c, d, e, a, b, 63);d:=left_rot(d,30) + r4(b, c, d, e, a, 64);c:=left_rot(c,30) + r4(a, b, c, d, e, 65);b:=left_rot(b,30) + r4(e, a, b, c, d, 66);a:=left_rot(a,30) + r4(d, e, a, b, c, 67);e:=left_rot(e,30) + r4(c, d, e, a, b, 68);d:=left_rot(d,30) + r4(b, c, d, e, a, 69);c:=left_rot(c,30) + r4(a, b, c, d, e, 70);b:=left_rot(b,30) + r4(e, a, b, c, d, 71);a:=left_rot(a,30) + r4(d, e, a, b, c, 72);e:=left_rot(e,30) + r4(c, d, e, a, b, 73);d:=left_rot(d,30) + r4(b, c, d, e, a, 74);c:=left_rot(c,30) + r4(a, b, c, d, e, 75);b:=left_rot(b,30) + r4(e, a, b, c, d, 76);a:=left_rot(a,30) + r4(d, e, a, b, c, 77);e:=left_rot(e,30) + r4(c, d, e, a, b, 78);d:=left_rot(d,30) + r4(b, c, d, e, a, 79);c:=left_rot(c,30) + + /* Add the working vars back into context.state[] */ + state[0]:=state[0]+a + state[1]:=state[1]+b + state[2]:=state[2]+c + state[3]:=state[3]+d + state[4]:=state[4]+e + + /* Wipe variables */ + a:=0 + b:=0 + c:=0 + d:=0 + e:=0 + +ENDPROC + +PROC sha1_init(context:PTR TO sha1_ctx) + /* SHA1 initialization constants */ + context.state[0]:=$67452301 + context.state[1]:=$efcdab89 + context.state[2]:=$98badcfe + context.state[3]:=$10325476 + context.state[4]:=$c3d2e1f0 + context.count[0]:=0 + context.count[1]:=0 +ENDPROC + +PROC sha1_update(context:PTR TO sha1_ctx, p,len) + DEF data:PTR TO CHAR + DEF i,j + data:=p + + j:=(Shr(context.count[0],3)) AND 63 + context.count[0]:=context.count[0] + Shl(len,3) + IF (context.count[0] < Shl(len,3)) + context.count[1]:=context.count[1]+1 + ENDIF + context.count[1]:=context.count[1] + Lsr(len,29) + IF ((j + len) > 63) + i:=64 - j + CopyMem(data, context.buffer+j, i) + sha1_transform(context.state, context.buffer) + WHILE ((i+63)= 4 THEN 0 ELSE 1)],((3 - (i AND 3)) * 8))) AND 255) + ENDFOR + sha1_update(context, [128]:CHAR, 1) + WHILE ((context.count[0] AND 504) <> 448) + sha1_update(context, [0]:CHAR, 1) + ENDWHILE + sha1_update(context, finalcount, 8) /* Should cause SHA1_Transform */ + FOR i:=0 TO SHA1_DIGEST_SIZE-1 + digest[i]:=((Shr(context.state[Shr(i,2)],((3 - (i AND 3)) * 8))) AND 255) + ENDFOR + + /* Wipe variables */ + i:=0 + MemFill(context.buffer,64,0) + MemFill(context.state,20,0) + MemFill(context.count,8,0) + MemFill(finalcount,8,0) /* SWR */ + + sha1_transform(context.state, context.buffer); +ENDPROC PROC sha_256_init(sha_256:PTR TO sha_256, hash:PTR TO CHAR) sha_256.hash:=hash @@ -215,6 +412,16 @@ PROC sha_256_close(sha_256:PTR TO sha_256) ENDPROC sha_256.hash +EXPORT PROC calc_sha_1(hash:PTR TO CHAR, input, len) + DEF context:PTR TO sha1_ctx + + NEW context + sha1_init(context) + sha1_update(context, input, len) + sha1_final(hash,context) + END context +ENDPROC + EXPORT PROC calc_sha_256(hash:PTR TO CHAR, input, len) DEF sha_256:PTR TO sha_256 @@ -254,10 +461,37 @@ kdata: LONG $428a2f98, $71374491, $b5c0fbcf, $e9b5dba5, $3956c25b, $59f111f1, $ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* - * HMAC-SHA-1 (from RFC 2202). - */ -PROC hmac_sha1(text:PTR TO CHAR, text_len, key:PTR TO CHAR, key_len, digest:PTR TO CHAR) +EXPORT PROC hmac_sha1(text:PTR TO CHAR, text_len, key:PTR TO CHAR, key_len, digest:PTR TO CHAR) + DEF k_pad:PTR TO CHAR + DEF tk[SHA1_DIGEST_SIZE]:ARRAY OF CHAR + DEF i + + k_pad:=New(SIZE_OF_SHA_1_CHUNK+text_len) + + IF (key_len > SIZE_OF_SHA_1_CHUNK) + calc_sha_1(tk,key, key_len) + key:=tk + key_len:=SHA1_DIGEST_SIZE + ENDIF + + CopyMem(key,k_pad, key_len) + CopyMem(text,k_pad+SIZE_OF_SHA_1_CHUNK, text_len) + FOR i:=0 TO SIZE_OF_SHA_1_CHUNK-1 DO k_pad[i]:=Eor(k_pad[i],$36) + + calc_sha_1(digest,k_pad, SIZE_OF_SHA_1_CHUNK+text_len) + Dispose(k_pad) + + k_pad:=New(SIZE_OF_SHA_1_CHUNK+SHA1_DIGEST_SIZE) + CopyMem(key,k_pad,key_len) + CopyMem(digest, k_pad+SIZE_OF_SHA_1_CHUNK, SHA1_DIGEST_SIZE) + + FOR i:=0 TO SIZE_OF_SHA_1_CHUNK-1 DO k_pad[i]:=Eor(k_pad[i],$5c) + + calc_sha_1(digest,k_pad, SIZE_OF_SHA_1_CHUNK+SHA1_DIGEST_SIZE) + Dispose(k_pad) +ENDPROC + +EXPORT PROC hmac_sha256(text:PTR TO CHAR, text_len, key:PTR TO CHAR, key_len, digest:PTR TO CHAR) DEF k_pad:PTR TO CHAR DEF tk[SIZE_OF_SHA_256_HASH]:ARRAY OF CHAR DEF i @@ -314,11 +548,11 @@ EXPORT PROC pkcs5_pbkdf2(pass:PTR TO CHAR, pass_len, salt:PTR TO CHAR, salt_len, asalt[salt_len+2]:=Shr(count,8) asalt[salt_len+3]:=count AND 255 - hmac_sha1(asalt, salt_len + 4, pass, pass_len, d1) + hmac_sha256(asalt, salt_len + 4, pass, pass_len, d1) CopyMem(d1,obuf,SIZE_OF_SHA_256_HASH) FOR i:=1 TO rounds-1 - hmac_sha1(d1, SIZE_OF_SHA_256_HASH, pass, pass_len, d2) + hmac_sha256(d1, SIZE_OF_SHA_256_HASH, pass, pass_len, d2) CopyMem(d2,d1,SIZE_OF_SHA_256_HASH) FOR j:=0 TO SIZE_OF_SHA_256_HASH-1 obuf[j]:=Eor(obuf[j],d1[j])