# Change Log
## [Unreleased][unreleased]
### Changed/Fixed
### Added
### Thanks
## 5.1.2
### Changed/Fixed
- Make `BerError` Copy + Clone
- Fix clippy warnings (rustc 1.54)
## 5.1.1
### Changed/Fixed
- BER: raise error if using Indefinite length and not constructed
- Fix `INTEGER` signed/unsigned parsing (#49)
- Fix INTEGER signed/unsigned parsing for bigint/biguint (#49)
- Doc: clarify documentation for parsing integers (#49)
## 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.