wpa_supplicant / hostapd  2.5
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Data Structures | Macros | Functions
crypto_libtomcrypt.c File Reference

WPA Supplicant / Crypto wrapper for LibTomCrypt (for internal TLSv1) More...

#include "includes.h"
#include <tomcrypt.h>
#include "common.h"
#include "crypto.h"

Data Structures

struct  crypto_hash
 
struct  crypto_cipher
 
struct  crypto_public_key
 
struct  crypto_private_key
 

Macros

#define mp_init_multi   ltc_init_multi
 
#define mp_clear_multi   ltc_deinit_multi
 
#define mp_unsigned_bin_size(a)   ltc_mp.unsigned_size(a)
 
#define mp_to_unsigned_bin(a, b)   ltc_mp.unsigned_write(a, b)
 
#define mp_read_unsigned_bin(a, b, c)   ltc_mp.unsigned_read(a, b, c)
 
#define mp_exptmod(a, b, c, d)   ltc_mp.exptmod(a,b,c,d)
 

Functions

int md4_vector (size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
 MD4 hash for data vector. More...
 
void des_encrypt (const u8 *clear, const u8 *key, u8 *cypher)
 Encrypt one block with DES. More...
 
int md5_vector (size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
 MD5 hash for data vector. More...
 
int sha1_vector (size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
 SHA-1 hash for data vector. More...
 
void * aes_encrypt_init (const u8 *key, size_t len)
 Initialize AES for encryption. More...
 
void aes_encrypt (void *ctx, const u8 *plain, u8 *crypt)
 Encrypt one AES block. More...
 
void aes_encrypt_deinit (void *ctx)
 Deinitialize AES encryption. More...
 
void * aes_decrypt_init (const u8 *key, size_t len)
 Initialize AES for decryption. More...
 
void aes_decrypt (void *ctx, const u8 *crypt, u8 *plain)
 Decrypt one AES block. More...
 
void aes_decrypt_deinit (void *ctx)
 Deinitialize AES decryption. More...
 
struct crypto_hashcrypto_hash_init (enum crypto_hash_alg alg, const u8 *key, size_t key_len)
 Initialize hash/HMAC function. More...
 
void crypto_hash_update (struct crypto_hash *ctx, const u8 *data, size_t len)
 Add data to hash calculation. More...
 
int crypto_hash_finish (struct crypto_hash *ctx, u8 *mac, size_t *len)
 Complete hash calculation. More...
 
struct crypto_ciphercrypto_cipher_init (enum crypto_cipher_alg alg, const u8 *iv, const u8 *key, size_t key_len)
 Initialize block/stream cipher function. More...
 
int crypto_cipher_encrypt (struct crypto_cipher *ctx, const u8 *plain, u8 *crypt, size_t len)
 Cipher encrypt. More...
 
int crypto_cipher_decrypt (struct crypto_cipher *ctx, const u8 *crypt, u8 *plain, size_t len)
 Cipher decrypt. More...
 
void crypto_cipher_deinit (struct crypto_cipher *ctx)
 Free cipher context. More...
 
struct crypto_public_keycrypto_public_key_import (const u8 *key, size_t len)
 Import an RSA public key. More...
 
struct crypto_private_keycrypto_private_key_import (const u8 *key, size_t len, const char *passwd)
 Import an RSA private key. More...
 
struct crypto_public_keycrypto_public_key_from_cert (const u8 *buf, size_t len)
 Import an RSA public key from a certificate. More...
 
int crypto_public_key_encrypt_pkcs1_v15 (struct crypto_public_key *key, const u8 *in, size_t inlen, u8 *out, size_t *outlen)
 Public key encryption (PKCS #1 v1.5) More...
 
int crypto_private_key_sign_pkcs1 (struct crypto_private_key *key, const u8 *in, size_t inlen, u8 *out, size_t *outlen)
 Sign with private key (PKCS #1) More...
 
void crypto_public_key_free (struct crypto_public_key *key)
 Free public key. More...
 
void crypto_private_key_free (struct crypto_private_key *key)
 Free private key. More...
 
int crypto_public_key_decrypt_pkcs1 (struct crypto_public_key *key, const u8 *crypt, size_t crypt_len, u8 *plain, size_t *plain_len)
 Decrypt PKCS #1 signature. More...
 
int crypto_global_init (void)
 Initialize crypto wrapper. More...
 
void crypto_global_deinit (void)
 Deinitialize crypto wrapper. More...
 

Detailed Description

WPA Supplicant / Crypto wrapper for LibTomCrypt (for internal TLSv1)

Function Documentation

void aes_decrypt ( void *  ctx,
const u8 *  crypt,
u8 *  plain 
)

Decrypt one AES block.

Parameters
ctxContext pointer from aes_encrypt_init()
cryptEncrypted data (16 bytes)
plainBuffer for the decrypted data (16 bytes)
void aes_decrypt_deinit ( void *  ctx)

Deinitialize AES decryption.

Parameters
ctxContext pointer from aes_encrypt_init()
void* aes_decrypt_init ( const u8 *  key,
size_t  len 
)

Initialize AES for decryption.

Parameters
keyDecryption key
lenKey length in bytes (usually 16, i.e., 128 bits)
Returns
Pointer to context data or NULL on failure
void aes_encrypt ( void *  ctx,
const u8 *  plain,
u8 *  crypt 
)

Encrypt one AES block.

Parameters
ctxContext pointer from aes_encrypt_init()
plainPlaintext data to be encrypted (16 bytes)
cryptBuffer for the encrypted data (16 bytes)
void aes_encrypt_deinit ( void *  ctx)

Deinitialize AES encryption.

Parameters
ctxContext pointer from aes_encrypt_init()
void* aes_encrypt_init ( const u8 *  key,
size_t  len 
)

Initialize AES for encryption.

Parameters
keyEncryption key
lenKey length in bytes (usually 16, i.e., 128 bits)
Returns
Pointer to context data or NULL on failure
int crypto_cipher_decrypt ( struct crypto_cipher ctx,
const u8 *  crypt,
u8 *  plain,
size_t  len 
)

Cipher decrypt.

Parameters
ctxContext pointer from crypto_cipher_init()
cryptCiphertext to decrypt
plainResulting plaintext
lenLength of the cipher text
Returns
0 on success, -1 on failure

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

void crypto_cipher_deinit ( struct crypto_cipher ctx)

Free cipher context.

Parameters
ctxContext pointer from crypto_cipher_init()

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

int crypto_cipher_encrypt ( struct crypto_cipher ctx,
const u8 *  plain,
u8 *  crypt,
size_t  len 
)

Cipher encrypt.

Parameters
ctxContext pointer from crypto_cipher_init()
plainPlaintext to cipher
cryptResulting ciphertext
lenLength of the plaintext
Returns
0 on success, -1 on failure

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

struct crypto_cipher* crypto_cipher_init ( enum crypto_cipher_alg  alg,
const u8 *  iv,
const u8 *  key,
size_t  key_len 
)

Initialize block/stream cipher function.

Parameters
algCipher algorithm
ivInitialization vector for block ciphers or NULL for stream ciphers
keyCipher key
key_lenLength of key in bytes
Returns
Pointer to cipher context to use with other cipher functions or NULL on failure

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

void crypto_global_deinit ( void  )

Deinitialize crypto wrapper.

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

int crypto_global_init ( void  )

Initialize crypto wrapper.

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

int crypto_hash_finish ( struct crypto_hash ctx,
u8 *  hash,
size_t *  len 
)

Complete hash calculation.

Parameters
ctxContext pointer from crypto_hash_init()
hashBuffer for hash value or NULL if caller is just freeing the hash context
lenPointer to length of the buffer or NULL if caller is just freeing the hash context; on return, this is set to the actual length of the hash value
Returns
0 on success, -1 if buffer is too small (len set to needed length), or -2 on other failures (including failed crypto_hash_update() operations)

This function calculates the hash value and frees the context buffer that was used for hash calculation.

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

struct crypto_hash* crypto_hash_init ( enum crypto_hash_alg  alg,
const u8 *  key,
size_t  key_len 
)

Initialize hash/HMAC function.

Parameters
algHash algorithm
keyKey for keyed hash (e.g., HMAC) or NULL if not needed
key_lenLength of the key in bytes
Returns
Pointer to hash context to use with other hash functions or NULL on failure

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

void crypto_hash_update ( struct crypto_hash ctx,
const u8 *  data,
size_t  len 
)

Add data to hash calculation.

Parameters
ctxContext pointer from crypto_hash_init()
dataData buffer to add
lenLength of the buffer

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

void crypto_private_key_free ( struct crypto_private_key key)

Free private key.

Parameters
keyPrivate key from crypto_private_key_import()

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

struct crypto_private_key* crypto_private_key_import ( const u8 *  key,
size_t  len,
const char *  passwd 
)

Import an RSA private key.

Parameters
keyKey buffer (DER encoded RSA private key)
lenKey buffer length in bytes
passwdKey encryption password or NULL if key is not encrypted
Returns
Pointer to the private key or NULL on failure

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

int crypto_private_key_sign_pkcs1 ( struct crypto_private_key key,
const u8 *  in,
size_t  inlen,
u8 *  out,
size_t *  outlen 
)

Sign with private key (PKCS #1)

Parameters
keyPrivate key from crypto_private_key_import()
inPlaintext buffer
inlenLength of plaintext buffer in bytes
outOutput buffer for encrypted (signed) data
outlenLength of output buffer in bytes; set to used length on success
Returns
0 on success, -1 on failure

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

int crypto_public_key_decrypt_pkcs1 ( struct crypto_public_key key,
const u8 *  crypt,
size_t  crypt_len,
u8 *  plain,
size_t *  plain_len 
)

Decrypt PKCS #1 signature.

Parameters
keyPublic key
cryptEncrypted signature data (using the private key)
crypt_lenEncrypted signature data length
plainBuffer for plaintext (at least crypt_len bytes)
plain_lenPlaintext length (max buffer size on input, real len on output);
Returns
0 on success, -1 on failure
int crypto_public_key_encrypt_pkcs1_v15 ( struct crypto_public_key key,
const u8 *  in,
size_t  inlen,
u8 *  out,
size_t *  outlen 
)

Public key encryption (PKCS #1 v1.5)

Parameters
keyPublic key
inPlaintext buffer
inlenLength of plaintext buffer in bytes
outOutput buffer for encrypted data
outlenLength of output buffer in bytes; set to used length on success
Returns
0 on success, -1 on failure

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

void crypto_public_key_free ( struct crypto_public_key key)

Free public key.

Parameters
keyPublic key

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

struct crypto_public_key* crypto_public_key_from_cert ( const u8 *  buf,
size_t  len 
)

Import an RSA public key from a certificate.

Parameters
bufDER encoded X.509 certificate
lenCertificate buffer length in bytes
Returns
Pointer to public key or NULL on failure

This function can just return NULL if the crypto library does not support X.509 parsing. In that case, internal code will be used to parse the certificate and public key is imported using crypto_public_key_import().

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

struct crypto_public_key* crypto_public_key_import ( const u8 *  key,
size_t  len 
)

Import an RSA public key.

Parameters
keyKey buffer (DER encoded RSA public key)
lenKey buffer length in bytes
Returns
Pointer to the public key or NULL on failure

This function can just return NULL if the crypto library supports X.509 parsing. In that case, crypto_public_key_from_cert() is used to import the public key from a certificate.

This function is only used with internal TLSv1 implementation (CONFIG_TLS=internal). If that is not used, the crypto wrapper does not need to implement this.

void des_encrypt ( const u8 *  clear,
const u8 *  key,
u8 *  cypher 
)

Encrypt one block with DES.

Parameters
clear8 octets (in)
key7 octets (in) (no parity bits included)
cypher8 octets (out)
int md4_vector ( size_t  num_elem,
const u8 *  addr[],
const size_t *  len,
u8 *  mac 
)

MD4 hash for data vector.

Parameters
num_elemNumber of elements in the data vector
addrPointers to the data areas
lenLengths of the data blocks
macBuffer for the hash
Returns
0 on success, -1 on failure
int md5_vector ( size_t  num_elem,
const u8 *  addr[],
const size_t *  len,
u8 *  mac 
)

MD5 hash for data vector.

Parameters
num_elemNumber of elements in the data vector
addrPointers to the data areas
lenLengths of the data blocks
macBuffer for the hash
Returns
0 on success, -1 on failure
int sha1_vector ( size_t  num_elem,
const u8 *  addr[],
const size_t *  len,
u8 *  mac 
)

SHA-1 hash for data vector.

Parameters
num_elemNumber of elements in the data vector
addrPointers to the data areas
lenLengths of the data blocks
macBuffer for the hash
Returns
0 on success, -1 on failure