CRYPT uses the following macros in the sample program section below:
The CPKC11T macro contains data descriptions and equates that are used by the following macros.
The CGENRAL macro implements asynchronous processing for the task with CRYPT.
The event identification CRYPTTST is defined. The address of the short ID is OUTEIID.
The CRY2ABC routine is defined as a contingency process:
CONTAAD specifies the start address.
OUTCOID specifies the address of the short ID.The program requests a signal from the event identification CRYPTTST using a SOLSIG call and specifies the contingency process CRY2ABC. If the signal has not yet arrived after 600 seconds the event control should start the contingency process CRY2ABC. The program continues to run after this SOLSIG call.
The CSESION macro opens a session between an application and a token in a certain slot using the *OPENSESSION action.
The CGENKEY macro generates a secret DES key.
The *ENCRYPTINIT action of the CCRYINI macro then initiates an encryption operation with the DES key created.
The *ENCRYPT action of the CCRY macro performs the encryption operation
Routine CRY2ABC which acts as a contingency process.
The program once again requests a signal with a SOLSIG call.
A check is carried out to determine whether an CRYPT event has occurred.
Follow-up processing takes place depending on the event that has occurred.
FHDR MF=D
TITLE 'CPKC11T layout' --------------------------------------------(1.)
CPKC11T MF=D
TITLE 'CSESION'
CSESION MF=D,VERSION=002
TITLE 'CCRY'
CCRY MF=D,VERSION=002
TITLE 'CGENKEY'
CGENKEY MF=D,VERSION=002
TITLE 'CRY2ABS - example'
*
AREA DSECT
OUTEIID DS F
OUTCOID DS F
AREA# EQU *-AREA
*
CRY2AB CSECT
CRY2AB AMODE ANY
CRY2AB RMODE ANY
*
ENTRY CRY2ABV
CRY2ABV DS 0D
DS XL(AREA#)
*
SPACE
CRY2ABS @ENTR TYP=M,ENV=SPLSPEC,FUNCT='example of crypt ass program', -
LOCAL=ZEXALOC
CRY2ABS AMODE ANY
CRY2ABS RMODE ANY
*
L R9,=V(CRY2ABV)
@DATA BASE=R9,CLASS=B,DSECT=AREA
*
LA R3,CGENRALC
MVC CGENRALC,CGENRALL
@DATA BASE=R3,CLASS=B,DSECT=CRYJHEADER
MVI CRYJACTION,CRYJINITIALIZE
MVI CRYJEXEC,CRYJASYNCHRON
CGENRALE CGENRAL MF=E,PARAM=(R3),CALLER=USER -----------------------(2.)
*
@IF ZE
CLC CRYJRET,=F'0'
@THEN , INIT ok
*
@ELSE , error
* error handling
B EXIT
@BEND , INIT ok/error
*
LA R2,OUTEIID
ENAEI EINAME=CRYPTTST,EIIDRET=(R2),PARMOD=31 --------------(3.)
ST R15,ENAEIRC
@IF EQ
* ok?
CLI ENAEIMC,X'00'
@THEN , event item created
*
@ELSE , event item not created
* error handling
B EXIT
@BEND , event item (not) created
*
LA R2,OUTCOID
ENACO CONAME=CRYPTST,COADAD=CONTAAD,COIDRET=(R2),PARMOD=31 (4.)
ST R15,ENACORC
@IF EQ
* ok?
CLI ENACOMC,X'00'
@THEN , contingency created
*
@ELSE , contingency not created
* error handling
B EXIT
@BEND , contingency (not) created
*
LA R4,OUTCOID
LA R2,OUTEIID
SOLSIG EIID=(R2),COID=(R4),LIFETIM=600,PARMOD=31 ----------(5.)
*
@IF NZ
* SOLSIG ok?
LTR R15,R15
@THEN , error
* error handling
B EXIT
@BEND , error
*
* REQM for openSession PA
REQM 1,PARMOD=31
@IF NZ
LTR R15,R15
@THEN , error
* error handling
B EXIT
@BEND , error
*
LR R6,R1
@DATA BASE=R6,CLASS=B,DSECT=CRYO_MDL
*
* set up CSESION call
MVC CRYOHEADER(CRYO#),CSESIONL
MVI CRYOACTION,CRYOOPENSESSION
MVC CRYOBOID,OUTEIID
LA R1,OPSTKEY1
ST R1,CRYORPOSTAD
ST R6,OPSTKEY2
MVC CRYORPOSTL,=F'2'
CSESION MF=E,PARAM=(R6),CALLER=USER -----------------------(6.)
*
@IF EQ
CLC CRYORET,=F'0'
@THEN , open session accepted
*
* wait for the completion of openSession
*
@ELSE , open session not accepted
* error handling
B EXIT
@BEND , open session (not) accepted
*
*
* REQM for genKey PA
REQM 1,PARMOD=31
@IF NZ
LTR R15,R15
@THEN , error
* error handling
B EXIT
@BEND , error
*
LR R7,R1
@DATA BASE=R7,CLASS=B,DSECT=CRYDHEADER
*
MVC CRYDHEADER(CRYD#),CGENKEYL
MVC CRYDSESSION,CRYOSESSION
MVC CRYDMECHANISM,=A(MDESKGEN)
MVC CRYDBOID,OUTEIID
LA R1,DPSTKEY1
ST R1,CRYDRPOSTAD
ST R7,DPSTKEY2
MVC CRYDRPOSTL,=F'2'
CGENKEY MF=E,PARAM=(R7),CALLER=USER -----------------------(7.)
@IF EQ
CLC CRYDRET,=F'0'
@THEN , generate key accepted
*
* wait for the completion of generate key
*
@ELSE , generate key not accepted
* error handling
B EXIT
@BEND , generate key (not) accepted
*
*
* set up encrypt CCRYINI call
MVC CCRYINIC,CCRYINIL
LA R8,CCRYINIC
@DATA BASE=R8,CLASS=B,DSECT=CRYAHEADER
MVI CRYAACTION,CRYAENCRYPTINIT
MVC CRYASESSION,CRYOSESSION
MVC CRYAKEY,CRYDKEY
MVC CRYAMECHANISM,=A(MDESECB)
*
CCRYINI MF=E,PARAM=(R8),CALLER=USER -----------------------(8.)
*
@IF EQ
CLC CRYARET,=F'0'
@THEN , encrypt init ok
*
@ELSE , encrypt init not ok
* error handling
B EXIT
@BEND , encrypt init (not) ok
*
* REQM for encrypt PA
REQM 1,PARMOD=31
@IF NZ
LTR R15,R15
@THEN , error
* error handling
B EXIT
@BEND , error
*
LR R8,R1
@DATA BASE=R8,CLASS=B,DSECT=CRYB_MDL
*
MVC CRYBHEADER(CRYB#),CCRYL
MVC CRYBSESSION,CRYOSESSION
MVI CRYBACTION,CRYBENCRYPT
MVC CRYBDATAIN,=A(ZINPUT)
MVC CRYBDATAINLEN,=A(L'ZINPUT)
LA R15,ZENCOUT
ST R15,CRYBDATAOUT
MVC CRYBDATAOUTLEN,=A(L'ZENCOUT)
MVC CRYBBOID,OUTEIID
LA R1,BPSTKEY1
ST R1,CRYBRPOSTAD
ST R8,BPSTKEY2
MVC CRYBRPOSTL,=F'2'
CCRY MF=E,PARAM=(R8),CALLER=USER -------------------------(9.)
*
@IF EQ
CLC CRYBRET,=F'0'
@THEN , encrypt accepted
*
* wait for the completion of encrypt
*
@ELSE , encrypt not accepted
* error handling
B EXIT
@BEND , encrypt (not) accepted
*
EXIT EQU *
@EXIT
* DATA
*
CONTAAD DC A(CRY2ABC)
*
CGENRALL CGENRAL MF=L,VERSION=002
CSESIONL CSESION MF=L,VERSION=002
CGENKEYL CGENKEY MF=L,VERSION=002
CCRYINIL CCRYINI MF=L
CCRYL CCRY MF=L,VERSION=002
*
* mechanism DES_KEY_GEN (no parameter)
MDESKGEN DC A(CRY0MDES_KEY_GEN),A(0),A(0)
* mechanism DES_ECB (no parameter)
MDESECB DC A(CRY0MDES_ECB),A(0),A(0)
*
* string to be encrypted (for DES-ECB, length must be a multiple of 8)
ZINPUT DC CL16'that is secret!'
*
*
ZEXALOC @PAR D=YES
*
CGENRALC CGENRAL MF=C,VERSION=002
*
CCRYINIC CCRYINI MF=C
*
ENAEIRC DS 0F
ENAEISC DS X
DS X
DS X
ENAEIMC DS X
*
ENACORC DS 0F
ENACOSC DS X
DS X
DS X
ENACOMC DS X
*
OPOSTKEY DS 0D
OPSTKEY1 DS F
OPSTKEY2 DS F
*
DPOSTKEY DS 0D
DPSTKEY1 DS F
DPSTKEY2 DS F
*
BPOSTKEY DS 0D
BPSTKEY1 DS F
BPSTKEY2 DS F
*
* encrypted string area
ZENCOUT DS XL24
*
ZEXALOC @PAR LEND=YES
@END
*
**********************************************************************
*
ENTRY CRY2ABC
CRY2ABC @ENTR TYP=B,BASE=R10,FUNCT='Contingency ' ----------------(10.)
CRY2ABC AMODE ANY
CRY2ABC RMODE ANY
*
* register contents at start of contingency
* R1: contingency message - not used
* R2: event information code
* R3: post code 1 (byte1: EC type of Crypt; rest: RC)
* R4: post code 2 (A(PA))
*
LR R10,R15
*
CONTXT STACKR=(R12,R13),OWNR=(R12,R13),FUNCT=READ,PROCESS=LAST
*
*
L R9,=V(CRY2ABV)
@DATA BASE=R9,CLASS=B,DSECT=AREA
*
LA R14,OUTCOID
LA R15,OUTEIID
SOLSIG EIID=(R15),COID=(R14),LIFETIM=600,PARMOD=31 -------(11.)
*
@IF NZ
* error at SOLSIG?
LTR R15,R15
@THEN , error
* error handling
B RETCO
@BEND , error
*
ST R2,CONTIRC
@IF EQ
* ok?
CLI CONTIMC,X'00'
@THEN , cont correctly started
@IF EQ
CLI CONTISC,X'28'
@OR EQ
CLI CONTISC,X'2C'
@THEN , ok
*
* nothing to do
*
@ELSE , what's wrong
@IF EQ
* timeout?
CLI CONTIMC,X'04'
@THEN , timeout or EI killed
* timeout handling
*
B RETCO
@ELSE , something wrong
*
* error handling
*
B RETCO
@BEND , something wrong/ timeout or EI killed
@BEND , what's wrong
@ELSE , something wrong
* error handling
B RETCO
@BEND , something wrong
*
* cont correctly started
*
@IF NE
* contains post code 1 the ETC of CRYPT?
CLM R3,B'1000',=AL1(CRY0EVENT) -------------------------(12.)
@THEN , not a CRYPT event
*
* error handling
*
B RETCO
@BEND , not a CRYPT event
*
@IF EQ
* PA not allocated?
CLM R3,B'0011',=AL2(CRY0PA_NOT_ALLOC)
@THEN , PA not allocated
*
* error handling
B RETCO
@BEND , PA not allocated
*
*
LR R3,R4
@DATA BASE=R3,DSECT=ESMFHDR
*
@CAS2 ESMFCT,COMP=CLI ------------------------------------(13.)
*
@OF ESESION
*
@DATA BASE=R3,DSECT=CRYO_MDL
@IF EQ
CLC CRYORET,=F'0'
@THEN , session function ok
*
@IF EQ
* action = opensession
CLI CRYOACTION,CRYOOPENSESSION
@THEN , openSession
*
* handle open session
*
@BEND , openSession
*
@ELSE , session function not ok
* error handling
B RETCO
@BEND , session function (not) ok
*
* end ESESION
*
@DATA BASE=R3,DSECT=ESMFHDR
@OF EGENKEY
*
@DATA BASE=R3,DSECT=CRYD_MDL
@IF EQ
CLC CRYDRET,=F'0'
@THEN , generate key ok
*
* handle generate key
*
@ELSE , generate key not ok
* error handling
B RETCO
@BEND , generate key (not) ok
*
* end EGENKEY
*
@DATA BASE=R3,DSECT=ESMFHDR
@OF ECRY
* CRY
@DATA BASE=R3,DSECT=CRYB_MDL
*
@IF EQ
CLC CRYBRET,=F'0'
@THEN , crypt function ok
*
@IF EQ
* action = encrypt?
CLI CRYBACTION,CRYBENCRYPT
@THEN , encrypt
*
* handle encrypt
*
@ELSE , <> encrypt
@IF EQ
* action = decrypt?
CLI CRYBACTION,CRYBDECRYPT
@THEN , decrypt
*
* handle decrypt
*
@ELSE , <> decrypt
*
@BEND , decrypt ...
@BEND , encrypt ...
@ELSE , crypt function not ok
* error handling
B RETCO
@BEND , crypt function (not) ok
*
* end ECRY
@DATA BASE=R3,DSECT=ESMFHDR
@OFRE
* error: unknown function
*
* error handling
*
B RETCO
@BEND , CAS ESMFCT,COMP=CLI
*
*
*
RETCO EQU *
RETCO
@EXIT
********************************************************
* EQUates for the CRYPT functions
EGENRAL EQU 1 GENeRAL-purpose functions
ESESION EQU 20 SESsION management
EOBJMGT EQU 30 OBJect ManaGemenT
ECRYINI EQU 40 INIt a CRYptographic function
ECRY EQU 41 CRYptographic function
ECRYFIN EQU 42 FINalize a CRYptographic function
EGENKEY EQU 80 GENerateKEY
EGENKPR EQU 81 GENerateKeyPaiR
EWRPKEY EQU 82 WRaPKEY
EUNWKEY EQU 83 UNWrapKEY
EDRVKEY EQU 84 DeRiVeKEY
ERANDOM EQU 90 RANDOM number generation
*-------------------------------------------------------*
*
CONTIRC DS 0F
CONTISC DS X
DS X
DS X
CONTIMC DS X
*