-
Notifications
You must be signed in to change notification settings - Fork 323
Expose cryptography backends via CryptoProvider #452
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
4483fd7 to
370f904
Compare
|
@Keats any chance of a review on this? |
|
Would this allow applications to use rustls rather than openssl? |
|
@drusellers As far as I know rustls doesn't implement the cryptography directly, rather it relies on other crates like |
Keats
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this can be simplified
| }; | ||
|
|
||
| assert_eq!(my_claims, claims); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we use a real crypto lib as an example?
| } | ||
|
|
||
| /// Given some data and a name of a hash function, compute hash_function(data) | ||
| pub fn compute_digest(data: &[u8], hash_function: ThumbprintHash) -> Vec<u8> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can those functions be pub(crate) rather than pub? For both files
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well if they are pub(crate) it would mean you can't use them externally, so the intent with making them pub was that you can overwrite e.g. the ES256 signing with a crypto lib of your choosing, but keep the utility functions from either of the built in crypto libs, but your choice.
| Algorithm::PS384 => Box::new(rsa::RsaPss384Signer::new(key)?) as Box<dyn JwtSigner>, | ||
| Algorithm::PS512 => Box::new(rsa::RsaPss512Signer::new(key)?) as Box<dyn JwtSigner>, | ||
| Algorithm::EdDSA => Box::new(eddsa::EdDSASigner::new(key)?) as Box<dyn JwtSigner>, | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that will get more complex if we start supporting some alg in some backend like #461
| pub(crate) fn get_default() -> Option<&'static Arc<CryptoProvider>> { | ||
| PROCESS_DEFAULT_PROVIDER.get() | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need that? We should be able to define a DEFAULT_PROVIDER using cargo features I think without needing the dance around that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IIUC you mean that it automatically sets PROCESS_DEFAULT_PROVIDER to aws_lc::CryptoProvider if the aws feature is enabled? Yes that could be done, but similar to the JWK utility functions, that would mean you have to replace everything when you implement a custom provider, because otherwise if you select one of the built in features, you'd be locked into that provider.
This way you can implement whatever you want to, enable both aws and custom-provider, and fallback to aws for everything you haven't implemented.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My understanding of custom providers is that you do not want to add the rust-crypto/aws-lc dependencies? That feels a bit awkward otherwise
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel that way, yes, others may not, I do not know. I did it this way because rustls did it this way, but I can change it if you want me to.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All that said while it could be assigned automatically for the rust_crypto and aws_lc_rs features, it still needs to provide a set method for outside crypto providers, and I'm honestly not sure how to do it any other way.
Unless you want a
#[cfg(feature = "custom-provider")]
static PROCESS_DEFAULT_PROVIDER: OnceLock<Arc<CryptoProvider>> = OnceLock::new();
#[cfg(not(feature = "custom-provider")]
# assign from crate featureswhich I personally think is pretty ugly.
| pub enum DecodingKeyKind { | ||
| SecretOrDer(Vec<u8>), | ||
| RsaModulusExponent { n: Vec<u8>, e: Vec<u8> }, | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just make it pub for everyone no? Easier to keep track for breaking changes
| pub(crate) kind: DecodingKeyKind, | ||
| #[cfg(feature = "custom-provider")] | ||
| #[cfg_attr(feature = "custom-provider", allow(missing_docs))] | ||
| pub kind: DecodingKeyKind, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as above, or we should expose some getters/setters rather than having sometimes private sometimes public fields
Adds a
CryptoProviderstruct that allows replacing the built-in providers with something custom.All the details from this implementation that could be considered "interesting" are stolen straight from
rustls's CryptoProvider.I've marked the
new_signer,new_verifierand JWK functions from the two built in backends aspub, so you can do stuff like this:i.e. overwrite just specific algorithms.
One area I'm a little unsure about is
JwkUtils, 1) about the name and 2) about theDefaultimplementation. TheCryptoProvider::signer_andCryptoProvider::verifier_factoryfunctions are obviously mandatory for a custom provider, but not everyone uses JWK, so the default just uses dummy functions withunimplemented!().