diff options
Diffstat (limited to 'crypto/asymmetric_keys/public_key.c')
| -rw-r--r-- | crypto/asymmetric_keys/public_key.c | 66 | 
1 files changed, 43 insertions, 23 deletions
diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c index cb2e29180a8..97eb001960b 100644 --- a/crypto/asymmetric_keys/public_key.c +++ b/crypto/asymmetric_keys/public_key.c @@ -22,29 +22,25 @@  MODULE_LICENSE("GPL"); -const char *const pkey_algo[PKEY_ALGO__LAST] = { +const char *const pkey_algo_name[PKEY_ALGO__LAST] = {  	[PKEY_ALGO_DSA]		= "DSA",  	[PKEY_ALGO_RSA]		= "RSA",  }; -EXPORT_SYMBOL_GPL(pkey_algo); +EXPORT_SYMBOL_GPL(pkey_algo_name); -const char *const pkey_hash_algo[PKEY_HASH__LAST] = { -	[PKEY_HASH_MD4]		= "md4", -	[PKEY_HASH_MD5]		= "md5", -	[PKEY_HASH_SHA1]	= "sha1", -	[PKEY_HASH_RIPE_MD_160]	= "rmd160", -	[PKEY_HASH_SHA256]	= "sha256", -	[PKEY_HASH_SHA384]	= "sha384", -	[PKEY_HASH_SHA512]	= "sha512", -	[PKEY_HASH_SHA224]	= "sha224", +const struct public_key_algorithm *pkey_algo[PKEY_ALGO__LAST] = { +#if defined(CONFIG_PUBLIC_KEY_ALGO_RSA) || \ +	defined(CONFIG_PUBLIC_KEY_ALGO_RSA_MODULE) +	[PKEY_ALGO_RSA]		= &RSA_public_key_algorithm, +#endif  }; -EXPORT_SYMBOL_GPL(pkey_hash_algo); +EXPORT_SYMBOL_GPL(pkey_algo); -const char *const pkey_id_type[PKEY_ID_TYPE__LAST] = { +const char *const pkey_id_type_name[PKEY_ID_TYPE__LAST] = {  	[PKEY_ID_PGP]		= "PGP",  	[PKEY_ID_X509]		= "X509",  }; -EXPORT_SYMBOL_GPL(pkey_id_type); +EXPORT_SYMBOL_GPL(pkey_id_type_name);  /*   * Provide a part of a description of the key for /proc/keys. @@ -56,7 +52,7 @@ static void public_key_describe(const struct key *asymmetric_key,  	if (key)  		seq_printf(m, "%s.%s", -			   pkey_id_type[key->id_type], key->algo->name); +			   pkey_id_type_name[key->id_type], key->algo->name);  }  /* @@ -78,21 +74,45 @@ EXPORT_SYMBOL_GPL(public_key_destroy);  /*   * Verify a signature using a public key.   */ -static int public_key_verify_signature(const struct key *key, -				       const struct public_key_signature *sig) +int public_key_verify_signature(const struct public_key *pk, +				const struct public_key_signature *sig)  { -	const struct public_key *pk = key->payload.data; +	const struct public_key_algorithm *algo; + +	BUG_ON(!pk); +	BUG_ON(!pk->mpi[0]); +	BUG_ON(!pk->mpi[1]); +	BUG_ON(!sig); +	BUG_ON(!sig->digest); +	BUG_ON(!sig->mpi[0]); + +	algo = pk->algo; +	if (!algo) { +		if (pk->pkey_algo >= PKEY_ALGO__LAST) +			return -ENOPKG; +		algo = pkey_algo[pk->pkey_algo]; +		if (!algo) +			return -ENOPKG; +	} -	if (!pk->algo->verify_signature) +	if (!algo->verify_signature)  		return -ENOTSUPP; -	if (sig->nr_mpi != pk->algo->n_sig_mpi) { +	if (sig->nr_mpi != algo->n_sig_mpi) {  		pr_debug("Signature has %u MPI not %u\n", -			 sig->nr_mpi, pk->algo->n_sig_mpi); +			 sig->nr_mpi, algo->n_sig_mpi);  		return -EINVAL;  	} -	return pk->algo->verify_signature(pk, sig); +	return algo->verify_signature(pk, sig); +} +EXPORT_SYMBOL_GPL(public_key_verify_signature); + +static int public_key_verify_signature_2(const struct key *key, +					 const struct public_key_signature *sig) +{ +	const struct public_key *pk = key->payload.data; +	return public_key_verify_signature(pk, sig);  }  /* @@ -103,6 +123,6 @@ struct asymmetric_key_subtype public_key_subtype = {  	.name			= "public_key",  	.describe		= public_key_describe,  	.destroy		= public_key_destroy, -	.verify_signature	= public_key_verify_signature, +	.verify_signature	= public_key_verify_signature_2,  };  EXPORT_SYMBOL_GPL(public_key_subtype);  | 
