$search
00001 /* 00002 * WPA Supplicant / wrapper functions for crypto libraries 00003 * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi> 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License version 2 as 00007 * published by the Free Software Foundation. 00008 * 00009 * Alternatively, this software may be distributed under the terms of BSD 00010 * license. 00011 * 00012 * See README and COPYING for more details. 00013 * 00014 * This file defines the cryptographic functions that need to be implemented 00015 * for wpa_supplicant and hostapd. When TLS is not used, internal 00016 * implementation of MD5, SHA1, and AES is used and no external libraries are 00017 * required. When TLS is enabled (e.g., by enabling EAP-TLS or EAP-PEAP), the 00018 * crypto library used by the TLS implementation is expected to be used for 00019 * non-TLS needs, too, in order to save space by not implementing these 00020 * functions twice. 00021 * 00022 * Wrapper code for using each crypto library is in its own file (crypto*.c) 00023 * and one of these files is build and linked in to provide the functions 00024 * defined here. 00025 */ 00026 00027 #ifndef CRYPTO_H 00028 #define CRYPTO_H 00029 00038 int md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac); 00039 00048 int md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac); 00049 00050 #ifdef CONFIG_FIPS 00051 00059 int md5_vector_non_fips_allow(size_t num_elem, const u8 *addr[], 00060 const size_t *len, u8 *mac); 00061 #else /* CONFIG_FIPS */ 00062 #define md5_vector_non_fips_allow md5_vector 00063 #endif /* CONFIG_FIPS */ 00064 00065 00074 int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, 00075 u8 *mac); 00076 00089 int __must_check fips186_2_prf(const u8 *seed, size_t seed_len, u8 *x, 00090 size_t xlen); 00091 00100 int sha256_vector(size_t num_elem, const u8 *addr[], const size_t *len, 00101 u8 *mac); 00102 00109 void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher); 00110 00117 void * aes_encrypt_init(const u8 *key, size_t len); 00118 00125 void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt); 00126 00131 void aes_encrypt_deinit(void *ctx); 00132 00139 void * aes_decrypt_init(const u8 *key, size_t len); 00140 00147 void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain); 00148 00153 void aes_decrypt_deinit(void *ctx); 00154 00155 00156 enum crypto_hash_alg { 00157 CRYPTO_HASH_ALG_MD5, CRYPTO_HASH_ALG_SHA1, 00158 CRYPTO_HASH_ALG_HMAC_MD5, CRYPTO_HASH_ALG_HMAC_SHA1 00159 }; 00160 00161 struct crypto_hash; 00162 00175 struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key, 00176 size_t key_len); 00177 00188 void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len); 00189 00207 int crypto_hash_finish(struct crypto_hash *ctx, u8 *hash, size_t *len); 00208 00209 00210 enum crypto_cipher_alg { 00211 CRYPTO_CIPHER_NULL = 0, CRYPTO_CIPHER_ALG_AES, CRYPTO_CIPHER_ALG_3DES, 00212 CRYPTO_CIPHER_ALG_DES, CRYPTO_CIPHER_ALG_RC2, CRYPTO_CIPHER_ALG_RC4 00213 }; 00214 00215 struct crypto_cipher; 00216 00230 struct crypto_cipher * crypto_cipher_init(enum crypto_cipher_alg alg, 00231 const u8 *iv, const u8 *key, 00232 size_t key_len); 00233 00246 int __must_check crypto_cipher_encrypt(struct crypto_cipher *ctx, 00247 const u8 *plain, u8 *crypt, size_t len); 00248 00261 int __must_check crypto_cipher_decrypt(struct crypto_cipher *ctx, 00262 const u8 *crypt, u8 *plain, size_t len); 00263 00272 void crypto_cipher_deinit(struct crypto_cipher *ctx); 00273 00274 00275 struct crypto_public_key; 00276 struct crypto_private_key; 00277 00292 struct crypto_public_key * crypto_public_key_import(const u8 *key, size_t len); 00293 00305 struct crypto_private_key * crypto_private_key_import(const u8 *key, 00306 size_t len, 00307 const char *passwd); 00308 00323 struct crypto_public_key * crypto_public_key_from_cert(const u8 *buf, 00324 size_t len); 00325 00339 int __must_check crypto_public_key_encrypt_pkcs1_v15( 00340 struct crypto_public_key *key, const u8 *in, size_t inlen, 00341 u8 *out, size_t *outlen); 00342 00356 int __must_check crypto_private_key_decrypt_pkcs1_v15( 00357 struct crypto_private_key *key, const u8 *in, size_t inlen, 00358 u8 *out, size_t *outlen); 00359 00373 int __must_check crypto_private_key_sign_pkcs1(struct crypto_private_key *key, 00374 const u8 *in, size_t inlen, 00375 u8 *out, size_t *outlen); 00376 00385 void crypto_public_key_free(struct crypto_public_key *key); 00386 00395 void crypto_private_key_free(struct crypto_private_key *key); 00396 00406 int __must_check crypto_public_key_decrypt_pkcs1( 00407 struct crypto_public_key *key, const u8 *crypt, size_t crypt_len, 00408 u8 *plain, size_t *plain_len); 00409 00417 int __must_check crypto_global_init(void); 00418 00426 void crypto_global_deinit(void); 00427 00448 int __must_check crypto_mod_exp(const u8 *base, size_t base_len, 00449 const u8 *power, size_t power_len, 00450 const u8 *modulus, size_t modulus_len, 00451 u8 *result, size_t *result_len); 00452 00466 int rc4_skip(const u8 *key, size_t keylen, size_t skip, 00467 u8 *data, size_t data_len); 00468 00469 #endif /* CRYPTO_H */