Start of change Example in ILE C: Setting up keys

See Code disclaimer information for information pertaining to code examples.

Refer to Scenario: Key Management and File Encryption Using the Cryptographic Services APIs for a description of this scenario.

/*-------------------------------------------------------------------*/
/*                                                                   */
/* Sample C program:  Setup_Cus                                      */
/*                                                                   */
/*  COPYRIGHT      5722-SS1 (c) IBM Corp 2006                        */
/*                                                                   */
/*  This material contains programming source code for your          */
/*  consideration.  These examples have not been thoroughly          */
/*  tested under all conditions.  IBM, therefore, cannot             */
/*  guarantee or imply reliability, serviceability, or function      */
/*  of these programs.  All programs contained herein are            */
/*  provided to you "AS IS". THE IMPLIED WARRANTIES OF               */
/*  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE         */
/*  EXPRESSLY DISCLAIMED. IBM provides no program services for       */
/*  these programs and files.                                        */
/*                                                                   */
/* Description:                                                      */
/*  This is a sample program to demonstrate use of the Cryptographic */
/*  Services APIs.  APIs demonstrated in this program are:           */
/*   Create Key Store                                                */
/*   Generate Key Record                                             */
/*   Create Key Context                                              */
/*   Create Algorithm Context                                        */
/*   Generate Symmetric Key                                          */
/*   Destroy Key Context                                             */
/*   Destroy Algorithm Context                                       */
/*                                                                   */
/* Function:                                                         */
/*  Create CUSDTA file for storing customer information              */	
/*  Create CUSPI file for storing information needed to process      */
/*    CUSDTA file.                                                   */
/*  Create key store file, CUSKEYFILE.                               */
/*  Create a KEK in CUSKEYFILE with label CUSDTAKEK.                 */
/*  Generate a key encrypted under CUSDTAKEK and store in CUSPI.     */
/*                                                                   */
/*  Refer to the iSeries (TM) Information Center for a full          */
/*  description of this scenario.                                    */
/*                                                                   */
/* Use the following commands to compile this program:               */
/*   CRTCMOD MODULE(MY_LIB/SETUP_CUS) SRCFILE(MY_LIB/MY_SRC)         */
/*   CRTPGM  PGM(MY_LIB/SETUP_CUS) MODULE(MY_LIB/SETUP_CUS) +        */
/*           BNDSRVPGM(QC3KSCRT QC3KRGEN QC3KEYGN QC3CTX)            */
/*                                                                   */
/*-------------------------------------------------------------------*/
 
/*-------------------------------------------------------------------*/
/* Retrieve various structures/utilities.                            */
/*-------------------------------------------------------------------*/
 
#include <stdio.h>                    /* Standard I/O header         */
#include <stdlib.h>                   /* General utilities           */
#include <stddef.h>                   /* Standard definitions        */
#include <string.h>                   /* String handling utilities   */
#include <recio.h>                    /* Record I/O routines         */
#include <qusec.h>                    /* Error code structure        */
#include <qc3kscrt.h>                 /* Hdr for Create Key Store API*/
#include <qc3krgen.h>                 /* Hdr for Gen Key Record API  */
#include <qc3keygn.h>                 /* Hdr for Generate Key APIs   */
#include <qc3ctx.h>                   /* Hdr for Context APIs        */

/*-------------------------------------------------------------------*/
/* The following structure was generated with GENCSRC.               */
/*-------------------------------------------------------------------*/
 
  #ifdef __cplusplus                                            
  #include <bcd.h>                                              
  #else                                                         
  #include <decimal.h>                                          
  #endif                                                        
  /* ------------------------------------------------------- *  
  // PHYSICAL FILE : MY_LIB/CUSPI                                
  // FILE LAST CHANGE DATE : 2004/02/11                         
  // RECORD FORMAT : CUSPIREC                                   
  // FORMAT LEVEL IDENTIFIER : 248C15A88E09C                    
   * ------------------------------------------------------- */ 
  typedef _Packed struct {                                                 
     char KEY[16];                         /* ENCRYPTION KEY */            
                                                                         
  #ifndef __cplusplus                                                      
     decimal( 8, 0) LASTCUS;                                               
  #else                                                                    
     _DecimalT< 8, 0> LASTCUS;             /* LAST CUSTOMER NUMBER */      
                                           /* BCD class SPECIFIED IN DDS */
  #endif                                                                   
  } CUSPIREC_both_t;                                           

/*-------------------------------------------------------------------*/
/* Start of mainline code.                                           */
/*-------------------------------------------------------------------*/

int main()
{
    
/*-------------------------------------------------------------------*/
/* Return codes                                                      */
/*-------------------------------------------------------------------*/
 
  int                   rtn;          /* Return code                 */
  #define               ERROR  -1
  #define               OK      0
 
/*-------------------------------------------------------------------*/
/* File handling variables                                           */
/*-------------------------------------------------------------------*/

  _RFILE               *cuspiPtr;     /* Pointer to CUSPI  file      */
  CUSPIREC_both_t       cuspi;        /* CUSPI record                */
  _RIOFB_T             *db_fdbk;      /* I/O Feedback                */
 
/*-------------------------------------------------------------------*/
/* Parameters needed by the Cryptographic Services APIs              */
/*-------------------------------------------------------------------*/
 
  Qus_EC_t              errCode;      /* Error code structure        */
  char                  csp;          /* Crypto service provider     */
  char                  ksauth[10];   /* Key store authority         */
  char                  ksdesc[50];   /* Key store description       */
  int                   mkid;         /* Master key ID               */
  int                   disFunc;      /* Disallowed function value   */
  int                   pubExp;       /* Public key exponent         */ 
  int                   keyType;      /* Key type                    */
  int                   keySize;      /* Key size                    */
  char                  keyFormat;    /* Key format                  */
  char                  keyForm;      /* Key form                    */
  int                   keyStringLen; /* Length of key string        */
  Qc3_Format_KEYD0400_T kskey;        /* Key store key name structure*/
  char                  KEKctx[8];    /* KEK key context token       */
  Qc3_Format_ALGD0200_T algD;         /* Block cipher alg description*/
  char                  AESctx[8];    /* AES alg context token       */
  int                   keyLen;       /* Length of generated key     */
 
/*-------------------------------------------------------------------*/
/* Initializations                                                   */
/*-------------------------------------------------------------------*/

                                      /* Init to good return         */
  rtn = OK;                   
                                      /* Set to generate exceptions  */
  memset(&errCode, 0, sizeof(errCode));
                                      /* Use any crypto provider     */
  csp = Qc3_Any_CSP;

/*-------------------------------------------------------------------*/
/* Create file CUSDTA, used for storing customer information.        */
/*-------------------------------------------------------------------*/

  system("CRTPF FILE(MY_LIB/CUSDTA) "
         "SRCFILE(MY_LIB/QDDSSRC) SRCMBR(CUSDTA) AUT(*EXCLUDE)");

/*-------------------------------------------------------------------*/
/* Create file CUSPI, used for processing file CUSDTA.               */
/*-------------------------------------------------------------------*/

  system("CRTPF FILE(MY_LIB/CUSPI) "
         "SRCFILE(MY_LIB/QDDSSRC) SRCMBR(CUSPI) AUT(*EXCLUDE)");

/*-------------------------------------------------------------------*/
/* Create key store file, CUSKEYFILE, and generate a key record      */
/* with label CUSDTAKEK.                                             */
/*-------------------------------------------------------------------*/

  memset(&kskey, 0, sizeof(kskey));   /* Init name structure to null */

  /* Create key store file CUSKEYFILE                                */
                                      /* Init file name to blank     */
  memset(kskey.Key_Store, 0x40, sizeof(kskey.Key_Store));
                                      /* Set file name               */
  memcpy(kskey.Key_Store,"CUSKEYFILEMY_LIB", 16);
  memcpy(ksauth, "*EXCLUDE  ", 10);   /* Set public auth to *EXCLUDE */
                                      /* Set file text description   */
  memcpy(ksdesc, "Key store for Customer data files, CUSDTA & CUSPI ", 50);
                                      /* Set to use master key 3 to  */
  mkid = Qc3_Master_Key_3;            /* encrypt key store keys      */

                                      /* Create key store file       */
  Qc3CreateKeyStore(kskey.Key_Store, &mkid, ksauth, ksdesc, &errCode);

  /* Generate AES key record CUSDTAKEK                               */
                                      /* Init record label to blank  */
  memset(kskey.Record_Label, 0x40, sizeof(kskey.Record_Label));
                                      /* Set the record label        */
  memcpy(kskey.Record_Label, "CUSDTAKEK", 9);
  keyType = Qc3_AES;                  /* Key type is AES             */
  keySize = 16;                       /* Key size is 16 (128 bit)    */
  pubExp = 0;                         /* Ignore public key exponent  */
  disFunc=0;                          /* No disallowed functions     */

                                      /* Generate an AES key record  */
  Qc3GenKeyRecord(kskey.Key_Store, kskey.Record_Label, &keyType, &keySize,
                  &pubExp, &disFunc, &csp, NULL, &errCode);
 
/*-------------------------------------------------------------------*/
/* Create a key context for CUSDTAKEK.                               */
/*-------------------------------------------------------------------*/

  keyStringLen = sizeof(kskey);       /* Set length of key string    */
  keyFormat = Qc3_KSLabel_Struct;     /* Key format is keystore label*/
  keyForm = Qc3_Clear;                /* Key string is clear         */
                                      /* Key type already set to AES */
                                      /* Create key context          */
  Qc3CreateKeyContext((char*)&kskey, &keyStringLen, &keyFormat,
                      &keyType, &keyForm, NULL, NULL, KEKctx, &errCode);

/*-------------------------------------------------------------------*/
/* Create an AES algorithm context for CUSDTAKEK.                    */
/*-------------------------------------------------------------------*/
 
  memset(&algD, 0, sizeof(algD));     /* Init alg description to null*/
  algD.Block_Cipher_Alg = Qc3_AES;    /* Set AES algorithm           */
  algD.Block_Length = 16;             /* Block size is 16            */
  algD.Mode = Qc3_CBC;                /* Use cipher block chaining   */
  algD.Pad_Option = Qc3_No_Pad;       /* Do not pad                  */
                                      /* Create algorithm context    */
  Qc3CreateAlgorithmContext((unsigned char*)&algD, Qc3_Alg_Block_Cipher,
                            AESctx, &errCode);

/*-------------------------------------------------------------------*/
/* Generate a file key encrypted under CUSDTAKEK.                    */
/*-------------------------------------------------------------------*/

  keyFormat = Qc3_Bin_String;         /* Return a binary string      */
  keyForm = Qc3_Encrypted;            /* Encrypt generated key       */
  keyLen = 16;                        /* Receiver is 16 bytes long   */
                                      /* Key type already set to AES */
                                      /* Key size already set to 16  */
                                      /* Generate encrypted key      */
  Qc3GenSymmetricKey(&keyType, &keySize, &keyFormat, &keyForm,
                     (unsigned char*)&KEKctx, (unsigned char*)&AESctx,
                     &csp, NULL, cuspi.KEY, &keyLen, &keyLen, &errCode);

/*-------------------------------------------------------------------*/
/*  Write record with encrypted file key to CUSPI.                   */
/*-------------------------------------------------------------------*/

  cuspi.LASTCUS = 0;                  /* Set last customer num to 0  */

                                      /* Open CUSDTA file            */
  if ((cuspiPtr = _Ropen("MY_LIB/CUSPI", "wr, riofb=N"))
       == NULL)
  {                                   /* If null ptr returned        */
                                      /* Send error message          */
    printf("Open of CUSPI file failed.");
    return ERROR;
  }
                                      /* Write encrypted key and     */
                                      /* last customer number to file*/
  db_fdbk = _Rwrite(cuspiPtr, &cuspi, sizeof(cuspi));
  if (db_fdbk->num_bytes < sizeof(cuspi))
  {                                   /* If data not written         */
                                      /* Send error message          */
    printf("Error writing to file CUSPI.");
    _Rclose(cuspiPtr);                /* Close CUSPI file            */
    return ERROR;                     /* Return error                */
  }

/*-------------------------------------------------------------------*/
/* Cleanup.                                                          */
/*-------------------------------------------------------------------*/
  
                                      /* Wipe out encrypted file key */
  memset(cuspi.KEY, 0, sizeof(cuspi.KEY));
                                      /* Destroy KEK context         */
  Qc3DestroyKeyContext(KEKctx, &errCode);
                                      /* Destroy AES alg context     */
  Qc3DestroyAlgorithmContext(AESctx, &errCode);
                                      /* Close CUSPI file            */
  _Rclose(cuspiPtr); 
                                      /* Return                      */
  return rtn;

}

End of change



Top | Cryptographic Services APIs |APIs by category