| From d49c92c8420db6ee4c88515bdb014f68f4d471d9 Mon Sep 17 00:00:00 2001 |
| From: Daiki Ueno <ueno@gnu.org> |
| Date: Sat, 2 Dec 2023 09:24:01 +0900 |
| Subject: [PATCH] import-object: Avoid integer truncation on 32-bit platforms |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| The build fails when compiling for 32-bit platforms with |
| -Werror=incompatible-pointer-types: |
| |
| CFLAGS="-m32 -march=i686 -Werror=incompatible-pointer-types -Werror=implicit -Werror=int-conversion" setarch i686 -- meson setup _build |
| setarch i686 -- meson compile -C _build -v |
| ... |
| |
| ../p11-kit/import-object.c: In function ‘add_attrs_pubkey_rsa’: |
| ../p11-kit/import-object.c:223:62: error: passing argument 3 of ‘p11_asn1_read’ from incompatible pointer type [-Werror=incompatible-pointer-types] |
| 223 | attr_modulus.pValue = p11_asn1_read (asn, "modulus", &attr_modulus.ulValueLen); |
| | ^~~~~~~~~~~~~~~~~~~~~~~~ |
| | | |
| | long unsigned int * |
| |
| Reported by Sam James in: |
| https://github.com/p11-glue/p11-kit/issues/608 |
| |
| Signed-off-by: Daiki Ueno <ueno@gnu.org> |
| |
| Upstream: https://github.com/p11-glue/p11-kit/commit/d49c92c8420db6ee4c88515bdb014f68f4d471d9 |
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |
| --- |
| p11-kit/import-object.c | 30 +++++++++++++++++++++++++++--- |
| 1 file changed, 27 insertions(+), 3 deletions(-) |
| |
| diff --git a/p11-kit/import-object.c b/p11-kit/import-object.c |
| index feee0765..fb47b964 100644 |
| --- a/p11-kit/import-object.c |
| +++ b/p11-kit/import-object.c |
| @@ -55,6 +55,7 @@ |
| #endif |
| |
| #include <assert.h> |
| +#include <limits.h> |
| #include <stdbool.h> |
| #include <stdlib.h> |
| #include <string.h> |
| @@ -201,6 +202,7 @@ add_attrs_pubkey_rsa (CK_ATTRIBUTE *attrs, |
| CK_ATTRIBUTE attr_encrypt = { CKA_ENCRYPT, &tval, sizeof (tval) }; |
| CK_ATTRIBUTE attr_modulus = { CKA_MODULUS, }; |
| CK_ATTRIBUTE attr_exponent = { CKA_PUBLIC_EXPONENT, }; |
| + size_t len = 0; |
| |
| pubkey = p11_asn1_read (info, "subjectPublicKey", &pubkey_len); |
| if (pubkey == NULL) { |
| @@ -220,17 +222,31 @@ add_attrs_pubkey_rsa (CK_ATTRIBUTE *attrs, |
| goto cleanup; |
| } |
| |
| - attr_modulus.pValue = p11_asn1_read (asn, "modulus", &attr_modulus.ulValueLen); |
| + attr_modulus.pValue = p11_asn1_read (asn, "modulus", &len); |
| if (attr_modulus.pValue == NULL) { |
| p11_message (_("failed to obtain modulus")); |
| goto cleanup; |
| } |
| +#if ULONG_MAX < SIZE_MAX |
| + if (len > ULONG_MAX) { |
| + p11_message (_("failed to obtain modulus")); |
| + goto cleanup; |
| + } |
| +#endif |
| + attr_modulus.ulValueLen = len; |
| |
| - attr_exponent.pValue = p11_asn1_read (asn, "publicExponent", &attr_exponent.ulValueLen); |
| + attr_exponent.pValue = p11_asn1_read (asn, "publicExponent", &len); |
| if (attr_exponent.pValue == NULL) { |
| p11_message (_("failed to obtain exponent")); |
| goto cleanup; |
| } |
| +#if ULONG_MAX < SIZE_MAX |
| + if (len > ULONG_MAX) { |
| + p11_message (_("failed to obtain exponent")); |
| + goto cleanup; |
| + } |
| +#endif |
| + attr_exponent.ulValueLen = len; |
| |
| result = p11_attrs_build (attrs, &attr_key_type, &attr_encrypt, &attr_modulus, &attr_exponent, NULL); |
| if (result == NULL) { |
| @@ -260,12 +276,20 @@ add_attrs_pubkey_ec (CK_ATTRIBUTE *attrs, |
| CK_ATTRIBUTE attr_key_type = { CKA_KEY_TYPE, &key_type, sizeof (key_type) }; |
| CK_ATTRIBUTE attr_ec_params = { CKA_EC_PARAMS, }; |
| CK_ATTRIBUTE attr_ec_point = { CKA_EC_POINT, }; |
| + size_t len = 0; |
| |
| - attr_ec_params.pValue = p11_asn1_read (info, "algorithm.parameters", &attr_ec_params.ulValueLen); |
| + attr_ec_params.pValue = p11_asn1_read (info, "algorithm.parameters", &len); |
| if (attr_ec_params.pValue == NULL) { |
| p11_message (_("failed to obtain EC parameters")); |
| goto cleanup; |
| } |
| +#if ULONG_MAX < SIZE_MAX |
| + if (len > ULONG_MAX) { |
| + p11_message (_("failed to obtain EC parameters")); |
| + goto cleanup; |
| + } |
| +#endif |
| + attr_ec_params.ulValueLen = len; |
| |
| /* subjectPublicKey is read as BIT STRING value which contains |
| * EC point data. We need to DER encode this data as OCTET STRING. |