Add support for setting the nonce type and digest on a PKEY_CTX#2144
Add support for setting the nonce type and digest on a PKEY_CTX#2144alex merged 7 commits intorust-openssl:masterfrom
Conversation
a056b21 to
78b2e98
Compare
78b2e98 to
8f11103
Compare
8f11103 to
335b96b
Compare
| /// Requires OpenSSL 3.0.0 or newer. | ||
| #[cfg(ossl300)] | ||
| #[corresponds(EVP_PKEY_CTX_set_params)] | ||
| pub fn set_digest(&mut self, hash_algorithm: MessageDigest) -> Result<(), ErrorStack> { |
There was a problem hiding this comment.
I don't think we need this. Check out set_signature_md and the underlying EVP_PKEY_CTX_set_signature_md impl in crypto/evp/pmeth_lib.c
There was a problem hiding this comment.
Yes, good catch! I removed set_digest, although I did leave digest() as a method to access the digest set by set_signature_md.
| assert_eq!(result_buf[length - digest.len()..length], digest); | ||
| } | ||
|
|
||
| #[test] |
There was a problem hiding this comment.
We should add a test that confirms setting noncetype + digest works as expected. You can get a test vector from: https://github.com/openssl/openssl/blob/master/test/recipes/30-test_evp_data/evppkey_ecdsa_rfc6979.txt
There was a problem hiding this comment.
Good idea, fixed!
| pub fn EVP_DecodeBlock(dst: *mut c_uchar, src: *const c_uchar, src_len: c_int) -> c_int; | ||
| } | ||
|
|
||
| extern "C" { |
There was a problem hiding this comment.
These should go in a new file params.rs as they're declared in openssl/params.h rather than evp.
ee6cb8b to
76043a9
Compare
| /// Requires OpenSSL 3.0.0 or newer. | ||
| #[cfg(ossl300)] | ||
| #[corresponds(EVP_PKEY_CTX_get_params)] | ||
| pub fn digest(&mut self) -> Result<Option<MessageDigest>, ErrorStack> { |
There was a problem hiding this comment.
This doesn't really match the naming rust-openssl typically uses for getters. It'd be signature_md I think? But honestly I'm not sure we need this getter at all. I'd drop it until someone articulates a need.
| /// This is only useful for DSA and ECDSA. | ||
| /// Requires OpenSSL 3.2.0 or newer. | ||
| #[cfg(ossl320)] | ||
| #[corresponds(EVP_PKEY_CTX_set_params)] |
There was a problem hiding this comment.
These corresponds probably should be dropped since this uses the function, but it is a generic func that can be used in many places. That said, I'd defer to @sfackler for his opinion.
There was a problem hiding this comment.
I thought the same at first, but there's also a #corresponds(EVP_PKEY_CTX_ctrl)] (also a generic func) for set_keygen_cipher and set_keygen_mac_key, so I went with it anyway. I can remove it if it should not be there.
| /// This is only useful for DSA and ECDSA. | ||
| /// Requires OpenSSL 3.2.0 or newer. | ||
| #[cfg(ossl320)] | ||
| #[corresponds(EVP_PKEY_CTX_get_params)] |
There was a problem hiding this comment.
Same corresponds statement.
There was a problem hiding this comment.
(same comment as above)
8ec061c to
ce5e9e4
Compare
reaperhulk
left a comment
There was a problem hiding this comment.
modulo the corresponds question this lgtm 😄
| #[cfg(ossl320)] | ||
| #[corresponds(EVP_PKEY_CTX_set_params)] | ||
| pub fn set_nonce_type(&mut self, nonce_type: NonceType) -> Result<(), ErrorStack> { | ||
| let nonce_field_name = CString::new("nonce-type").unwrap(); |
There was a problem hiding this comment.
Can this be CStr::new("nonce-type\0") or something, to avoid the allocation?
There was a problem hiding this comment.
Yes, changed to
CStr::from_bytes_with_nul("nonce-type\0".as_bytes())| #[cfg(ossl320)] | ||
| #[corresponds(EVP_PKEY_CTX_set_params)] | ||
| pub fn set_nonce_type(&mut self, nonce_type: NonceType) -> Result<(), ErrorStack> { | ||
| let nonce_field_name = CStr::from_bytes_with_nul("nonce-type\0".as_bytes()).unwrap(); |
There was a problem hiding this comment.
| let nonce_field_name = CStr::from_bytes_with_nul("nonce-type\0".as_bytes()).unwrap(); | |
| let nonce_field_name = CStr::from_bytes_with_nul(b"nonce-type\0").unwrap(); |
| #[cfg(ossl320)] | ||
| #[corresponds(EVP_PKEY_CTX_get_params)] | ||
| pub fn nonce_type(&mut self) -> Result<NonceType, ErrorStack> { | ||
| let nonce_field_name = CStr::from_bytes_with_nul("nonce-type\0".as_bytes()).unwrap(); |
There was a problem hiding this comment.
| let nonce_field_name = CStr::from_bytes_with_nul("nonce-type\0".as_bytes()).unwrap(); | |
| let nonce_field_name = CStr::from_bytes_with_nul(b"nonce-type\0").unwrap(); |
chore(deps): update compatible [](https://renovatebot.com) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [annotate-snippets](https://togithub.com/rust-lang/annotate-snippets-rs) | workspace.dependencies | patch | `0.10.1` -> `0.10.2` | | [anstream](https://togithub.com/rust-cli/anstyle) | workspace.dependencies | patch | `0.6.11` -> `0.6.13` | | [anyhow](https://togithub.com/dtolnay/anyhow) | workspace.dependencies | patch | `1.0.79` -> `1.0.80` | | [curl](https://togithub.com/alexcrichton/curl-rust) | workspace.dependencies | patch | `0.4.44` -> `0.4.46` | | [curl-sys](https://togithub.com/alexcrichton/curl-rust) | workspace.dependencies | patch | `0.4.71` -> `0.4.72+curl-8` | | [openssl](https://togithub.com/sfackler/rust-openssl) | workspace.dependencies | patch | `0.10.63` -> `0.10.64` | | [pkg-config](https://togithub.com/rust-lang/pkg-config-rs) | workspace.dependencies | patch | `0.3.29` -> `0.3.30` | | [semver](https://togithub.com/dtolnay/semver) | workspace.dependencies | patch | `1.0.21` -> `1.0.22` | | [serde](https://serde.rs) ([source](https://togithub.com/serde-rs/serde)) | workspace.dependencies | patch | `1.0.196` -> `1.0.197` | | [serde_json](https://togithub.com/serde-rs/json) | workspace.dependencies | patch | `1.0.113` -> `1.0.114` | | [snapbox](https://togithub.com/assert-rs/trycmd/tree/main/crates/snapbox) ([source](https://togithub.com/assert-rs/trycmd)) | workspace.dependencies | patch | `0.5.6` -> `0.5.7` | | [tempfile](https://stebalien.com/projects/tempfile-rs/) ([source](https://togithub.com/Stebalien/tempfile)) | workspace.dependencies | minor | `3.9.0` -> `3.10.1` | | [thiserror](https://togithub.com/dtolnay/thiserror) | workspace.dependencies | patch | `1.0.56` -> `1.0.57` | | [toml_edit](https://togithub.com/toml-rs/toml) | workspace.dependencies | patch | `0.22.4` -> `0.22.6` | --- ### Release Notes <details> <summary>rust-lang/annotate-snippets-rs (annotate-snippets)</summary> ### [`v0.10.2`](https://togithub.com/rust-lang/annotate-snippets-rs/blob/HEAD/CHANGELOG.md#0102---2024-02-29) [Compare Source](https://togithub.com/rust-lang/annotate-snippets-rs/compare/0.10.1...0.10.2) ##### Added - Added `testing-colors` feature to remove platform-specific colors when testing [#​82](https://togithub.com/rust-lang/annotate-snippets-rs/pull/82) </details> <details> <summary>rust-cli/anstyle (anstream)</summary> ### [`v0.6.13`](https://togithub.com/rust-cli/anstyle/compare/anstream-v0.6.12...anstream-v0.6.13) [Compare Source](https://togithub.com/rust-cli/anstyle/compare/anstream-v0.6.12...anstream-v0.6.13) ### [`v0.6.12`](https://togithub.com/rust-cli/anstyle/compare/anstream-v0.6.11...anstream-v0.6.12) [Compare Source](https://togithub.com/rust-cli/anstyle/compare/anstream-v0.6.11...anstream-v0.6.12) </details> <details> <summary>dtolnay/anyhow (anyhow)</summary> ### [`v1.0.80`](https://togithub.com/dtolnay/anyhow/releases/tag/1.0.80) [Compare Source](https://togithub.com/dtolnay/anyhow/compare/1.0.79...1.0.80) - Fix unused_imports warnings when compiled by rustc 1.78 </details> <details> <summary>alexcrichton/curl-rust (curl)</summary> ### [`v0.4.46`](https://togithub.com/alexcrichton/curl-rust/compare/0.4.45...0.4.46) [Compare Source](https://togithub.com/alexcrichton/curl-rust/compare/0.4.45...0.4.46) ### [`v0.4.45`](https://togithub.com/alexcrichton/curl-rust/compare/0.4.44...0.4.45) [Compare Source](https://togithub.com/alexcrichton/curl-rust/compare/0.4.44...0.4.45) </details> <details> <summary>sfackler/rust-openssl (openssl)</summary> ### [`v0.10.64`](https://togithub.com/sfackler/rust-openssl/releases/tag/openssl-v0.10.64) [Compare Source](https://togithub.com/sfackler/rust-openssl/compare/openssl-v0.10.63...openssl-v0.10.64) ##### What's Changed - Make \_STACK opaque for LibreSSL >= 3.9.0 by [`@​botovq](https://togithub.com/botovq)` in [https://github.com/sfackler/rust-openssl/pull/2153](https://togithub.com/sfackler/rust-openssl/pull/2153) - enable x509 verify and groups list for boringssl by [`@​zh-jq](https://togithub.com/zh-jq)` in [https://github.com/sfackler/rust-openssl/pull/2155](https://togithub.com/sfackler/rust-openssl/pull/2155) - Cleanup some not-required Path::new invocations by [`@​alex](https://togithub.com/alex)` in [https://github.com/sfackler/rust-openssl/pull/2158](https://togithub.com/sfackler/rust-openssl/pull/2158) - fixed a clippy (nightly) warning by [`@​alex](https://togithub.com/alex)` in [https://github.com/sfackler/rust-openssl/pull/2161](https://togithub.com/sfackler/rust-openssl/pull/2161) - Bump actions versions by [`@​alex](https://togithub.com/alex)` in [https://github.com/sfackler/rust-openssl/pull/2162](https://togithub.com/sfackler/rust-openssl/pull/2162) - Add support for setting the nonce type and digest on a PKEY_CTX by [`@​facutuesca](https://togithub.com/facutuesca)` in [https://github.com/sfackler/rust-openssl/pull/2144](https://togithub.com/sfackler/rust-openssl/pull/2144) - rebuild openssl-sys if the underlying openssl has changed by [`@​reaperhulk](https://togithub.com/reaperhulk)` in [https://github.com/sfackler/rust-openssl/pull/2157](https://togithub.com/sfackler/rust-openssl/pull/2157) - Added binding for EVP_default_properties_enable_fips by [`@​alex](https://togithub.com/alex)` in [https://github.com/sfackler/rust-openssl/pull/2168](https://togithub.com/sfackler/rust-openssl/pull/2168) - LibreSSL 3.9: fix CRYPTO_malloc/free signatures by [`@​botovq](https://togithub.com/botovq)` in [https://github.com/sfackler/rust-openssl/pull/2170](https://togithub.com/sfackler/rust-openssl/pull/2170) - Expose alias on X509 structs by [`@​alex](https://togithub.com/alex)` in [https://github.com/sfackler/rust-openssl/pull/2167](https://togithub.com/sfackler/rust-openssl/pull/2167) - bump openssl and openssl-sys + changelogs by [`@​reaperhulk](https://togithub.com/reaperhulk)` in [https://github.com/sfackler/rust-openssl/pull/2175](https://togithub.com/sfackler/rust-openssl/pull/2175) **Full Changelog**: rust-openssl/rust-openssl@openssl-v0.10.63...openssl-v0.10.64 </details> <details> <summary>rust-lang/pkg-config-rs (pkg-config)</summary> ### [`v0.3.30`](https://togithub.com/rust-lang/pkg-config-rs/blob/HEAD/CHANGELOG.md#0330---2024-02-14) [Compare Source](https://togithub.com/rust-lang/pkg-config-rs/compare/0.3.29...0.3.30) ##### Changed - Update documentation for cross-compilation ([#​161](https://togithub.com/rust-lang/pkg-config-rs/issues/161)). - Update GitHub Action CI ([#​160](https://togithub.com/rust-lang/pkg-config-rs/issues/160)). </details> <details> <summary>dtolnay/semver (semver)</summary> ### [`v1.0.22`](https://togithub.com/dtolnay/semver/releases/tag/1.0.22) [Compare Source](https://togithub.com/dtolnay/semver/compare/1.0.21...1.0.22) - Fix unused_imports warnings when compiled by rustc 1.78 </details> <details> <summary>serde-rs/serde (serde)</summary> ### [`v1.0.197`](https://togithub.com/serde-rs/serde/releases/tag/v1.0.197) [Compare Source](https://togithub.com/serde-rs/serde/compare/v1.0.196...v1.0.197) - Fix unused_imports warnings when compiled by rustc 1.78 - Optimize code size of some Display impls ([#​2697](https://togithub.com/serde-rs/serde/issues/2697), thanks [`@​nyurik](https://togithub.com/nyurik))` </details> <details> <summary>serde-rs/json (serde_json)</summary> ### [`v1.0.114`](https://togithub.com/serde-rs/json/releases/tag/v1.0.114) [Compare Source](https://togithub.com/serde-rs/json/compare/v1.0.113...v1.0.114) - Fix unused_imports warnings when compiled by rustc 1.78 </details> <details> <summary>assert-rs/trycmd (snapbox)</summary> ### [`v0.5.7`](https://togithub.com/assert-rs/trycmd/compare/snapbox-v0.5.6...snapbox-v0.5.7) [Compare Source](https://togithub.com/assert-rs/trycmd/compare/snapbox-v0.5.6...snapbox-v0.5.7) </details> <details> <summary>Stebalien/tempfile (tempfile)</summary> ### [`v3.10.1`](https://togithub.com/Stebalien/tempfile/blob/HEAD/CHANGELOG.md#3101) [Compare Source](https://togithub.com/Stebalien/tempfile/compare/v3.10.0...v3.10.1) - Handle potential integer overflows in 32-bit systems when seeking/truncating "spooled" temporary files past 4GiB (2³²). - Handle a theoretical 32-bit overflow when generating a temporary file name larger than 4GiB. Now it'll panic (on allocation failure) rather than silently succeeding due to wraparound. Thanks to [`@​stoeckmann](https://togithub.com/stoeckmann)` for finding and fixing both of these issues. ### [`v3.10.0`](https://togithub.com/Stebalien/tempfile/blob/HEAD/CHANGELOG.md#3100) [Compare Source](https://togithub.com/Stebalien/tempfile/compare/v3.9.0...v3.10.0) - Drop `redox_syscall` dependency, we now use `rustix` for Redox. - Add `Builder::permissions` for setting the permissions on temporary files and directories (thanks to [`@​Byron](https://togithub.com/Byron)).` - Update rustix to 0.38.31. - Update fastrand to 2.0.1. </details> <details> <summary>dtolnay/thiserror (thiserror)</summary> ### [`v1.0.57`](https://togithub.com/dtolnay/thiserror/releases/tag/1.0.57) [Compare Source](https://togithub.com/dtolnay/thiserror/compare/1.0.56...1.0.57) - Generate more efficient `Display` impl for error message which do not contain any interpolated value ([#​286](https://togithub.com/dtolnay/thiserror/issues/286), thanks [`@​nyurik](https://togithub.com/nyurik))` </details> <details> <summary>toml-rs/toml (toml_edit)</summary> ### [`v0.22.6`](https://togithub.com/toml-rs/toml/compare/v0.22.5...v0.22.6) [Compare Source](https://togithub.com/toml-rs/toml/compare/v0.22.5...v0.22.6) ### [`v0.22.5`](https://togithub.com/toml-rs/toml/compare/v0.22.4...v0.22.5) [Compare Source](https://togithub.com/toml-rs/toml/compare/v0.22.4...v0.22.5) </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 5am on the first day of the month" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/rust-lang/cargo). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMjAuMiIsInVwZGF0ZWRJblZlciI6IjM3LjIyMC4yIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIn0=-->
This PR adds getters and setters for the digest and the nonce type of a
PKEY_CTX. In OpenSSL, this is done using theOSSL_PARAMAPI, but here we hide that detail and just exposePkeyCtxRef::{digest, set_digest}andPkeyCtxRef::{nonce_type, set_nonce_type}methods that internally take care of theOSSL_PARAMdetails.Adding these is motivated by pyca/cryptography#9795, particularly adding support for RFC6979 (deterministic ECDSA) to
cryptography.Here's the OpenSSL documentation for
nonce-type, the new parameter added in OpenSSL 3.2.0 for RFC6979