[xmlsec] Big patch to xmlsec in recent OpenOffice.org sources
Andrew Fan
Xuelei.Fan at Sun.COM
Mon Feb 28 19:30:07 PST 2005
Why double get the same cert from the trusted store before and after the
self-singed cert checking? Otherwise, looks good, and much more better
than mine coding style. :-P
-Andrew
Aleksey Sanin wrote:
> Sorry, wrong link:
>
> http://cvs.gnome.org/viewcvs/xmlsec/src/mscrypto/x509vfy.c?rev=1.6&view=markup
>
>
> Aleksey
>
> Aleksey Sanin wrote:
>
>> I agree with you about the "original" aka xmlsec-1.2.7 code.
>> However, take a look at the new code I wrote yesterday!
>> I believe it does exactly the same thing as the code in your
>> patch:
>>
>> http://cvs.gnome.org/viewcvs/xmlsec/src/mscrypto/certkeys.c?rev=1.7&view=markup
>>
>>
>> Aleksey
>>
>> Andrew Fan wrote:
>>
>>> Aleksey Sanin wrote:
>>>
>>>>>> 6) src/mscrypto/certkeys.c,
>>>>>> xmlSecMSCryptoX509StoreConstructCertsChain()
>>>>>> function:
>>>>>
>>>>>
>>>>>
>>>>>
>>>> ...
>>>>
>>>> As far as I can understand your patch, it *does not* search untrusted
>>>> certs store if the certificate is self signed ("if(!selfSigned)...").
>>>> And this is exactly what happens in my code:
>>>> 1) Search trusted store for the cert subject and return TRUE if found
>>>> 2) Check if cert is self signed and return FALSE if it is the case
>>>> 3) Search trusted store for the cert issuer, check signature,
>>>> revocation, etc. and return TRUE if everything is OK
>>>> 4) Search issuer cert in the list of other input certs, check
>>>> signature, revocation, etc. and return recurse if everything is OK
>>>> 5) Search issuer cert in the list of untrusted certs, check
>>>> signature,
>>>> revocation, etc. and return recurse if everything is OK
>>>
>>>
>>>
>>>
>>> I have a little different views. At the original file:
>>> (1). line 290-291:
>>> ----------------
>>> /* try the untrusted certs in the chain */
>>> issuerCert = CertFindCertificateInStore(certs,
>>> .....
>>> --here, it the first step to find the cert from the stored
>>> certs-------------
>>>
>>> (2). line 297-299:
>>> ----------------
>>> if(issuerCert == cert) {
>>> /* self signed cert, forget it */
>>> CertFreeCertificateContext(issuerCert);
>>> --here, you will go forward to next step: find the cert at untrsuted
>>> store;
>>> --the compare "issuerCert == cert" is not correct, it only compared
>>> the handler instead of the certificate content, it is common that
>>> the same certificate is bound with different handler because of
>>> difference of who/when create handler, where the cert is reposited,
>>> etc. ---------------
>>>
>>> (3). line 316-317:
>>> ----------------
>>> /* try the untrusted certs in the store */
>>> issuerCert = CertFindCertificateInStore(ctx->untrusted,
>>> --The second step to find a cert from untrusted store. -------------
>>>
>>> (4). line 323-324:
>>> ----------------
>>> if(issuerCert == cert) {
>>> /* self signed cert, forget it */
>>> --The same as (2)--------------
>>>
>>> (5). line 341-342:
>>> ----------------
>>> /* try to find issuer cert in the trusted cert in the store */
>>> issuerCert = CertFindCertificateInStore(ctx->trusted,
>>> --Finally, try to find the self-signed cert in trusted store. Notes,
>>> goes here, the cert must be a self-signed cert, otherwise, it must
>>> be switched off.--------------
>>>
>>> Considering two cases.
>>> 1. I have self-signed cert in my key store, code goes to find the
>>> self-signed cert, the process like:
>>> a. try to find it at cert chains, i.e, the stored certs which
>>> maybe read from xml or set by user;
>>> b. if found, because it is a self-signed cert, ignore and goes
>>> forward; if not goes forward;
>>> c. try to find it at untrusted store;
>>> d. if found, because it is a self-signed cert, ignore and goes
>>> forward; if not goes forward;
>>> e. try to find it at trusted store. and we get it at last.
>>>
>>> --We have four step useless, step a to d. And at step c, for large
>>> scale PKI system, it maybe connect to a remote directory server, it
>>> is quite time consumption. In fact, we can directly try to find the
>>> cert firstly from the trusted store.
>>>
>>> 2. I have personal certificate with private key in my key store, but
>>> I have no root certificate in my key store, I want to sign or
>>> decrypt some data. Because I have private key, for sure, I trust it.
>>> The codes will be failed to find the cert.
>>>
>>> So I think, the find cert from trusted store should be moved up, and
>>> return immediately after the cert is found at the trusted store no
>>> matter whether it is a self-signed cert.
>>>
>>>> It seems to me that this covers all the cases and it is not much
>>>> different from your code. In your code, step 3) was done after 4)
>>>> and 5)
>>>> and you did it for self signed certs too. But if cert is self signed,
>>>> then subject == issuer and you'll find it (or not find it) in the
>>>> trusted store on step 1) anyway and there is no need to repeat
>>>> the search on step 3) again.
>>>>
>>> Yes, in my codes, the lastest block are redundant, which should be
>>> deleted and add return false in the above two block where found the
>>> self-signed cert.
>>>
>>> Thanks,
>>> Andrew
>>> _______________________________________________
>>> xmlsec mailing list
>>> xmlsec at aleksey.com
>>> http://www.aleksey.com/mailman/listinfo/xmlsec
>>
>>
>> _______________________________________________
>> xmlsec mailing list
>> xmlsec at aleksey.com
>> http://www.aleksey.com/mailman/listinfo/xmlsec
>
> _______________________________________________
> xmlsec mailing list
> xmlsec at aleksey.com
> http://www.aleksey.com/mailman/listinfo/xmlsec
More information about the xmlsec
mailing list