/* RSAREF.H - header file for RSAREF cryptographic toolkit */ /* Copyright (C) RSA Laboratories, a division of RSA Data Security, Inc., created 1991. All rights reserved. */ #ifndef _RSAREF_H_ #define _RSAREF_H_ 1 #include "md2.h" #include "md5.h" #include "des.h" #ifdef __cplusplus extern "C" { #endif /* Message-digest algorithms. */ #define DA_MD2 3 #define DA_MD5 5 /* Encryption algorithms to be ored with digest algorithm in Seal and Open. */ #define EA_DES_CBC 1 #define EA_DES_EDE2_CBC 2 #define EA_DES_EDE3_CBC 3 #define EA_DESX_CBC 4 /* RSA key lengths. */ #define MIN_RSA_MODULUS_BITS 508 #define MAX_RSA_MODULUS_BITS 1024 #define MAX_RSA_MODULUS_LEN ((MAX_RSA_MODULUS_BITS + 7) / 8) #define MAX_RSA_PRIME_BITS ((MAX_RSA_MODULUS_BITS + 1) / 2) #define MAX_RSA_PRIME_LEN ((MAX_RSA_PRIME_BITS + 7) / 8) /* Maximum lengths of encoded and encrypted content, as a function of content length len. Also, inverse functions. */ #define ENCODED_CONTENT_LEN(len) (4*(len)/3 + 3) #define ENCRYPTED_CONTENT_LEN(len) ENCODED_CONTENT_LEN ((len)+8) #define DECODED_CONTENT_LEN(len) (3*(len)/4 + 1) #define DECRYPTED_CONTENT_LEN(len) (DECODED_CONTENT_LEN (len) - 1) /* Maximum lengths of signatures, encrypted keys, encrypted signatures, and message digests. */ #define MAX_SIGNATURE_LEN MAX_RSA_MODULUS_LEN #define MAX_PEM_SIGNATURE_LEN ENCODED_CONTENT_LEN (MAX_SIGNATURE_LEN) #define MAX_ENCRYPTED_KEY_LEN MAX_RSA_MODULUS_LEN #define MAX_PEM_ENCRYPTED_KEY_LEN ENCODED_CONTENT_LEN (MAX_ENCRYPTED_KEY_LEN) #define MAX_PEM_ENCRYPTED_SIGNATURE_LEN \ ENCRYPTED_CONTENT_LEN (MAX_SIGNATURE_LEN) #define MAX_DIGEST_LEN 16 /* Maximum length of Diffie-Hellman parameters. */ #define DH_PRIME_LEN(bits) (((bits) + 7) / 8) /* Error codes. */ #define RE_CONTENT_ENCODING 0x0400 #define RE_DATA 0x0401 #define RE_DIGEST_ALGORITHM 0x0402 #define RE_ENCODING 0x0403 #define RE_KEY 0x0404 #define RE_KEY_ENCODING 0x0405 #define RE_LEN 0x0406 #define RE_MODULUS_LEN 0x0407 #define RE_NEED_RANDOM 0x0408 #define RE_PRIVATE_KEY 0x0409 #define RE_PUBLIC_KEY 0x040a #define RE_SIGNATURE 0x040b #define RE_SIGNATURE_ENCODING 0x040c #define RE_ENCRYPTION_ALGORITHM 0x040d /* Random structure. */ typedef struct { unsigned int bytesNeeded; unsigned char state[16]; unsigned int outputAvailable; unsigned char output[16]; } R_RANDOM_STRUCT; /* RSA public and private key. */ typedef struct { unsigned int bits; /* length in bits of modulus */ unsigned char modulus[MAX_RSA_MODULUS_LEN]; /* modulus */ unsigned char exponent[MAX_RSA_MODULUS_LEN]; /* public exponent */ } R_RSA_PUBLIC_KEY; typedef struct { unsigned int bits; /* length in bits of modulus */ unsigned char modulus[MAX_RSA_MODULUS_LEN]; /* modulus */ unsigned char publicExponent[MAX_RSA_MODULUS_LEN]; /* public exponent */ unsigned char exponent[MAX_RSA_MODULUS_LEN]; /* private exponent */ unsigned char prime[2][MAX_RSA_PRIME_LEN]; /* prime factors */ unsigned char primeExponent[2][MAX_RSA_PRIME_LEN]; /* exponents for CRT */ unsigned char coefficient[MAX_RSA_PRIME_LEN]; /* CRT coefficient */ } R_RSA_PRIVATE_KEY; /* RSA prototype key. */ typedef struct { unsigned int bits; /* length in bits of modulus */ int useFermat4; /* public exponent (1 = F4, 0 = 3) */ } R_RSA_PROTO_KEY; /* Diffie-Hellman parameters. */ typedef struct { unsigned char *prime; /* prime */ unsigned int primeLen; /* length of prime */ unsigned char *generator; /* generator */ unsigned int generatorLen; /* length of generator */ } R_DH_PARAMS; typedef struct { int digestAlgorithm; union { MD2_CTX md2; MD5_CTX md5; } context; } R_DIGEST_CTX; typedef struct { R_DIGEST_CTX digestContext; } R_SIGNATURE_CTX; typedef struct { int encryptionAlgorithm; union { DES_CBC_CTX des; DES3_CBC_CTX des3; DESX_CBC_CTX desx; } cipherContext; unsigned char buffer[8]; unsigned int bufferLen; } R_ENVELOPE_CTX; /* Random structures. */ int R_RandomInit PROTO_LIST ((R_RANDOM_STRUCT *)); int R_RandomUpdate PROTO_LIST ((R_RANDOM_STRUCT *, unsigned char *, unsigned int)); int R_GetRandomBytesNeeded PROTO_LIST ((unsigned int *, R_RANDOM_STRUCT *)); void R_RandomFinal PROTO_LIST ((R_RANDOM_STRUCT *)); /* Cryptographic procedures "by parts" */ int R_DigestInit PROTO_LIST ((R_DIGEST_CTX *, int)); int R_DigestUpdate PROTO_LIST ((R_DIGEST_CTX *, unsigned char *, unsigned int)); int R_DigestFinal PROTO_LIST ((R_DIGEST_CTX *, unsigned char *, unsigned int *)); int R_SignInit PROTO_LIST ((R_SIGNATURE_CTX *, int)); int R_SignUpdate PROTO_LIST ((R_SIGNATURE_CTX *, unsigned char *, unsigned int)); int R_SignFinal PROTO_LIST ((R_SIGNATURE_CTX *, unsigned char *, unsigned int *, R_RSA_PRIVATE_KEY *)); int R_VerifyInit PROTO_LIST ((R_SIGNATURE_CTX *, int)); int R_VerifyUpdate PROTO_LIST ((R_SIGNATURE_CTX *, unsigned char *, unsigned int)); int R_VerifyFinal PROTO_LIST ((R_SIGNATURE_CTX *, unsigned char *, unsigned int, R_RSA_PUBLIC_KEY *)); int R_SealInit PROTO_LIST ((R_ENVELOPE_CTX *, unsigned char **, unsigned int *, unsigned char [8], unsigned int, R_RSA_PUBLIC_KEY **, int, R_RANDOM_STRUCT *)); int R_SealUpdate PROTO_LIST ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *, unsigned char *, unsigned int)); int R_SealFinal PROTO_LIST ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *)); int R_OpenInit PROTO_LIST ((R_ENVELOPE_CTX *, int, unsigned char *, unsigned int, unsigned char [8], R_RSA_PRIVATE_KEY *)); int R_OpenUpdate PROTO_LIST ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *, unsigned char *, unsigned int)); int R_OpenFinal PROTO_LIST ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *)); /* Cryptographic enhancements by block. */ int R_SignPEMBlock PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int *, unsigned char *, unsigned int, int, int, R_RSA_PRIVATE_KEY *)); int R_SignBlock PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int, int, R_RSA_PRIVATE_KEY *)); int R_VerifyPEMSignature PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int, unsigned char *, unsigned int, int, int, R_RSA_PUBLIC_KEY *)); int R_VerifyBlockSignature PROTO_LIST ((unsigned char *, unsigned int, unsigned char *, unsigned int, int, R_RSA_PUBLIC_KEY *)); int R_SealPEMBlock PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int *, unsigned char *, unsigned int *, unsigned char [8], unsigned char *, unsigned int, int, R_RSA_PUBLIC_KEY *, R_RSA_PRIVATE_KEY *, R_RANDOM_STRUCT *)); int R_OpenPEMBlock PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int, unsigned char *, unsigned int, unsigned char *, unsigned int, unsigned char [8], int, R_RSA_PRIVATE_KEY *, R_RSA_PUBLIC_KEY *)); int R_DigestBlock PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int, int)); /* Printable ASCII encoding and decoding. */ int R_EncodePEMBlock PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int)); int R_DecodePEMBlock PROTO_LIST ((unsigned char *, unsigned int *, unsigned char *, unsigned int)); /* Key-pair generation. */ int R_GeneratePEMKeys PROTO_LIST ((R_RSA_PUBLIC_KEY *, R_RSA_PRIVATE_KEY *, R_RSA_PROTO_KEY *, R_RANDOM_STRUCT *)); /* Diffie-Hellman key agreement. */ int R_GenerateDHParams PROTO_LIST ((R_DH_PARAMS *, unsigned int, unsigned int, R_RANDOM_STRUCT *)); int R_SetupDHAgreement PROTO_LIST ((unsigned char *, unsigned char *, unsigned int, R_DH_PARAMS *, R_RANDOM_STRUCT *)); int R_ComputeDHAgreedKey PROTO_LIST ((unsigned char *, unsigned char *, unsigned char *, unsigned int, R_DH_PARAMS *)); /* Routines supplied by the implementor. */ void R_memset PROTO_LIST ((POINTER, int, unsigned int)); void R_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); int R_memcmp PROTO_LIST ((POINTER, POINTER, unsigned int)); #ifdef __cplusplus } #endif #endif