Skip to content

Commit b453100

Browse files
authored
Merge pull request #106 from dfns/udigest_as
Use `#[udigest(as = ...)]` attribute
2 parents e2c9cad + e23898b commit b453100

File tree

16 files changed

+148
-172
lines changed

16 files changed

+148
-172
lines changed

.github/workflows/rust.yml

+1-16
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ on:
99
env:
1010
CARGO_TERM_COLOR: always
1111
CARGO_NET_GIT_FETCH_WITH_CLI: true
12+
RUSTFLAGS: -D warnings
1213

1314
jobs:
1415
build:
@@ -125,22 +126,6 @@ jobs:
125126
with:
126127
header: bench
127128
path: pr-comment
128-
129-
check-publish:
130-
runs-on: ubuntu-latest
131-
strategy:
132-
matrix:
133-
package:
134-
- key-share
135-
- cggmp21-keygen
136-
- cggmp21
137-
steps:
138-
- uses: actions/checkout@v3
139-
- uses: Swatinem/rust-cache@v2
140-
with:
141-
cache-on-failure: "true"
142-
- name: Dry-run publish
143-
run: cargo publish --dry-run -p ${{ matrix.package }}
144129
check-changelog:
145130
runs-on: ubuntu-latest
146131
steps:

Cargo.lock

+11-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ cggmp21 = { version = "0.4", path = "cggmp21" }
1515
cggmp21-keygen = { version = "0.3", path = "cggmp21-keygen" }
1616
key-share = { version = "0.4", path = "key-share", default-features = false }
1717

18-
generic-ec = { version = "0.4", default-features = false }
19-
generic-ec-zkp = { version = "0.4", default-features = false }
18+
generic-ec = { version = "0.4.1", default-features = false }
19+
generic-ec-zkp = { version = "0.4.1", default-features = false }
2020
round-based = { version = "0.3", default-features = false }
2121

22-
paillier-zk = "0.4"
23-
udigest = { version = "0.2", default-features = false }
22+
paillier-zk = "0.4.1"
23+
udigest = { version = "0.2.1", default-features = false }
2424

2525
digest = { version = "0.10", default-features = false }
2626
sha2 = { version = "0.10", default-features = false }

cggmp21-keygen/src/non_threshold.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ pub struct MsgRound2<E: Curve, L: SecurityLevel> {
6868
/// Party contribution to chain code
6969
#[cfg(feature = "hd-wallets")]
7070
#[serde_as(as = "Option<utils::HexOrBin>")]
71-
#[udigest(with = utils::encoding::maybe_bytes)]
71+
#[udigest(as = Option<udigest::Bytes>)]
7272
pub chain_code: Option<slip_10::ChainCode>,
7373
/// $u_i$
7474
#[serde(with = "hex::serde")]

cggmp21-keygen/src/threshold.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ pub struct MsgRound2Broad<E: Curve, L: SecurityLevel> {
7171
/// Party contribution to chain code
7272
#[cfg(feature = "hd-wallets")]
7373
#[serde_as(as = "Option<utils::HexOrBin>")]
74-
#[udigest(with = utils::encoding::maybe_bytes)]
74+
#[udigest(as = Option<udigest::Bytes>)]
7575
pub chain_code: Option<slip_10::ChainCode>,
7676
/// $u_i$
7777
#[serde(with = "hex::serde")]

cggmp21-keygen/src/utils.rs

+1-12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ where
2525
/// In the future we might want to replace the data_message and proof_message
2626
/// with a generic vec of messages.
2727
#[derive(Debug)]
28+
#[allow(dead_code)] // removes false-positive warnings
2829
pub struct AbortBlame {
2930
/// Party which can be blamed for breaking the protocol
3031
pub faulty_party: PartyIndex,
@@ -89,15 +90,3 @@ where
8990
pub fn iter_peers(i: u16, n: u16) -> impl Iterator<Item = u16> {
9091
(0..n).filter(move |x| *x != i)
9192
}
92-
93-
/// Unambiguous encoding for different types for which it was not defined
94-
pub mod encoding {
95-
#[cfg(feature = "hd-wallets")]
96-
pub fn maybe_bytes<B: udigest::Buffer>(
97-
m: &Option<impl AsRef<[u8]>>,
98-
encoder: udigest::encoding::EncodeValue<B>,
99-
) {
100-
use udigest::Digestable;
101-
m.as_ref().map(udigest::Bytes).unambiguously_encode(encoder)
102-
}
103-
}

cggmp21/src/key_refresh/aux_only.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ pub struct MsgRound1<D: Digest> {
6565
#[serde(bound = "")]
6666
pub struct MsgRound2<L: SecurityLevel> {
6767
/// $N_i$
68-
#[udigest(with = utils::encoding::integer)]
68+
#[udigest(as = utils::encoding::Integer)]
6969
pub N: Integer,
7070
/// $s_i$
71-
#[udigest(with = utils::encoding::integer)]
71+
#[udigest(as = utils::encoding::Integer)]
7272
pub s: Integer,
7373
/// $t_i$
74-
#[udigest(with = utils::encoding::integer)]
74+
#[udigest(as = utils::encoding::Integer)]
7575
pub t: Integer,
7676
/// $\hat \psi_i$
7777
// this should be L::M instead, but no rustc support yet

cggmp21/src/key_refresh/non_threshold.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@ pub struct MsgRound2<E: Curve, L: SecurityLevel> {
7777
/// $\vec A_i$
7878
pub sch_commits_a: Vec<schnorr_pok::Commit<E>>,
7979
/// $N_i$
80-
#[udigest(with = utils::encoding::integer)]
80+
#[udigest(as = utils::encoding::Integer)]
8181
pub N: Integer,
8282
/// $s_i$
83-
#[udigest(with = utils::encoding::integer)]
83+
#[udigest(as = utils::encoding::Integer)]
8484
pub s: Integer,
8585
/// $t_i$
86-
#[udigest(with = utils::encoding::integer)]
86+
#[udigest(as = utils::encoding::Integer)]
8787
pub t: Integer,
8888
/// $\hat \psi_i$
8989
// this should be L::M instead, but no rustc support yet

cggmp21/src/key_share.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::ops;
44
use std::sync::Arc;
55

6-
use generic_ec::{Curve, NonZero, Point, SecretScalar};
6+
use generic_ec::{Curve, NonZero, Point};
77
use paillier_zk::paillier_encryption_in_range as π_enc;
88
use paillier_zk::rug::{Complete, Integer};
99
use serde::{Deserialize, Serialize};
@@ -346,7 +346,7 @@ impl<E: Curve, T: AsRef<IncompleteKeyShare<E>>> AnyKeyShare<E> for T {}
346346
#[cfg(feature = "spof")]
347347
pub fn reconstruct_secret_key<E: Curve>(
348348
key_shares: &[impl AnyKeyShare<E>],
349-
) -> Result<SecretScalar<E>, ReconstructError> {
349+
) -> Result<generic_ec::SecretScalar<E>, ReconstructError> {
350350
key_share::reconstruct_secret_key(key_shares)
351351
}
352352

cggmp21/src/signing.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,10 @@ pub mod msg {
153153
#[udigest(tag = prefixed!("round1"))]
154154
pub struct MsgRound1a {
155155
/// $K_i$
156-
#[udigest(with = utils::encoding::integer)]
156+
#[udigest(as = utils::encoding::Integer)]
157157
pub K: fast_paillier::Ciphertext,
158158
/// $G_i$
159-
#[udigest(with = utils::encoding::integer)]
159+
#[udigest(as = utils::encoding::Integer)]
160160
pub G: fast_paillier::Ciphertext,
161161
}
162162

cggmp21/src/utils.rs

+8-16
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ where
6464
/// In the future we might want to replace the data_message and proof_message
6565
/// with a generic vec of messages.
6666
#[derive(Debug)]
67+
#[allow(dead_code)] // removes false-positive warnings
6768
pub struct AbortBlame {
6869
/// Party which can be blamed for breaking the protocol
6970
pub faulty_party: PartyIndex,
@@ -218,22 +219,13 @@ pub fn generate_blum_prime(rng: &mut impl rand_core::RngCore, bits_size: u32) ->
218219
pub mod encoding {
219220
use paillier_zk::rug;
220221

221-
pub fn integer<B: udigest::Buffer>(
222-
x: &rug::Integer,
223-
encoder: udigest::encoding::EncodeValue<B>,
224-
) {
225-
encoder
226-
.encode_leaf()
227-
.chain(x.to_digits(rug::integer::Order::Msf));
228-
}
229-
230-
pub fn integers_list<B: udigest::Buffer>(
231-
list: impl AsRef<[rug::Integer]>,
232-
encoder: udigest::encoding::EncodeValue<B>,
233-
) {
234-
let mut encoder = encoder.encode_list();
235-
for x in list.as_ref() {
236-
integer(x, encoder.add_item())
222+
pub struct Integer;
223+
impl udigest::DigestAs<rug::Integer> for Integer {
224+
fn digest_as<B: udigest::Buffer>(
225+
x: &rug::Integer,
226+
encoder: udigest::encoding::EncodeValue<B>,
227+
) {
228+
encoder.encode_leaf_value(x.to_digits(rug::integer::Order::Msf))
237229
}
238230
}
239231
}

cggmp21/src/zk/ring_pedersen_parameters.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ struct Challenge<const M: usize> {
1717
/// Data to construct proof about
1818
#[derive(Clone, Copy, udigest::Digestable)]
1919
pub struct Data<'a> {
20-
#[udigest(with = crate::utils::encoding::integer)]
20+
#[udigest(as = &crate::utils::encoding::Integer)]
2121
pub N: &'a Integer,
22-
#[udigest(with = crate::utils::encoding::integer)]
22+
#[udigest(as = &crate::utils::encoding::Integer)]
2323
pub s: &'a Integer,
24-
#[udigest(with = crate::utils::encoding::integer)]
24+
#[udigest(as = &crate::utils::encoding::Integer)]
2525
pub t: &'a Integer,
2626
}
2727

@@ -34,10 +34,10 @@ pub struct Data<'a> {
3434
#[derive(Clone, Serialize, Deserialize, udigest::Digestable)]
3535
pub struct Proof<const M: usize> {
3636
#[serde_as(as = "[_; M]")]
37-
#[udigest(with = crate::utils::encoding::integers_list)]
37+
#[udigest(as = [crate::utils::encoding::Integer; M])]
3838
pub commitment: [Integer; M],
3939
#[serde_as(as = "[_; M]")]
40-
#[udigest(with = crate::utils::encoding::integers_list)]
40+
#[udigest(as = [crate::utils::encoding::Integer; M])]
4141
pub zs: [Integer; M],
4242
}
4343

@@ -51,7 +51,7 @@ fn derive_challenge<const M: usize, D: Digest>(
5151
struct Seed<'a, S: udigest::Digestable, const M: usize> {
5252
shared_state: &'a S,
5353
data: Data<'a>,
54-
#[udigest(with = crate::utils::encoding::integers_list)]
54+
#[udigest(as = &[crate::utils::encoding::Integer; M])]
5555
commitment: &'a [Integer; M],
5656
}
5757

key-share/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ pub struct DirtyKeyInfo<E: Curve> {
204204
// `crate::serde_fix` as well!
205205
//
206206
/// Guard that ensures curve consistency for deseraization
207-
#[cfg_attr(feature = "udigest", udigest(with = utils::encoding::curve_name))]
207+
#[cfg_attr(feature = "udigest", udigest(as = utils::encoding::CurveName))]
208208
pub curve: CurveName<E>,
209209
/// Public key corresponding to shared secret key. Corresponds to _X_ in paper.
210210
#[cfg_attr(feature = "serde", serde(with = "As::<generic_ec::serde::Compact>"))]
@@ -231,7 +231,7 @@ pub struct DirtyKeyInfo<E: Curve> {
231231
serde(skip_serializing_if = "Option::is_none"),
232232
serde(with = "As::<Option<utils::HexOrBin>>")
233233
)]
234-
#[cfg_attr(feature = "udigest", udigest(with = utils::encoding::maybe_bytes))]
234+
#[cfg_attr(feature = "udigest", udigest(as = Option<udigest::Bytes>))]
235235
pub chain_code: Option<slip_10::ChainCode>,
236236
}
237237

key-share/src/utils.rs

+8-14
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,14 @@ use hex as _;
1212

1313
#[cfg(feature = "udigest")]
1414
pub mod encoding {
15-
pub fn curve_name<B: udigest::Buffer, E: generic_ec::Curve>(
16-
_value: &generic_ec::serde::CurveName<E>,
17-
encoder: udigest::encoding::EncodeValue<B>,
18-
) {
19-
encoder.encode_leaf_value(E::CURVE_NAME)
20-
}
21-
22-
#[cfg(feature = "hd-wallets")]
23-
pub fn maybe_bytes<B: udigest::Buffer>(
24-
m: &Option<impl AsRef<[u8]>>,
25-
encoder: udigest::encoding::EncodeValue<B>,
26-
) {
27-
use udigest::Digestable;
28-
m.as_ref().map(udigest::Bytes).unambiguously_encode(encoder)
15+
pub struct CurveName;
16+
impl<E: generic_ec::Curve> udigest::DigestAs<generic_ec::serde::CurveName<E>> for CurveName {
17+
fn digest_as<B: udigest::Buffer>(
18+
_value: &generic_ec::serde::CurveName<E>,
19+
encoder: udigest::encoding::EncodeValue<B>,
20+
) {
21+
encoder.encode_leaf_value(E::CURVE_NAME)
22+
}
2923
}
3024
}
3125

0 commit comments

Comments
 (0)