diff options
Diffstat (limited to 'kernel/module_signing.c')
-rw-r--r-- | kernel/module_signing.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/kernel/module_signing.c b/kernel/module_signing.c index 6b09f6983ac0..ea1b1df5dbb0 100644 --- a/kernel/module_signing.c +++ b/kernel/module_signing.c | |||
@@ -183,27 +183,33 @@ static struct key *request_asymmetric_key(const char *signer, size_t signer_len, | |||
183 | /* | 183 | /* |
184 | * Verify the signature on a module. | 184 | * Verify the signature on a module. |
185 | */ | 185 | */ |
186 | int mod_verify_sig(const void *mod, unsigned long modlen, | 186 | int mod_verify_sig(const void *mod, unsigned long *_modlen) |
187 | const void *sig, unsigned long siglen) | ||
188 | { | 187 | { |
189 | struct public_key_signature *pks; | 188 | struct public_key_signature *pks; |
190 | struct module_signature ms; | 189 | struct module_signature ms; |
191 | struct key *key; | 190 | struct key *key; |
192 | size_t sig_len; | 191 | const void *sig; |
192 | size_t modlen = *_modlen, sig_len; | ||
193 | int ret; | 193 | int ret; |
194 | 194 | ||
195 | pr_devel("==>%s(,%lu,,%lu,)\n", __func__, modlen, siglen); | 195 | pr_devel("==>%s(,%zu)\n", __func__, modlen); |
196 | 196 | ||
197 | if (siglen <= sizeof(ms)) | 197 | if (modlen <= sizeof(ms)) |
198 | return -EBADMSG; | 198 | return -EBADMSG; |
199 | 199 | ||
200 | memcpy(&ms, sig + (siglen - sizeof(ms)), sizeof(ms)); | 200 | memcpy(&ms, mod + (modlen - sizeof(ms)), sizeof(ms)); |
201 | siglen -= sizeof(ms); | 201 | modlen -= sizeof(ms); |
202 | 202 | ||
203 | sig_len = be32_to_cpu(ms.sig_len); | 203 | sig_len = be32_to_cpu(ms.sig_len); |
204 | if (sig_len >= siglen || | 204 | if (sig_len >= modlen) |
205 | siglen - sig_len != (size_t)ms.signer_len + ms.key_id_len) | ||
206 | return -EBADMSG; | 205 | return -EBADMSG; |
206 | modlen -= sig_len; | ||
207 | if ((size_t)ms.signer_len + ms.key_id_len >= modlen) | ||
208 | return -EBADMSG; | ||
209 | modlen -= (size_t)ms.signer_len + ms.key_id_len; | ||
210 | |||
211 | *_modlen = modlen; | ||
212 | sig = mod + modlen; | ||
207 | 213 | ||
208 | /* For the moment, only support RSA and X.509 identifiers */ | 214 | /* For the moment, only support RSA and X.509 identifiers */ |
209 | if (ms.algo != PKEY_ALGO_RSA || | 215 | if (ms.algo != PKEY_ALGO_RSA || |