# Change Log ## [Unreleased][unreleased] ### Changed/Fixed ### Added ### Thanks ## 9.0.0 ### Changed/Fixed - Upgrade `asn1-rs` to 0.6.0 - Set MSRV to 1.63.0 - Update hex-literal to 0.4.0 - Implement `BerObject::try_from(Any)` (#67) ## 8.2.0 ### Changed/Fixed - Fix parser name to `parse_der_visiblestring` for `VisibleString` (Closes #64). Keep previous function for compatibility (mark it as deprecated). - Fix clippy warnings (rustc 1.67.1) - Update test-case from 2.0 to 3.0 ## 8.1.0 ### Changed/Fixed - Upgrade `asn1-rs` to 0.5.0 (new features only: only increment minor number) ## 8.0.0 ### Changed/Fixed - Upgrade `asn1-rs` to 0.4.0 This causes an increment of the major number, because `asn1-rs` is re-exported ## 7.0.0 This release marks the beginning of the merge with the `asn1-rs` crate. **This will break things.** However, this is necessary, because the `asn1-rs` crate is much cleaner and supports more types and features (like serialization, custom derive, etc.). Ultimately, this crate will become a frontend to `asn1-rs`, that will be optional: crate users can switch to `asn1-rs` and use it directly. ### Changed/Fixed MSRV: The minimum supported rust version is now *1.53*. `BerObjectHeader`: - `BerSize` has been renamed to `Length` - `BerClass` has been renamed to `Class` - `BerTag` has been renamed to `Tag` - Header fields are now private. Getters/setters have been added, and must be used to access/modify fields `BerObjectContent`: - `Unknown` variant now contains an `Any` object, with both the header and object content - `Private` variant has been merged into `Unknown` - `BmpString`, `GeneralString`, `GraphicString`, `T61String`, `VideotexString` and `ObjectDescriptor` are now decoded - `GeneralizedTime` and `UtcTime` are now decoded `BerError`: - Add error types `UnexpectedClass` and `UnexpectedTag` - Store expected and found item in error to help debugging - Keep `InvalidTag` for tags with invalid form (length/encoding/etc.) - Use `displaydoc` for `BerError` - Parsing an indefinite length in DER now raises `IndefiniteLengthUnexpected` - Error: when a DER constraint fails, store constraint identifier `DER`: - `DerClass` and `DerTag` have been deprecated. Use `Class` and `Tag` instead. - `DerObjectHeader` has been deprecated. Use `Header` instead. `Oid`: - The `Oid` object is now the same as `asn1_rs::Oid` (simply reexported) - Remove dependency on crate `der-oid-macro` Misc: - `ber_read_element_content_as` now requires a non-zero `depth`, or it will raise a `BerMaxDepth` error (previously, 0 allowed one level of parsing) - crate `rusticata-macros` is now re-exported (#55) ### Thanks - @lilyball - @erikmarkmartin ## 6.0.0 This release has several major changes: - upgrade to nom 7 - add support for `no_std` - remove all macros - update MSRV to 1.48 ### Changed/Fixed - Do not attempt to parse PRIVATE object contents (closes #48) - BER: raise error if using Indefinite length and not constructed - Fix `oid!` macro to be independant of `der_parser` crate name and path (#46) - Simplify `der-oid-macro`, do not depend on `nom` - Fix `INTEGER` signed/unsigned parsing (#49) - Change `as_bigint()` and `as_uint()` to return a `Result` - Remove deprecated functions ### Added - Added support for `no_std` (#50) - Make `BerError` Copy + Clone (#51) - Add feature 'bitvec' for `.as_bitslice()` methods ### Removed - Remove all macros ### Thanks - @yoguorui for `no_std` support - @SergioBenitez for `BerError` traits - @lilyball for `INTEGER` parsing ## 5.1.0 ### Changed/Fixed - Remove dependency on proc-macro-hack (attempt to fix #36) - Update pretty_assertions requirement from 0.6 to 0.7 - Update num-bigint to 0.4 (Closes #42) ## 5.0.1 ### Changed/Fixed - Fix typos in the `parse_[ber|der]_[u32|u64]` doc comments - Add documentation for BerObjectContent variants (#41) - Fixes for clippy ### Added ## 5.0.0 See changelog entries for 5.0.0-beta1 and -beta2 for changes since 4.1 ### Changed/Fixed The following changes applies since 5.0.0-beta1, and do not affect 4.x - Fix potential integer underflow in `bytes_to_u64` - Fix potential stack recursion overflow for indefinite length objects (Add maximum depth). - Fix potential UB in bitstring_to_u64 with large input and many ignored bits - Fix constructed objects parsing with indefinite length (do not include EOC) - Constructed objects: use `InvalidTag` everywhere if tag is not expected - Integer parsing functions now all return `IntegerTooLarge` instead of `MapRes` - Ensure Indefinite length form is only used in BER constructed objects ### Added - Add new error `StringInvalidCharset` and update string parsing methods - Add methods `parse_ber_slice` and `parse_der_slice` to parse an expected Tag and get content as slice ## 5.0.0-beta2 ### Changed/Fixed - Consistency: reorder arguments or function callbacks, always set input slice as first argument (`parse_ber_sequence_defined_g`, `parse_ber_container`, `parse_ber_tagged_explicit_g`, ...) - Make functions `parse_ber_sequence_of_v` and `parse_ber_set_of_v` accept generic error types ### Added - Add `parse_ber_content2`, owned version of `parse_ber_content`, which can directly be combined with `parse_ber_tagged_implicit_g` - Add methods to parse DER tagged values and containers (with constraints) ## 5.0.0-beta1 ### Changed/Fixed - Upgrade to nom 6 - Switch all parsers to function-based parsers - Change representation of size (new type `BerSize`) to support BER indefinite lengths - Rewrite BER/DER parsing macros to use functional parsing combinators - The constructed bit is now tested for explicit tagged structures - Some checks (for ex. tags in constructed objects) now return specific errors (`InvalidTag`) instead of generic errors (`Verify`) - Refactor BerObject for parsing of tagged and optional values - Add method `as_bitslice()` to BerObject - Remove Copy trait from BerObjectHeader, copy is non-trivial and should be explicit - Fix the bug that caused OIDs longer than two subidentifiers which started by subidentifiers "0.0" ("itu-t recommenation") not to be decoded correctly - Implement the `as_u64` and `as_u32` methods for BerObjects with contents of type `BerObjectContent::BitString`. - Implement the `VideotexString`, `ObjectDescriptor` `GraphicString`, and `VisibleString` string types. (Non-breaking changes) - Correctly decode `BMPString` as UTF-16 instead of UTF-8 when printing. (Non-breaking change) - Turn `UTCTime` and `GeneralizedTime` into a `&str` instead of `&[u8]`, as they inherit from `VisibleString` which is a subset of ASCII. (Breaking change) ### Added - Add combinator `parse_ber_optional` ### Thanks By alphabetic order of handle: - `@cccs-sadugas` - `@nickelc` - `@p1-mmr` ## 4.1.0 ### Added/Changed - Re-export num-bigint so crate users do not have to import it - Add function versions to parse BER sequences/sets (#20) - Add function versions to parse BER tagged objects (#20) - Add generic error type to structured parsing functions - Add function to parse a generic BER container object - Document that trailing bytes from SEQUENCE/SET are ignored - Deprecate functions `parse_{ber,der}_explicit` (use `_optional`) ## 4.0.2 ### Changed/Fixed - Upgrade dependencies on num-bigint and der-oid-macro ## 4.0.1 ### Changed/Fixed - Add workaround to fix parsing of empty sequence or set ## 4.0.0 **Attention** This is a major release, with several API-breaking changes. See `UPGRADING.md` for instructions. ### Thanks - Jannik Schürg (oid, string verifications) ### Added - Add functions `parse_ber_recursive` and `parse_der_recursive`, allowing to specify maximum recursion depth when parsing - The string types `IA5String`, `NumericString`, `PrintableString` and `UTF8String` do now only parse if the characters are valid. - `as_str()` was added to `BerObjectContent` to obtain a `&str` for the types above. `as_slice()` works as before. - Implement `Error` trait for `BerError` - Add method to extract raw tag from header - `BerObjectHeader` now has a lifetime and a `raw_tag` field - `BerObject` now has a `raw_tag` field - Implement `PartialEq` manually for `BerObject`: `raw_tag` is compared only if both fields provide it - Add type `BerClass` - Start adding serialization support (experimental) using the `serialize` feature ### Changed/Fixed - Make header part of `BerObject`, remove duplicate fields - Maximum recursion logic has changed. Instead of providing the current depth, the argument is now the maximum possible depth. - Change the api around `Oid` to achieve zero-copy. The following changed: - The `Oid` struct now has a lifetime and uses `Cow` internally. - The procedural macro `oid!` was added. - `Oid::from` returns a `Result` now. - The `Oid` struct now encodes whether the oid is relative or not. - The `Debug` implementation now shows whether the oid is relative and uses the bigint feature if available. - The `Oid::iter` method now returns an `Option`. `Oid::iter_bigint` was added. - `Hash` is now derived for `Oid`. - Minimum rust version is now 1.34 ## 3.0.3 - Make the pretty-printer function public - Fix DER datestring sanity check - CI - add rusfmt check - add cargo clippy ## 3.0.2 - Add `parse_ber_u32` and `parse_ber_u64` functions - Fix typo in description ## 3.0.1 - Add crate `BerResult` and `DerResult` types - Use crate result types, remove uneeded imports - Crates using `der-parser` do not need to import `nom` or `rusticata-macros` anymore - Result types are aliases, so API is unchanged ## 3.0.0 - Upgrade to nom 5 (breaks API) - New error types, now all functions use `BerError` ## 2.1.0 - Handle BER/DER tags that are longer than one byte. - Set edition to 2018 ## 2.0.2 - Revert 2.0.1 release, breaks API ## 2.0.1 - Handle BER/DER tags that are longer than one byte. ## 2.0.0 - Refactor code, split BER and DER, check DER constraints - Add recursion limit for sequences and sets - Rustfmt - Documentation - Remove unused function `ber_read_element_content` ## 1.1.1 - Fix OID parsing, and add support for relative OIDs - Add FromStr trait for Oid ## 1.1.0 - Use num-bigint over num and upgrade to 0.2 ## 1.0.0 - Upgrade to nom 4 ## 0.5.5 - Add functions `parse_der_u32` and `parse_der_u64` to quickly parse integers - Remove `Oid::from_vec`, `Oid::from` does the same - Enforce constraints on DER booleans ## 0.5.4 - Add `BitStringObject` to wrap BitString objects - Mark constructed BitStrings as unsupported - Do not try to parse application-specific data in `parse_der` ## 0.5.3 - Add function `DerObject::as_u64` - Add function `DerObject::as_oid_val` - Add `parse_der_struct!` variant to check tag ## 0.5.2 - Add functions to test object class and primitive/constructed state - Add macro `parse_der_application!` - Add macro `parse_der_tagged!` to parse `[x] EXPLICIT` or `[x] IMPLICIT` tagged values ## 0.5.1 - Add type GeneralString - Add macro `parse_der_struct!` ## 0.5.0 - Allow use of crate without extra use statements - Use constants for u32 errors instead of magical numbers - Rename `tag_of_der_content()` to `DerObjectContent::tag` - Rename DerElementxxx structs to have a consistent naming scheme - Add documentation for parsing DER sequences and sets, and fix wrong return type for sets - Fix a lot of clippy warnings - QA: add pragma rules (disable unsafe code, unstable features etc.) - More documentation - Switch license to MIT + APLv2 ## 0.4.4 - Add macro parse_der_defined_m, to parse a defined sequence or set This macro differs from `parse_der_defined` because it allows using macros - Rename `DerObject::new_int` to `DerObject::from_int_slice` - Rename `Oid::to_hex` to `Oid::to_string` - Document more functions ## 0.4.1 - Add new feature 'bigint' to export DER integers - OID is now a specific type - Add new types T61String and BmpString - Fix wrong expected tag in parse_der_set_of ## 0.4.0 - Der Integers are now represented as slices (byte arrays) since they can be larger than u64.