Example in ILE C: Setting up keysSee 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;
}

| Top | Cryptographic Services APIs |APIs by category |