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