remove_leading_zeros() was incorrectly using memcpy() for
  overlapping memory segments. Replace it by a more-central
  p11_attribute_trim() function in the p11util.c file, and
  use memmove() instead.

Signed-off-by: Klaus Heinrich Kiwi <[email protected]>
---
 usr/lib/pkcs11/cca_stdll/h_extern.h |    2 -
 usr/lib/pkcs11/cca_stdll/key.c      |  123 ++++++++++++++++++++++-------------
 usr/lib/pkcs11/cca_stdll/utility.c  |   24 -------
 usr/lib/pkcs11/common/h_extern.h    |    2 -
 usr/lib/pkcs11/common/key.c         |  121 ++++++++++++++++++++++------------
 usr/lib/pkcs11/common/p11util.c     |   23 +++++++
 usr/lib/pkcs11/common/p11util.h     |    8 ++
 usr/lib/pkcs11/common/utility.c     |   24 -------
 usr/lib/pkcs11/tpm_stdll/h_extern.h |    2 -
 usr/lib/pkcs11/tpm_stdll/utility.c  |   24 -------
 10 files changed, 186 insertions(+), 167 deletions(-)

diff --git a/usr/lib/pkcs11/cca_stdll/h_extern.h 
b/usr/lib/pkcs11/cca_stdll/h_extern.h
index e30f661..93a8767 100644
--- a/usr/lib/pkcs11/cca_stdll/h_extern.h
+++ b/usr/lib/pkcs11/cca_stdll/h_extern.h
@@ -565,8 +565,6 @@ CK_RV    strip_pkcs_padding( CK_BYTE  * ptr,
                              CK_ULONG   total_len,
                              CK_ULONG * data_len );
 
-CK_RV    remove_leading_zeros( CK_ATTRIBUTE *attr );
-
 
 // RNG routines
 //
diff --git a/usr/lib/pkcs11/cca_stdll/key.c b/usr/lib/pkcs11/cca_stdll/key.c
index 7ce7bc8..08d0286 100644
--- a/usr/lib/pkcs11/cca_stdll/key.c
+++ b/usr/lib/pkcs11/cca_stdll/key.c
@@ -405,6 +405,7 @@
 #include <string.h>  // for memcmp() et al
 
 #include "pkcs11types.h"
+#include "p11util.h"
 #include "defs.h"
 #include "cca_stdll.h"
 #include "host_defs.h"
@@ -1444,15 +1445,19 @@ rsa_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_MODULUS:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_PUBLIC_EXPONENT:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -1629,8 +1634,10 @@ rsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
    switch (attr->type) {
       case CKA_MODULUS:
       case CKA_PRIVATE_EXPONENT:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -1641,8 +1648,10 @@ rsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
       case CKA_EXPONENT_1:
       case CKA_EXPONENT_2:
       case CKA_COEFFICIENT:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -1812,17 +1821,17 @@ rsa_priv_unwrap( TEMPLATE *tmpl,
       st_err_log(88, __FILE__, __LINE__);
       return rc;
    }
-   remove_leading_zeros( modulus );
-   remove_leading_zeros( publ_exp );
+   p11_attribute_trim( modulus );
+   p11_attribute_trim( publ_exp );
 #if 0
-   remove_leading_zeros( priv_exp );
-   remove_leading_zeros( prime1 );
-   remove_leading_zeros( prime2 );
-   remove_leading_zeros( exponent1 );
-   remove_leading_zeros( exponent2 );
-   remove_leading_zeros( coeff );
+   p11_attribute_trim( priv_exp );
+   p11_attribute_trim( prime1 );
+   p11_attribute_trim( prime2 );
+   p11_attribute_trim( exponent1 );
+   p11_attribute_trim( exponent2 );
+   p11_attribute_trim( coeff );
 #else
-   remove_leading_zeros( opaque );
+   p11_attribute_trim( opaque );
 #endif
 
    template_update_attribute( tmpl, modulus );
@@ -1971,7 +1980,8 @@ dsa_publ_validate_attribute( TEMPLATE *tmpl, CK_ATTRIBUTE 
*attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
             }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_SUBPRIME:
@@ -1986,19 +1996,24 @@ dsa_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
             }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_BASE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2139,7 +2154,8 @@ dsa_priv_validate_attribute( TEMPLATE *tmpl, CK_ATTRIBUTE 
*attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
                }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_SUBPRIME:
@@ -2154,13 +2170,16 @@ dsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
             }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_BASE:
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2272,10 +2291,10 @@ dsa_priv_unwrap( TEMPLATE *tmpl,
       st_err_log(88, __FILE__, __LINE__);
       return rc;
    }
-   remove_leading_zeros( prime );
-   remove_leading_zeros( subprime );
-   remove_leading_zeros( base );
-   remove_leading_zeros( value );
+   p11_attribute_trim( prime );
+   p11_attribute_trim( subprime );
+   p11_attribute_trim( base );
+   p11_attribute_trim( value );
 
    template_update_attribute( tmpl, prime );
    template_update_attribute( tmpl, subprime );
@@ -2480,8 +2499,10 @@ ecdsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2609,15 +2630,19 @@ dh_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
    switch (attr->type) {
       case CKA_PRIME:
       case CKA_BASE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2745,8 +2770,10 @@ dh_priv_validate_attribute( TEMPLATE *tmpl, CK_ATTRIBUTE 
*attr, CK_ULONG mode )
       case CKA_PRIME:
       case CKA_BASE:
       case CKA_VALUE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2905,15 +2932,19 @@ kea_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
       case CKA_PRIME:
       case CKA_SUBPRIME:
       case CKA_BASE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -3042,8 +3073,10 @@ kea_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
       case CKA_SUBPRIME:
       case CKA_BASE:
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
diff --git a/usr/lib/pkcs11/cca_stdll/utility.c 
b/usr/lib/pkcs11/cca_stdll/utility.c
index 15f5a3b..bdac177 100644
--- a/usr/lib/pkcs11/cca_stdll/utility.c
+++ b/usr/lib/pkcs11/cca_stdll/utility.c
@@ -838,30 +838,6 @@ strip_pkcs_padding( CK_BYTE   * ptr,
 
 //
 //
-CK_RV
-remove_leading_zeros( CK_ATTRIBUTE *attr )
-{
-   CK_BYTE   *ptr = NULL;
-   CK_ULONG   new_len, i;
-
-   ptr = attr->pValue;
-
-   for (i = 0; i < attr->ulValueLen; i++) {
-      if (ptr[i] != 0x0)
-         break;
-   }
-
-   new_len = attr->ulValueLen - i;
-
-   memcpy( ptr, ptr + i, new_len );
-   attr->ulValueLen = new_len;
-
-   return CKR_OK;
-}
-
-
-//
-//
 CK_BYTE
 parity_adjust( CK_BYTE b )
 {
diff --git a/usr/lib/pkcs11/common/h_extern.h b/usr/lib/pkcs11/common/h_extern.h
index be2a275..851d0b1 100755
--- a/usr/lib/pkcs11/common/h_extern.h
+++ b/usr/lib/pkcs11/common/h_extern.h
@@ -849,8 +849,6 @@ CK_RV    strip_pkcs_padding( CK_BYTE  * ptr,
                              CK_ULONG   total_len,
                              CK_ULONG * data_len );
 
-CK_RV    remove_leading_zeros( CK_ATTRIBUTE *attr );
-
 
 // RNG routines
 //
diff --git a/usr/lib/pkcs11/common/key.c b/usr/lib/pkcs11/common/key.c
index 6da170c..743f897 100755
--- a/usr/lib/pkcs11/common/key.c
+++ b/usr/lib/pkcs11/common/key.c
@@ -405,6 +405,7 @@
 #include <string.h>  // for memcmp() et al
 
 #include "pkcs11types.h"
+#include "p11util.h"
 #include "defs.h"
 #include "host_defs.h"
 #include "h_extern.h"
@@ -1441,15 +1442,19 @@ rsa_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_MODULUS:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_PUBLIC_EXPONENT:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -1626,8 +1631,10 @@ rsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
    switch (attr->type) {
       case CKA_MODULUS:
       case CKA_PRIVATE_EXPONENT:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -1638,8 +1645,10 @@ rsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
       case CKA_EXPONENT_1:
       case CKA_EXPONENT_2:
       case CKA_COEFFICIENT:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -1790,14 +1799,14 @@ rsa_priv_unwrap( TEMPLATE *tmpl,
       st_err_log(88, __FILE__, __LINE__);
       return rc;
    }
-   remove_leading_zeros( modulus );
-   remove_leading_zeros( publ_exp );
-   remove_leading_zeros( priv_exp );
-   remove_leading_zeros( prime1 );
-   remove_leading_zeros( prime2 );
-   remove_leading_zeros( exponent1 );
-   remove_leading_zeros( exponent2 );
-   remove_leading_zeros( coeff );
+   p11_attribute_trim( modulus );
+   p11_attribute_trim( publ_exp );
+   p11_attribute_trim( priv_exp );
+   p11_attribute_trim( prime1 );
+   p11_attribute_trim( prime2 );
+   p11_attribute_trim( exponent1 );
+   p11_attribute_trim( exponent2 );
+   p11_attribute_trim( coeff );
 
    template_update_attribute( tmpl, modulus );
    template_update_attribute( tmpl, publ_exp );
@@ -1941,7 +1950,8 @@ dsa_publ_validate_attribute( TEMPLATE *tmpl, CK_ATTRIBUTE 
*attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
             }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_SUBPRIME:
@@ -1956,19 +1966,24 @@ dsa_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
             }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_BASE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2109,7 +2124,8 @@ dsa_priv_validate_attribute( TEMPLATE *tmpl, CK_ATTRIBUTE 
*attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
                }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_SUBPRIME:
@@ -2124,13 +2140,16 @@ dsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
                st_err_log(9, __FILE__, __LINE__);
                return CKR_ATTRIBUTE_VALUE_INVALID;
             }
-            return remove_leading_zeros( attr );
+            p11_attribute_trim( attr );
+            return CKR_OK;
          }
 
       case CKA_BASE:
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2242,10 +2261,10 @@ dsa_priv_unwrap( TEMPLATE *tmpl,
       st_err_log(88, __FILE__, __LINE__);
       return rc;
    }
-   remove_leading_zeros( prime );
-   remove_leading_zeros( subprime );
-   remove_leading_zeros( base );
-   remove_leading_zeros( value );
+   p11_attribute_trim( prime );
+   p11_attribute_trim( subprime );
+   p11_attribute_trim( base );
+   p11_attribute_trim( value );
 
    template_update_attribute( tmpl, prime );
    template_update_attribute( tmpl, subprime );
@@ -2450,8 +2469,10 @@ ecdsa_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2579,15 +2600,19 @@ dh_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
    switch (attr->type) {
       case CKA_PRIME:
       case CKA_BASE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2715,8 +2740,10 @@ dh_priv_validate_attribute( TEMPLATE *tmpl, CK_ATTRIBUTE 
*attr, CK_ULONG mode )
       case CKA_PRIME:
       case CKA_BASE:
       case CKA_VALUE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -2875,15 +2902,19 @@ kea_publ_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
       case CKA_PRIME:
       case CKA_SUBPRIME:
       case CKA_BASE:
-         if (mode == MODE_CREATE || mode == MODE_KEYGEN)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE || mode == MODE_KEYGEN) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
          }
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
@@ -3012,8 +3043,10 @@ kea_priv_validate_attribute( TEMPLATE *tmpl, 
CK_ATTRIBUTE *attr, CK_ULONG mode )
       case CKA_SUBPRIME:
       case CKA_BASE:
       case CKA_VALUE:
-         if (mode == MODE_CREATE)
-            return remove_leading_zeros( attr );
+         if (mode == MODE_CREATE) {
+            p11_attribute_trim( attr );
+            return CKR_OK;
+         }
          else{
             st_err_log(7, __FILE__, __LINE__);
             return CKR_ATTRIBUTE_READ_ONLY;
diff --git a/usr/lib/pkcs11/common/p11util.c b/usr/lib/pkcs11/common/p11util.c
index c5f1765..8231145 100755
--- a/usr/lib/pkcs11/common/p11util.c
+++ b/usr/lib/pkcs11/common/p11util.c
@@ -701,3 +701,26 @@ p11_bigint_trim(CK_BYTE_PTR in, CK_ULONG_PTR size) {
    *size -= i;
    return in + i;
 }
+
+/* p11_attribute_trim() - trim a PKCS#11 CK_ATTRIBUTE in place,
+ *      using memmove() to move the data and adjusting
+ *      ulValueLen. The resulting "pValue" pointer stays the
+ *      same so that the caller can free() it normally
+ * @attr is the pointer to the CK_ATTRIBUTE to be trimmed
+ */
+void
+p11_attribute_trim(CK_ATTRIBUTE *attr) {
+
+   CK_BYTE_PTR ptr;
+   CK_ULONG    size;
+
+   if (attr != NULL) {
+      size = attr->ulValueLen;
+      ptr = p11_bigint_trim(attr->pValue, &size);
+
+      if (ptr != attr->pValue) {
+         attr->ulValueLen = size;
+         memmove(attr->pValue, ptr, size);
+      }
+   }
+}
diff --git a/usr/lib/pkcs11/common/p11util.h b/usr/lib/pkcs11/common/p11util.h
index 2e31bff..88b2d64 100755
--- a/usr/lib/pkcs11/common/p11util.h
+++ b/usr/lib/pkcs11/common/p11util.h
@@ -326,5 +326,13 @@ char * p11_ahex_dump(char **dst, CK_BYTE_PTR ptr, CK_ULONG 
len);
  */
 CK_BYTE_PTR p11_bigint_trim(CK_BYTE_PTR in, CK_ULONG_PTR size);
 
+/* p11_attribute_trim() - trim a PKCS#11 CK_ATTRIBUTE in place,
+ *      using memmove() to move the data and adjusting
+ *      ulValueLen. The resulting "pValue" pointer stays the
+ *      same so that the caller can free() it normally
+ * @attr is the pointer to the CK_ATTRIBUTE to be trimmed
+ */
+void p11_attribute_trim(CK_ATTRIBUTE *attr);
+
 #endif  // #ifndef _P11UTIL_H_
 
diff --git a/usr/lib/pkcs11/common/utility.c b/usr/lib/pkcs11/common/utility.c
index 5e401e9..bbea667 100755
--- a/usr/lib/pkcs11/common/utility.c
+++ b/usr/lib/pkcs11/common/utility.c
@@ -1117,30 +1117,6 @@ strip_pkcs_padding( CK_BYTE   * ptr,
 
 //
 //
-CK_RV
-remove_leading_zeros( CK_ATTRIBUTE *attr )
-{
-   CK_BYTE   *ptr = NULL;
-   CK_ULONG   new_len, i;
-
-   ptr = attr->pValue;
-
-   for (i = 0; i < attr->ulValueLen; i++) {
-      if (ptr[i] != 0x0)
-         break;
-   }
-
-   new_len = attr->ulValueLen - i;
-
-   memcpy( ptr, ptr + i, new_len );
-   attr->ulValueLen = new_len;
-
-   return CKR_OK;
-}
-
-
-//
-//
 CK_BYTE
 parity_adjust( CK_BYTE b )
 {
diff --git a/usr/lib/pkcs11/tpm_stdll/h_extern.h 
b/usr/lib/pkcs11/tpm_stdll/h_extern.h
index d708373..00a260a 100644
--- a/usr/lib/pkcs11/tpm_stdll/h_extern.h
+++ b/usr/lib/pkcs11/tpm_stdll/h_extern.h
@@ -546,8 +546,6 @@ CK_RV    strip_pkcs_padding( CK_BYTE  * ptr,
                              CK_ULONG   total_len,
                              CK_ULONG * data_len );
 
-CK_RV    remove_leading_zeros( CK_ATTRIBUTE *attr );
-
 
 // RNG routines
 //
diff --git a/usr/lib/pkcs11/tpm_stdll/utility.c 
b/usr/lib/pkcs11/tpm_stdll/utility.c
index ad32fb5..e17752b 100644
--- a/usr/lib/pkcs11/tpm_stdll/utility.c
+++ b/usr/lib/pkcs11/tpm_stdll/utility.c
@@ -856,30 +856,6 @@ strip_pkcs_padding( CK_BYTE   * ptr,
 
 //
 //
-CK_RV
-remove_leading_zeros( CK_ATTRIBUTE *attr )
-{
-       CK_BYTE   *ptr = NULL;
-       CK_ULONG   new_len, i;
-
-       ptr = attr->pValue;
-
-       for (i = 0; i < attr->ulValueLen; i++) {
-               if (ptr[i] != 0x0)
-                       break;
-       }
-
-       new_len = attr->ulValueLen - i;
-
-       memcpy( ptr, ptr + i, new_len );
-       attr->ulValueLen = new_len;
-
-       return CKR_OK;
-}
-
-
-//
-//
 CK_BYTE
 parity_adjust( CK_BYTE b )
 {
-- 
1.7.2.3


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Opencryptoki-tech mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to