pedagand / usuba

A programming language to write bitsliced ciphers

Home Page:https://usubalang.github.io/usuba

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Usuba

Usuba is a programming language to write bitsliced code. It compiles optimized to C code (+ intrinsics).


Presentation

Go to our website to find more about Usuba.

In particular, the following blog articles are a good introduction:

To go into more details, read our published papers about Usuba:

Finally, some additional resources that could be useful:

Development setup

Usuba is written in OCaml. A minimal development & benchmark environment is specified in the Docker file ./docker/Dockerfile starting from an unstable Debian distribution. You can either use this image through

cd docker; make build && make bench

or take inspiration from it to reproduce the build environment on your local machine. Once the environment is setup, the usuba compiler is available as ./usubac.

A few examples

A few examples of Usuba codes:

If you are familiar with Perl, an easy way to see the compiler an action is to look at the scripts in the directory checks/correctness that compile a few Usuba codes, run them and make sure they produce the expected results.

Compiling

To compile an Usuba file (.ua), you need to invoke ./usubac <options> <source.ua> (the Usuba source file must be the last argument). I strongly recommand always using the flag -no-sched when doing pure bitslicing (it disables a few experimental options, and reduces the amount of code loaded). The option -no-arr-entry might also be usefull for small functions (combined with -no-arr). The list of flags can be obtained by running ./usubac -help.

For instance, to compile a bitslice AES:

./usubac -B -o aes.c -no-sched samples/usuba/aes.c

The C code generated by Usuba uses macros to achieve genericity. This macros are loaded with the instruction #include "XXX.h" at the begining of the C files generated, where XXX is one of STD, SSE, AVX (which should be AVX2), AVX512, Neon, AltiVec. Those headers are located in the directory arch.

For contributors

If you change some types in Config.conf or Usuba_AST, you should create a branch for these changes only since they're not supposed to change the behaviour of passes. Once this is done, update the unit_tests submodule with:

  • ./scripts/run-selected.sh -- -dump-steps ast -dump-steps-dir unit_tests/rsc
    This will populate the rsc dir
  • Go in unit_tests and execute:
    ./generate.sh --steps-dir rsc

This way, the unit_tests will be able to check that your work on the rest of usuba doesn't break the expected behaviour and you can start working on a new branch with algorithmic changes.

About

A programming language to write bitsliced ciphers

https://usubalang.github.io/usuba

License:MIT License


Languages

Language:C 67.7%Language:OCaml 29.7%Language:Perl 2.4%Language:Dockerfile 0.1%Language:Emacs Lisp 0.1%Language:Makefile 0.0%Language:Shell 0.0%