diff options
Diffstat (limited to 'src/lib/libcrypto/evp/evp_locl.h')
-rw-r--r-- | src/lib/libcrypto/evp/evp_locl.h | 125 |
1 files changed, 92 insertions, 33 deletions
diff --git a/src/lib/libcrypto/evp/evp_locl.h b/src/lib/libcrypto/evp/evp_locl.h index ce49d5b7d8..7b088b4848 100644 --- a/src/lib/libcrypto/evp/evp_locl.h +++ b/src/lib/libcrypto/evp/evp_locl.h | |||
@@ -61,50 +61,107 @@ | |||
61 | /* Wrapper functions for each cipher mode */ | 61 | /* Wrapper functions for each cipher mode */ |
62 | 62 | ||
63 | #define BLOCK_CIPHER_ecb_loop() \ | 63 | #define BLOCK_CIPHER_ecb_loop() \ |
64 | unsigned int i; \ | 64 | unsigned int i, bl; \ |
65 | if(inl < 8) return 1;\ | 65 | bl = ctx->cipher->block_size;\ |
66 | inl -= 8; \ | 66 | if(inl < bl) return 1;\ |
67 | for(i=0; i <= inl; i+=8) \ | 67 | inl -= bl; \ |
68 | for(i=0; i <= inl; i+=bl) \ | ||
68 | 69 | ||
69 | #define BLOCK_CIPHER_func_ecb(cname, cprefix, kname) \ | 70 | #define BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \ |
70 | static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ | 71 | static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ |
71 | {\ | 72 | {\ |
72 | BLOCK_CIPHER_ecb_loop() \ | 73 | BLOCK_CIPHER_ecb_loop() \ |
73 | cprefix##_ecb_encrypt(in + i, out + i, &ctx->c.kname, ctx->encrypt);\ | 74 | cprefix##_ecb_encrypt(in + i, out + i, &((kstruct *)ctx->cipher_data)->ksched, ctx->encrypt);\ |
74 | return 1;\ | 75 | return 1;\ |
75 | } | 76 | } |
76 | 77 | ||
77 | #define BLOCK_CIPHER_func_ofb(cname, cprefix, kname) \ | 78 | #define BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) \ |
78 | static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ | 79 | static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ |
79 | {\ | 80 | {\ |
80 | cprefix##_ofb64_encrypt(in, out, (long)inl, &ctx->c.kname, ctx->iv, &ctx->num);\ | 81 | cprefix##_ofb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\ |
81 | return 1;\ | 82 | return 1;\ |
82 | } | 83 | } |
83 | 84 | ||
84 | #define BLOCK_CIPHER_func_cbc(cname, cprefix, kname) \ | 85 | #define BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \ |
85 | static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ | 86 | static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ |
86 | {\ | 87 | {\ |
87 | cprefix##_cbc_encrypt(in, out, (long)inl, &ctx->c.kname, ctx->iv, ctx->encrypt);\ | 88 | cprefix##_cbc_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\ |
88 | return 1;\ | 89 | return 1;\ |
89 | } | 90 | } |
90 | 91 | ||
91 | #define BLOCK_CIPHER_func_cfb(cname, cprefix, kname) \ | 92 | #define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \ |
92 | static int cname##_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ | 93 | static int cname##_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \ |
93 | {\ | 94 | {\ |
94 | cprefix##_cfb64_encrypt(in, out, (long)inl, &ctx->c.kname, ctx->iv, &ctx->num, ctx->encrypt);\ | 95 | cprefix##_cfb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\ |
95 | return 1;\ | 96 | return 1;\ |
96 | } | 97 | } |
97 | 98 | ||
98 | #define BLOCK_CIPHER_all_funcs(cname, cprefix, kname) \ | 99 | #define BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \ |
99 | BLOCK_CIPHER_func_cbc(cname, cprefix, kname) \ | 100 | BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \ |
100 | BLOCK_CIPHER_func_cfb(cname, cprefix, kname) \ | 101 | BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \ |
101 | BLOCK_CIPHER_func_ecb(cname, cprefix, kname) \ | 102 | BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \ |
102 | BLOCK_CIPHER_func_ofb(cname, cprefix, kname) | 103 | BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) |
103 | 104 | ||
105 | #define BLOCK_CIPHER_def1(cname, nmode, mode, MODE, kstruct, nid, block_size, \ | ||
106 | key_len, iv_len, flags, init_key, cleanup, \ | ||
107 | set_asn1, get_asn1, ctrl) \ | ||
108 | static const EVP_CIPHER cname##_##mode = { \ | ||
109 | nid##_##nmode, block_size, key_len, iv_len, \ | ||
110 | flags | EVP_CIPH_##MODE##_MODE, \ | ||
111 | init_key, \ | ||
112 | cname##_##mode##_cipher, \ | ||
113 | cleanup, \ | ||
114 | sizeof(kstruct), \ | ||
115 | set_asn1, get_asn1,\ | ||
116 | ctrl, \ | ||
117 | NULL \ | ||
118 | }; \ | ||
119 | const EVP_CIPHER *EVP_##cname##_##mode(void) { return &cname##_##mode; } | ||
120 | |||
121 | #define BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, \ | ||
122 | iv_len, flags, init_key, cleanup, set_asn1, \ | ||
123 | get_asn1, ctrl) \ | ||
124 | BLOCK_CIPHER_def1(cname, cbc, cbc, CBC, kstruct, nid, block_size, key_len, \ | ||
125 | iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl) | ||
126 | |||
127 | #define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, block_size, key_len, \ | ||
128 | iv_len, cbits, flags, init_key, cleanup, \ | ||
129 | set_asn1, get_asn1, ctrl) \ | ||
130 | BLOCK_CIPHER_def1(cname, cfb##cbits, cfb, CFB, kstruct, nid, block_size, \ | ||
131 | key_len, iv_len, flags, init_key, cleanup, set_asn1, \ | ||
132 | get_asn1, ctrl) | ||
133 | |||
134 | #define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, block_size, key_len, \ | ||
135 | iv_len, cbits, flags, init_key, cleanup, \ | ||
136 | set_asn1, get_asn1, ctrl) \ | ||
137 | BLOCK_CIPHER_def1(cname, ofb##cbits, ofb, OFB, kstruct, nid, block_size, \ | ||
138 | key_len, iv_len, flags, init_key, cleanup, set_asn1, \ | ||
139 | get_asn1, ctrl) | ||
140 | |||
141 | #define BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, \ | ||
142 | iv_len, flags, init_key, cleanup, set_asn1, \ | ||
143 | get_asn1, ctrl) \ | ||
144 | BLOCK_CIPHER_def1(cname, ecb, ecb, ECB, kstruct, nid, block_size, key_len, \ | ||
145 | iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl) | ||
146 | |||
147 | #define BLOCK_CIPHER_defs(cname, kstruct, \ | ||
148 | nid, block_size, key_len, iv_len, cbits, flags, \ | ||
149 | init_key, cleanup, set_asn1, get_asn1, ctrl) \ | ||
150 | BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, iv_len, flags, \ | ||
151 | init_key, cleanup, set_asn1, get_asn1, ctrl) \ | ||
152 | BLOCK_CIPHER_def_cfb(cname, kstruct, nid, block_size, key_len, iv_len, cbits, \ | ||
153 | flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \ | ||
154 | BLOCK_CIPHER_def_ofb(cname, kstruct, nid, block_size, key_len, iv_len, cbits, \ | ||
155 | flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \ | ||
156 | BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, iv_len, flags, \ | ||
157 | init_key, cleanup, set_asn1, get_asn1, ctrl) | ||
158 | |||
159 | |||
160 | /* | ||
104 | #define BLOCK_CIPHER_defs(cname, kstruct, \ | 161 | #define BLOCK_CIPHER_defs(cname, kstruct, \ |
105 | nid, block_size, key_len, iv_len, flags,\ | 162 | nid, block_size, key_len, iv_len, flags,\ |
106 | init_key, cleanup, set_asn1, get_asn1, ctrl)\ | 163 | init_key, cleanup, set_asn1, get_asn1, ctrl)\ |
107 | static EVP_CIPHER cname##_cbc = {\ | 164 | static const EVP_CIPHER cname##_cbc = {\ |
108 | nid##_cbc, block_size, key_len, iv_len, \ | 165 | nid##_cbc, block_size, key_len, iv_len, \ |
109 | flags | EVP_CIPH_CBC_MODE,\ | 166 | flags | EVP_CIPH_CBC_MODE,\ |
110 | init_key,\ | 167 | init_key,\ |
@@ -116,8 +173,8 @@ static EVP_CIPHER cname##_cbc = {\ | |||
116 | ctrl, \ | 173 | ctrl, \ |
117 | NULL \ | 174 | NULL \ |
118 | };\ | 175 | };\ |
119 | EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }\ | 176 | const EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }\ |
120 | static EVP_CIPHER cname##_cfb = {\ | 177 | static const EVP_CIPHER cname##_cfb = {\ |
121 | nid##_cfb64, 1, key_len, iv_len, \ | 178 | nid##_cfb64, 1, key_len, iv_len, \ |
122 | flags | EVP_CIPH_CFB_MODE,\ | 179 | flags | EVP_CIPH_CFB_MODE,\ |
123 | init_key,\ | 180 | init_key,\ |
@@ -129,8 +186,8 @@ static EVP_CIPHER cname##_cfb = {\ | |||
129 | ctrl,\ | 186 | ctrl,\ |
130 | NULL \ | 187 | NULL \ |
131 | };\ | 188 | };\ |
132 | EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }\ | 189 | const EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }\ |
133 | static EVP_CIPHER cname##_ofb = {\ | 190 | static const EVP_CIPHER cname##_ofb = {\ |
134 | nid##_ofb64, 1, key_len, iv_len, \ | 191 | nid##_ofb64, 1, key_len, iv_len, \ |
135 | flags | EVP_CIPH_OFB_MODE,\ | 192 | flags | EVP_CIPH_OFB_MODE,\ |
136 | init_key,\ | 193 | init_key,\ |
@@ -142,8 +199,8 @@ static EVP_CIPHER cname##_ofb = {\ | |||
142 | ctrl,\ | 199 | ctrl,\ |
143 | NULL \ | 200 | NULL \ |
144 | };\ | 201 | };\ |
145 | EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }\ | 202 | const EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }\ |
146 | static EVP_CIPHER cname##_ecb = {\ | 203 | static const EVP_CIPHER cname##_ecb = {\ |
147 | nid##_ecb, block_size, key_len, iv_len, \ | 204 | nid##_ecb, block_size, key_len, iv_len, \ |
148 | flags | EVP_CIPH_ECB_MODE,\ | 205 | flags | EVP_CIPH_ECB_MODE,\ |
149 | init_key,\ | 206 | init_key,\ |
@@ -155,14 +212,16 @@ static EVP_CIPHER cname##_ecb = {\ | |||
155 | ctrl,\ | 212 | ctrl,\ |
156 | NULL \ | 213 | NULL \ |
157 | };\ | 214 | };\ |
158 | EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; } | 215 | const EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; } |
159 | 216 | */ | |
160 | |||
161 | 217 | ||
162 | #define IMPLEMENT_BLOCK_CIPHER(cname, kname, cprefix, kstruct, \ | 218 | #define IMPLEMENT_BLOCK_CIPHER(cname, ksched, cprefix, kstruct, nid, \ |
163 | nid, block_size, key_len, iv_len, flags, \ | 219 | block_size, key_len, iv_len, cbits, \ |
164 | init_key, cleanup, set_asn1, get_asn1, ctrl) \ | 220 | flags, init_key, \ |
165 | BLOCK_CIPHER_all_funcs(cname, cprefix, kname) \ | 221 | cleanup, set_asn1, get_asn1, ctrl) \ |
166 | BLOCK_CIPHER_defs(cname, kstruct, nid, block_size, key_len, iv_len, flags,\ | 222 | BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \ |
167 | init_key, cleanup, set_asn1, get_asn1, ctrl) | 223 | BLOCK_CIPHER_defs(cname, kstruct, nid, block_size, key_len, iv_len, \ |
224 | cbits, flags, init_key, cleanup, set_asn1, \ | ||
225 | get_asn1, ctrl) | ||
168 | 226 | ||
227 | #define EVP_C_DATA(kstruct, ctx) ((kstruct *)(ctx)->cipher_data) | ||