[Buildroot] [PATCH v3] package/opensc: new package

José Pekkarinen jose.pekkarinen at unikie.com
Tue Nov 30 13:16:06 UTC 2021


Hi,

Any comments in this patch?

Thanks!

José.


On Thu, Nov 25, 2021 at 9:23 AM José Pekkarinen <jose.pekkarinen at unikie.com>
wrote:

> The patch will add a basic opensc package to build
> on buildroot.
>
> Signed-off-by: José Pekkarinen <jose.pekkarinen at unikie.com>
> ---
> [v1 -> v2] Addressed multiple comments from former rev
> [v2 -> v3] Fixed warning of missing signed off patch
>
>  DEVELOPERS                                    |   1 +
>  package/Config.in                             |   1 +
>  ...ckage-opensc-fix-maybe-uninitialized.patch |  69 +++++++++
>  ...x-strict-aliasing-warnings-as-errors.patch | 132 ++++++++++++++++++
>  package/opensc/Config.in                      |  11 ++
>  package/opensc/opensc.hash                    |   5 +
>  package/opensc/opensc.mk                      |  14 ++
>  7 files changed, 233 insertions(+)
>  create mode 100644
> package/opensc/0001-package-opensc-fix-maybe-uninitialized.patch
>  create mode 100644
> package/opensc/0002-package-opensc-fix-strict-aliasing-warnings-as-errors.patch
>  create mode 100644 package/opensc/Config.in
>  create mode 100644 package/opensc/opensc.hash
>  create mode 100644 package/opensc/opensc.mk
>
> diff --git a/DEVELOPERS b/DEVELOPERS
> index 70262eac8c..d92c38f07d 100644
> --- a/DEVELOPERS
> +++ b/DEVELOPERS
> @@ -1455,6 +1455,7 @@ F:        support/testing/tests/package/test_zfs.py
>
>  N:     José Pekkarinen <jose.pekkarinen at unikie.com>
>  F:     package/softhsm2/
> +F:     package/opensc/
>
>  N:     Joseph Kogut <joseph.kogut at gmail.com>
>  F:     package/at-spi2-atk/
> diff --git a/package/Config.in b/package/Config.in
> index e355ab1987..3cfcf372f3 100644
> --- a/package/Config.in
> +++ b/package/Config.in
> @@ -1617,6 +1617,7 @@ menu "Hardware handling"
>         source "package/tslib/Config.in"
>         source "package/uhd/Config.in"
>         source "package/urg/Config.in"
> +       source "package/opensc/Config.in"
>  endmenu
>
>  menu "Javascript"
> diff --git
> a/package/opensc/0001-package-opensc-fix-maybe-uninitialized.patch
> b/package/opensc/0001-package-opensc-fix-maybe-uninitialized.patch
> new file mode 100644
> index 0000000000..1f6a2e6f42
> --- /dev/null
> +++ b/package/opensc/0001-package-opensc-fix-maybe-uninitialized.patch
> @@ -0,0 +1,69 @@
> +package:opensc: Fix maybe uninitialized issues
> +
> +This patch will fix some warning treated as errors
> +that highlight maybe uninitialized variables.
> +
> +Signed-off-by: José Pekkarinen <jose.pekkarinen at unikie.com>
> +Index: opensc-0.22.0/src/pkcs15init/pkcs15-asepcos.c
> +===================================================================
> +--- opensc-0.22.0.orig/src/pkcs15init/pkcs15-asepcos.c
> ++++ opensc-0.22.0/src/pkcs15init/pkcs15-asepcos.c
> +@@ -221,7 +221,7 @@ static int asepcos_do_store_pin(sc_profi
> + {
> +       sc_file_t *nfile = NULL;
> +       u8  buf[64], sbuf[64], *p = buf, *q = sbuf;
> +-      int r, akn;
> ++      int r, akn = 0;
> +
> +       if (auth_info->auth_type != SC_PKCS15_PIN_AUTH_TYPE_PIN)
> +               return SC_ERROR_OBJECT_NOT_VALID;
> +Index: opensc-0.22.0/src/libopensc/pkcs15-coolkey.c
> +===================================================================
> +--- opensc-0.22.0.orig/src/libopensc/pkcs15-coolkey.c
> ++++ opensc-0.22.0/src/libopensc/pkcs15-coolkey.c
> +@@ -147,9 +147,9 @@ coolkey_find_matching_cert(sc_card_t *ca
> + static int
> + coolkey_get_attribute_ulong(sc_card_t *card, sc_cardctl_coolkey_object_t
> *obj, CK_ATTRIBUTE_TYPE type, CK_ULONG *value)
> + {
> +-      const u8 *val;
> +-      size_t val_len;
> +-      u8 data_type;
> ++      const u8 *val = malloc(sizeof(u8));
> ++      size_t val_len = 0;
> ++      u8 data_type = 0;
> +       int r;
> +
> +       r  = coolkey_get_attribute(card, obj, type, &val, &val_len,
> &data_type);
> +@@ -168,8 +168,8 @@ static int
> + coolkey_get_attribute_boolean(sc_card_t *card,
> sc_cardctl_coolkey_object_t *obj, CK_ATTRIBUTE_TYPE attr_type)
> + {
> +       int r;
> +-      const u8 *val;
> +-      size_t val_len;
> ++      const u8 *val = malloc(sizeof(u8));
> ++      size_t val_len = 0;
> +
> +       r = coolkey_get_attribute(card, obj, attr_type, &val, &val_len,
> NULL);
> +       if (r < 0) {
> +@@ -186,7 +186,7 @@ static int
> + coolkey_get_attribute_bytes(sc_card_t *card, sc_cardctl_coolkey_object_t
> *obj, CK_ATTRIBUTE_TYPE type, u8 *data, size_t *data_len, size_t
> max_data_len)
> + {
> +       const u8 *val;
> +-      size_t val_len;
> ++      size_t val_len = 0;
> +       int r;
> +
> +       r = coolkey_get_attribute(card, obj, type, &val, &val_len, NULL);
> +Index: opensc-0.22.0/src/tools/opensc-explorer.c
> +===================================================================
> +--- opensc-0.22.0.orig/src/tools/opensc-explorer.c
> ++++ opensc-0.22.0/src/tools/opensc-explorer.c
> +@@ -2472,7 +2472,7 @@ int main(int argc, char *argv[])
> +               char *line;
> +               int cargc;
> +               char *cargv[260];
> +-              int multiple;
> ++              int multiple = 0;
> +               struct command *cmd;
> +               char prompt[3*SC_MAX_PATH_STRING_SIZE];
> +
> diff --git
> a/package/opensc/0002-package-opensc-fix-strict-aliasing-warnings-as-errors.patch
> b/package/opensc/0002-package-opensc-fix-strict-aliasing-warnings-as-errors.patch
> new file mode 100644
> index 0000000000..e66fc21657
> --- /dev/null
> +++
> b/package/opensc/0002-package-opensc-fix-strict-aliasing-warnings-as-errors.patch
> @@ -0,0 +1,132 @@
> +Index: opensc-0.22.0/src/libopensc/card-gids.c
> +===================================================================
> +--- opensc-0.22.0.orig/src/libopensc/card-gids.c
> ++++ opensc-0.22.0/src/libopensc/card-gids.c
> +@@ -691,7 +691,8 @@ static int gids_finish(sc_card_t *card)
> + // the cmap file is used to detect the key algorithm / size
> + static int gids_get_crypto_identifier_from_key_ref(sc_card_t *card,
> const unsigned char keyref, unsigned char *cryptoidentifier) {
> +       struct gids_private_data *data = (struct gids_private_data *)
> card->drv_data;
> +-      PCONTAINER_MAP_RECORD records = (PCONTAINER_MAP_RECORD)
> data->cmapfile;
> ++      PCONTAINER_MAP_RECORD records =
> malloc(sizeof(CONTAINER_MAP_RECORD));
> ++      memcpy(records, data->cmapfile, sizeof(CONTAINER_MAP_RECORD));
> +       int recordsnum = (int) (data->cmapfilesize /
> sizeof(CONTAINER_MAP_RECORD));
> +       int index = keyref - GIDS_FIRST_KEY_IDENTIFIER;
> +       if (index >= recordsnum) {
> +@@ -1112,10 +1113,10 @@ gids_get_all_containers(sc_card_t* card,
> + // return the detail about a container to emulate a pkcs15 card
> + static int
> + gids_get_container_detail(sc_card_t* card,
> sc_cardctl_gids_get_container_t* container) {
> +-      PCONTAINER_MAP_RECORD records = NULL;
> ++      PCONTAINER_MAP_RECORD records =
> malloc(sizeof(CONTAINER_MAP_RECORD));
> +       struct gids_private_data *privatedata = (struct gids_private_data
> *) card->drv_data;
> +       size_t recordsnum, num, i;
> +-      records = (PCONTAINER_MAP_RECORD) privatedata ->cmapfile;
> ++      memcpy(records, privatedata->cmapfile,
> sizeof(CONTAINER_MAP_RECORD));
> +       recordsnum = (privatedata ->cmapfilesize /
> sizeof(CONTAINER_MAP_RECORD));
> +
> +       num = container->containernum ;
> +@@ -1158,7 +1159,8 @@ gids_get_container_detail(sc_card_t* car
> + static int
> + gids_select_key_reference(sc_card_t *card, sc_pkcs15_prkey_info_t*
> key_info) {
> +       struct gids_private_data *data = (struct gids_private_data *)
> card->drv_data;
> +-      PCONTAINER_MAP_RECORD records = (PCONTAINER_MAP_RECORD)
> data->cmapfile;
> ++      PCONTAINER_MAP_RECORD records =
> malloc(sizeof(CONTAINER_MAP_RECORD));
> ++      memcpy(records, data->cmapfile, sizeof(CONTAINER_MAP_RECORD));
> +       size_t recordsnum;
> +       int r;
> +       char ch_tmp[10];
> +@@ -1302,7 +1304,8 @@ static int gids_create_keyfile(sc_card_t
> +       struct gids_private_data *data = (struct gids_private_data *)
> card->drv_data;
> +       size_t recordnum;
> +       size_t containernum = key_info->key_reference -
> GIDS_FIRST_KEY_IDENTIFIER;
> +-      PCONTAINER_MAP_RECORD records = ((PCONTAINER_MAP_RECORD)
> cmapbuffer) + containernum;
> ++      PCONTAINER_MAP_RECORD records =
> malloc(sizeof(CONTAINER_MAP_RECORD));
> ++      memcpy(records, cmapbuffer + containernum,
> sizeof(CONTAINER_MAP_RECORD));
> +       struct gids_keymap_record* keymaprecord = NULL;
> +       int i;
> +
> +@@ -1390,12 +1393,12 @@ static int gids_create_keyfile(sc_card_t
> +
> +       // convert char to wchar
> +       for(i = 0; i < MAX_CONTAINER_NAME_LEN && object->label[i]; i++) {
> +-              records->wszGuid[i] = object->label[i];
> ++              records->wszGuid[i] = (unsigned short) object->label[i];
> +       }
> +
> +       // TODO: check if a container with the same name already exists
> and prevent is creation or change its name
> +
> +-      records->bFlags = CONTAINER_MAP_VALID_CONTAINER;
> ++      records->bFlags = (unsigned char) CONTAINER_MAP_VALID_CONTAINER;
> +       if (recordnum == 0) {
> +               records->bFlags |= CONTAINER_MAP_DEFAULT_CONTAINER;
> +       }
> +@@ -1638,7 +1641,8 @@ static int gids_delete_container_num(sc_
> +       size_t keymaprecordnum = 0;
> +       struct gids_private_data *data = (struct gids_private_data *)
> card->drv_data;
> +       size_t recordnum;
> +-      PCONTAINER_MAP_RECORD records = ((PCONTAINER_MAP_RECORD)
> cmapbuffer) + containernum;
> ++      PCONTAINER_MAP_RECORD records =
> malloc(sizeof(CONTAINER_MAP_RECORD));
> ++      memcpy(records, cmapbuffer + containernum,
> sizeof(CONTAINER_MAP_RECORD));
> +       struct gids_keymap_record* keymaprecord = NULL;
> +
> +       SC_FUNC_CALLED(card->ctx, SC_LOG_DEBUG_VERBOSE);
> +Index: opensc-0.22.0/src/libopensc/card-gpk.c
> +===================================================================
> +--- opensc-0.22.0.orig/src/libopensc/card-gpk.c
> ++++ opensc-0.22.0/src/libopensc/card-gpk.c
> +@@ -228,11 +228,12 @@ static int
> + match_path(sc_card_t *card, unsigned short int **pathptr, size_t
> *pathlen,
> +               int need_info)
> + {
> +-      unsigned short int      *curptr, *ptr;
> ++      u8                      *curptr;
> ++      unsigned short int      *ptr;
> +       size_t          curlen, len;
> +       size_t          i;
> +
> +-      curptr = (unsigned short int *) card->cache.current_path.value;
> ++      curptr = (u8 *) card->cache.current_path.value;
> +       curlen = card->cache.current_path.len;
> +       ptr    = *pathptr;
> +       len    = *pathlen;
> +@@ -242,7 +243,7 @@ match_path(sc_card_t *card, unsigned sho
> +
> +       /* Make sure path starts with MF.
> +        * Note the cached path should always begin with MF. */
> +-      if (ptr[0] != GPK_FID_MF || curptr[0] != GPK_FID_MF)
> ++      if (ptr[0] != (GPK_FID_MF >> 8) || curptr[0] != (GPK_FID_MF >> 8))
> +               return 0;
> +
> +       for (i = 1; i < len && i < curlen; i++) {
> +@@ -545,7 +546,7 @@ gpk_select_id(sc_card_t *card, int kind,
> +       /* Fix up the path cache.
> +        * NB we never cache the ID of an EF, just the DF path */
> +       if (r == 0) {
> +-              unsigned short int      *path;
> ++              u8      *path;
> +
> +               switch (kind) {
> +               case GPK_SEL_MF:
> +@@ -555,7 +556,7 @@ gpk_select_id(sc_card_t *card, int kind,
> +                       if (cp->len + 1 > SC_MAX_PATH_SIZE / 2) {
> +                               return SC_ERROR_INTERNAL;
> +                       }
> +-                      path = (unsigned short int *) cp->value;
> ++                      path = (u8 *) cp->value;
> +                       path[cp->len++] = fid;
> +               }
> +       } else {
> +Index: opensc-0.22.0/src/tools/gids-tool.c
> +===================================================================
> +--- opensc-0.22.0.orig/src/tools/gids-tool.c
> ++++ opensc-0.22.0/src/tools/gids-tool.c
> +@@ -401,7 +401,8 @@ static int print_info(sc_card_t *card) {
> +               if (cmapfilesize == sizeof(cmapfile)) {
> +                       printf("Unable to find the container file
> (mscp\\cmapfile)\n");
> +               } else {
> +-                      PCONTAINER_MAP_RECORD cmaprecords =
> (PCONTAINER_MAP_RECORD) cmapfile;
> ++                      PCONTAINER_MAP_RECORD cmaprecords =
> malloc(sizeof(CONTAINER_MAP_RECORD));
> ++                      memcpy(cmaprecords, cmapfile,
> sizeof(CONTAINER_MAP_RECORD));
> +                       int cmaprecordnum = (cmapfilesize /
> sizeof(CONTAINER_MAP_RECORD));
> +                       int keymaprecordnum = -1;
> +                       struct gids_keymap_record* keymaprecord = ((struct
> gids_keymap_record*)(keymap +1));
> diff --git a/package/opensc/Config.in b/package/opensc/Config.in
> new file mode 100644
> index 0000000000..d6b137a87f
> --- /dev/null
> +++ b/package/opensc/Config.in
> @@ -0,0 +1,11 @@
> +config BR2_PACKAGE_OPENSC
> +       bool "opensc"
> +       depends on !BR2_STATIC_LIBS # dlopen()
> +       select BR2_PACKAGE_PCSC_LITE
> +       select BR2_PACKAGE_OPENSSL
> +       select BR2_PACKAGE_OPENSSL_FORCE_LIBOPENSSL
> +       help
> +         OpenSC provides a set of libraries and utilities to work
> +         with smart cards.
> +
> +         https://github.com/OpenSC/OpenSC/wiki
> diff --git a/package/opensc/opensc.hash b/package/opensc/opensc.hash
> new file mode 100644
> index 0000000000..1e3472ba2a
> --- /dev/null
> +++ b/package/opensc/opensc.hash
> @@ -0,0 +1,5 @@
> +# From https://https://github.com/OpenSC/OpenSC/releases/
> +sha256  8d4e5347195ebea332be585df61dcc470331c26969e4b0447c851fb0844c7186
> opensc-0.22.0.tar.gz
> +
> +# Computed locally
> +sha256  376b54d4c5f4aa99421823fa4da93e3ab73096fce2400e89858632aa7da24a14
> COPYING
> diff --git a/package/opensc/opensc.mk b/package/opensc/opensc.mk
> new file mode 100644
> index 0000000000..7221eee944
> --- /dev/null
> +++ b/package/opensc/opensc.mk
> @@ -0,0 +1,14 @@
>
> +################################################################################
> +#
> +# opensc
> +#
>
> +################################################################################
> +
> +OPENSC_VERSION = 0.22.0
> +OPENSC_SITE =
> https://github.com/OpenSC/OpenSC/releases/download/$(OPENSC_VERSION)
> +OPENSC_LICENSE = LGPL-2.1+
> +OPENSC_LICENSE_FILES = COPYING
> +OPENSC_DEPENDENCIES = openssl pcsc-lite
> +OPENSC_INSTALL_STAGING = YES
> +
> +$(eval $(autotools-package))
> --
> 2.30.2
>
>

-- 

José.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.buildroot.org/pipermail/buildroot/attachments/20211130/62ed4bf4/attachment.html>


More information about the buildroot mailing list