/* Rexx */
/* --------------------------------------------------------------- */
/* Symmetric Key Encryption/Decryption (CSNBSYE/CSNBSYD) using */
/* a clear key value in AES GCM encryption */
/* */
/* - call Random Number Generate to generate a random clear key */
/* value to use in SYE/SYD */
/* - use clear key in SYE/SYD */
/* */
/* See the ICSF Application Programmer's Guide for detailed */
/* information on the callable services used in this sample. */
/* --------------------------------------------------------------- */
SIGNAL ON NOVALUE ;
/* generate a random key value */
random_number_length = '00000020'x ; /* AES 256-bit clear key */
random_number = copies('00'x,c2d(random_number_length)) ;
CALL RNGL ;
/* use clear key value in symmetric encryption */
SYE_rule_array_count = '00000004'x ;
SYE_rule_array = 'AES ' ||,
'GCM ' ||,
'KEY-CLR ' ||,
'ONLY ' ;
SYE_key_id_length = random_number_length ;
SYE_key_id = random_number ;
SYE_block_size = '00000010'x ;
SYE_initial_vector_length = '00000010'x ;
SYE_initial_vector = '01002010000010010100201000001001'x ;
SYE_clear_text_length = '0000001A'x ;
SYE_clear_text = 'abcdefghijklmnopqrstuvwxyz' ;
CALL SYE ;
/* decrypt enciphered text */
SYD_key_id_length = SYE_key_id_length ;
SYD_key_id = SYE_key_id ;
CALL SYD ;
EXIT ;
/* --------------------------------------------------------------- */
/* Random Number Generate */
/* --------------------------------------------------------------- */
RNGL:
/* initialize parameter list */
RNGL_rc = 'FFFFFFFF'x ;
RNGL_rs = 'FFFFFFFF'x ;
exit_data_length = '00000000'x ;
exit_data = '' ;
RNGL_rule_array_count = '00000001'x ;
RNGL_rule_array = 'RANDOM ' ;
reserved_length = '00000000'x ;
reserved = '' ;
/* call CSNBRNGL */
ADDRESS LINKPGM 'CSNBRNGL' ,
'RNGL_rc' ,
'RNGL_rs' ,
'exit_data_length' ,
'exit_data' ,
'RNGL_rule_array_count' ,
'RNGL_rule_array' ,
'reserved_length' ,
'reserved' ,
'random_number_length' ,
'random_number' ;
IF (RNGL_rc /= '00000000'x) THEN
DO ;
SAY 'RNGL: rc =' c2x(RNGL_rc) 'rs =' c2x(RNGL_rs) ;
EXIT ;
END ;
ELSE
SAY 'random number:' c2x(random_number) ;
RETURN ;
/*-------------------------------------------------------------------*/
/* Symmetric Key Encipher */
/*-------------------------------------------------------------------*/
SYE:
/* initialize parameter list */
SYE_rc = 'FFFFFFFF'x ;
SYE_rs = 'FFFFFFFF'x ;
exit_data_length = '00000000'x ;
exit_data = '' ;
SYE_key_parms_length = '0000000C'x ;
SYE_key_parms = copies('00'x,c2d(SYE_key_parms_length)) ;
SYE_chain_data_length = '00000040'x ;
SYE_chain_data = copies('00'x,c2d(SYE_chain_data_length)) ;
SYE_cipher_text_length = SYE_clear_text_length ;
SYE_cipher_text = copies('00'x,c2d(SYE_cipher_text_length)) ;
SYE_opt_data_length = '00000000'x ;
SYE_opt_data = '' ;
/* call CSNBSYE */
ADDRESS LINKPGM 'CSNBSYE' ,
'SYE_rc' ,
'SYE_rs' ,
'exit_data_length' ,
'exit_data' ,
'SYE_rule_array_count' ,
'SYE_rule_array' ,
'SYE_key_id_length' ,
'SYE_key_id' ,
'SYE_key_parms_length' ,
'SYE_key_parms' ,
'SYE_block_size' ,
'SYE_initial_vector_length' ,
'SYE_initial_vector' ,
'SYE_chain_data_length' ,
'SYE_chain_data' ,
'SYE_clear_text_length' ,
'SYE_clear_text' ,
'SYE_cipher_text_length' ,
'SYE_cipher_text' ,
'SYE_opt_data_length' ,
'SYE_opt_data' ;
IF (SYE_rc /= '00000000'x) THEN
DO ;
SAY 'SYE failed: rc =' c2x(SYE_rc) 'rs =' c2x(SYE_rs) ;
EXIT ;
END ;
ELSE
DO ;
SAY 'SYE cipher text length:' c2x(SYE_cipher_text_length) ;
SAY 'SYE cipher text:' c2x(SYE_cipher_text) ;
END ;
RETURN ;
/*-------------------------------------------------------------------*/
/* Symmetric Key Decipher */
/*-------------------------------------------------------------------*/
SYD:
/* initialize parameter list */
SYD_rc = 'FFFFFFFF'x ;
SYD_rs = 'FFFFFFFF'x ;
exit_data_length = '00000000'x ;
exit_data = '' ;
SYD_rule_array_count = SYE_rule_array_count ;
SYD_rule_array = SYE_rule_array ;
SYD_key_parms_length = SYE_key_parms_length ;
SYD_key_parms = SYE_key_parms ;
SYD_block_size = SYE_block_size ;
SYD_initial_vector_length = SYE_initial_vector_length ;
SYD_initial_vector = SYE_initial_vector ;
SYD_chain_data_length = '00000040'x ;
SYD_chain_data = copies('00'x,c2d(SYD_chain_data_length)) ;
SYD_cipher_text_length = SYE_cipher_text_length ;
SYD_cipher_text = SYE_cipher_text ;
SYD_clear_text_length = SYD_cipher_text_length ;
SYD_clear_text = copies('00'x,c2d(SYD_clear_text_length)) ;
SYD_opt_data_length = SYE_opt_data_length ;
SYD_opt_data = SYE_opt_data ;
/* call CSNBSYD */
ADDRESS LINKPGM 'CSNBSYD' ,
'SYD_rc' ,
'SYD_rs' ,
'exit_data_length' ,
'exit_data' ,
'SYD_rule_array_count' ,
'SYD_rule_array' ,
'SYD_key_id_length' ,
'SYD_key_id' ,
'SYD_key_parms_length' ,
'SYD_key_parms' ,
'SYD_block_size' ,
'SYD_initial_vector_length' ,
'SYD_initial_vector' ,
'SYD_chain_data_length' ,
'SYD_chain_data' ,
'SYD_cipher_text_length' ,
'SYD_cipher_text' ,
'SYD_clear_text_length' ,
'SYD_clear_text' ,
'SYD_opt_data_length' ,
'SYD_opt_data' ;
IF (SYD_rc /= '00000000'x) THEN
SAY 'SYD failed: rc =' c2x(SYD_rc) 'rs =' c2x(SYD_rs) ;
ELSE
DO ;
SAY 'SYD clear text length:' c2x(SYD_clear_text_length) ;
SAY 'SYD clear text:' SYD_clear_text ;
IF SYD_clear_text = SYE_clear_text THEN
SAY '***** DECIPHERED TEXT MATCHES CLEAR TEXT *****' ;
END ;
RETURN ;
/* --------------------------------------------------------------- */
/* Debug */
/* --------------------------------------------------------------- */
NOVALUE:
Say "Condition NOVALUE was raised." ;
Say CONDITION("D") "variable was not initialized." ;
Say SOURCELINE(sigl) ;
EXIT ;