1214501Srpaulo/* 2214501Srpaulo * Crypto wrapper for internal crypto implementation - RSA parts 3214501Srpaulo * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi> 4214501Srpaulo * 5252726Srpaulo * This software may be distributed under the terms of the BSD license. 6252726Srpaulo * See README for more details. 7214501Srpaulo */ 8214501Srpaulo 9214501Srpaulo#include "includes.h" 10214501Srpaulo 11214501Srpaulo#include "common.h" 12214501Srpaulo#include "crypto.h" 13214501Srpaulo#include "tls/rsa.h" 14214501Srpaulo#include "tls/pkcs1.h" 15214501Srpaulo#include "tls/pkcs8.h" 16214501Srpaulo 17214501Srpaulo/* Dummy structures; these are just typecast to struct crypto_rsa_key */ 18214501Srpaulostruct crypto_public_key; 19214501Srpaulostruct crypto_private_key; 20214501Srpaulo 21214501Srpaulo 22214501Srpaulostruct crypto_public_key * crypto_public_key_import(const u8 *key, size_t len) 23214501Srpaulo{ 24214501Srpaulo return (struct crypto_public_key *) 25214501Srpaulo crypto_rsa_import_public_key(key, len); 26214501Srpaulo} 27214501Srpaulo 28214501Srpaulo 29281806Srpaulostruct crypto_public_key * 30281806Srpaulocrypto_public_key_import_parts(const u8 *n, size_t n_len, 31281806Srpaulo const u8 *e, size_t e_len) 32281806Srpaulo{ 33281806Srpaulo return (struct crypto_public_key *) 34281806Srpaulo crypto_rsa_import_public_key_parts(n, n_len, e, e_len); 35281806Srpaulo} 36281806Srpaulo 37281806Srpaulo 38214501Srpaulostruct crypto_private_key * crypto_private_key_import(const u8 *key, 39214501Srpaulo size_t len, 40214501Srpaulo const char *passwd) 41214501Srpaulo{ 42214501Srpaulo struct crypto_private_key *res; 43214501Srpaulo 44214501Srpaulo /* First, check for possible PKCS #8 encoding */ 45214501Srpaulo res = pkcs8_key_import(key, len); 46214501Srpaulo if (res) 47214501Srpaulo return res; 48214501Srpaulo 49214501Srpaulo if (passwd) { 50214501Srpaulo /* Try to parse as encrypted PKCS #8 */ 51214501Srpaulo res = pkcs8_enc_key_import(key, len, passwd); 52214501Srpaulo if (res) 53214501Srpaulo return res; 54214501Srpaulo } 55214501Srpaulo 56214501Srpaulo /* Not PKCS#8, so try to import PKCS #1 encoded RSA private key */ 57214501Srpaulo wpa_printf(MSG_DEBUG, "Trying to parse PKCS #1 encoded RSA private " 58214501Srpaulo "key"); 59214501Srpaulo return (struct crypto_private_key *) 60214501Srpaulo crypto_rsa_import_private_key(key, len); 61214501Srpaulo} 62214501Srpaulo 63214501Srpaulo 64214501Srpaulostruct crypto_public_key * crypto_public_key_from_cert(const u8 *buf, 65214501Srpaulo size_t len) 66214501Srpaulo{ 67214501Srpaulo /* No X.509 support in crypto_internal.c */ 68214501Srpaulo return NULL; 69214501Srpaulo} 70214501Srpaulo 71214501Srpaulo 72214501Srpauloint crypto_public_key_encrypt_pkcs1_v15(struct crypto_public_key *key, 73214501Srpaulo const u8 *in, size_t inlen, 74214501Srpaulo u8 *out, size_t *outlen) 75214501Srpaulo{ 76214501Srpaulo return pkcs1_encrypt(2, (struct crypto_rsa_key *) key, 77214501Srpaulo 0, in, inlen, out, outlen); 78214501Srpaulo} 79214501Srpaulo 80214501Srpaulo 81214501Srpauloint crypto_private_key_decrypt_pkcs1_v15(struct crypto_private_key *key, 82214501Srpaulo const u8 *in, size_t inlen, 83214501Srpaulo u8 *out, size_t *outlen) 84214501Srpaulo{ 85214501Srpaulo return pkcs1_v15_private_key_decrypt((struct crypto_rsa_key *) key, 86214501Srpaulo in, inlen, out, outlen); 87214501Srpaulo} 88214501Srpaulo 89214501Srpaulo 90214501Srpauloint crypto_private_key_sign_pkcs1(struct crypto_private_key *key, 91214501Srpaulo const u8 *in, size_t inlen, 92214501Srpaulo u8 *out, size_t *outlen) 93214501Srpaulo{ 94214501Srpaulo return pkcs1_encrypt(1, (struct crypto_rsa_key *) key, 95214501Srpaulo 1, in, inlen, out, outlen); 96214501Srpaulo} 97214501Srpaulo 98214501Srpaulo 99214501Srpaulovoid crypto_public_key_free(struct crypto_public_key *key) 100214501Srpaulo{ 101214501Srpaulo crypto_rsa_free((struct crypto_rsa_key *) key); 102214501Srpaulo} 103214501Srpaulo 104214501Srpaulo 105214501Srpaulovoid crypto_private_key_free(struct crypto_private_key *key) 106214501Srpaulo{ 107214501Srpaulo crypto_rsa_free((struct crypto_rsa_key *) key); 108214501Srpaulo} 109214501Srpaulo 110214501Srpaulo 111214501Srpauloint crypto_public_key_decrypt_pkcs1(struct crypto_public_key *key, 112214501Srpaulo const u8 *crypt, size_t crypt_len, 113214501Srpaulo u8 *plain, size_t *plain_len) 114214501Srpaulo{ 115214501Srpaulo return pkcs1_decrypt_public_key((struct crypto_rsa_key *) key, 116214501Srpaulo crypt, crypt_len, plain, plain_len); 117214501Srpaulo} 118