Skip to content

Implementation of cx_bn_cnt_bits function is broken? #460

@aido

Description

@aido

Hi,

I think the implementation of cx_bn_cnt_bits in Speculos may be broken. It is exhibiting some strange behaviour.

I have written the following three tests:

cx_bn_t bn_temp;
CX_CHECK(cx_bn_alloc(&bn_temp, 16));

uint32_t nbits, temp_u32 = 0;

for (uint8_t i = 0; i <= 8; i++) {
    CX_CHECK(cx_bn_set_u32(bn_temp, (uint32_t) i));
    CX_CHECK(cx_bn_cnt_bits(bn_temp, &nbits));
    PRINTF("Test 1: Number of bits set to 1 in number %d is %d\n", i, nbits);
}

for (uint8_t i = 8; i >= 0; i--) {
    CX_CHECK(cx_bn_set_u32(bn_temp, (uint32_t) i));
    CX_CHECK(cx_bn_cnt_bits(bn_temp, &nbits));
    PRINTF("Test 2: Number of bits set to 1 in number %d is %d\n", i, nbits);
}

CX_CHECK(cx_bn_set_u32(bn_temp, (uint32_t) 8));
CX_CHECK(cx_bn_cnt_bits(bn_temp, &nbits));

while (nbits > 0) {
    CX_CHECK(cx_bn_get_u32(bn_temp, &temp_u32));
    PRINTF("Test 3: Number of bits set to 1 in number %d is %d\n", temp_u32, nbits);
    CX_CHECK(cx_bn_shr(bn_temp, 1));
}

Each test results in an infinite loop. It would seem that rather than count the set bits in a Big Num cx_bn_cnt_bits instead calculates the position of the MSB.

09:29:27.929:seproxyhal: printf: Test 1: Number of bits set to 1 in number 0 is -127
09:29:27.931:seproxyhal: printf: Test 1: Number of bits set to 1 in number 1 is 1
09:29:27.932:seproxyhal: printf: Test 1: Number of bits set to 1 in number 2 is 2
09:29:27.934:seproxyhal: printf: Test 1: Number of bits set to 1 in number 3 is 2
09:29:27.935:seproxyhal: printf: Test 1: Number of bits set to 1 in number 4 is 3
09:29:27.936:seproxyhal: printf: Test 1: Number of bits set to 1 in number 5 is 3
09:29:27.938:seproxyhal: printf: Test 1: Number of bits set to 1 in number 6 is 3
09:29:27.939:seproxyhal: printf: Test 1: Number of bits set to 1 in number 7 is 3
09:29:27.941:seproxyhal: printf: Test 1: Number of bits set to 1 in number 8 is 4
09:29:27.942:seproxyhal: printf: Test 2: Number of bits set to 1 in number 8 is 4
09:29:27.943:seproxyhal: printf: Test 2: Number of bits set to 1 in number 7 is 3
09:29:27.945:seproxyhal: printf: Test 2: Number of bits set to 1 in number 6 is 3
09:29:27.946:seproxyhal: printf: Test 2: Number of bits set to 1 in number 5 is 3
09:29:27.947:seproxyhal: printf: Test 2: Number of bits set to 1 in number 4 is 3
09:29:27.949:seproxyhal: printf: Test 2: Number of bits set to 1 in number 3 is 2
09:29:27.950:seproxyhal: printf: Test 2: Number of bits set to 1 in number 2 is 2
09:29:27.952:seproxyhal: printf: Test 2: Number of bits set to 1 in number 1 is 1
09:29:27.953:seproxyhal: printf: Test 2: Number of bits set to 1 in number 0 is 0
09:29:27.954:seproxyhal: printf: Test 2: Number of bits set to 1 in number 255 is 8
09:29:27.956:seproxyhal: printf: Test 2: Number of bits set to 1 in number 254 is 8
09:29:27.957:seproxyhal: printf: Test 2: Number of bits set to 1 in number 253 is 8
09:29:27.959:seproxyhal: printf: Test 2: Number of bits set to 1 in number 252 is 8
09:29:27.960:seproxyhal: printf: Test 2: Number of bits set to 1 in number 251 is 8
09:29:27.962:seproxyhal: printf: Test 2: Number of bits set to 1 in number 250 is 8
09:29:27.963:seproxyhal: printf: Test 2: Number of bits set to 1 in number 249 is 8
09:29:27.965:seproxyhal: printf: Test 2: Number of bits set to 1 in number 248 is 8
09:29:27.966:seproxyhal: printf: Test 2: Number of bits set to 1 in number 247 is 8
09:29:27.967:seproxyhal: printf: Test 2: Number of bits set to 1 in number 246 is 8
09:29:27.969:seproxyhal: printf: Test 2: Number of bits set to 1 in number 245 is 8
.
.
.
09:36:07.109:seproxyhal: printf: Test 2: Number of bits set to 1 in number 8 is 4
09:36:07.110:seproxyhal: printf: Test 2: Number of bits set to 1 in number 7 is 3
09:36:07.112:seproxyhal: printf: Test 2: Number of bits set to 1 in number 6 is 3
09:36:07.113:seproxyhal: printf: Test 2: Number of bits set to 1 in number 5 is 3
09:36:07.114:seproxyhal: printf: Test 2: Number of bits set to 1 in number 4 is 3
09:36:07.116:seproxyhal: printf: Test 2: Number of bits set to 1 in number 3 is 2
09:36:07.117:seproxyhal: printf: Test 2: Number of bits set to 1 in number 2 is 2
09:36:07.119:seproxyhal: printf: Test 2: Number of bits set to 1 in number 1 is 1
09:36:07.120:seproxyhal: printf: Test 2: Number of bits set to 1 in number 0 is 0
09:36:07.109:seproxyhal: printf: Test 2: Number of bits set to 1 in number 255 is 8
09:36:07.123:seproxyhal: printf: Test 2: Number of bits set to 1 in number 254 is 8
09:36:07.124:seproxyhal: printf: Test 2: Number of bits set to 1 in number 253 is 8
09:36:07.126:seproxyhal: printf: Test 2: Number of bits set to 1 in number 252 is 8
09:36:07.127:seproxyhal: printf: Test 2: Number of bits set to 1 in number 251 is 8
09:36:07.129:seproxyhal: printf: Test 2: Number of bits set to 1 in number 250 is 8
09:36:07.130:seproxyhal: printf: Test 2: Number of bits set to 1 in number 249 is 8
09:36:07.131:seproxyhal: printf: Test 2: Number of bits set to 1 in number 248 is 8
09:36:07.133:seproxyhal: printf: Test 2: Number of bits set to 1 in number 247 is 8
.
.
.
09:41:28.614:seproxyhal: printf: Test 3: Number of bits set to 1 in number 8 is 4
09:41:28.615:seproxyhal: printf: Test 3: Number of bits set to 1 in number 4 is 4
09:41:28.617:seproxyhal: printf: Test 3: Number of bits set to 1 in number 2 is 4
09:41:28.618:seproxyhal: printf: Test 3: Number of bits set to 1 in number 1 is 4
09:41:28.619:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.609:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.622:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.623:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.625:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.626:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.628:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.629:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.630:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
09:41:28.632:seproxyhal: printf: Test 3: Number of bits set to 1 in number 0 is 4
.
.
.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions