RSA BSAFE Crypto-C

Cryptographic Components for C

Search

Algorithm Utility Functions

This sample outlines the algorithm utility functions available within Crypto-C.

/* $Id: alginfoutil.c,v 1.6 2004/12/03 02:08:34 sparki Exp $ */
/*
 * Copyright (C) 1998-2004 RSA Security Inc.
 *
 * This file shall only be used to demonstrate how to interface to an
 * RSA Security Inc. licensed development product.
 *
 * You have a royalty-free right to use, reproduce and distribute this
 * demonstration file, provided that you agree that RSA Security Inc.
 * has no warranty, implied or otherwise, or liability for this
 * demonstration file (including any modified version).  This software
 * is provided "as is" without warranties or representations of any
 * kind. RSA Security disclaims all conditions and warranties, statutory
 * and otherwise, both express and implied, with respect to the software,
 * its quality and performance, including but not limited to, all
 * implied warranties of merchantability, fitness for a particular
 * purpose, title and noninfringement of third party rights. Without
 * limiting the foregoing, RSA Security does not warrant that the
 * software is error-free or that errors in the product will be
 * corrected. You agree that RSA Security shall not be liable for any
 * direct, indirect, incidental, special, consequential, punitive or
 * other damages whatsoever resulting from your use of this software
 * or any modified version.
 *
 *
 */

#include "alginfoutil.h"
#include "demoutil.h"     /* in samples/common/include */

/*  This function will take an algorithmFlag that is returned from
 *  B_DecodeAlgorithmBER and print out what type of KI or AI should
 *  be used for this algorithm */
void RSA_PrintBERInfo(unsigned int algorithmFlag)
{
  RSA_PrintMessage ("The BER Encoding is of type: ");
  switch (algorithmFlag) {
  case BSAFE_KI_RSAPublicBER:
      RSA_PrintMessage ("KI_RSAPublicBER\n");
      break;
  case BSAFE_KI_PKCS_RSAPrivateBER:
      RSA_PrintMessage ("KI_PKCS_RSAPrivateBER\n");
      break;
  case BSAFE_KI_DSAPublicX957BER:
      RSA_PrintMessage ("KI_DSAPublicBER\n");
      break;
  case BSAFE_KI_DSAPublicBER:
      RSA_PrintMessage ("KI_DSAPublicX957BER\n");
      break;
  case BSAFE_KI_DSAPrivateX957BER:
      RSA_PrintMessage ("KI_DSAPrivateBER\n");
      break;
  case BSAFE_KI_DSAPrivateBER:
      RSA_PrintMessage ("KI_DSAPrivateX957BER\n");
      break;
  case BSAFE_AI_PKCS_RSAPubOrPrivateBER:
      RSA_PrintMessage ("AI_PKCS_RSAPublicBER or AI_PKCS_RSAPrivateBER\n");
      break;
  case BSAFE_AI_PKCS_OAEP_RSAPrivateBER:
      RSA_PrintMessage ("AI_PKCS_OAEP_RSAPrivateBER\n");
      break;
  case BSAFE_AI_PKCS_OAEP_RSAPublicBER:
      RSA_PrintMessage ("AI_PKCS_OAEP_RSAPublicBER\n");
      break;
  case BSAFE_AI_PKCS_OAEP_RSARecodeBER:
      RSA_PrintMessage ("AI_PKCS_OAEPRecodeBER\n");
      break;
  case BSAFE_AI_MD2WithRSAEncryptionBER:
      RSA_PrintMessage ("AI_MD2WithRSAEncryptionBER\n");
      break;
  case BSAFE_AI_MD5WithRSAEncryptionBER:
      RSA_PrintMessage ("AI_MD5WithRSAEncryptionBER\n");
      break;
  case BSAFE_AI_SHA1WithRSAEncryptionBER:
      RSA_PrintMessage ("AI_SHA1WithRSAEncryptionBER\n");
      break;
  case BSAFE_AI_SHA256WithRSAEncryptionBER:
      RSA_PrintMessage ("AI_SHA256WithRSAEncryptionBER\n");
      break;
  case BSAFE_AI_SHA384WithRSAEncryptionBER:
      RSA_PrintMessage ("AI_SHA384WithRSAEncryptionBER\n");
      break;
  case BSAFE_AI_SHA512WithRSAEncryptionBER:
      RSA_PrintMessage ("AI_SHA512WithRSAEncryptionBER\n");
      break;
  case BSAFE_AI_DSAWithSHA1_BER:
      RSA_PrintMessage ("AI_DSAWithSHA1_BER\n");
      break;
  case BSAFE_AI_DHKeyAgreeBER:
      RSA_PrintMessage ("AI_DHKeyAgreeBER\n");
      break;
  case BSAFE_AI_RC4_BER:
      RSA_PrintMessage  ("AI_RC4_BER\n");
      break;
  case BSAFE_AI_RC4WithMAC_BER:
      RSA_PrintMessage ("AI_RC4WithMAC_BER\n");
      break;
  case BSAFE_AI_DES_CBCPadBER:
      RSA_PrintMessage ("AI_DES_CBCPadBER\n");
      break;
  case BSAFE_AI_DES_EDE3_CBCPadBER:
      RSA_PrintMessage ("AI_DES_EDE3_CBCPadBER\n");
      break;
  case BSAFE_AI_DESX_CBCPadBER:
      RSA_PrintMessage ("AI_DESX_CBCPadBER\n");
      break;
  case BSAFE_AI_RC2_CBCPadBER:
      RSA_PrintMessage ("AI_RC2_CBCPadBER\n");
      break;
  case BSAFE_AI_RC5_CBCPadBER:
      RSA_PrintMessage ("AI_RC5_CBCPadBER\n");
      break;
  case BSAFE_AI_AES128_CBCPadBER:
      RSA_PrintMessage ("AI_AES128_CBCPadBER\n");
      break;
  case BSAFE_AI_AES192_CBCPadBER:
      RSA_PrintMessage ("AI_AES192_CBCPadBER\n");
      break;
  case BSAFE_AI_AES256_CBCPadBER:
      RSA_PrintMessage ("AI_AES256_CBCPadBER\n");
      break;
  case BSAFE_AI_AES128_ECB_BER:
      RSA_PrintMessage ("AI_AES128_ECB_BER\n");
      break;
  case BSAFE_AI_AES192_ECB_BER:
      RSA_PrintMessage ("AI_AES192_ECB_BER\n");
      break;
  case BSAFE_AI_AES256_ECB_BER:
      RSA_PrintMessage ("AI_AES256_ECB_BER\n");
      break;
  case BSAFE_AI_AES128_CFB_BER:
      RSA_PrintMessage ("AI_AES128_CFB_BER\n");
      break;
  case BSAFE_AI_AES192_CFB_BER:
      RSA_PrintMessage ("AI_AES192_CFB_BER\n");
      break;
  case BSAFE_AI_AES256_CFB_BER:
      RSA_PrintMessage ("AI_AES256_CFB_BER\n");
      break;
  case BSAFE_AI_MD2WithDES_CBCPadBER:
      RSA_PrintMessage ("AI_MD2WithDES_CBCPadBER\n");
      break;
  case BSAFE_AI_MD5WithDES_CBCPadBER:
      RSA_PrintMessage ("AI_MD5WithDES_CBCPadBER\n");
      break;
  case BSAFE_AI_SHA1WithDES_CBCPadBER:
      RSA_PrintMessage ("AI_SHA1WithDES_CBCPadBER\n");
      break;
  case BSAFE_AI_MD2WithRC2_CBCPadBER:
      RSA_PrintMessage ("AI_MD2WithRC2_CBCPadBER\n");
      break;
  case BSAFE_AI_MD5WithRC2_CBCPadBER:
      RSA_PrintMessage ("AI_MD5WithRC2_CBCPadBER\n");
      break;
  case BSAFE_AI_MD5WithXOR_BER:
      RSA_PrintMessage ("AI_MD5WithXOR_BER\n");
      break;
  case BSAFE_AI_MD2_BER:
      RSA_PrintMessage ("AI_MD2_BER\n");
      break;
  case BSAFE_AI_MD5_BER:
      RSA_PrintMessage ("AI_MD5_BER\n");
      break;
  case BSAFE_AI_SHA1_BER:
      RSA_PrintMessage ("AI_SHA1_BER\n");
      break;
  case BSAFE_AI_SHA256_BER:
      RSA_PrintMessage ("AI_SHA256_BER\n");
      break;
  case BSAFE_AI_SHA384_BER:
      RSA_PrintMessage ("AI_SHA384_BER\n");
      break;
  case BSAFE_AI_SHA512_BER:
      RSA_PrintMessage ("AI_SHA512_BER\n");
      break;
  default:
      RSA_PrintMessage ("Unknown key or algorithm info type\n");
  }
}

/*  This function will take an algorithmFlag that is returned from
 *  B_DecodeAlgorithmBER and set an algorithm object with the proper
 *  AI.  The B_ALGORITHM_OBJ should be already created. */
int RSA_SetAlgorithmObject(B_ALGORITHM_OBJ *algObject,
  unsigned int algorithmFlag, ITEM *encodingItem)
{

  ITEM BERinfo = {NULL, 0};

  BERinfo.len = encodingItem->len;
  BERinfo.data = (unsigned char *)T_malloc (BERinfo.len);
  T_memcpy (BERinfo.data, encodingItem->data, BERinfo.len);

  switch (algorithmFlag) {
  case BSAFE_AI_PKCS_RSAPubOrPrivateBER:
      /* Ignore this case */
      return RSA_DEMO_E_INVALID_PARAMETER;
  case BSAFE_AI_PKCS_OAEP_RSAPrivateBER:
      return B_SetAlgorithmInfo (*algObject, AI_PKCS_OAEP_RSAPrivateBER, (POINTER)&BERinfo);
  case BSAFE_AI_PKCS_OAEP_RSAPublicBER:
      return B_SetAlgorithmInfo (*algObject, AI_PKCS_OAEP_RSAPublicBER, (POINTER)&BERinfo);
  case BSAFE_AI_PKCS_OAEP_RSARecodeBER:
      return B_SetAlgorithmInfo (*algObject, AI_PKCS_OAEPRecodeBER, (POINTER)&BERinfo);;
  case BSAFE_AI_MD2WithRSAEncryptionBER:
      return B_SetAlgorithmInfo (*algObject, AI_MD2WithRSAEncryptionBER, (POINTER)&BERinfo);
  case BSAFE_AI_MD5WithRSAEncryptionBER:
      return B_SetAlgorithmInfo (*algObject, AI_MD5WithRSAEncryptionBER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA1WithRSAEncryptionBER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA1WithRSAEncryptionBER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA256WithRSAEncryptionBER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA256WithRSAEncryptionBER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA384WithRSAEncryptionBER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA384WithRSAEncryptionBER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA512WithRSAEncryptionBER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA512WithRSAEncryptionBER, (POINTER)&BERinfo);
  case BSAFE_AI_DSAWithSHA1_BER:
      return B_SetAlgorithmInfo (*algObject, AI_DSAWithSHA1_BER, (POINTER)&BERinfo);
  case BSAFE_AI_DHKeyAgreeBER:
      return B_SetAlgorithmInfo (*algObject, AI_DHKeyAgreeBER, (POINTER)&BERinfo);
  case BSAFE_AI_RC4_BER:
      return B_SetAlgorithmInfo (*algObject, AI_RC4_BER, (POINTER) &BERinfo);
  case BSAFE_AI_RC4WithMAC_BER:
      return B_SetAlgorithmInfo (*algObject, AI_RC4WithMAC_BER, (POINTER)&BERinfo);
  case BSAFE_AI_DES_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_DES_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_DES_EDE3_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_DES_EDE3_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_DESX_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_DESX_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_RC2_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_RC2_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_RC5_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_RC5_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_AES128_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_AES128_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_AES192_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_AES192_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_AES256_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_AES256_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_AES128_ECB_BER:
      return B_SetAlgorithmInfo (*algObject, AI_AES128_ECB_BER, (POINTER)&BERinfo);
  case BSAFE_AI_AES192_ECB_BER:
      return B_SetAlgorithmInfo (*algObject, AI_AES192_ECB_BER, (POINTER)&BERinfo);
  case BSAFE_AI_AES256_ECB_BER:
      return B_SetAlgorithmInfo (*algObject, AI_AES256_ECB_BER, (POINTER)&BERinfo);
  case BSAFE_AI_AES128_CFB_BER:
      return B_SetAlgorithmInfo (*algObject, AI_AES128_CFB_BER, (POINTER)&BERinfo);
  case BSAFE_AI_AES192_CFB_BER:
      return B_SetAlgorithmInfo (*algObject, AI_AES192_CFB_BER, (POINTER)&BERinfo);
  case BSAFE_AI_AES256_CFB_BER:
      return B_SetAlgorithmInfo (*algObject, AI_AES256_CFB_BER, (POINTER)&BERinfo);
  case BSAFE_AI_MD2WithDES_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_MD2WithDES_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_MD5WithDES_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_MD5WithDES_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA1WithDES_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA1WithDES_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_MD2WithRC2_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_MD2WithRC2_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_MD5WithRC2_CBCPadBER:
      return B_SetAlgorithmInfo (*algObject, AI_MD5WithRC2_CBCPadBER, (POINTER)&BERinfo);
  case BSAFE_AI_MD5WithXOR_BER:
      return B_SetAlgorithmInfo (*algObject, AI_MD5WithXOR_BER, (POINTER)&BERinfo);
  case BSAFE_AI_MD2_BER:
      return B_SetAlgorithmInfo (*algObject, AI_MD2_BER, (POINTER)&BERinfo);
  case BSAFE_AI_MD5_BER:
      return B_SetAlgorithmInfo (*algObject, AI_MD5_BER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA1_BER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA1_BER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA256_BER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA256_BER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA384_BER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA384_BER, (POINTER)&BERinfo);
  case BSAFE_AI_SHA512_BER:
      return B_SetAlgorithmInfo (*algObject, AI_SHA512_BER, (POINTER)&BERinfo);

  default:
      return RSA_DEMO_E_INVALID_PARAMETER;
  }

}

/*  This function will take an algorithmFlag that is returned from
 *  B_DecodeAlgorithmBER and set a key object with the proper KI.
 *  The B_KEY_OBJ should be already created. */
int RSA_SetKeyObject(B_KEY_OBJ *keyObject, unsigned int keyFlag,
  ITEM *encodingItem)
{

  ITEM BERinfo = {NULL, 0};

  BERinfo.len = encodingItem->len;
  BERinfo.data = (unsigned char *)T_malloc (BERinfo.len);
  T_memcpy (BERinfo.data, encodingItem->data, BERinfo.len);


  switch (keyFlag) {
  case BSAFE_KI_RSAPublicBER:
      return B_SetKeyInfo (*keyObject, KI_RSAPublicBER, (POINTER)&BERinfo);
  case BSAFE_KI_PKCS_RSAPrivateBER:
      return B_SetKeyInfo (*keyObject, KI_PKCS_RSAPrivateBER, (POINTER)&BERinfo);
  case BSAFE_KI_DSAPublicX957BER:
      return B_SetKeyInfo (*keyObject, KI_DSAPublicBER, (POINTER)&BERinfo);
  case BSAFE_KI_DSAPublicBER:
      return B_SetKeyInfo (*keyObject, KI_DSAPublicX957BER, (POINTER)&BERinfo);
  case BSAFE_KI_DSAPrivateX957BER:
      return B_SetKeyInfo (*keyObject, KI_DSAPrivateBER, (POINTER)&BERinfo);
  case BSAFE_KI_DSAPrivateBER:
      return B_SetKeyInfo (*keyObject, KI_DSAPrivateX957BER, (POINTER)&BERinfo);

  default:
      return RSA_DEMO_E_INVALID_PARAMETER;
  }

}

Copyright (c) 1999-2005 RSA Security Inc. All rights reserved. 068-001001-6210-001-000 - 6.2.1