Erwann, Peter
This is right, but all numbers are integers and should be encodeed
accordingly. If encoding assuming fixed size integers, it should use
length octets, if not end-of-contents octets. At least this is how i
read 8.1 from ASN.1 spec
(http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf).
This is why i think there is a bug in ASN.1 encoding of the
certificate



On Mon, Apr 2, 2012 at 5:48 PM, Erwann Abalea via RT <r...@openssl.org> wrote:
> Bonjour,
>
> There's no optimization here.
>
> Consider the following 256bits RSA key components, following the "RSA
> definition".
> p=FD647F21207C128078ED4D815C13BA43
> q=D332E9F0E5D1661C4D16DB92A1B2D00B
> e=10001
>
> You then have n, the modulus, equal to p*q, which is
> "D10C39F80BA51AF15BF8F25B1FE9006A50FEA8845644481BCC5F6870A1C570E1".
> d, the private exponent, is equal to e^-1 mod (p-1)(q-1), so
> "5D8966F6C1DF226B148813890A822B18973B9B7BFEA3A4BC658FB68E312300F1" in
> this case.
> p and q are 128 bits integers, as asked.
>
> exponent1, exponent2 and coefficient are CRT parameters, and are only
> useful to speed up private RSA operations. They're not mandatory, so
> their size is not defined. Consider them as bonus elements, outside the
> scope of RSA definition.
>
> You can do the maths by yourself, exponent1="d mod (p-1)", exponent2="d
> mod (q-1)".
> exponent1=20FEF3270729E0E6E5D850DD6576142D
> exponent2=2FD959273AEA3638333EFA803E2245
>
> There's nothing strange, or invalid, or optimized here.
>
>
> Le 02/04/2012 15:28, Tamir Khason via RT a écrit :
>> Hello, Erwann
>> This is not related to .NET. Integer is not only value, but also size.
>> Both exponents and its coefficients should be the same length
>> (according RSA definition, both integers) so those numbers should be
>> serialized into ASN1_INTEGER. In for some reason, you want to have
>> integer with different size (for me it's wrong, but it might be your
>> decision because of size optimization), you should use variouse size
>> serialization.
>>
>> This is what is this bug about.
>>
>>
>> On Mon, Apr 2, 2012 at 3:52 PM, Erwann Abalea via RT<r...@openssl.org>  
>> wrote:
>>> Bonjour,
>>>
>>> Le 02/04/2012 13:21, Tamir Khason via RT a écrit :
>>>> There is a bug in ASN.1 DER serializer used to generate RSA private
>>>> keys. It trims trailing zeros despite the DER specification. Please
>>>> see the full info and reproduction steps in my blog
>>>> http://khason.net/dev/openssl-bug-or-why-some-private-keys-cannot-be-used-for-net/#comments
>>>>
>>> You're wrong. You're mixing things, length encoding and value encoding
>>> (as in TLV).
>>>
>>> In DER, there's no "indefinite length" objects, because the purpose of
>>> DER is to have the only one non ambiguous representation of an object.
>>> Since an "indefinite length" (i.e. not known in advance) object can also
>>> be represented by its "definite length" counterpart by rewriting it once
>>> the object length is known, then an "indefinite length" can't be the
>>> only one representation of this object.
>>>
>>> Next, when writing a DER object, its serialization needs to be unique. A
>>> set of rules are applied to enforce this. For integers, these rules tell
>>> us that the lowest number of bytes need to be used, also ensuring that
>>> negative numbers are expressed in 2s complement form (highest bit set to
>>> 1). Therefore, while you can express the number 0x32 as the following
>>> serialization forms all representing the same number:
>>>    32
>>>    0032
>>>    000032
>>> only the first representation is a DER one. The others encode the same
>>> value, but with useless leading bytes.
>>>
>>> Negative numbers cannot have a heading 00 octet, because the highest
>>> order bit would then be equal to 0, and the number considered positive.
>>>
>>> Therefore, the number 0x92 can be serialized as:
>>>    92
>>>    0092
>>>    000092
>>> only the second form is a DER one. The first has its highest order bit
>>> set to 1, the number considered negative, its value is then -0x6E. The
>>> third form has an unnecessary leading 00 octet.
>>>
>>> Of course, adding trailing 00 octets are forbidden, this would
>>> completely change the encoded number. Like writing "70" is not the same
>>> as writing "7".
>>>
>>> In your "bad" example key, exponent2's length is smaller than
>>> exponent1's and coefficient's ones. They're not guaranteed to be of the
>>> same length. Exponent{1,2} and coefficient are results of calculations
>>> ("d mod (p-1)", "d mod (q-1)", "q^-1 mod p" respectively), and their
>>> magnitude can vary.
>>> Any "a mod b" number cannot be the same size of "b" (consider for
>>> example "2^32+1 mod 2^32", it's not a 32 bits integer).
>>>
>>> If your "bad" key cannot be used in .NET, there's another reason.
>>>
>>> --
>>> Erwann ABALEA
>>> -----
>>> podoclaste: casse-pieds
>>>
>>>
>>
>>
>
>
> --
> Erwann ABALEA
> -----
> "The most beautiful thing we can experience is the mysterious. It
> is the source of all true art and all science. He to whom this
> emotion is a stranger, who can no longer pause to wonder and
> stand rapt in awe, is as good as dead: his eyes are closed."
>                                      - Albert Einstein
>
>



-- 
Tamir http://khason.net/
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to