Skip to content

Commit 0ba85e3

Browse files
committed
fix: re-add removed BignumPointer::bitLength()
1 parent 27819e8 commit 0ba85e3

3 files changed

Lines changed: 84 additions & 0 deletions

File tree

include/ncrypto.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,7 @@ class BignumPointer final {
688688
unsigned long getWord() const; // NOLINT(runtime/int)
689689

690690
size_t byteLength() const;
691+
size_t bitLength() const;
691692

692693
DataPointer toHex() const;
693694
DataPointer encode() const;

src/ncrypto.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,11 @@ size_t BignumPointer::byteLength() const {
351351
return BN_num_bytes(bn_.get());
352352
}
353353

354+
size_t BignumPointer::bitLength() const {
355+
if (bn_ == nullptr) return 0;
356+
return BN_num_bits(bn_.get());
357+
}
358+
354359
DataPointer BignumPointer::encode() const {
355360
return EncodePadded(bn_.get(), byteLength());
356361
}

tests/basic.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,84 @@ TEST(basic, cipher_foreach) {
4444
foundCiphers.count("AES-256-CBC"));
4545
}
4646

47+
TEST(BignumPointer, bitLength) {
48+
// Test empty/null BignumPointer
49+
BignumPointer empty;
50+
ASSERT_EQ(empty.bitLength(), 0);
51+
52+
// Test zero value
53+
auto zero = BignumPointer::New();
54+
ASSERT_TRUE(zero);
55+
ASSERT_TRUE(zero.setWord(0));
56+
ASSERT_EQ(zero.bitLength(), 0);
57+
58+
// Test value 1 (1 bit)
59+
auto one = BignumPointer::New();
60+
ASSERT_TRUE(one);
61+
ASSERT_TRUE(one.setWord(1));
62+
ASSERT_EQ(one.bitLength(), 1);
63+
64+
// Test value 2 (2 bits: 10 in binary)
65+
auto two = BignumPointer::New();
66+
ASSERT_TRUE(two);
67+
ASSERT_TRUE(two.setWord(2));
68+
ASSERT_EQ(two.bitLength(), 2);
69+
70+
// Test value 255 (8 bits: 11111111 in binary)
71+
auto byte = BignumPointer::New();
72+
ASSERT_TRUE(byte);
73+
ASSERT_TRUE(byte.setWord(255));
74+
ASSERT_EQ(byte.bitLength(), 8);
75+
76+
// Test value 256 (9 bits: 100000000 in binary)
77+
auto nineBits = BignumPointer::New();
78+
ASSERT_TRUE(nineBits);
79+
ASSERT_TRUE(nineBits.setWord(256));
80+
ASSERT_EQ(nineBits.bitLength(), 9);
81+
82+
// Test larger value (0xFFFFFFFF = 32 bits)
83+
auto thirtyTwoBits = BignumPointer::New();
84+
ASSERT_TRUE(thirtyTwoBits);
85+
ASSERT_TRUE(thirtyTwoBits.setWord(0xFFFFFFFF));
86+
ASSERT_EQ(thirtyTwoBits.bitLength(), 32);
87+
}
88+
89+
TEST(BignumPointer, byteLength) {
90+
// Test empty/null BignumPointer
91+
BignumPointer empty;
92+
ASSERT_EQ(empty.byteLength(), 0);
93+
94+
// Test zero value
95+
auto zero = BignumPointer::New();
96+
ASSERT_TRUE(zero);
97+
ASSERT_TRUE(zero.setWord(0));
98+
ASSERT_EQ(zero.byteLength(), 0);
99+
100+
// Test value 1 (1 byte)
101+
auto one = BignumPointer::New();
102+
ASSERT_TRUE(one);
103+
ASSERT_TRUE(one.setWord(1));
104+
ASSERT_EQ(one.byteLength(), 1);
105+
106+
// Test value 255 (1 byte)
107+
auto byte = BignumPointer::New();
108+
ASSERT_TRUE(byte);
109+
ASSERT_TRUE(byte.setWord(255));
110+
ASSERT_EQ(byte.byteLength(), 1);
111+
112+
// Test value 256 (2 bytes)
113+
auto twoBytes = BignumPointer::New();
114+
ASSERT_TRUE(twoBytes);
115+
ASSERT_TRUE(twoBytes.setWord(256));
116+
ASSERT_EQ(twoBytes.byteLength(), 2);
117+
118+
// Test larger value (0xFFFFFFFF = 4 bytes)
119+
auto fourBytes = BignumPointer::New();
120+
ASSERT_TRUE(fourBytes);
121+
ASSERT_TRUE(fourBytes.setWord(0xFFFFFFFF));
122+
ASSERT_EQ(fourBytes.byteLength(), 4);
123+
}
124+
47125
#ifdef OPENSSL_IS_BORINGSSL
48126
TEST(basic, chacha20_poly1305) {
49127
unsigned char key[] = {0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03,

0 commit comments

Comments
 (0)