1e5b75505Sopenharmony_ci/* 2e5b75505Sopenharmony_ci * Crypto wrapper for internal crypto implementation - RSA parts 3e5b75505Sopenharmony_ci * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi> 4e5b75505Sopenharmony_ci * 5e5b75505Sopenharmony_ci * This software may be distributed under the terms of the BSD license. 6e5b75505Sopenharmony_ci * See README for more details. 7e5b75505Sopenharmony_ci */ 8e5b75505Sopenharmony_ci 9e5b75505Sopenharmony_ci#include "includes.h" 10e5b75505Sopenharmony_ci 11e5b75505Sopenharmony_ci#include "common.h" 12e5b75505Sopenharmony_ci#include "crypto.h" 13e5b75505Sopenharmony_ci#include "tls/rsa.h" 14e5b75505Sopenharmony_ci#include "tls/pkcs1.h" 15e5b75505Sopenharmony_ci#include "tls/pkcs8.h" 16e5b75505Sopenharmony_ci 17e5b75505Sopenharmony_ci/* Dummy structures; these are just typecast to struct crypto_rsa_key */ 18e5b75505Sopenharmony_cistruct crypto_public_key; 19e5b75505Sopenharmony_cistruct crypto_private_key; 20e5b75505Sopenharmony_ci 21e5b75505Sopenharmony_ci 22e5b75505Sopenharmony_cistruct crypto_public_key * crypto_public_key_import(const u8 *key, size_t len) 23e5b75505Sopenharmony_ci{ 24e5b75505Sopenharmony_ci return (struct crypto_public_key *) 25e5b75505Sopenharmony_ci crypto_rsa_import_public_key(key, len); 26e5b75505Sopenharmony_ci} 27e5b75505Sopenharmony_ci 28e5b75505Sopenharmony_ci 29e5b75505Sopenharmony_cistruct crypto_public_key * 30e5b75505Sopenharmony_cicrypto_public_key_import_parts(const u8 *n, size_t n_len, 31e5b75505Sopenharmony_ci const u8 *e, size_t e_len) 32e5b75505Sopenharmony_ci{ 33e5b75505Sopenharmony_ci return (struct crypto_public_key *) 34e5b75505Sopenharmony_ci crypto_rsa_import_public_key_parts(n, n_len, e, e_len); 35e5b75505Sopenharmony_ci} 36e5b75505Sopenharmony_ci 37e5b75505Sopenharmony_ci 38e5b75505Sopenharmony_cistruct crypto_private_key * crypto_private_key_import(const u8 *key, 39e5b75505Sopenharmony_ci size_t len, 40e5b75505Sopenharmony_ci const char *passwd) 41e5b75505Sopenharmony_ci{ 42e5b75505Sopenharmony_ci struct crypto_private_key *res; 43e5b75505Sopenharmony_ci 44e5b75505Sopenharmony_ci /* First, check for possible PKCS #8 encoding */ 45e5b75505Sopenharmony_ci res = pkcs8_key_import(key, len); 46e5b75505Sopenharmony_ci if (res) 47e5b75505Sopenharmony_ci return res; 48e5b75505Sopenharmony_ci 49e5b75505Sopenharmony_ci if (passwd) { 50e5b75505Sopenharmony_ci /* Try to parse as encrypted PKCS #8 */ 51e5b75505Sopenharmony_ci res = pkcs8_enc_key_import(key, len, passwd); 52e5b75505Sopenharmony_ci if (res) 53e5b75505Sopenharmony_ci return res; 54e5b75505Sopenharmony_ci } 55e5b75505Sopenharmony_ci 56e5b75505Sopenharmony_ci /* Not PKCS#8, so try to import PKCS #1 encoded RSA private key */ 57e5b75505Sopenharmony_ci wpa_printf(MSG_DEBUG, "Trying to parse PKCS #1 encoded RSA private " 58e5b75505Sopenharmony_ci "key"); 59e5b75505Sopenharmony_ci return (struct crypto_private_key *) 60e5b75505Sopenharmony_ci crypto_rsa_import_private_key(key, len); 61e5b75505Sopenharmony_ci} 62e5b75505Sopenharmony_ci 63e5b75505Sopenharmony_ci 64e5b75505Sopenharmony_cistruct crypto_public_key * crypto_public_key_from_cert(const u8 *buf, 65e5b75505Sopenharmony_ci size_t len) 66e5b75505Sopenharmony_ci{ 67e5b75505Sopenharmony_ci /* No X.509 support in crypto_internal.c */ 68e5b75505Sopenharmony_ci return NULL; 69e5b75505Sopenharmony_ci} 70e5b75505Sopenharmony_ci 71e5b75505Sopenharmony_ci 72e5b75505Sopenharmony_ciint crypto_public_key_encrypt_pkcs1_v15(struct crypto_public_key *key, 73e5b75505Sopenharmony_ci const u8 *in, size_t inlen, 74e5b75505Sopenharmony_ci u8 *out, size_t *outlen) 75e5b75505Sopenharmony_ci{ 76e5b75505Sopenharmony_ci return pkcs1_encrypt(2, (struct crypto_rsa_key *) key, 77e5b75505Sopenharmony_ci 0, in, inlen, out, outlen); 78e5b75505Sopenharmony_ci} 79e5b75505Sopenharmony_ci 80e5b75505Sopenharmony_ci 81e5b75505Sopenharmony_ciint crypto_private_key_decrypt_pkcs1_v15(struct crypto_private_key *key, 82e5b75505Sopenharmony_ci const u8 *in, size_t inlen, 83e5b75505Sopenharmony_ci u8 *out, size_t *outlen) 84e5b75505Sopenharmony_ci{ 85e5b75505Sopenharmony_ci return pkcs1_v15_private_key_decrypt((struct crypto_rsa_key *) key, 86e5b75505Sopenharmony_ci in, inlen, out, outlen); 87e5b75505Sopenharmony_ci} 88e5b75505Sopenharmony_ci 89e5b75505Sopenharmony_ci 90e5b75505Sopenharmony_ciint crypto_private_key_sign_pkcs1(struct crypto_private_key *key, 91e5b75505Sopenharmony_ci const u8 *in, size_t inlen, 92e5b75505Sopenharmony_ci u8 *out, size_t *outlen) 93e5b75505Sopenharmony_ci{ 94e5b75505Sopenharmony_ci return pkcs1_encrypt(1, (struct crypto_rsa_key *) key, 95e5b75505Sopenharmony_ci 1, in, inlen, out, outlen); 96e5b75505Sopenharmony_ci} 97e5b75505Sopenharmony_ci 98e5b75505Sopenharmony_ci 99e5b75505Sopenharmony_civoid crypto_public_key_free(struct crypto_public_key *key) 100e5b75505Sopenharmony_ci{ 101e5b75505Sopenharmony_ci crypto_rsa_free((struct crypto_rsa_key *) key); 102e5b75505Sopenharmony_ci} 103e5b75505Sopenharmony_ci 104e5b75505Sopenharmony_ci 105e5b75505Sopenharmony_civoid crypto_private_key_free(struct crypto_private_key *key) 106e5b75505Sopenharmony_ci{ 107e5b75505Sopenharmony_ci crypto_rsa_free((struct crypto_rsa_key *) key); 108e5b75505Sopenharmony_ci} 109e5b75505Sopenharmony_ci 110e5b75505Sopenharmony_ci 111e5b75505Sopenharmony_ciint crypto_public_key_decrypt_pkcs1(struct crypto_public_key *key, 112e5b75505Sopenharmony_ci const u8 *crypt, size_t crypt_len, 113e5b75505Sopenharmony_ci u8 *plain, size_t *plain_len) 114e5b75505Sopenharmony_ci{ 115e5b75505Sopenharmony_ci return pkcs1_decrypt_public_key((struct crypto_rsa_key *) key, 116e5b75505Sopenharmony_ci crypt, crypt_len, plain, plain_len); 117e5b75505Sopenharmony_ci} 118