# Intel(R) EPID SDK ChangeLog                                   {#ChangeLog}

## [6.0.1] - 2018-05-04

### Changed

- Updated Intel(R) IPP Cryptography library to version 2018 (Update
  2.1).

### Fixed

- The member library now includes the tpm2 subcomponent when built
  using SCons, instead of requiring a separate member.tpm2 library.

### Known Issues

- Only the SHA-256 hash algorithm is supported when using the SDK with
  the IBM TPM simulator due to a defect in version 532 of the
  simulator.

- Basenames are limited to 124 bytes in TPM mode.

- Scons build will not work natively on ARM. You can still build using
  `make` or cross compile.

## [6.0.0] - 2017-12-15

### Added

- The member can now be built with a substantially reduced code size
  using a compilation option.

- New context lifetime management APIs have been added to member to
  give callers more control of memory allocation.

- New member API `EpidClearRegisteredBasenames` has been added to
  clear registered basenames without recreating the member.

### Changed

- `EpidRegisterBaseName` was renamed to `EpidRegisterBasename` because
  basename is a single word.

- Command-line parsing library used by samples and tools has been
  replaced by Argtable3.


### Deprecated

- `EpidMemberCreate` has been deprecated. This API has been superseded
  by `EpidMemberGetSize` and `EpidMemberInit`.

- `EpidMemberDelete` has been deprecated. This API has been superseded
  by `EpidMemberDeinit`.

### Removed

- `size_optimized_release` build configuration has been removed.
  Use the compilation option to build member with reduced code size.

### Known Issues

- Only the SHA-256 hash algorithm is supported when using the SDK with
  the IBM TPM simulator due to a defect in version 532 of the
  simulator.

- Basenames are limited to 124 bytes in TPM mode.

- Scons build will not work natively on ARM. You can still build using
  `make` or cross compile.


## [5.0.0] - 2017-09-15

### Added

- The member implementation now has the option to support signing
  using a TPM, using the ECDAA capabilities of TPM 2.0.


### Changed

- Member API updated to unify HW and SW use cases.
    - Added
        - `ProvisionKey`
        - `ProvisionCompressed`
        - `ProvisionCredential`
        - `Startup`
    - Parameters changed
        - `MemberCreate`
        - `RequestJoin`
    - Removed or made private
        - `WritePrecomp`
        - `SignBasic`
        - `NrProve`
        - `AssemblePrivKey`

- `EpidRequestJoin` was renamed to `EpidCreateJoinRequest` to make it
  clear that it is not directly communicating with the issuer.


### Fixed

- `EpidCreateJoinRequest` creates valid join requests. This fixes a
  regression in `EpidRequestJoin` introduced in 4.0.0.


### Known Issues

- Only the SHA-256 hash algorithm is supported when using the
  SDK with the IBM TPM simulator due to a defect in version
  532 of the simulator.

- Basenames are limited to 124 bytes in TPM mode.


## [4.0.0] - 2017-04-25

### Added

- The member implementation now provides an internal interface that
  gives guidance on partitioning member operations between highly
  sensitive ones that use f value of the private key, and less
  sensitive operations that can be performed in a host environment.

- New member API `EpidAssemblePrivKey` was added to help assemble and
  validate the new member private key that is created when a member
  either joins a group (using the join protocol) or switches to a new
  group (as the result of a performance rekey).


### Changed

- Updated Intel(R) IPP Cryptography library to version 2017 (Update 2).

- The mechanism to set the signature based revocation list (SigRL)
  used for signing was changed. `EpidMemberSetSigRl` must be used to
  set the SigRL. The SigRL is no longer a parameter to `EpidSign`.
  This better models typical use case where a device stores a
  revocation list and updates it independently of signing operations.


### Removed

- Removed `EpidWritePreSigs` API. Serialization of pre-computed
  signatures is a risky capability to provide, and simply expanding
  the internal pool via `EpidAddPreSigs` still provides most of the
  optimization benefits.

- The `EpidIsPrivKeyInGroup` API is no longer exposed to clients. It
  is no longer needed because the new member API `EpidAssemblePrivKey`
  performs this check.


### Fixed

- When building with commercial version of the Intel(R) IPP
  Cryptography library, optimized functions are now properly invoked,
  making signing and verification operations ~2 times faster

- SHA-512/256 hash algorithm is now supported.

- README for compressed data now correctly documents the number of
  entries in revocation lists.

- The `verifysig` sample now reports a more clear error message for
  mismatched SigRLs.

- The default scons build will now build for a 32-bit target on a
  32-bit platform.


### Known Issues

- Scons build will not work natively on ARM. You can still build using
  `make` or cross compile.


## [3.0.0] - 2016-11-22

### Added

- Support for verification of Intel(R) EPID 1.1 members.

- Make-based build system support.

- Sample material includes compressed keys.

- Enhanced documentation, including step-by-step walkthroughs of
  example applications.

- Validated on additional IoT platforms.

  - Ostro Linux

  - Snappy Ubuntu Core


### Changes

- A new verifier API has been added to set the basename to be used for
  verification. Verifier APIs that used to accept basenames now use
  the basename set via `EpidVerifierSetBasename`.

- The verifier pre-computation structure has been changed to include
  the group ID to allow detection of errors that result from providing
  a pre-computation blob from a different group to
  `EpidVerifierCreate`.


### Fixes

- The kEpidxxxRevoked enums have been renamed to be consistent with
  other result return values.


### Known Issues

- SHA-512/256 hash algorithm is not supported.


## [2.0.0] - 2016-07-20

### Added

- Signed binary issuer material support.

  - Binary issuer material validation APIs.

  - Updated sample issuer material.

  - Updated samples that parse signed binary issuer material.

- Compressed member private key support.

- Validated on additional IoT platforms.

  - Windows 10 IoT Core

  - WindRiver IDP


### Changed

- The default hash algorithm has changed. It is now SHA-512.

- Functions that returned `EpidNullPtrErr` now return `EpidBadArgErr`
  instead.


### Fixed

- Updated build flags to work around GCC 4.8.5 defect.


## [1.0.0] - 2016-03-03

### Added

- Basic sign and verify functionality

- Dynamic join support for member

- Apache 2.0 License
