/************************** REXX *************************************/ /* Modified token generation */ /*-------------------------------------------------------------------*/ SAY " T31X sample"; SAY " -----------"; samp_kek = COPIES("00"x, 64); exp_key_id = copies('00'x,64) ; mac_key_id = copies('00'x,64) ; rc = genmac() rc = genexp() rc = tr31_crt() exit 0; /* gen mac token */ genmac: rcode = 'FFFFFFFF'x ; reason = 'FFFFFFFF'x ; rule_array_count = '00000003'x rule_array = 'INTERNALDOUBLE WRAP-ENH' exit_data_length = 0 ; exit_data = '' ; pucDummy = 0 ; pucZero = '00000000'x key_type = 'MAC ' ; /************************ RJEDEBUG ********************************/ SAY " KTB RULE CNT: >" || C2X(rule_array_count) || "<"; SAY " KTB RULE STR: >" || rule_array || "<"; SAY " KTB KEY TYPE: >" || key_type || "<"; SAY " KTB KEY TOKEN: >" || LENGTH(mac_key_id) || "<"; SAY " >" || C2X(LEFT( mac_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(mac_key_id, 32)) || "<"; SAY " KTB KEY VALUE: >" || C2X(pucDummy) || "<"; /************************ RJEDEBUG ********************************/ address linkpgm 'CSNBKTB' , 'rcode' , 'reason' , 'exit_data_length' , 'exit_data' , 'mac_key_id' , 'key_type' , 'rule_array_count' , 'rule_array' , 'pucDummy' 'pucDummy' 'pucDummy' 'pucDummy' 'pucDummy' , 'pucDummy' 'pucZero' 'pucDummy' 'pucDummy' ; /************************ RJEDEBUG ********************************/ SAY " KTB RET CODE: >" || C2X(rcode) || "<"; SAY " KTB REAS CODE: >" || C2X(reason) || "<"; SAY " KTB GEN TOKEN OUT1>" || LENGTH(mac_key_id) || "<"; SAY " >" || C2X(LEFT( mac_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(mac_key_id, 32)) || "<"; /************************ RJEDEBUG ********************************/ if c2d(rcode) > 0 then do say 'CSNBKTB 1 RC= ' c2x(rcode) ; say 'CSNBKTB 1 RSN=' c2x(reason) ; end rcode = 'FFFFFFFF'x ; reason = 'FFFFFFFF'x ; exit_data_length = 0 ; exit_data = '' ; key_form = 'OP ' ; key_length = 'DOUBLE ' ; key_type_1 = 'TOKEN ' ; key_type_2 = '' ; KEK_key_1 = copies('00'x,64) ; KEK_key_2 = copies('00'x,64) ; gen_key_2 = copies('00'x,64) ; /************************ RJEDEBUG ********************************/ SAY " KGN KEY FORM: >" || key_form || "<"; SAY " KGN KEY LEN: >" || key_length || "<"; SAY " KGN KEY TYPE1: >" || key_type_1 || "<"; SAY " KGN KEY TYPE2: >" || key_type_2 || "<"; SAY " KGN KEK 1: >" || LENGTH(KEK_key_1) || "<"; SAY " >" || C2X(LEFT( KEK_key_1, 32)) || "<"; SAY " >" || C2X(RIGHT(KEK_key_1, 32)) || "<"; SAY " KGN KEK 2: >" || LENGTH(KEK_key_2) || "<"; SAY " >" || C2X(LEFT( KEK_key_2, 32)) || "<"; SAY " >" || C2X(RIGHT(KEK_key_2, 32)) || "<"; SAY " KGN GEN TOKEN 1: >" || LENGTH(mac_key_id) || "<"; SAY " >" || C2X(LEFT( mac_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(mac_key_id, 32)) || "<"; SAY " KGN GEN TOKEN 2: >" || LENGTH(gen_key_2) || "<"; SAY " >" || C2X(LEFT( gen_key_2, 32)) || "<"; SAY " >" || C2X(RIGHT(gen_key_2, 32)) || "<"; /************************ RJEDEBUG ********************************/ address linkpgm 'CSNBKGN' , 'rcode' , 'reason' , 'exit_data_length' , 'exit_data' , 'key_form' , 'key_length' , 'key_type_1' , 'key_type_2' , 'KEK_key_1' , 'KEK_key_2' , 'mac_key_id' , 'gen_key_2' ; /************************ RJEDEBUG ********************************/ SAY " KGN RET CODE: >" || C2X(rcode) || "<"; SAY " KGN REAS CODE: >" || C2X(reason) || "<"; SAY " KGN GEN TOKEN OUT1>" || LENGTH(mac_key_id) || "<"; SAY " >" || C2X(LEFT( mac_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(mac_key_id, 32)) || "<"; SAY " KGN GEN TOKEN OUT2>" || LENGTH(gen_key_2) || "<"; SAY " >" || C2X(LEFT( gen_key_2, 32)) || "<"; SAY " >" || C2X(RIGHT(gen_key_2, 32)) || "<"; /************************ RJEDEBUG ********************************/ if c2d(rcode) > 0 then do say 'CSNBKGN 1 RC= ' c2x(rcode) ; say 'CSNBKGN 1 RSN=' c2x(reason) ; end return 0 /* gen exp token */ genexp: rcode = 'FFFFFFFF'x ; reason = 'FFFFFFFF'x ; rule_array_count = '00000002'x rule_array = 'INTERNALWRAP-ENH' exit_data_length = 0 ; exit_data = '' ; pucDummy = 0 ; key_type = 'EXPORTER' ; /************************ RJEDEBUG ********************************/ SAY " KTB RULE CNT: >" || C2X(rule_array_count) || "<"; SAY " KTB RULE STR: >" || rule_array || "<"; SAY " KTB KEY TYPE: >" || key_type || "<"; SAY " KTB KEY TOKEN: >" || LENGTH(exp_key_id) || "<"; SAY " >" || C2X(LEFT( exp_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(exp_key_id, 32)) || "<"; SAY " KTB KEY VALUE: >" || C2X(pucDummy) || "<"; /************************ RJEDEBUG ********************************/ address linkpgm 'CSNBKTB' , 'rcode' , 'reason' , 'exit_data_length' , 'exit_data' , 'exp_key_id' , 'key_type' , 'rule_array_count' , 'rule_array' , 'pucDummy' 'pucDummy' 'pucDummy' 'pucDummy' 'pucDummy' , 'pucDummy' 'pucDummy' 'pucDummy' 'pucDummy' ; /************************ RJEDEBUG ********************************/ SAY " KTB RET CODE: >" || C2X(rcode) || "<"; SAY " KTB REAS CODE: >" || C2X(reason) || "<"; SAY " KTB GEN TOKEN OUT1>" || LENGTH(exp_key_id) || "<"; SAY " >" || C2X(LEFT( exp_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(exp_key_id, 32)) || "<"; /************************ RJEDEBUG ********************************/ if c2d(rcode) > 0 then do say 'CSNBKTB 2 RC= ' c2x(rcode) ; say 'CSNBKTB 2 RSN=' c2x(reason) ; end rcode = 'FFFFFFFF'x ; reason = 'FFFFFFFF'x ; exit_data_length = 0 ; exit_data = '' ; key_form = 'OPEX' ; key_length = 'DOUBLE ' ; key_type_1 = 'TOKEN ' ; key_type_2 = 'IMPORTER' ; KEK_key_1 = copies('00'x,64) ; KEK_key_2 =, "010000000000C000CA6B408A02371B1DFA2F7481B25074C9C9802372E66FCD22"x ||, "00417D000341000000417D000321000000000000000000000000000030F7EF85"x ; gen_key_2 = copies('00'x,64) ; /************************ RJEDEBUG ********************************/ SAY " KGN KEY FORM: >" || key_form || "<"; SAY " KGN KEY LEN: >" || key_length || "<"; SAY " KGN KEY TYPE1: >" || key_type_1 || "<"; SAY " KGN KEY TYPE2: >" || key_type_2 || "<"; SAY " KGN KEK 1: >" || LENGTH(KEK_key_1) || "<"; SAY " >" || C2X(LEFT( KEK_key_1, 32)) || "<"; SAY " >" || C2X(RIGHT(KEK_key_1, 32)) || "<"; SAY " KGN KEK 2: >" || LENGTH(KEK_key_2) || "<"; SAY " >" || C2X(LEFT( KEK_key_2, 32)) || "<"; SAY " >" || C2X(RIGHT(KEK_key_2, 32)) || "<"; SAY " KGN GEN TOKEN 1: >" || LENGTH(exp_key_id) || "<"; SAY " >" || C2X(LEFT( exp_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(exp_key_id, 32)) || "<"; SAY " KGN GEN TOKEN 2: >" || LENGTH(gen_key_2) || "<"; SAY " >" || C2X(LEFT( gen_key_2, 32)) || "<"; SAY " >" || C2X(RIGHT(gen_key_2, 32)) || "<"; /************************ RJEDEBUG ********************************/ address linkpgm 'CSNBKGN' , 'rcode' , 'reason' , 'exit_data_length' , 'exit_data' , 'key_form' , 'key_length' , 'key_type_1' , 'key_type_2' , 'KEK_key_1' , 'KEK_key_2' , 'exp_key_id' , 'gen_key_2' ; /************************ RJEDEBUG ********************************/ SAY " KGN RET CODE: >" || C2X(rcode) || "<"; SAY " KGN REAS CODE: >" || C2X(reason) || "<"; SAY " KGN GEN TOKEN OUT1>" || LENGTH(exp_key_id) || "<"; SAY " >" || C2X(LEFT( exp_key_id, 32)) || "<"; SAY " >" || C2X(RIGHT(exp_key_id, 32)) || "<"; SAY " KGN GEN TOKEN OUT2>" || LENGTH(gen_key_2) || "<"; SAY " >" || C2X(LEFT( gen_key_2, 32)) || "<"; SAY " >" || C2X(RIGHT(gen_key_2, 32)) || "<"; /************************ RJEDEBUG ********************************/ say 'EXP_ID=' c2x(exp_key_id) ; if c2d(rcode) > 0 then do say 'CSNBKGN 2 RC= ' c2x(rcode) ; say 'CSNBKGN 2 RSN=' c2x(reason) ; end return 0 /* TR31 create */ tr31_crt: rcode = 'FFFFFFFF'x ; reason = 'FFFFFFFF'x ; exit_data_length = 0 ; exit_data = '' ; rule_array_count = '00000003'x rule_array = 'VARDRV-BISOMAC3 GEN-ONLY' key_ver_num = '00' ; key_field_len = '00000018'x source_key_ID_len = '00000040'x source_key_ID = mac_key_id unwrap_KEK_ID_len = '00000000'x ; unwrap_KEK_ID = ''; wrap_KEK_ID_len = '00000040'x ; wrap_KEK_ID = exp_key_id opt_blks_len = '00000000'x ; opt_blks = ''; tr31_blk_len = '00000080'x tr31_blk = copies('00'x,128) ; /************************ RJEDEBUG ********************************/ /* let's play with the rules */ /*----------------------------------------------------------------*/ rule_array_count = "00000004"x rule_array = "VARXOR-AISOMAC3 GEN-ONLYINCL-CV "; rule_array_count = "00000004"x rule_array = "VARDRV-BISOMAC3 GEN-ONLYINCL-CV "; rule_array_count = "00000004"x rule_array = "VARXOR-AISOMAC3 GENVER INCL-CV "; rule_array_count = "00000004"x rule_array = "VARXOR-AISOMAC3 GEN-ONLYINCL-CV "; rule_array_count = "00000004"x rule_array = "VARDRV-BISOMAC3 GENVER INCL-CV "; rule_array_count = "00000004"x rule_array = "VARDRV-BISOMAC3 GEN-ONLYINCL-CV "; rule_array_count = '00000003'x rule_array = 'VARDRV-BISOMAC3 GEN-ONLY' /************************ RJEDEBUG ********************************/ /************************ RJEDEBUG ********************************/ SAY " T31X RULE CNT: >" || C2X(rule_array_count) || "<"; SAY " T31X RULE STR: >" || rule_array || "<"; SAY " T31X KEY VER NUM: >" || key_ver_num || "<"; SAY " T31X SRC FLD LEN: >" || C2X(key_field_len) || "<"; SAY " T31X SRC KEY LEN: >" || C2X(source_key_ID_len) || "<"; SAY " >" || C2X(LEFT( source_key_ID, 32)) || "<"; SAY " >" || C2X(RIGHT(source_key_ID, 32)) || "<"; SAY " T31X SRC UWRAP LEN:>" || C2X(unwrap_KEK_ID_len) || "<"; SAY " T31X SRC WRAP LEN: >" || C2X(wrap_KEK_ID_len) || "<"; SAY " >" || C2X(LEFT( wrap_KEK_ID, 32)) || "<"; SAY " >" || C2X(RIGHT(wrap_KEK_ID, 32)) || "<"; SAY " T31X OPT BLK LEN: >" || C2X(opt_blks_len) || "<"; SAY " T31X OUT BLK LEN: >" || C2X(tr31_blk_len) || "<"; /************************ RJEDEBUG ********************************/ address linkpgm 'CSNBT31X' , 'rcode' 'reason' 'exit_data_length' 'exit_data' , 'rule_array_count' 'rule_array' , 'key_ver_num' , 'key_field_len' , 'source_key_ID_len' , 'source_key_ID' , 'unwrap_KEK_ID_len' , 'unwrap_KEK_ID' , 'wrap_KEK_ID_len' , 'wrap_KEK_ID' , 'opt_blks_len' , 'opt_blks' , 'tr31_blk_len' , 'tr31_blk' ; /************************ RJEDEBUG ********************************/ SAY " T31X RETCODE: >" || C2X(rcode) || "<"; SAY " T31X REASCODE: >" || C2X(reason) || "<"; SAY " T31X BLK LEN: >" || C2X(tr31_blk_len) || "<"; blk_len = C2D(tr31_blk_len) n = 1; DO WHILE(n < blk_len) blkx = SUBSTR(tr31_blk, n, 32); SAY " >" || C2X(blkx) || "<"; n = n + 32; END; /************************ RJEDEBUG ********************************/ say ' -------------- '; say ' T31X Ret is = ' c2x(rcode) say ' T31X Reas is = ' c2x(reason) say ' -------------- '; return 0