*============================================================================================* * * * SLCALHASH * * Examples on how to use V5R3 provided QC3CALHA, Qc3CalculateHash function. * * * * * * This program is provided as it is. Use at your own risk. * * http://www.datacrush.info * * * *============================================================================================* * Maintenance Log * * --------------- * * Trace Date Pgmr. Remarks * * ------------------------------------------------------------------------------------------ * * 20060204 Datacrush * *============================================================================================* *--------------------------------------------------------------------------------------------- * Controls *--------------------------------------------------------------------------------------------- * H AltSeq(*None) * *--------------------------------------------------------------------------------------------- * Copybooks *--------------------------------------------------------------------------------------------- * * Error D/Copy Qsysinc/Qrpglesrc,Qusec * *--------------------------------------------------------------------------------------------- * Data structures *--------------------------------------------------------------------------------------------- * * Input data D Inp Ds Qualified D Ptr * D Len 10I 0 D Rsv 12A Inz(*Loval) * * Use with hex values D Ds D HxInt 1 2I 0 Inz(*Zeros) D HxIntA 2 2A * *--------------------------------------------------------------------------------------------- * Variables and standalone fields *--------------------------------------------------------------------------------------------- * * Other parameters used with Q3CALHA D InpElem S 10I 0 Inz(1) D InpFmt S 8A D Alg S 10I 0 D AlgFmt S 8A D Csp S 1A D CspDev S 10A D Hash_MD5 S 16A D Hash_SHA1 S 20A D Hash_SHA256 S 32A D Hash_SHA384 S 48A D Hash_SHA512 S 64A D Error S 128A * * Use with hex values D HxChrA S 1A Inz(*Blanks) D HxChrB S 1A Inz(*Blanks) D HxOfsA S 5I 0 Inz(*Zeros) D HxOfsB S 5I 0 Inz(*Zeros) D HxCnt S 10I 0 Inz(*Zeros) D HEnc S 128A Inz(*Blanks) * * Test data D sTestData S 20A Inz(X'616263') * *--------------------------------------------------------------------------------------------- * Constants *--------------------------------------------------------------------------------------------- * * Use with hex values D CHex C Const('0123456789abcdef') * *--------------------------------------------------------------------------------------------- * Main logic *--------------------------------------------------------------------------------------------- * C Reset Qusec C Eval Qusbprv = %Size(Error) C Eval Error = Qusec * C Eval Inp.Ptr = %Addr(sTestData) C Eval Inp.Len = %Len(%Trim(sTestData)) * C ExSr SrMD5 C ExSr SrSHA1 C ExSr SrSHA256 C ExSr SrSHA384 C ExSr SrSHA512 * C Move *On *InLr * *--------------------------------------------------------------------------------------------- * SrMD5 Sub Routine * Get MD5 hash *--------------------------------------------------------------------------------------------- * C SrMD5 BegSr * C pHash_MD5 Plist C Parm Inp C Parm 1 InpElem C Parm 'DATA0200' InpFmt C Parm 1 Alg C Parm 'ALGD0500' AlgFmt C Parm '0' Csp C Parm CspDev C Parm *Loval Hash_MD5 C Parm Error * C Call 'QC3CALHA' pHash_MD5 * C Move *Blanks HEnc C For HxCnt = 1 By 1 To %Size(Hash_MD5) C Eval HxIntA = %Subst(Hash_MD5:HxCnt:1) C ExSr SrGetHexStr C Eval %Subst(HEnc:(HxCnt*2)-1:1) = HxChrA C Eval %Subst(HEnc:(HxCnt*2):1) = HxChrb C EndFor * C EndSr * *--------------------------------------------------------------------------------------------- * SrSHA1 Sub Routine * Get SHA-1 hash *--------------------------------------------------------------------------------------------- * C SrSHA1 BegSr * C pHash_SHA1 Plist C Parm Inp C Parm 1 InpElem C Parm 'DATA0200' InpFmt C Parm 2 Alg C Parm 'ALGD0500' AlgFmt C Parm '0' Csp C Parm CspDev C Parm *Loval Hash_SHA1 C Parm Error * C Call 'QC3CALHA' pHash_SHA1 * C Move *Blanks HEnc C For HxCnt = 1 By 1 To %Size(Hash_SHA1) C Eval HxIntA = %Subst(Hash_SHA1:HxCnt:1) C ExSr SrGetHexStr C Eval %Subst(HEnc:(HxCnt*2)-1:1) = HxChrA C Eval %Subst(HEnc:(HxCnt*2):1) = HxChrb C EndFor * C EndSr * *--------------------------------------------------------------------------------------------- * SrSHA256 Sub Routine * Get SHA-256 hash *--------------------------------------------------------------------------------------------- * C SrSHA256 BegSr * C pHash_SHA256 Plist C Parm Inp C Parm 1 InpElem C Parm 'DATA0200' InpFmt C Parm 3 Alg C Parm 'ALGD0500' AlgFmt C Parm '0' Csp C Parm CspDev C Parm *Loval Hash_SHA256 C Parm Error * C Call 'QC3CALHA' pHash_SHA256 * C Move *Blanks HEnc C For HxCnt = 1 By 1 To %Size(Hash_SHA256) C Eval HxIntA = %Subst(Hash_SHA256:HxCnt:1) C ExSr SrGetHexStr C Eval %Subst(HEnc:(HxCnt*2)-1:1) = HxChrA C Eval %Subst(HEnc:(HxCnt*2):1) = HxChrb C EndFor * C EndSr * *--------------------------------------------------------------------------------------------- * SrSHA384 Sub Routine * Get SHA-384 hash *--------------------------------------------------------------------------------------------- * C SrSHA384 BegSr * C pHash_SHA384 Plist C Parm Inp C Parm 1 InpElem C Parm 'DATA0200' InpFmt C Parm 4 Alg C Parm 'ALGD0500' AlgFmt C Parm '0' Csp C Parm CspDev C Parm *Loval Hash_SHA384 C Parm Error * C Call 'QC3CALHA' pHash_SHA384 * C Move *Blanks HEnc C For HxCnt = 1 By 1 To %Size(Hash_SHA384) C Eval HxIntA = %Subst(Hash_SHA384:HxCnt:1) C ExSr SrGetHexStr C Eval %Subst(HEnc:(HxCnt*2)-1:1) = HxChrA C Eval %Subst(HEnc:(HxCnt*2):1) = HxChrb C EndFor * C EndSr * *--------------------------------------------------------------------------------------------- * SrSHA512 Sub Routine * Get SHA-512 hash *--------------------------------------------------------------------------------------------- * C SrSHA512 BegSr * C pHash_SHA512 Plist C Parm Inp C Parm 1 InpElem C Parm 'DATA0200' InpFmt C Parm 5 Alg C Parm 'ALGD0500' AlgFmt C Parm '0' Csp C Parm CspDev C Parm *Loval Hash_SHA512 C Parm Error * C Call 'QC3CALHA' pHash_SHA512 * C Move *Blanks HEnc C For HxCnt = 1 By 1 To %Size(Hash_SHA512) C Eval HxIntA = %Subst(Hash_SHA512:HxCnt:1) C ExSr SrGetHexStr C Eval %Subst(HEnc:(HxCnt*2)-1:1) = HxChrA C Eval %Subst(HEnc:(HxCnt*2):1) = HxChrb C EndFor * C EndSr * *--------------------------------------------------------------------------------------------- * Subroutine SrGetHexStr * Get string from hex characters *--------------------------------------------------------------------------------------------- * C SrGetHexStr BegSr * C HxInt Div 16 HxOfsA C Mvr HxOfsB * C Add 1 HxOfsA C 1 Subst CHex:HxOfsA HxChrA C Add 1 HxOfsB C 1 Subst CHex:HxOfsB HxChrB * C EndSr *