clients::rdp connects over any caller-dialled TCP stream (direct, proxy or SSH tunnel), upgrades to TLS and logs on with NLA (CredSSP/NTLM), optionally falling back to TLS-only logon for servers without NLA such as xrdp (credentials are passed so they log straight in). The server certificate is pinned through a caller check on its SHA256 fingerprint before any credentials are sent. The desktop decodes into the VNC client's RGBA framebuffer; input (IronRDP's scancode/Unicode/mouse operations), Display Control resizes and the deactivation-reactivation sequence run on the session thread. IronRDP's releases need three vendored patches (vendor/README.md): picky and sspi with their RustCrypto release-candidate pins relaxed so they share russh's stable versions (their own suites, 402 tests, pass against them), and ironrdp-session with two unreleased upstream bitmap fixes (#1486 stride, #1524 RDP6 orientation) without which xrdp desktops render sheared. Verified live against xrdp (scottyhardy/docker-remote-desktop): logon, full desktop rendering, keyboard and mouse input.
16 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[7.0.0-rc.25] - 2026-06-26
Build
- Align RustCrypto ECC dependency versions and remove unnecessary transitive pins (#506) (a4346f2853)
[7.0.0-rc.24] - 2026-06-19
Build
-
Bump sha3 from 0.11.0 to 0.12.0 (#495) (0b065a59fb)
-
Advance RustCrypto pins to the current rc.18/rc.33/rc.10 cluster (#501) (7d4b2675b9)
[7.0.0-rc.23] - 2026-04-21
Build
- Upgrade RustCrypto dependencies (#476) (8ce838e347)
[7.0.0-rc.22] - 2026-02-27
Bug Fixes
- Bump
sha1to v0.11.0-rc.3 (#463) (e40aee72bd)
[7.0.0-rc.21] - 2026-02-02
Build
-
Update crypto dependencies (#448) (0bf42c1c4b)
-
Remove transitive pem-rfc7468 crate (#449) (cc4caf455d)
-
Bump reqwest from 0.12.24 to 0.13.1 (#453) (9cbaab9395)
[7.0.0-rc.20] - 2025-11-07
Bug Fixes
-
Pin leftover pre-release crypto crates (#430) (0fe43dae7b)
The patch version upgrade is not allowed to bring breaking changes, but this rule doesn't work for an
rcversion. So we should pin thercversions, to not allow cargo update to a newrcautomatically.
[7.0.0-rc.19] - 2025-10-10
Features
- Support parsing certs with MLDSA public keys (#411) (abc63dde88)
Build
- Pin RustCrypto release candidate crates (#417) (8a79282bbc)
[7.0.0-rc.18] - 2025-09-26
Build
- Bump the crypto group across 1 directory with 3 updates (#388) (58d179a0c3)
[7.0.0-rc.17] - 2025-08-18
Build
- Bump rstest from 0.25.0 to 0.26.1 (#391) (2a169deba2)
[7.0.0-rc.16] - 2025-07-15
Security
-
Reject issuer certificates missing basic constraints (#385) (4d8be23912)
As per RFC 5280:
The cA boolean indicates whether the certified public key may be used to verify certificate signatures. If the cA boolean is not asserted, then the keyCertSign bit in the key usage extension MUST NOT be asserted. If the basic constraints extension is not present in a version 3 certificate, or the extension is present but the cA boolean is not asserted, then the certified public key MUST NOT be used to verify certificate signatures.
[7.0.0-rc.15] - 2025-06-24
Build
- Bump MSVC to 1.85 (#379) (302df9912d)
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[7.0.0-rc.14] - 2025-05-14
Features
-
Add HttpSignature::to_signing_string() method (fe054c47f0)
Equivalent to HttpSignature::to_string().
[7.0.0-rc.13] - 2025-03-03
Bug Fixes
-
[breaking] Comply with draft-cavage-http-signatures-12 when signing HTTP messages (#351) (f043d04e14)
Change request target handling to comply with draft-cavage-http-signatures-12 when signing HTTP messages.
[7.0.0-rc.12] - 2025-01-16
Bug Fixes
-
Symlinks to license files in packages (#339) (1834c04f39)
Use symlinks instead of copying files to avoid a “dirty” state during cargo publish and preserve VCS info. With #337 merged, CI handles publishing consistently, so developer environments no longer matter.
7.0.0-rc.1 to 7.0.0-rc.11
Added
- Support for ECDSA p256 p384 and p521 signatures
- Support for MD5 hashing
- CTL implementation behind
ctlfeature - CTL fetching over HTTP is behind
ctl_http_fetchfeature Pkcs7::digest_algorithmsPkcs7::signer_infosPkcs7::encapsulated_content_infoPkcs7::decode_certificatesimpl From<Pkcs7Certificate> for Pkcs7impl From<Pkcs7> for Pkcs7CertificateAuthenticodeSignaturestructAuthenticodeSignature::newAuthenticodeSignature::from_derAuthenticodeSignature::from_pemAuthenticodeSignature::from_pem_strAuthenticodeSignature::to_derAuthenticodeSignature::to_pemAuthenticodeSignature::signing_certificateAuthenticodeSignature::authenticode_verifierAuthenticodeSignature::file_hashAuthenticated_attributes::authenticated_attributesAuthenticated_attributes::unauthenticated_attributesimpl From<Pkcs7> for AuthenticodeSignatureFrom<AuthenticodeSignature> for Pkcs7- Authenticode validation
- Support for
AuthenticodeSignaturetimestamping:- Method
timestamptoAuthenticodeSignature Timestampertrait.- Timestamping implementation using reqwest is behind
http_timestampfeature
- Method
- Authenticode timestamp request struct -
TimestampRequest AuthenticodeBuilderfor easierAuthenticodeSignaturecreationSignatureAlgorithm::hash_algorithm- Support for
time 0.3types conversions behindtime_conversionfeature gate PrivateKey::to_pem_strPrivateKey::from_ec_componentsPrivateKey::from_ec_der_with_curvePrivateKey::from_ec_der_with_curve_oidPrivateKey::generate_ecPrivateKey::generate_edPrivateKey::from_ec_encoded_componentsPrivateKey::from_ed_encoded_componentsPublicKey::to_pem_str- Support SSH keys and certificates
CheckedJwtEnc::new_with_ctyCheckedJwtSig::new_with_cty- Support for JWT additional header parameters
- Support for EC private/public keys
- JWS and JWK EC curves support
- EC curves support for SSH keys and certificates
- EC x509 certificates verification/signing
JwkKeyType::new_ec_keyJwkKeyType::new_ed_keyJwkKeyType::as_ecJwkKeyType::as_edJwkKeyType::is_ecJwkKeyType::is_edSshPrivateKey::generate_ecSshPrivateKey::generate_edJwkEcPublicKeyCurveenumJwkEdPublicKeyAlgorithmenumJwsAlg::EdDSAvariantJwsAlg::ED25519variant (#[deprecated]from the start, just for compatibility with other libs)- Support for X25519 and Ed25519 public/private keys
- JWS and JWK Ed25519 keys/signing support
- Ed25519 support for SSH keys and certificates
- Ed25519 x509 certificates verification/signing
- Support for
ECDH-ESJWE algorithm (P256, P384 and P521 EC keys, X25519 ED keys) - Support for
PKCS12(PFX) files parsing/building - PuTTY PPK key format support
Changed
- Bump minimal rustc version to 1.70
- Updated
p256/p384to latest version - (Breaking) Move Authenticode related code from
picky::x509::wincerttopicky::x509::pkcs7::authenticodemodule - (Breaking) Authenticode implementation is now behind
pkcs7feature - (Breaking)
PrivateKey::to_pemandPublicKey::to_pemnow return aPem - (Breaking) Separate JWT validation from decoding in JOSE API (this makes API more convenient to first process header and then decide what kind of validation should be applied, or what claims type to deserialize into)
- (Breaking)
PrivateKeynow have private struct representation instead of open enum - (Breaking) Now all
PrivateKey::to_publicand all related APIs for private keys returnResultinstead of plainPublicKey. This change was required because added support for EC/ED keys is not infallible in regard to public key extraction (public key could be missing from the file and could not be generated because of an unsupported algorithm/curve) - "picky-test-data" is a new dev-dependency.
Removed
- (Breaking)
ecnon-default cargo feature (EC operations now enabled by default)
Fixed
-
BufReaderpanic inWinCertificate::decodeandWinCertificate::encodeif data len is bigger than default capacity. -
WinCertificateencoding:lengthwasn’t correct. -
Leading zeros in JWK encoding.
JWK encoding of a value is the unsigned big-endian representation as an octet sequence. The octet sequence MUST utilize the minimum number of octets needed to represent the value. That is: no leading zero must be present.
See issue #140
-
Fetch curve info from private_key_algorithm (#143)
Pick curve info from private_key_algorithm field.
-
Missing
zeroizeon drop of internalEcdsaKeypairstructure -
Fixed invalid padding logic of encrypted SSH keys
-
Fixed invalid generated SSH EC keys
Removed
- (Breaking)
Jwt::new_encrypted - (Breaking)
Jwt::new_signed
6.4.0 – 2021-08-10
Changed
- Bump minimum supported Rust version to 1.51
- Update
rsadependency to0.5 - Update
picky-asn1dependency to0.4 - More robust certification validation (see commit f5f8cb60e41 for details)
6.3.0 – 2021-05-27
Added
- PKCS7 implementation behind
pkcs7feature WinCertificatefor authenticode behindwincertfeature
Changed
- Update
aes-gcmdependency to0.9
6.2.0 – 2021-03-04
Added
Csr::generate_with_attributesto generate CSR with attributes.CertificateBuilder::inherit_extensions_from_csr_attributesto allow certificate to inherit extensions requested by CSR attribute.- Various API additions to
GeneralNamesfor improved ergonomics.
6.1.2 – 2021-01-11
Fixed
- Fix bad
uses statements toserde::export
6.1.1 – 2020-12-11
Fixed
- Fix
HttpSignatureError's Display trait implementation (certificate expired→signature expired). - Fix certificate validity period that MUST be encoded as
UTCTimethrough the year 2049 as per RFC 5280. Previously, they were always encoded asGeneralizedTime.
6.1.0 – 2020-10-21
Added
CertificateBuilder::serial_numbercan be used to provide a custom serial number instead of generating one.
Fixed
- Bad generation for second exponent (
pq) when generating PKCS#8 structure. - Serial number was sometimes generated as negative.
6.0.0 – 2020-10-13
Added
- Implementation of
Jwe(JSON Web Encryption) RFC. - Email attribute can be added to
DirectoryNameusingadd_emailmethod. from_pem_strmethod toCert,Csr,PrivateKeyandPublicKey.
Changed
- Separate
SignatureHashTypeinto two separate enumsHashAlgorithmandSignatureAlgorithm. KeyIdGenErroris now wrapping aHashAlgorithm.- Update
rsadependency. HttpSignaturestore customalgorithmnames instead of just ignoring them.- Major
josemodule changes- JOSE header fields are renamed to be identical to RFCs when possible.
Jwtis now divided intoJws(JSON Web Signature) andJwe(JSON Web Encryption)Jwsprovides an API to sign any kind of data (binary). JSON claims are part ofJwtonly.Jweprovides an API to encrypt any kind of data (binary). JSON claims are part ofJwtonly.
- Typo in
CertificateBuilderAPI:valididyhas been renamed tovalidity.
Fixed
- RSA private key generation (#53).
5.1.1 – 2020-07-13
Changed
- Better
CaChainError::AuthorityKeyIdMismatchdisplay.
5.1.0 – 2020-07-07
Added
- Add
BufRead-based API to read PEM streams:pem::Pem::read_fromandpem::read_pem.
Changed
- Some internal types are moved to a new
picky_asn1_x509crate but API is unchanged. - Dependencies clean up.
5.0.0 – 2020-05-06
Added
- Add
into_public_keymethod tox509::Cert. - Support for the "algorithm" http signature parameter.
Changed
Jwthas no generic lifetime parameter anymore.
Removed
Cert::verifyandCert::verify_chainmethods (previously deprecated)HttpRequesttrait impl forhttpcrate v0.1
Fixed
- Add missing parameters for AES and SHA object identifiers (668c06e8d)
4.7.0 – 2020-04-16
Added
- Implement
From<UTCDate>trait onDateTime<Utc>. - Support for leeway in HTTP signature verifier.
- Verifier API to X509 Cert.
Deprecated
Cert::verifyandCert::verify_chainmethods in favor of theCert::verifiermethod.