Sorry for the delayed response. We will be testing the patch no later than
this weekend and get back if it works in all scenarios.

Best regards,
-- Nelson




On Thu, Jan 20, 2011 at 1:56 PM, Kent Yoder <[email protected]> wrote:

> On Thu, 2011-01-20 at 13:45 -0800, Nelson Araujo wrote:
> > Sounds like a good plan to me.
> >
> >
> > Is there any reason you have an extra byte "0" in the public exponent
> > array? If you don't I suggest removing as for 65537 exponent a buffer
> > with 3 bytes would be enough (if the app knows what's dealing with)
> > and having it with 4 will fail with buffer too small.
>
>   Nope, no reason, I can change that.
>
> Kent
>
> >
> > Best regards,
> > -- Nelson
> >
> >
> > On Thu, Jan 20, 2011 at 1:18 PM, Kent Yoder <[email protected]>
> > wrote:
> >         On Wed, 2011-01-19 at 15:48 -0800, Nelson Araujo wrote:
> >         > Forgot to mention that you need to change "111111" in the
> >         sample below
> >         > with your actual TPM user PIN for the change to work.
> >
> >
> >          Thanks Nelson, I was able to reproduce the issue.
> >
> >          It looks like opencryptoki by default creates an empty public
> >         exponent
> >         attribute for all rsa private keys, but then doesn't fill that
> >         attribute
> >         in with its correct value.  This probably hasn't come up
> >         before since
> >         most software will query the public exponent from the public
> >         key object,
> >         where its a required attribute, as opposed to the private key
> >         object,
> >         where its not required.
> >
> >          Right now, opencryptoki and the caller are both doing the
> >         "correct"
> >         thing in the use of C_GetAttributeValue -- the app queries the
> >         public
> >         exponent attribute, opencryptoki sees its a valid attribute
> >         and returns
> >         its length (since the app passed in NULL as the pValue
> >         pointer) but
> >         opencryptoki is operating on an incorrectly filled out
> >         template it
> >         created.
> >
> >          When using your patch, the checking of the real attribute
> >         value will
> >         be bypassed, which is really just covering for the fact that
> >         opencryptoki created an invalid attribute for that object.
> >
> >          I think the right solution here will be to add code to
> >         opencryptoki's
> >         tokens to correctly fill out the private key object's public
> >         exponent
> >         attribute, then all should work correctly.  Below is a patch
> >         that does
> >         this for the TPM token.  Let me know if it works for you.  It
> >         did fix
> >         the public exponent value in the generated cert for me,
> >         although openssl
> >         verify passed on all of the certs I generated (even when
> >         public exponent
> >         was 0).
> >
> >         Thanks,
> >         Kent
> >
> >         diff --git a/usr/lib/pkcs11/tpm_stdll/tpm_specific.c
> >         b/usr/lib/pkcs11/tpm_stdll/tpm_specific.c
> >         index d5708c3..b31a861 100644
> >         --- a/usr/lib/pkcs11/tpm_stdll/tpm_specific.c
> >         +++ b/usr/lib/pkcs11/tpm_stdll/tpm_specific.c
> >         @@ -2374,6 +2374,7 @@
> >         token_specific_rsa_generate_keypair( TEMPLATE  *
> >         publ_tmpl,
> >                CK_ULONG        mod_bits = 0;
> >                CK_BBOOL        flag;
> >                CK_RV           rc;
> >         +       CK_BYTE         tpm_pubexp[] = { 0, 1, 0, 1 };
> >
> >                TSS_FLAG        initFlags = 0;
> >                BYTE            authHash[SHA1_HASH_SIZE];
> >         @@ -2490,6 +2491,13 @@
> >         token_specific_rsa_generate_keypair( TEMPLATE  *
> >         publ_tmpl,
> >                template_update_attribute( priv_tmpl, attr );
> >                Tspi_Context_FreeMemory(tspContext, rgbBlob);
> >
> >         +       /* put the public exponent into the private key object
> >         */
> >         +       if ((rc = build_attribute(CKA_PUBLIC_EXPONENT,
> >         tpm_pubexp,
> >         sizeof(tpm_pubexp), &attr))) {
> >         +               st_err_log(84, __FILE__, __LINE__);
> >         +               return rc;
> >         +       }
> >         +       template_update_attribute( priv_tmpl, attr );
> >         +
> >                /* wrap the authdata and put it into an object */
> >                if (authData != NULL) {
> >                        if ((rc = token_wrap_auth_data(authData,
> >         publ_tmpl, priv_tmpl))) {
> >
> >
> >
> >
> >         > Best regards,
> >         > -- Nelson
> >         >
> >         >
> >         > "Education is the antidote to war."
> >         >      -- Scott Adams
> >         >
> >         >
> >         >
> >         > On Wed, Jan 19, 2011 at 3:45 PM, Nelson Araujo
> >         > <[email protected]> wrote:
> >         >
> >         >         On Wed, Jan 19, 2011 at 1:42 PM, Kent Yoder
> >         >         <[email protected]> wrote:
> >         >
> >         >                 > a) OpenSC package
> >         >                 > b) OpenSSL package
> >         >                 > c) TPM hardware (e.g. Thinkpad T400
> >         laptop)
> >         >                 > d) Both OpenSC and OpenSSL configured to
> >         use
> >         >                 openCryptoki
> >         >
> >         >                 Thanks Nelson.  Which gateway from openssl
> >         -> pkcs11
> >         >                 are you using?  One
> >         >                 of the engines?
> >         >
> >         >
> >         >         I am using engine_pkcs11.so. To pair OpenSSL =>
> >         pkcs11 I am
> >         >         using the following config patch (apply to
> >         >         your /etc/<your-dist>/openssl.cnf):
> >         >
> >         >
> >         >                 --- apps/openssl.cnf.ORG        2010-12-07
> >         >                 09:24:50.000000000 -0800
> >         >                 +++ apps/openssl.cnf    2010-12-07
> >         09:25:42.000000000
> >         >                 -0800
> >         >                 @@ -12,6 +12,21 @@
> >         >                  #oid_file              = $ENV::HOME/.oid
> >         >                  oid_section            = new_oids
> >         >
> >         >
> >         >                 +openssl_conf            = openssl_def
> >         >                 +
> >         >                 +[openssl_def]
> >         >                 +engines = engine_section
> >         >                 +
> >         >                 +[engine_section]
> >         >                 +pkcs11 = pkcs11_section
> >         >                 +
> >         >                 +[pkcs11_section]
> >         >                 +engine_id = pkcs11
> >         >                 +dynamic_path
> >         = /usr/lib/engines/engine_pkcs11.so
> >         >                 +MODULE_PATH
> >         >                 = /usr/lib/opencryptoki/libopencryptoki.so.0
> >         >                 +PIN = 111111
> >         >                 +init = 0
> >         >                 +
> >         >                  # To use this configuration file with the
> >         "-extfile"
> >         >                 option of the
> >         >                  # "openssl x509" utility, name here the
> >         section
> >         >                 containing the
> >         >                  # X.509v3 extensions to use:
> >         >
> >         >
> >         >         Best regards,
> >         >         -- Nelson
> >         >
> >         >
> >         >
> >         >
> >         >
> >         >                 Kent
> >         >
> >         >
> >         >                 > e) openCryptoki configured to use TPM
> >         device
> >         >                 >
> >         >                 >
> >         >                 > To reproduce the issue, do:
> >         >                 >
> >         >                 >
> >         >                 > 1) Create a private key using OpenSC
> >         >                 > 2) Create a X.509 request using OpenSSL
> >         >                 > 3) Verify the request is malformed
> >         >                 >    3.1) Extract the public key from
> >         request in #2
> >         >                 (pubexp = 0!)
> >         >                 >    3.2) Verify the request using OpenSSL
> >         (verify
> >         >                 failure)
> >         >                 >
> >         >                 >
> >         >                 > You will notice that the public exponent
> >         of the
> >         >                 public key output
> >         >                 > without the patch is 0 (incorrect) and
> >         therefore the
> >         >                 X.509 certificate
> >         >                 > request is invalid. Applying the patch it
> >         will
> >         >                 return the correct
> >         >                 > exponent (65537) and request is now
> >         correct.
> >         >                 >
> >         >                 >
> >         >                 >         > That's correct. This code does
> >         not process
> >         >                 attributes. It
> >         >                 >         keeps the
> >         >                 >         > original call (which does the
> >         processing)
> >         >                 and fixes the
> >         >                 >         public
> >         >                 >         > exponent, if appropriate. No
> >         other
> >         >                 behavior should change
> >         >                 >         other than
> >         >                 >         > that. The only attribute
> >         targeted here is
> >         >                 the public
> >         >                 >         exponent (all
> >         >                 >         > others are responsibility of the
> >         same
> >         >                 players as before the
> >         >                 >         patch.)
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >         Can you be more specific
> >         to what
> >         >                 issue you're seeing
> >         >                 >         here?
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >
> >         >                 >         > Sure. The idea is the following:
> >         >                 >         >
> >         >                 >         >
> >         >                 >         > 1) we need to check and return
> >         buffer too
> >         >                 small upfront,
> >         >                 >         because the
> >         >                 >         > underlying functions will return
> >         generic
> >         >                 errors if the
> >         >                 >         buffer is
> >         >                 >         > actually too small and there is
> >         no way
> >         >                 from this level (and
> >         >                 >         above) to
> >         >                 >         > tell the difference. the only
> >         reason for
> >         >                 the first check is
> >         >                 >         to return
> >         >                 >         > a more appropriate, and
> >         actionable, error
> >         >                 code to the caller
> >         >                 >
> >         >                 >
> >         >                 >          I'm not seeing which generic
> >         errors you're
> >         >                 referring to, can
> >         >                 >         you give
> >         >                 >         file/line #?
> >         >                 >
> >         >                 >
> >         >                 >
> >         >                 > If you run the test case above you will
> >         notice the
> >         >                 issues outlined,
> >         >                 > especially the return code from original
> >         call
> >         >                 > to object_mgr_get_attribute_values (the
> >         call in
> >         >                 between the patch 2
> >         >                 > sections). If you want to get the generic
> >         error
> >         >                 failure (which the
> >         >                 > first test in the patch attempts to
> >         address), you
> >         >                 will need an
> >         >                 > application that passes a template with
> >         >                 PUBLIC_EXPONENT defined and a
> >         >                 > buffer that is <3 bytes in size.
> >         >                 >
> >         >                 >         Thanks,
> >         >                 >         Kent
> >         >                 >
> >         >                 >         > 2) if you have a buffer large
> >         enough for
> >         >                 the exponent, we
> >         >                 >         allow the
> >         >                 >         > call to proceed. then:
> >         >                 >         >
> >         >                 >         >
> >         >                 >         > 3) when it returns, we check if
> >         the
> >         >                 exponent was filled by
> >         >                 >         the
> >         >                 >         > underlying layers. we noticed
> >         that 2 cases
> >         >                 can happen:
> >         >                 >         >   a) the exponent is filled by
> >         the callee
> >         >                 (which happened if
> >         >                 >         we
> >         >                 >         > imported the private key into
> >         the TPM) and
> >         >                 >         >   b) the exponent is not filled
> >         (which
> >         >                 happened if we
> >         >                 >         generated the
> >         >                 >         > private key inside the TPM
> >         >                 >         >
> >         >                 >         > In (3a) I assume that happens
> >         because when
> >         >                 I import the key
> >         >                 >         it is
> >         >                 >         > being stored "as is" and we pass
> >         the
> >         >                 exponent as part of the
> >         >                 >         private
> >         >                 >         > key structure. Anyway, the if()
> >         check is
> >         >                 prevent overwriting
> >         >                 >         something
> >         >                 >         > the callee already filled, and
> >         also does
> >         >                 not make sense to
> >         >                 >         copy over
> >         >                 >         > the same data, and per the
> >         existing checks
> >         >                 in place ensure
> >         >                 >         the number
> >         >                 >         > has to be 65537.
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >          -Klaus
> >         >                 >         >
> >         >                 >         >
> >         >                 >         >         --
> >         >                 >         >         Klaus Heinrich Kiwi |
> >         >                 [email protected] |
> >         >                 >         >
> >         http://blog.klauskiwi.com
> >         >                 >         >         Open Source Security
> >         blog :
> >         >                 >         http://www.ratliff.net/blog
> >         >                 >         >         IBM Linux Technology
> >         Center :
> >         >                 >         http://www.ibm.com/linux/ltc
> >         >                 >         >
> >         >                 >         >
> >         >                 >
> >         >                 >         >
> >         >                 >
> >         >
> >
> ------------------------------------------------------------------------------
> >         >                 >         > Protect Your Site and Customers
> >         from
> >         >                 Malware Attacks
> >         >                 >         > Learn about various malware
> >         tactics and
> >         >                 how to avoid them.
> >         >                 >         Understand
> >         >                 >         > malware threats, the impact they
> >         can have
> >         >                 on your business,
> >         >                 >         and how you
> >         >                 >         > can protect your company and
> >         customers by
> >         >                 using code
> >         >                 >         signing.
> >         >                 >         >
> >         http://p.sf.net/sfu/oracle-sfdevnl
> >         >                 >         >
> >         >
> >         _______________________________________________
> >         >                 >         Opencryptoki-tech mailing list
> >         >                 >
> >         [email protected]
> >         >                 >
> >         >
> >         https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech
> >         >                 >
> >         >                 >
> >         >                 >
> >         >
> >         >
> >         >
> >         >
> >
> ------------------------------------------------------------------------------
> >         >                 Protect Your Site and Customers from Malware
> >         Attacks
> >         >                 Learn about various malware tactics and how
> >         to avoid
> >         >                 them. Understand
> >         >                 malware threats, the impact they can have on
> >         your
> >         >                 business, and how you
> >         >                 can protect your company and customers by
> >         using code
> >         >                 signing.
> >         >                 http://p.sf.net/sfu/oracle-sfdevnl
> >         >
> >         _______________________________________________
> >         >                 Opencryptoki-tech mailing list
> >         >                 [email protected]
> >         >
> >         https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech
> >         >
> >         >
> >
> >
> >
> >
> >
>
>
>
------------------------------------------------------------------------------
What You Don't Know About Data Connectivity CAN Hurt You
This paper provides an overview of data connectivity, details
its effect on application quality, and explores various alternative
solutions. http://p.sf.net/sfu/progress-d2d
_______________________________________________
Opencryptoki-tech mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to