|
@@ -86,21 +86,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);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -111,6 +135,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);
|