Skip to content

Commit abdc454

Browse files
authored
Merge pull request #163 from cyyber/master
Parameterized w in WotsParam
2 parents bd8f913 + 102ddbd commit abdc454

File tree

8 files changed

+99
-21
lines changed

8 files changed

+99
-21
lines changed

src/qrl/xmssBase.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
// 32 pub_seed
1717
// 32 root
1818

19-
constexpr size_t SIGNATURE_BASE_SIZE = 4+32+67*32;
19+
//constexpr size_t SIGNATURE_BASE_SIZE = 4+32+67*32;
2020

2121
constexpr size_t XMSS_MAX_HEIGHT=254;
2222

@@ -66,14 +66,22 @@ XmssBase::XmssBase(const TSEED& extended_seed)
6666
_addrFormatType = desc.getAddrFormatType();
6767
}
6868

69-
uint32_t XmssBase::getSignatureSize()
69+
uint32_t XmssBase::calculateSignatureBaseSize(uint32_t wotsParamW) {
70+
wots_params wotsParams;
71+
wots_set_params(&wotsParams, 32, wotsParamW);
72+
return 4 + 32 + wotsParams.keysize;
73+
}
74+
75+
uint32_t XmssBase::getSignatureSize(uint32_t wotsParamW)
7076
{
77+
const uint32_t SIGNATURE_BASE_SIZE = calculateSignatureBaseSize(wotsParamW);
7178
// 4 + n + (len + h) * n)
7279
return static_cast<uint32_t>(SIGNATURE_BASE_SIZE+_height*32);
7380
}
7481

75-
uint8_t XmssBase::getHeightFromSigSize(size_t sigSize)
82+
uint8_t XmssBase::getHeightFromSigSize(size_t sigSize, uint32_t wotsParamW)
7683
{
84+
const uint32_t SIGNATURE_BASE_SIZE = calculateSignatureBaseSize(wotsParamW);
7785
if (sigSize < SIGNATURE_BASE_SIZE)
7886
{
7987
throw std::invalid_argument("Invalid signature size");
@@ -194,14 +202,15 @@ std::vector<uint8_t> XmssBase::getAddress()
194202

195203
bool XmssBase::verify(const TMESSAGE& message,
196204
const TSIGNATURE& signature,
197-
const TKEY& extended_pk)
205+
const TKEY& extended_pk,
206+
uint32_t wotsParamW)
198207
{
199208
try
200209
{
201210
if (extended_pk.size()!=67) {
202211
throw std::invalid_argument("Invalid extended_pk size. It should be 67 bytes");
203212
}
204-
213+
const uint32_t SIGNATURE_BASE_SIZE = calculateSignatureBaseSize(wotsParamW);
205214
if (signature.size()>SIGNATURE_BASE_SIZE+XMSS_MAX_HEIGHT*32)
206215
{
207216
throw std::invalid_argument("invalid signature size. Height<=254");
@@ -213,7 +222,8 @@ bool XmssBase::verify(const TMESSAGE& message,
213222
return false;
214223
}
215224

216-
const auto height = static_cast<const uint8_t> (XmssBase::getHeightFromSigSize(signature.size()));
225+
const auto height = static_cast<const uint8_t> (XmssBase::getHeightFromSigSize(
226+
signature.size(), wotsParamW));
217227

218228
if (height==0 || desc.getHeight()!=height) {
219229
return false;
@@ -223,7 +233,7 @@ bool XmssBase::verify(const TMESSAGE& message,
223233

224234
xmss_params params{};
225235
const uint32_t k = 2;
226-
const uint32_t w = 16;
236+
const uint32_t w = wotsParamW;
227237
const uint32_t n = 32;
228238

229239
if (k>=height || (height-k)%2) {

src/qrl/xmssBase.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ class XmssBase {
4040

4141
static bool verify(const TMESSAGE &message,
4242
const TSIGNATURE &signature,
43-
const TKEY &pk);
43+
const TKEY &pk,
44+
uint32_t wotsParamW=16);
4445

4546
// TODO: Differentiate between XMSS and WOTS+ keys
4647
TKEY getSK();
@@ -75,9 +76,11 @@ class XmssBase {
7576

7677
virtual unsigned int setIndex(uint32_t new_index);
7778

78-
unsigned int getSignatureSize();
79+
unsigned int getSignatureSize(uint32_t wotsParamW=16);
7980

80-
static uint8_t getHeightFromSigSize(size_t sigSize);
81+
static uint32_t calculateSignatureBaseSize(uint32_t wotsParamW=16);
82+
83+
static uint8_t getHeightFromSigSize(size_t sigSize, uint32_t wotsParamW=16);
8184

8285
unsigned int getSecretKeySize();
8386

src/qrl/xmssBasic.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
XmssBasic::XmssBasic(const TSEED &seed,
1010
unsigned char height,
1111
eHashFunction hashFunction,
12-
eAddrFormatType addrFormatType)
12+
eAddrFormatType addrFormatType,
13+
uint32_t wotsParamW)
1314
: XmssBase(seed, height, hashFunction, addrFormatType) {
1415
// PK format
1516
// 32 root address
@@ -31,7 +32,7 @@ XmssBasic::XmssBasic(const TSEED &seed,
3132
}
3233

3334
const uint32_t k = 2;
34-
const uint32_t w = 16;
35+
const uint32_t w = wotsParamW;
3536
const uint32_t n = 32;
3637

3738
if (k >= height || (height - k) % 2) {
@@ -49,7 +50,7 @@ XmssBasic::XmssBasic(const TSEED &seed,
4950

5051

5152
TSIGNATURE XmssBasic::sign(const TMESSAGE &message) {
52-
auto signature = TSIGNATURE(getSignatureSize(), 0);
53+
auto signature = TSIGNATURE(getSignatureSize(params.wots_par.w), 0);
5354

5455
xmss_Signmsg(_hashFunction,
5556
&params,

src/qrl/xmssBasic.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ class XmssBasic : public ::XmssBase {
1919
XmssBasic(const TSEED &seed,
2020
unsigned char height,
2121
eHashFunction hashFunction,
22-
eAddrFormatType addrFormatType);
22+
eAddrFormatType addrFormatType,
23+
uint32_t wotsParamW=16);
2324

2425
TSIGNATURE sign(const TMESSAGE &message) override;
2526
};

src/qrl/xmssFast.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ XmssFast::XmssFast(const TSEED &seed,
1010
eAddrFormatType addrFormatType)
1111
: XmssBase(seed, height, hashFunction, addrFormatType)
1212
{
13-
_initialize_tree();
13+
initialize_tree();
1414
}
1515

1616
XmssFast::XmssFast(const TSEED& extended_seed)
1717
: XmssBase(extended_seed)
1818
{
19-
_initialize_tree();
19+
initialize_tree();
2020
}
2121

22-
void XmssFast::_initialize_tree()
22+
void XmssFast::initialize_tree(uint32_t wotsParamW)
2323
{
2424
_sk = TKEY(132, 0);
2525
auto tmp = TKEY(64, 0);
2626

2727
const uint32_t k = 2;
28-
const uint32_t w = 16;
28+
const uint32_t w = wotsParamW;
2929
const uint32_t n = 32;
3030

3131
if (k >= _height || (_height - k) % 2) {
@@ -78,7 +78,7 @@ unsigned int XmssFast::setIndex(unsigned int new_index)
7878

7979
TSIGNATURE XmssFast::sign(const TMESSAGE &message)
8080
{
81-
auto signature = TSIGNATURE(getSignatureSize(), 0);
81+
auto signature = TSIGNATURE(getSignatureSize(params.wots_par.w), 0);
8282

8383
auto index = getIndex();
8484
setIndex(index);

src/qrl/xmssFast.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
#include <xmss-alt/algsxmss_fast.h>
1111

1212
class XmssFast : public XmssBase {
13-
void _initialize_tree();
1413
public:
14+
void initialize_tree(uint32_t wotsParamW = 16);
1515
XmssFast(const TSEED& seed,
1616
unsigned char height,
1717
eHashFunction hashFunction = eHashFunction::SHAKE_128,

src/xmss-alt/xmss_common.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ int xmss_Verifysig(eHashFunction hash_func,
138138
const unsigned char *pk,
139139
unsigned char h) {
140140

141-
auto sig_msg_len = static_cast<unsigned long long int>(4 + 32 + 67 * 32 + h * 32);
141+
auto sig_msg_len = static_cast<unsigned long long int>(4 + 32 + wotsParams->len * 32 + h * 32);
142142

143143
uint32_t n = wotsParams->n;
144144

tests/cpp/qrl/xmssFast_test.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,69 @@ TEST(XmssFast, Verify)
101101
EXPECT_FALSE(XmssBasic::verify(data, signature, xmss.getPK()));
102102
}
103103

104+
TEST(XmssFast, SignWithW4)
105+
{
106+
std::vector<unsigned char> seed(48, 0);
107+
108+
XmssFast xmss(seed, XMSS_HEIGHT);
109+
xmss.initialize_tree(4);
110+
111+
std::string message = "This is a test message";
112+
std::vector<unsigned char> data(message.begin(), message.end());
113+
EXPECT_EQ(xmss.getIndex(), 0);
114+
115+
auto signature = xmss.sign(data);
116+
117+
std::cout << std::endl;
118+
std::cout << std::endl;
119+
std::cout << "data :" << data.size() << " bytes\n" << bin2hstr(data, 64) << std::endl;
120+
std::cout << "signature :" << signature.size() << " bytes\n" << bin2hstr(signature, 64) << std::endl;
121+
EXPECT_EQ(xmss.getIndex(), 1);
122+
123+
auto signature2 = xmss.sign(data);
124+
125+
std::cout << std::endl;
126+
std::cout << std::endl;
127+
std::cout << "data :" << data.size() << " bytes\n" << bin2hstr(data, 64) << std::endl;
128+
std::cout << "signature :" << signature.size() << " bytes\n" << bin2hstr(signature, 64) << std::endl;
129+
130+
EXPECT_NE(bin2hstr(signature), bin2hstr(signature2));
131+
EXPECT_EQ(xmss.getIndex(), 2);
132+
}
133+
134+
TEST(XmssFast, VerifyWithW4)
135+
{
136+
std::vector<unsigned char> seed(48, 0);
137+
138+
XmssBasic xmss(seed, 10, eHashFunction::SHA2_256,
139+
eAddrFormatType::SHA256_2X, 4);
140+
141+
std::string message = "56454c9621c549cd05c112de496ba32f";
142+
143+
std::vector<unsigned char> data_ref(message.begin(), message.end());
144+
std::vector<unsigned char> data = hstr2bin("56454c9621c549cd05c112de496ba32f");
145+
146+
auto pk = xmss.getPK();
147+
auto sk = xmss.getSK();
148+
std::cout << std::endl;
149+
std::cout << "seed:" << seed.size() << " bytes\n" << bin2hstr(seed, 32) << std::endl;
150+
std::cout << "pk :" << pk.size() << " bytes\n" << bin2hstr(pk, 32) << std::endl;
151+
std::cout << "sk :" << sk.size() << " bytes\n" << bin2hstr(sk, 32) << std::endl;
152+
153+
auto signature = xmss.sign(data);
154+
155+
std::cout << std::endl;
156+
std::cout << std::endl;
157+
std::cout << "data :" << data.size() << " bytes\n" << bin2hstr(data, 64) << std::endl;
158+
std::cout << "signature :" << signature.size() << " bytes\n" << bin2hstr(signature, 64) << std::endl;
159+
160+
EXPECT_TRUE(XmssBasic::verify(data, signature, pk, 4));
161+
EXPECT_FALSE(XmssBasic::verify(data, signature, xmss.getPK()));
162+
163+
signature[1] += 1;
164+
EXPECT_FALSE(XmssBasic::verify(data, signature, xmss.getPK(), 4));
165+
}
166+
104167
TEST(XmssFast, SignIndexShift)
105168
{
106169
std::vector<unsigned char> seed(48, 0);

0 commit comments

Comments
 (0)