1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/crypto/openssl/enc_provider/des.c
4 * Copyright (C) 2009 by the Massachusetts Institute of Technology.
7 * Export of this software from the United States of America may
8 * require a specific license from the United States Government.
9 * It is the responsibility of any person or organization contemplating
10 * export to obtain such a license before exporting.
12 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13 * distribute this software and its documentation for any purpose and
14 * without fee is hereby granted, provided that the above copyright
15 * notice appear in all copies and that both that copyright notice and
16 * this permission notice appear in supporting documentation, and that
17 * the name of M.I.T. not be used in advertising or publicity pertaining
18 * to distribution of the software without specific, written prior
19 * permission. Furthermore if you modify this software you must label
20 * your software as modified software and not distribute it in such a
21 * fashion that it might be confused with the original M.I.T. software.
22 * M.I.T. makes no representations about the suitability of
23 * this software for any purpose. It is provided "as is" without express
24 * or implied warranty.
28 * Copyright (C) 1998 by the FundsXpress, INC.
30 * All rights reserved.
32 * Export of this software from the United States of America may require
33 * a specific license from the United States Government. It is the
34 * responsibility of any person or organization contemplating export to
35 * obtain such a license before exporting.
37 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
38 * distribute this software and its documentation for any purpose and
39 * without fee is hereby granted, provided that the above copyright
40 * notice appear in all copies and that both that copyright notice and
41 * this permission notice appear in supporting documentation, and that
42 * the name of FundsXpress. not be used in advertising or publicity pertaining
43 * to distribution of the software without specific, written prior
44 * permission. FundsXpress makes no representations about the suitability of
45 * this software for any purpose. It is provided "as is" without express
46 * or implied warranty.
48 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
49 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
50 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
56 #include <openssl/evp.h>
59 #define DES_BLOCK_SIZE 8
60 #define DES_KEY_BYTES 7
62 static krb5_error_code
63 validate(krb5_key key, const krb5_data *ivec, const krb5_crypto_iov *data,
64 size_t num_data, krb5_boolean *empty)
66 size_t i, input_length;
68 for (i = 0, input_length = 0; i < num_data; i++) {
69 const krb5_crypto_iov *iov = &data[i];
71 input_length += iov->data.length;
74 if (key->keyblock.length != KRB5_MIT_DES_KEYSIZE)
75 return(KRB5_BAD_KEYSIZE);
76 if ((input_length%DES_BLOCK_SIZE) != 0)
77 return(KRB5_BAD_MSIZE);
78 if (ivec && (ivec->length != 8))
79 return(KRB5_BAD_MSIZE);
81 *empty = (input_length == 0);
85 static krb5_error_code
86 k5_des_encrypt(krb5_key key, const krb5_data *ivec, krb5_crypto_iov *data,
89 int ret, olen = MIT_DES_BLOCK_LENGTH;
90 unsigned char iblock[MIT_DES_BLOCK_LENGTH], oblock[MIT_DES_BLOCK_LENGTH];
91 struct iov_block_state input_pos, output_pos;
92 EVP_CIPHER_CTX ciph_ctx;
95 IOV_BLOCK_STATE_INIT(&input_pos);
96 IOV_BLOCK_STATE_INIT(&output_pos);
98 ret = validate(key, ivec, data, num_data, &empty);
99 if (ret != 0 || empty)
102 EVP_CIPHER_CTX_init(&ciph_ctx);
104 ret = EVP_EncryptInit_ex(&ciph_ctx, EVP_des_cbc(), NULL,
105 key->keyblock.contents, (ivec && ivec->data) ? (unsigned char*)ivec->data : NULL);
107 return KRB5_CRYPTO_INTERNAL;
109 EVP_CIPHER_CTX_set_padding(&ciph_ctx,0);
113 if (!krb5int_c_iov_get_block(iblock, MIT_DES_BLOCK_LENGTH, data,
114 num_data, &input_pos))
117 ret = EVP_EncryptUpdate(&ciph_ctx, oblock, &olen,
118 (unsigned char *)iblock, MIT_DES_BLOCK_LENGTH);
122 krb5int_c_iov_put_block(data, num_data, oblock, MIT_DES_BLOCK_LENGTH,
127 memcpy(ivec->data, oblock, MIT_DES_BLOCK_LENGTH);
129 EVP_CIPHER_CTX_cleanup(&ciph_ctx);
131 zap(iblock, sizeof(iblock));
132 zap(oblock, sizeof(oblock));
135 return KRB5_CRYPTO_INTERNAL;
139 static krb5_error_code
140 k5_des_decrypt(krb5_key key, const krb5_data *ivec, krb5_crypto_iov *data,
143 int ret, olen = MIT_DES_BLOCK_LENGTH;
144 unsigned char iblock[MIT_DES_BLOCK_LENGTH], oblock[MIT_DES_BLOCK_LENGTH];
145 struct iov_block_state input_pos, output_pos;
146 EVP_CIPHER_CTX ciph_ctx;
149 IOV_BLOCK_STATE_INIT(&input_pos);
150 IOV_BLOCK_STATE_INIT(&output_pos);
152 ret = validate(key, ivec, data, num_data, &empty);
153 if (ret != 0 || empty)
156 EVP_CIPHER_CTX_init(&ciph_ctx);
158 ret = EVP_DecryptInit_ex(&ciph_ctx, EVP_des_cbc(), NULL,
159 key->keyblock.contents,
160 (ivec) ? (unsigned char*)ivec->data : NULL);
162 return KRB5_CRYPTO_INTERNAL;
164 EVP_CIPHER_CTX_set_padding(&ciph_ctx,0);
168 if (!krb5int_c_iov_get_block(iblock, MIT_DES_BLOCK_LENGTH,
169 data, num_data, &input_pos))
172 ret = EVP_DecryptUpdate(&ciph_ctx, oblock, &olen,
173 iblock, MIT_DES_BLOCK_LENGTH);
176 krb5int_c_iov_put_block(data, num_data, oblock,
177 MIT_DES_BLOCK_LENGTH, &output_pos);
181 memcpy(ivec->data, iblock, MIT_DES_BLOCK_LENGTH);
183 EVP_CIPHER_CTX_cleanup(&ciph_ctx);
185 zap(iblock, sizeof(iblock));
186 zap(oblock, sizeof(oblock));
189 return KRB5_CRYPTO_INTERNAL;
193 const struct krb5_enc_provider krb5int_enc_des = {
195 DES_KEY_BYTES, KRB5_MIT_DES_KEYSIZE,
199 krb5int_des_make_key,
200 krb5int_des_init_state,
201 krb5int_default_free_state