]> www.wagner.pp.ru Git - openssl-gost/engine.git/blob - gost_keyexpimp.c
+unit test, untested yet.
[openssl-gost/engine.git] / gost_keyexpimp.c
1 #include <string.h>
2 #include <openssl/evp.h>
3
4 #include "gost_lcl.h"
5 #include "e_gost_err.h"
6
7 /*
8  * Function expects that out is a preallocated buffer of length
9  * defined as sum of shared_len and mac length defined by mac_nid
10  * */
11 int gost_kexp15(const unsigned char *shared_key, const int shared_len,
12     int cipher_nid, const unsigned char *cipher_key, const size_t cipher_key_len,
13     int mac_nid, unsigned char *mac_key, const size_t mac_key_len,
14     const char *iv, const size_t ivlen,
15     unsigned char *out, int *out_len
16 )
17 {
18   /* out_len = key_len + mac_len */
19   unsigned char iv_full[16], mac_buf[8];
20   unsigned int mac_len;
21
22   EVP_CIPHER_CTX *ciph = NULL;
23   EVP_MD_CTX *mac = NULL;
24
25   int ret = 0;
26   int len;
27
28   /* we expect IV of half length */
29   memset(iv_full, 0, 16);
30   memcpy(iv_full, iv, ivlen);
31
32   mac = EVP_MD_CTX_new();
33   if (mac == NULL) {
34     GOSTerr(GOST_F_GOST_KEXP15, ERR_R_MALLOC_FAILURE);
35     goto err;
36   }
37
38   if(EVP_DigestInit_ex(mac, EVP_get_digestbynid(mac_nid), NULL) <= 0
39   || EVP_MD_CTX_ctrl(mac, EVP_MD_CTRL_SET_KEY, mac_key_len, mac_key) <= 0
40   || EVP_DigestUpdate(mac, shared_key, shared_len) <= 0
41   || EVP_DigestFinal_ex(mac, mac_buf, &mac_len) <= 0) {
42     GOSTerr(GOST_F_GOST_KEXP15, ERR_R_INTERNAL_ERROR);
43     goto err;
44   }
45
46   ciph = EVP_CIPHER_CTX_new();
47   if (ciph == NULL) {
48     GOSTerr(GOST_F_GOST_KEXP15, ERR_R_MALLOC_FAILURE);
49     goto err;
50   }
51
52   if (EVP_CipherInit_ex(ciph, EVP_get_cipherbynid(cipher_nid), NULL, NULL, NULL, 1) <= 0
53   || EVP_CipherInit_ex(ciph, NULL, NULL, cipher_key, iv_full, 1) <= 0
54   || EVP_CipherUpdate(ciph, out, &len, shared_key, shared_len) <= 0
55   || EVP_CipherUpdate(ciph, out + shared_len, &len, mac_buf, mac_len) <= 0
56   || EVP_CipherFinal_ex(ciph, out + shared_len + len, out_len) <= 0) {
57     GOSTerr(GOST_F_GOST_KEXP15, ERR_R_INTERNAL_ERROR);
58     goto err;
59   }
60
61   *out_len = shared_len + mac_len;
62
63   ret = 1;
64
65  err:
66   /* TODO clear mac_buf */
67   EVP_MD_CTX_free(mac);
68   EVP_CIPHER_CTX_free(ciph);
69
70   return ret;
71 }
72
73 int gost_kimp15(const char *expkey, const size_t expkeylen,
74     int cipher_nid, const char *cipher_key, const size_t cipher_key_len,
75     int mac_nid, const char *mac_key, const size_t mac_key_len,
76     const char *iv, const size_t ivlen,
77     char *shared_key, size_t *shared_len
78 )
79 {
80   return 0;
81 }
82
83 /*
84  * keyout expected to be 64 bytes
85  * */
86 int gost_keg(const unsigned char *seckey, const size_t seckey_len,
87     const EC_POINT *pub, const unsigned char *h,
88     unsigned char *keyout)
89 {
90     return 0;
91 }
92
93 #ifdef ENABLE_UNIT_TESTS
94 # include <stdio.h>
95 # include <string.h>
96 # include <openssl/obj_mac.h>
97
98 static void hexdump(FILE *f, const char *title, const unsigned char *s, int l)
99 {
100     int n = 0;
101
102     fprintf(f, "%s", title);
103     for (; n < l; ++n) {
104         if ((n % 16) == 0)
105             fprintf(f, "\n%04x", n);
106         fprintf(f, " %02x", s[n]);
107     }
108     fprintf(f, "\n");
109 }
110
111 int main(void)
112 {
113     const unsigned char key[] = {
114         0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
115         0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
116         0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
117         0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
118     };
119
120     const unsigned char magma_key[] = {
121 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
122 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
123 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
124 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
125     };
126
127     unsigned char mac_key[] = {
128 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
129 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
130 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
131 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
132     };
133
134                 const unsigned char iv[] = {0x67, 0xBE, 0xD6, 0x54};
135
136     unsigned char buf[32+8];
137     int ret;
138     int outlen = 40;
139
140     ret = gost_kexp15(key, 32,
141     NID_magma_ctr, magma_key, 32,
142     NID_magma_mac, mac_key, 32,
143     iv, 4,
144     buf, &outlen);
145
146   return 0;
147 }
148
149 #endif