2 * Copyright (C) 2013 Intel Corporation
5 * Dmitry Kasatkin <dmitry.kasatkin@intel.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, version 2 of the License.
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 #include <linux/err.h>
16 #include <linux/ratelimit.h>
17 #include <linux/key-type.h>
18 #include <crypto/public_key.h>
19 #include <keys/asymmetric-type.h>
21 #include "integrity.h"
24 * Request an asymmetric key.
26 static struct key
*request_asymmetric_key(struct key
*keyring
, uint32_t keyid
)
31 sprintf(name
, "id:%08x", keyid
);
33 pr_debug("key search: \"%s\"\n", name
);
36 /* search in specific keyring */
38 kref
= keyring_search(make_key_ref(keyring
, 1),
39 &key_type_asymmetric
, name
);
43 key
= key_ref_to_ptr(kref
);
45 key
= request_key(&key_type_asymmetric
, name
, NULL
);
49 pr_err_ratelimited("Request for unknown key '%s' err %ld\n",
51 switch (PTR_ERR(key
)) {
52 /* Hide some search errors */
56 return ERR_PTR(-ENOKEY
);
62 pr_debug("%s() = 0 [%x]\n", __func__
, key_serial(key
));
67 int asymmetric_verify(struct key
*keyring
, const char *sig
,
68 int siglen
, const char *data
, int datalen
)
70 struct public_key_signature pks
;
71 struct signature_v2_hdr
*hdr
= (struct signature_v2_hdr
*)sig
;
75 if (siglen
<= sizeof(*hdr
))
78 siglen
-= sizeof(*hdr
);
80 if (siglen
!= __be16_to_cpu(hdr
->sig_size
))
83 if (hdr
->hash_algo
>= PKEY_HASH__LAST
)
86 key
= request_asymmetric_key(keyring
, __be32_to_cpu(hdr
->keyid
));
90 memset(&pks
, 0, sizeof(pks
));
92 pks
.pkey_hash_algo
= hdr
->hash_algo
;
93 pks
.digest
= (u8
*)data
;
94 pks
.digest_size
= datalen
;
96 pks
.rsa
.s
= mpi_read_raw_data(hdr
->sig
, siglen
);
99 ret
= verify_signature(key
, &pks
);
103 pr_debug("%s() = %d\n", __func__
, ret
);