Releases: str4d/rage
Releases · str4d/rage
rage v0.11.1
Security
Fixed a security vulnerability that could allow an attacker to execute an arbitrary binary under certain conditions. See GHSA-4fg7-vxc8-qx5w. Plugin names are now required to only contain alphanumeric characters or the four special characters +-._. Thanks to ⬡-49016 for reporting this issue.
rage v0.10.1
Security
Backport of the fix for GHSA-4fg7-vxc8-qx5w.
rage v0.9.3
Security
Backport of the fix for GHSA-4fg7-vxc8-qx5w.
rage v0.11.0
rage
Added
- Partial French translation!
Fixed
- [Unix] Files can now be encrypted with
rage --passphrasewhen piped over stdin, without requiring an explicit-argument asINPUT.
age
Added
- New streamlined APIs for use with a single recipient or identity and a small amount of data (that can fit entirely in memory):
age::encryptage::encrypt_and_armorage::decrypt
age::Decryptor::{decrypt, decrypt_async, is_scrypt}age::IdentityFile::to_recipientsage::IdentityFile::with_callbacksage::IdentityFile::write_recipients_fileage::IdentityFileConvertErrorage::NoCallbacksage::scrypt, providing recipient and identity types for passphrase-based encryption.- Partial French translation!
Changed
- Migrated to
i18n-embed 0.15,secrecy 0.10. age::Encryptor::with_recipientsnow takes recipients by reference instead of by value. This aligns it withage::Decryptor(which takes identities by reference), and also means that errors with recipients are reported earlier. This causes the following changes to the API:Encryptor::with_recipientstakesimpl Iterator<Item = &'a dyn Recipient>instead ofVec<Box<dyn Recipient + Send>>.- Verification of recipients and generation of stanzas now happens in
Encryptor::with_recipientsinstead ofEncryptor::wrap_outputandEncryptor::wrap_async_output. Encryptor::with_recipientsreturnsResult<Self, EncryptError>instead ofOption<Self>, andEncryptor::{wrap_output, wrap_async_output}returnio::Result<StreamWriter<W>>instead ofResult<StreamWriter<W>, EncryptError>.age::EncryptErrorhas a new variantMissingRecipients, taking the place of theNonethatEncryptor::with_recipientscould previously return.
age::Decryptoris now an opaque struct instead of an enum withRecipientsandPassphrasevariants.age::IdentityFilenow has aC: Callbacksgeneric parameter, which defaults toNoCallbacks.age::IdentityFile::into_identitiesnow returnsResult<Vec<Box<dyn crate::Identity>>, DecryptError>instead ofVec<IdentityFileEntry>.age::Recipient::wrap_file_keynow returns(Vec<Stanza>, HashSet<String>): a tuple of the stanzas to be placed in an age file header, and labels that constrain how the stanzas may be combined with those from other recipients.age::plugin::RecipientPluginV1now supports the labels extension.
Fixed
age::cli_common::read_identitiesonce again correctly parses identity files that are a single line without a trailing newline. This broke in 0.10.0 due to an unrelated refactor.
Removed
age::decryptor::PassphraseDecryptor(useage::Decryptorwithage::scrypt::Identityinstead).age::decryptor::RecipientsDecryptor(useage::Decryptorinstead).age::IdentityFileEntry
age-plugin 0.6.0
Added
age_plugin::PluginHandlerimpl age_plugin::identity::IdentityPluginV1 for std::convert::Infallibleimpl age_plugin::recipient::RecipientPluginV1 for std::convert::Infallible
Changed
- Migrated to
age-core 0.11. age_plugin::recipient::RecipientPluginV1has a newlabelsmethod. Existing implementations of the trait should either returnHashSet::new()to maintain existing compatibility, or return labels that apply the desired constraints.age_plugin::run_state_machinenow supports therecipient-v1labels extension.
Fixed
age_plugin::run_state_machinenow takes animpl age_plugin::PluginHandlerargument, instead of its previous arguments.- This fixes the change from the previous release, because the type parameters were basically impossible to set correctly when attempting to pass
None.
- This fixes the change from the previous release, because the type parameters were basically impossible to set correctly when attempting to pass
age-core
Added
age_core::format:FileKey::newFileKey::init_with_mutFileKey::try_init_with_mutis_arbitrary_string
Changed
- Migrated to
secrecy 0.10. age::plugin::Connection::unidir_receivenow takes an additional argument to enable handling an optional fourth command.
New Contributors
- @AnomalRoil made their first contribution in #499
- @pavelzw made their first contribution in #492
- @BoostCookie made their first contribution in #513
Full Changelog: v0.10.0...v0.11.0
rage v0.10.0
rage
Added
- Russian translation!
rage-keygen -y IDENTITY_FILEto convert identity files to recipients.- Elvish completions to the Debian package. These are not automatically discovered; Elvish users will need to manually import them.
- Localized manpages to the Debian package.
Changed
- MSRV is now 1.65.0.
- Migrated from
gumdroptoclapfor argument parsing. -R/--recipients-fileand-i/--identitynow support "read-once" files, like those used by process substitution (-i <(other_binary get-age-identity)) and named pipes.- The filename
-(hyphen) is now treated as an explicit request to read from standard input when used with-R/--recipients-fileor-i/--identity. It must only occur once across the-R/--recipients-fileand-i/--identityflags, and the input file. It cannot be used if the input file is omitted.
Fixed
- OpenSSH private keys passed to
-i/--identitythat contain invalid public keys are no longer ignored when encrypting, and instead cause an error. - Weak
ssh-rsapublic keys that are smaller than 2048 bits are now rejected. rage-keygenno longer overwrites existing key files with the-o/--outputflag. This was its behaviour prior to 0.6.0, but was unintentionally changed whenragewas modified to overwrite existing files. Key file overwriting can still be achieved by omitting-o/--outputand instead piping stdout to the file.rage-keygennow prints fatal errors directly instead of them being hidden behind theRUST_LOG=errorenvironment variable. It also now sets its return code appropriately instead of always returning 0.- The Debian package now uses the correct installation paths for fish and Zsh completions.
age
Added
- Russian translation!
age::cli_common:file_io:FileReaderimpl Debug for {LazyFile, OutputFormat, OutputWriter, StdoutWriter}
StdinGuardread_recipients
age::identity::IdentityFile::from_input_reader(behindcli-commonfeature flag).impl Eq for age::ssh::{ParseRecipientKeyError, UnsupportedKey}impl {Debug, PartialEq, Eq, Hash} for age::x25519::Recipient
Changed
- MSRV is now 1.65.0.
- Migrated to
base64 0.21,rsa 0.9. age::cli_common:file_io:InputReader::Fileenum variant now containsFileReaderinstead ofstd::fs::File.OutputWriter::newnow takes anallow_overwriteboolean argument. IfOutputWriterwill write to a file, this boolean enables the caller to control whether the file will be overwritten if it exists (instead of the implicit behaviour that was previously changed in 0.6.0).
read_identitiesnow takes an&mut StdinGuardargument, andfilenamesmay now contain at most one entry of"-", which will be interpreted as reading from standard input.ReadErrorhas new variants:EncryptedIdentitiesInvalidRecipientInvalidRecipientsFileMissingRecipientsFileMultipleStdinRsaModulusTooLargeRsaModulusTooSmall
age::ssh:ParseRecipientKeyErrorhas new variants:RsaModulusTooLargeRsaModulusTooSmall
- The following trait implementations now return
Err(ParseRecipientKeyError::RsaModulusTooLarge)instead ofErr(ParseRecipientKeyError::Unsupported(_))when encountering an RSA public key with a modulus larger than 4096 bits:impl FromStr for Recipientimpl TryFrom<Identity> for Recipient
Fixed
age::Encryptor::with_user_passphrasewill now re-measure thescryptwork factor until it is measurable, instead of setting the work factor to maximum.age::cli_common:UiCallbacks::confirmno longer requires erasing the confirmation message before it will accept a response.UiCallbacks::request_public_stringno longer prepends the description to the response string.
- Weak
ssh-rsapublic keys that are smaller than 2048 bits are now rejected from all string-parsing APIs. TheRecipient::SshRsaenum variant can still be manually constructed with such keys; this will be fixed in a future crate refactor.
age-plugin 0.5.0
Changed
- MSRV is now 1.65.0.
- Migrated to
age-core 0.10. age_plugin::run_state_machinenow takes optional arguments, to enable the creation of recipient-only or identity-only plugins.
age-core
Added
impl Eq for age_core::format::Stanza
Changed
- MSRV is now 1.65.0.
New Contributors
- @WesleyAC made their first contribution in #400
- @thibmeu made their first contribution in #406
- @gibbz00 made their first contribution in #420
- @ehaupt made their first contribution in #467
- @hexanova made their first contribution in #471
Full Changelog: v0.9.2...v0.10.0
rage v0.9.2
rage
Changed
- Increased parsing speed of age file headers. For single-recipient encrypted decryption throughput increases by 6% for medium (< 1MiB) files, and 40% for small (< 10kiB) files.
- The
pinentrybinary used to request passphrases can now be set manually withPINENTRY_PROGRAMenvironment variable. It accepts either a binary name a path. Setting this to the empty string will disablepinentryusage and back to the CLI interface. - Linux release binaries are now built using Ubuntu 20.04.
age
Added
age::Decryptor::{new_buffered, new_async_buffered}, which are more efficient types implementingstd::io::BufReadorfutures::io::AsyncBufReadincludes&[u8]slices).impl std::io::BufRead for age::armor::ArmoredReaderimpl futures::io::AsyncBufRead for age::armor::ArmoredReader
Changed
- The
pinentrybinary used byage::cli_common::read_secretcan now be set with thePINENTRY_PROGRAMenvironment variable. It accepts either a name or a path. Setting this to the empty string will disablepinentryand fall back to the CLI interface.
Fixed
- The
AsyncWrite::poll_writeimplementation forage::stream::StreamWriternever returns 0 if there is data to write. This makesStreamWriterwithfutures::io::copy.
rage v0.9.1
rage
Added
- Support for encrypted OpenSSH keys exported from 1Password.
age
Added
- Support for encrypted OpenSSH keys exported from 1Password.
rage v0.9.0
rage
Changed
- MSRV is now 1.59.0.
Fixed
- Encryption now returns an error if the file would be encrypted to no recipients. This can occur if only
-R/--recipients-fileflags are provided, and they all point to files that contain only "#" prefixed comments and empty lines.
age
Added
age::armor::ArmoredReadError, used to wrap armor-specific read errors insidestd::io::Error.age::ssh:impl Clone for Identity
Changed
- MSRV is now 1.59.0.
age::Encryptor::with_recipientsnow returnsOption<Encryptor>, withNonereturned if the provided list of recipients is empty (to prevent files being encrypted to no recipients). Therecipientsargument is also nowVec<Box<dyn age::Recipient + Send>>.age::encrypted::Identity::recipientsnow returnsVec<Box<dyn age::Recipient + Send>>.
Fixed
age::Decryptornow rejects invalid or non-canonicalscryptrecipient stanzas (instead of ignoring or accepting them respectively), matching the age specification.age::armor::ArmoredReader:- It now correctly implements strict parsing as defined in RFC 7468, and rejects armored files with non-canonical final lines (where padding bytes are omitted).
- It now rejects armored files with non-whitespace characters after the end marker.
- It now accepts armored files with no newline after the end marker. Previously these were rejected by the synchronous API, and would cause the async API to hang.
- The async API now correctly rejects some classes of invalid armoring that previously would cause it to hang.
age-plugin 0.4.0
Changed
- MSRV is now 1.59.0.
- Migrated to
age-core 0.9.
age-core
Changed
- MSRV is now 1.59.0.
- Migrated to
aead 0.5.
rage v0.8.1
rage
Security
- Require
age 0.8.1.
age
Security
age::Decryptordid not previously require "contributory" behaviour forX25519recipient stanzas. If an age file has anX25519recipient stanza with an ephemeral share that is a small-order point, the file could previously be decrypted by any native age identity. To ensure we match the behaviour in the age specification, these files are now rejected as invalid.
Fixed
age::Decryptornow rejects invalid or non-canonicalX25519recipient stanzas (instead of ignoring or accepting them respectively), matching the age specification.
rage v0.8.0
rage
Changed
- MSRV is now 1.56.0.
- When both reading input from the terminal (e.g. if the user is typing the plaintext to be encrypted) and writing output to the terminal,
ragenow buffers the output until the input is finished, so the output doesn't get in the way of typing. - A warning is now displayed if
ragedetects that the file being encrypted starts with the age magic string or armor begin marker (indicating that an age-encrypted file is being double-encrypted). The file is still encrypted. - A message is now printed if a plugin takes longer than 10 seconds to encrypt or decrypt its header entry (for example, if the plugin is waiting on some user interaction that hasn't occurred yet).
Fixed
- Decryption now returns an error when given a passphrase-encrypted file if
-i/--identityis present. Previously this could result in scripts hanging forever (given that passphrase decryption is intentionally not scriptable).
age
Added
age::Callbacks::confirmto request that the user provides confirmation for some action.age::cli_common::file_io::InputReader::is_terminalage::ssh::ParseRecipientKeyError, which was previously in the public API but unnameable and could not be matched upon.
Changed
- MSRV is now 1.56.0.
age::Callbacksnow requiresClone + Send + Sync + 'staticbounds.age::cli_common::file_io::OutputWriter::newnow takes aninput_is_ttyboolean argument. Ifinput_is_ttyis set totrue, then ifOutputWriterwill write to a stdout TTY, it buffers the entire output so it doesn't get in the way of typing the input, and then writes the buffered output to stdout duringOutputWriter::flush.- Ciphertexts are now required to end in a non-empty STREAM chunk, unless it is the only chunk (meaning that the plaintext is empty). Neither age nor rage generate non-empty files ending in an empty chunk, instead marking the final full chunk as the last chunk.
age-plugin 0.3.0
Added
age_plugin::Callbacks::confirm
Changed
- MSRV is now 1.56.0.
age-core
Added
age_core::io::{DebugReader, DebugWriter}age_core::plugin::Error::Unsupportedage_core::plugin::Reply::ok_with_metadata
Changed
- MSRV is now 1.56.0.
age_core::plugin:Connection::opennow returns the debugging-friendly concrete typeConnection<DebugReader<ChildStdout>, DebugWriter<ChildStdin>>.BidirSend::{send, send_stanza}now returnOk(Error::Unsupported)when anunsupportedresponse is received, instead ofErr(io::Error), making it easier for plugins to implement fallback strategies.