H dftactgrp(*no) actgrp('QILE') H option(*srcstmt:*nodebugio) /copy QSYSINC/QRPGLESRC,QTQICONV d binaryHMAC s 20a d SHA_1 c const(2) D DataLen s 10i 0 d dataToHash s 500a d $hex s 34a d Nullfield s 100a *--------------------------------------------------------------------- * Stand Alone Fields - BOTTOM *--------------------------------------------------------------------- D ErrorCode DS qualified D bytesProv 10i 0 inz(0) D bytesAvail 10i 0 inz(0) D WsErrorCode DS qualified D bytesProv 10i 0 inz(0) D bytesAvail 10i 0 inz(0) D my_key DS qualified D Type 10i 0 inz(SHA_1) D Len 10i 0 D Fmt 1a inz('0') D 3a D Value 64a d cvthc PR ExtProc('cvthc') d target 65534A options(*varsize) d src_bits 32767A options(*varsize) const d tgt_length 10I 0 value D Qc3CalculateHMAC... D PR ExtProc('Qc3CalculateHMAC') d InData 32767a const options(*varSize) d IndataL 10i 0 const d InDataF 8a const d AlgoDes 10i 0 const d AlgoFmt 8a const d KeyDescr 32767a const options(*varSize) d KeyDescrFmt 8a const d CryptoSP 1a const d CryptoDev 10a const d Hash 64a options(*varsize) d ErrorCode 32767a options(*varsize) C *ENTRY Plist C Parm MyText 41 C Parm MySalt 20 /free //--------------------------------------------------------- // Calculate the SHA-1 HMAC hash //--------------------------------------------------------- Nullfield = *allx'00'; DataToHash = MyText; my_key.value = %TRIMR(MySalt) + Nullfield; DataLen = %len(%trim(DataToHash)); my_key.len = %len(%trim(MYSALT)); datatoHash = convertToCcsid(myText : 437); my_Key.value = convertToCcsid(my_key.value: 437); my_key.len = %size(my_key.value); DataLen = %size(DataToHash) ; monitor; Qc3CalculateHMAC( DataToHash : DataLen : 'DATA0100' : SHA_1 : 'ALGD0500' : my_key : 'KEYD0200' : '0' : *blanks : binaryHMAC : ErrorCode ); on-error; WsErrorCode = ErrorCode; Dsply 'Error in Conversion'; endmon; cvthc( $hex: binaryHMAC: %len(binaryHMAC)*2); dsply $hex; *inlr = '1'; return; /end-free PconvertToCcsid... P B export D PI 32767 varying D pInput 32767 varying const D pToCCSID 5 0 const D ibmIConvOpen Pr 52a extproc('QtqIconvOpen') D fromcode * value D tocode * value D ibmIConv Pr 10i 0 extproc('iconv') D cd 52a value D inbuf * D inbytesleft 10i 0 D outbuf * D outbytesleft 10i 0 D ibmIconvClose Pr 10i 0 extproc('iconv_close') D cd 52a value D iconv_t Ds D t_rtnval 10i 0 D t_cd D t_cdi 10i 0 Dim(12) Overlay(t_cd) D fromcode DS likeds(QTQCODE) inz D tocode DS likeds(QTQCODE) inz D inputPtr S * D inputLen S 10I 0 D outputPtr S * D outputLen S 10I 0 D input S 32767 D output S 32767 Drc S 10I 0 /free fromcode.QTQCCSID = 37; tocode.QTQCCSID = pToCCSID; fromcode.QTQERVED02 = *allx'00'; tocode.QTQERVED02 = *allx'00'; iconv_t = ibmIconvOpen(%addr(tocode) : %addr(fromcode)); input = pInput; inputPtr = %addr(input); inputLen = %len(%trimr(input)); outputPtr = %addr(output); outputLen = inputLen; rc = ibmIConv(iconv_t : inputPtr : inputLen: outputPtr : outputLen); rc = ibmIconvClose( iconv_t ); return %TRIMR(output); /end-free P E