1845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project/* 2845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * WPA Supplicant / wrapper functions for libcrypto 3845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Copyright (c) 2004-2005, Jouni Malinen <j@w1.fi> 4845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * 5845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * This program is free software; you can redistribute it and/or modify 6845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * it under the terms of the GNU General Public License version 2 as 7845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * published by the Free Software Foundation. 8845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * 9845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Alternatively, this software may be distributed under the terms of BSD 10845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * license. 11845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * 12845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * See README and COPYING for more details. 13845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project */ 14845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 15845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "includes.h" 16845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <openssl/opensslv.h> 17845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <openssl/md4.h> 18845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <openssl/md5.h> 19845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <openssl/sha.h> 20845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <openssl/des.h> 21845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include <openssl/aes.h> 22845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 23845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "common.h" 24845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "crypto.h" 25845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 26845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#if OPENSSL_VERSION_NUMBER < 0x00907000 27845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#define DES_key_schedule des_key_schedule 28845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#define DES_cblock des_cblock 29845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#define DES_set_key(key, schedule) des_set_key((key), *(schedule)) 30845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#define DES_ecb_encrypt(input, output, ks, enc) \ 31845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project des_ecb_encrypt((input), (output), *(ks), (enc)) 32845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* openssl < 0.9.7 */ 33845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 34845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 35845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid md4_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 36845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 37845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD4_CTX ctx; 38845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project size_t i; 39845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 40845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD4_Init(&ctx); 41845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project for (i = 0; i < num_elem; i++) 42845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD4_Update(&ctx, addr[i], len[i]); 43845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD4_Final(mac, &ctx); 44845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 45845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 46845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 47845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid des_encrypt(const u8 *clear, const u8 *key, u8 *cypher) 48845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 49845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project u8 pkey[8], next, tmp; 50845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project int i; 51845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project DES_key_schedule ks; 52845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 53845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project /* Add parity bits to the key */ 54845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project next = 0; 55845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project for (i = 0; i < 7; i++) { 56845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project tmp = key[i]; 57845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project pkey[i] = (tmp >> i) | next | 1; 58845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project next = tmp << (7 - i); 59845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project } 60845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project pkey[i] = next | 1; 61845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 62845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project DES_set_key(&pkey, &ks); 63845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project DES_ecb_encrypt((DES_cblock *) clear, (DES_cblock *) cypher, &ks, 64845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project DES_ENCRYPT); 65845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 66845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 67845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 68845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifdef EAP_TLS_FUNCS 69845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid md5_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 70845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 71845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD5_CTX ctx; 72845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project size_t i; 73845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 74845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD5_Init(&ctx); 75845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project for (i = 0; i < num_elem; i++) 76845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD5_Update(&ctx, addr[i], len[i]); 77845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project MD5_Final(mac, &ctx); 78845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 79845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 80845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 81845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac) 82845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 83845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project SHA_CTX ctx; 84845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project size_t i; 85845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 86845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project SHA1_Init(&ctx); 87845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project for (i = 0; i < num_elem; i++) 88845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project SHA1_Update(&ctx, addr[i], len[i]); 89845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project SHA1_Final(mac, &ctx); 90845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 91845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 92845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 93845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstatic void sha1_transform(u8 *state, const u8 data[64]) 94845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 95845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project SHA_CTX context; 96845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_memset(&context, 0, sizeof(context)); 97845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_memcpy(&context.h0, state, 5 * 4); 98845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project SHA1_Transform(&context, data); 99845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_memcpy(state, &context.h0, 5 * 4); 100845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 101845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 102845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 103845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectint fips186_2_prf(const u8 *seed, size_t seed_len, u8 *x, size_t xlen) 104845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 105845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project u8 xkey[64]; 106845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project u32 t[5], _t[5]; 107845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project int i, j, m, k; 108845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project u8 *xpos = x; 109845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project u32 carry; 110845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 111845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project if (seed_len > sizeof(xkey)) 112845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project seed_len = sizeof(xkey); 113845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 114845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project /* FIPS 186-2 + change notice 1 */ 115845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 116845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_memcpy(xkey, seed, seed_len); 117845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_memset(xkey + seed_len, 0, 64 - seed_len); 118845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project t[0] = 0x67452301; 119845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project t[1] = 0xEFCDAB89; 120845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project t[2] = 0x98BADCFE; 121845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project t[3] = 0x10325476; 122845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project t[4] = 0xC3D2E1F0; 123845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 124845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project m = xlen / 40; 125845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project for (j = 0; j < m; j++) { 126845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project /* XSEED_j = 0 */ 127845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project for (i = 0; i < 2; i++) { 128845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project /* XVAL = (XKEY + XSEED_j) mod 2^b */ 129845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 130845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project /* w_i = G(t, XVAL) */ 131845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_memcpy(_t, t, 20); 132845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project sha1_transform((u8 *) _t, xkey); 133845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project _t[0] = host_to_be32(_t[0]); 134845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project _t[1] = host_to_be32(_t[1]); 135845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project _t[2] = host_to_be32(_t[2]); 136845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project _t[3] = host_to_be32(_t[3]); 137845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project _t[4] = host_to_be32(_t[4]); 138845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_memcpy(xpos, _t, 20); 139845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 140845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project /* XKEY = (1 + XKEY + w_i) mod 2^b */ 141845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project carry = 1; 142845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project for (k = 19; k >= 0; k--) { 143845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project carry += xkey[k] + xpos[k]; 144845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project xkey[k] = carry & 0xff; 145845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project carry >>= 8; 146845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project } 147845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 148845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project xpos += 20; 149845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project } 150845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project /* x_j = w_0|w_1 */ 151845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project } 152845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 153845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project return 0; 154845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 155845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 156845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 157845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid * aes_encrypt_init(const u8 *key, size_t len) 158845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 159845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project AES_KEY *ak; 160845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project ak = os_malloc(sizeof(*ak)); 161845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project if (ak == NULL) 162845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project return NULL; 163845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project if (AES_set_encrypt_key(key, 8 * len, ak) < 0) { 164845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_free(ak); 165845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project return NULL; 166845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project } 167845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project return ak; 168845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 169845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 170845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 171845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid aes_encrypt(void *ctx, const u8 *plain, u8 *crypt) 172845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 173845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project AES_encrypt(plain, crypt, ctx); 174845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 175845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 176845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 177845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid aes_encrypt_deinit(void *ctx) 178845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 179845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_free(ctx); 180845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 181845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 182845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 183845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid * aes_decrypt_init(const u8 *key, size_t len) 184845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 185845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project AES_KEY *ak; 186845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project ak = os_malloc(sizeof(*ak)); 187845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project if (ak == NULL) 188845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project return NULL; 189845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project if (AES_set_decrypt_key(key, 8 * len, ak) < 0) { 190845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_free(ak); 191845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project return NULL; 192845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project } 193845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project return ak; 194845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 195845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 196845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 197845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid aes_decrypt(void *ctx, const u8 *crypt, u8 *plain) 198845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 199845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project AES_decrypt(crypt, plain, ctx); 200845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 201845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 202845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project 203845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid aes_decrypt_deinit(void *ctx) 204845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project{ 205845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project os_free(ctx); 206845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} 207845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* EAP_TLS_FUNCS */ 208