|
I wrote a sample for getting String message authentication code(MAC) value
for data authentication purpose as following:
File : QRPGLESRC
Member: GENMACR
Type : RPGLE
Usage : CRTBNDRPG GENMACR
OS : V5R2 (please make sure V5R2 installed PTF#: SI10060 SI10105)
* if you want use procedure call(Qc3CalculateMAC), you need
* use option 15, create module , then
* CRTPGM PGM(lib/GENMACR) BNDSRVPGM(QC3MAC) and with following
* H Spec and D Spec
H*DEBUG OPTION(*SRCSTMT:*NODEBUGIO)
D*GenMacPr PR ExtProc('Qc3CalculateMAC')
*
H DEBUG OPTION(*SRCSTMT:*NODEBUGIO) DFTACTGRP(*NO) ACTGRP(*CALLER)
H BNDDIR('QC2LE')
D cvthex1To2 PR extproc('cvthc')
D longReceiver * value
D shortSource * value
D receiverBytes 10i 0 value
D cvthex2To1 PR extproc('cvtch')
D shortReceiver * value
D longSource * value
D sourceBytes 10i 0 value
D*GenMacPr PR ExtProc('Qc3CalculateMAC')
D GenMacPr PR ExtPgm('QC3CALMA')
D InpDta 1024
D InpDtaLen 10I 0
D InpDtaFmt 8
D AlgDesc like(ALGD0200)
D AlgdFmt 8
D KeyDesc like(KEYD0200)
D KeyFmt 8
D CrypSrv 1
D CrypDev 10
D MacCode 8
D errcde like(APIERR)
D
D*ALGD0200 algorithm description structure
DALGD0200 DS
D QC3BCA 1 4B 0
D* Block Cipher Alg
D QC3BL 5 8B 0
D* Block Length
D QC3MODE 9 9 inz('1')
D* Mode
D QC3PO 10 10 inz('0')
D* Pad Option
D QC3PC 11 11 inz(x'00')
D* Pad Character
D QC3ERVED 12 12 inz(x'00')
D* Reserved
D QC3MACL 13 16B 0
D* MAC Length
D QC3EKS 17 20B 0
D* Effective Key Size
D QC3IV 21 52
D* Init Vector
D*KEYD0200 key description format structure
DKEYD0200 DS
D* Qc3 Format KEYD0200
D QC3KT 1 4B 0
D* Key Type
D QC3KSL 5 8B 0
D* Key String Len
D QC3KF 9 9 inz('0')
D* Key Format
D QC3ERVED02 10 12 inz(x'000000')
D* Reserved
D QC3KS 13 20
D*
D* variable length
* API error structure
D APIERR DS
D ERRPRV 10I 0 INZ(272)
D ERRLEN 10I 0
D EXCPID 7A
D RSRVD2 1A
D EXCPDT 256A
*
D InpDta S 1024
D InpDtaLen S 10I 0
D InpDtaFmt S 8 inz('DATA0100')
D AlgdFmt S 8 inz('ALGD0200')
D KeyFmt S 8 inz('KEYD0200')
D CrypSrv S 1 inz('1')
D CrypDev S 10
D MacCode S 8
D MacCode4 S 4
D MacHexCode S 8
D DataSrc S 1024
D DataSrcLen S 10I 0
D Icv16 S 16
D Icv08 S 8
D IcvLen S 10I 0
D Key16 S 16
D Key08 S 8
D ErrorMsgId S 7
C *Entry Plist
C Parm DataSrc
C Parm Key16
C Parm Icv16
C Parm MacHexCode
C Parm ErrorMsgId
C
C eval DataSrcLen = %len(%trim(DataSrc))
C If %rem(DataSrcLen : 2) > 0
C eval DataSrc = %trim(DataSrc) + '0'
C EndIf
C
* Convert 2 Hex chars to 1 Char
C callp cvthex2To1 (%addr(InpDta)
C : %addr(DataSrc)
C : %len(%trim(DataSrc)))
C eval QC3BCA = 20
C eval QC3BL = 8
C eval QC3MACL = 8
C eval QC3EKS = 0
C eval Icv16 = %xlate(' ': '0' : icv16)
C callp cvthex2To1 (%addr(Icv08)
C : %addr(Icv16)
C : %len(%trim(Icv16)))
C
C eval QC3IV = Icv08
C eval QC3KT = 20
C eval QC3KSL = 8
C callp cvthex2To1 (%addr(Key08)
C : %addr(Key16)
C : %len(%trim(Key16)))
C eval QC3KS = Key08
C eval InpDtaLen = %len(%trim(InpDta))
C
C Callp GenMacPr(
C InpDta :
C InpDtaLen :
C InpDtaFmt :
C AlgD0200 :
C AlgdFmt :
C KeyD0200 :
C KeyFmt :
C CrypSrv :
C CrypDev :
C MacCode :
C ApiErr )
C If ERRLEN = 0
C eval MacCode4 = MacCode
* Convert 1 Char to 2 Hex chars
C callp cvthex1To2 (%addr(MacHexCode)
C : %addr(MacCode4)
C : %len(%trim(MacCode4))* 2)
C eval ErrorMsgId = *Blanks
C Else
C eval MacHexCode = *Blanks
C eval ErrorMsgId = EXCPID
C EndIf
C eval *InLr = *On
Testing sample:
File : QRPGLESRC
Member: GENMACTEST
Type : RPGLE
Usage : CRTBNDRPG GENMACTEST
CALL GENMACTEST
OS : V5R2
H DEBUG OPTION(*SRCSTMT:*NODEBUGIO) DFTACTGRP(*NO) ACTGRP(*CALLER)
D DataSrc S 1024
D Icv16 S 16
D Key16 S 16
D MacHexCode S 8
D ErrorMsgId S 7
D GenMacR PR ExtPgm('GENMACR')
D DataSrc 1024
D Key16 16
D Icv16 16
D MacHexCode 8
D ErrorMsgId 7
C eval Key16 = 'E07DDB948C3F2D44'
* MACCode: 1BB5AD90
C eval DataSrc =
C '574365400000005000000456655687845'
C eval Icv16 = '20040625105948'
C ExSr GenMacSr
* MACCode: DBB695DD
C eval DataSrc =
C '546646800000010000005644651386983'
C eval Icv16 = '20040625110002'
C ExSr GenMacSr
* MACCode: 1181D5A9
C eval DataSrc =
C '689563200000015000006563232565543'
C eval Icv16 = '20040625110025'
C ExSr GenMacSr
* MACCode: 24AC4268
C eval DataSrc =
C '56989876564645646600000005000310686-
C 8542536988'
C eval Icv16 = '20040625110212'
C ExSr GenMacSr
* MACCode: 00FC6820
C eval DataSrc =
C '65523591235858665400000015000110511-
C 3235463238'
C eval Icv16 = '20040625110220'
C ExSr GenMacSr
* MACCode: FBC4650E
C eval DataSrc =
C '65522332325465384100000010000110122-
C 4323235858'
C eval Icv16 = '20040625110232'
C ExSr GenMacSr
C eval *InLr = *On
C**********************************************************************
C GenMacSr BegSr
C eval MacHexCode = *Blanks
C eval ErrorMsgId = *Blanks
C Callp GenMacR(
C DataSrc :
C Key16 :
C Icv16 :
C MacHexCode :
C ErrorMsgId )
C
C If ErrorMsgId = *Blanks
C MAcHexCode Dsply
C Else
C ErrorMsgId Dsply
C EndIf
C EndSr
C**********************************************************************
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.