00001
00016 #include <stdio.h>
00017 #include <stdlib.h>
00018 #include <string.h>
00019 #include <sys/types.h>
00020
00021 #include <openssl/opensslv.h>
00022 #include <openssl/md4.h>
00023 #include <openssl/md5.h>
00024 #include <openssl/sha.h>
00025 #include <openssl/des.h>
00026 #include <openssl/aes.h>
00027
00028 #include "common.h"
00029 #include "crypto.h"
00030
00031 #if OPENSSL_VERSION_NUMBER < 0x00907000
00032 #define DES_key_schedule des_key_schedule
00033 #define DES_cblock des_cblock
00034 #define DES_set_key(key, schedule) des_set_key((key), *(schedule))
00035 #define DES_ecb_encrypt(input, output, ks, enc) \
00036 des_ecb_encrypt((input), (output), *(ks), (enc))
00037 #endif
00038
00039
00040 void md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
00041 {
00042 MD4_CTX ctx;
00043 int i;
00044
00045 MD4_Init(&ctx);
00046 for (i = 0; i < num_elem; i++)
00047 MD4_Update(&ctx, addr[i], len[i]);
00048 MD4_Final(mac, &ctx);
00049 }
00050
00051
00052 void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
00053 {
00054 u8 pkey[8], next, tmp;
00055 int i;
00056 DES_key_schedule ks;
00057
00058
00059 next = 0;
00060 for (i = 0; i < 7; i++) {
00061 tmp = key[i];
00062 pkey[i] = (tmp >> i) | next | 1;
00063 next = tmp << (7 - i);
00064 }
00065 pkey[i] = next | 1;
00066
00067 DES_set_key(&pkey, &ks);
00068 DES_ecb_encrypt((DES_cblock *) clear, (DES_cblock *) cypher, &ks,
00069 DES_ENCRYPT);
00070 }
00071
00072
00073 #ifdef EAP_TLS_FUNCS
00074 void md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
00075 {
00076 MD5_CTX ctx;
00077 int i;
00078
00079 MD5_Init(&ctx);
00080 for (i = 0; i < num_elem; i++)
00081 MD5_Update(&ctx, addr[i], len[i]);
00082 MD5_Final(mac, &ctx);
00083 }
00084
00085
00086 void sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
00087 {
00088 SHA_CTX ctx;
00089 int i;
00090
00091 SHA1_Init(&ctx);
00092 for (i = 0; i < num_elem; i++)
00093 SHA1_Update(&ctx, addr[i], len[i]);
00094 SHA1_Final(mac, &ctx);
00095 }
00096
00097
00098 void sha1_transform(u8 *state, const u8 data[64])
00099 {
00100 SHA_CTX context;
00101 memset(&context, 0, sizeof(context));
00102 memcpy(&context.h0, state, 5 * 4);
00103 SHA1_Transform(&context, data);
00104 memcpy(state, &context.h0, 5 * 4);
00105 }
00106
00107
00108 void * aes_encrypt_init(const u8 *key, size_t len)
00109 {
00110 AES_KEY *ak;
00111 ak = malloc(sizeof(*ak));
00112 if (ak == NULL)
00113 return NULL;
00114 if (AES_set_encrypt_key(key, 8 * len, ak) < 0) {
00115 free(ak);
00116 return NULL;
00117 }
00118 return ak;
00119 }
00120
00121
00122 void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt)
00123 {
00124 AES_encrypt(plain, crypt, ctx);
00125 }
00126
00127
00128 void aes_encrypt_deinit(void *ctx)
00129 {
00130 free(ctx);
00131 }
00132
00133
00134 void * aes_decrypt_init(const u8 *key, size_t len)
00135 {
00136 AES_KEY *ak;
00137 ak = malloc(sizeof(*ak));
00138 if (ak == NULL)
00139 return NULL;
00140 if (AES_set_decrypt_key(key, 8 * len, ak) < 0) {
00141 free(ak);
00142 return NULL;
00143 }
00144 return ak;
00145 }
00146
00147
00148 void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain)
00149 {
00150 AES_decrypt(crypt, plain, ctx);
00151 }
00152
00153
00154 void aes_decrypt_deinit(void *ctx)
00155 {
00156 free(ctx);
00157 }
00158 #endif
00159