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