/* File : /crypto/engine/vendor_defns/hw_zencod.h */ /* ==================================================================== * Written by Donnat Frederic (frederic.donnat@zencod.com) from ZENCOD * for "zencod" ENGINE integration in OpenSSL project. */ #ifndef _HW_ZENCOD_H_ #define _HW_ZENCOD_H_ #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define ZENBRIDGE_MAX_KEYSIZE_RSA 2048 #define ZENBRIDGE_MAX_KEYSIZE_RSA_CRT 1024 #define ZENBRIDGE_MAX_KEYSIZE_DSA_SIGN 1024 #define ZENBRIDGE_MAX_KEYSIZE_DSA_VRFY 1024 /* Library version computation */ #define ZENBRIDGE_VERSION_MAJOR(x) (((x) >> 16) | 0xff) #define ZENBRIDGE_VERSION_MINOR(x) (((x) >> 8) | 0xff) #define ZENBRIDGE_VERSION_PATCH(x) (((x) >> 0) | 0xff) #define ZENBRIDGE_VERSION(x, y, z) ((x) << 16 | (y) << 8 | (z)) /* * Memory type */ typedef struct zencod_number_s { unsigned long len; unsigned char *data; } zen_nb_t; #define KEY zen_nb_t /* * Misc */ typedef int t_zencod_lib_version (void); typedef int t_zencod_hw_version (void); typedef int t_zencod_test (void); typedef int t_zencod_dump_key (FILE *stream, char *msg, KEY *key); /* * Key management tools */ typedef KEY *t_zencod_new_number (unsigned long len, unsigned char *data); typedef int t_zencod_init_number (KEY *n, unsigned long len, unsigned char *data); typedef unsigned long t_zencod_bytes2bits (unsigned char *n, unsigned long bytes); typedef unsigned long t_zencod_bits2bytes (unsigned long bits); /* * RSA API */ /* Compute modular exponential : y = x**e | n */ typedef int t_zencod_rsa_mod_exp (KEY *y, KEY *x, KEY *n, KEY *e); /* Compute modular exponential : y1 = (x | p)**edp | p, y2 = (x | p)**edp | p, y = y2 + (qinv * (y1 - y2) | p) * q */ typedef int t_zencod_rsa_mod_exp_crt (KEY *y, KEY *x, KEY *p, KEY *q, KEY *edp, KEY *edq, KEY *qinv); /* * DSA API */ typedef int t_zencod_dsa_do_sign (unsigned int hash, KEY *data, KEY *random, KEY *p, KEY *q, KEY *g, KEY *x, KEY *r, KEY *s); typedef int t_zencod_dsa_do_verify (unsigned int hash, KEY *data, KEY *p, KEY *q, KEY *g, KEY *y, KEY *r, KEY *s, KEY *v); /* * DH API */ /* Key generation : compute public value y = g**x | n */ typedef int t_zencod_dh_generate_key (KEY *y, KEY *x, KEY *g, KEY *n, int gen_x); typedef int t_zencod_dh_compute_key (KEY *k, KEY *y, KEY *x, KEY *n); /* * RNG API */ #define ZENBRIDGE_RNG_DIRECT 0 #define ZENBRIDGE_RNG_SHA1 1 typedef int t_zencod_rand_bytes (KEY *rand, unsigned int flags); /* * Math API */ typedef int t_zencod_math_mod_exp (KEY *r, KEY *a, KEY *e, KEY *n); /* * Symetric API */ /* Define a data structure for digests operations */ typedef struct ZEN_data_st { unsigned int HashBufferSize ; unsigned char *HashBuffer ; } ZEN_MD_DATA ; /* * Functions for Digest (MD5, SHA1) stuff */ /* output : output data buffer */ /* input : input data buffer */ /* algo : hash algorithm, MD5 or SHA1 */ /*- * typedef int t_zencod_hash ( KEY *output, const KEY *input, int algo ) ; * typedef int t_zencod_sha_hash ( KEY *output, const KEY *input, int algo ) ; */ /* For now separate this stuff that mad it easier to test */ typedef int t_zencod_md5_init ( ZEN_MD_DATA *data ) ; typedef int t_zencod_md5_update ( ZEN_MD_DATA *data, const KEY *input ) ; typedef int t_zencod_md5_do_final ( ZEN_MD_DATA *data, KEY *output ) ; typedef int t_zencod_sha1_init ( ZEN_MD_DATA *data ) ; typedef int t_zencod_sha1_update ( ZEN_MD_DATA *data, const KEY *input ) ; typedef int t_zencod_sha1_do_final ( ZEN_MD_DATA *data, KEY *output ) ; /* * Functions for Cipher (RC4, DES, 3DES) stuff */ /* output : output data buffer */ /* input : input data buffer */ /* key : rc4 key data */ /* index_1 : value of index x from RC4 key structure */ /* index_2 : value of index y from RC4 key structure */ /* Be carefull : RC4 key should be expanded before calling this method (Should we provide an expand function ??) */ typedef int t_zencod_rc4_cipher ( KEY *output, const KEY *input, const KEY *key, unsigned char *index_1, unsigned char *index_2, int mode ) ; /* output : output data buffer */ /* input : input data buffer */ /* key_1 : des first key data */ /* key_2 : des second key data */ /* key_3 : des third key data */ /* iv : initial vector */ /* mode : xdes mode (encrypt or decrypt) */ /* Be carefull : In DES mode key_1 = key_2 = key_3 (as far as i can see !!) */ typedef int t_zencod_xdes_cipher ( KEY *output, const KEY *input, const KEY *key_1, const KEY *key_2, const KEY *key_3, const KEY *iv, int mode ) ; #undef KEY #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* !_HW_ZENCOD_H_ */