-*- mode: org; coding: utf-8 -*-

* Changes in version 2.2.1 (SemVer)

This is a bug fix release.

** (industria crypto aes): Fix crash with truncated AES-GCM

* Changes in version 2.2.0 (SemVer)

This release fixes bugs and introduces new features. It probably
doesn't introduce new bugs, but you never know.

Many thanks to leppie for contributing to this release!

** (industria crypto aes): Slow, but working, AES-GCM implementation
** (industria crypto chacha20): ChaCha20 stream cipher implementation
** (industria crypto ecdsa): New helpers for ASN.1 DER encoded signatures
** (industria dns): Export the make-edns-resource helper
** (industria bytevectors): Fix uint->bytevector for zero length
** (industria der): Fix printable-character? to use memv
** (industria ssh private serialize): Fix some zero length cases

* Changes in version 2.1.0 (SemVer)

** Automated testing

This release is automatically tested together with Akku.scm and these
Scheme implementations: Chez Scheme, GNU Guile, Ikarus, Larceny,
Racket, Sagittarius, Vicare and Ypsilon. Many tests are failing with
IronScheme.

** (industria base64): Optional support for inputs without padding

The Base 64 decoder now sports an additional argument that enables
decoding of inputs that are missing the padding characters, as in e.g.
RFC 7515.

** (industria base64): Fix for odd line lengths

This release fixes the get-delimited-base64 procedure so that it
handles the case where lines are not multiples of four characters.

** (industria bit-strings): New library for bit-strings

This data type previously lived in the DER library. It is used to
represent a sequence of bits.

** (industria bytevectors): New procedures, new arguments

The sint->bytevector, bytevector->sint and bytevector-for-each
procedures have been added. The uint->bytevector procedure has a new
optional length argument.

** (industria crypto ecdh): New library for ECDH

** (industria crypto eddsa): New library for EdDSA

** (industria crypto rsa): New procedures for creating PKCS signatures

The rsa-pkcs1-encrypt-digest procedure is used to create DER encoded
signatures and the rsa-pkcs1-encrypt-signature encrypts a raw digest.

** (industria der): Multiple bug fixes

The bit-string-length procedure previously returned the length of the
bit-string padded to bytes rather than the length in bits.

The internal DER representation (only meant to be passed to the
translate procedure) has received a few fixes.

There is also a new DER encoder, but it is not yet meant for public
use.

** (industria ssh): Support Ed25519, curve25519-sha256, RSA host keys

This release adds support for Ed25519 host keys and private keys, as
well as the curve25519-sha256 key exchange algorithm. It also adds
support for RSA host keys.

** (industria ssh private-keys): New library for reading private keys

This library reads SSH private keys. No support for password protected
keys yet.

* Changes in version 2.0.0 (SemVer)

** Removed libraries

This release removes many of the libraries that were previously part
of Industria:

 - (weinholt archive)
 - (weinholt assembler)
 - (weinholt compression)
 - (weinholt crypto crc)
 - (weinholt crypto hmac)
 - (weinholt crypto md5)
 - (weinholt crypto sha-1)
 - (weinholt crypto sha-2)
 - (weinholt crypto uuid)
 - (weinholt crypto x509)
 - (weinholt binfmt
 - (weinholt disassembler)
 - (weinholt net irc)
 - (weinholt net tls)
 - (weinholt struct pack)
 - (weinholt text internet)

These libraries have been moved to here:

 - https://github.com/weinholt/compression
 - https://github.com/weinholt/hashing
 - https://github.com/weinholt/ip-address
 - https://github.com/weinholt/irc-protocol
 - https://github.com/weinholt/machine-code
 - https://github.com/weinholt/struct-pack
 - https://gitlab.com/weinholt/TerribleTLS
 - https://github.com/weinholt/uuid

** Library renaming

The libraries were previously under the namespace (weinholt *), which
was originally based on a recommendation in R6RS non-normative
appendix G. They are now under (industria *) and are organized in
these categories:

 - (industria crypto) -- Cryptographical primitives
 - (industria dns) -- DNS
 - (industria otr) -- Off-The-Record messaging
 - (industria openpgp) -- OpenPGP
 - (industria ssh) -- Secure Shell

Various other utility libraries have been moved to the root of the
industria hierarchy.

** Library deprecation

The (industria tcp) library is deprecated and should not be used. Use
SRFI 106 instead.

** Akku manifest

Industria now comes with an Akku manifest that can be used to download
its dependencies in known good revisions.

More about Akku: https://github.com/weinholt/akku

** Incompatible changes

*** (industria ssh public-key): Fingerprints use SHA-256

The fingerprint algorithms now use SHA-256, which is aligned with
OpenSSH. The old MD5 algorithm is supported with an optional argument.

** Bug fixes

*** (industria otr): Fix random exponent size in SMP

Due to an error in the OTR protocol documentation the exponents picked
for the initial SMP message were only 128 bits instead of 1536 bits.
These smaller exponents were only used when initiating an SMP
authentication, not when responding to one.

Reference:
  http://lists.cypherpunks.ca/pipermail/otr-dev/2013-August/001817.html
  http://permalink.gmane.org/gmane.comp.security.otr.devel/1790

** New features

*** (industria ssh random-art): Extra footer argument

The random-art procedure takes an extra footer argument, which shows
the algorithm that computed the digest.

*** (industria otr): Support for OTR version 3

This release supports Off-the-Record Messaging Protocol version 3.
This version of the protocol uses instance tags, which are used to
distinguish between different OTR sessions. This fixes a problem with
chat networks that allow multiple logins. This version also defines an
extra symmetrical key that can be used by out-of-band protocols.

*** (industria base64): Optimized decoder and new non-strict mode

The Base 64 decoder has been optimized and is approximately six times
faster. In addition it can optionally ignore non-alphabet characters.

* Changes in version 1.4

** New license terms

Previous versions of Industria were licensed under the GNU GPL v3 or
later. Starting with this release Industria is instead available under
the MIT license. See LICENSE.txt for details.

** Library versioning will be removed

The library files in Industria have until now been using the library
versioning feature of R6RS. This feature has not received the kind of
support that I hoped for and is causing problems. The next version of
Industria will not have version numbers. If your import statements
look like this:

  (import (weinholt disassembler i8080 (1 (>= 0)))
          ...)

Then you need to change them to look like this:

  (import (weinholt disassembler i8080)
          ...)

** (weinholt disassembler x86): jnle was misinterpreted as XOP

* Changes in version 1.3

** (weinholt crypto crc): Pre-defined the crc-64/ecma polynomial

** (weinholt disassembler x86): Support for most AMD XOP instructions

** (weinholt compression xz): New decompressor for XZ data

This is a new library that implements a custom binary input port for
reading XZ compressed data. This is a container format for the LZMA2
compression algorithm and it is becoming popular as a replacement for
gzip and bzip2. Filters are not yet supported.

* Changes in version 1.2

** (weinholt binfmt elf): Parser for ELF binaries

This library provides parsers for various structures in ELF binaries.
It also exports many standard constants. The libraries were included
in previous releases, but had been undocumented. This release improves
the interface and includes documentation.

** (weinholt crypto ec): New library for elliptic curve cryptography

This new library implements basic elliptic curve cryptography over
finite prime fields. It exports mathematical operators, some standard
curves, and procedures for bytevector conversion of points.

** (weinholt crypto ec dsa): New library for elliptic curve DSA

This library is similar to (weinholt crypto dsa), except it works with
elliptic curves. ECDSA signatures can be generated and verified.

** (weinholt crypto rsa): Private key operations

Private RSA key operations have been implemented. See the manual for
more details.

** (weinholt crypto ssh-public-key): Support for ECDSA keys

Support has been added for elliptic curve DSA keys. The new procedure
ssh-public-key-algorithm returns the SSH algorithm identifier of a
key.

** (weinholt net ssh): New library for the Secure Shell protocol

This library implements the Secure Shell protocol. This is a protocol
widely used in the Internet as a secure replacement for telnet and
some other services. Both servers and clients can be implemented using
this library. It's not yet known if the provided interface is suitable
for interactive applications.

** (weinholt net tcp): Very simple TCP client library

This library provides the tcp-connect procedure, which simply opens a
TCP connection to a host and service. This requires implementation-
specific code, so the author is not eager to provide more than the
bare minimum. Code has been provided for most R6RS implementations.

** (weinholt struct pack): Fix infinite loop in a special case

When `pack!' can't determine field offsets at expansion time and it
needs to make sure the padding between two fields is set to zero, it
will residualize a call to the private procedure `bytevector-zero!'.
This procedure had a bug that caused it to never terminate if the
start and end indices differed.

** (weinholt text internet): Internet address parsing and formatting

This new library provides procedures for converting between string and
bytevector representations of IPv4 and IPv6 addresses. The IPv6
address text representation is the one recommended by RFC 5952.

* Changes in version 1.1

** (weinholt bytevectors): Added bytevector=?/constant-time

The procedure bytevector=?/constant-time compares two bytevectors by
summing up their differences.

** (weinholt crypto blowfish): New procedures for CBC mode

The procedures blowfish-cbc-encrypt! and blowfish-cbc-decrypt! were
added.

** (weinholt crypto dh): New library for Diffie-Hellman key exchange

This code was previously spread out in different libraries. The
library exports make-dh-secret, expt-mod and a few MODP groups.

** (weinholt crypto dsa): Better secret numbers for signatures

The per-message secret number used by dsa-create-signature is now
generated more in accordance with FIPS 186-3 Appendix B.2.1.

** (weinholt crypto md5): Added md5-96 and equality predicates

Added md5-length, md5-96-copy-hash!, md5-hash=? and md5-96-hash=?. The
-96 procedures work with the leftmost 96 bits of a hash. The equality
predicate compares an md5 state with a bytevector in a manner intended
to not leak timing information about the comparison.

** (weinholt crypto openpgp): New exports

Added port-ascii-armormed? which checks if the data on a binary input
port looks like a binary OpenPGP packet or not. The procedure
get-openpgp-packet was added to the exports.

** (weinholt crypto sha-1): Added sha-1-96 and equality predicates

Same changes as the md5 library.

** (weinholt crypto sha-2): Equality predicates and HMAC bug fix

Same changes as the md5 library except that the -96 procedures are
-128 here. There are also bug fixes: the procedures hmac-sha-384 and
hmac-sha-512 were previously defined using an incorrect block size.
This change makes the output incompatible with previous versions, so
the major version was incremented to 1. Another bug fixed was that the
hmac procedures couldn't handle key lengths larger than the block
size.

** (weinholt disassembler i8080): New disassembler for Intel 8080

This is a new disassembler for Intel 8080/8085, which was the
predecessor of the Intel 8086.

** (weinholt disassembler x86): Limit get-instruction to 15 bytes

Instructions on the x86 can at most be 15 bytes long. Previously this
limit was not enforced by get-instruction. Overlong instructions now
raise &invalid-opcode as expected.
