crypto.c

Go to the documentation of this file.
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 /* openssl < 0.9.7 */
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         /* Add parity bits to the key */
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 /* EAP_TLS_FUNCS */
00159 

Generated on Sat May 6 21:13:31 2006 for wpa_supplicant by  doxygen 1.4.2