gost_lcl.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #ifndef GOST_TOOLS_H
  2. #define GOST_TOOLS_H
  3. /**********************************************************************
  4. * gost_lcl.h *
  5. * Copyright (c) 2006 Cryptocom LTD *
  6. * This file is distributed under the same license as OpenSSL *
  7. * *
  8. * Internal declarations used in GOST engine *
  9. * OpenSSL 0.9.9 libraries required to compile and use *
  10. * this code *
  11. **********************************************************************/
  12. #include <openssl/bn.h>
  13. #include <openssl/evp.h>
  14. #include <openssl/dsa.h>
  15. #include <openssl/asn1t.h>
  16. #include <openssl/x509.h>
  17. #include <openssl/engine.h>
  18. #include <openssl/ec.h>
  19. #include "gost89.h"
  20. #include "gosthash.h"
  21. /* Control commands */
  22. #define GOST_PARAM_CRYPT_PARAMS 0
  23. #define GOST_PARAM_MAX 0
  24. #define GOST_CTRL_CRYPT_PARAMS (ENGINE_CMD_BASE+GOST_PARAM_CRYPT_PARAMS)
  25. extern const ENGINE_CMD_DEFN gost_cmds[];
  26. int gost_control_func(ENGINE *e,int cmd, long i, void *p, void (*f)(void));
  27. const char *get_gost_engine_param(int param);
  28. int gost_set_default_param(int param, const char *value);
  29. void gost_param_free(void);
  30. /* method registration */
  31. int register_ameth_gost (int nid, EVP_PKEY_ASN1_METHOD **ameth, const char* pemstr, const char* info);
  32. int register_pmeth_gost (int id, EVP_PKEY_METHOD **pmeth, int flags);
  33. /* Gost-specific pmeth control-function parameters */
  34. /* For GOST R34.10 parameters */
  35. #define param_ctrl_string "paramset"
  36. #define EVP_PKEY_CTRL_GOST_PARAMSET (EVP_PKEY_ALG_CTRL+1)
  37. /* For GOST 28147 MAC */
  38. #define key_ctrl_string "key"
  39. #define hexkey_ctrl_string "hexkey"
  40. #define EVP_PKEY_CTRL_GOST_MAC_HEXKEY (EVP_PKEY_ALG_CTRL+3)
  41. /* Pmeth internal representation */
  42. struct gost_pmeth_data {
  43. int sign_param_nid; /* Should be set whenever parameters are filled */
  44. EVP_MD *md;
  45. unsigned char *shared_ukm;
  46. int peer_key_used;
  47. };
  48. struct gost_mac_pmeth_data {
  49. int key_set;
  50. EVP_MD *md;
  51. unsigned char key[32];
  52. } ;
  53. /* GOST-specific ASN1 structures */
  54. typedef struct {
  55. ASN1_OCTET_STRING *encrypted_key;
  56. ASN1_OCTET_STRING *imit;
  57. } GOST_KEY_INFO;
  58. DECLARE_ASN1_FUNCTIONS(GOST_KEY_INFO)
  59. typedef struct {
  60. ASN1_OBJECT *cipher;
  61. X509_PUBKEY *ephem_key;
  62. ASN1_OCTET_STRING *eph_iv;
  63. } GOST_KEY_AGREEMENT_INFO;
  64. DECLARE_ASN1_FUNCTIONS(GOST_KEY_AGREEMENT_INFO)
  65. typedef struct {
  66. GOST_KEY_INFO *key_info;
  67. GOST_KEY_AGREEMENT_INFO *key_agreement_info;
  68. } GOST_KEY_TRANSPORT;
  69. DECLARE_ASN1_FUNCTIONS(GOST_KEY_TRANSPORT)
  70. typedef struct { /* FIXME incomplete */
  71. GOST_KEY_TRANSPORT *gkt;
  72. } GOST_CLIENT_KEY_EXCHANGE_PARAMS;
  73. /* Hacks to shorten symbols to 31 characters or less, or OpenVMS.
  74. This mimics what's done in symhacks.h, but since this is a very
  75. local header file, I prefered to put this hack directly here.
  76. -- Richard Levitte */
  77. #ifdef OPENSSL_SYS_VMS
  78. #undef GOST_CLIENT_KEY_EXCHANGE_PARAMS_it
  79. #define GOST_CLIENT_KEY_EXCHANGE_PARAMS_it GOST_CLIENT_KEY_EXC_PARAMS_it
  80. #undef GOST_CLIENT_KEY_EXCHANGE_PARAMS_new
  81. #define GOST_CLIENT_KEY_EXCHANGE_PARAMS_new GOST_CLIENT_KEY_EXC_PARAMS_new
  82. #undef GOST_CLIENT_KEY_EXCHANGE_PARAMS_free
  83. #define GOST_CLIENT_KEY_EXCHANGE_PARAMS_free GOST_CLIENT_KEY_EXC_PARAMS_free
  84. #undef d2i_GOST_CLIENT_KEY_EXCHANGE_PARAMS
  85. #define d2i_GOST_CLIENT_KEY_EXCHANGE_PARAMS d2i_GOST_CLIENT_KEY_EXC_PARAMS
  86. #undef i2d_GOST_CLIENT_KEY_EXCHANGE_PARAMS
  87. #define i2d_GOST_CLIENT_KEY_EXCHANGE_PARAMS i2d_GOST_CLIENT_KEY_EXC_PARAMS
  88. #endif /* End of hack */
  89. DECLARE_ASN1_FUNCTIONS(GOST_CLIENT_KEY_EXCHANGE_PARAMS)
  90. typedef struct {
  91. ASN1_OBJECT *key_params;
  92. ASN1_OBJECT *hash_params;
  93. ASN1_OBJECT *cipher_params;
  94. } GOST_KEY_PARAMS;
  95. DECLARE_ASN1_FUNCTIONS(GOST_KEY_PARAMS)
  96. typedef struct {
  97. ASN1_OCTET_STRING *iv;
  98. ASN1_OBJECT *enc_param_set;
  99. } GOST_CIPHER_PARAMS;
  100. DECLARE_ASN1_FUNCTIONS(GOST_CIPHER_PARAMS)
  101. /*============== Message digest and cipher related structures ==========*/
  102. /* Structure used as EVP_MD_CTX-md_data.
  103. * It allows to avoid storing in the md-data pointers to
  104. * dynamically allocated memory.
  105. *
  106. * I cannot invent better way to avoid memory leaks, because
  107. * openssl insist on invoking Init on Final-ed digests, and there
  108. * is no reliable way to find out whether pointer in the passed
  109. * md_data is valid or not.
  110. * */
  111. struct ossl_gost_digest_ctx {
  112. gost_hash_ctx dctx;
  113. gost_ctx cctx;
  114. };
  115. /* EVP_MD structure for GOST R 34.11 */
  116. extern EVP_MD digest_gost;
  117. /* EVP_MD structure for GOST 28147 in MAC mode */
  118. extern EVP_MD imit_gost_cpa;
  119. /* Cipher context used for EVP_CIPHER operation */
  120. struct ossl_gost_cipher_ctx {
  121. int paramNID;
  122. off_t count;
  123. int key_meshing;
  124. gost_ctx cctx;
  125. };
  126. /* Structure to map parameter NID to S-block */
  127. struct gost_cipher_info {
  128. int nid;
  129. gost_subst_block *sblock;
  130. int key_meshing;
  131. };
  132. /* Context for MAC */
  133. struct ossl_gost_imit_ctx {
  134. gost_ctx cctx;
  135. unsigned char buffer[8];
  136. unsigned char partial_block[8];
  137. off_t count;
  138. int key_meshing;
  139. int bytes_left;
  140. int key_set;
  141. };
  142. /* Table which maps parameter NID to S-blocks */
  143. extern struct gost_cipher_info gost_cipher_list[];
  144. /* Find encryption params from ASN1_OBJECT */
  145. const struct gost_cipher_info *get_encryption_params(ASN1_OBJECT *obj);
  146. /* Implementation of GOST 28147-89 cipher in CFB and CNT modes */
  147. extern EVP_CIPHER cipher_gost;
  148. extern EVP_CIPHER cipher_gost_cpacnt;
  149. #define EVP_MD_CTRL_KEY_LEN (EVP_MD_CTRL_ALG_CTRL+3)
  150. #define EVP_MD_CTRL_SET_KEY (EVP_MD_CTRL_ALG_CTRL+4)
  151. /* EVP_PKEY_METHOD key encryption callbacks */
  152. /* From gost94_keyx.c */
  153. int pkey_GOST94cp_encrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, const unsigned char* key, size_t key_len );
  154. int pkey_GOST94cp_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, const unsigned char* in, size_t in_len );
  155. /* From gost2001_keyx.c */
  156. int pkey_GOST01cp_encrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, const unsigned char* key, size_t key_len );
  157. int pkey_GOST01cp_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen, const unsigned char* in, size_t in_len );
  158. /* derive functions */
  159. /* From gost2001_keyx.c */
  160. int pkey_gost2001_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen);
  161. /* From gost94_keyx.c */
  162. int pkey_gost94_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen);
  163. /* Internal functions for signature algorithms */
  164. int fill_GOST94_params(DSA *dsa,int nid);
  165. int fill_GOST2001_params(EC_KEY *eckey, int nid);
  166. int gost_sign_keygen(DSA *dsa) ;
  167. int gost2001_keygen(EC_KEY *ec) ;
  168. DSA_SIG *gost_do_sign(const unsigned char *dgst,int dlen, DSA *dsa) ;
  169. DSA_SIG *gost2001_do_sign(const unsigned char *dgst,int dlen, EC_KEY *eckey);
  170. int gost_do_verify(const unsigned char *dgst, int dgst_len,
  171. DSA_SIG *sig, DSA *dsa) ;
  172. int gost2001_do_verify(const unsigned char *dgst,int dgst_len,
  173. DSA_SIG *sig, EC_KEY *ec);
  174. int gost2001_compute_public(EC_KEY *ec) ;
  175. int gost94_compute_public(DSA *dsa) ;
  176. /*============== miscellaneous functions============================= */
  177. /* from gost_sign.c */
  178. /* Convert GOST R 34.11 hash sum to bignum according to standard */
  179. BIGNUM *hashsum2bn(const unsigned char *dgst) ;
  180. /* Store bignum in byte array of given length, prepending by zeros
  181. * if nesseccary */
  182. int store_bignum(BIGNUM *bn, unsigned char *buf,int len);
  183. /* Read bignum, which can have few MSB all-zeros from buffer*/
  184. BIGNUM *getbnfrombuf(const unsigned char *buf,size_t len);
  185. /* Pack GOST R 34.10 signature according to CryptoPro rules */
  186. int pack_sign_cp(DSA_SIG *s,int order,unsigned char *sig, size_t *siglen);
  187. /* Unpack GOST R 34.10 signature according to CryptoPro rules */
  188. DSA_SIG *unpack_cp_signature(const unsigned char *sig,size_t siglen) ;
  189. /* from ameth.c */
  190. /* Get private key as BIGNUM from both R 34.10-94 and R 34.10-2001 keys*/
  191. /* Returns pointer into EVP_PKEY structure */
  192. BIGNUM* gost_get0_priv_key(const EVP_PKEY *pkey) ;
  193. /* Find NID by GOST 94 parameters */
  194. int gost94_nid_by_params(DSA *p) ;
  195. #endif