1214501Srpaulo/*
2214501Srpaulo * Crypto wrapper for internal crypto implementation - RSA parts
3214501Srpaulo * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi>
4214501Srpaulo *
5214501Srpaulo * This program is free software; you can redistribute it and/or modify
6214501Srpaulo * it under the terms of the GNU General Public License version 2 as
7214501Srpaulo * published by the Free Software Foundation.
8214501Srpaulo *
9214501Srpaulo * Alternatively, this software may be distributed under the terms of BSD
10214501Srpaulo * license.
11214501Srpaulo *
12214501Srpaulo * See README and COPYING for more details.
13214501Srpaulo */
14214501Srpaulo
15214501Srpaulo#include "includes.h"
16214501Srpaulo
17214501Srpaulo#include "common.h"
18214501Srpaulo#include "crypto.h"
19214501Srpaulo#include "tls/rsa.h"
20214501Srpaulo#include "tls/bignum.h"
21214501Srpaulo#include "tls/pkcs1.h"
22214501Srpaulo#include "tls/pkcs8.h"
23214501Srpaulo
24214501Srpaulo/* Dummy structures; these are just typecast to struct crypto_rsa_key */
25214501Srpaulostruct crypto_public_key;
26214501Srpaulostruct crypto_private_key;
27214501Srpaulo
28214501Srpaulo
29214501Srpaulostruct crypto_public_key * crypto_public_key_import(const u8 *key, size_t len)
30214501Srpaulo{
31214501Srpaulo	return (struct crypto_public_key *)
32214501Srpaulo		crypto_rsa_import_public_key(key, len);
33214501Srpaulo}
34214501Srpaulo
35214501Srpaulo
36214501Srpaulostruct crypto_private_key * crypto_private_key_import(const u8 *key,
37214501Srpaulo						      size_t len,
38214501Srpaulo						      const char *passwd)
39214501Srpaulo{
40214501Srpaulo	struct crypto_private_key *res;
41214501Srpaulo
42214501Srpaulo	/* First, check for possible PKCS #8 encoding */
43214501Srpaulo	res = pkcs8_key_import(key, len);
44214501Srpaulo	if (res)
45214501Srpaulo		return res;
46214501Srpaulo
47214501Srpaulo	if (passwd) {
48214501Srpaulo		/* Try to parse as encrypted PKCS #8 */
49214501Srpaulo		res = pkcs8_enc_key_import(key, len, passwd);
50214501Srpaulo		if (res)
51214501Srpaulo			return res;
52214501Srpaulo	}
53214501Srpaulo
54214501Srpaulo	/* Not PKCS#8, so try to import PKCS #1 encoded RSA private key */
55214501Srpaulo	wpa_printf(MSG_DEBUG, "Trying to parse PKCS #1 encoded RSA private "
56214501Srpaulo		   "key");
57214501Srpaulo	return (struct crypto_private_key *)
58214501Srpaulo		crypto_rsa_import_private_key(key, len);
59214501Srpaulo}
60214501Srpaulo
61214501Srpaulo
62214501Srpaulostruct crypto_public_key * crypto_public_key_from_cert(const u8 *buf,
63214501Srpaulo						       size_t len)
64214501Srpaulo{
65214501Srpaulo	/* No X.509 support in crypto_internal.c */
66214501Srpaulo	return NULL;
67214501Srpaulo}
68214501Srpaulo
69214501Srpaulo
70214501Srpauloint crypto_public_key_encrypt_pkcs1_v15(struct crypto_public_key *key,
71214501Srpaulo					const u8 *in, size_t inlen,
72214501Srpaulo					u8 *out, size_t *outlen)
73214501Srpaulo{
74214501Srpaulo	return pkcs1_encrypt(2, (struct crypto_rsa_key *) key,
75214501Srpaulo			     0, in, inlen, out, outlen);
76214501Srpaulo}
77214501Srpaulo
78214501Srpaulo
79214501Srpauloint crypto_private_key_decrypt_pkcs1_v15(struct crypto_private_key *key,
80214501Srpaulo					 const u8 *in, size_t inlen,
81214501Srpaulo					 u8 *out, size_t *outlen)
82214501Srpaulo{
83214501Srpaulo	return pkcs1_v15_private_key_decrypt((struct crypto_rsa_key *) key,
84214501Srpaulo					     in, inlen, out, outlen);
85214501Srpaulo}
86214501Srpaulo
87214501Srpaulo
88214501Srpauloint crypto_private_key_sign_pkcs1(struct crypto_private_key *key,
89214501Srpaulo				  const u8 *in, size_t inlen,
90214501Srpaulo				  u8 *out, size_t *outlen)
91214501Srpaulo{
92214501Srpaulo	return pkcs1_encrypt(1, (struct crypto_rsa_key *) key,
93214501Srpaulo			     1, in, inlen, out, outlen);
94214501Srpaulo}
95214501Srpaulo
96214501Srpaulo
97214501Srpaulovoid crypto_public_key_free(struct crypto_public_key *key)
98214501Srpaulo{
99214501Srpaulo	crypto_rsa_free((struct crypto_rsa_key *) key);
100214501Srpaulo}
101214501Srpaulo
102214501Srpaulo
103214501Srpaulovoid crypto_private_key_free(struct crypto_private_key *key)
104214501Srpaulo{
105214501Srpaulo	crypto_rsa_free((struct crypto_rsa_key *) key);
106214501Srpaulo}
107214501Srpaulo
108214501Srpaulo
109214501Srpauloint crypto_public_key_decrypt_pkcs1(struct crypto_public_key *key,
110214501Srpaulo				    const u8 *crypt, size_t crypt_len,
111214501Srpaulo				    u8 *plain, size_t *plain_len)
112214501Srpaulo{
113214501Srpaulo	return pkcs1_decrypt_public_key((struct crypto_rsa_key *) key,
114214501Srpaulo					crypt, crypt_len, plain, plain_len);
115214501Srpaulo}
116