1/* File : /crypto/engine/vendor_defns/hw_zencod.h */ 2/* ==================================================================== 3 * Written by Donnat Frederic (frederic.donnat@zencod.com) from ZENCOD 4 * for "zencod" ENGINE integration in OpenSSL project. 5 */ 6 7#ifndef _HW_ZENCOD_H_ 8# define _HW_ZENCOD_H_ 9 10# include <stdio.h> 11 12# ifdef __cplusplus 13extern "C" { 14# endif /* __cplusplus */ 15 16# define ZENBRIDGE_MAX_KEYSIZE_RSA 2048 17# define ZENBRIDGE_MAX_KEYSIZE_RSA_CRT 1024 18# define ZENBRIDGE_MAX_KEYSIZE_DSA_SIGN 1024 19# define ZENBRIDGE_MAX_KEYSIZE_DSA_VRFY 1024 20 21/* Library version computation */ 22# define ZENBRIDGE_VERSION_MAJOR(x) (((x) >> 16) | 0xff) 23# define ZENBRIDGE_VERSION_MINOR(x) (((x) >> 8) | 0xff) 24# define ZENBRIDGE_VERSION_PATCH(x) (((x) >> 0) | 0xff) 25# define ZENBRIDGE_VERSION(x, y, z) ((x) << 16 | (y) << 8 | (z)) 26 27 /* 28 * Memory type 29 */ 30 typedef struct zencod_number_s { 31 unsigned long len; 32 unsigned char *data; 33 } zen_nb_t; 34 35# define KEY zen_nb_t 36 37 /* 38 * Misc 39 */ 40 typedef int t_zencod_lib_version(void); 41 typedef int t_zencod_hw_version(void); 42 typedef int t_zencod_test(void); 43 typedef int t_zencod_dump_key(FILE *stream, char *msg, KEY * key); 44 45 /* 46 * Key management tools 47 */ 48 typedef KEY *t_zencod_new_number(unsigned long len, unsigned char *data); 49 typedef int t_zencod_init_number(KEY * n, unsigned long len, 50 unsigned char *data); 51 typedef unsigned long t_zencod_bytes2bits(unsigned char *n, 52 unsigned long bytes); 53 typedef unsigned long t_zencod_bits2bytes(unsigned long bits); 54 55 /* 56 * RSA API 57 */ 58/* Compute modular exponential : y = x**e | n */ 59 typedef int t_zencod_rsa_mod_exp(KEY * y, KEY * x, KEY * n, KEY * e); 60 /* 61 * Compute modular exponential : y1 = (x | p)**edp | p, y2 = (x | p)**edp 62 * | p, y = y2 + (qinv * (y1 - y2) | p) * q 63 */ 64 typedef int t_zencod_rsa_mod_exp_crt(KEY * y, KEY * x, KEY * p, KEY * q, 65 KEY * edp, KEY * edq, KEY * qinv); 66 67 /* 68 * DSA API 69 */ 70 typedef int t_zencod_dsa_do_sign(unsigned int hash, KEY * data, 71 KEY * random, KEY * p, KEY * q, KEY * g, 72 KEY * x, KEY * r, KEY * s); 73 typedef int t_zencod_dsa_do_verify(unsigned int hash, KEY * data, KEY * p, 74 KEY * q, KEY * g, KEY * y, KEY * r, 75 KEY * s, KEY * v); 76 77 /* 78 * DH API 79 */ 80 /* Key generation : compute public value y = g**x | n */ 81 typedef int t_zencod_dh_generate_key(KEY * y, KEY * x, KEY * g, KEY * n, 82 int gen_x); 83 typedef int t_zencod_dh_compute_key(KEY * k, KEY * y, KEY * x, KEY * n); 84 85 /* 86 * RNG API 87 */ 88# define ZENBRIDGE_RNG_DIRECT 0 89# define ZENBRIDGE_RNG_SHA1 1 90 typedef int t_zencod_rand_bytes(KEY * rand, unsigned int flags); 91 92 /* 93 * Math API 94 */ 95 typedef int t_zencod_math_mod_exp(KEY * r, KEY * a, KEY * e, KEY * n); 96 97 /* 98 * Symetric API 99 */ 100/* Define a data structure for digests operations */ 101 typedef struct ZEN_data_st { 102 unsigned int HashBufferSize; 103 unsigned char *HashBuffer; 104 } ZEN_MD_DATA; 105 106 /* 107 * Functions for Digest (MD5, SHA1) stuff 108 */ 109 /* output : output data buffer */ 110 /* input : input data buffer */ 111 /* algo : hash algorithm, MD5 or SHA1 */ 112 /*- 113 * typedef int t_zencod_hash ( KEY *output, const KEY *input, int algo ) ; 114 * typedef int t_zencod_sha_hash ( KEY *output, const KEY *input, int algo ) ; 115 */ 116 /* For now separate this stuff that mad it easier to test */ 117 typedef int t_zencod_md5_init(ZEN_MD_DATA *data); 118 typedef int t_zencod_md5_update(ZEN_MD_DATA *data, const KEY * input); 119 typedef int t_zencod_md5_do_final(ZEN_MD_DATA *data, KEY * output); 120 121 typedef int t_zencod_sha1_init(ZEN_MD_DATA *data); 122 typedef int t_zencod_sha1_update(ZEN_MD_DATA *data, const KEY * input); 123 typedef int t_zencod_sha1_do_final(ZEN_MD_DATA *data, KEY * output); 124 125 /* 126 * Functions for Cipher (RC4, DES, 3DES) stuff 127 */ 128/* output : output data buffer */ 129/* input : input data buffer */ 130/* key : rc4 key data */ 131/* index_1 : value of index x from RC4 key structure */ 132/* index_2 : value of index y from RC4 key structure */ 133 /* 134 * Be carefull : RC4 key should be expanded before calling this method 135 * (Should we provide an expand function ??) 136 */ 137 typedef int t_zencod_rc4_cipher(KEY * output, const KEY * input, 138 const KEY * key, unsigned char *index_1, 139 unsigned char *index_2, int mode); 140 141/* output : output data buffer */ 142/* input : input data buffer */ 143/* key_1 : des first key data */ 144/* key_2 : des second key data */ 145/* key_3 : des third key data */ 146/* iv : initial vector */ 147/* mode : xdes mode (encrypt or decrypt) */ 148/* Be carefull : In DES mode key_1 = key_2 = key_3 (as far as i can see !!) */ 149 typedef int t_zencod_xdes_cipher(KEY * output, const KEY * input, 150 const KEY * key_1, const KEY * key_2, 151 const KEY * key_3, const KEY * iv, 152 int mode); 153 154# undef KEY 155 156# ifdef __cplusplus 157} 158# endif /* __cplusplus */ 159#endif /* !_HW_ZENCOD_H_ */ 160