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