ASN1 integer conversion - why is this correct ?
Dirk-Willem van Gulik
dirkx at webweaving.org
Sun Aug 30 13:23:00 UTC 2020
I am converting an unsigned integer (P,Q of an ECDSA 256 bit curve) from a 32 byte array (as provided by Microsoft its .NET cryptographic framework) to an ANS1_INTEGER.
The steps taken are:
unsigned char in[32] = ..
r = BN_bin2bn(in, 32, NULL);
BN_to_ASN1_INTEGER(r, asn1intptr);
All works well; except for these two test cases:
in[]32 =
FF F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
in[]32 =
FF F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF // < last bits set
Which both yield:
2:d=1 hl=2 l= 33 prim: INTEGER :EBFFF00000000000000000000000000000000000000000000000000000000000
And
in[]32 = 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF
Which yields:
37:d=1 hl=2 l= 33 prim: INTEGER :FF03000000000000000000000000000000000000000000000000000000000000
Could someone explain me what happens here, especially to the last 0xFF bits ?
With kind regards,
Actual code at [1]; test script output of gen-tc.sh[2] in [3].
Dw.
1: https://github.com/minvws/nl-contact-tracing-odds-and-ends/tree/master/dotNet_ms64_to_x962
2: https://github.com/minvws/nl-contact-tracing-odds-and-ends/blob/master/dotNet_ms64_to_x962/gen-tc.sh
3: https://github.com/minvws/nl-contact-tracing-odds-and-ends/blob/master/dotNet_ms64_to_x962/test.txt
More information about the openssl-users
mailing list