Skip to content

Commit 63efaba

Browse files
committed
fix: eigen sig verification
1 parent 65027df commit 63efaba

File tree

1 file changed

+49
-1
lines changed
  • packages/adapters/signers/src/eigen

1 file changed

+49
-1
lines changed

packages/adapters/signers/src/eigen/kms.rs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub struct Signer {
1414
key_id: String,
1515
client: InnerClient,
1616
public_key: rust_eigenda_signers::PublicKey,
17+
k256_verifying_key: VerifyingKey,
1718
}
1819

1920
impl Signer {
@@ -42,6 +43,7 @@ impl Signer {
4243
key_id,
4344
client,
4445
public_key: secp_pub_key,
46+
k256_verifying_key: k256_pub_key,
4547
})
4648
}
4749

@@ -119,6 +121,16 @@ impl Signer {
119121

120122
Ok(encoded_point.as_bytes().to_vec())
121123
}
124+
125+
fn k256_recovery_id(
126+
&self,
127+
signature: &k256::ecdsa::Signature,
128+
message_hash: &[u8; 32],
129+
) -> anyhow::Result<u8> {
130+
signature
131+
.get_recovery_id(message_hash, &self.k256_verifying_key)
132+
.context("Failed to determine recovery ID")
133+
}
122134
}
123135

124136
#[derive(Error, Debug)]
@@ -153,8 +165,13 @@ impl eigenda::Sign for crate::eigen::kms::Signer {
153165

154166
let k256_sig_normalized = k256_sig.normalize_s().unwrap_or(k256_sig);
155167

168+
let k256_recid = self
169+
.k256_recovery_id(&k256_sig_normalized, digest_bytes)
170+
.context("Failed to determine recovery ID")?;
171+
156172
let mut sig: [u8; 65] = [0; 65];
157-
sig.copy_from_slice(k256_sig_normalized.to_bytes().as_ref());
173+
sig[0] = k256_recid;
174+
sig[..64].copy_from_slice(k256_sig_normalized.to_bytes().as_ref());
158175

159176
let standard_recoverable_sig = rust_eigenda_signers::RecoverableSignature::from_bytes(&sig)
160177
.context("Failed to create recoverable signature")?;
@@ -166,3 +183,34 @@ impl eigenda::Sign for crate::eigen::kms::Signer {
166183
self.public_key.into()
167184
}
168185
}
186+
187+
trait RecIdExt {
188+
fn get_recovery_id(
189+
&self,
190+
message_hash: &[u8; 32],
191+
expected_pubkey: &VerifyingKey,
192+
) -> anyhow::Result<u8>;
193+
}
194+
195+
impl RecIdExt for k256::ecdsa::Signature {
196+
fn get_recovery_id(
197+
&self,
198+
message_hash: &[u8; 32],
199+
expected_pubkey: &VerifyingKey,
200+
) -> anyhow::Result<u8> {
201+
(0..2)
202+
.find_map(|id| {
203+
let recovery_id = k256::ecdsa::RecoveryId::from_byte(id)
204+
.with_context(|| format!("Bad RecoveryId byte {}", id))
205+
.ok()?;
206+
207+
let recovered_key =
208+
VerifyingKey::recover_from_prehash(message_hash, self, recovery_id).ok()?;
209+
210+
(&recovered_key == expected_pubkey).then_some(id)
211+
})
212+
.ok_or_else(|| {
213+
anyhow::anyhow!("Could not recover correct public key from k256 signature")
214+
})
215+
}
216+
}

0 commit comments

Comments
 (0)