SSHELPER CSECT SSHELPER RMODE ANY SSHELPER AMODE 31 PRINT GEN * * Usage: SSH Helper, invoke a Rexx procedure to generate * entropy data for ssh * Can be used instead of ssh-rand-helper or in ssh_prng_cmds * * google "ssh-rand-helper.rx" too ... * * by Enterprise System Consulting * Henri Hoffmann * Henri.Hoffmann@SysConsult.de * * http://www.SysConsult.de * *------------------------------------------------------------------* SYSSTATE ARCHLVL=2 Use z/Architecture Instructions *------------------------------------------------------------------* STM 14,12,12(13) save the entry register LR BASE,15 setup base register USING SSHELPER,BASE establish addressebility LR PARMREG,1 save parameter register STORAGE OBTAIN,LENGTH=DATALEN,SP=10 * USING DATAREA,1 ST 13,REG13 DROP 1 * LR DATAREG,1 attn: datareg is reg13 USING DATAREA,DATAREG establish addressebility MVC 4(4,DATAREG),=C'F1SA' set linkage stack usage flag *------------------------------------------------------------------* L ARGCREG,0(,PARMREG) L ARGCREG,0(,ARGCREG) CH ARGCREG,=H'1' BE DEFAULT CH ARGCREG,=H'2' BNL ARGOK *------------------------------------------------------------------* DEFAULT MVC ARGCNT,=F'1' * No Params, just call * ssh-rand-helper.rx LA 0,L'DFLTARG0 ST 0,CMDLEN MVC CMD(L'DFLTARG0),DFLTARG0 * LA 0,DFLTARGL ST 0,ARGLLST LA 0,DFLTARG1 ST 0,ARGSLST * B DONE *------------------------------------------------------------------* ARGERR LA 1,LENERROR LA 15,L'LENERROR XC RETCODE,RETCODE XC RSNCODE,RSNCODE ST ARGCREG,RETVAL BAL 14,WRITE LA RCREG,50 B EXITRC *------------------------------------------------------------------* ARGOK CH ARGCREG,=H'20' BNL ARGERR * LR 1,ARGCREG SH 1,=H'1' Ignore 1st argument ST 1,ARGCNT Number of Arguments XR COUNTREG,COUNTREG * L LENREG,4(,PARMREG) Argument Length List L ARGREG,8(,PARMREG) Argument Data List XR OFFSTREG,OFFSTREG Set to Zero * LOOP LTR ARGCREG,ARGCREG BZ DONE * L ARGLREG,0(OFFSTREG,LENREG) L ARGLREG,0(0,ARGLREG) L ARGDREG,0(OFFSTREG,ARGREG) * LA COUNTREG,1(,COUNTREG) * CH COUNTREG,=H'2' BL NEXT BH NOTP1 * LR 1,ARGLREG SH 1,=H'1' for EX EX 1,MVCCMD MVC CMD(0),0(ARGDREG) SH ARGLREG,=H'1' ST ARGLREG,CMDLEN * LR 1,ARGLREG SH 1,=H'1' for EX EX 1,MVCARG1 MVC ARG1(0),0(ARGDREG) LA 1,1(0,ARGLREG) Length Arg1 + NUL ST 1,ARG1LEN LA 15,ARG1 AR 1,15 MVI 0(1),X'00' SET Null * LA ARGLREG,ARG1LEN LA ARGDREG,ARG1 * NOTP1 LA 1,ARGLLST LA 1,0(1,OFFSTREG) SH 1,=H'4' because 1st word is ignored ST ARGLREG,0(,1) LA 1,ARGSLST LA 1,0(1,OFFSTREG) SH 1,=H'4' because 1st word is ignored ST ARGDREG,0(,1) * NEXT LA OFFSTREG,4(,OFFSTREG) Offset + 4 SH ARGCREG,=H'1' Argcount = Argcount - 1 * B LOOP *------------------------------------------------------------------* * DONE XC ENVCNT,ENVCNT Number of env. dat tems passed XC ENVLENS,ENVLENS Addr of env. data length list XC ENVARGS,ENVARGS Add of env. data XC EXITRTN,EXITRTN XC EXITPL,EXITPL XC INHEAREA,INHEAREA XC FDCNT,FDCNT XC FDLST,FDLST * MVC PLIST(L'CALLMFL),CALLMFL * SPACE , CALL BPX1SPN, ----------------------------------+ (CMDLEN, Input: Pathname length + CMD, Input: Pathname + ARGCNT, Input: Argument count + ARGLLST, Input: Argument length list + ARGSLST, Input: Argument address list + ENVCNT, Input: Environment count + ENVLENS, Input: Environment length list + ENVARGS, Input: Environment address list + EXITRTN, Input: Exit routine address or 0 + EXITPL, Input: Exit Parm list address or 0+ FDCNT, Input: File desriptor count + FDLST, Input: File descriptor list + =A(INHE#LENGTH), Input: Length of Inheritance area + INHEAREA, Input: Inheritance area + RETVAL, Return value: -1 or not return + RETCODE, Return code + RSNCODE), Reason code + VL,MF=(E,PLIST) ---------------------------------- * L RCREG,RETCODE LTR RCREG,RCREG BZ EXITRC * LA 1,CMD L 15,CMDLEN BAL 14,WRITE * B EXITRC *------------------------------------------------------------------* *--- Exiting the routine ---* *------------------------------------------------------------------* EXITRC0 LA RCREG,0 set return code to zero *------------------------------------------------------------------* EXITRC L WORKREG,REG13 STORAGE RELEASE,ADDR=(DATAREG),LENGTH=DATALEN,SP=10 LR 13,WORKREG LR 15,RCREG load return code L 14,12(,13) LM 00,12,20(13) BR 14 let's go return * *------------------------------------------------------------------* WRITE LR RETREG,14 MVI MSG,C' ' MVC MSG+1(L'MSG-1),MSG SH 15,=H'1' EX 15,MVCMSG MVC MSG(0),0(1) MVC MSG+L'MSG-1(1),NEW_LINE * OFFSET1 EQU 88 OFFSET2 EQU 102 OFFSET3 EQU 116 * L 0,RETCODE ST 0,WORKF BAL 14,UNPACK MVC MSG+OFFSET1(5),=C'RETC:' MVC MSG+OFFSET1+5(L'TRBUF),TRBUF * L 0,RETVAL ST 0,WORKF BAL 14,UNPACK MVC MSG+OFFSET2(5),=C'RETV:' MVC MSG+OFFSET2+5(L'TRBUF),TRBUF * L 0,RSNCODE ST 0,WORKF BAL 14,UNPACK MVC MSG+OFFSET3(5),=C'RSNC:' MVC MSG+OFFSET3+5(L'TRBUF),TRBUF * LA 0,MSG ST 0,MSGADDR XC RTN_VAL,RTN_VAL XC RTN_COD,RTN_COD XC RSN_COD,RSN_COD * MVC WRT(CALLWRTL),CALLWRT * CALL BPX1WRT, + (FD, + MSGADDR, + ALET, + LEN, + RTN_VAL, + RTN_COD, + RSN_COD),VL,MF=(E,WRT) * BR RETREG *------------------------------------------------------------------* *- Unpack Hex to Printable Characters -----------------------------* * UNPACK UNPK TRBUF(L'TRBUF+1),WORKF(L'WORKF+1) LA 1,TRTAB1 load address of translationtbl SH 1,=H'240' subtract F0, bec. tblength is 16 TR TRBUF(L'TRBUF),0(1) translate this digits BR 14 *------------------------------------------------------------------* * LENERROR DC C'Invalid arguments count, must be <20' DFLTMSG DC C'Defaulting to /etc/ssh/ssh-rand-helper.rx 1024' TRTAB1 DC C'0123456789ABCDEF' 00065800 * DFLTARG0 DC C'/etc/ssh/ssh-rand-helper.rx' DFLTARG1 DC C'/etc/ssh/ssh-rand-helper.rx',X'00' DFLTARG# EQU *-DFLTARG1 * DFLTARGL DC A(DFLTARG#) * DS 0H MVCCMD MVC CMD(0),0(ARGDREG) MVCARG1 MVC ARG1(0),0(ARGDREG) MVCMSG MVC MSG(0),0(1) * DS 0D * FD DC F'1' File Descriptor (1=STDOUT,2=STDERR) NEW_LINE DC X'15' EBCDIC New Line Character ALET DC F'0' Alet For The Message (0 - DEFAULT) LEN DC A(L'MSG+L'NEW_LINE) How Many ByteS To Write *------------------------------------------------------------------* CALLMFL CALL , ----------------------------------+ (, Input: Pathname length + , Input: Pathname + , Input: Argument count + , Input: Argument length list + , Input: Argument address list + , Input: Environment count + , Input: Environment length list + , Input: Environment address list + , Input: Exit routine address or 0 + , Input: Exit Parm list address or 0+ , Input: File desriptor count + , Input: File descriptor list + , Input: Length of Inheritance area + , Input: Inheritance area + , Return value: -1 or not return + , Return code + ), Reason code + VL,MF=L ---------------------------------- CALLMFLL EQU *-CALLMFL *------------------------------------------------------------------* CALLWRT CALL , + (, + , + , + , + , + , + ,),VL,MF=L CALLWRTL EQU *-CALLWRT *------------------------------------------------------------------* *--- Data Area ---* *------------------------------------------------------------------* DATAREA DSECT DS 18F REG13 DS F * SHLEN DS F ARGCNT DS F ENVCNT DS F ENVLENS DS F ENVARGS DS F EXITRTN DS F EXITPL DS F RETVAL DS F RETCODE DS F RSNCODE DS F * PLIST DS CL(CALLMFLL) WRT DS CL(CALLWRTL) * ARGLLST DS 20F ARGSLST DS 20F * MSGADDR DS F MSG DS CL130 MSGNL DS X RTN_VAL DS F Return Value RTN_COD DS F Return Code RSN_COD DS F Reason Code * WORKF DS F DS X * CMD DS CL250 CMDLEN DS F * ARG1 DS CL250 ARG1NULL DS X ARG1LEN DS F * DARG1L DS F DARG1 DS F * TRBUF DS CL8 DS C * DW DS D * DS 0D INHEAREA DS CL(INHE#LENGTH) FDCNT DS F FDLST DS F * DATALEN EQU *-DATAREA * *------------------------------------------------------------------* *--- Register equates ---* *------------------------------------------------------------------* WORKREG EQU 2 ARGREG EQU 2 LENREG EQU 3 ARGCREG EQU 4 ARGDREG EQU 5 ARGLREG EQU 6 OFFSTREG EQU 7 COUNTREG EQU 8 RETREG EQU 9 PARMREG EQU 10 RCREG EQU 11 BASE EQU 12 DATAREG EQU 13 * EJECT *------------------------------------------------------------------* PUSH PRINT PRINT NOGEN BPXYINHE , POP PRINT *------------------------------------------------------------------* END