Fwd: ASN1_generate_nconf - incorrect integer encoding?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Fwd: ASN1_generate_nconf - incorrect integer encoding?

Rafał Arciszewski
Hi all,
I am trying to use OpenSSL libraries (libssl-dev 1.0.2 or 1.1.1)  to encode integers into DER format.I am using ASN1_generate_nconf but it seems that this function incorrectly encodes integers. It should encode in two's complement format and should prepend 0x00 byte if the first byte of encoded integer is greater then 0x80. But it is not doing that.

Here is my simple program where I check the length of encoded integer. For example for int = 128 the length should be 2. But the length is 2 beginning from int = 256.


Am I using correct function or should I use different one?


#include <stdio.h>
#include <stdint.h>
#include <openssl/asn1.h>
uint64_t i;
char str[100];
ASN1_TYPE *asn_ptr = NULL;
int main () {
        for(i = 120; i < 270; i++) {
                sprintf(str,"INTEGER:%lu",i);
                asn_ptr = ASN1_generate_nconf(str, NULL);
                printf("i: %lu, str: %s , len: %d \n", i, str, asn_ptr->value.integer->length);
        }
}

i: 120, str: INTEGER:120 , len: 1
i: 121, str: INTEGER:121 , len: 1
i: 122, str: INTEGER:122 , len: 1
i: 123, str: INTEGER:123 , len: 1
i: 124, str: INTEGER:124 , len: 1
i: 125, str: INTEGER:125 , len: 1
i: 126, str: INTEGER:126 , len: 1
i: 127, str: INTEGER:127 , len: 1
i: 128, str: INTEGER:128 , len: 1
i: 129, str: INTEGER:129 , len: 1
i: 130, str: INTEGER:130 , len: 1
i: 131, str: INTEGER:131 , len: 1
i: 132, str: INTEGER:132 , len: 1
i: 133, str: INTEGER:133 , len: 1
i: 134, str: INTEGER:134 , len: 1
i: 135, str: INTEGER:135 , len: 1
i: 136, str: INTEGER:136 , len: 1
i: 137, str: INTEGER:137 , len: 1
i: 138, str: INTEGER:138 , len: 1
i: 139, str: INTEGER:139 , len: 1
i: 140, str: INTEGER:140 , len: 1
i: 141, str: INTEGER:141 , len: 1
i: 142, str: INTEGER:142 , len: 1
i: 143, str: INTEGER:143 , len: 1
i: 144, str: INTEGER:144 , len: 1
i: 145, str: INTEGER:145 , len: 1
i: 146, str: INTEGER:146 , len: 1
i: 147, str: INTEGER:147 , len: 1
i: 148, str: INTEGER:148 , len: 1
i: 149, str: INTEGER:149 , len: 1
i: 150, str: INTEGER:150 , len: 1
i: 151, str: INTEGER:151 , len: 1
i: 152, str: INTEGER:152 , len: 1
i: 153, str: INTEGER:153 , len: 1
i: 154, str: INTEGER:154 , len: 1
i: 155, str: INTEGER:155 , len: 1
i: 156, str: INTEGER:156 , len: 1
i: 157, str: INTEGER:157 , len: 1
i: 158, str: INTEGER:158 , len: 1
i: 159, str: INTEGER:159 , len: 1
i: 160, str: INTEGER:160 , len: 1
i: 161, str: INTEGER:161 , len: 1
i: 162, str: INTEGER:162 , len: 1
i: 163, str: INTEGER:163 , len: 1
i: 164, str: INTEGER:164 , len: 1
i: 165, str: INTEGER:165 , len: 1
i: 166, str: INTEGER:166 , len: 1
i: 167, str: INTEGER:167 , len: 1
i: 168, str: INTEGER:168 , len: 1
i: 169, str: INTEGER:169 , len: 1
i: 170, str: INTEGER:170 , len: 1
i: 171, str: INTEGER:171 , len: 1
i: 172, str: INTEGER:172 , len: 1
i: 173, str: INTEGER:173 , len: 1
i: 174, str: INTEGER:174 , len: 1
i: 175, str: INTEGER:175 , len: 1
i: 176, str: INTEGER:176 , len: 1
i: 177, str: INTEGER:177 , len: 1
i: 178, str: INTEGER:178 , len: 1
i: 179, str: INTEGER:179 , len: 1
i: 180, str: INTEGER:180 , len: 1
i: 181, str: INTEGER:181 , len: 1
i: 182, str: INTEGER:182 , len: 1
i: 183, str: INTEGER:183 , len: 1
i: 184, str: INTEGER:184 , len: 1
i: 185, str: INTEGER:185 , len: 1
i: 186, str: INTEGER:186 , len: 1
i: 187, str: INTEGER:187 , len: 1
i: 188, str: INTEGER:188 , len: 1
i: 189, str: INTEGER:189 , len: 1
i: 190, str: INTEGER:190 , len: 1
i: 191, str: INTEGER:191 , len: 1
i: 192, str: INTEGER:192 , len: 1
i: 193, str: INTEGER:193 , len: 1
i: 194, str: INTEGER:194 , len: 1
i: 195, str: INTEGER:195 , len: 1
i: 196, str: INTEGER:196 , len: 1
i: 197, str: INTEGER:197 , len: 1
i: 198, str: INTEGER:198 , len: 1
i: 199, str: INTEGER:199 , len: 1
i: 200, str: INTEGER:200 , len: 1
i: 201, str: INTEGER:201 , len: 1
i: 202, str: INTEGER:202 , len: 1
i: 203, str: INTEGER:203 , len: 1
i: 204, str: INTEGER:204 , len: 1
i: 205, str: INTEGER:205 , len: 1
i: 206, str: INTEGER:206 , len: 1
i: 207, str: INTEGER:207 , len: 1
i: 208, str: INTEGER:208 , len: 1
i: 209, str: INTEGER:209 , len: 1
i: 210, str: INTEGER:210 , len: 1
i: 211, str: INTEGER:211 , len: 1
i: 212, str: INTEGER:212 , len: 1
i: 213, str: INTEGER:213 , len: 1
i: 214, str: INTEGER:214 , len: 1
i: 215, str: INTEGER:215 , len: 1
i: 216, str: INTEGER:216 , len: 1
i: 217, str: INTEGER:217 , len: 1
i: 218, str: INTEGER:218 , len: 1
i: 219, str: INTEGER:219 , len: 1
i: 220, str: INTEGER:220 , len: 1
i: 221, str: INTEGER:221 , len: 1
i: 222, str: INTEGER:222 , len: 1
i: 223, str: INTEGER:223 , len: 1
i: 224, str: INTEGER:224 , len: 1
i: 225, str: INTEGER:225 , len: 1
i: 226, str: INTEGER:226 , len: 1
i: 227, str: INTEGER:227 , len: 1
i: 228, str: INTEGER:228 , len: 1
i: 229, str: INTEGER:229 , len: 1
i: 230, str: INTEGER:230 , len: 1
i: 231, str: INTEGER:231 , len: 1
i: 232, str: INTEGER:232 , len: 1
i: 233, str: INTEGER:233 , len: 1
i: 234, str: INTEGER:234 , len: 1
i: 235, str: INTEGER:235 , len: 1
i: 236, str: INTEGER:236 , len: 1
i: 237, str: INTEGER:237 , len: 1
i: 238, str: INTEGER:238 , len: 1
i: 239, str: INTEGER:239 , len: 1
i: 240, str: INTEGER:240 , len: 1
i: 241, str: INTEGER:241 , len: 1
i: 242, str: INTEGER:242 , len: 1
i: 243, str: INTEGER:243 , len: 1
i: 244, str: INTEGER:244 , len: 1
i: 245, str: INTEGER:245 , len: 1
i: 246, str: INTEGER:246 , len: 1
i: 247, str: INTEGER:247 , len: 1
i: 248, str: INTEGER:248 , len: 1
i: 249, str: INTEGER:249 , len: 1
i: 250, str: INTEGER:250 , len: 1
i: 251, str: INTEGER:251 , len: 1
i: 252, str: INTEGER:252 , len: 1
i: 253, str: INTEGER:253 , len: 1
i: 254, str: INTEGER:254 , len: 1
i: 255, str: INTEGER:255 , len: 1
i: 256, str: INTEGER:256 , len: 2
i: 257, str: INTEGER:257 , len: 2
i: 258, str: INTEGER:258 , len: 2
i: 259, str: INTEGER:259 , len: 2
i: 260, str: INTEGER:260 , len: 2
i: 261, str: INTEGER:261 , len: 2
i: 262, str: INTEGER:262 , len: 2
i: 263, str: INTEGER:263 , len: 2
i: 264, str: INTEGER:264 , len: 2
i: 265, str: INTEGER:265 , len: 2
i: 266, str: INTEGER:266 , len: 2
i: 267, str: INTEGER:267 , len: 2
i: 268, str: INTEGER:268 , len: 2
i: 269, str: INTEGER:269 , len: 2



Regards,
Rafał Arciszewski
Reply | Threaded
Open this post in threaded view
|

Re: Fwd: ASN1_generate_nconf - incorrect integer encoding?

Matt Caswell-2


On 01/10/2019 16:30, Rafał Arciszewski wrote:

> Hi all,
> I am trying to use OpenSSL libraries (libssl-dev 1.0.2 or 1.1.1)  to encode
> integers into DER format.I am using ASN1_generate_nconf but it seems that this
> function incorrectly encodes integers. It should encode in two's complement
> format and should prepend 0x00 byte if the first byte of encoded integer is
> greater then 0x80. But it is not doing that.
>
> Here is my simple program where I check the length of encoded integer. For
> example for int = 128 the length should be 2. But the length is 2 beginning from
> int = 256.
>
>
> Am I using correct function or should I use different one?


I think you've misunderstood what the function actually does. It enables you to
create an ASN1_TYPE object based on an input string. An ASN1_TYPE object does
*not* give you the DER encoding of that object. It is an internal representation
of ASN1 data. You can convert it to DER using the i2d_ASN1_TYPE function:

https://www.openssl.org/docs/man1.1.1/man3/i2d_ASN1_TYPE.html

If all you need to do is create a DER encoding of an INTEGER then
ASN1_generate_nconf() is probably overkill. Perhaps simpler would be to create
an ASN1_INTEGER object like this (untested and error checking omitted):

    ASN1_INTEGER *myval = ASN1_INTEGER_new();

    ASN1_INTEGER_set_uint64(myval, 123456);

You can then create the DER encoding of that INTEGER using the i2d_ASN1_INTEGER
function (on the same man page as above).

Matt