/*
* TLSv1 credentials
- * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
}
-static int tlsv1_set_key_pem(struct tlsv1_credentials *cred,
- const u8 *key, size_t len)
+static struct crypto_private_key * tlsv1_set_key_pem(const u8 *key, size_t len)
{
const u8 *pos, *end;
unsigned char *der;
size_t der_len;
+ struct crypto_private_key *pkey;
pos = search_tag(pem_key_begin, key, len);
if (!pos) {
pos = search_tag(pem_key2_begin, key, len);
if (!pos)
- return -1;
+ return NULL;
pos += os_strlen(pem_key2_begin);
end = search_tag(pem_key2_end, pos, key + len - pos);
if (!end)
- return -1;
+ return NULL;
} else {
pos += os_strlen(pem_key_begin);
end = search_tag(pem_key_end, pos, key + len - pos);
if (!end)
- return -1;
+ return NULL;
}
der = base64_decode(pos, end - pos, &der_len);
if (!der)
- return -1;
- cred->key = crypto_private_key_import(der, der_len, NULL);
+ return NULL;
+ pkey = crypto_private_key_import(der, der_len, NULL);
os_free(der);
- return cred->key ? 0 : -1;
+ return pkey;
}
-static int tlsv1_set_key_enc_pem(struct tlsv1_credentials *cred,
- const u8 *key, size_t len, const char *passwd)
+static struct crypto_private_key * tlsv1_set_key_enc_pem(const u8 *key,
+ size_t len,
+ const char *passwd)
{
const u8 *pos, *end;
unsigned char *der;
size_t der_len;
+ struct crypto_private_key *pkey;
if (passwd == NULL)
- return -1;
+ return NULL;
pos = search_tag(pem_key_enc_begin, key, len);
if (!pos)
- return -1;
+ return NULL;
pos += os_strlen(pem_key_enc_begin);
end = search_tag(pem_key_enc_end, pos, key + len - pos);
if (!end)
- return -1;
+ return NULL;
der = base64_decode(pos, end - pos, &der_len);
if (!der)
- return -1;
- cred->key = crypto_private_key_import(der, der_len, passwd);
+ return NULL;
+ pkey = crypto_private_key_import(der, der_len, passwd);
os_free(der);
- return cred->key ? 0 : -1;
+ return pkey;
}
{
cred->key = crypto_private_key_import(key, len, passwd);
if (cred->key == NULL)
- tlsv1_set_key_pem(cred, key, len);
+ cred->key = tlsv1_set_key_pem(key, len);
if (cred->key == NULL)
- tlsv1_set_key_enc_pem(cred, key, len, passwd);
+ cred->key = tlsv1_set_key_enc_pem(key, len, passwd);
if (cred->key == NULL) {
wpa_printf(MSG_INFO, "TLSv1: Failed to parse private key");
return -1;