diff options
Diffstat (limited to 'src/lib/libcrypto/evp/e_des.c')
| -rw-r--r-- | src/lib/libcrypto/evp/e_des.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/lib/libcrypto/evp/e_des.c b/src/lib/libcrypto/evp/e_des.c index 105266a4b3..46e2899825 100644 --- a/src/lib/libcrypto/evp/e_des.c +++ b/src/lib/libcrypto/evp/e_des.c | |||
| @@ -56,9 +56,9 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #ifndef OPENSSL_NO_DES | ||
| 60 | #include <stdio.h> | 59 | #include <stdio.h> |
| 61 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
| 61 | #ifndef OPENSSL_NO_DES | ||
| 62 | #include <openssl/evp.h> | 62 | #include <openssl/evp.h> |
| 63 | #include <openssl/objects.h> | 63 | #include <openssl/objects.h> |
| 64 | #include "evp_locl.h" | 64 | #include "evp_locl.h" |
| @@ -92,20 +92,55 @@ static int des_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
| 92 | return 1; | 92 | return 1; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static int des_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 95 | static int des_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
| 96 | const unsigned char *in, unsigned int inl) | 96 | const unsigned char *in, unsigned int inl) |
| 97 | { | 97 | { |
| 98 | DES_cfb64_encrypt(in, out, (long)inl, ctx->cipher_data, | 98 | DES_cfb64_encrypt(in, out, (long)inl, ctx->cipher_data, |
| 99 | (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); | 99 | (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); |
| 100 | return 1; | 100 | return 1; |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | /* Although we have a CFB-r implementation for DES, it doesn't pack the right | ||
| 104 | way, so wrap it here */ | ||
| 105 | static int des_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | ||
| 106 | const unsigned char *in, unsigned int inl) | ||
| 107 | { | ||
| 108 | unsigned int n; | ||
| 109 | unsigned char c[1],d[1]; | ||
| 110 | |||
| 111 | for(n=0 ; n < inl ; ++n) | ||
| 112 | { | ||
| 113 | c[0]=(in[n/8]&(1 << (7-n%8))) ? 0x80 : 0; | ||
| 114 | DES_cfb_encrypt(c,d,1,1,ctx->cipher_data,(DES_cblock *)ctx->iv, | ||
| 115 | ctx->encrypt); | ||
| 116 | out[n/8]=(out[n/8]&~(0x80 >> (n%8)))|((d[0]&0x80) >> (n%8)); | ||
| 117 | } | ||
| 118 | return 1; | ||
| 119 | } | ||
| 120 | |||
| 121 | static int des_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | ||
| 122 | const unsigned char *in, unsigned int inl) | ||
| 123 | { | ||
| 124 | DES_cfb_encrypt(in,out,8,inl,ctx->cipher_data,(DES_cblock *)ctx->iv, | ||
| 125 | ctx->encrypt); | ||
| 126 | return 1; | ||
| 127 | } | ||
| 128 | |||
| 103 | BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, | 129 | BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, |
| 104 | 0, des_init_key, NULL, | 130 | EVP_CIPH_FLAG_FIPS, des_init_key, NULL, |
| 105 | EVP_CIPHER_set_asn1_iv, | 131 | EVP_CIPHER_set_asn1_iv, |
| 106 | EVP_CIPHER_get_asn1_iv, | 132 | EVP_CIPHER_get_asn1_iv, |
| 107 | NULL) | 133 | NULL) |
| 108 | 134 | ||
| 135 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,1, | ||
| 136 | EVP_CIPH_FLAG_FIPS,des_init_key,NULL, | ||
| 137 | EVP_CIPHER_set_asn1_iv, | ||
| 138 | EVP_CIPHER_get_asn1_iv,NULL) | ||
| 139 | |||
| 140 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,8, | ||
| 141 | EVP_CIPH_FLAG_FIPS,des_init_key,NULL, | ||
| 142 | EVP_CIPHER_set_asn1_iv, | ||
| 143 | EVP_CIPHER_get_asn1_iv,NULL) | ||
| 109 | 144 | ||
| 110 | static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 145 | static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| 111 | const unsigned char *iv, int enc) | 146 | const unsigned char *iv, int enc) |
