diff options
author | beck <> | 1999-09-29 04:37:45 +0000 |
---|---|---|
committer | beck <> | 1999-09-29 04:37:45 +0000 |
commit | de8f24ea083384bb66b32ec105dc4743c5663cdf (patch) | |
tree | 1412176ae62a3cab2cf2b0b92150fcbceaac6092 /src/lib/libcrypto/evp/e_cbc_r2.c | |
parent | cb929d29896bcb87c2a97417fbd03e50078fc178 (diff) | |
download | openbsd-de8f24ea083384bb66b32ec105dc4743c5663cdf.tar.gz openbsd-de8f24ea083384bb66b32ec105dc4743c5663cdf.tar.bz2 openbsd-de8f24ea083384bb66b32ec105dc4743c5663cdf.zip |
OpenSSL 0.9.4 merge
Diffstat (limited to 'src/lib/libcrypto/evp/e_cbc_r2.c')
-rw-r--r-- | src/lib/libcrypto/evp/e_cbc_r2.c | 122 |
1 files changed, 101 insertions, 21 deletions
diff --git a/src/lib/libcrypto/evp/e_cbc_r2.c b/src/lib/libcrypto/evp/e_cbc_r2.c index 4f8002f16d..9dfada4ea6 100644 --- a/src/lib/libcrypto/evp/e_cbc_r2.c +++ b/src/lib/libcrypto/evp/e_cbc_r2.c | |||
@@ -60,18 +60,21 @@ | |||
60 | 60 | ||
61 | #include <stdio.h> | 61 | #include <stdio.h> |
62 | #include "cryptlib.h" | 62 | #include "cryptlib.h" |
63 | #include "evp.h" | 63 | #include <openssl/evp.h> |
64 | #include "objects.h" | 64 | #include <openssl/objects.h> |
65 | 65 | ||
66 | #ifndef NOPROTO | ||
67 | static void rc2_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, | 66 | static void rc2_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, |
68 | unsigned char *iv,int enc); | 67 | unsigned char *iv,int enc); |
69 | static void rc2_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 68 | static void rc2_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
70 | unsigned char *in, unsigned int inl); | 69 | unsigned char *in, unsigned int inl); |
71 | #else | 70 | static int rc2_meth_to_magic(const EVP_CIPHER *e); |
72 | static void rc2_cbc_init_key(); | 71 | static EVP_CIPHER *rc2_magic_to_meth(int i); |
73 | static void rc2_cbc_cipher(); | 72 | static int rc2_set_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); |
74 | #endif | 73 | static int rc2_get_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); |
74 | |||
75 | #define RC2_40_MAGIC 0xa0 | ||
76 | #define RC2_64_MAGIC 0x78 | ||
77 | #define RC2_128_MAGIC 0x3a | ||
75 | 78 | ||
76 | static EVP_CIPHER r2_cbc_cipher= | 79 | static EVP_CIPHER r2_cbc_cipher= |
77 | { | 80 | { |
@@ -82,8 +85,21 @@ static EVP_CIPHER r2_cbc_cipher= | |||
82 | NULL, | 85 | NULL, |
83 | sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+ | 86 | sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+ |
84 | sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)), | 87 | sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)), |
85 | EVP_CIPHER_get_asn1_iv, | 88 | rc2_set_asn1_type_and_iv, |
86 | EVP_CIPHER_set_asn1_iv, | 89 | rc2_get_asn1_type_and_iv, |
90 | }; | ||
91 | |||
92 | static EVP_CIPHER r2_64_cbc_cipher= | ||
93 | { | ||
94 | NID_rc2_64_cbc, | ||
95 | 8,8 /* 64 bit */,8, | ||
96 | rc2_cbc_init_key, | ||
97 | rc2_cbc_cipher, | ||
98 | NULL, | ||
99 | sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+ | ||
100 | sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)), | ||
101 | rc2_set_asn1_type_and_iv, | ||
102 | rc2_get_asn1_type_and_iv, | ||
87 | }; | 103 | }; |
88 | 104 | ||
89 | static EVP_CIPHER r2_40_cbc_cipher= | 105 | static EVP_CIPHER r2_40_cbc_cipher= |
@@ -95,23 +111,27 @@ static EVP_CIPHER r2_40_cbc_cipher= | |||
95 | NULL, | 111 | NULL, |
96 | sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+ | 112 | sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+ |
97 | sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)), | 113 | sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)), |
114 | rc2_set_asn1_type_and_iv, | ||
115 | rc2_get_asn1_type_and_iv, | ||
98 | }; | 116 | }; |
99 | 117 | ||
100 | EVP_CIPHER *EVP_rc2_cbc() | 118 | EVP_CIPHER *EVP_rc2_cbc(void) |
101 | { | 119 | { |
102 | return(&r2_cbc_cipher); | 120 | return(&r2_cbc_cipher); |
103 | } | 121 | } |
104 | 122 | ||
105 | EVP_CIPHER *EVP_rc2_40_cbc() | 123 | EVP_CIPHER *EVP_rc2_64_cbc(void) |
124 | { | ||
125 | return(&r2_64_cbc_cipher); | ||
126 | } | ||
127 | |||
128 | EVP_CIPHER *EVP_rc2_40_cbc(void) | ||
106 | { | 129 | { |
107 | return(&r2_40_cbc_cipher); | 130 | return(&r2_40_cbc_cipher); |
108 | } | 131 | } |
109 | 132 | ||
110 | static void rc2_cbc_init_key(ctx,key,iv,enc) | 133 | static void rc2_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key, |
111 | EVP_CIPHER_CTX *ctx; | 134 | unsigned char *iv, int enc) |
112 | unsigned char *key; | ||
113 | unsigned char *iv; | ||
114 | int enc; | ||
115 | { | 135 | { |
116 | if (iv != NULL) | 136 | if (iv != NULL) |
117 | memcpy(&(ctx->oiv[0]),iv,8); | 137 | memcpy(&(ctx->oiv[0]),iv,8); |
@@ -121,11 +141,8 @@ int enc; | |||
121 | key,EVP_CIPHER_CTX_key_length(ctx)*8); | 141 | key,EVP_CIPHER_CTX_key_length(ctx)*8); |
122 | } | 142 | } |
123 | 143 | ||
124 | static void rc2_cbc_cipher(ctx,out,in,inl) | 144 | static void rc2_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
125 | EVP_CIPHER_CTX *ctx; | 145 | unsigned char *in, unsigned int inl) |
126 | unsigned char *out; | ||
127 | unsigned char *in; | ||
128 | unsigned int inl; | ||
129 | { | 146 | { |
130 | RC2_cbc_encrypt( | 147 | RC2_cbc_encrypt( |
131 | in,out,(long)inl, | 148 | in,out,(long)inl, |
@@ -133,4 +150,67 @@ unsigned int inl; | |||
133 | ctx->encrypt); | 150 | ctx->encrypt); |
134 | } | 151 | } |
135 | 152 | ||
153 | static int rc2_meth_to_magic(const EVP_CIPHER *e) | ||
154 | { | ||
155 | int i; | ||
156 | |||
157 | i=EVP_CIPHER_key_length(e); | ||
158 | if (i == 16) return(RC2_128_MAGIC); | ||
159 | else if (i == 8) return(RC2_64_MAGIC); | ||
160 | else if (i == 5) return(RC2_40_MAGIC); | ||
161 | else return(0); | ||
162 | } | ||
163 | |||
164 | static EVP_CIPHER *rc2_magic_to_meth(int i) | ||
165 | { | ||
166 | if (i == RC2_128_MAGIC) return(EVP_rc2_cbc()); | ||
167 | else if (i == RC2_64_MAGIC) return(EVP_rc2_64_cbc()); | ||
168 | else if (i == RC2_40_MAGIC) return(EVP_rc2_40_cbc()); | ||
169 | else | ||
170 | { | ||
171 | EVPerr(EVP_F_RC2_MAGIC_TO_METH,EVP_R_UNSUPPORTED_KEY_SIZE); | ||
172 | return(NULL); | ||
173 | } | ||
174 | } | ||
175 | |||
176 | static int rc2_get_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type) | ||
177 | { | ||
178 | long num=0; | ||
179 | int i=0,l; | ||
180 | EVP_CIPHER *e; | ||
181 | |||
182 | if (type != NULL) | ||
183 | { | ||
184 | l=EVP_CIPHER_CTX_iv_length(c); | ||
185 | i=ASN1_TYPE_get_int_octetstring(type,&num,c->oiv,l); | ||
186 | if (i != l) | ||
187 | return(-1); | ||
188 | else if (i > 0) | ||
189 | memcpy(c->iv,c->oiv,l); | ||
190 | e=rc2_magic_to_meth((int)num); | ||
191 | if (e == NULL) | ||
192 | return(-1); | ||
193 | if (e != EVP_CIPHER_CTX_cipher(c)) | ||
194 | { | ||
195 | EVP_CIPHER_CTX_cipher(c)=e; | ||
196 | rc2_cbc_init_key(c,NULL,NULL,1); | ||
197 | } | ||
198 | } | ||
199 | return(i); | ||
200 | } | ||
201 | |||
202 | static int rc2_set_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type) | ||
203 | { | ||
204 | long num; | ||
205 | int i=0,j; | ||
206 | |||
207 | if (type != NULL) | ||
208 | { | ||
209 | num=rc2_meth_to_magic(EVP_CIPHER_CTX_cipher(c)); | ||
210 | j=EVP_CIPHER_CTX_iv_length(c); | ||
211 | i=ASN1_TYPE_set_int_octetstring(type,num,c->oiv,j); | ||
212 | } | ||
213 | return(i); | ||
214 | } | ||
215 | |||
136 | #endif | 216 | #endif |