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/key-type.h>
17 #include <crypto/public_key.h>
18 #include <keys/asymmetric-type.h>
20 #include "integrity.h"
23 * Request an asymmetric key.
25 static struct key
*request_asymmetric_key(struct key
*keyring
, uint32_t keyid
)
30 sprintf(name
, "id:%x", keyid
);
32 pr_debug("key search: \"%s\"\n", name
);
35 /* search in specific keyring */
37 kref
= keyring_search(make_key_ref(keyring
, 1),
38 &key_type_asymmetric
, name
);
42 key
= key_ref_to_ptr(kref
);
44 key
= request_key(&key_type_asymmetric
, name
, NULL
);
48 pr_warn("Request for unknown key '%s' err %ld\n",
50 switch (PTR_ERR(key
)) {
51 /* Hide some search errors */
55 return ERR_PTR(-ENOKEY
);
61 pr_debug("%s() = 0 [%x]\n", __func__
, key_serial(key
));
66 int asymmetric_verify(struct key
*keyring
, const char *sig
,
67 int siglen
, const char *data
, int datalen
)
69 struct public_key_signature pks
;
70 struct signature_v2_hdr
*hdr
= (struct signature_v2_hdr
*)sig
;
74 if (siglen
<= sizeof(*hdr
))
77 siglen
-= sizeof(*hdr
);
79 if (siglen
!= __be16_to_cpu(hdr
->sig_size
))
82 if (hdr
->hash_algo
>= PKEY_HASH__LAST
)
85 key
= request_asymmetric_key(keyring
, __be32_to_cpu(hdr
->keyid
));
89 memset(&pks
, 0, sizeof(pks
));
91 pks
.pkey_hash_algo
= hdr
->hash_algo
;
92 pks
.digest
= (u8
*)data
;
93 pks
.digest_size
= datalen
;
95 pks
.rsa
.s
= mpi_read_raw_data(hdr
->sig
, siglen
);
98 ret
= verify_signature(key
, &pks
);
102 pr_debug("%s() = %d\n", __func__
, ret
);