Skip to content
Micro RFC 3161 Time-Stamp server written in C.
Branch: master
Clone or download
Latest commit 86d9094 Apr 12, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
cmake remove cmake warning + better comment Apr 21, 2017
conf better handling for logging to stdout Apr 10, 2019
goodies dl for the signer cert + fix example + css tweaks Apr 12, 2019
tests sleep unit tests (hopefully Apr 10, 2019
.gitignore adding the configure.rst file in gitignore Sep 23, 2016
.gitmodules remove submodule for civetweb Sep 7, 2016
.travis.yml Update .travis.yml May 19, 2017
CMakeLists.txt changelog Apr 12, 2019
ChangeLog.rst changelog Apr 12, 2019
Jenkinsfile Updated Jenkinsfile Apr 27, 2017
LICENSE Initial commit Dec 16, 2015
README.rst Update README.rst Apr 12, 2019
_config.yml Set theme jekyll-theme-hacker Dec 6, 2017


uts-server Documentation Status Jenkins Status

Micro RFC 3161 Time-Stamp server written in C.

Doc:Uts-Server documentation on ReadTheDoc
Dev:Uts-Server source code on GitHub
Author:Pierre-Francois Carpentier - copyright © 2019


A demo is accessible here:


Released under the MIT Public License

What is RFC 3161?

An RFC 3161 time-stamp is basically a cryptographic signature with a date attached.

Roughly, it works as follow:

  1. A client application sends an hash of the data it wants to time-stamp to a Time-Stamp authority server.
  2. The Time-Stamp authority server retrieves the current date, concatenates it with the hash and uses its private key to create the time-stamp (kind of like a signature).
  3. The Time-Stamp authority server returns the generated time-stamp to the client application.

Then a client can verify the piece of data with the time-stamp using the Certificate Authority of the time-stamp key pair (X509 certificates).

It gives a cryptographic proof of a piece of data content, for example a file, at a given time.

Some use cases:

  • time-stamp log files at rotation time.
  • time-stamp file at upload to prove it was delivered in due time or not.

Quick (and dirty) Testing

Here a few steps to quickly try out uts-server, for production setup, please compile civetweb externally and create proper CA and certificates:

# Building with civetweb embedded (will recover civetweb from github).
# Note: the BUNDLE_CIVETWEB option is only here for fast testing purpose
# The recommended way to deploy uts-server in production is to build civetweb
# separatly and to link against it.
$ make

# Create some test certificates.
$ ./tests/cfg/pki/create_tsa_certs

# Launching the time-stamp server with test configuration in debug mode.
$ ./uts-server -c tests/cfg/uts-server.cnf -D

# In another shell, launching a time-stamp script on the file.
$ ./goodies/ -i README.rst -u http://localhost:2020 -r -O "-cert";

# Verify the time-stamp.
$ openssl ts -verify -in README.rst.tsr -data README.rst -CAfile ./tests/cfg/pki/tsaca.pem

# Display the time-stamp content.
$ openssl ts -reply -in README.rst.tsr -text

Powered by
You can’t perform that action at this time.