This program computes the weight of a Boolean function, given its Algebraic Normal Form. Explanation of the algorithm can be found here.


FolderHash tool is used to generate footprints of folders. It generates a hash value by processing all subfolders and the files in them. This footprint (hash value) is sensitive to any change in the structure of the folder including file/folder names and file contents. In order to accomplish this, SHA-256 and HMAC algorithms are used. In thoery, it should be as hard as to find a collison in SHA-256 for someone to come up with two different folders having the same hash value. A brief description of how the hash value of a folder is calculated is here.

This tool can be useful in the following situations:

  • You created a copy of a folder and you want to be sure that the folder is copied successfully.
  • You want to make sure that a folder content is not changed during some time period.

Of course, you can pack the file contents into a single file and then calculate the hash of the packed file instead. However, this requires more disk space and time (since a copy of the folder is generated), especially if the folder in question is large sized.

Multi-stream and Constant-time SHA-3 Implementations

I've implemented some of the SHA-3 competition finalists using vperm, bitslicing and multi-stream techniques in software. vperm and bitslicing techniques make the implementation resistant against cache-timing attacks by eliminating table lookups for the s-box'es. Plus, the implementation may even perform better than the lookup version sometimes. The vperm implementation can be easily converted to aes-ni implementation, so these were benchmarked as well. Multi-stream implementations make use of the SIMD architecture of the modern cpu's to process multiple instances of an algorithm simultaneously. Below table lists the implementation methods and the algorithms which they're applied.

Hash Function Implementation
BMW-256 4x
BMW-512 2x
ECHO-256 bitslice, vperm, aes-ni
ECHO-512 bitslice, vperm, aes-ni
Fugue-256 vperm, aes-ni
Fugue-512 vperm, aes-ni
Grostl-256 4x-bitslice, vperm, aes-ni
Grostl-512 4x-bitslice, vperm, aes-ni
Skein-256-256 2x
Skein-512-512 2x
SHA-256 4x
SHA-512 2x

Fugue Implementation

This is the vperm implementation of hash function Fugue based on Mike Hamburg's vperm AES implementation. It has slightly better performance than the SIMD implementation by Fugue authors. I presented this work in Second SHA-3 Candidate Conference in Santa Barbara. Details can be found here.


CIDAT (Ciper Design and Analysis Tool) was developed to visually design systems based on common building blocks such as Feedback Shift Registers, boolean functions, s-box, logical operators, etc. Although the application as is may not be well-fit for a cryptographer who wishes to design a cipher, it can be used for educational purposes, for instance demonstrating basic properties of a stream cipher (linear complexity, period, correlation). I did not have time to write a detailed documentation, however there are various examples that you can play with.


Given the truth table or ANF of a boolean function, this application computes the walsh spectrum, nonlinearity, degree, number of terms, weight, bent-ness and correlation immunity of it. Trivially, it converts ANF to truth table and vice versa.

Boolean Function Search

This command line tool finds boolean functions matching the criteria you specify. The search is performed by complementing the specified number of truth table entries of a given boolean function. The resulting boolean functions are filtered according to their properties (nonlinearity, weight, etc.) and saved to a file.

De Bruijn Sequence Search

This program searches feedback functions of a specified length which produce maximum length sequences (De Bruijn Sequences). Output contains the algebraic normal form, term count and the nonlinearity of the feedback function. If you have enough computation power, you can enumerate all such feedback functions of desired length.


This application was written while we were working on the quadratic complexities of binary sequences. Despite the name, it only calculates linear complexity correctly. If you're working on linear complexity of binary sequences, this might be of help to you.

Frequency Analyzer

This application counts the occurence of blocks of characters of an alphabet in a file. It can be used to detect the most frequent appearing patterns in a file. Custom alphabets can be defined, where you can restrict your search to a limited number of characters.

Windiff Helper

If you're using Windiff to compare folders, this tool may help you by invoking Windiff after you drag-drop the folders on its window. (You need to have Windiff utility in order to use this program)


This application renders curves and surfaces based on their parametrized descriptions and calculates some related quantities such as tangent, curvature, torsion, area and Gauss map. The hardest part of this project was to write a symbolic expression processor which can both evaluate and take derivative of functions of a single variable. The rendering was done with OpenGL.

Memory Game

In a job application in year 2000, I was asked to write a game with Macromedia Director. I decided to write the classical memory game, where you try to match people's faces.

I went to make a demonstration after a couple of weeks. Unfortunately, the game did not run. Years after, I tracked down the error; a non-standard font used in the game had caused the application to crash.