crypto_internal-rsa.c revision 252726
172878Skris/* 272878Skris * Crypto wrapper for internal crypto implementation - RSA parts 3100772Sjhb * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi> 4100772Sjhb * 5100772Sjhb * This software may be distributed under the terms of the BSD license. 672878Skris * See README for more details. 7101232Sru */ 8136606Sobrien 9100773Sjhb#include "includes.h" 10113374Sobrien 11126657Sbde#include "common.h" 12115175Speter#include "crypto.h" 13100773Sjhb#include "tls/rsa.h" 14103560Sjhb#include "tls/pkcs1.h" 15176776Sraj#include "tls/pkcs8.h" 16176776Sraj 17100773Sjhb/* Dummy structures; these are just typecast to struct crypto_rsa_key */ 18129217Scognetstruct crypto_public_key; 19129217Scognetstruct crypto_private_key; 20177385Simp 21177385Simp 22100773Sjhbstruct crypto_public_key * crypto_public_key_import(const u8 *key, size_t len) 23100772Sjhb{ 2472878Skris return (struct crypto_public_key *) 2572878Skris crypto_rsa_import_public_key(key, len); 2672878Skris} 2772878Skris 28100773Sjhb 29166071Sdesstruct crypto_private_key * crypto_private_key_import(const u8 *key, 30166071Sdes size_t len, 31166071Sdes const char *passwd) 32166071Sdes{ 33136607Sobrien struct crypto_private_key *res; 34136606Sobrien 35136606Sobrien /* First, check for possible PKCS #8 encoding */ 36136606Sobrien res = pkcs8_key_import(key, len); 37136606Sobrien if (res) 38136606Sobrien return res; 39136606Sobrien 40136606Sobrien if (passwd) { 41136606Sobrien /* Try to parse as encrypted PKCS #8 */ 42136606Sobrien res = pkcs8_enc_key_import(key, len, passwd); 43136606Sobrien if (res) 44136606Sobrien return res; 45136606Sobrien } 46136606Sobrien 47136606Sobrien /* Not PKCS#8, so try to import PKCS #1 encoded RSA private key */ 48136606Sobrien wpa_printf(MSG_DEBUG, "Trying to parse PKCS #1 encoded RSA private " 49136606Sobrien "key"); 50136606Sobrien return (struct crypto_private_key *) 51136607Sobrien crypto_rsa_import_private_key(key, len); 52136607Sobrien} 53133525Sobrien 54103045Smux 55103045Smuxstruct crypto_public_key * crypto_public_key_from_cert(const u8 *buf, 56100773Sjhb size_t len) 57136607Sobrien{ 58166072Sdes /* No X.509 support in crypto_internal.c */ 59136607Sobrien return NULL; 60136607Sobrien} 6172878Skris 6272878Skris 63136606Sobrienint crypto_public_key_encrypt_pkcs1_v15(struct crypto_public_key *key, 6496421Sobrien const u8 *in, size_t inlen, 6572878Skris u8 *out, size_t *outlen) 6696421Sobrien{ 67160536Simp return pkcs1_encrypt(2, (struct crypto_rsa_key *) key, 68127258Smarcel 0, in, inlen, out, outlen); 69127258Smarcel} 70177385Simp 7196421Sobrien 72127258Smarcelint crypto_private_key_decrypt_pkcs1_v15(struct crypto_private_key *key, 7372878Skris const u8 *in, size_t inlen, 7472878Skris u8 *out, size_t *outlen) 75127888Sdfr{ 76133000Sobrien return pkcs1_v15_private_key_decrypt((struct crypto_rsa_key *) key, 77136606Sobrien in, inlen, out, outlen); 78136606Sobrien} 79136606Sobrien 80136606Sobrien 81136606Sobrienint crypto_private_key_sign_pkcs1(struct crypto_private_key *key, 82136606Sobrien const u8 *in, size_t inlen, 83127888Sdfr u8 *out, size_t *outlen) 84127888Sdfr{ 85126938Strhodes return pkcs1_encrypt(1, (struct crypto_rsa_key *) key, 86126890Strhodes 1, in, inlen, out, outlen); 87126890Strhodes} 88126890Strhodes 89112768Sobrien 90126890Strhodesvoid crypto_public_key_free(struct crypto_public_key *key) 9172878Skris{ 92126890Strhodes crypto_rsa_free((struct crypto_rsa_key *) key); 93136606Sobrien} 94126890Strhodes 95136606Sobrien 96136606Sobrienvoid crypto_private_key_free(struct crypto_private_key *key) 97126890Strhodes{ 98136606Sobrien crypto_rsa_free((struct crypto_rsa_key *) key); 99126890Strhodes} 100136606Sobrien 101126890Strhodes 102136606Sobrienint crypto_public_key_decrypt_pkcs1(struct crypto_public_key *key, 103126890Strhodes const u8 *crypt, size_t crypt_len, 104136606Sobrien u8 *plain, size_t *plain_len) 105126890Strhodes{ 106136606Sobrien return pkcs1_decrypt_public_key((struct crypto_rsa_key *) key, 107136607Sobrien crypt, crypt_len, plain, plain_len); 108136607Sobrien} 109135678Scognet