Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22287b0b authored by Tadeusz Struk's avatar Tadeusz Struk Committed by Herbert Xu
Browse files

crypto: akcipher - Changes to asymmetric key API



Setkey function has been split into set_priv_key and set_pub_key.
Akcipher requests takes sgl for src and dst instead of void *.
Users of the API i.e. two existing RSA implementation and
test mgr code have been updated accordingly.

Signed-off-by: default avatarTadeusz Struk <tadeusz.struk@intel.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 2d4d1eea
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -31,10 +31,13 @@ obj-$(CONFIG_CRYPTO_HASH2) += crypto_hash.o
obj-$(CONFIG_CRYPTO_PCOMP2) += pcompress.o
obj-$(CONFIG_CRYPTO_AKCIPHER2) += akcipher.o

$(obj)/rsakey-asn1.o: $(obj)/rsakey-asn1.c $(obj)/rsakey-asn1.h
clean-files += rsakey-asn1.c rsakey-asn1.h
$(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h
$(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h
clean-files += rsapubkey-asn1.c rsapubkey-asn1.h
clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h

rsa_generic-y := rsakey-asn1.o
rsa_generic-y := rsapubkey-asn1.o
rsa_generic-y += rsaprivkey-asn1.o
rsa_generic-y += rsa.o
rsa_generic-y += rsa_helper.o
obj-$(CONFIG_CRYPTO_RSA) += rsa_generic.o
+49 −34
Original line number Diff line number Diff line
@@ -97,24 +97,21 @@ static int rsa_enc(struct akcipher_request *req)
		goto err_free_c;
	}

	m = mpi_read_raw_data(req->src, req->src_len);
	if (!m) {
	ret = -ENOMEM;
	m = mpi_read_raw_from_sgl(req->src, req->src_len);
	if (!m)
		goto err_free_c;
	}

	ret = _rsa_enc(pkey, c, m);
	if (ret)
		goto err_free_m;

	ret = mpi_read_buffer(c, req->dst, req->dst_len, &req->dst_len, &sign);
	ret = mpi_write_to_sgl(c, req->dst, &req->dst_len, &sign);
	if (ret)
		goto err_free_m;

	if (sign < 0) {
	if (sign < 0)
		ret = -EBADMSG;
		goto err_free_m;
	}

err_free_m:
	mpi_free(m);
@@ -145,25 +142,21 @@ static int rsa_dec(struct akcipher_request *req)
		goto err_free_m;
	}

	c = mpi_read_raw_data(req->src, req->src_len);
	if (!c) {
	ret = -ENOMEM;
	c = mpi_read_raw_from_sgl(req->src, req->src_len);
	if (!c)
		goto err_free_m;
	}

	ret = _rsa_dec(pkey, m, c);
	if (ret)
		goto err_free_c;

	ret = mpi_read_buffer(m, req->dst, req->dst_len, &req->dst_len, &sign);
	ret = mpi_write_to_sgl(m, req->dst, &req->dst_len, &sign);
	if (ret)
		goto err_free_c;

	if (sign < 0) {
	if (sign < 0)
		ret = -EBADMSG;
		goto err_free_c;
	}

err_free_c:
	mpi_free(c);
err_free_m:
@@ -193,24 +186,21 @@ static int rsa_sign(struct akcipher_request *req)
		goto err_free_s;
	}

	m = mpi_read_raw_data(req->src, req->src_len);
	if (!m) {
	ret = -ENOMEM;
	m = mpi_read_raw_from_sgl(req->src, req->src_len);
	if (!m)
		goto err_free_s;
	}

	ret = _rsa_sign(pkey, s, m);
	if (ret)
		goto err_free_m;

	ret = mpi_read_buffer(s, req->dst, req->dst_len, &req->dst_len, &sign);
	ret = mpi_write_to_sgl(s, req->dst, &req->dst_len, &sign);
	if (ret)
		goto err_free_m;

	if (sign < 0) {
	if (sign < 0)
		ret = -EBADMSG;
		goto err_free_m;
	}

err_free_m:
	mpi_free(m);
@@ -241,7 +231,8 @@ static int rsa_verify(struct akcipher_request *req)
		goto err_free_m;
	}

	s = mpi_read_raw_data(req->src, req->src_len);
	ret = -ENOMEM;
	s = mpi_read_raw_from_sgl(req->src, req->src_len);
	if (!s) {
		ret = -ENOMEM;
		goto err_free_m;
@@ -251,14 +242,12 @@ static int rsa_verify(struct akcipher_request *req)
	if (ret)
		goto err_free_s;

	ret = mpi_read_buffer(m, req->dst, req->dst_len, &req->dst_len, &sign);
	ret = mpi_write_to_sgl(m, req->dst, &req->dst_len, &sign);
	if (ret)
		goto err_free_s;

	if (sign < 0) {
	if (sign < 0)
		ret = -EBADMSG;
		goto err_free_s;
	}

err_free_s:
	mpi_free(s);
@@ -282,13 +271,30 @@ static int rsa_check_key_length(unsigned int len)
	return -EINVAL;
}

static int rsa_setkey(struct crypto_akcipher *tfm, const void *key,
static int rsa_set_pub_key(struct crypto_akcipher *tfm, const void *key,
			   unsigned int keylen)
{
	struct rsa_key *pkey = akcipher_tfm_ctx(tfm);
	int ret;

	ret = rsa_parse_pub_key(pkey, key, keylen);
	if (ret)
		return ret;

	if (rsa_check_key_length(mpi_get_size(pkey->n) << 3)) {
		rsa_free_key(pkey);
		ret = -EINVAL;
	}
	return ret;
}

static int rsa_set_priv_key(struct crypto_akcipher *tfm, const void *key,
			    unsigned int keylen)
{
	struct rsa_key *pkey = akcipher_tfm_ctx(tfm);
	int ret;

	ret = rsa_parse_key(pkey, key, keylen);
	ret = rsa_parse_priv_key(pkey, key, keylen);
	if (ret)
		return ret;

@@ -299,6 +305,13 @@ static int rsa_setkey(struct crypto_akcipher *tfm, const void *key,
	return ret;
}

static int rsa_max_size(struct crypto_akcipher *tfm)
{
	struct rsa_key *pkey = akcipher_tfm_ctx(tfm);

	return pkey->n ? mpi_get_size(pkey->n) : -EINVAL;
}

static void rsa_exit_tfm(struct crypto_akcipher *tfm)
{
	struct rsa_key *pkey = akcipher_tfm_ctx(tfm);
@@ -311,7 +324,9 @@ static struct akcipher_alg rsa = {
	.decrypt = rsa_dec,
	.sign = rsa_sign,
	.verify = rsa_verify,
	.setkey = rsa_setkey,
	.set_priv_key = rsa_set_priv_key,
	.set_pub_key = rsa_set_pub_key,
	.max_size = rsa_max_size,
	.exit = rsa_exit_tfm,
	.base = {
		.cra_name = "rsa",
+35 −7
Original line number Diff line number Diff line
@@ -15,7 +15,8 @@
#include <linux/err.h>
#include <linux/fips.h>
#include <crypto/internal/rsa.h>
#include "rsakey-asn1.h"
#include "rsapubkey-asn1.h"
#include "rsaprivkey-asn1.h"

int rsa_get_n(void *context, size_t hdrlen, unsigned char tag,
	      const void *value, size_t vlen)
@@ -94,7 +95,7 @@ void rsa_free_key(struct rsa_key *key)
EXPORT_SYMBOL_GPL(rsa_free_key);

/**
 * rsa_parse_key() - extracts an rsa key from BER encoded buffer
 * rsa_parse_pub_key() - extracts an rsa public key from BER encoded buffer
 *			 and stores it in the provided struct rsa_key
 *
 * @rsa_key:	struct rsa_key key representation
@@ -103,13 +104,13 @@ EXPORT_SYMBOL_GPL(rsa_free_key);
 *
 * Return:	0 on success or error code in case of error
 */
int rsa_parse_key(struct rsa_key *rsa_key, const void *key,
int rsa_parse_pub_key(struct rsa_key *rsa_key, const void *key,
		      unsigned int key_len)
{
	int ret;

	free_mpis(rsa_key);
	ret = asn1_ber_decoder(&rsakey_decoder, rsa_key, key, key_len);
	ret = asn1_ber_decoder(&rsapubkey_decoder, rsa_key, key, key_len);
	if (ret < 0)
		goto error;

@@ -118,4 +119,31 @@ int rsa_parse_key(struct rsa_key *rsa_key, const void *key,
	free_mpis(rsa_key);
	return ret;
}
EXPORT_SYMBOL_GPL(rsa_parse_key);
EXPORT_SYMBOL_GPL(rsa_parse_pub_key);

/**
 * rsa_parse_pub_key() - extracts an rsa private key from BER encoded buffer
 *			 and stores it in the provided struct rsa_key
 *
 * @rsa_key:	struct rsa_key key representation
 * @key:	key in BER format
 * @key_len:	length of key
 *
 * Return:	0 on success or error code in case of error
 */
int rsa_parse_priv_key(struct rsa_key *rsa_key, const void *key,
		       unsigned int key_len)
{
	int ret;

	free_mpis(rsa_key);
	ret = asn1_ber_decoder(&rsaprivkey_decoder, rsa_key, key, key_len);
	if (ret < 0)
		goto error;

	return 0;
error:
	free_mpis(rsa_key);
	return ret;
}
EXPORT_SYMBOL_GPL(rsa_parse_priv_key);

crypto/rsakey.asn1

deleted100644 → 0
+0 −5
Original line number Diff line number Diff line
RsaKey ::= SEQUENCE {
	n INTEGER ({ rsa_get_n }),
	e INTEGER ({ rsa_get_e }),
	d INTEGER ({ rsa_get_d })
}

crypto/rsaprivkey.asn1

0 → 100644
+11 −0
Original line number Diff line number Diff line
RsaPrivKey ::= SEQUENCE {
	version		INTEGER,
	n		INTEGER ({ rsa_get_n }),
	e		INTEGER ({ rsa_get_e }),
	d		INTEGER ({ rsa_get_d }),
	prime1		INTEGER,
	prime2		INTEGER,
	exponent1	INTEGER,
	exponent2	INTEGER,
	coefficient	INTEGER
}
Loading