Change this program example to suit your needs for loading a function control vector for your Cryptographic Coprocessor.
/*------------------------------------------------------------*/ /* Load the Function Control Vector into the card. */ /* The Function Control Vector enables the cryptographic */ /* functions of the card and is shipped with the */ /* Cryptographic Access Provider products. */ /* */ /* COPYRIGHT 5769-SS1 (c) IBM Corp 1999 */ /* */ /* 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. */ /* */ /* Note: The Function Control Vector is stored in an IFS */ /* file owned by the system. The format of this */ /* vector is described in an appendix of the */ /* IBM CCA Basic Services Reference and Guide */ /* (SC31-8609) publication. */ /* */ /* Parameters: */ /* none. */ /* */ /* Example: */ /* CALL PGM(LOAD_FCV) */ /* */ /* Note: This program assumes the device you want to load is */ /* already identified either by defaulting to the CRP01 */ /* device or has been explicitly named using the */ /* Cryptographic_Resource_Allocate verb. Also this */ /* device must be varied on and you must be authorized */ /* to use this device description. */ /* */ /* Use the following commands to compile this program: */ /* ADDLIBLE LIB(QCCA) */ /* CRTCMOD MODULE(LOAD_FCV) SRCFILE(SAMPLE) SYSIFCOPT(*IFSIO) */ /* CRTPGM PGM(LOAD_FCV) MODULE(LOAD_FCV) + */ /* BNDSRVPGM(QCCA/CSUACFC) */ /* */ /* Note: Authority to the CSUACFC service program in the */ /* QCCA library is assumed. */ /* */ /* Common Cryptographic Architecture (CCA) verbs used: */ /* Cryptographic_Facility_Control (CSUACFC) */ /* */ /*------------------------------------------------------------*/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <decimal.h> #include "csucincl.h" /* header file for CCA Cryptographic Service Provider */ /*-------------------------------------------------------------------*/ /* function to translate ASCII to EBCDIC and/or EBCDIC to ASCII */ /*-------------------------------------------------------------------*/ #pragma linkage(QDCXLATE, OS, nowiden) void QDCXLATE(decimal(5,0)*, char *, char *, char *); int main(void) { /*-------------------------------------------------------------------*/ /* standard return codes */ /*-------------------------------------------------------------------*/ #define ERROR -1 #define OK 0 /*-------------------------------------------------------------------*/ /* standard CCA parameters */ /*-------------------------------------------------------------------*/ long return_code; long reason_code; long exit_data_length; char exit_data[2]; char rule_array[4][8]; long rule_array_count; /*-------------------------------------------------------------------*/ /* fields unique to this sample program */ /*-------------------------------------------------------------------*/ long verb_data_length; char *verb_data; char buffer[1000]; char description[81]; decimal(5,0) descr_length = 80; int num_bytes; FILE *fcv; /*-------------------------------------------------------------------*/ /* retrieve FCV from IBM supplied file */ /*-------------------------------------------------------------------*/ fcv = fopen("/QIBM/ProdData/CAP/FCV.CRT", "rb"); if (fcv==NULL) { printf("Function Control Vector file not available\n\n"); return ERROR; /* File not found or not authorized */ } num_bytes = fread(buffer,1,1000,fcv); fclose(fcv); if (num_bytes != 802) { printf("Function Control Vector file has wrong size\n\n"); return ERROR; /* Incorrect number of bytes read */ } /*-------------------------------------------------------------------*/ /* extract fields in FCV needed by card */ /* Note: use offsets and lengths from CCA publication listed earlier */ /*-------------------------------------------------------------------*/ memcpy(description, &buffer[390],80); description[80] = 0; QDCXLATE(&descr_length, description, "QEBCDIC ", "QSYS "); printf("Loading Function Control Vector: %s\n",description); verb_data_length = 204; verb_data = &buffer[470]; rule_array_count = 2; memcpy((char*)rule_array,"ADAPTER1LOAD-FCV",16); /*-------------------------------------------------------------------*/ /* Load the card with the FCV just retrieved */ /*-------------------------------------------------------------------*/ CSUACFC(&return_code, &reason_code, &exit_data_length, exit_data, &rule_array_count, (char*)rule_array, &verb_data_length, verb_data); if (return_code != 0) { printf("Function Control Vector rejected for reason %d/%d\n\n", return_code, reason_code); return ERROR; /* Operation failed. */ } else { printf("Loading Function Control Vector succeeded\n\n"); printf("SAPI returned %ld/%ld\n\n", return_code, reason_code); return OK; } }