|
Hi list,
Here is the Md5 computation for String or Stream file.
Any ideas are welcome
* here is the cmd. MD5
CMD PROMPT('Fingerprint MD5')
PARM KWD(DATA) TYPE(*CHAR) LEN(512) CASE(*MIXED) +
PROMPT('Data')
PARM KWD(TYPE) TYPE(*CHAR) LEN(7) RSTD(*YES) +
DFT(*STRING) VALUES(*STMF *STRING) +
CASE(*MIXED) PROMPT('Type')
* here is the cl MD5CL
PGM PARM(&DATA &TYPE)
DCL VAR(&DATA) TYPE(*CHAR) LEN(512)
DCL VAR(&PRINT) TYPE(*CHAR) LEN(49)
DCL VAR(&TYPE) TYPE(*CHAR) LEN(7)
CALL PGM(MYMD5) PARM(&DATA &PRINT &TYPE)
SNDPGMMSG MSG('Fingerprint MD5:' *CAT &PRINT)
RETURN
** Here is the main pgm Mymd5
HBnddir('QC2LE')
D/COPY PROTO1
DMYMD5 PR
DIntext_ Like(Intext)
DMmd5_ Like(Mmd5)
DType_ Like(Type)
DMYMD5 PI
DIntext 512
DMmd5 49
DType 7
DStatds DS
D St_Size 21 24B 0
DPtr S *
DFd S 10I 0
DFd1 S 10I 0
DStmf S Like(Intext)
/Free
If Type = '*STRING';
Mmd5 = Md5(%Addr(Intext):%Len(%Trim(Intext)):Type);
Else;
Stmf = %Trimr(Intext) + X'00';
Fd = Open(%Addr(Stmf):1); // 1 for read only
Fd1 = Lstat(%Addr(Stmf):%Addr(Statds)); // Get size
Ptr = %Alloc(St_Size);
Fd1 = Read(Fd:Ptr:St_Size); // Read content
Fd1 = close(Fd);
Mmd5 = Md5(Ptr:St_Size:Type); // Perform md5
Dealloc Ptr;
Endif;
Return;
/End-free
** Here the Proto1 Copy
DClose PR 10I 0 ExtProc('close')
D handle 10I 0 value
DRead PR 10I 0 ExtProc('read')
D handle 10I 0 value
D buffer * value
D bytes 10U 0 value
DOpen PR 10I 0 ExtProc('open')
D filename * value
D openflags 10I 0 value
D mode 10U 0 value options(*nopass)
D codepage 10U 0 value options(*nopass)
DLstat PR 10I 0 ExtProc('lstat')
D path * Value
D buf * Value
D
Dcvthc PR ExtProc('cvthc')
D ChrVal 32A Options(*VarSize)
D HexVal 16A Options(*VarSize)
D ChrLgt 10I 0 Value
DQtqcvrt PR Extpgm('QTQCVRT')
DCCSID1_ 10I 0
DST1_ 10I 0
DStartMap_ 256
DL1_ 10I 0
DCCSID2_ 10I 0
DST2_ 10I 0
DGCCASN_ 10I 0
DL2_ 10I 0
DTo819_ 256
DL3_ 10I 0
DL4_ 10I 0
DFB_ 12A
D
Dcipher PR extproc('_CIPHER')
D * value
D * value
D * value
D
Dconvert PR extproc('_XLATEB')
D * value
D * value
D 10u 0 value
D
DMD5 PR 49a Extproc('MD5')
D Inputdata * Value
D InputLength 10I 0 Const
D Type 7A Const
** Here is the srvpgm mysrv
H NoMain bnddir('QC2LE')
D/COPY PROTO1
PMD5 B Export
C*-- Procedure interface
DMD5 PI 49A
D Inputdata * Value
D Inputlength 10I 0 Const
D Type 7A Const
D
DUpper C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DLower C 'abcdefghijklmnopqrstuvwxyz'
D*-- Variables for _CIPHER MI
DHashworkarea S 96A Inz(*Allx'00')
DReceiverhex S 16A Inz
DReceiverptr S * Inz(%Addr(Receiverhex))
D*-- Variables for output
DReceiverchr S 32A
DReceived S 49A
D*-- Variables for QTQCVRT API
DStartmap S 256A Inz
DTo819 S 256A Inz
DCcsid1 S 10I 0 Inz(37)
DSt1 S 10I 0 Inz(0)
DL1 S 10I 0 Inz(%Size(Startmap))
DCcsid2 S 10I 0 Inz(819)
DSt2 S 10I 0 Inz(0)
DGccasn S 10I 0 Inz(0)
DL2 S 10I 0 Inz(%Size(To819))
DL3 S 10I 0 Inz
DL4 S 10I 0 Inz
DFb S 12A Inz
D*-- Control data structure for _CIPHER MI
DControls DS
D Function 5I 0 Inz(5)
D Hashalg 1A Inz(X'00')
D Sequence 1A Inz(X'00')
D Datalength 10I 0 Inz(15)
D Unused 8A Inz(*Loval)
D Hashctxptr * Inz(%Addr(Hashworkarea))
D*-- Data structure for EBCDIC/ASCII prep
D DS
DX 5I 0
D Lowx 2 2
/Free
If Type = '*STRING';
// Get all single byte ebcdic hex values
For X = 0 To 255;
%Subst(StartMap:x+1:1) = LowX;
EndFor;
// Get conversion table for 819 from 37
Qtqcvrt(Ccsid1:St1:StartMap:L1:Ccsid2:St2:Gccasn:L2:To819:L3:L4:
Fb);
// Change message to ccsid 819 (ascii).
Convert(Inputdata:%Addr(To819):InputLength);
Endif;
Hashworkarea = *AllX'00';
// Hashctxptr = %Addr(Hashworkarea);
// Get MD5 fingerprint of data
Datalength = InputLength;
Cipher(%Addr(Receiverptr):%Addr(Controls):%Addr(Inputdata));
Cvthc(Receiverchr:Receiverhex:%Size(Receiverchr));
// In the *NIX and PC world, letters found in MD5 are in lower case
Receiverchr = %Xlate(Upper:Lower:Receiverchr);
Received = *Blank;
For X = 1 By 2 to 31;
Received = %Trimr(Received) + ':' + %Subst(Receiverchr:X:2);
Endfor;
%Subst(Received:1:1)= '[';
Received = %Trimr(Received) + ']';
Return Received;
/End-Free
PMD5 E
Compilation
CRTCMD CMD(MD5) PGM(MD5CL) SRCFILE(QCMDSRC)
CRTBNDCL PGM(MD5CL) SRCFILE(QCLESRC)
CRTRPGMOD MODULE(MD5SRV) SRCFILE(QRPGLESRC)
CRTRPGMOD MODULE(MYMD5) SRCFILE(QRPGLESRC)
CRTSRVPGM SRVPGM(MD5SRV) EXPORT(*ALL)
CRTPGM PGM(MYMD5) BNDSRVPGM(MD5SRV)
Test
Open an editor and write
''Here is the Md5 Fingerprint'' on it and save on your dir
MD5 DATA('/home/sl/test.txt') TYPE(*STMF)
Fingerprint MD5:[b8:49:91:c5:ca:fb:93:86:ff:37:88:f7:c4:63:78:b1]
MD5 DATA('Here is the Md5 Fingerprint') TYPE(*STRING)
Fingerprint MD5:[b8:49:91:c5:ca:fb:93:86:ff:37:88:f7:c4:63:78:b1]
--
Stephane
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.