Percy++ / PIR in C++

Change Log
Version 1.0 (2014-10-17):
  • Added API documentation. Install doxygen 1.8.x and use 'make docs' to create the documentation.
  • Significantly changed the API of the classes. See the documentation for details.
  • Changed to the usage of executables, including pirclient and pirserver. Run the executables with --help flag to see usage.
  • Implemented the computational PIR protocol by Aguilar Melchor and Gaborit (2007). See agclient and agserver executables.
  • Implemented the hybrid PIR protocol by Devet and Goldberg (2014). See hybridclient and hybridserver executables.
  • Added multiblock querying for Goldberg's IT-PIR protocol (modes GF28, GF216, ZZ_P). Can now request multiple blocks in a single query. Use --batch-query option of pirclient.
  • Implemented Strassen's fast matrix multiplication algorithm for server computation in Goldberg's IT-PIR protocol (modes GF28, GF216, ZZ_P), based on Lueks and Goldberg (2014).
  • Added statistics collection to the servers and clients. See usage messages of executables for details.
  • Replaced testclient script with runtest and runtestset scripts. Run these scripts with --help to see usage messages.

Known bugs: SPIR support may not be working correctly in this version. The doxygen documentation is incomplete.

Version 0.9 (2013-06-07):
  • Added support for PIR servers that use multiple worker hosts to do their computations faster, and/or use multiple threads or processes per host
  • Considerably cleaned up the APIs on the client and server sides
  • "make libs" will now build separate Percy++ client and server libraries for linking into your own programs
  • Removed variable-length arrays for compiler portability
  • Improved the speed of queries for multiple blocks in GF(2^8)
  • Added "-1 / --oneconn" option to pirserver to accept a single client connection and not fork (useful for debugging)
Version 0.8 (2012-06-29):
  • Added support for Symmetric PIR, fast arithmetic in GF(2^16), and Chor et. al's lightweight protocol
  • Implemented many Reed-Solomon decoding algorithms, including Berlekamp-Welch, Cohn-Heninger Single-Polynomial Decoding, Cohn-Heninger Multi-Polynomial Decoding, a dynamic programming approach and a portfolio algorithm of all of the above. This allows for successful decoding with a higher number of Byzantine servers.
  • Modified command-line usage of testclient, pirclient and pirserver.
  • Improved testclient; testclient now kills pirserver processes after the test is completed.
  • Modified pirserver and pirclient to use sockets for communication; pirserver processes are now lauched separately from pirclient.
Version 0.7.1 (2007-06-17):
(Based on patches from Len Sassaman) Added support for *BSD stat(1) in testclient, and testclient now does additional sanity checks and auto-generates the test database if it doesn't exist (or isn't readable). Added the makefile argument "distclean" to clean up extraneous files. Utilities now display the current version number when given the argument --version. When recovering from Byzantine servers and HardRecover is invoked, a command-line message is displayed.
Version 0.7 (2007-04-03):
The Guruswami-Sudan implementation has been changed to a much more effecient algorithm. This saves about 70% of the runtime in the presence of Byzantine servers. Set the environment variable PIRC_NAIVE=1 to revert to the old algorithm for comparison.
Version 0.6 (2007-03-14)
Thanks to M. Jason Hinek, the dependency on MuPAD has been removed. All computations are now done natively in C++ using NTL.
Version 0.5 (2007-03-02)
Initial release

Percy++ is part of the Advanced Crypto Software Collection. Logo Valid XHTML 1.0 Transitional

Ian Goldberg <>