Skip to content

Commit 1ca698d

Browse files
feat: Make AsyncRawSignatureValidator available on all platforms (#800)
(When OpenSSL is used, it's just a wrapper around the synchronous code path.)
1 parent 690ed5c commit 1ca698d

File tree

8 files changed

+69
-41
lines changed

8 files changed

+69
-41
lines changed

internal/crypto/src/raw_signature/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ pub(crate) mod oids;
2323

2424
mod validator;
2525
pub use validator::{
26-
validator_for_sig_and_hash_algs, validator_for_signing_alg, RawSignatureValidationError,
27-
RawSignatureValidator,
26+
async_validator_for_signing_alg, validator_for_sig_and_hash_algs, validator_for_signing_alg,
27+
AsyncRawSignatureValidator, RawSignatureValidationError, RawSignatureValidator,
2828
};

internal/crypto/src/raw_signature/validator.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
// specific language governing permissions and limitations under
1212
// each license.
1313

14+
use async_trait::async_trait;
1415
use bcder::Oid;
1516
use thiserror::Error;
1617

@@ -34,6 +35,31 @@ pub trait RawSignatureValidator {
3435
) -> Result<(), RawSignatureValidationError>;
3536
}
3637

38+
/// An `AsyncRawSignatureValidator` implementation checks a signature encoded
39+
/// using a specific signature algorithm and a private/public key pair.
40+
///
41+
/// IMPORTANT: This signature is typically embedded in a wrapper provided by
42+
/// another signature mechanism. In the C2PA ecosystem, this wrapper is
43+
/// typically COSE, but `AsyncRawSignatureValidator` does not implement COSE.
44+
///
45+
/// The WASM implementation of `c2pa-crypto` also implements
46+
/// [`RawSignatureValidator`] (the synchronous version), but some encryption
47+
/// algorithms are not fully supported. When possible, it's preferable to use
48+
/// this implementation.
49+
///
50+
/// [`RawSignatureValidator`]: crate::raw_signature::RawSignatureValidator
51+
#[async_trait(?Send)]
52+
pub trait AsyncRawSignatureValidator {
53+
/// Return `true` if the signature `sig` is valid for the raw content `data`
54+
/// and the public key `public_key`.
55+
async fn validate_async(
56+
&self,
57+
sig: &[u8],
58+
data: &[u8],
59+
public_key: &[u8],
60+
) -> Result<(), RawSignatureValidationError>;
61+
}
62+
3763
/// Return a built-in signature validator for the requested signature
3864
/// algorithm.
3965
///
@@ -54,6 +80,24 @@ pub fn validator_for_signing_alg(alg: SigningAlg) -> Option<Box<dyn RawSignature
5480
None
5581
}
5682

83+
/// Return a built-in signature validator for the requested signature
84+
/// algorithm.
85+
///
86+
/// Which validators are available may vary depending on the platform and
87+
/// which crate features were enabled.
88+
pub fn async_validator_for_signing_alg(
89+
alg: SigningAlg,
90+
) -> Option<Box<dyn AsyncRawSignatureValidator>> {
91+
#[cfg(target_arch = "wasm32")]
92+
if let Some(validator) = crate::webcrypto::async_validator_for_signing_alg(alg) {
93+
return Some(validator);
94+
}
95+
96+
Some(Box::new(AsyncValidatorAdapter(validator_for_signing_alg(
97+
alg,
98+
)?)))
99+
}
100+
57101
/// Return a built-in signature validator for the requested signature
58102
/// algorithm as identified by OID.
59103
///
@@ -165,3 +209,17 @@ impl From<crate::webcrypto::WasmCryptoError> for RawSignatureValidationError {
165209
}
166210
}
167211
}
212+
213+
struct AsyncValidatorAdapter(Box<dyn RawSignatureValidator>);
214+
215+
#[async_trait(?Send)]
216+
impl AsyncRawSignatureValidator for AsyncValidatorAdapter {
217+
async fn validate_async(
218+
&self,
219+
sig: &[u8],
220+
data: &[u8],
221+
public_key: &[u8],
222+
) -> Result<(), RawSignatureValidationError> {
223+
self.0.validate(sig, data, public_key)
224+
}
225+
}

internal/crypto/src/webcrypto/async_validators/ecdsa_validator.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use wasm_bindgen_futures::JsFuture;
1818
use web_sys::CryptoKey;
1919

2020
use crate::{
21-
raw_signature::RawSignatureValidationError,
22-
webcrypto::{AsyncRawSignatureValidator, WindowOrWorker},
21+
raw_signature::{AsyncRawSignatureValidator, RawSignatureValidationError},
22+
webcrypto::WindowOrWorker,
2323
};
2424

2525
/// An `EcdsaValidator` can validate raw signatures with one of the ECDSA

internal/crypto/src/webcrypto/async_validators/ed25519_validator.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313

1414
use async_trait::async_trait;
1515

16-
use crate::{
17-
raw_signature::{RawSignatureValidationError, RawSignatureValidator},
18-
webcrypto::AsyncRawSignatureValidator,
16+
use crate::raw_signature::{
17+
AsyncRawSignatureValidator, RawSignatureValidationError, RawSignatureValidator,
1918
};
2019

2120
/// An `Ed25519Validator` can validate raw signatures with the Ed25519 signature

internal/crypto/src/webcrypto/async_validators/mod.rs

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,13 @@
1111
// specific language governing permissions and limitations under
1212
// each license.
1313

14-
use async_trait::async_trait;
1514
use bcder::Oid;
1615

1716
use crate::{
18-
raw_signature::{oids::*, RawSignatureValidationError},
17+
raw_signature::{oids::*, AsyncRawSignatureValidator},
1918
SigningAlg,
2019
};
2120

22-
/// An `AsyncRawSignatureValidator` implementation checks a signature encoded
23-
/// using a specific signature algorithm and a private/public key pair.
24-
///
25-
/// IMPORTANT: This signature is typically embedded in a wrapper provided by
26-
/// another signature mechanism. In the C2PA ecosystem, this wrapper is
27-
/// typically COSE, but `AsyncRawSignatureValidator` does not implement COSE.
28-
///
29-
/// The WASM implementation of `c2pa-crypto` also implements
30-
/// [`RawSignatureValidator`] (the synchronous version), but some encryption
31-
/// algorithms are not fully supported. When possible, it's preferable to use
32-
/// this implementation.
33-
///
34-
/// [`RawSignatureValidator`]: crate::raw_signature::RawSignatureValidator
35-
#[async_trait(?Send)]
36-
pub trait AsyncRawSignatureValidator {
37-
/// Return `true` if the signature `sig` is valid for the raw content `data`
38-
/// and the public key `public_key`.
39-
async fn validate_async(
40-
&self,
41-
sig: &[u8],
42-
data: &[u8],
43-
public_key: &[u8],
44-
) -> Result<(), RawSignatureValidationError>;
45-
}
46-
4721
/// Return an async validator for the given signing algorithm.
4822
pub fn async_validator_for_signing_alg(
4923
alg: SigningAlg,

internal/crypto/src/webcrypto/async_validators/rsa_legacy_validator.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313

1414
use async_trait::async_trait;
1515

16-
use crate::{
17-
raw_signature::{RawSignatureValidationError, RawSignatureValidator},
18-
webcrypto::AsyncRawSignatureValidator,
16+
use crate::raw_signature::{
17+
AsyncRawSignatureValidator, RawSignatureValidationError, RawSignatureValidator,
1918
};
2019

2120
/// An `RsaLegacyValidator` can validate raw signatures with an RSA signature

internal/crypto/src/webcrypto/async_validators/rsa_validator.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313

1414
use async_trait::async_trait;
1515

16-
use crate::{
17-
raw_signature::{RawSignatureValidationError, RawSignatureValidator},
18-
webcrypto::AsyncRawSignatureValidator,
16+
use crate::raw_signature::{
17+
AsyncRawSignatureValidator, RawSignatureValidationError, RawSignatureValidator,
1918
};
2019

2120
/// An `RsaValidator` can validate raw signatures with one of the RSA-PSS

internal/crypto/src/webcrypto/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
pub(crate) mod async_validators;
2323
pub use async_validators::{
2424
async_validator_for_sig_and_hash_algs, async_validator_for_signing_alg,
25-
AsyncRawSignatureValidator,
2625
};
2726

2827
pub(crate) mod check_certificate_trust;

0 commit comments

Comments
 (0)