IBM Crypto Education Community

IBM Crypto Education Community

IBM Crypto Education Community

Join the IBM Crypto Education community to explore and understand IBM cryptography technology. This community is operated and maintained by the IBM Crypto Development team.

 View Only

Rexx Sample: CSNBSYE GCM encryption mode using AES clear key

By Eysha Shirrine Powers posted Wed March 25, 2020 05:30 PM

  

/* 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 ;

0 comments
11 views

Permalink