gost89.h 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /**********************************************************************
  2. * gost89.h *
  3. * Copyright (c) 2005-2006 Cryptocom LTD *
  4. * This file is distributed under the same license as OpenSSL *
  5. * *
  6. * Declarations for GOST 28147-89 encryption algorithm *
  7. * No OpenSSL libraries required to compile and use *
  8. * this code *
  9. **********************************************************************/
  10. #ifndef GOST89_H
  11. # define GOST89_H
  12. /* Typedef for unsigned 32-bit integer */
  13. # if __LONG_MAX__ > 2147483647L
  14. typedef unsigned int u4;
  15. # else
  16. typedef unsigned long u4;
  17. # endif
  18. /* Typedef for unsigned 8-bit integer */
  19. typedef unsigned char byte;
  20. /* Internal representation of GOST substitution blocks */
  21. typedef struct {
  22. byte k8[16];
  23. byte k7[16];
  24. byte k6[16];
  25. byte k5[16];
  26. byte k4[16];
  27. byte k3[16];
  28. byte k2[16];
  29. byte k1[16];
  30. } gost_subst_block;
  31. /* Cipher context includes key and preprocessed substitution block */
  32. typedef struct {
  33. u4 k[8];
  34. /* Constant s-boxes -- set up in gost_init(). */
  35. u4 k87[256], k65[256], k43[256], k21[256];
  36. } gost_ctx;
  37. /*
  38. * Note: encrypt and decrypt expect full blocks--padding blocks is caller's
  39. * responsibility. All bulk encryption is done in ECB mode by these calls.
  40. * Other modes may be added easily enough.
  41. */
  42. /* Encrypt several full blocks in ECB mode */
  43. void gost_enc(gost_ctx * ctx, const byte * clear, byte * cipher, int blocks);
  44. /* Decrypt several full blocks in ECB mode */
  45. void gost_dec(gost_ctx * ctx, const byte * cipher, byte * clear, int blocks);
  46. /* Encrypts several full blocks in CFB mode using 8byte IV */
  47. void gost_enc_cfb(gost_ctx * ctx, const byte * iv, const byte * clear,
  48. byte * cipher, int blocks);
  49. /* Decrypts several full blocks in CFB mode using 8byte IV */
  50. void gost_dec_cfb(gost_ctx * ctx, const byte * iv, const byte * cipher,
  51. byte * clear, int blocks);
  52. /* Encrypt one block */
  53. void gostcrypt(gost_ctx * c, const byte * in, byte * out);
  54. /* Decrypt one block */
  55. void gostdecrypt(gost_ctx * c, const byte * in, byte * out);
  56. /* Set key into context */
  57. void gost_key(gost_ctx * ctx, const byte * key);
  58. /* Get key from context */
  59. void gost_get_key(gost_ctx * ctx, byte * key);
  60. /* Set S-blocks into context */
  61. void gost_init(gost_ctx * ctx, const gost_subst_block * subst_block);
  62. /* Clean up context */
  63. void gost_destroy(gost_ctx * ctx);
  64. /* Intermediate function used for calculate hash */
  65. void gost_enc_with_key(gost_ctx *, byte * key, byte * inblock,
  66. byte * outblock);
  67. /* Compute MAC of given length in bits from data */
  68. int gost_mac(gost_ctx * ctx, int hmac_len, const unsigned char *data,
  69. unsigned int data_len, unsigned char *hmac);
  70. /*
  71. * Compute MAC of given length in bits from data, using non-zero 8-byte IV
  72. * (non-standard, for use in CryptoPro key transport only
  73. */
  74. int gost_mac_iv(gost_ctx * ctx, int hmac_len, const unsigned char *iv,
  75. const unsigned char *data, unsigned int data_len,
  76. unsigned char *hmac);
  77. /* Perform one step of MAC calculation like gostcrypt */
  78. void mac_block(gost_ctx * c, byte * buffer, const byte * block);
  79. /* Extracts MAC value from mac state buffer */
  80. void get_mac(byte * buffer, int nbits, byte * out);
  81. /* Implements cryptopro key meshing algorithm. Expect IV to be 8-byte size*/
  82. void cryptopro_key_meshing(gost_ctx * ctx, unsigned char *iv);
  83. /* Parameter sets specified in RFC 4357 */
  84. extern gost_subst_block GostR3411_94_TestParamSet;
  85. extern gost_subst_block GostR3411_94_CryptoProParamSet;
  86. extern gost_subst_block Gost28147_TestParamSet;
  87. extern gost_subst_block Gost28147_CryptoProParamSetA;
  88. extern gost_subst_block Gost28147_CryptoProParamSetB;
  89. extern gost_subst_block Gost28147_CryptoProParamSetC;
  90. extern gost_subst_block Gost28147_CryptoProParamSetD;
  91. extern const byte CryptoProKeyMeshingKey[];
  92. typedef unsigned int word32;
  93. #endif