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