RSA BSAFE Cert-C

Certificate Components for C

Crypto-C 6.2.1 Developer's Guide
Search

crlutil.c

Prints information contained in a CRL object in a readable manner. Gathers user input to place into a CRL object.

/* $Id: crlutil.c,v 1.5 2004/03/02 05:18:37 gsingh Exp $ */
/* crlutil.c
** Copyright (c) 1999-2002, RSA Security Inc.
**
** This file is used to demonstrate how to interface to an RSA Security
** licensed development product.  You have a royalty-free right to use,
** modify, reproduce and distribute this demonstration file (including
** any modified version), provided that you agree that RSA Security has
** no warranty, implied or otherwise, or liability for this demonstration
** file or any modified version.
**
** This file contains routines that are used to print the information
** contained in a CRL object in a readable manner, as well as routines used
** to gather user input to place into a CRL object.
*/

#include "crlutil.h"

int RSA_SaveCrlObjToFile (CRL_OBJ crlObj)
{
  int status = 0;
  ITEM crlBer = {NULL, 0};

  status = C_GetCRLDER (crlObj, &crlBer.data, &crlBer.len);
  if (status != 0)
    goto CLEANUP;

  status = RSA_WriteDataToFile (crlBer.data, crlBer.len,
                                "Enter name of file to store CRL binary");

CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_SaveCrlObjToFile", status);

  return status;
}  /* end RSA_SaveCrlObjToFile */

int RSA_PrintCrlObject (CRL_OBJ crlObj)
{
  int status = 0;
  
  CRL_FIELDS crlFields;

  status = C_GetCRLFields (crlObj, &crlFields);
  if (status != 0)
    goto CLEANUP;

  switch (crlFields.version) {
    case CRL_VERSION_1:
      RSA_PrintMessage ("Version 1 CRL\n");
      break;
    case CRL_VERSION_2:
      RSA_PrintMessage ("Version 2 CRL\n");
      break;
    default:
      RSA_PrintMessage ("Unknown version: %u\n", crlFields.version);
  }

  RSA_PrintSignatureAlgorithm (crlFields.signatureAlgorithm);
  RSA_PrintNameObject ("Issuer Name", crlFields.issuerName);
  RSA_PrintUint4Time ("Last Update", crlFields.lastUpdate);
  RSA_PrintUint4Time ("Next Update", crlFields.nextUpdate);
  RSA_PrintCrlEntries (crlFields.crlEntries);

  if (crlFields.crlExtensions != NULL)
    status = RSA_PrintExtensionsObject (crlFields.crlExtensions);

CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_PrintCrlObject", status);

  return status;
}  /* end RSA_PrintCrlObject */

int RSA_PrintCrlInfo (CRL_OBJ crlObj)
{
  int status = 0;
  char *nameString = NULL;
  CRL_FIELDS crlFields;

  status = C_GetCRLFields (crlObj, &crlFields);
  if (status != 0)
    goto CLEANUP;

  status = C_GetNameString (crlFields.issuerName, &nameString);
  if (status != 0)
    goto CLEANUP;

  RSA_PrintMessage ("CRL Issuer: %s\n", nameString);
  RSA_PrintUint4Time ("Last Update", crlFields.lastUpdate);
  RSA_PrintUint4Time ("Next Update", crlFields.nextUpdate);
  
CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_PrintCrlInfo", status);
  
  return status;
}  /* end RSA_PrintCrlInfo */

int RSA_PrintCrlList (LIST_OBJ crls)
{
  int status = 0;
  unsigned int numEntries = 0, i = 0;
  POINTER entry = NULL;

  status = C_GetListObjectCount (crls, &numEntries);
  if (status != 0)
    goto CLEANUP;

  if (numEntries == 0)
    RSA_PrintMessage ("No entries.\n");

  for (i = 0; i < numEntries; i++) {
    status = C_GetListObjectEntry (crls, i, &entry);
    if (status != 0)
      goto CLEANUP;

    RSA_PrintMessage ("***CRL #%d:\n", i+1);
    status = RSA_PrintCrlInfo ((CRL_OBJ)entry);
    if (status != 0)
      goto CLEANUP;
  }

CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_PrintCrlList", status);

  return status;
}  /* end RSA_PrintCrlList */

static int ChooseCrlVersionPrompt (UINT2 *version)
{
  int status = 0;

  RSA_DEMO_TABLE_ENTRY verTable[2];
  RSA_DEMO_TABLE_ENTRY *choice = (RSA_DEMO_TABLE_ENTRY *)NULL_PTR;

  verTable[0].description = "Version 1";
  verTable[0].val.value = CRL_VERSION_1;
  verTable[1].description = "Version 2";
  verTable[1].val.value = CRL_VERSION_2;

  status = ChooseTableEntryPrompt
           (verTable, sizeof (verTable) / sizeof (RSA_DEMO_TABLE_ENTRY),
            &choice);
  if (status != 0)
    goto CLEANUP;

  *version = (UINT2)choice->val.value;

CLEANUP:
  if (status != 0)
    RSA_PrintError ("ChooseCrlVersionPrompt", status);

  return status;
}  /* end ChooseCrlVersionPrompt */

int RSA_GetInputToCrlObject (CERTC_CTX ctx, CRL_OBJ crlObj)
{
  int status = 0;
  
  ALGORITHM_IDENTIFIER algId;
  CRL_FIELDS crlFields;
  B_KEY_OBJ privateKey = NULL;

  /*  Obtain access to the objects created when C_CreateCRLObject was called.
   */
  status = C_GetCRLFields (crlObj, &crlFields);
  if (status != 0)
    goto CLEANUP;

  status = ChooseCrlVersionPrompt (&crlFields.version);
  if (status != 0)
    goto CLEANUP;

  status = RSA_ChooseSignatureAlgorithmPrompt (&algId);
  if (status != 0)
    goto CLEANUP;

  crlFields.signatureAlgorithm = algId.algorithmId;

  status = RSA_GetNameObject (crlFields.issuerName, "issuer");
  if (status != 0)
    goto CLEANUP;

  status = RSA_GetInputToUint4Time (&crlFields.lastUpdate,
                                    "Enter last update time");
  if (status != 0)
    goto CLEANUP;

  status = RSA_GetInputToUint4Time (&crlFields.nextUpdate,
                                    "Enter next update time");
  if (status != 0)
    goto CLEANUP;

  status = RSA_GetCrlEntries (crlFields.version, crlFields.crlEntries, ctx);
  if (status != 0)
    goto CLEANUP;
  
  if (crlFields.version != CRL_VERSION_1) {
    status = RSA_GetExtensionsObject (crlFields.crlExtensions,
                                      CRL_EXTENSIONS_OBJ);
    if (status != 0)
      goto CLEANUP;
  }

  crlFields.reserved = NULL_PTR;

  status = C_SetCRLFields (crlObj, &crlFields);
  if (status != 0)
    goto CLEANUP;

  status = RSA_GetKeyObjFromFile (RSA_DEMO_PRIVATE_KEY, &privateKey);
  if (status != 0)
    goto CLEANUP;
  
  status = C_SignCRL (crlObj, privateKey);
  
CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_GetInputToCrlObject", status);

  B_DestroyKeyObject (&privateKey);
  
  return status;
}  /* end RSA_GetInputToCrlObject */

int RSA_GetCrlObject (CERTC_CTX ctx, CRL_OBJ crlObj)
{
  int status = 0;
  unsigned char *crlBer = NULL;
  unsigned int crlBerLen = 0;

  RSA_PrintMessage ("Enter name of file containing CRL object binary\n");
  
  status = RSA_GetFileToAllocBuffer (&crlBer, &crlBerLen,
                                     "(blank to create a new one)");
  if (status == RSA_DEMO_E_CANCEL) {
    status = RSA_GetInputToCrlObject (ctx, crlObj);
    /* whatever happens, we're done here */
    goto CLEANUP;
  }
  if (status != 0)
    goto CLEANUP;

  status = C_SetCRLBER (crlObj, crlBer, crlBerLen);
  if (status != 0)
    goto CLEANUP;
  
CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_GetCrlObject", status);

  T_free (crlBer);
  
  return status;
}  /* end RSA_GetCrlObject */

int RSA_AddCrlsToDbPrompt (CERTC_CTX ctx, SERVICE db)
{
  int status = 0;
  ITEM crlBer = {NULL, 0};
  CRL_OBJ crlObj = NULL;

  for (;;) {
    status = RSA_GetFileToAllocBuffer
             (&crlBer.data, &crlBer.len,
              "Enter name of CRL binary file (blank when finished)");
    if (status == RSA_DEMO_E_CANCEL) {
      status = 0;
      break;
    }
    else if (status != 0)
      goto CLEANUP;

    status = C_CreateCRLObject (&crlObj, ctx);
    if (status != 0)
      goto CLEANUP;

    status = C_SetCRLBER (crlObj, crlBer.data, crlBer.len);
    if (status != 0)
      goto CLEANUP;

    /* Note that another option is to use C_InsertCertList, perhaps in
     * conjunction with RSA_AddCertsToListPrompt.
     */
    status = C_InsertCRL (db, crlObj);
    if (status != 0)
      goto CLEANUP;

    T_free (crlBer.data);
    crlBer.data = NULL;
    C_DestroyCRLObject (&crlObj);
  }
  
CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_AddCrlsToDbPrompt", status);
 
  T_free (crlBer.data);
  C_DestroyCRLObject (&crlObj);

  return status;
}  /* end RSA_AddCrlsToDbPrompt */

int RSA_AddCrlsToListPrompt (CERTC_CTX ctx, LIST_OBJ crlList)
{
  int status = 0;
  ITEM crlBer = {NULL, 0};
  CRL_OBJ crlObj = NULL;

  for (;;) {
    status = RSA_GetFileToAllocBuffer
             (&crlBer.data, &crlBer.len,
              "Enter name of CRL binary file (blank when finished)");
    if (status == RSA_DEMO_E_CANCEL) {
      status = 0;
      break;
    }
    else if (status != 0)
      goto CLEANUP;

    status = C_CreateCRLObject (&crlObj, ctx);
    if (status != 0)
      goto CLEANUP;

    status = C_SetCRLBER (crlObj, crlBer.data, crlBer.len);
    if (status != 0)
      goto CLEANUP;

    /*  C_AddUniqueCRLToList is another option...  */
    status = C_AddCRLToList (crlList, crlObj, NULL);
    if (status != 0)
      goto CLEANUP;

    T_free (crlBer.data);
    crlBer.data = NULL;
    C_DestroyCRLObject (&crlObj);
  }

CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_AddCrlsToListPrompt", status);

  T_free (crlBer.data);
  C_DestroyCRLObject (&crlObj);
  
  return status;
}  /* end RSA_AddCrlsToListPrompt */

int RSA_PrintCrlEntries (CRL_ENTRIES_OBJ crlEntries)
{
  int status = 0;
  unsigned int i = 0, totalEntries = 0;

  CRL_ENTRY_INFO crlEntryInfo;
  
  if (crlEntries == NULL)
    goto CLEANUP;

  status = C_GetCRLEntriesCount (crlEntries, &totalEntries);
  if (status != 0)
    goto CLEANUP;

  for (i = 0; i < totalEntries; i++) {
    RSA_PrintMessage ("--CRL Entry #%u\n", i + 1);

    status = C_GetCRLEntry (crlEntries, &crlEntryInfo, i);
    if (status != 0)
      goto CLEANUP;

    RSA_PrintBuf ("Serial Number", crlEntryInfo.serialNumber.data,
                  crlEntryInfo.serialNumber.len);

    RSA_PrintUint4Time ("Action Time", crlEntryInfo.actionTime);

    if (crlEntryInfo.crlEntryExtensions != (EXTENSIONS_OBJ)NULL_PTR) {
      status = RSA_PrintExtensionsObject (crlEntryInfo.crlEntryExtensions);
      if (status != 0)
        goto CLEANUP;
    }
  }

CLEANUP:
  if (status != 0)
    RSA_PrintError ("RSA_PrintCrlEntriesObj", status);
  
  return status;
}  /* end RSA_PrintCrlEntriesObj */

int RSA_GetCrlEntries (UINT2 version, CRL_ENTRIES_OBJ crlEntries,
                       CERTC_CTX ctx)
{
  int status = 0;

  CRL_ENTRY_INFO crlEntryInfo = {{0}};
  
  /*  Keep going until the user enters a blank  */
  for (;;) {
    status = RSA_GetItem
             (&crlEntryInfo.serialNumber,
              "Enter hex-ascii serial number of cert to revoke \
(blank to cancel)");
    if (status != 0)
      goto CLEANUP;

    status = RSA_GetInputToUint4Time (&crlEntryInfo.actionTime, "Action time");
    if (status != 0)
      goto CLEANUP;

    status = C_CreateExtensionsObject (&crlEntryInfo.crlEntryExtensions,
                                       CRL_ENTRY_EXTENSIONS_OBJ, ctx);
    if (status != 0)
      goto CLEANUP;
    
    if (version != CRL_VERSION_1) {
      status = RSA_GetInputToExtensionsObject (crlEntryInfo.crlEntryExtensions,
                                               CRL_ENTRY_EXTENSIONS_OBJ);
      if (status != 0 && status != RSA_DEMO_E_CANCEL)
        goto CLEANUP;
    }

    status = C_AddCRLEntry (crlEntries, &crlEntryInfo,
                            (unsigned int *)NULL_PTR);
    if (status != 0)
      goto CLEANUP;
    
    T_free (crlEntryInfo.serialNumber.data);
    crlEntryInfo.serialNumber.data = NULL_PTR;
    C_DestroyExtensionsObject (&crlEntryInfo.crlEntryExtensions);
  }    

CLEANUP:
  if (status == RSA_DEMO_E_CANCEL)
    status = 0;

  if (status != 0)
    RSA_PrintError ("RSA_GetCrlEntries", status);

  T_free (crlEntryInfo.serialNumber.data);
  C_DestroyExtensionsObject (&crlEntryInfo.crlEntryExtensions);  
  
  return status;
}  /* end RSA_GetCrlEntries */

Copyright (c) 1999-2005 RSA Security Inc. All rights reserved. 067-001001-2720-001-000 - 2.7.2