hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/crypto/asymmetric_keys/verify_pefile.c
....@@ -74,7 +74,7 @@
7474 break;
7575
7676 default:
77
- pr_debug("Unknown PEOPT magic = %04hx\n", pe32->magic);
77
+ pr_warn("Unknown PEOPT magic = %04hx\n", pe32->magic);
7878 return -ELIBBAD;
7979 }
8080
....@@ -95,7 +95,7 @@
9595 ctx->certs_size = ddir->certs.size;
9696
9797 if (!ddir->certs.virtual_address || !ddir->certs.size) {
98
- pr_debug("Unsigned PE binary\n");
98
+ pr_warn("Unsigned PE binary\n");
9999 return -ENODATA;
100100 }
101101
....@@ -127,7 +127,7 @@
127127 unsigned len;
128128
129129 if (ctx->sig_len < sizeof(wrapper)) {
130
- pr_debug("Signature wrapper too short\n");
130
+ pr_warn("Signature wrapper too short\n");
131131 return -ELIBBAD;
132132 }
133133
....@@ -135,19 +135,23 @@
135135 pr_debug("sig wrapper = { %x, %x, %x }\n",
136136 wrapper.length, wrapper.revision, wrapper.cert_type);
137137
138
- /* Both pesign and sbsign round up the length of certificate table
139
- * (in optional header data directories) to 8 byte alignment.
138
+ /* sbsign rounds up the length of certificate table (in optional
139
+ * header data directories) to 8 byte alignment. However, the PE
140
+ * specification states that while entries are 8-byte aligned, this is
141
+ * not included in their length, and as a result, pesign has not
142
+ * rounded up since 0.110.
140143 */
141
- if (round_up(wrapper.length, 8) != ctx->sig_len) {
142
- pr_debug("Signature wrapper len wrong\n");
144
+ if (wrapper.length > ctx->sig_len) {
145
+ pr_warn("Signature wrapper bigger than sig len (%x > %x)\n",
146
+ ctx->sig_len, wrapper.length);
143147 return -ELIBBAD;
144148 }
145149 if (wrapper.revision != WIN_CERT_REVISION_2_0) {
146
- pr_debug("Signature is not revision 2.0\n");
150
+ pr_warn("Signature is not revision 2.0\n");
147151 return -ENOTSUPP;
148152 }
149153 if (wrapper.cert_type != WIN_CERT_TYPE_PKCS_SIGNED_DATA) {
150
- pr_debug("Signature certificate type is not PKCS\n");
154
+ pr_warn("Signature certificate type is not PKCS\n");
151155 return -ENOTSUPP;
152156 }
153157
....@@ -160,7 +164,7 @@
160164 ctx->sig_offset += sizeof(wrapper);
161165 ctx->sig_len -= sizeof(wrapper);
162166 if (ctx->sig_len < 4) {
163
- pr_debug("Signature data missing\n");
167
+ pr_warn("Signature data missing\n");
164168 return -EKEYREJECTED;
165169 }
166170
....@@ -194,7 +198,7 @@
194198 return 0;
195199 }
196200 not_pkcs7:
197
- pr_debug("Signature data not PKCS#7\n");
201
+ pr_warn("Signature data not PKCS#7\n");
198202 return -ELIBBAD;
199203 }
200204
....@@ -337,8 +341,8 @@
337341 digest_size = crypto_shash_digestsize(tfm);
338342
339343 if (digest_size != ctx->digest_len) {
340
- pr_debug("Digest size mismatch (%zx != %x)\n",
341
- digest_size, ctx->digest_len);
344
+ pr_warn("Digest size mismatch (%zx != %x)\n",
345
+ digest_size, ctx->digest_len);
342346 ret = -EBADMSG;
343347 goto error_no_desc;
344348 }
....@@ -369,7 +373,7 @@
369373 * PKCS#7 certificate.
370374 */
371375 if (memcmp(digest, ctx->digest, ctx->digest_len) != 0) {
372
- pr_debug("Digest mismatch\n");
376
+ pr_warn("Digest mismatch\n");
373377 ret = -EKEYREJECTED;
374378 } else {
375379 pr_debug("The digests match!\n");