And I suggest you add "// 65537" as well to make it easier to spot like in
other tpm_specific.c places (or consider moving them all to a global static
variable?)
943 CK_BYTE pub_exp[] = { 0x1, 0x0, 0x1 }; // 65537
Best regards,
-- Nelson
On Thu, Jan 20, 2011 at 1:45 PM, Nelson Araujo <[email protected]>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.
>
> 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
>> >
>> >
>>
>>
>>
>
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Opencryptoki-tech mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech