--- rsaref/source/rsaref.h 2018/04/24 16:37:52 1.1 +++ rsaref/source/rsaref.h 2018/04/24 16:37:55 1.1.1.2 @@ -1,15 +1,33 @@ /* RSAREF.H - header file for RSAREF cryptographic toolkit */ -/* Copyright (C) 1991-2 RSA Laboratories, a division of RSA Data - Security, Inc. All rights reserved. +/* 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 @@ -24,18 +42,23 @@ #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) +#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_PEM_ENCRYPTED_KEY_LEN ENCODED_CONTENT_LEN (MAX_RSA_MODULUS_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 @@ -51,6 +74,7 @@ #define RE_PUBLIC_KEY 0x040a #define RE_SIGNATURE 0x040b #define RE_SIGNATURE_ENCODING 0x040c +#define RE_ENCRYPTION_ALGORITHM 0x040d /* Random structure. */ @@ -86,6 +110,39 @@ typedef struct { 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 *)); @@ -94,11 +151,52 @@ int R_RandomUpdate PROTO_LIST int R_GetRandomBytesNeeded PROTO_LIST ((unsigned int *, R_RANDOM_STRUCT *)); void R_RandomFinal PROTO_LIST ((R_RANDOM_STRUCT *)); -/* Cryptographic enhancements. +/* 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 *)); @@ -116,6 +214,13 @@ int R_OpenPEMBlock PROTO_LIST 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. */ @@ -123,8 +228,25 @@ 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