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 29214501Srpaulostruct crypto_private_key * crypto_private_key_import(const u8 *key, 30214501Srpaulo size_t len, 31214501Srpaulo const char *passwd) 32214501Srpaulo{ 33214501Srpaulo struct crypto_private_key *res; 34214501Srpaulo 35214501Srpaulo /* First, check for possible PKCS #8 encoding */ 36214501Srpaulo res = pkcs8_key_import(key, len); 37214501Srpaulo if (res) 38214501Srpaulo return res; 39214501Srpaulo 40214501Srpaulo if (passwd) { 41214501Srpaulo /* Try to parse as encrypted PKCS #8 */ 42214501Srpaulo res = pkcs8_enc_key_import(key, len, passwd); 43214501Srpaulo if (res) 44214501Srpaulo return res; 45214501Srpaulo } 46214501Srpaulo 47214501Srpaulo /* Not PKCS#8, so try to import PKCS #1 encoded RSA private key */ 48214501Srpaulo wpa_printf(MSG_DEBUG, "Trying to parse PKCS #1 encoded RSA private " 49214501Srpaulo "key"); 50214501Srpaulo return (struct crypto_private_key *) 51214501Srpaulo crypto_rsa_import_private_key(key, len); 52214501Srpaulo} 53214501Srpaulo 54214501Srpaulo 55214501Srpaulostruct crypto_public_key * crypto_public_key_from_cert(const u8 *buf, 56214501Srpaulo size_t len) 57214501Srpaulo{ 58214501Srpaulo /* No X.509 support in crypto_internal.c */ 59214501Srpaulo return NULL; 60214501Srpaulo} 61214501Srpaulo 62214501Srpaulo 63214501Srpauloint crypto_public_key_encrypt_pkcs1_v15(struct crypto_public_key *key, 64214501Srpaulo const u8 *in, size_t inlen, 65214501Srpaulo u8 *out, size_t *outlen) 66214501Srpaulo{ 67214501Srpaulo return pkcs1_encrypt(2, (struct crypto_rsa_key *) key, 68214501Srpaulo 0, in, inlen, out, outlen); 69214501Srpaulo} 70214501Srpaulo 71214501Srpaulo 72214501Srpauloint crypto_private_key_decrypt_pkcs1_v15(struct crypto_private_key *key, 73214501Srpaulo const u8 *in, size_t inlen, 74214501Srpaulo u8 *out, size_t *outlen) 75214501Srpaulo{ 76214501Srpaulo return pkcs1_v15_private_key_decrypt((struct crypto_rsa_key *) key, 77214501Srpaulo in, inlen, out, outlen); 78214501Srpaulo} 79214501Srpaulo 80214501Srpaulo 81214501Srpauloint crypto_private_key_sign_pkcs1(struct crypto_private_key *key, 82214501Srpaulo const u8 *in, size_t inlen, 83214501Srpaulo u8 *out, size_t *outlen) 84214501Srpaulo{ 85214501Srpaulo return pkcs1_encrypt(1, (struct crypto_rsa_key *) key, 86214501Srpaulo 1, in, inlen, out, outlen); 87214501Srpaulo} 88214501Srpaulo 89214501Srpaulo 90214501Srpaulovoid crypto_public_key_free(struct crypto_public_key *key) 91214501Srpaulo{ 92214501Srpaulo crypto_rsa_free((struct crypto_rsa_key *) key); 93214501Srpaulo} 94214501Srpaulo 95214501Srpaulo 96214501Srpaulovoid crypto_private_key_free(struct crypto_private_key *key) 97214501Srpaulo{ 98214501Srpaulo crypto_rsa_free((struct crypto_rsa_key *) key); 99214501Srpaulo} 100214501Srpaulo 101214501Srpaulo 102214501Srpauloint crypto_public_key_decrypt_pkcs1(struct crypto_public_key *key, 103214501Srpaulo const u8 *crypt, size_t crypt_len, 104214501Srpaulo u8 *plain, size_t *plain_len) 105214501Srpaulo{ 106214501Srpaulo return pkcs1_decrypt_public_key((struct crypto_rsa_key *) key, 107214501Srpaulo crypt, crypt_len, plain, plain_len); 108214501Srpaulo} 109