Skip to content

3.8.0 (Supreme 0.3.0)

Compare
Choose a tag to compare
@JesusMcCloud JesusMcCloud released this 20 Sep 13:03
· 36 commits to main since this release

Breaking Changes Ahead!

  • Completely revamped ASN.1 Tag Handling
    • Properly handle multi-byte tags
    • Introduce a new data structure TLV.Tag with an accompanying TagClass enum and a constructed flag to accurately represent arbitrary tags up to ULong.MAX_VALUE
    • Make all tag parameters ULong to reflect support for multi-byte tags
    • Remove DERTags
    • Revamp implicit tagging (there is still work to be done, but at least it supports CONSTRUCTED ASN.1 elements)
  • Refactor Int.Companion.decodeFromDer -> Int.Companion.decodeFromDerValue()
  • Refactor Long.Companion.decodeFromDer -> Long.Companion.decodeFromDerValue()
  • Introduce ULong.Companion.decodeFromDer which can handle overlong inputs, as long as they start with a valid ULong encoding
  • Changed return type of Verifier::verify from KmmResult<Unit> to KmmResult<Success>. Usage is unchanged.
  • Add ConfirmationClaim to represent Proof-of-Possesion Key Semantics for JWTs
  • Add claims to JsonWebToken to implement Demonstrating Proof of Possession
  • Replace JsonWebToken.confirmationKey by JsonWebToken.confirmationClaim, the implementation was wrong
  • Introduce ULong.toAsn1VarInt() to encode ULongs into ASN.1 unsigned VarInts (not to be confused with
    multi^2_base'sUVarInt!
    )
  • Introduce decodeAsn1VarULong() and decodeAsn1VarUInt() which can handle overlong inputs, as long as they start with a valid unsigned number encoding.
    • Comes in three ULong flavours:
      • Iterator<Byte>.decodeAsn1VarULong()
      • Iterable<Byte>.decodeAsn1VarULong()
      • ByteArray.decodeAsn1VarULong()
    • and three UInt flavours:
      • Iterator<Byte>.decodeAsn1VarUInt()
      • Iterable<Byte>.decodeAsn1VarUInt()
      • ByteArray.decodeAsn1VarUInt()
  • Revamp implicit tagging
  • Revamp Asn1Element.parse(), introducing new variants. This yields:
    • Asn1Element.parse() with the same semantics as before
    • Asn1Element.parse() alternative introduced, which takes a ByteIterator instead of a ByteArray
    • Asn1Element.parseAll() introduced, which consumes all bytes and returns a list of all ASN.1 elements (if parsing works)
      • Variant 1 takes a ByteIterator
      • Variant 2 takes a ByteArray
    • Asn1Element.parseFirst() introduced, which tries to only parse a single ASN.1 element from the input and leaves the rest untouched.
      • Variant 1 takes a ByteIterator and returns the element; the ByteIterator is advanced accordingly
      • Variant 2 takes a ByteArray and returns a Pair of (element, remainingBytes)
  • More consistent low-level encoding and decoding function names:
    • encodeToAsn1Primitive to produce an Asn1Primitive that can directly be DER-encoded
    • encodeToAsn1ContentBytes to produce the content bytes of a TLV primitive (the V in TLV)
    • decodeToXXX to be invoked on an Asn1Primitive to decode a DER-encoded primitive into the target type
    • decodeFromAsn1ContentBytes to be invoked on the companion of the target type to decode the content bytes of a TLV primitive (the V in TLV)
  • Update conventions -> Coroutines 1.0.9
  • replace runCatching with catching to be extra-safe

Closed Issues: