Oh please disregard this, I've managed to send the wrong patch.

ti 15. kesäk. 2021 klo 13.42 Lev Stipakov (lstipa...@gmail.com) kirjoitti:
>
> From: Lev Stipakov <l...@openvpn.net>
>
> pkcs11-helper is a dependency library used by OpenVPN.
> So far it has been built only by mingw.
>
> Since we're making MSVC build system a first class citizen,
> we need to build depencencies with MSVC, which we do with vcpkg.
> All dependencies are in vcpkg official repo, expect pkcs11-helper.
>
> This provides vcpkg port for building pkcs11-helper.
>
> Example usage:
>
>  vcpkg --overlay-ports=<openvpn>\contrib\vcpkg-ports install pkcs11-helper
>
> Signed-off-by: Lev Stipakov <l...@openvpn.net>
> ---
>
>  v3:
>    - use correct OPENSSL_HOME (remove -windows suffix)
>    - remove deprecated "include(vcpkg_common_functions)"
>
>  v2:
>    - add missing dll installation commands to port file
>
>  .../0001-nmake-openssl-1.1.1-support.patch    |  89 +++
>  contrib/vcpkg-ports/pkcs11-helper/CONTROL     |   4 +
>  .../pkcs11-helper-001-RFC7512.patch           | 686 ++++++++++++++++++
>  .../vcpkg-ports/pkcs11-helper/portfile.cmake  |  35 +
>  4 files changed, 814 insertions(+)
>  create mode 100644 
> contrib/vcpkg-ports/pkcs11-helper/0001-nmake-openssl-1.1.1-support.patch
>  create mode 100644 contrib/vcpkg-ports/pkcs11-helper/CONTROL
>  create mode 100644 
> contrib/vcpkg-ports/pkcs11-helper/pkcs11-helper-001-RFC7512.patch
>  create mode 100644 contrib/vcpkg-ports/pkcs11-helper/portfile.cmake
>
> diff --git 
> a/contrib/vcpkg-ports/pkcs11-helper/0001-nmake-openssl-1.1.1-support.patch 
> b/contrib/vcpkg-ports/pkcs11-helper/0001-nmake-openssl-1.1.1-support.patch
> new file mode 100644
> index 00000000..8a6750b9
> --- /dev/null
> +++ b/contrib/vcpkg-ports/pkcs11-helper/0001-nmake-openssl-1.1.1-support.patch
> @@ -0,0 +1,89 @@
> +From 324026ce179468fcea348e59259dbc5456438ead Mon Sep 17 00:00:00 2001
> +From: Lev Stipakov <l...@openvpn.net>
> +Date: Fri, 14 May 2021 14:35:53 +0300
> +Subject: [PATCH] nmake: openssl 1.1.1 support
> +
> +Starting from version 1.1.1, OpenSSL includes routines
> +like RSA_meth_xxx and DSA_meth_xxx. pkcs11-helper includes
> +implementation of those routines. That code is compiled if
> +they're missing from OpenSSL.
> +
> +nmake build uses pre-generated config-w32-vc.h, which lacks
> +defines which indicate that OpenSSL includes above routines,
> +which causes pkcs11's own implementaion to be compiled. However,
> +pkcs11-helper implementation is not compatible with OpenSSL 1.1.1 -
> +for example, it takes size of opaque struct RSA_METHOD, which
> +has become internal in OpenSSL.
> +
> +This adds necessary defines to config header used by nmake build
> +so that pkcs11-helper code, which is not compatible with OpenSSL 1.1.1,
> +is not compiled.
> +
> +Also libeay is changed to libcrypto.
> +
> +Signed-off-by: Lev Stipakov <l...@openvpn.net>
> +---
> + config-w32-vc.h.in  | 33 +++++++++++++++++++++++++++++++++
> + lib/Makefile.w32-vc |  4 ++--
> + 2 files changed, 35 insertions(+), 2 deletions(-)
> +
> +diff --git a/config-w32-vc.h b/config-w32-vc.h
> +index 6346f02..102b2e3 100644
> +--- a/config-w32-vc.h
> ++++ b/config-w32-vc.h
> +@@ -185,3 +185,36 @@
> + #if _MSC_VER >= 1400
> + #define HAVE_CPP_VARARG_MACRO_ISO 1
> + #endif
> ++
> ++/* Define to 1 if you have the `RSA_meth_dup' function. */
> ++#define HAVE_RSA_METH_DUP 1
> ++
> ++/* Define to 1 if you have the `RSA_meth_free' function. */
> ++#define HAVE_RSA_METH_FREE 1
> ++
> ++/* Define to 1 if you have the `RSA_meth_set1_name' function. */
> ++#define HAVE_RSA_METH_SET1_NAME 1
> ++
> ++/* Define to 1 if you have the `RSA_meth_set_flags' function. */
> ++#define HAVE_RSA_METH_SET_FLAGS 1
> ++
> ++/* Define to 1 if you have the `RSA_meth_set_priv_dec' function. */
> ++#define HAVE_RSA_METH_SET_PRIV_DEC 1
> ++
> ++/* Define to 1 if you have the `RSA_meth_set_priv_enc' function. */
> ++#define HAVE_RSA_METH_SET_PRIV_ENC 1
> ++
> ++/* Define to 1 if you have the `DSA_meth_dup' function. */
> ++#define HAVE_DSA_METH_DUP 1
> ++
> ++/* Define to 1 if you have the `DSA_meth_free' function. */
> ++#define HAVE_DSA_METH_FREE 1
> ++
> ++/* Define to 1 if you have the `DSA_meth_set1_name' function. */
> ++#define HAVE_DSA_METH_SET1_NAME 1
> ++
> ++/* Define to 1 if you have the `DSA_meth_set_sign' function. */
> ++#define HAVE_DSA_METH_SET_SIGN 1
> ++
> ++/* Define to 1 if you have the `DSA_SIG_set0' function. */
> ++#define HAVE_DSA_SIG_SET0 1
> +diff --git a/lib/Makefile.w32-vc b/lib/Makefile.w32-vc
> +index 2edab39..b2ac746 100644
> +--- a/lib/Makefile.w32-vc
> ++++ b/lib/Makefile.w32-vc
> +@@ -60,9 +60,9 @@ OPENSSL_HOME = ..\..\openssl-0.9.8a
> + !endif
> +
> + !ifdef OPENSSL
> +-OPENSSL_STATIC = libeay32.lib
> ++OPENSSL_STATIC = libcrypto.lib
> + #OPENSSL_STATIC = libeay32sd.lib
> +-OPENSSL_DYNAMIC = libeay32.lib
> ++OPENSSL_DYNAMIC = libcrypto.lib
> + #OPENSSL_DYNAMIC = libeay32d.lib
> +
> + OPENSSL_INC=$(OPENSSL_HOME)\include
> +--
> +2.23.0.windows.1
> +
> diff --git a/contrib/vcpkg-ports/pkcs11-helper/CONTROL 
> b/contrib/vcpkg-ports/pkcs11-helper/CONTROL
> new file mode 100644
> index 00000000..01831802
> --- /dev/null
> +++ b/contrib/vcpkg-ports/pkcs11-helper/CONTROL
> @@ -0,0 +1,4 @@
> +Source: pkcs11-helper
> +Version: 1.27-1
> +Homepage: https://github.com/OpenSC/pkcs11-helper
> +Description: pkcs11-helper is a library that simplifies the interaction with 
> PKCS#11 providers for end-user applications.
> diff --git 
> a/contrib/vcpkg-ports/pkcs11-helper/pkcs11-helper-001-RFC7512.patch 
> b/contrib/vcpkg-ports/pkcs11-helper/pkcs11-helper-001-RFC7512.patch
> new file mode 100644
> index 00000000..84fba080
> --- /dev/null
> +++ b/contrib/vcpkg-ports/pkcs11-helper/pkcs11-helper-001-RFC7512.patch
> @@ -0,0 +1,686 @@
> +commit 90590b02085edc3830bdfe0942a46c4e7bf3f1ab (HEAD -> master)
> +Author: David Woodhouse <david.woodho...@intel.com>
> +Date:   Thu Apr 30 14:58:24 2015 +0100
> +
> +    Serialize to RFC7512-compliant PKCS#11 URIs
> +
> +    Signed-off-by: David Woodhouse <david.woodho...@intel.com>
> +
> +commit 4d5280da8df591aab701dff4493d13a835a9b29c
> +Author: David Woodhouse <david.woodho...@intel.com>
> +Date:   Wed Dec 10 14:00:21 2014 +0000
> +
> +    Accept RFC7512-compliant PKCS#11 URIs as serialized token/certificate IDs
> +
> +    The old format is still accepted for compatibility.
> +
> +    Signed-off-by: David Woodhouse <david.woodho...@intel.com>
> +
> +commit 14e09211c3d50eb06825090c9765e4382cf52f19
> +Author: David Woodhouse <david.woodho...@intel.com>
> +Date:   Sun Dec 14 19:42:18 2014 +0000
> +
> +    Stop _pkcs11h_util_hexToBinary() checking for trailing NUL
> +
> +    We are going to want to use this for parsing %XX hex escapes in RFC7512
> +    PKCS#11 URIs, where we cannot expect a trailing NUL. Since there's only
> +    one existing caller at the moment, it's simple just to let the caller
> +    have responsibility for that check.
> +
> +    Signed-off-by: David Woodhouse <david.woodho...@intel.com>
> +diff --git a/lib/pkcs11h-serialization.c b/lib/pkcs11h-serialization.c
> +index ad275f8..1d077e4 100644
> +--- a/lib/pkcs11h-serialization.c
> ++++ b/lib/pkcs11h-serialization.c
> +@@ -61,29 +61,127 @@
> +
> + #if defined(ENABLE_PKCS11H_TOKEN) || defined(ENABLE_PKCS11H_CERTIFICATE)
> +
> ++#define URI_SCHEME "pkcs11:"
> ++
> ++#define token_field_ofs(field) ((unsigned long)&(((struct 
> pkcs11h_token_id_s *)0)->field))
> ++#define token_field_size(field) sizeof((((struct pkcs11h_token_id_s 
> *)0)->field))
> ++#define token_field(name, field) { name "=", sizeof(name), \
> ++                                 token_field_ofs(field), 
> token_field_size(field) }
> ++
> ++static struct {
> ++      const char const *name;
> ++      size_t namelen;
> ++      unsigned long field_ofs;
> ++      size_t field_size;
> ++} __token_fields[] = {
> ++      token_field ("model", model),
> ++      token_field ("token", label),
> ++      token_field ("manufacturer", manufacturerID ),
> ++      token_field ("serial", serialNumber ),
> ++      { NULL },
> ++};
> ++
> ++#define               P11_URL_VERBATIM      "abcdefghijklmnopqrstuvwxyz" \
> ++                                            "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
> ++                                            "0123456789_-."
> ++
> ++static
> ++int
> ++__token_attr_escape(char *uri, char *attr, size_t attrlen)
> ++{
> ++      int len = 0, i;
> ++
> ++      for (i = 0; i < attrlen; i++) {
> ++              if ((attr[i] != '\x0') && strchr(P11_URL_VERBATIM, attr[i])) {
> ++                      if (uri) {
> ++                              *(uri++) = attr[i];
> ++                      }
> ++                      len++;
> ++              } else {
> ++                      if (uri) {
> ++                              sprintf(uri, "%%%02x", (unsigned 
> char)attr[i]);
> ++                              uri += 3;
> ++                      }
> ++                      len += 3;
> ++              }
> ++      }
> ++      return len;
> ++}
> ++
> ++static
> ++CK_RV
> ++__generate_pkcs11_uri (
> ++      OUT char * const sz,
> ++      IN OUT size_t *max,
> ++      IN const pkcs11h_certificate_id_t certificate_id,
> ++      IN const pkcs11h_token_id_t token_id
> ++) {
> ++      size_t _max;
> ++      char *p = sz;
> ++      int i;
> ++
> ++      _PKCS11H_ASSERT (max!=NULL);
> ++      _PKCS11H_ASSERT (token_id!=NULL);
> ++
> ++      _max = strlen(URI_SCHEME);
> ++      for (i = 0; __token_fields[i].name; i++) {
> ++              char *field = ((char *)token_id) + 
> __token_fields[i].field_ofs;
> ++
> ++              _max += __token_fields[i].namelen;
> ++              _max += __token_attr_escape (NULL, field, strlen(field));
> ++              _max++; /* For a semicolon or trailing NUL */
> ++      }
> ++      if (certificate_id) {
> ++              _max += strlen (";id=");
> ++              _max += __token_attr_escape (NULL,
> ++                                           (char 
> *)certificate_id->attrCKA_ID,
> ++                                           certificate_id->attrCKA_ID_size);
> ++      }
> ++
> ++      if (!sz) {
> ++              *max = _max;
> ++              return CKR_OK;
> ++      }
> ++
> ++      if (sz && *max < _max)
> ++              return CKR_ATTRIBUTE_VALUE_INVALID;
> ++
> ++      p += sprintf(p, URI_SCHEME);
> ++      for (i = 0; __token_fields[i].name; i++) {
> ++              char *field = ((char *)token_id) + 
> __token_fields[i].field_ofs;
> ++
> ++              p += sprintf (p, "%s", __token_fields[i].name);
> ++              p += __token_attr_escape (p, field, strlen(field));
> ++              *(p++) = ';';
> ++      }
> ++      if (certificate_id) {
> ++              p += sprintf (p, "id=");
> ++              p += __token_attr_escape (p,
> ++                                        (char *)certificate_id->attrCKA_ID,
> ++                                        certificate_id->attrCKA_ID_size);
> ++      } else {
> ++              /* Remove the unneeded trailing semicolon */
> ++              p--;
> ++      }
> ++      *(p++) = 0;
> ++
> ++      *max = _max;
> ++
> ++      return CKR_OK;
> ++}
> ++
> + CK_RV
> + pkcs11h_token_serializeTokenId (
> +       OUT char * const sz,
> +       IN OUT size_t *max,
> +       IN const pkcs11h_token_id_t token_id
> + ) {
> +-      const char *sources[5];
> +       CK_RV rv = CKR_FUNCTION_FAILED;
> +-      size_t n;
> +-      int e;
> +
> +       /*_PKCS11H_ASSERT (sz!=NULL); Not required*/
> +       _PKCS11H_ASSERT (max!=NULL);
> +       _PKCS11H_ASSERT (token_id!=NULL);
> +
> +-      { /* Must be after assert */
> +-              sources[0] = token_id->manufacturerID;
> +-              sources[1] = token_id->model;
> +-              sources[2] = token_id->serialNumber;
> +-              sources[3] = token_id->label;
> +-              sources[4] = NULL;
> +-      }
> +-
> +       _PKCS11H_DEBUG (
> +               PKCS11H_LOG_DEBUG2,
> +               "PKCS#11: pkcs11h_token_serializeTokenId entry sz=%p, 
> *max="P_Z", token_id=%p",
> +@@ -92,67 +190,161 @@ pkcs11h_token_serializeTokenId (
> +               (void *)token_id
> +       );
> +
> +-      n = 0;
> +-      for (e=0;sources[e] != NULL;e++) {
> +-              size_t t;
> +-              if (
> +-                      (rv = _pkcs11h_util_escapeString (
> +-                              NULL,
> +-                              sources[e],
> +-                              &t,
> +-                              __PKCS11H_SERIALIZE_INVALID_CHARS
> +-                      )) != CKR_OK
> +-              ) {
> +-                      goto cleanup;
> ++      rv = __generate_pkcs11_uri(sz, max, NULL, token_id);
> ++
> ++      _PKCS11H_DEBUG (
> ++              PKCS11H_LOG_DEBUG2,
> ++              "PKCS#11: pkcs11h_token_serializeTokenId return rv=%lu-'%s', 
> *max="P_Z", sz='%s'",
> ++              rv,
> ++              pkcs11h_getMessage (rv),
> ++              *max,
> ++              sz
> ++      );
> ++
> ++      return rv;
> ++}
> ++
> ++static
> ++CK_RV
> ++__parse_token_uri_attr (
> ++      const char *uri,
> ++      size_t urilen,
> ++      char *tokstr,
> ++      size_t toklen,
> ++      size_t *parsed_len
> ++) {
> ++      size_t orig_toklen = toklen;
> ++      CK_RV rv = CKR_OK;
> ++
> ++      while (urilen && toklen > 1) {
> ++              if (*uri == '%') {
> ++                      size_t size = 1;
> ++
> ++                      if (urilen < 3) {
> ++                              rv = CKR_ATTRIBUTE_VALUE_INVALID;
> ++                              goto done;
> ++                      }
> ++
> ++                      rv = _pkcs11h_util_hexToBinary ((unsigned char 
> *)tokstr,
> ++                                                      uri + 1, &size);
> ++                      if (rv != CKR_OK) {
> ++                              goto done;
> ++                      }
> ++
> ++                      uri += 2;
> ++                      urilen -= 2;
> ++              } else {
> ++                      *tokstr = *uri;
> +               }
> +-              n+=t;
> ++              tokstr++;
> ++              uri++;
> ++              toklen--;
> ++              urilen--;
> ++              tokstr[0] = 0;
> +       }
> +
> +-      if (sz != NULL) {
> +-              if (*max < n) {
> +-                      rv = CKR_ATTRIBUTE_VALUE_INVALID;
> +-                      goto cleanup;
> ++      if (urilen) {
> ++              rv = CKR_ATTRIBUTE_VALUE_INVALID;
> ++      } else if (parsed_len) {
> ++              *parsed_len = orig_toklen - toklen;
> ++      }
> ++
> ++ done:
> ++      return rv;
> ++}
> ++
> ++static
> ++CK_RV
> ++__parse_pkcs11_uri (
> ++      OUT pkcs11h_token_id_t token_id,
> ++      OUT pkcs11h_certificate_id_t certificate_id,
> ++      IN const char * const sz
> ++) {
> ++      const char *end, *p;
> ++      CK_RV rv = CKR_OK;
> ++
> ++      _PKCS11H_ASSERT (token_id!=NULL);
> ++      _PKCS11H_ASSERT (sz!=NULL);
> ++
> ++      if (strncmp (sz, URI_SCHEME, strlen (URI_SCHEME)))
> ++              return CKR_ATTRIBUTE_VALUE_INVALID;
> ++
> ++      end = sz + strlen (URI_SCHEME) - 1;
> ++      while (rv == CKR_OK && end[0] && end[1]) {
> ++              int i;
> ++
> ++              p = end + 1;
> ++              end = strchr (p, ';');
> ++              if (!end)
> ++                      end = p + strlen(p);
> ++
> ++              for (i = 0; __token_fields[i].name; i++) {
> ++                      /* Parse the token=, label=, manufacturer= and 
> serial= fields */
> ++                      if (!strncmp(p, __token_fields[i].name, 
> __token_fields[i].namelen)) {
> ++                              char *field = ((char *)token_id) + 
> __token_fields[i].field_ofs;
> ++
> ++                              p += __token_fields[i].namelen;
> ++                              rv = __parse_token_uri_attr (p, end - p, 
> field,
> ++                                                           
> __token_fields[i].field_size,
> ++                                                           NULL);
> ++                              if (rv != CKR_OK) {
> ++                                      goto cleanup;
> ++                              }
> ++
> ++                              goto matched;
> ++                      }
> +               }
> ++              if (certificate_id && !strncmp(p, "id=", 3)) {
> ++                      p += 3;
> ++
> ++                      rv = _pkcs11h_mem_malloc ((void 
> *)&certificate_id->attrCKA_ID,
> ++                                                end - p + 1);
> ++                      if (rv != CKR_OK) {
> ++                              goto cleanup;
> ++                      }
> +
> +-              n = 0;
> +-              for (e=0;sources[e] != NULL;e++) {
> +-                      size_t t = *max-n;
> +-                      if (
> +-                              (rv = _pkcs11h_util_escapeString (
> +-                                      sz+n,
> +-                                      sources[e],
> +-                                      &t,
> +-                                      __PKCS11H_SERIALIZE_INVALID_CHARS
> +-                              )) != CKR_OK
> +-                      ) {
> ++                      rv = __parse_token_uri_attr (p, end - p,
> ++                                                   (char 
> *)certificate_id->attrCKA_ID,
> ++                                                   end - p + 1,
> ++                                                   
> &certificate_id->attrCKA_ID_size);
> ++                      if (rv != CKR_OK) {
> +                               goto cleanup;
> +                       }
> +-                      n+=t;
> +-                      sz[n-1] = '/';
> ++
> ++                      goto matched;
> +               }
> +-              sz[n-1] = '\x0';
> +-      }
> +
> +-      *max = n;
> +-      rv = CKR_OK;
> ++              /* We don't parse object= because the match code doesn't 
> support
> ++                 matching by label. */
> ++
> ++              /* Failed to parse PKCS#11 URI element. */
> ++              return CKR_ATTRIBUTE_VALUE_INVALID;
> +
> ++              matched:
> ++                  ;
> ++      }
> + cleanup:
> ++      /* The matching code doesn't support support partial matches; it needs
> ++       * *all* of manufacturer, model, serial and label attributes to be
> ++       * defined. So reject partial URIs early instead of letting it do the
> ++       * wrong thing. We can maybe improve this later. */
> ++      if (!token_id->model[0] || !token_id->label[0] ||
> ++          !token_id->manufacturerID[0] || !token_id->serialNumber[0]) {
> ++              return CKR_ATTRIBUTE_VALUE_INVALID;
> ++      }
> +
> +-      _PKCS11H_DEBUG (
> +-              PKCS11H_LOG_DEBUG2,
> +-              "PKCS#11: pkcs11h_token_serializeTokenId return rv=%lu-'%s', 
> *max="P_Z", sz='%s'",
> +-              rv,
> +-              pkcs11h_getMessage (rv),
> +-              *max,
> +-              sz
> +-      );
> ++      /* For a certificate ID we need CKA_ID */
> ++      if (certificate_id && !certificate_id->attrCKA_ID_size) {
> ++              return CKR_ATTRIBUTE_VALUE_INVALID;
> ++      }
> +
> +       return rv;
> + }
> +
> ++static
> + CK_RV
> +-pkcs11h_token_deserializeTokenId (
> +-      OUT pkcs11h_token_id_t *p_token_id,
> ++__pkcs11h_token_legacy_deserializeTokenId (
> ++      OUT pkcs11h_token_id_t token_id,
> +       IN const char * const sz
> + ) {
> + #define __PKCS11H_TARGETS_NUMBER 4
> +@@ -161,24 +353,11 @@ pkcs11h_token_deserializeTokenId (
> +               size_t s;
> +       } targets[__PKCS11H_TARGETS_NUMBER];
> +
> +-      pkcs11h_token_id_t token_id = NULL;
> +       char *p1 = NULL;
> +       char *_sz = NULL;
> +       int e;
> +       CK_RV rv = CKR_FUNCTION_FAILED;
> +
> +-      _PKCS11H_ASSERT (p_token_id!=NULL);
> +-      _PKCS11H_ASSERT (sz!=NULL);
> +-
> +-      _PKCS11H_DEBUG (
> +-              PKCS11H_LOG_DEBUG2,
> +-              "PKCS#11: pkcs11h_token_deserializeTokenId entry 
> p_token_id=%p, sz='%s'",
> +-              (void *)p_token_id,
> +-              sz
> +-      );
> +-
> +-      *p_token_id = NULL;
> +-
> +       if (
> +               (rv = _pkcs11h_mem_strdup (
> +                       (void *)&_sz,
> +@@ -190,10 +369,6 @@ pkcs11h_token_deserializeTokenId (
> +
> +       p1 = _sz;
> +
> +-      if ((rv = _pkcs11h_token_newTokenId (&token_id)) != CKR_OK) {
> +-              goto cleanup;
> +-      }
> +-
> +       targets[0].p = token_id->manufacturerID;
> +       targets[0].s = sizeof (token_id->manufacturerID);
> +       targets[1].p = token_id->model;
> +@@ -252,6 +427,51 @@ pkcs11h_token_deserializeTokenId (
> +               p1 = p2+1;
> +       }
> +
> ++      rv = CKR_OK;
> ++
> ++cleanup:
> ++
> ++      if (_sz != NULL) {
> ++              _pkcs11h_mem_free ((void *)&_sz);
> ++      }
> ++
> ++      return rv;
> ++#undef __PKCS11H_TARGETS_NUMBER
> ++}
> ++
> ++CK_RV
> ++pkcs11h_token_deserializeTokenId (
> ++      OUT pkcs11h_token_id_t *p_token_id,
> ++      IN const char * const sz
> ++) {
> ++      pkcs11h_token_id_t token_id = NULL;
> ++      CK_RV rv = CKR_FUNCTION_FAILED;
> ++
> ++      _PKCS11H_ASSERT (p_token_id!=NULL);
> ++      _PKCS11H_ASSERT (sz!=NULL);
> ++
> ++      _PKCS11H_DEBUG (
> ++              PKCS11H_LOG_DEBUG2,
> ++              "PKCS#11: pkcs11h_token_deserializeTokenId entry 
> p_token_id=%p, sz='%s'",
> ++              (void *)p_token_id,
> ++              sz
> ++      );
> ++
> ++      *p_token_id = NULL;
> ++
> ++      if ((rv = _pkcs11h_token_newTokenId (&token_id)) != CKR_OK) {
> ++              goto cleanup;
> ++      }
> ++
> ++      if (!strncmp (sz, URI_SCHEME, strlen (URI_SCHEME))) {
> ++              rv = __parse_pkcs11_uri(token_id, NULL, sz);
> ++      } else {
> ++              rv = __pkcs11h_token_legacy_deserializeTokenId(token_id, sz);
> ++      }
> ++      if (rv != CKR_OK) {
> ++              goto cleanup;
> ++      }
> ++
> +       strncpy (
> +               token_id->display,
> +               token_id->label,
> +@@ -264,11 +484,6 @@ pkcs11h_token_deserializeTokenId (
> +       rv = CKR_OK;
> +
> + cleanup:
> +-
> +-      if (_sz != NULL) {
> +-              _pkcs11h_mem_free ((void *)&_sz);
> +-      }
> +-
> +       if (token_id != NULL) {
> +               pkcs11h_token_freeTokenId (token_id);
> +       }
> +@@ -281,7 +496,6 @@ cleanup:
> +       );
> +
> +       return rv;
> +-#undef __PKCS11H_TARGETS_NUMBER
> + }
> +
> + #endif                                /* ENABLE_PKCS11H_TOKEN || 
> ENABLE_PKCS11H_CERTIFICATE */
> +@@ -295,9 +509,6 @@ pkcs11h_certificate_serializeCertificateId (
> +       IN const pkcs11h_certificate_id_t certificate_id
> + ) {
> +       CK_RV rv = CKR_FUNCTION_FAILED;
> +-      size_t saved_max = 0;
> +-      size_t n = 0;
> +-      size_t _max = 0;
> +
> +       /*_PKCS11H_ASSERT (sz!=NULL); Not required */
> +       _PKCS11H_ASSERT (max!=NULL);
> +@@ -311,42 +522,7 @@ pkcs11h_certificate_serializeCertificateId (
> +               (void *)certificate_id
> +       );
> +
> +-      if (sz != NULL) {
> +-              saved_max = n = *max;
> +-      }
> +-      *max = 0;
> +-
> +-      if (
> +-              (rv = pkcs11h_token_serializeTokenId (
> +-                      sz,
> +-                      &n,
> +-                      certificate_id->token_id
> +-              )) != CKR_OK
> +-      ) {
> +-              goto cleanup;
> +-      }
> +-
> +-      _max = n + certificate_id->attrCKA_ID_size*2 + 1;
> +-
> +-      if (sz != NULL) {
> +-              if (saved_max < _max) {
> +-                      rv = CKR_ATTRIBUTE_VALUE_INVALID;
> +-                      goto cleanup;
> +-              }
> +-
> +-              sz[n-1] = '/';
> +-              rv = _pkcs11h_util_binaryToHex (
> +-                      sz+n,
> +-                      saved_max-n,
> +-                      certificate_id->attrCKA_ID,
> +-                      certificate_id->attrCKA_ID_size
> +-              );
> +-      }
> +-
> +-      *max = _max;
> +-      rv = CKR_OK;
> +-
> +-cleanup:
> ++      rv = __generate_pkcs11_uri(sz, max, certificate_id, 
> certificate_id->token_id);
> +
> +       _PKCS11H_DEBUG (
> +               PKCS11H_LOG_DEBUG2,
> +@@ -360,27 +536,16 @@ cleanup:
> +       return rv;
> + }
> +
> ++static
> + CK_RV
> +-pkcs11h_certificate_deserializeCertificateId (
> +-      OUT pkcs11h_certificate_id_t * const p_certificate_id,
> ++__pkcs11h_certificate_legacy_deserializeCertificateId (
> ++      OUT pkcs11h_certificate_id_t certificate_id,
> +       IN const char * const sz
> + ) {
> +-      pkcs11h_certificate_id_t certificate_id = NULL;
> +       CK_RV rv = CKR_FUNCTION_FAILED;
> +       char *p = NULL;
> +       char *_sz = NULL;
> +-
> +-      _PKCS11H_ASSERT (p_certificate_id!=NULL);
> +-      _PKCS11H_ASSERT (sz!=NULL);
> +-
> +-      *p_certificate_id = NULL;
> +-
> +-      _PKCS11H_DEBUG (
> +-              PKCS11H_LOG_DEBUG2,
> +-              "PKCS#11: pkcs11h_certificate_deserializeCertificateId entry 
> p_certificate_id=%p, sz='%s'",
> +-              (void *)p_certificate_id,
> +-              sz
> +-      );
> ++      size_t id_hex_len;
> +
> +       if (
> +               (rv = _pkcs11h_mem_strdup (
> +@@ -393,10 +558,6 @@ pkcs11h_certificate_deserializeCertificateId (
> +
> +       p = _sz;
> +
> +-      if ((rv = _pkcs11h_certificate_newCertificateId (&certificate_id)) != 
> CKR_OK) {
> +-              goto cleanup;
> +-      }
> +-
> +       if ((p = strrchr (_sz, '/')) == NULL) {
> +               rv = CKR_ATTRIBUTE_VALUE_INVALID;
> +               goto cleanup;
> +@@ -414,7 +575,12 @@ pkcs11h_certificate_deserializeCertificateId (
> +               goto cleanup;
> +       }
> +
> +-      certificate_id->attrCKA_ID_size = strlen (p)/2;
> ++      id_hex_len = strlen (p);
> ++      if (id_hex_len & 1) {
> ++              rv = CKR_ATTRIBUTE_VALUE_INVALID;
> ++              goto cleanup;
> ++      }
> ++      certificate_id->attrCKA_ID_size = id_hex_len/2;
> +
> +       if (
> +               (rv = _pkcs11h_mem_malloc (
> +@@ -430,21 +596,64 @@ pkcs11h_certificate_deserializeCertificateId (
> +               goto cleanup;
> +       }
> +
> ++      rv = CKR_OK;
> ++
> ++cleanup:
> ++
> ++      if (_sz != NULL) {
> ++              _pkcs11h_mem_free ((void *)&_sz);
> ++      }
> ++
> ++      return rv;
> ++
> ++}
> ++
> ++CK_RV
> ++pkcs11h_certificate_deserializeCertificateId (
> ++      OUT pkcs11h_certificate_id_t * const p_certificate_id,
> ++      IN const char * const sz
> ++) {
> ++      pkcs11h_certificate_id_t certificate_id = NULL;
> ++      CK_RV rv = CKR_FUNCTION_FAILED;
> ++
> ++      _PKCS11H_ASSERT (p_certificate_id!=NULL);
> ++      _PKCS11H_ASSERT (sz!=NULL);
> ++
> ++      *p_certificate_id = NULL;
> ++
> ++      _PKCS11H_DEBUG (
> ++              PKCS11H_LOG_DEBUG2,
> ++              "PKCS#11: pkcs11h_certificate_deserializeCertificateId entry 
> p_certificate_id=%p, sz='%s'",
> ++              (void *)p_certificate_id,
> ++              sz
> ++      );
> ++
> ++      if ((rv = _pkcs11h_certificate_newCertificateId (&certificate_id)) != 
> CKR_OK) {
> ++              goto cleanup;
> ++      }
> ++      if ((rv = _pkcs11h_token_newTokenId (&certificate_id->token_id)) != 
> CKR_OK) {
> ++              goto cleanup;
> ++      }
> ++
> ++      if (!strncmp(sz, URI_SCHEME, strlen (URI_SCHEME))) {
> ++              rv = __parse_pkcs11_uri (certificate_id->token_id, 
> certificate_id, sz);
> ++      } else {
> ++              rv = __pkcs11h_certificate_legacy_deserializeCertificateId 
> (certificate_id, sz);
> ++      }
> ++      if (rv != CKR_OK) {
> ++              goto cleanup;
> ++      }
> ++
> +       *p_certificate_id = certificate_id;
> +       certificate_id = NULL;
> +       rv = CKR_OK;
> +
> + cleanup:
> +-
> +       if (certificate_id != NULL) {
> +               pkcs11h_certificate_freeCertificateId (certificate_id);
> +               certificate_id = NULL;
> +       }
> +
> +-      if (_sz != NULL) {
> +-              _pkcs11h_mem_free ((void *)&_sz);
> +-      }
> +-
> +       _PKCS11H_DEBUG (
> +               PKCS11H_LOG_DEBUG2,
> +               "PKCS#11: pkcs11h_certificate_deserializeCertificateId return 
> rv=%lu-'%s'",
> +diff --git a/lib/pkcs11h-util.c b/lib/pkcs11h-util.c
> +index 0743fd1..f90e443 100644
> +--- a/lib/pkcs11h-util.c
> ++++ b/lib/pkcs11h-util.c
> +@@ -110,12 +110,7 @@ _pkcs11h_util_hexToBinary (
> +               p++;
> +       }
> +
> +-      if (*p != '\x0') {
> +-              return CKR_ATTRIBUTE_VALUE_INVALID;
> +-      }
> +-      else {
> +-              return CKR_OK;
> +-      }
> ++      return CKR_OK;
> + }
> +
> + CK_RV
> diff --git a/contrib/vcpkg-ports/pkcs11-helper/portfile.cmake 
> b/contrib/vcpkg-ports/pkcs11-helper/portfile.cmake
> new file mode 100644
> index 00000000..54a0009d
> --- /dev/null
> +++ b/contrib/vcpkg-ports/pkcs11-helper/portfile.cmake
> @@ -0,0 +1,35 @@
> +set(VERSION 1.27)
> +
> +vcpkg_download_distfile(ARCHIVE
> +    URLS 
> "https://github.com/OpenSC/pkcs11-helper/releases/download/pkcs11-helper-${VERSION}/pkcs11-helper-${VERSION}.0.tar.bz2";
> +    FILENAME "pkcs11-helper-${VERSION}.tar.bz2"
> +    SHA512 
> 5799342cb755dae8b7ba0880d652e9d4b4f1e52a74043015e1185e1e059326cb2689bb51957db98060ac2257dee34e2f047dcf3d52ad59fd49b91fedcfc5332b
> +)
> +
> +vcpkg_extract_source_archive_ex(
> +    OUT_SOURCE_PATH SOURCE_PATH
> +    ARCHIVE ${ARCHIVE}
> +    REF ${VERSION}
> +    PATCHES
> +        0001-nmake-openssl-1.1.1-support.patch
> +        pkcs11-helper-001-RFC7512.patch
> +)
> +
> +vcpkg_build_nmake(
> +    SOURCE_PATH ${SOURCE_PATH}
> +    NO_DEBUG
> +    PROJECT_SUBPATH lib
> +    PROJECT_NAME Makefile.w32-vc
> +    OPTIONS
> +        OPENSSL=1
> +        OPENSSL_HOME=${CURRENT_PACKAGES_DIR}/../openssl_${TARGET_TRIPLET}
> +)
> +
> +file(INSTALL ${SOURCE_PATH}/include/pkcs11-helper-1.0 DESTINATION 
> ${CURRENT_PACKAGES_DIR}/include/)
> +file(INSTALL 
> ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}/lib/pkcs11-helper.dll.lib 
> DESTINATION ${CURRENT_PACKAGES_DIR}/lib)
> +file(INSTALL 
> ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}/lib/pkcs11-helper.dll.lib 
> DESTINATION ${CURRENT_PACKAGES_DIR}/debug/lib)
> +
> +file(INSTALL 
> ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}/lib/libpkcs11-helper-1.dll 
> DESTINATION ${CURRENT_PACKAGES_DIR}/bin)
> +file(INSTALL 
> ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}/lib/libpkcs11-helper-1.dll 
> DESTINATION ${CURRENT_PACKAGES_DIR}/debug/bin)
> +
> +file(INSTALL ${SOURCE_PATH}/COPYING DESTINATION 
> ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright)
> --
> 2.23.0.windows.1
>


-- 
-Lev


_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to