rippled
Loading...
Searching...
No Matches
PreimageSha256_test.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2016 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <xrpld/conditions/Condition.h>
21#include <xrpld/conditions/Fulfillment.h>
22#include <xrpld/conditions/detail/PreimageSha256.h>
23
24#include <xrpl/basics/Buffer.h>
25#include <xrpl/basics/Slice.h>
26#include <xrpl/basics/StringUtilities.h>
27#include <xrpl/basics/strHex.h>
28#include <xrpl/beast/unit_test.h>
29
30#include <algorithm>
31#include <string>
32#include <utility>
33#include <vector>
34
35namespace ripple {
36namespace cryptoconditions {
37
39{
40 inline Buffer
42 {
43 auto blob = strUnHex(s);
44 BEAST_EXPECT(blob);
45 return {blob->data(), blob->size()};
46 }
47
48 void
50 {
51 testcase("Known Vectors");
52
54 {"A0028000",
55 "A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7"
56 "852B855810100"},
57 {"A0058003616161",
58 "A02580209834876DCFB05CB167A5C24953EBA58C4AC89B1ADF57F28F2F9D09AF1"
59 "07EE8F0810103"},
60 };
61
63
64 auto f1 = Fulfillment::deserialize(hexblob(known[0].first), ec);
65 BEAST_EXPECT(f1);
66 BEAST_EXPECT(!ec);
67
68 auto c1 = Condition::deserialize(hexblob(known[0].second), ec);
69 BEAST_EXPECT(c1);
70 BEAST_EXPECT(!ec);
71
72 auto f2 = Fulfillment::deserialize(hexblob(known[1].first), ec);
73 BEAST_EXPECT(f2);
74 BEAST_EXPECT(!ec);
75
76 auto c2 = Condition::deserialize(hexblob(known[1].second), ec);
77 BEAST_EXPECT(c2);
78 BEAST_EXPECT(!ec);
79
80 // Check equality and inequality
81 BEAST_EXPECT(f1->condition() == *c1);
82 BEAST_EXPECT(f1->condition() != *c2);
83 BEAST_EXPECT(f2->condition() == *c2);
84 BEAST_EXPECT(f2->condition() != *c1);
85 BEAST_EXPECT(*c1 != *c2);
86 BEAST_EXPECT(*c1 == *c1);
87 BEAST_EXPECT(f1->condition() == f1->condition());
88
89 // Should validate with the empty string
90 BEAST_EXPECT(validate(*f1, *c1));
91 BEAST_EXPECT(validate(*f2, *c2));
92
93 // And with any string - the message doesn't matter for PrefixSha256
94 BEAST_EXPECT(validate(*f1, *c1, makeSlice(known[0].first)));
95 BEAST_EXPECT(validate(*f1, *c1, makeSlice(known[0].second)));
96 BEAST_EXPECT(validate(*f2, *c2, makeSlice(known[0].first)));
97 BEAST_EXPECT(validate(*f2, *c2, makeSlice(known[0].second)));
98
99 // Shouldn't validate if the fulfillment & condition don't match
100 // regardless of the message.
101 BEAST_EXPECT(!validate(*f2, *c1));
102 BEAST_EXPECT(!validate(*f2, *c1, makeSlice(known[0].first)));
103 BEAST_EXPECT(!validate(*f2, *c1, makeSlice(known[0].second)));
104 BEAST_EXPECT(!validate(*f1, *c2));
105 BEAST_EXPECT(!validate(*f1, *c2, makeSlice(known[0].first)));
106 BEAST_EXPECT(!validate(*f1, *c2, makeSlice(known[0].second)));
107 }
108
109 void
111 {
112 testcase("Other Types");
113
114 std::pair<std::string, std::string> const others[] = {
115 // PREFIX + PREIMAGE:
116 {"A10B8000810100A204A0028000",
117
118 "A12A8020BB1AC5260C0141B7E54B26EC2330637C5597BF811951AC09E744AD20F"
119 "F77E287810204"
120 "0082020780"},
121
122 // THRESHOLD:
123 {"A208A004A0028000A100",
124
125 "A22A8020B4B84136DF48A71D73F4985C04C6767A778ECB65BA7023B4506823BEE"
126 "E7631B9810204"
127 "0082020780"},
128
129 // RSA:
130 {"A382020880820100E1EF8B24D6F76B09C81ED7752AA262F044F04A874D43809D3"
131 "1CEA612F99B0C97"
132 "A8B4374153E3EEF3D66616843E0E41C293264B71B6173DB1CF0D6CD558C586577"
133 "06FCF097F704C48"
134 "3E59CBFDFD5B3EE7BC80D740C5E0F047F3E85FC0D75815776A6F3F23C5DC5E797"
135 "139A6882E38336A"
136 "4A5FB36137620FF3663DBAE328472801862F72F2F87B202B9C89ADD7CD5B0A076"
137 "F7C53E35039F67E"
138 "D17EC815E5B4305CC63197068D5E6E579BA6DE5F4E3E57DF5E4E072FF2CE4C66E"
139 "B45233973875275"
140 "9639F0257BF57DBD5C443FB5158CCE0A3D36ADC7BA01F33A0BB6DBB2BF989D607"
141 "112F2344D993E77"
142 "E563C1D361DEDF57DA96EF2CFC685F002B638246A5B309B981820100BD42D6569"
143 "F6599AED455F96B"
144 "C0ED08ED1480BF36CD9E1467F9C6F74461C9E3A749334B2F6404AA5F9F6BAFE76"
145 "C347D069250B35D"
146 "1C970C793059EE733A8193F30FA78FEC7CAE459E3DDFD7633805D476940D0CB53"
147 "D7FB389DCDAEAF6"
148 "E8CF48C4B5635430E4F2BCDFE505C2C0FC17B40D93C7EDB7C261EBF43895A705E"
149 "024AA0549A660F7"
150 "0A32150647522DBE6B63520497CFF8F8D5D74768A27C5B86E580BE3FCDC96F197"
151 "6293CBA0D58DFC6"
152 "0B518B632A6DC1E950C43E231FE1A379AA6DDCC52C70EDF851C6C0123A964261C"
153 "FDB3857CD6CD5AD"
154 "C37D8DA2CC924EDAE1D84CF6124587F274C1FA3697DA2901F0269F03B243C03B6"
155 "14E0385E1961FAC"
156 "5000F9BB",
157
158 "A3258020484950515253545548495051525354554849505152535455484950515"
159 "2535455810101"},
160
161 // ED25519:
162 {"A4648020D75A980182B10AB7D54BFED3C964073A0EE172F3DAA62325AF021A68F"
163 "707511A8140E556"
164 "4300C360AC729086E2CC806E828A84877F1EB8E5D974D873E065224901555FB88"
165 "21590A33BACC61E"
166 "39701CF9B46BD25BF5F0595BBE24655141438E7A100B",
167
168 "A4278020799239ABA8FC4FF7EABFBC4C44E69E8BDFED993324E12ED64792ABE28"
169 "9CF1D5F810302"
170 "0000"}};
171
172 for (auto x : others)
173 {
175
176 BEAST_EXPECT(!Fulfillment::deserialize(hexblob(x.first), ec));
177 BEAST_EXPECT(!Condition::deserialize(hexblob(x.second), ec));
178 }
179 }
180
181 void
182 run() override
183 {
186 }
187};
188
189BEAST_DEFINE_TESTSUITE(PreimageSha256, conditions, ripple);
190
191} // namespace cryptoconditions
192
193} // namespace ripple
A testsuite class.
Definition: suite.h:55
testcase_t testcase
Memberspace for declaring test cases.
Definition: suite.h:155
Like std::vector<char> but better.
Definition: Buffer.h:35
static std::unique_ptr< Condition > deserialize(Slice s, std::error_code &ec)
Load a condition from its binary form.
Definition: Condition.cpp:148
bool validate(Fulfillment const &f, Condition const &c, Slice m)
Verify if the given message satisfies the fulfillment.
Definition: Fulfillment.cpp:44
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:244
static std::unique_ptr< Fulfillment > deserialize(Slice s, std::error_code &ec)
Load a fulfillment from its binary form.
Definition: Fulfillment.cpp:56