34
34
35
35
#include < boost/range/concepts.hpp>
36
36
37
+ #include < nil/crypto3/pubkey/type_traits.hpp>
38
+
37
39
#include < nil/crypto3/pubkey/secret_sharing/pedersen.hpp>
38
- // #include <nil/crypto3/pubkey/secret_sharing/weighted_shamir.hpp>
40
+ #include < nil/crypto3/pubkey/secret_sharing/weighted_shamir.hpp>
39
41
40
42
#include < nil/crypto3/pubkey/keys/private_key.hpp>
43
+ #include < nil/crypto3/pubkey/modes/part_public_key.hpp>
41
44
42
45
#include < nil/crypto3/pubkey/algorithm/deal_shares.hpp>
43
46
#include < nil/crypto3/pubkey/algorithm/deal_share.hpp>
@@ -49,10 +52,9 @@ namespace nil {
49
52
// CoeffIt - coefficients of polynomial
50
53
//
51
54
template <typename Scheme, typename CoeffIt,
52
- typename SecretSharingScheme = typename pubkey::private_key <Scheme>::sss_public_key_group_type>
55
+ typename SecretSharingScheme = typename pubkey::public_key <Scheme>::sss_public_key_group_type>
53
56
inline typename std::enable_if<
54
- std::is_same<pubkey::shamir_sss<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value ||
55
- std::is_same<pubkey::feldman_sss<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value,
57
+ pubkey::is_shamir_sss<SecretSharingScheme>::value || pubkey::is_feldman_sss<SecretSharingScheme>::value,
56
58
std::pair<pubkey::public_key<Scheme>, std::vector<pubkey::private_key<Scheme>>>>::type
57
59
create_key (CoeffIt first, CoeffIt last, std::size_t n) {
58
60
BOOST_CONCEPT_ASSERT ((boost::InputIteratorConcept<CoeffIt>));
@@ -73,10 +75,9 @@ namespace nil {
73
75
// Coeffs - coefficients of polynomial
74
76
//
75
77
template <typename Scheme, typename Coeffs,
76
- typename SecretSharingScheme = typename pubkey::private_key <Scheme>::sss_public_key_group_type>
78
+ typename SecretSharingScheme = typename pubkey::public_key <Scheme>::sss_public_key_group_type>
77
79
inline typename std::enable_if<
78
- std::is_same<pubkey::shamir_sss<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value ||
79
- std::is_same<pubkey::feldman_sss<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value,
80
+ pubkey::is_shamir_sss<SecretSharingScheme>::value || pubkey::is_feldman_sss<SecretSharingScheme>::value,
80
81
std::pair<pubkey::public_key<Scheme>, std::vector<pubkey::private_key<Scheme>>>>::type
81
82
create_key (const Coeffs &r, std::size_t n) {
82
83
BOOST_RANGE_CONCEPT_ASSERT ((boost::SinglePassRangeConcept<const Coeffs>));
@@ -88,10 +89,9 @@ namespace nil {
88
89
// PublicCoeffIt - public representation values of polynomial's coefficients
89
90
//
90
91
template <typename Scheme, typename PublicCoeffIt,
91
- typename SecretSharingScheme = typename pubkey::private_key<Scheme>::sss_public_key_group_type>
92
- inline typename std::enable_if<
93
- std::is_same<pubkey::feldman_sss<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value,
94
- pubkey::private_key<Scheme>>::type
92
+ typename SecretSharingScheme = typename pubkey::public_key<Scheme>::sss_public_key_group_type>
93
+ inline typename std::enable_if<pubkey::is_feldman_sss<SecretSharingScheme>::value,
94
+ pubkey::private_key<Scheme>>::type
95
95
create_key (PublicCoeffIt first, PublicCoeffIt last, const pubkey::share_sss<SecretSharingScheme> &share,
96
96
std::size_t n) {
97
97
BOOST_CONCEPT_ASSERT ((boost::InputIteratorConcept<PublicCoeffIt>));
@@ -104,10 +104,9 @@ namespace nil {
104
104
// PublicCoeffs - public representation values of polynomial's coefficients
105
105
//
106
106
template <typename Scheme, typename PublicCoeffs,
107
- typename SecretSharingScheme = typename pubkey::private_key<Scheme>::sss_public_key_group_type>
108
- inline typename std::enable_if<
109
- std::is_same<pubkey::feldman_sss<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value,
110
- pubkey::private_key<Scheme>>::type
107
+ typename SecretSharingScheme = typename pubkey::public_key<Scheme>::sss_public_key_group_type>
108
+ inline typename std::enable_if<pubkey::is_feldman_sss<SecretSharingScheme>::value,
109
+ pubkey::private_key<Scheme>>::type
111
110
create_key (const PublicCoeffs &r, pubkey::share_sss<SecretSharingScheme> &share, std::size_t n) {
112
111
BOOST_RANGE_CONCEPT_ASSERT ((boost::SinglePassRangeConcept<const PublicCoeffs>));
113
112
return create_key<Scheme>(std::cbegin (r), std::cend (r), share, n);
@@ -118,10 +117,9 @@ namespace nil {
118
117
// ShareIt - shares generated by other participants
119
118
//
120
119
template <typename Scheme, typename PublicCoeffsIt, typename ShareIt,
121
- typename SecretSharingScheme = typename pubkey::private_key<Scheme>::sss_public_key_group_type>
122
- inline typename std::enable_if<
123
- std::is_same<pubkey::pedersen_dkg<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value,
124
- std::pair<pubkey::public_key<Scheme>, pubkey::private_key<Scheme>>>::type
120
+ typename SecretSharingScheme = typename pubkey::public_key<Scheme>::sss_public_key_group_type>
121
+ inline typename std::enable_if<pubkey::is_pedersen_dkg<SecretSharingScheme>::value,
122
+ std::pair<pubkey::public_key<Scheme>, pubkey::private_key<Scheme>>>::type
125
123
create_key (PublicCoeffsIt first1, PublicCoeffsIt last1, ShareIt first2, ShareIt last2, std::size_t n) {
126
124
BOOST_CONCEPT_ASSERT ((boost::InputIteratorConcept<PublicCoeffsIt>));
127
125
BOOST_RANGE_CONCEPT_ASSERT (
@@ -156,10 +154,9 @@ namespace nil {
156
154
// Shares - shares generated by other participants
157
155
//
158
156
template <typename Scheme, typename PublicCoeffsRange, typename Shares,
159
- typename SecretSharingScheme = typename pubkey::private_key<Scheme>::sss_public_key_group_type>
160
- inline typename std::enable_if<
161
- std::is_same<pubkey::pedersen_dkg<typename SecretSharingScheme::group_type>, SecretSharingScheme>::value,
162
- std::pair<pubkey::public_key<Scheme>, pubkey::private_key<Scheme>>>::type
157
+ typename SecretSharingScheme = typename pubkey::public_key<Scheme>::sss_public_key_group_type>
158
+ inline typename std::enable_if<pubkey::is_pedersen_dkg<SecretSharingScheme>::value,
159
+ std::pair<pubkey::public_key<Scheme>, pubkey::private_key<Scheme>>>::type
163
160
create_key (const PublicCoeffsRange &r, const Shares &shares, std::size_t n) {
164
161
BOOST_RANGE_CONCEPT_ASSERT ((boost::SinglePassRangeConcept<const PublicCoeffsRange>));
165
162
BOOST_RANGE_CONCEPT_ASSERT (
@@ -170,57 +167,45 @@ namespace nil {
170
167
return create_key<Scheme>(std::cbegin (r), std::cend (r), std::cbegin (shares), std::cend (shares), n);
171
168
}
172
169
173
- // //
174
- // // CoeffIt - coefficients of polynomial
175
- // // InputIterator2 - participants' weights
176
- // //
177
- // template<typename Scheme, typename CoeffIt, typename WeightsIterator,
178
- // typename SecretSharingScheme = typename pubkey::private_key<Scheme>::sss_public_key_group_type,
179
- // typename ValueType1 = typename std::iterator_traits<CoeffIt>::value_type,
180
- // typename ValueType2 = typename std::iterator_traits<WeightsIterator>::value_type,
181
- // typename SecretSharingScheme::template check_coeff_type<ValueType1> = true,
182
- // typename SecretSharingScheme::template check_weight_type<ValueType2> = true>
183
- // inline typename std::enable_if<
184
- // std::is_same<pubkey::weighted_shamir_sss<typename SecretSharingScheme::group_type>,
185
- // SecretSharingScheme>::value,
186
- // std::pair<pubkey::public_key<Scheme>, std::vector<pubkey::private_key<Scheme>>>>::type
187
- // create_key(CoeffIt first1, CoeffIt last1, WeightsIterator first2, WeightsIterator last2) {
188
- // BOOST_CONCEPT_ASSERT((boost::InputIteratorConcept<CoeffIt>));
189
- // BOOST_CONCEPT_ASSERT((boost::InputIteratorConcept<WeightsIterator>));
190
- //
191
- // using privkeys_type = std::vector<pubkey::private_key<Scheme>>;
192
- // using sss_no_key_ops_type = typename pubkey::private_key<Scheme>::sss_public_key_no_key_ops_type;
193
- //
194
- // typename sss_no_key_ops_type::shares_type shares = nil::crypto3::deal_shares<SecretSharingScheme>(
195
- // first1, last1, first2, last2, std::distance(first2, last2));
196
- // privkeys_type privkeys;
197
- // for (const auto &s : shares) {
198
- // privkeys.emplace_back(s, std::distance(first1, last1));
199
- // }
200
- // auto PK = pubkey::public_key<Scheme>(sss_no_key_ops_type::get_public_coeffs(first1, last1).front(),
201
- // std::distance(first2, last2));
202
- // return std::make_pair(PK, privkeys);
203
- // }
204
- //
205
- // //
206
- // // Coeffs - coefficients of polynomial
207
- // // WeightsRange - participants' weights
208
- // //
209
- // template<typename Scheme, typename Coeffs, typename WeightsRange,
210
- // typename SecretSharingScheme = typename pubkey::private_key<Scheme>::sss_public_key_group_type,
211
- // typename ValueType1 = typename std::iterator_traits<typename Coeffs::iterator>::value_type,
212
- // typename ValueType2 = typename std::iterator_traits<typename WeightsRange::iterator>::value_type,
213
- // typename SecretSharingScheme::template check_coeff_type<ValueType1> = true,
214
- // typename SecretSharingScheme::template check_weight_type<ValueType2> = true>
215
- // inline typename std::enable_if<
216
- // std::is_same<pubkey::weighted_shamir_sss<typename SecretSharingScheme::group_type>,
217
- // SecretSharingScheme>::value,
218
- // std::pair<pubkey::public_key<Scheme>, std::vector<pubkey::private_key<Scheme>>>>::type
219
- // create_key(const Coeffs &r1, const WeightsRange &r2) {
220
- // BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<const Coeffs>));
221
- // BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<const WeightsRange>));
222
- // return create_key<Scheme>(r1.begin(), r1.end(), r2.begin(), r2.end());
223
- // }
170
+ //
171
+ // CoeffIt - coefficients of polynomial
172
+ // InputIterator2 - participants' weights
173
+ //
174
+ template <typename Scheme, typename CoeffIt,
175
+ typename SecretSharingScheme = typename pubkey::public_key<Scheme>::sss_public_key_group_type>
176
+ inline typename std::enable_if<
177
+ pubkey::is_weighted_shamir_sss<SecretSharingScheme>::value,
178
+ std::pair<pubkey::public_key<Scheme>, std::vector<pubkey::private_key<Scheme>>>>::type
179
+ create_key (CoeffIt first1, CoeffIt last1, std::size_t n, const typename SecretSharingScheme::weights_type &weights) {
180
+ BOOST_CONCEPT_ASSERT ((boost::InputIteratorConcept<CoeffIt>));
181
+
182
+ using shares_dealing_mode = typename pubkey::modes::isomorphic<SecretSharingScheme>::template bind<
183
+ pubkey::shares_dealing_policy<SecretSharingScheme>>::type;
184
+
185
+ typename shares_dealing_mode::result_type shares = nil::crypto3::deal_shares<SecretSharingScheme>(
186
+ first1, last1, n, weights);
187
+ std::vector<pubkey::private_key<Scheme>> privkeys;
188
+ for (const auto &s : shares) {
189
+ privkeys.emplace_back (s);
190
+ }
191
+ auto PK = pubkey::public_key<Scheme>(SecretSharingScheme::get_public_coeffs (first1, last1).front ());
192
+ return std::make_pair (PK, privkeys);
193
+ }
194
+
195
+ //
196
+ // Coeffs - coefficients of polynomial
197
+ // WeightsRange - participants' weights
198
+ //
199
+ template <typename Scheme, typename Coeffs,
200
+ typename SecretSharingScheme = typename pubkey::public_key<Scheme>::sss_public_key_group_type>
201
+ inline typename std::enable_if<
202
+ pubkey::is_weighted_shamir_sss<SecretSharingScheme>::value,
203
+ std::pair<pubkey::public_key<Scheme>, std::vector<pubkey::private_key<Scheme>>>>::type
204
+ create_key (const Coeffs &r1, std::size_t n, const typename SecretSharingScheme::weights_type &weights) {
205
+ BOOST_RANGE_CONCEPT_ASSERT ((boost::SinglePassRangeConcept<const Coeffs>));
206
+
207
+ return create_key<Scheme>(std::cbegin (r1), std::cend (r1), n, weights);
208
+ }
224
209
} // namespace crypto3
225
210
} // namespace nil
226
211
0 commit comments