1\documentclass[synpaper]{book} 2\usepackage{geometry} 3\usepackage{hyperref} 4\usepackage{makeidx} 5\usepackage{amssymb} 6\usepackage{color} 7\usepackage{alltt} 8\usepackage{graphicx} 9\usepackage{layout} 10\usepackage{fancyhdr} 11\usepackage{float} 12\def\union{\cup} 13\def\intersect{\cap} 14\def\getsrandom{\stackrel{\rm R}{\gets}} 15\def\cross{\times} 16\def\cat{\hspace{0.5em} \| \hspace{0.5em}} 17\def\catn{$\|$} 18\def\divides{\hspace{0.3em} | \hspace{0.3em}} 19\def\nequiv{\not\equiv} 20\def\approx{\raisebox{0.2ex}{\mbox{\small $\sim$}}} 21\def\lcm{{\rm lcm}} 22\def\gcd{{\rm gcd}} 23\def\log{{\rm log}} 24\def\ord{{\rm ord}} 25\def\abs{{\mathit abs}} 26\def\rep{{\mathit rep}} 27\def\mod{{\mathit\ mod\ }} 28\renewcommand{\pmod}[1]{\ ({\rm mod\ }{#1})} 29\newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} 30\newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} 31\def\Or{{\rm\ or\ }} 32\def\And{{\rm\ and\ }} 33\def\iff{\hspace{1em}\Longleftrightarrow\hspace{1em}} 34\def\implies{\Rightarrow} 35\def\Proof{\vspace{1ex}\noindent {\bf Proof:}\hspace{1em}} 36\let\oldphi\phi 37\def\phi{\varphi} 38\def\Pr{{\rm Pr}} 39\newcommand{\str}[1]{{\mathbf{#1}}} 40\def\F{{\mathbb F}} 41\def\N{{\mathbb N}} 42\def\Z{{\mathbb Z}} 43\def\R{{\mathbb R}} 44\def\C{{\mathbb C}} 45\def\Q{{\mathbb Q}} 46\definecolor{DGray}{gray}{0.5} 47\newcommand{\emailaddr}[1]{\mbox{$<${#1}$>$}} 48\def\twiddle{\raisebox{0.3ex}{\mbox{\tiny $\sim$}}} 49\def\gap{\vspace{0.5ex}} 50\makeindex 51\newcommand{\mysection}[1] % Re-define the chaptering command to use 52 { % THESE headers. 53 \section{#1} 54 \markboth{\textsf{www.libtom.net}}{\thesection ~ {#1}} 55 } 56 57\newcommand{\mystarsection}[1] % Re-define the chaptering command to use 58 { % THESE headers. 59 \section*{#1} 60 \markboth{\textsf{www.libtom.net}}{{#1}} 61 } 62\pagestyle{empty} 63\begin{document} 64\frontmatter 65\pagestyle{empty} 66 67~ 68 69\vspace{2in} 70 71~ 72 73\begin{center} 74\begin{Huge}LibTomCrypt\end{Huge} 75 76~ 77 78\begin{large}Developer Manual\end{large} 79 80~ 81 82\vspace{15mm} 83 84 85\begin{tabular}{c} 86LibTom Projects 87\end{tabular} 88\end{center} 89\vfil 90\newpage 91This document is part of the LibTomCrypt package and is hereby released into the public domain. 92 93~ 94 95Open Source. Open Academia. Open Minds. 96 97~ 98 99\begin{flushright} 100LibTom Projects 101~ 102 103\& originally 104~ 105 106Tom St Denis 107~ 108 109Ottawa, Ontario 110~ 111 112Canada 113~ 114\vfil 115\end{flushright} 116\newpage 117 118\tableofcontents 119\listoffigures 120\pagestyle{myheadings} 121\mainmatter 122\chapter{Introduction} 123\mysection{What is the LibTomCrypt?} 124LibTomCrypt is a portable ISO C cryptographic library meant to be a tool set for cryptographers who are 125designing cryptosystems. It supports symmetric ciphers, one-way hashes, pseudo-random number generators, 126public key cryptography (via PKCS \#1 RSA, DH or ECCDH), and a plethora of support routines. 127 128The library was designed such that new ciphers/hashes/PRNGs can be added at run-time and the existing API 129(and helper API functions) are able to use the new designs automatically. There exists self-check functions for each 130block cipher and hash function to ensure that they compile and execute to the published design specifications. The library 131also performs extensive parameter error checking to prevent any number of run-time exploits or errors. 132 133\mysection{Why did I write it?} 134You may be wondering, \textit{Tom, why did you write a crypto library. I already have one.} Well the reason falls into 135two categories: 136\begin{enumerate} 137 \item I am too lazy to figure out someone else's API. I'd rather invent my own simpler API and use that. 138 \item It was (still is) good coding practice. 139\end{enumerate} 140 141The idea is that I am not striving to replace OpenSSL or Crypto++ or Cryptlib or etc. I'm trying to write my 142{\bf own} crypto library and hopefully along the way others will appreciate the work. 143 144With this library all core functions (ciphers, hashes, prngs, and bignum) have the same prototype definition. They all load 145and store data in a format independent of the platform. This means if you encrypt with Blowfish on a PPC it should decrypt 146on an x86 with zero problems. The consistent API also means that if you learn how to use Blowfish with the library you 147know how to use Safer+, RC6, or Serpent as well. With all of the core functions there are central descriptor tables 148that can be used to make a program automatically pick between ciphers, hashes and PRNGs at run-time. That means your 149application can support all ciphers/hashes/prngs/bignum without changing the source code. 150 151Not only did I strive to make a consistent and simple API to work with but I also attempted to make the library 152configurable in terms of its build options. Out of the box the library will build with any modern version of GCC 153without having to use configure scripts. This means that the library will work with platforms where development 154tools may be limited (e.g. no autoconf). 155 156On top of making the build simple and the API approachable I've also attempted for a reasonably high level of 157robustness and efficiency. LibTomCrypt traps and returns a series of errors ranging from invalid 158arguments to buffer overflows/overruns. It is mostly thread safe and has been clocked on various platforms 159with \textit{cycles per byte} timings that are comparable (and often favourable) to other libraries such as OpenSSL and 160Crypto++. 161 162\subsection{Modular} 163The LibTomCrypt package has also been written to be very modular. The block ciphers, one--way hashes, 164pseudo--random number generators (PRNG), and bignum math routines are all used within the API through \textit{descriptor} tables which 165are essentially structures with pointers to functions. While you can still call particular functions 166directly (\textit{e.g. sha256\_process()}) this descriptor interface allows the developer to customize their 167usage of the library. 168 169For example, consider a hardware platform with a specialized RNG device. Obviously one would like to tap 170that for the PRNG needs within the library (\textit{e.g. making a RSA key}). All the developer has to do 171is write a descriptor and the few support routines required for the device. After that the rest of the 172API can make use of it without change. Similarly imagine a few years down the road when AES2 173(\textit{or whatever they call it}) has been invented. It can be added to the library and used within applications 174with zero modifications to the end applications provided they are written properly. 175 176This flexibility within the library means it can be used with any combination of primitive algorithms and 177unlike libraries like OpenSSL is not tied to direct routines. For instance, in OpenSSL there are CBC block 178mode routines for every single cipher. That means every time you add or remove a cipher from the library 179you have to update the associated support code as well. In LibTomCrypt the associated code (\textit{chaining modes in this case}) 180are not directly tied to the ciphers. That is a new cipher can be added to the library by simply providing 181the key setup, ECB decrypt and encrypt and test vector routines. After that all five chaining mode routines 182can make use of the cipher right away. 183 184\mysection{License} 185 186The project is hereby released as public domain. 187 188\mysection{Patent Disclosure} 189 190The author (Tom St Denis) is not a patent lawyer so this section is not to be treated as legal advice. To the best 191of the author's knowledge the only patent related issues within the library are the RC5 and RC6 symmetric block ciphers. 192They can be removed from a build by simply commenting out the two appropriate lines in \textit{tomcrypt\_custom.h}. The rest 193of the ciphers and hashes are patent free or under patents that have since expired. 194 195The RC2 and RC4 symmetric ciphers are not under patents but are under trademark regulations. This means you can use 196the ciphers you just can't advertise that you are doing so. 197 198\mysection{Thanks} 199I would like to give thanks to the following people (in no particular order) for helping me develop this project from 200early on: 201\begin{enumerate} 202 \item Richard van de Laarschot 203 \item Richard Heathfield 204 \item Ajay K. Agrawal 205 \item Brian Gladman 206 \item Svante Seleborg 207 \item Clay Culver 208 \item Jason Klapste 209 \item Dobes Vandermeer 210 \item Daniel Richards 211 \item Wayne Scott 212 \item Andrew Tyler 213 \item Sky Schulz 214 \item Christopher Imes 215\end{enumerate} 216 217There have been quite a few other people as well. Please check the change log to see who else has contributed from 218time to time. 219 220\chapter{The Application Programming Interface (API)} 221\mysection{Introduction} 222\index{CRYPT\_ERROR} \index{CRYPT\_OK} 223 224In general the API is very simple to memorize and use. Most of the functions return either {\bf void} or {\bf int}. Functions 225that return {\bf int} will return {\bf CRYPT\_OK} if the function was successful, or one of the many error codes 226if it failed. Certain functions that return int will return $-1$ to indicate an error. These functions will be explicitly 227commented upon. When a function does return a CRYPT error code it can be translated into a string with 228 229\index{error\_to\_string()} 230\begin{verbatim} 231const char *error_to_string(int err); 232\end{verbatim} 233 234An example of handling an error is: 235\begin{small} 236\begin{verbatim} 237void somefunc(void) 238{ 239 int err; 240 241 /* call a cryptographic function */ 242 if ((err = some_crypto_function(...)) != CRYPT_OK) { 243 printf("A crypto error occurred, %s\n", error_to_string(err)); 244 /* perform error handling */ 245 } 246 /* continue on if no error occurred */ 247} 248\end{verbatim} 249\end{small} 250 251There is no initialization routine for the library and for the most part the code is thread safe. The only thread 252related issue is if you use the same symmetric cipher, hash or public key state data in multiple threads. Normally 253that is not an issue. 254 255To include the prototypes for \textit{LibTomCrypt.a} into your own program simply include \textit{tomcrypt.h} like so: 256\begin{small} 257\begin{verbatim} 258#include <tomcrypt.h> 259int main(void) { 260 return 0; 261} 262\end{verbatim} 263\end{small} 264 265The header file \textit{tomcrypt.h} also includes \textit{stdio.h}, \textit{string.h}, \textit{stdlib.h}, \textit{time.h} and \textit{ctype.h}. 266 267\mysection{Macros} 268 269There are a few helper macros to make the coding process a bit easier. The first set are related to loading and storing 27032/64-bit words in little/big endian format. The macros are: 271 272\index{STORE32L} \index{STORE64L} \index{LOAD32L} \index{LOAD64L} \index{STORE32H} \index{STORE64H} \index{LOAD32H} \index{LOAD64H} \index{BSWAP} 273\newpage 274\begin{figure}[hpbt] 275\begin{small} 276\begin{center} 277\begin{tabular}{|c|c|c|} 278 \hline STORE32L(x, y) & {\bf ulong32} x, {\bf unsigned char} *y & $x \to y[0 \ldots 3]$ \\ 279 \hline STORE64L(x, y) & {\bf ulong64} x, {\bf unsigned char} *y & $x \to y[0 \ldots 7]$ \\ 280 \hline LOAD32L(x, y) & {\bf ulong32} x, {\bf unsigned char} *y & $y[0 \ldots 3] \to x$ \\ 281 \hline LOAD64L(x, y) & {\bf ulong64} x, {\bf unsigned char} *y & $y[0 \ldots 7] \to x$ \\ 282 \hline STORE32H(x, y) & {\bf ulong32} x, {\bf unsigned char} *y & $x \to y[3 \ldots 0]$ \\ 283 \hline STORE64H(x, y) & {\bf ulong64} x, {\bf unsigned char} *y & $x \to y[7 \ldots 0]$ \\ 284 \hline LOAD32H(x, y) & {\bf ulong32} x, {\bf unsigned char} *y & $y[3 \ldots 0] \to x$ \\ 285 \hline LOAD64H(x, y) & {\bf ulong64} x, {\bf unsigned char} *y & $y[7 \ldots 0] \to x$ \\ 286 \hline BSWAP(x) & {\bf ulong32} x & Swap bytes \\ 287 \hline 288\end{tabular} 289\caption{Load And Store Macros} 290\end{center} 291\end{small} 292\end{figure} 293 294There are 32 and 64-bit cyclic rotations as well: 295\index{ROL} \index{ROR} \index{ROL64} \index{ROR64} \index{ROLc} \index{RORc} \index{ROL64c} \index{ROR64c} 296\begin{figure}[hpbt] 297\begin{small} 298\begin{center} 299\begin{tabular}{|c|c|c|} 300 \hline ROL(x, y) & {\bf ulong32} x, {\bf ulong32} y & $x << y, 0 \le y \le 31$ \\ 301 \hline ROLc(x, y) & {\bf ulong32} x, {\bf const ulong32} y & $x << y, 0 \le y \le 31$ \\ 302 \hline ROR(x, y) & {\bf ulong32} x, {\bf ulong32} y & $x >> y, 0 \le y \le 31$ \\ 303 \hline RORc(x, y) & {\bf ulong32} x, {\bf const ulong32} y & $x >> y, 0 \le y \le 31$ \\ 304 \hline && \\ 305 \hline ROL64(x, y) & {\bf ulong64} x, {\bf ulong64} y & $x << y, 0 \le y \le 63$ \\ 306 \hline ROL64c(x, y) & {\bf ulong64} x, {\bf const ulong64} y & $x << y, 0 \le y \le 63$ \\ 307 \hline ROR64(x, y) & {\bf ulong64} x, {\bf ulong64} y & $x >> y, 0 \le y \le 63$ \\ 308 \hline ROR64c(x, y) & {\bf ulong64} x, {\bf const ulong64} y & $x >> y, 0 \le y \le 63$ \\ 309 \hline 310\end{tabular} 311\caption{Rotate Macros} 312\end{center} 313\end{small} 314\end{figure} 315 316\mysection{Functions with Variable Length Output} 317Certain functions such as (for example) \textit{rsa\_export()} give an output that is variable length. To prevent buffer overflows you 318must pass it the length of the buffer where the output will be stored. For example: 319\index{rsa\_export()} \index{error\_to\_string()} \index{variable length output} 320\begin{small} 321\begin{verbatim} 322#include <tomcrypt.h> 323int main(void) { 324 rsa_key key; 325 unsigned char buffer[1024]; 326 unsigned long x; 327 int err; 328 329 /* ... Make up the RSA key somehow ... */ 330 331 /* lets export the key, set x to the size of the 332 * output buffer */ 333 x = sizeof(buffer); 334 if ((err = rsa_export(buffer, &x, PK_PUBLIC, &key)) != CRYPT_OK) { 335 printf("Export error: %s\n", error_to_string(err)); 336 return -1; 337 } 338 339 /* if rsa_export() was successful then x will have 340 * the size of the output */ 341 printf("RSA exported key takes %d bytes\n", x); 342 343 /* ... do something with the buffer */ 344 345 return 0; 346} 347\end{verbatim} 348\end{small} 349In the above example if the size of the RSA public key was more than 1024 bytes this function would return an error code 350indicating a buffer overflow would have occurred. If the function succeeds, it stores the length of the output back into 351\textit{x} so that the calling application will know how many bytes were used. 352 353As of v1.13, most functions will update your length on failure to indicate the size required by the function. Not all functions 354support this so please check the source before you rely on it doing that. 355 356\mysection{Functions that need a PRNG} 357\index{Pseudo Random Number Generator} \index{PRNG} 358Certain functions such as \textit{rsa\_make\_key()} require a Pseudo Random Number Generator (PRNG). These functions do not setup 359the PRNG themselves so it is the responsibility of the calling function to initialize the PRNG before calling them. 360 361Certain PRNG algorithms do not require a \textit{prng\_state} argument (sprng for example). The \textit{prng\_state} argument 362may be passed as \textbf{NULL} in such situations. 363 364\index{register\_prng()} \index{rsa\_make\_key()} 365\begin{small} 366\begin{verbatim} 367#include <tomcrypt.h> 368int main(void) { 369 rsa_key key; 370 int err; 371 372 /* register the system RNG */ 373 register_prng(&sprng_desc) 374 375 /* make a 1024-bit RSA key with the system RNG */ 376 if ((err = rsa_make_key(NULL, find_prng("sprng"), 1024/8, 65537, &key)) 377 != CRYPT_OK) { 378 printf("make_key error: %s\n", error_to_string(err)); 379 return -1; 380 } 381 382 /* use the key ... */ 383 384 return 0; 385} 386\end{verbatim} 387\end{small} 388 389\mysection{Functions that use Arrays of Octets} 390Most functions require inputs that are arrays of the data type \textit{unsigned char}. Whether it is a symmetric key, IV 391for a chaining mode or public key packet it is assumed that regardless of the actual size of \textit{unsigned char} only the 392lower eight bits contain data. For example, if you want to pass a 256 bit key to a symmetric ciphers setup routine, you 393must pass in (a pointer to) an array of 32 \textit{unsigned char} variables. Certain routines (such as SAFER+) take 394special care to work properly on platforms where an \textit{unsigned char} is not eight bits. 395 396For the purposes of this library, the term \textit{byte} will refer to an octet or eight bit word. Typically an array of 397type \textit{byte} will be synonymous with an array of type \textit{unsigned char.} 398 399\chapter{Symmetric Block Ciphers} 400\mysection{Core Functions} 401LibTomCrypt provides several block ciphers with an ECB block mode interface. It is important to first note that you 402should never use the ECB modes directly to encrypt data. Instead you should use the ECB functions to make a chaining mode, 403or use one of the provided chaining modes. All of the ciphers are written as ECB interfaces since it allows the rest of 404the API to grow in a modular fashion. 405 406\subsection{Key Scheduling} 407All ciphers store their scheduled keys in a single data type called \textit{symmetric\_key}. This allows all ciphers to 408have the same prototype and store their keys as naturally as possible. This also removes the need for dynamic memory 409allocation, and allows you to allocate a fixed sized buffer for storing scheduled keys. All ciphers must provide six visible 410functions which are (given that XXX is the name of the cipher) the following: 411\index{Cipher Setup} 412\begin{verbatim} 413int XXX_setup(const unsigned char *key, 414 int keylen, 415 int rounds, 416 symmetric_key *skey); 417\end{verbatim} 418 419The XXX\_setup() routine will setup the cipher to be used with a given number of rounds and a given key length (in bytes). 420The number of rounds can be set to zero to use the default, which is generally a good idea. 421 422If the function returns successfully the variable \textit{skey} will have a scheduled key stored in it. It's important to note 423that you should only used this scheduled key with the intended cipher. For example, if you call \textit{blowfish\_setup()} do not 424pass the scheduled key onto \textit{rc5\_ecb\_encrypt()}. All built--in setup functions do not allocate memory off the heap so 425when you are done with a key you can simply discard it (e.g. they can be on the stack). However, to maintain proper coding 426practices you should always call the respective XXX\_done() function. This allows for quicker porting to applications with 427externally supplied plugins. 428 429\subsection{ECB Encryption and Decryption} 430To encrypt or decrypt a block in ECB mode there are these two functions per cipher: 431\index{Cipher Encrypt} \index{Cipher Decrypt} 432\begin{verbatim} 433int XXX_ecb_encrypt(const unsigned char *pt, 434 unsigned char *ct, 435 symmetric_key *skey); 436 437int XXX_ecb_decrypt(const unsigned char *ct, 438 unsigned char *pt, 439 symmetric_key *skey); 440\end{verbatim} 441These two functions will encrypt or decrypt (respectively) a single block of text\footnote{The size of which depends on 442which cipher you are using.}, storing the result in the \textit{ct} buffer (\textit{pt} resp.). It is possible that the input and output buffer are 443the same buffer. For the encrypt function \textit{pt}\footnote{pt stands for plaintext.} is the input and 444\textit{ct}\footnote{ct stands for ciphertext.} is the output. For the decryption function it's the opposite. They both 445return \textbf{CRYPT\_OK} on success. To test a particular cipher against test vectors\footnote{As published in their design papers.} 446call the following self-test function. 447 448\subsection{Self--Testing} 449\index{Cipher Testing} 450\begin{verbatim} 451int XXX_test(void); 452\end{verbatim} 453This function will return {\bf CRYPT\_OK} if the cipher matches the test vectors from the design publication it is 454based upon. 455 456\subsection{Key Sizing} 457For each cipher there is a function which will help find a desired key size. It is specified as follows: 458\index{Key Sizing} 459\begin{verbatim} 460int XXX_keysize(int *keysize); 461\end{verbatim} 462Essentially, it will round the input keysize in \textit{keysize} down to the next appropriate key size. This function 463will return {\bf CRYPT\_OK} if the key size specified is acceptable. For example: 464\begin{small} 465\begin{verbatim} 466#include <tomcrypt.h> 467int main(void) 468{ 469 int keysize, err; 470 471 /* now given a 20 byte key what keysize does Twofish want to use? */ 472 keysize = 20; 473 if ((err = twofish_keysize(&keysize)) != CRYPT_OK) { 474 printf("Error getting key size: %s\n", error_to_string(err)); 475 return -1; 476 } 477 printf("Twofish suggested a key size of %d\n", keysize); 478 return 0; 479} 480\end{verbatim} 481\end{small} 482This should indicate a keysize of sixteen bytes is suggested by storing 16 in \textit{keysize.} 483 484\subsection{Cipher Termination} 485When you are finished with a cipher you can de--initialize it with the done function. 486\begin{verbatim} 487void XXX_done(symmetric_key *skey); 488\end{verbatim} 489For the software based ciphers within LibTomCrypt, these functions will not do anything. However, user supplied 490cipher descriptors may require to be called for resource management purposes. To be compliant, all functions which call a cipher 491setup function must also call the respective cipher done function when finished. 492 493\subsection{Simple Encryption Demonstration} 494An example snippet that encodes a block with Blowfish in ECB mode. 495 496\index{blowfish\_setup()} \index{blowfish\_ecb\_encrypt()} \index{blowfish\_ecb\_decrypt()} \index{blowfish\_done()} 497\begin{small} 498\begin{verbatim} 499#include <tomcrypt.h> 500int main(void) 501{ 502 unsigned char pt[8], ct[8], key[8]; 503 symmetric_key skey; 504 int err; 505 506 /* ... key is loaded appropriately in key ... */ 507 /* ... load a block of plaintext in pt ... */ 508 509 /* schedule the key */ 510 if ((err = blowfish_setup(key, /* the key we will use */ 511 8, /* key is 8 bytes (64-bits) long */ 512 0, /* 0 == use default # of rounds */ 513 &skey) /* where to put the scheduled key */ 514 ) != CRYPT_OK) { 515 printf("Setup error: %s\n", error_to_string(err)); 516 return -1; 517 } 518 519 /* encrypt the block */ 520 blowfish_ecb_encrypt(pt, /* encrypt this 8-byte array */ 521 ct, /* store encrypted data here */ 522 &skey); /* our previously scheduled key */ 523 524 /* now ct holds the encrypted version of pt */ 525 526 /* decrypt the block */ 527 blowfish_ecb_decrypt(ct, /* decrypt this 8-byte array */ 528 pt, /* store decrypted data here */ 529 &skey); /* our previously scheduled key */ 530 531 /* now we have decrypted ct to the original plaintext in pt */ 532 533 /* Terminate the cipher context */ 534 blowfish_done(&skey); 535 536 return 0; 537} 538\end{verbatim} 539\end{small} 540 541\mysection{Key Sizes and Number of Rounds} 542\index{Symmetric Keys} 543As a general rule of thumb, do not use symmetric keys under 80 bits if you can help it. Only a few of the ciphers support smaller 544keys (mainly for test vectors anyways). Ideally, your application should be making at least 256 bit keys. This is not 545because you are to be paranoid. It is because if your PRNG has a bias of any sort the more bits the better. For 546example, if you have $\mbox{Pr}\left[X = 1\right] = {1 \over 2} \pm \gamma$ where $\vert \gamma \vert > 0$ then the 547total amount of entropy in N bits is $N \cdot -log_2\left ({1 \over 2} + \vert \gamma \vert \right)$. So if $\gamma$ 548were $0.25$ (a severe bias) a 256-bit string would have about 106 bits of entropy whereas a 128-bit string would have 549only 53 bits of entropy. 550 551The number of rounds of most ciphers is not an option you can change. Only RC5 allows you to change the number of 552rounds. By passing zero as the number of rounds all ciphers will use their default number of rounds. Generally the 553ciphers are configured such that the default number of rounds provide adequate security for the given block and key 554size. 555 556\mysection{The Cipher Descriptors} 557\index{Cipher Descriptor} 558To facilitate automatic routines an array of cipher descriptors is provided in the array \textit{cipher\_descriptor}. An element 559of this array has the following (partial) format (See Section \ref{sec:cipherdesc}): 560 561\begin{small} 562\begin{verbatim} 563struct _cipher_descriptor { 564 /** name of cipher */ 565 char *name; 566 567 /** internal ID */ 568 unsigned char ID; 569 570 /** min keysize (octets) */ 571 int min_key_length, 572 573 /** max keysize (octets) */ 574 max_key_length, 575 576 /** block size (octets) */ 577 block_length, 578 579 /** default number of rounds */ 580 default_rounds; 581...<snip>... 582}; 583\end{verbatim} 584\end{small} 585 586Where \textit{name} is the lower case ASCII version of the name. The fields \textit{min\_key\_length} and \textit{max\_key\_length} 587are the minimum and maximum key sizes in bytes. The \textit{block\_length} member is the block size of the cipher 588in bytes. As a good rule of thumb it is assumed that the cipher supports 589the min and max key lengths but not always everything in between. The \textit{default\_rounds} field is the default number 590of rounds that will be used. 591 592For a plugin to be compliant it must provide at least each function listed before the accelerators begin. Accelerators are optional, 593and if missing will be emulated in software. 594 595The remaining fields are all pointers to the core functions for each cipher. The end of the cipher\_descriptor array is 596marked when \textit{name} equals {\bf NULL}. 597 598As of this release the current cipher\_descriptors elements are the following: 599\vfil 600\index{Cipher descriptor table} 601\index{blowfish\_desc} \index{xtea\_desc} \index{rc2\_desc} \index{rc5\_desc} \index{rc6\_desc} \index{saferp\_desc} \index{aes\_desc} \index{twofish\_desc} 602\index{des\_desc} \index{des3\_desc} \index{noekeon\_desc} \index{skipjack\_desc} \index{anubis\_desc} \index{khazad\_desc} \index{kseed\_desc} \index{kasumi\_desc} \index{camellia\_desc} \index{aes\_enc\_desc} 603\begin{figure}[hpbt] 604\begin{small} 605\begin{center} 606\begin{tabular}{|c|c|c|c|c|c|} 607 \hline \textbf{Name} & \textbf{Descriptor Name} & \textbf{Block Size} & \textbf{Key Range} & \textbf{Rounds} \\ 608 \hline Blowfish & blowfish\_desc & 8 & 8 $\ldots$ 56 & 16 \\ 609 \hline X-Tea & xtea\_desc & 8 & 16 & 32 \\ 610 \hline RC2 & rc2\_desc & 8 & 5 $\ldots$ 128 & 16 \\ 611 \hline RC5-32/12/b & rc5\_desc & 8 & 8 $\ldots$ 128 & 12 $\ldots$ 24 \\ 612 \hline RC6-32/20/b & rc6\_desc & 16 & 8 $\ldots$ 128 & 20 \\ 613 \hline SAFER+ & saferp\_desc &16 & 16, 24, 32 & 8, 12, 16 \\ 614 \hline AES & aes\_desc & 16 & 16, 24, 32 & 10, 12, 14 \\ 615 & aes\_enc\_desc & 16 & 16, 24, 32 & 10, 12, 14 \\ 616 \hline Twofish & twofish\_desc & 16 & 16, 24, 32 & 16 \\ 617 \hline DES & des\_desc & 8 & 8 & 16 \\ 618 \hline 3DES (EDE mode) & des3\_desc & 8 & 16, 24 & 16 \\ 619 \hline CAST5 (CAST-128) & cast5\_desc & 8 & 5 $\ldots$ 16 & 12, 16 \\ 620 \hline Noekeon & noekeon\_desc & 16 & 16 & 16 \\ 621 \hline Skipjack & skipjack\_desc & 8 & 10 & 32 \\ 622 \hline Anubis & anubis\_desc & 16 & 16 $\ldots$ 40 & 12 $\ldots$ 18 \\ 623 \hline Khazad & khazad\_desc & 8 & 16 & 8 \\ 624 \hline SEED & kseed\_desc & 16 & 16 & 16 \\ 625 \hline KASUMI & kasumi\_desc & 8 & 16 & 8 \\ 626 \hline Camellia & camellia\_desc & 16 & 16, 24, 32 & 18, 24 \\ 627 \hline 628\end{tabular} 629\end{center} 630\end{small} 631\caption{Built--In Software Ciphers} 632\end{figure} 633 634\subsection{Notes} 635\begin{small} 636\begin{enumerate} 637\item 638For AES, (also known as Rijndael) there are four descriptors which complicate issues a little. The descriptors 639rijndael\_desc and rijndael\_enc\_desc provide the cipher named \textit{rijndael}. The descriptors aes\_desc and 640aes\_enc\_desc provide the cipher name \textit{aes}. Functionally both \textit{rijndael} and \textit{aes} are the same cipher. The 641only difference is when you call find\_cipher() you have to pass the correct name. The cipher descriptors with \textit{enc} 642in the middle (e.g. rijndael\_enc\_desc) are related to an implementation of Rijndael with only the encryption routine 643and tables. The decryption and self--test function pointers of both \textit{encrypt only} descriptors are set to \textbf{NULL} and 644should not be called. 645 646The \textit{encrypt only} descriptors are useful for applications that only use the encryption function of the cipher. Algorithms such 647as EAX, PMAC and OMAC only require the encryption function. So far this \textit{encrypt only} functionality has only been implemented for 648Rijndael as it makes the most sense for this cipher. 649 650\item 651Note that for \textit{DES} and \textit{3DES} they use 8 and 24 byte keys but only 7 and 21 [respectively] bytes of the keys are in 652fact used for the purposes of encryption. My suggestion is just to use random 8/24 byte keys instead of trying to make a 8/24 653byte string from the real 7/21 byte key. 654 655For \textit{3DES} exists a two-key mode, that can be initialized by calling the setup function with a \textit{keylen} of 16. This results in the re-usage of key \textit{K1} as key \textit{K3}. This mode has been specified as \textit{Keying Option 2} in FIPS 46-3. 656 657\item 658Note that \textit{Twofish} has additional configuration options (Figure \ref{fig:twofishopts}) that take place at build time. These options are found in 659the file \textit{tomcrypt\_cfg.h}. The first option is \textit{TWOFISH\_SMALL} which when defined will force the Twofish code 660to not pre-compute the Twofish \textit{$g(X)$} function as a set of four $8 \times 32$ s-boxes. This means that a scheduled 661key will require less ram but the resulting cipher will be slower. The second option is \textit{TWOFISH\_TABLES} which when 662defined will force the Twofish code to use pre-computed tables for the two s-boxes $q_0, q_1$ as well as the multiplication 663by the polynomials 5B and EF used in the MDS multiplication. As a result the code is faster and slightly larger. The 664speed increase is useful when \textit{TWOFISH\_SMALL} is defined since the s-boxes and MDS multiply form the heart of the 665Twofish round function. 666 667\begin{figure}[hpbt] 668\index{Twofish build options} \index{TWOFISH\_SMALL} \index{TWOFISH\_TABLES} 669\begin{small} 670\begin{center} 671\begin{tabular}{|l|l|l|} 672\hline \textbf{TWOFISH\_SMALL} & \textbf{TWOFISH\_TABLES} & \textbf{Speed and Memory (per key)} \\ 673\hline undefined & undefined & Very fast, 4.2KB of ram. \\ 674\hline undefined & defined & Faster key setup, larger code. \\ 675\hline defined & undefined & Very slow, 0.2KB of ram. \\ 676\hline defined & defined & Faster, 0.2KB of ram, larger code. \\ 677\hline 678\end{tabular} 679\end{center} 680\end{small} 681\caption{Twofish Build Options} 682\label{fig:twofishopts} 683\end{figure} 684 685\item 686As of v1.18.0 of the library RC2 got an extended setup function (which didn't fit in the regular API): 687 688\index{rc2\_setup\_ex()} 689\begin{verbatim} 690int rc2_setup_ex(const unsigned char *key, 691 int keylen, 692 int bits, 693 int num_rounds, 694 symmetric_key *skey); 695\end{verbatim} 696 697This setup function also allows to configure the effective key length in bits of the RC2 cipher as in its original specification. 698 699\end{enumerate} 700\end{small} 701 702 703To work with the cipher\_descriptor array there is a function: 704\index{find\_cipher()} 705\begin{verbatim} 706int find_cipher(char *name) 707\end{verbatim} 708Which will search for a given name in the array. It returns $-1$ if the cipher is not found, otherwise it returns 709the location in the array where the cipher was found. For example, to indirectly setup Blowfish you can also use: 710\begin{small} 711\index{register\_cipher()} \index{find\_cipher()} \index{error\_to\_string()} 712\begin{verbatim} 713#include <tomcrypt.h> 714int main(void) 715{ 716 unsigned char key[8]; 717 symmetric_key skey; 718 int err; 719 720 /* you must register a cipher before you use it */ 721 if (register_cipher(&blowfish_desc)) == -1) { 722 printf("Unable to register Blowfish cipher."); 723 return -1; 724 } 725 726 /* generic call to function (assuming the key 727 * in key[] was already setup) */ 728 if ((err = 729 cipher_descriptor[find_cipher("blowfish")]. 730 setup(key, 8, 0, &skey)) != CRYPT_OK) { 731 printf("Error setting up Blowfish: %s\n", error_to_string(err)); 732 return -1; 733 } 734 735 /* ... use cipher ... */ 736} 737\end{verbatim} 738\end{small} 739 740A good safety would be to check the return value of \textit{find\_cipher()} before accessing the desired function. In order 741to use a cipher with the descriptor table you must register it first using: 742\index{register\_cipher()} 743\begin{verbatim} 744int register_cipher(const struct _cipher_descriptor *cipher); 745\end{verbatim} 746Which accepts a pointer to a descriptor and returns the index into the global descriptor table. If an error occurs such 747as there is no more room (it can have 32 ciphers at most) it will return {\bf{-1}}. If you try to add the same cipher more 748than once it will just return the index of the first copy. To remove a cipher call: 749\index{unregister\_cipher()} 750\begin{verbatim} 751int unregister_cipher(const struct _cipher_descriptor *cipher); 752\end{verbatim} 753Which returns {\bf CRYPT\_OK} if it removes the cipher, otherwise it returns {\bf CRYPT\_ERROR}. 754\begin{small} 755\begin{verbatim} 756#include <tomcrypt.h> 757int main(void) 758{ 759 int err; 760 761 /* register the cipher */ 762 if (register_cipher(&rijndael_desc) == -1) { 763 printf("Error registering Rijndael\n"); 764 return -1; 765 } 766 767 /* use Rijndael */ 768 769 /* remove it */ 770 if ((err = unregister_cipher(&rijndael_desc)) != CRYPT_OK) { 771 printf("Error removing Rijndael: %s\n", error_to_string(err)); 772 return -1; 773 } 774 775 return 0; 776} 777\end{verbatim} 778\end{small} 779This snippet is a small program that registers Rijndael. 780 781\mysection{Symmetric Modes of Operations} 782\subsection{Background} 783A typical symmetric block cipher can be used in chaining modes to effectively encrypt messages larger than the block 784size of the cipher. Given a key $k$, a plaintext $P$ and a cipher $E$ we shall denote the encryption of the block 785$P$ under the key $k$ as $E_k(P)$. In some modes there exists an initialization vector denoted as $C_{-1}$. 786 787\subsubsection{ECB Mode} 788\index{ECB mode} 789ECB or Electronic Codebook Mode is the simplest method to use. It is given as: 790\begin{equation} 791C_i = E_k(P_i) 792\end{equation} 793This mode is very weak since it allows people to swap blocks and perform replay attacks if the same key is used more 794than once. 795 796\subsubsection{CBC Mode} 797\index{CBC mode} 798CBC or Cipher Block Chaining mode is a simple mode designed to prevent trivial forms of replay and swap attacks on ciphers. 799It is given as: 800\begin{equation} 801C_i = E_k(P_i \oplus C_{i - 1}) 802\end{equation} 803It is important that the initialization vector be unique and preferably random for each message encrypted under the same key. 804 805\subsubsection{CTR Mode} 806\index{CTR mode} 807CTR or Counter Mode is a mode which only uses the encryption function of the cipher. Given a initialization vector which is 808treated as a large binary counter the CTR mode is given as: 809\begin{eqnarray} 810C_{-1} = C_{-1} + 1\mbox{ }(\mbox{mod }2^W) \nonumber \\ 811C_i = P_i \oplus E_k(C_{-1}) 812\end{eqnarray} 813Where $W$ is the size of a block in bits (e.g. 64 for Blowfish). As long as the initialization vector is random for each message 814encrypted under the same key replay and swap attacks are infeasible. CTR mode may look simple but it is as secure 815as the block cipher is under a chosen plaintext attack (provided the initialization vector is unique). 816 817\subsubsection{CFB Mode} 818\index{CFB mode} 819CFB or Ciphertext Feedback Mode is a mode akin to CBC. It is given as: 820\begin{eqnarray} 821C_i = P_i \oplus C_{-1} \nonumber \\ 822C_{-1} = E_k(C_i) 823\end{eqnarray} 824Note that in this library the output feedback width is equal to the size of the block cipher. That is this mode is used 825to encrypt whole blocks at a time. However, the library will buffer data allowing the user to encrypt or decrypt partial 826blocks without a delay. When this mode is first setup it will initially encrypt the initialization vector as required. 827 828\subsubsection{OFB Mode} 829\index{OFB mode} 830OFB or Output Feedback Mode is a mode akin to CBC as well. It is given as: 831\begin{eqnarray} 832C_{-1} = E_k(C_{-1}) \nonumber \\ 833C_i = P_i \oplus C_{-1} 834\end{eqnarray} 835Like the CFB mode the output width in CFB mode is the same as the width of the block cipher. OFB mode will also 836buffer the output which will allow you to encrypt or decrypt partial blocks without delay. 837 838\subsection{Choice of Mode} 839My personal preference is for the CTR mode since it has several key benefits: 840\begin{enumerate} 841 \item No short cycles which is possible in the OFB and CFB modes. 842 \item Provably as secure as the block cipher being used under a chosen plaintext attack. 843 \item Technically does not require the decryption routine of the cipher. 844 \item Allows random access to the plaintext. 845 \item Allows the encryption of block sizes that are not equal to the size of the block cipher. 846\end{enumerate} 847The CTR, CFB and OFB routines provided allow you to encrypt block sizes that differ from the ciphers block size. They 848accomplish this by buffering the data required to complete a block. This allows you to encrypt or decrypt any size 849block of memory with either of the three modes. 850 851The ECB and CBC modes process blocks of the same size as the cipher at a time. Therefore, they are less flexible than the 852other modes. 853 854\subsection{Ciphertext Stealing} 855\index{Ciphertext stealing} 856Ciphertext stealing is a method of dealing with messages in CBC mode which are not a multiple of the block length. This is accomplished 857by encrypting the last ciphertext block in ECB mode, and XOR'ing the output against the last partial block of plaintext. LibTomCrypt does not 858support this mode directly but it is fairly easy to emulate with a call to the cipher's ecb\_encrypt() callback function. 859 860The more sane way to deal with partial blocks is to pad them with zeroes, and then use CBC normally. 861 862\subsection{Initialization} 863\index{CBC Mode} \index{CTR Mode} 864\index{OFB Mode} \index{CFB Mode} 865The library provides simple support routines for handling CBC, CTR, CFB, OFB and ECB encoded messages. Assuming the mode 866you want is XXX there is a structure called \textit{symmetric\_XXX} that will contain the information required to 867use that mode. They have identical setup routines (except CTR and ECB mode): 868\index{ecb\_start()} \index{cfb\_start()} \index{cbc\_start()} \index{ofb\_start()} \index{ctr\_start()} 869\begin{verbatim} 870int XXX_start( int cipher, 871 const unsigned char *IV, 872 const unsigned char *key, 873 int keylen, 874 int num_rounds, 875 symmetric_XXX *XXX); 876 877int ctr_start( int cipher, 878 const unsigned char *IV, 879 const unsigned char *key, 880 int keylen, 881 int num_rounds, 882 int ctr_mode, 883 symmetric_CTR *ctr); 884 885int ecb_start( int cipher, 886 const unsigned char *key, 887 int keylen, 888 int num_rounds, 889 symmetric_ECB *ecb); 890\end{verbatim} 891 892In each case, \textit{cipher} is the index into the cipher\_descriptor array of the cipher you want to use. The \textit{IV} value is 893the initialization vector to be used with the cipher. You must fill the IV yourself and it is assumed they are the same 894length as the block size\footnote{In other words the size of a block of plaintext for the cipher, e.g. 8 for DES, 16 for AES, etc.} 895of the cipher you choose. It is important that the IV be random for each unique message you want to encrypt. The 896parameters \textit{key}, \textit{keylen} and \textit{num\_rounds} are the same as in the XXX\_setup() function call. The final parameter 897is a pointer to the structure you want to hold the information for the mode of operation. 898 899The routines return {\bf CRYPT\_OK} if the cipher initialized correctly, otherwise, they return an error code. 900 901\subsubsection{CTR Mode} 902In the case of CTR mode there is an additional parameter \textit{ctr\_mode} which specifies the mode that the counter is to be used in. 903If \textbf{CTR\_COUNTER\_ LITTLE\_ENDIAN} was specified then the counter will be treated as a little endian value. Otherwise, if 904\textbf{CTR\_COUNTER\_BIG\_ENDIAN} was specified the counter will be treated as a big endian value. As of v1.15 the RFC 3686 style of 905increment then encrypt is also supported. By OR'ing \textbf{LTC\_CTR\_RFC3686} with the CTR \textit{mode} value, ctr\_start() will increment 906the counter before encrypting it for the first time. 907 908As of V1.17, the library supports variable length counters for CTR mode. The (optional) counter length is specified by OR'ing the octet 909length of the counter against the \textit{ctr\_mode} parameter. The default, zero, indicates that a full block length counter will be used. This also 910ensures backwards compatibility with software that uses older versions of the library. 911 912\begin{small} 913\begin{verbatim} 914symmetric_CTR ctr; 915int err; 916unsigned char IV[16], key[16]; 917 918/* use a 32-bit little endian counter */ 919if ((err = ctr_start(find_cipher("aes"), 920 IV, key, 16, 0, 921 CTR_COUNTER_LITTLE_ENDIAN | 4, 922 &ctr)) != CRYPT_OK) { 923 handle_error(err); 924} 925\end{verbatim} 926\end{small} 927 928Changing the counter size has little (really no) effect on the performance of the CTR chaining mode. It is provided for compatibility 929with other software (and hardware) which have smaller fixed sized counters. 930 931\subsection{Encryption and Decryption} 932To actually encrypt or decrypt the following routines are provided: 933\index{ecb\_encrypt()} \index{ecb\_decrypt()} \index{cfb\_encrypt()} \index{cfb\_decrypt()} 934\index{cbc\_encrypt()} \index{cbc\_decrypt()} \index{ofb\_encrypt()} \index{ofb\_decrypt()} \index{ctr\_encrypt()} \index{ctr\_decrypt()} 935\begin{verbatim} 936int XXX_encrypt(const unsigned char *pt, 937 unsigned char *ct, 938 unsigned long len, 939 symmetric_YYY *YYY); 940 941int XXX_decrypt(const unsigned char *ct, 942 unsigned char *pt, 943 unsigned long len, 944 symmetric_YYY *YYY); 945\end{verbatim} 946Where \textit{XXX} is one of $\lbrace ecb, cbc, ctr, cfb, ofb \rbrace$. 947 948In all cases, \textit{len} is the size of the buffer (as number of octets) to encrypt or decrypt. The CTR, OFB and CFB modes are order sensitive but not 949chunk sensitive. That is you can encrypt \textit{ABCDEF} in three calls like \textit{AB}, \textit{CD}, \textit{EF} or two like \textit{ABCDE} and \textit{F} 950and end up with the same ciphertext. However, encrypting \textit{ABC} and \textit{DABC} will result in different ciphertexts. All 951five of the modes will return {\bf CRYPT\_OK} on success from the encrypt or decrypt functions. 952 953In the ECB and CBC cases, \textit{len} must be a multiple of the ciphers block size. In the CBC case, you must manually pad the end of your message (either with 954zeroes or with whatever your protocol requires). 955 956To decrypt in either mode, perform the setup like before (recall you have to fetch the IV value you used), and use the decrypt routine on all of the blocks. 957 958\subsection{IV Manipulation} 959To change or read the IV of a previously initialized chaining mode use the following two functions. 960\index{cbc\_setiv()} \index{cbc\_getiv()} \index{ofb\_setiv()} \index{ofb\_getiv()} \index{cfb\_setiv()} \index{cfb\_getiv()} 961\index{ctr\_setiv()} \index{ctr\_getiv()} 962\begin{verbatim} 963int XXX_getiv(unsigned char *IV, 964 unsigned long *len, 965 symmetric_XXX *XXX); 966 967int XXX_setiv(const unsigned char *IV, 968 unsigned long len, 969 symmetric_XXX *XXX); 970\end{verbatim} 971 972The XXX\_getiv() functions will read the IV out of the chaining mode and store it into \textit{IV} along with the length of the IV 973stored in \textit{len}. The XXX\_setiv will initialize the chaining mode state as if the original IV were the new IV specified. The length 974of the IV passed in must be the size of the ciphers block size. 975 976The XXX\_setiv() functions are handy if you wish to change the IV without re--keying the cipher. 977 978What the \textit{setiv} function will do depends on the mode being changed. In CBC mode, the new IV replaces the existing IV as if it 979were the last ciphertext block. In CFB mode, the IV is encrypted as if it were the prior encrypted pad. In CTR mode, the IV is encrypted without 980first incrementing it (regardless of the LTC\_RFC\_3686 flag presence). In F8 mode, the IV is encrypted and becomes the new pad. It does not change 981the salted IV, and is only meant to allow seeking within a session. In LRW, it changes the tweak, forcing a computation of the tweak pad, allowing for 982seeking within the session. In OFB mode, the IV is encrypted and becomes the new pad. 983 984\subsection{Stream Termination} 985To terminate an open stream call the done function. 986 987\index{ecb\_done()} \index{cbc\_done()}\index{cfb\_done()}\index{ofb\_done()} \index{ctr\_done()} 988\begin{verbatim} 989int XXX_done(symmetric_XXX *XXX); 990\end{verbatim} 991 992This will terminate the stream (by terminating the cipher) and return \textbf{CRYPT\_OK} if successful. 993 994\newpage 995\subsection{Examples} 996\begin{small} 997\begin{verbatim} 998#include <tomcrypt.h> 999int main(void) 1000{ 1001 unsigned char key[16], IV[16], buffer[512]; 1002 symmetric_CTR ctr; 1003 int x, err; 1004 1005 /* register twofish first */ 1006 if (register_cipher(&twofish_desc) == -1) { 1007 printf("Error registering cipher.\n"); 1008 return -1; 1009 } 1010 1011 /* somehow fill out key and IV */ 1012 1013 /* start up CTR mode */ 1014 if ((err = ctr_start( 1015 find_cipher("twofish"), /* index of desired cipher */ 1016 IV, /* the initialization vector */ 1017 key, /* the secret key */ 1018 16, /* length of secret key (16 bytes) */ 1019 0, /* 0 == default # of rounds */ 1020 CTR_COUNTER_LITTLE_ENDIAN, /* Little endian counter */ 1021 &ctr) /* where to store the CTR state */ 1022 ) != CRYPT_OK) { 1023 printf("ctr_start error: %s\n", error_to_string(err)); 1024 return -1; 1025 } 1026 1027 /* somehow fill buffer than encrypt it */ 1028 if ((err = ctr_encrypt( buffer, /* plaintext */ 1029 buffer, /* ciphertext */ 1030 sizeof(buffer), /* length of plaintext pt */ 1031 &ctr) /* CTR state */ 1032 ) != CRYPT_OK) { 1033 printf("ctr_encrypt error: %s\n", error_to_string(err)); 1034 return -1; 1035 } 1036 1037 /* make use of ciphertext... */ 1038 1039 /* now we want to decrypt so let's use ctr_setiv */ 1040 if ((err = ctr_setiv( IV, /* the initial IV we gave to ctr_start */ 1041 16, /* the IV is 16 bytes long */ 1042 &ctr) /* the ctr state we wish to modify */ 1043 ) != CRYPT_OK) { 1044 printf("ctr_setiv error: %s\n", error_to_string(err)); 1045 return -1; 1046 } 1047 1048 if ((err = ctr_decrypt( buffer, /* ciphertext */ 1049 buffer, /* plaintext */ 1050 sizeof(buffer), /* length of plaintext */ 1051 &ctr) /* CTR state */ 1052 ) != CRYPT_OK) { 1053 printf("ctr_decrypt error: %s\n", error_to_string(err)); 1054 return -1; 1055 } 1056 1057 /* terminate the stream */ 1058 if ((err = ctr_done(&ctr)) != CRYPT_OK) { 1059 printf("ctr_done error: %s\n", error_to_string(err)); 1060 return -1; 1061 } 1062 1063 /* clear up and return */ 1064 zeromem(key, sizeof(key)); 1065 zeromem(&ctr, sizeof(ctr)); 1066 1067 return 0; 1068} 1069\end{verbatim} 1070\end{small} 1071 1072\subsection{LRW Mode} 1073LRW mode is a cipher mode which is meant for indexed encryption like used to handle storage media. It is meant to have efficient seeking and overcome the 1074security problems of ECB mode while not increasing the storage requirements. It is used much like any other chaining mode except with two key differences. 1075 1076The key is specified as two strings the first key $K_1$ is the (normally AES) key and can be any length (typically 16, 24 or 32 octets long). The second key 1077$K_2$ is the \textit{tweak} key and is always 16 octets long. The tweak value is \textbf{NOT} a nonce or IV value it must be random and secret. 1078 1079To initialize LRW mode use: 1080 1081\index{lrw\_start()} 1082\begin{verbatim} 1083int lrw_start( int cipher, 1084 const unsigned char *IV, 1085 const unsigned char *key, 1086 int keylen, 1087 const unsigned char *tweak, 1088 int num_rounds, 1089 symmetric_LRW *lrw); 1090\end{verbatim} 1091 1092This will initialize the LRW context with the given (16 octet) \textit{IV}, cipher $K_1$ \textit{key} of length \textit{keylen} octets and the (16 octet) $K_2$ \textit{tweak}. 1093While LRW was specified to be used only with AES, LibTomCrypt will allow any 128--bit block cipher to be specified as indexed by \textit{cipher}. The 1094number of rounds for the block cipher \textit{num\_rounds} can be 0 to use the default number of rounds for the given cipher. 1095 1096To process data use the following functions: 1097 1098\index{lrw\_encrypt()} \index{lrw\_decrypt()} 1099\begin{verbatim} 1100int lrw_encrypt(const unsigned char *pt, 1101 unsigned char *ct, 1102 unsigned long len, 1103 symmetric_LRW *lrw); 1104 1105int lrw_decrypt(const unsigned char *ct, 1106 unsigned char *pt, 1107 unsigned long len, 1108 symmetric_LRW *lrw); 1109\end{verbatim} 1110 1111These will encrypt (or decrypt) the plaintext to the ciphertext buffer (or vice versa). The length is specified by \textit{len} in octets but must be a multiple 1112of 16. The LRW code uses a fast tweak update such that consecutive blocks are encrypted faster than if random seeking where used. 1113 1114To manipulate the IV use the following functions: 1115 1116\index{lrw\_getiv()} \index{lrw\_setiv()} 1117\begin{verbatim} 1118int lrw_getiv(unsigned char *IV, 1119 unsigned long *len, 1120 symmetric_LRW *lrw); 1121 1122int lrw_setiv(const unsigned char *IV, 1123 unsigned long len, 1124 symmetric_LRW *lrw); 1125\end{verbatim} 1126These will get or set the 16--octet IV. Note that setting the IV is the same as \textit{seeking} and unlike other modes is not a free operation. It requires 1127updating the entire tweak which is slower than sequential use. Avoid seeking excessively in performance constrained code. 1128 1129To terminate the LRW state use the following: 1130 1131\index{lrw\_done()} 1132\begin{verbatim} 1133int lrw_done(symmetric_LRW *lrw); 1134\end{verbatim} 1135 1136\subsection{XTS Mode} 1137As of v1.17, LibTomCrypt supports XTS mode with code donated by Elliptic Semiconductor Inc.\footnote{www.ellipticsemi.com}. 1138XTS is a chaining mode for 128--bit block ciphers, recommended by IEEE (P1619) 1139for disk encryption. It is meant to be an encryption mode with random access to the message data without compromising privacy. It requires two private keys (of equal 1140length) to perform the encryption process. Each encryption invocation includes a sector number or unique identifier specified as a 128--bit string. 1141 1142To initialize XTS mode use the following function call: 1143 1144\index{xts\_start()} 1145\begin{verbatim} 1146int xts_start( int cipher, 1147 const unsigned char *key1, 1148 const unsigned char *key2, 1149 unsigned long keylen, 1150 int num_rounds, 1151 symmetric_xts *xts) 1152\end{verbatim} 1153This will start the XTS mode with the two keys pointed to by \textit{key1} and \textit{key2} of length \textit{keylen} octets each. 1154 1155To encrypt or decrypt a sector use the following calls: 1156 1157\index{xts\_encrypt()} \index{xts\_decrypt()} 1158\begin{verbatim} 1159int xts_encrypt( 1160 const unsigned char *pt, unsigned long ptlen, 1161 unsigned char *ct, 1162 const unsigned char *tweak, 1163 symmetric_xts *xts); 1164 1165int xts_decrypt( 1166 const unsigned char *ct, unsigned long ptlen, 1167 unsigned char *pt, 1168 const unsigned char *tweak, 1169 symmetric_xts *xts); 1170\end{verbatim} 1171The first will encrypt the plaintext pointed to by \textit{pt} of length \textit{ptlen} octets, and store the ciphertext in the array pointed to by 1172\textit{ct}. It uses the 128--bit tweak pointed to by \textit{tweak} to encrypt the block. The decrypt function performs the opposite operation. Both 1173functions support ciphertext stealing (blocks that are not multiples of 16 bytes). 1174 1175The P1619 specification states the tweak for sector number shall be represented as a 128--bit little endian string. 1176 1177To terminate the XTS state call the following function: 1178 1179\index{xts\_done()} 1180\begin{verbatim} 1181void xts_done(symmetric_xts *xts); 1182\end{verbatim} 1183 1184 1185\subsection{F8 Mode} 1186\index{F8 Mode} 1187The F8 Chaining mode (see RFC 3711 for instance) is yet another chaining mode for block ciphers. It behaves much like CTR mode in that it XORs a keystream 1188against the plaintext to encrypt. F8 mode comes with the additional twist that the counter value is secret, encrypted by a \textit{salt key}. We 1189initialize F8 mode with the following function call: 1190 1191\index{f8\_start()} 1192\begin{verbatim} 1193int f8_start( int cipher, 1194 const unsigned char *IV, 1195 const unsigned char *key, 1196 int keylen, 1197 const unsigned char *salt_key, 1198 int skeylen, 1199 int num_rounds, 1200 symmetric_F8 *f8); 1201\end{verbatim} 1202This will start the F8 mode state using \textit{key} as the secret key, \textit{IV} as the counter. It uses the \textit{salt\_key} as IV encryption key 1203(\textit{m} in the RFC 3711). The salt\_key can be shorter than the secret key but it should not be longer. 1204 1205To encrypt or decrypt data we use the following two functions: 1206 1207\index{f8\_encrypt()} \index{f8\_decrypt()} 1208\begin{verbatim} 1209int f8_encrypt(const unsigned char *pt, 1210 unsigned char *ct, 1211 unsigned long len, 1212 symmetric_F8 *f8); 1213 1214int f8_decrypt(const unsigned char *ct, 1215 unsigned char *pt, 1216 unsigned long len, 1217 symmetric_F8 *f8); 1218\end{verbatim} 1219These will encrypt or decrypt a variable length array of bytes using the F8 mode state specified. The length is specified in bytes and does not have to be a multiple 1220of the ciphers block size. 1221 1222To change or retrieve the current counter IV value use the following functions: 1223\index{f8\_getiv()} \index{f8\_setiv()} 1224\begin{verbatim} 1225int f8_getiv(unsigned char *IV, 1226 unsigned long *len, 1227 symmetric_F8 *f8); 1228 1229int f8_setiv(const unsigned char *IV, 1230 unsigned long len, 1231 symmetric_F8 *f8); 1232\end{verbatim} 1233These work with the current IV value only and not the encrypted IV value specified during the call to f8\_start(). The purpose of these two functions is to be 1234able to seek within a current session only. If you want to change the session IV you will have to call f8\_done() and then start a new state with 1235f8\_start(). 1236 1237To terminate an F8 state call the following function: 1238 1239\index{f8\_done()} 1240\begin{verbatim} 1241int f8_done(symmetric_F8 *f8); 1242\end{verbatim} 1243 1244\chapter{Stream Ciphers} 1245 1246Stream ciphers are symmetric key ciphers which operate on a stream of bytes (in theory on a stream of bits 1247however LibTomCrypt's implementation works with bytes). 1248 1249The API for all stream ciphers operates in mode: \textit{setup} -- \textit{crypt} -- \textit{crypt} -- ... -- \textit{done}. 1250Please note that both encryption and decryption are implemented via \textit{crypt}. 1251 1252Another useful feature of the stream ciphers API is generation of a random stream of bytes which works like: 1253\textit{setup} -- \textit{keystream} -- \textit{keystream} -- ... -- \textit{done}. The random stream generation is 1254implemented like encryption of a stream of \textit{0x00} bytes. 1255 1256Note: You shouldn't use the keystream interface as a PRNG, as it doesn't allow to re-seed the internal state. 1257 1258\mysection{ChaCha} 1259 1260\textit{ChaCha} is currently the most modern stream cipher included in LibTomCrypt, so use this one unless you 1261have a reason for using some of the older algorithms. 1262 1263For more information about ChaCha see \url{https://en.wikipedia.org/wiki/ChaCha_(cipher)}. 1264 1265Supported key size: 16 or 32 bytes (128 or 256 bits). 1266 1267You can initialize ChaCha with 96bit \textit{nonce} + 32bit \textit{counter}: 1268\begin{verbatim} 1269chacha_state st; 1270err = chacha_setup(&st, key, key_len, rounds); 1271err = chacha_ivctr32(&st, nonce, 12, initial_32bit_ctr); 1272\end{verbatim} 1273 1274Or with 64bit \textit{nonce} + 64bit \textit{counter}: 1275\begin{verbatim} 1276chacha_state st; 1277err = chacha_setup(&st, key, key_len, rounds); 1278err = chacha_ivctr64(&st, nonce, 8, initial_64bit_ctr); 1279\end{verbatim} 1280 1281The \textit{chacha\_setup} takes the number of rounds as a parameter -- choose 20 if you are not sure. 1282As always never ever use the same key + nonce pair more than once. 1283 1284For the actual encryption or decryption you have to call: 1285\begin{verbatim} 1286err = chacha_crypt(&st, in_buffer, in_len, out_buffer); 1287\end{verbatim} 1288 1289If you just want a random stream of bytes initialize the cipher with a truly random \textit{key} (32 bytes), 1290a truly random \textit{nonce} (8 bytes) and zero initial counter. After that you can get a stream of pseudo--random 1291bytes via: 1292\begin{verbatim} 1293err = chacha_keystream(&st, out_buffer, out_len); 1294\end{verbatim} 1295 1296At the end you have to terminate the state: 1297\begin{verbatim} 1298err = chacha_done(&st); 1299\end{verbatim} 1300 1301\mysection{RC4} 1302 1303For more information about RC4 see \url{https://en.wikipedia.org/wiki/RC4}. 1304 1305Supported key size: 5--256 bytes 1306 1307You need to initialize RC4 only with a \textit{key}. 1308\begin{verbatim} 1309rc4_state st; 1310err = rc4_stream_setup(&st, key, key_len); 1311\end{verbatim} 1312 1313For the actual encryption or decryption you have to call: 1314\begin{verbatim} 1315err = rc4_stream_crypt(&st, in_buffer, in_len, out_buffer); 1316\end{verbatim} 1317 1318 1319If you just want a random stream of bytes initialize the cipher with truly random \textit{key}. 1320After that you can get a stream of pseudo--random bytes via: 1321\begin{verbatim} 1322err = rc4_stream_keystream(&st, out_buffer, out_len); 1323\end{verbatim} 1324 1325At the end you have to terminate the state: 1326\begin{verbatim} 1327err = rc4_stream_done(&st); 1328\end{verbatim} 1329 1330\mysection{Sober128} 1331 1332Supported key size: must be multiple of 4 bytes 1333 1334You need to initialize Sober128 with a \textit{key} and a \textit{nonce} (must be multiple of 4 bytes). 1335\begin{verbatim} 1336sober128_state st; 1337err = sober128_stream_setup(&st, key, 16); 1338err = sober128_stream_setiv(&st, nonce, 12); 1339\end{verbatim} 1340 1341For the actual encryption or decryption you to call: 1342\begin{verbatim} 1343err = sober128_stream_crypt(&st, in_buffer, in_len, out_buffer); 1344\end{verbatim} 1345 1346If you just want a random stream of bytes initialize the cipher with a truly random \textit{key} 1347and a truly random \textit{nonce}. After that you can get a stream of pseudo--random bytes via: 1348\begin{verbatim} 1349err = sober128_stream_keystream(&st, out_buffer, out_len); 1350\end{verbatim} 1351 1352At the end you have to terminate the state: 1353\begin{verbatim} 1354err = sober128_stream_done(&st); 1355\end{verbatim} 1356 1357\chapter{Authenticated Encryption} 1358 1359Authenticated Encryption - sometimes also called Authenticated Encryption with Associated Data (AEAD) - is a variant of encryption 1360that provides not only confidentiality (as other symmetric or stream ciphers) but also integrity. 1361 1362The inputs of Authenticated Encryption are: \textit{key}, \textit{nonce} (sometimes called initialization vector), \textit{plaintext}, 1363optional \textit{header} (sometimes called additional authenticated data - AAD). The outputs are: \textit{ciphertext} and \textit{tag}. 1364 1365\mysection{EAX Mode} 1366LibTomCrypt provides support for a mode called EAX\footnote{See 1367M. Bellare, P. Rogaway, D. Wagner, A Conventional Authenticated-Encryption Mode.} in a manner similar to the way it was intended to be used 1368by the designers. First, a short description of what EAX mode is before we explain how to use it. EAX is a mode that requires a cipher, 1369CTR and OMAC support and provides encryption and 1370authentication\footnote{Note that since EAX only requires OMAC and CTR you may use \textit{encrypt only} cipher descriptors with this mode.}. 1371It is initialized with a random \textit{nonce} that can be shared publicly, a \textit{header} which can be fixed and public, and a random secret symmetric key. 1372 1373The \textit{header} data is meant to be meta--data associated with a stream that isn't private (e.g., protocol messages). It can 1374be added at anytime during an EAX stream, and is part of the authentication tag. That is, changes in the meta-data can be detected by changes in the output tag. 1375 1376The mode can then process plaintext producing ciphertext as well as compute a partial checksum. The actual checksum 1377called a \textit{tag} is only emitted when the message is finished. In the interim, the user can process any arbitrary 1378sized message block to send to the recipient as ciphertext. This makes the EAX mode especially suited for streaming modes 1379of operation. 1380 1381The mode is initialized with the following function. 1382\index{eax\_init()} 1383\begin{verbatim} 1384int eax_init( eax_state *eax, 1385 int cipher, 1386 const unsigned char *key, 1387 unsigned long keylen, 1388 const unsigned char *nonce, 1389 unsigned long noncelen, 1390 const unsigned char *header, 1391 unsigned long headerlen); 1392\end{verbatim} 1393 1394Where \textit{eax} is the EAX state. The \textit{cipher} parameter is the index of the desired cipher in the descriptor table. 1395The \textit{key} parameter is the shared secret symmetric key of length \textit{keylen} octets. The \textit{nonce} parameter is the 1396random public string of length \textit{noncelen} octets. The \textit{header} parameter is the random (or fixed or \textbf{NULL}) header for the 1397message of length \textit{headerlen} octets. 1398 1399When this function completes, the \textit{eax} state will be initialized such that you can now either have data decrypted or 1400encrypted in EAX mode. Note: if \textit{headerlen} is zero you may pass \textit{header} as \textbf{NULL} to indicate there is no initial header data. 1401 1402To encrypt or decrypt data in a streaming mode use the following. 1403\index{eax\_encrypt()} \index{eax\_decrypt()} 1404\begin{verbatim} 1405int eax_encrypt( eax_state *eax, 1406 const unsigned char *pt, 1407 unsigned char *ct, 1408 unsigned long length); 1409 1410int eax_decrypt( eax_state *eax, 1411 const unsigned char *ct, 1412 unsigned char *pt, 1413 unsigned long length); 1414\end{verbatim} 1415The function \textit{eax\_encrypt} will encrypt the bytes in \textit{pt} of \textit{length} octets, and store the ciphertext in 1416\textit{ct}. Note: \textit{ct} and \textit{pt} may be the same region in memory. This function will also send the ciphertext 1417through the OMAC function. The function \textit{eax\_decrypt} decrypts \textit{ct}, and stores it in \textit{pt}. This also allows 1418\textit{pt} and \textit{ct} to be the same region in memory. 1419 1420You cannot both encrypt or decrypt with the same \textit{eax} context. For bi--directional communication you will need to initialize 1421two EAX contexts (preferably with different headers and nonces). 1422 1423Note: both of these functions allow you to send the data in any granularity but the order is important. While 1424the eax\_init() function allows you to add initial header data to the stream you can also add header data during the 1425EAX stream with the following. 1426 1427\index{eax\_addheader()} 1428\begin{verbatim} 1429int eax_addheader( eax_state *eax, 1430 const unsigned char *header, 1431 unsigned long length); 1432\end{verbatim} 1433This will add the \textit{length} octet from \textit{header} to the given \textit{eax} header. Once the message is finished, the 1434\textit{tag} (checksum) may be computed with the following function: 1435 1436\index{eax\_done()} 1437\begin{verbatim} 1438int eax_done( eax_state *eax, 1439 unsigned char *tag, 1440 unsigned long *taglen); 1441\end{verbatim} 1442This will terminate the EAX state \textit{eax}, and store up to \textit{taglen} bytes of the message tag in \textit{tag}. The function 1443then stores how many bytes of the tag were written out back in to \textit{taglen}. 1444 1445The EAX mode code can be tested to ensure it matches the test vectors by calling the following function: 1446\index{eax\_test()} 1447\begin{verbatim} 1448int eax_test(void); 1449\end{verbatim} 1450This requires that the AES (or Rijndael) block cipher be registered with the cipher\_descriptor table first. 1451 1452\begin{verbatim} 1453#include <tomcrypt.h> 1454int main(void) 1455{ 1456 int err; 1457 eax_state eax; 1458 unsigned char pt[64], ct[64], nonce[16], key[16], tag[16]; 1459 unsigned long taglen; 1460 1461 if (register_cipher(&rijndael_desc) == -1) { 1462 printf("Error registering Rijndael"); 1463 return EXIT_FAILURE; 1464 } 1465 1466 /* ... make up random nonce and key ... */ 1467 1468 /* initialize context */ 1469 if ((err = eax_init( &eax, /* context */ 1470 find_cipher("rijndael"), /* cipher id */ 1471 nonce, /* the nonce */ 1472 16, /* nonce is 16 bytes */ 1473 "TestApp", /* example header */ 1474 7) /* header length */ 1475 ) != CRYPT_OK) { 1476 printf("Error eax_init: %s", error_to_string(err)); 1477 return EXIT_FAILURE; 1478 } 1479 1480 /* now encrypt data, say in a loop or whatever */ 1481 if ((err = eax_encrypt( &eax, /* eax context */ 1482 pt, /* plaintext (source) */ 1483 ct, /* ciphertext (destination) */ 1484 sizeof(pt) /* size of plaintext */ 1485 ) != CRYPT_OK) { 1486 printf("Error eax_encrypt: %s", error_to_string(err)); 1487 return EXIT_FAILURE; 1488 } 1489 1490 /* finish message and get authentication tag */ 1491 taglen = sizeof(tag); 1492 if ((err = eax_done( &eax, /* eax context */ 1493 tag, /* where to put tag */ 1494 &taglen /* length of tag space */ 1495 ) != CRYPT_OK) { 1496 printf("Error eax_done: %s", error_to_string(err)); 1497 return EXIT_FAILURE; 1498 } 1499 1500 /* now we have the authentication tag in "tag" and 1501 * it's taglen bytes long */ 1502} 1503\end{verbatim} 1504 1505You can also perform an entire EAX state on a block of memory in a single function call with the 1506following functions. 1507 1508 1509\index{eax\_encrypt\_authenticate\_memory} \index{eax\_decrypt\_verify\_memory} 1510\begin{verbatim} 1511int eax_encrypt_authenticate_memory( 1512 int cipher, 1513 const unsigned char *key, unsigned long keylen, 1514 const unsigned char *nonce, unsigned long noncelen, 1515 const unsigned char *header, unsigned long headerlen, 1516 const unsigned char *pt, unsigned long ptlen, 1517 unsigned char *ct, 1518 unsigned char *tag, unsigned long *taglen); 1519 1520int eax_decrypt_verify_memory( 1521 int cipher, 1522 const unsigned char *key, unsigned long keylen, 1523 const unsigned char *nonce, unsigned long noncelen, 1524 const unsigned char *header, unsigned long headerlen, 1525 const unsigned char *ct, unsigned long ctlen, 1526 unsigned char *pt, 1527 unsigned char *tag, unsigned long taglen, 1528 int *res); 1529\end{verbatim} 1530 1531Both essentially just call eax\_init() followed by eax\_encrypt() (or eax\_decrypt() respectively) and eax\_done(). The parameters 1532have the same meaning as with those respective functions. 1533 1534The only difference is eax\_decrypt\_verify\_memory() does not emit a tag. Instead you pass it a tag as input and it compares it against 1535the tag it computed while decrypting the message. If the tags match then it stores a $1$ in \textit{res}, otherwise it stores a $0$. 1536 1537\mysection{OCB Modes} 1538\subsection{Preface} 1539 1540LibTomCrypt provides support for a mode called OCB in version 1 ''OCB''\footnote{See 1541P. Rogaway, M. Bellare, J. Black, T. Krovetz, \textit{OCB: A Block Cipher Mode of Operation for Efficient Authenticated Encryption}.} 1542and version 3 ''OCB3''\footnote{See RFC7253, T. Krovetz, P. Rogaway, \textit{The OCB Authenticated-Encryption Algorithm}.}. 1543OCB is an encryption protocol that simultaneously provides authentication. It is slightly faster to use than EAX mode 1544but is less flexible. 1545 1546Please be aware that all versions of OCB are patented and there are several licensing models provided by P. Rogaway, the patent holder 1547-- see \url{http://web.cs.ucdavis.edu/~rogaway/ocb/license.htm}. 1548 1549\subsection{OCB} 1550\subsubsection{Initialization and processing} 1551 1552Let's review how to initialize an OCB context. 1553 1554\index{ocb\_init()} 1555\begin{verbatim} 1556int ocb_init( ocb_state *ocb, 1557 int cipher, 1558 const unsigned char *key, 1559 unsigned long keylen, 1560 const unsigned char *nonce); 1561\end{verbatim} 1562 1563This will initialize the \textit{ocb} context using cipher descriptor \textit{cipher}. It will use a \textit{key} of length \textit{keylen} 1564and the random \textit{nonce}. Note that \textit{nonce} must be a random (public) string the same length as the block ciphers 1565block size (e.g. 16 bytes for AES). 1566 1567This mode has no \textit{Associated Data} like EAX mode does which means you cannot authenticate metadata along with the stream. 1568To encrypt or decrypt data use the following. 1569 1570\index{ocb\_encrypt()} \index{ocb\_decrypt()} 1571\begin{verbatim} 1572int ocb_encrypt( ocb_state *ocb, 1573 const unsigned char *pt, 1574 unsigned char *ct); 1575 1576int ocb_decrypt( ocb_state *ocb, 1577 const unsigned char *ct, 1578 unsigned char *pt); 1579\end{verbatim} 1580 1581This will encrypt (or decrypt for the latter) a fixed length of data from \textit{pt} to \textit{ct} (vice versa for the latter). 1582They assume that \textit{pt} and \textit{ct} are the same size as the block cipher's block size. Note that you cannot call 1583both functions given a single \textit{ocb} state. For bi-directional communication you will have to initialize two \textit{ocb} 1584states (with different nonces). Also \textit{pt} and \textit{ct} may point to the same location in memory. 1585 1586\subsubsection{State Termination} 1587 1588When you are finished encrypting the message you call the following function to compute the tag. 1589 1590\index{ocb\_done\_encrypt()} 1591\begin{verbatim} 1592int ocb_done_encrypt( ocb_state *ocb, 1593 const unsigned char *pt, 1594 unsigned long ptlen, 1595 unsigned char *ct, 1596 unsigned char *tag, 1597 unsigned long *taglen); 1598\end{verbatim} 1599 1600This will terminate an encrypt stream \textit{ocb}. If you have trailing bytes of plaintext that will not complete a block 1601you can pass them here. This will also encrypt the \textit{ptlen} bytes in \textit{pt} and store them in \textit{ct}. It will also 1602store up to \textit{taglen} bytes of the tag into \textit{tag}. 1603 1604Note that \textit{ptlen} must be less than or equal to the block size of block cipher chosen. Also note that if you have 1605an input message equal to the length of the block size then you pass the data here (not to ocb\_encrypt()) only. 1606 1607To terminate a decrypt stream and compared the tag you call the following. 1608 1609\index{ocb\_done\_decrypt()} 1610\begin{verbatim} 1611int ocb_done_decrypt( ocb_state *ocb, 1612 const unsigned char *ct, 1613 unsigned long ctlen, 1614 unsigned char *pt, 1615 const unsigned char *tag, 1616 unsigned long taglen, 1617 int *res); 1618\end{verbatim} 1619Similarly to the previous function you can pass trailing message bytes into this function. This will compute the 1620tag of the message (internally) and then compare it against the \textit{taglen} bytes of \textit{tag} provided. By default 1621\textit{res} is set to zero. If all \textit{taglen} bytes of \textit{tag} can be verified then \textit{res} is set to one (authenticated 1622message). 1623 1624\subsubsection{Packet Functions} 1625To make life simpler the following two functions are provided for memory bound OCB. 1626 1627%\index{ocb\_encrypt\_authenticate\_memory()} 1628\begin{verbatim} 1629int ocb_encrypt_authenticate_memory( 1630 int cipher, 1631 const unsigned char *key, unsigned long keylen, 1632 const unsigned char *nonce, 1633 const unsigned char *pt, unsigned long ptlen, 1634 unsigned char *ct, 1635 unsigned char *tag, unsigned long *taglen); 1636\end{verbatim} 1637 1638This will OCB encrypt the message \textit{pt} of length \textit{ptlen}, and store the ciphertext in \textit{ct}. The length \textit{ptlen} 1639can be any arbitrary length. 1640 1641\index{ocb\_decrypt\_verify\_memory()} 1642\begin{verbatim} 1643int ocb_decrypt_verify_memory( 1644 int cipher, 1645 const unsigned char *key, unsigned long keylen, 1646 const unsigned char *nonce, 1647 const unsigned char *ct, unsigned long ctlen, 1648 unsigned char *pt, 1649 const unsigned char *tag, unsigned long taglen, 1650 int *res); 1651\end{verbatim} 1652 1653Similarly, this will OCB decrypt, and compare the internally computed tag against the tag provided. \textit{res} is set 1654appropriately to \textit{1} if the tag matches or to \textit{0} if it doesn't match. 1655 1656\subsection{OCB3} 1657\subsubsection{Initialization and processing} 1658 1659\index{ocb3\_init()} 1660\begin{verbatim} 1661int ocb3_init(ocb3_state *ocb, int cipher, 1662 const unsigned char *key, unsigned long keylen, 1663 const unsigned char *nonce, unsigned long noncelen, 1664 unsigned long taglen); 1665\end{verbatim} 1666 1667This will initialize the \textit{ocb} context using cipher descriptor \textit{cipher}. It will use a \textit{key} of length \textit{keylen} 1668and the random \textit{nonce} of length \textit{noncelen}. The \textit{nonce} must be a random (public) string of an arbitrary length 1669between 1 and 15 octets. The desired length of the TAG that should be created when terminating the state has to be passed in \textit{taglen} 1670and has to be between 0 and 16 octets. 1671 1672Note that you can only use ciphers with a block length of 16. 1673 1674\subsubsection{Additional Authenticated Data} 1675 1676OCB3 has, in contrary to OCB, the possibility to add "Additional Authenticated Data" (AAD) when performing cryptographic operations. 1677 1678\index{ocb3\_add\_aad()} 1679\begin{verbatim} 1680int ocb3_add_aad(ocb3_state *ocb, const unsigned char *aad, unsigned long aadlen); 1681\end{verbatim} 1682 1683This will add the AAD at \textit{aad} of the arbitrary length \textit{aadlen} to be authenticated within the context \textit{ocb}. 1684 1685\index{ocb3\_encrypt()} \index{ocb3\_decrypt()} 1686\begin{verbatim} 1687int ocb3_encrypt( ocb3_state *ocb, 1688 const unsigned char *pt, 1689 unsigned long ptlen, 1690 unsigned char *ct); 1691 1692int ocb3_decrypt( ocb3_state *ocb, 1693 const unsigned char *ct, 1694 unsigned long ctlen, 1695 unsigned char *pt); 1696\end{verbatim} 1697 1698This will encrypt (or decrypt for the latter) a fixed length of data from \textit{pt} to \textit{ct} (vice versa for the latter). 1699They assume that \textit{pt} and \textit{ct} are the same size as the block cipher's block size. Note that you cannot call 1700both functions given a single \textit{ocb} state. For bi-directional communication you will have to initialize two \textit{ocb} 1701states (with different nonces). Also \textit{pt} and \textit{ct} may point to the same location in memory. 1702 1703\subsubsection{State Termination} 1704 1705\index{ocb3\_encrypt\_last()} \index{ocb3\_decrypt\_last()} 1706\begin{verbatim} 1707int ocb3_encrypt_last( ocb3_state *ocb, 1708 const unsigned char *pt, 1709 unsigned long ptlen, 1710 unsigned char *ct); 1711 1712int ocb3_decrypt_last( ocb3_state *ocb, 1713 const unsigned char *ct, 1714 unsigned long ctlen, 1715 unsigned char *pt); 1716\end{verbatim} 1717 1718This has to be called for the last encrypt (or decrypt) operation. Note that if you have to invoke only a single operation you can 1719directly use these functions instead of \textit{ocb3\_encrypt()} or \textit{ocb3\_decrypt()}. 1720 1721When you are finished encrypting the message you call the following function to compute the tag. 1722 1723\index{ocb3\_done()} 1724\begin{verbatim} 1725int ocb3_done(ocb3_state *ocb, unsigned char *tag, unsigned long *taglen); 1726\end{verbatim} 1727 1728This stores the tag of the \textit{ocb} state in \textit{tag}. 1729The \textit{taglen} parameter defines on input the length of the tag to output and will be set to the actual length written, which 1730is at most 16 octets. 1731 1732\subsubsection{Packet Functions} 1733To make life simpler the following two functions are provided for memory bound OCB3. 1734 1735\index{ocb3\_encrypt\_authenticate\_memory()} 1736\begin{verbatim} 1737int ocb3_encrypt_authenticate_memory(int cipher, 1738 const unsigned char *key, unsigned long keylen, 1739 const unsigned char *nonce, unsigned long noncelen, 1740 const unsigned char *adata, unsigned long adatalen, 1741 const unsigned char *pt, unsigned long ptlen, 1742 unsigned char *ct, 1743 unsigned char *tag, unsigned long *taglen); 1744\end{verbatim} 1745 1746This will OCB3 encrypt the message \textit{pt} of length \textit{ptlen}, and store the ciphertext in \textit{ct}. The length \textit{ptlen} 1747can be any arbitrary length. The additional authenticated data \textit{adata} of length \textit{adatalen} is optional and can be left out 1748by passing \textit{NULL} as \textit{adata}. The length of the authentication TAG will be stored in \textit{tag}, which is also optional. 1749The length of the TAG passed in \textit{taglen} has to be between 0 and 16. 1750 1751\index{ocb3\_decrypt\_verify\_memory()} 1752\begin{verbatim} 1753int ocb3_decrypt_verify_memory(int cipher, 1754 const unsigned char *key, unsigned long keylen, 1755 const unsigned char *nonce, unsigned long noncelen, 1756 const unsigned char *adata, unsigned long adatalen, 1757 const unsigned char *ct, unsigned long ctlen, 1758 unsigned char *pt, 1759 const unsigned char *tag, unsigned long taglen, 1760 int *stat); 1761\end{verbatim} 1762 1763Similarly, this will OCB3 decrypt, and compare the internally computed tag against the tag provided. \textit{res} is set 1764appropriately to \textit{1} if the tag matches or to \textit{0} if it doesn't match. 1765 1766\mysection{CCM Mode} 1767CCM is a NIST proposal for encrypt + authenticate that is centered around using AES (or any 16--byte cipher) as a primitive. 1768 1769\subsection{Initialization} 1770To initialize the CCM context with a secret key call the following function. 1771 1772\index{ccm\_init()} 1773\begin{verbatim} 1774int ccm_init( ccm_state *ccm, 1775 int cipher, 1776 const unsigned char *key, 1777 int keylen, 1778 int ptlen, 1779 int taglen, 1780 int aadlen); 1781\end{verbatim} 1782This initializes the CCM state \textit{ccm} for the given cipher indexed by \textit{cipher}, with a secret key \textit{key} of length \textit{keylen} octets. The cipher 1783chosen must have a 16--byte block size (e.g., AES). 1784Unlike EAX and OCB mode, CCM is only meant for \textit{packet} mode where the length of the input is known in advance. This is why the length of the stream 1785to authenticate is given as \textit{ptlen}. 1786With CCM, a header is meta--data you want to send with the message but not have encrypted. The header len is given in the init 1787as \textit{aadlen}. 1788 1789\subsection{Nonce Vector} 1790After the state has been initialized (or reset) the next step is to add the session (or packet) initialization vector. It should be unique per packet encrypted. 1791 1792\index{ccm\_add\_nonce()} 1793\begin{verbatim} 1794int ccm_add_nonce( ccm_state *ccm, 1795 const unsigned char *nonce, 1796 unsigned long noncelen); 1797\end{verbatim} 1798 1799This adds the nonce (a.k.a. salt) \textit{nonce} of length \textit{noncelen} octets to the CCM state \textit{ccm}. Note that this function must be called 1800once and only once. 1801 1802\subsection{Additional Authentication Data} 1803The header is meta--data you want to send with the message but not have encrypted, it must be stored in \textit{adata} of length \textit{adatalen} octets. 1804 1805\index{ccm\_add\_aad()} 1806\begin{verbatim} 1807int ccm_add_aad( ccm_state *ccm, 1808 const unsigned char *adata, 1809 unsigned long adatalen); 1810\end{verbatim} 1811This adds the additional authentication data \textit{adata} of length \textit{adatalen} to the CCM state \textit{ccm}. 1812 1813\subsection{Plaintext Processing} 1814After the AAD has been processed, the plaintext (or ciphertext depending on the direction) can be processed. 1815 1816\index{ccm\_process()} 1817\begin{verbatim} 1818int ccm_process(ccm_state *ccm, 1819 unsigned char *pt, 1820 unsigned long ptlen, 1821 unsigned char *ct, 1822 int direction); 1823\end{verbatim} 1824This processes message data where \textit{pt} is the plaintext and \textit{ct} is the ciphertext. The length of both are equal and stored in \textit{ptlen}. Depending on 1825the mode \textit{pt} is the input and \textit{ct} is the output (or vice versa). When \textit{direction} equals \textbf{CCM\_ENCRYPT} the plaintext is read, 1826encrypted and stored in the ciphertext buffer. When \textit{direction} equals \textbf{CCM\_DECRYPT} the opposite occurs. 1827 1828\subsection{State Termination} 1829To terminate a CCM state and retrieve the message authentication tag call the following function. 1830 1831\index{ccm\_done()} 1832\begin{verbatim} 1833int ccm_done( ccm_state *ccm, 1834 unsigned char *tag, 1835 unsigned long *taglen); 1836\end{verbatim} 1837This terminates the CCM state \textit{ccm} and stores the tag in \textit{tag} of length \textit{taglen} octets. 1838 1839\subsection{State Reset} 1840The call to ccm\_init() will perform considerable pre--computation and if you're going to be dealing with a lot of packets 1841it is very costly to have to call it repeatedly. To aid in this endeavour, the reset function is provided. 1842 1843\index{ccm\_reset()} 1844\begin{verbatim} 1845int ccm_reset(ccm_state *ccm); 1846\end{verbatim} 1847 1848This will reset the CCM state \textit{ccm} to the state that ccm\_init() left it. The user would then call ccm\_add\_nonce(), ccm\_add\_aad(), etc. 1849 1850\subsection{One--Shot Packet} 1851To process a single packet under any given key the following helper function can be used. 1852 1853\index{ccm\_memory()} 1854\begin{verbatim} 1855int ccm_memory( 1856 int cipher, 1857 const unsigned char *key, unsigned long keylen, 1858 symmetric_key *uskey, 1859 const unsigned char *nonce, unsigned long noncelen, 1860 const unsigned char *header, unsigned long headerlen, 1861 unsigned char *pt, unsigned long ptlen, 1862 unsigned char *ct, 1863 unsigned char *tag, unsigned long *taglen, 1864 int direction); 1865\end{verbatim} 1866 1867This will initialize the CCM state with the given key, nonce and AAD value then proceed to encrypt or decrypt the message text and store the final 1868message tag. The definition of the variables is the same as it is for all the manual functions. 1869 1870If you are processing many packets under the same key you shouldn't use this function as it invokes the pre--computation with each call. 1871 1872\subsection{Example Usage} 1873The following is an example usage of how to use CCM over multiple packets with a shared secret key. 1874 1875\begin{small} 1876\begin{verbatim} 1877#include <tomcrypt.h> 1878 1879int send_packet(const unsigned char *pt, unsigned long ptlen, 1880 const unsigned char *nonce, unsigned long noncelen, 1881 const unsigned char *aad, unsigned long aadlen, 1882 ccm_state *ccm) 1883{ 1884 int err; 1885 unsigned long taglen; 1886 unsigned char tag[16]; 1887 1888 /* reset the state */ 1889 if ((err = ccm_reset(ccm)) != CRYPT_OK) { 1890 return err; 1891 } 1892 1893 /* Add the nonce */ 1894 if ((err = ccm_add_nonce(ccm, nonce, noncelen)) != CRYPT_OK) { 1895 return err; 1896 } 1897 1898 /* Add the AAD (note: aad can be NULL if aadlen == 0) */ 1899 if ((err = ccm_add_aad(ccm, aad, aadlen)) != CRYPT_OK) { 1900 return err; 1901 } 1902 1903 /* process the plaintext */ 1904 if ((err = 1905 ccm_process(ccm, pt, ptlen, pt, CCM_ENCRYPT)) != CRYPT_OK) { 1906 return err; 1907 } 1908 1909 /* Finish up and get the MAC tag */ 1910 taglen = sizeof(tag); 1911 if ((err = ccm_done(ccm, tag, &taglen)) != CRYPT_OK) { 1912 return err; 1913 } 1914 1915 /* ... send a header describing the lengths ... */ 1916 1917 /* depending on the protocol and how nonce is 1918 * generated you may have to send it too... */ 1919 send(socket, nonce, noncelen, 0); 1920 1921 /* send the aad */ 1922 send(socket, aad, aadlen, 0); 1923 1924 /* send the ciphertext */ 1925 send(socket, pt, ptlen, 0); 1926 1927 /* send the tag */ 1928 send(socket, tag, taglen, 0); 1929 1930 return CRYPT_OK; 1931} 1932 1933int main(void) 1934{ 1935 ccm_state ccm; 1936 unsigned char key[16], NONCE[12], pt[PACKET_SIZE]; 1937 int err, x; 1938 unsigned long ptlen; 1939 1940 /* somehow fill key/NONCE with random values */ 1941 1942 /* register AES */ 1943 register_cipher(&aes_desc); 1944 1945 /* init the CCM state */ 1946 if ((err = 1947 ccm_init(&ccm, find_cipher("aes"), key, 16, PACKET_SIZE, 16, size(NONCE))) != CRYPT_OK) { 1948 whine_and_pout(err); 1949 } 1950 1951 /* handle us some packets */ 1952 for (;;) { 1953 ptlen = make_packet_we_want_to_send(pt); 1954 1955 /* use NONCE as counter (12 byte counter) */ 1956 for (x = 11; x >= 0; x--) { 1957 if (++NONCE[x]) { 1958 break; 1959 } 1960 } 1961 1962 if ((err = send_packet(pt, ptlen, NONCE, 12, NULL, 0, &ccm)) 1963 != CRYPT_OK) { 1964 whine_and_pout(err); 1965 } 1966 } 1967 return EXIT_SUCCESS; 1968} 1969\end{verbatim} 1970\end{small} 1971 1972\mysection{GCM Mode} 1973Galois counter mode is an IEEE proposal for authenticated encryption (also it is a planned NIST standard). Like EAX and OCB mode, it can be used in a streaming capacity 1974however, unlike EAX it cannot accept \textit{additional authentication data} (meta--data) after plaintext has been processed. This mode also only works with 1975block ciphers with a 16--byte block. 1976 1977A GCM stream is meant to be processed in three modes, one after another. First, the initialization vector (per session) data is processed. This should be 1978unique to every session. Next, the the optional additional authentication data is processed, and finally the plaintext (or ciphertext depending on the direction). 1979 1980\subsection{Initialization} 1981To initialize the GCM context with a secret key call the following function. 1982 1983\index{gcm\_init()} 1984\begin{verbatim} 1985int gcm_init( gcm_state *gcm, 1986 int cipher, 1987 const unsigned char *key, 1988 int keylen); 1989\end{verbatim} 1990This initializes the GCM state \textit{gcm} for the given cipher indexed by \textit{cipher}, with a secret key \textit{key} of length \textit{keylen} octets. The cipher 1991chosen must have a 16--byte block size (e.g., AES). 1992 1993\subsection{Initialization Vector} 1994After the state has been initialized (or reset) the next step is to add the session (or packet) initialization vector. It should be unique per packet encrypted. 1995 1996\index{gcm\_add\_iv()} 1997\begin{verbatim} 1998int gcm_add_iv( gcm_state *gcm, 1999 const unsigned char *IV, 2000 unsigned long IVlen); 2001\end{verbatim} 2002This adds the initialization vector octets from \textit{IV} of length \textit{IVlen} to the GCM state \textit{gcm}. You can call this function as many times as required 2003to process the entire IV. 2004 2005Note: the GCM protocols provides a \textit{shortcut} for 12--byte IVs where no pre-processing is to be done. If you want to minimize per packet latency it is ideal 2006to only use 12--byte IVs. You can just increment it like a counter for each packet. 2007 2008\subsection{Additional Authentication Data} 2009After the entire IV has been processed, the additional authentication data can be processed. Unlike the IV, a packet/session does not require additional 2010authentication data (AAD) for security. The AAD is meant to be used as side--channel data you want to be authenticated with the packet. Note: once 2011you begin adding AAD to the GCM state you cannot return to adding IV data until the state has been reset. 2012 2013\index{gcm\_add\_aad()} 2014\begin{verbatim} 2015int gcm_add_aad( gcm_state *gcm, 2016 const unsigned char *adata, 2017 unsigned long adatalen); 2018\end{verbatim} 2019This adds the additional authentication data \textit{adata} of length \textit{adatalen} to the GCM state \textit{gcm}. 2020 2021\subsection{Plaintext Processing} 2022After the AAD has been processed, the plaintext (or ciphertext depending on the direction) can be processed. 2023 2024\index{gcm\_process()} 2025\begin{verbatim} 2026int gcm_process( gcm_state *gcm, 2027 unsigned char *pt, 2028 unsigned long ptlen, 2029 unsigned char *ct, 2030 int direction); 2031\end{verbatim} 2032This processes message data where \textit{pt} is the plaintext and \textit{ct} is the ciphertext. The length of both are equal and stored in \textit{ptlen}. Depending on 2033the mode \textit{pt} is the input and \textit{ct} is the output (or vice versa). When \textit{direction} equals \textbf{GCM\_ENCRYPT} the plaintext is read, 2034encrypted and stored in the ciphertext buffer. When \textit{direction} equals \textbf{GCM\_DECRYPT} the opposite occurs. 2035 2036\subsection{State Termination} 2037To terminate a GCM state and retrieve the message authentication tag call the following function. 2038 2039\index{gcm\_done()} 2040\begin{verbatim} 2041int gcm_done( gcm_state *gcm, 2042 unsigned char *tag, 2043 unsigned long *taglen); 2044\end{verbatim} 2045This terminates the GCM state \textit{gcm} and stores the tag in \textit{tag} of length \textit{taglen} octets. 2046 2047\subsection{State Reset} 2048The call to gcm\_init() will perform considerable pre--computation (when \textbf{GCM\_TABLES} is defined) and if you're going to be dealing with a lot of packets 2049it is very costly to have to call it repeatedly. To aid in this endeavour, the reset function has been provided. 2050 2051\index{gcm\_reset()} 2052\begin{verbatim} 2053int gcm_reset(gcm_state *gcm); 2054\end{verbatim} 2055 2056This will reset the GCM state \textit{gcm} to the state that gcm\_init() left it. The user would then call gcm\_add\_iv(), gcm\_add\_aad(), etc. 2057 2058\subsection{One--Shot Packet} 2059To process a single packet under any given key the following helper function can be used. 2060 2061\index{gcm\_memory()} 2062\begin{verbatim} 2063int gcm_memory( 2064 int cipher, 2065 const unsigned char *key, 2066 unsigned long keylen, 2067 const unsigned char *IV, unsigned long IVlen, 2068 const unsigned char *adata, unsigned long adatalen, 2069 unsigned char *pt, unsigned long ptlen, 2070 unsigned char *ct, 2071 unsigned char *tag, unsigned long *taglen, 2072 int direction); 2073\end{verbatim} 2074 2075This will initialize the GCM state with the given key, IV and AAD value then proceed to encrypt or decrypt the message text and store the final 2076message tag. The definition of the variables is the same as it is for all the manual functions. 2077 2078If you are processing many packets under the same key you shouldn't use this function as it invokes the pre--computation with each call. 2079 2080\subsection{Example Usage} 2081The following is an example usage of how to use GCM over multiple packets with a shared secret key. 2082 2083\begin{small} 2084\begin{verbatim} 2085#include <tomcrypt.h> 2086 2087int send_packet(const unsigned char *pt, unsigned long ptlen, 2088 const unsigned char *iv, unsigned long ivlen, 2089 const unsigned char *aad, unsigned long aadlen, 2090 gcm_state *gcm) 2091{ 2092 int err; 2093 unsigned long taglen; 2094 unsigned char tag[16]; 2095 2096 /* reset the state */ 2097 if ((err = gcm_reset(gcm)) != CRYPT_OK) { 2098 return err; 2099 } 2100 2101 /* Add the IV */ 2102 if ((err = gcm_add_iv(gcm, iv, ivlen)) != CRYPT_OK) { 2103 return err; 2104 } 2105 2106 /* Add the AAD (note: aad can be NULL if aadlen == 0) */ 2107 if ((err = gcm_add_aad(gcm, aad, aadlen)) != CRYPT_OK) { 2108 return err; 2109 } 2110 2111 /* process the plaintext */ 2112 if ((err = 2113 gcm_process(gcm, pt, ptlen, pt, GCM_ENCRYPT)) != CRYPT_OK) { 2114 return err; 2115 } 2116 2117 /* Finish up and get the MAC tag */ 2118 taglen = sizeof(tag); 2119 if ((err = gcm_done(gcm, tag, &taglen)) != CRYPT_OK) { 2120 return err; 2121 } 2122 2123 /* ... send a header describing the lengths ... */ 2124 2125 /* depending on the protocol and how IV is 2126 * generated you may have to send it too... */ 2127 send(socket, iv, ivlen, 0); 2128 2129 /* send the aad */ 2130 send(socket, aad, aadlen, 0); 2131 2132 /* send the ciphertext */ 2133 send(socket, pt, ptlen, 0); 2134 2135 /* send the tag */ 2136 send(socket, tag, taglen, 0); 2137 2138 return CRYPT_OK; 2139} 2140 2141int main(void) 2142{ 2143 gcm_state gcm; 2144 unsigned char key[16], IV[12], pt[PACKET_SIZE]; 2145 int err, x; 2146 unsigned long ptlen; 2147 2148 /* somehow fill key/IV with random values */ 2149 2150 /* register AES */ 2151 register_cipher(&aes_desc); 2152 2153 /* init the GCM state */ 2154 if ((err = 2155 gcm_init(&gcm, find_cipher("aes"), key, 16)) != CRYPT_OK) { 2156 whine_and_pout(err); 2157 } 2158 2159 /* handle us some packets */ 2160 for (;;) { 2161 ptlen = make_packet_we_want_to_send(pt); 2162 2163 /* use IV as counter (12 byte counter) */ 2164 for (x = 11; x >= 0; x--) { 2165 if (++IV[x]) { 2166 break; 2167 } 2168 } 2169 2170 if ((err = send_packet(pt, ptlen, iv, 12, NULL, 0, &gcm)) 2171 != CRYPT_OK) { 2172 whine_and_pout(err); 2173 } 2174 } 2175 return EXIT_SUCCESS; 2176} 2177\end{verbatim} 2178\end{small} 2179 2180\mysection{ChaCha20--Poly1305} 2181 2182This authenticated encryption is based on ChaCha20 stream cipher and Poly1305 authenticator. 2183It is defined by \url{https://tools.ietf.org/html/rfc7539}. 2184 2185\subsection{Initialization} 2186To initialize the ChaCha20--Poly1305 context with a secret key call the following function. 2187 2188\index{chacha20poly1305\_init()} 2189\begin{verbatim} 2190int chacha20poly1305_init(chacha20poly1305_state *st, 2191 const unsigned char *key, 2192 unsigned long keylen); 2193\end{verbatim} 2194This initializes the ChaCha20--Poly1305 state \textit{st} with a secret key \textit{key} of length \textit{keylen} 2195octets (valid lengths: 32 or 16). 2196 2197\subsection{Initialization Vector} 2198After the state has been initialized the next step is to add the initialization vector. 2199 2200\index{chacha20poly1305\_setiv()} 2201\begin{verbatim} 2202int chacha20poly1305_setiv(chacha20poly1305_state *st, 2203 const unsigned char *iv, 2204 unsigned long ivlen); 2205\end{verbatim} 2206This adds the initialization vector from \textit{iv} of length \textit{ivlen} octects (valid lengths: 8 or 12) to 2207the ChaCha20--Poly1305 state \textit{st}. 2208 2209\index{chacha20poly1305\_setiv\_rfc7905()} 2210\begin{verbatim} 2211int chacha20poly1305_setiv_rfc7905(chacha20poly1305_state *st, 2212 const unsigned char *iv, 2213 unsigned long ivlen, 2214 ulong64 sequence_number); 2215\end{verbatim} 2216This also adds the initialization vector from \textit{iv} of length \textit{ivlen} octects (valid lengths: 8 or 12) to 2217the state \textit{st} but it also incorporates 64bit \textit{sequence\_number} into IV as described in RFC7905. 2218 2219You can call only one of \textit{chacha20poly1305\_setiv} or \textit{chacha20poly1305\_setiv\_rfc7905}. 2220 2221\subsection{Additional Authentication Data} 2222After the IV has been set, the additional authentication data can be processed. 2223 2224\index{chacha20poly1305\_add\_aad()} 2225\begin{verbatim} 2226int chacha20poly1305_add_aad(chacha20poly1305_state *st, 2227 const unsigned char *adata, 2228 unsigned long adatalen); 2229 2230\end{verbatim} 2231This adds the additional authentication data \textit{adata} of length \textit{adatalen} to the ChaCha20--Poly1305 state \textit{st}. 2232 2233\subsection{Encryption / Decryption} 2234After the AAD has been processed, the plaintext (or ciphertext depending on the direction) can be processed. 2235 2236\index{chacha20poly1305\_encrypt()} 2237\begin{verbatim} 2238int chacha20poly1305_encrypt(chacha20poly1305_state *st, 2239 const unsigned char *in, 2240 unsigned long inlen, 2241 unsigned char *out); 2242\end{verbatim} 2243This encrypts the data where \textit{in} is the plaintext and \textit{out} is the ciphertext. The length of both are equal and stored in \textit{inlen}. 2244 2245\index{chacha20poly1305\_decrypt()} 2246\begin{verbatim} 2247int chacha20poly1305_decrypt(chacha20poly1305_state *st, 2248 const unsigned char *in, 2249 unsigned long inlen, 2250 unsigned char *out); 2251\end{verbatim} 2252This decrypts the data where \textit{in} is the ciphertext and \textit{out} is the plaintext. The length of both are equal and stored in \textit{inlen}. 2253 2254\subsection{State Termination} 2255To terminate a ChaCha20--Poly1305 state and retrieve the message authentication tag call the following function. 2256 2257\index{chacha20poly1305\_done()} 2258\begin{verbatim} 2259int chacha20poly1305_done(chacha20poly1305_state *st, 2260 unsigned char *tag, 2261 unsigned long *taglen); 2262\end{verbatim} 2263This terminates the ChaCha20--Poly1305 state \textit{st} and stores the tag in \textit{tag} of length \textit{taglen} octets (always 16). 2264 2265\subsection{One--Shot Packet} 2266To process a single packet under any given key the following helper function can be used. 2267 2268\index{chacha20poly1305\_memory()} 2269\begin{verbatim} 2270int chacha20poly1305_memory(const unsigned char *key, 2271 unsigned long keylen, 2272 const unsigned char *iv, 2273 unsigned long ivlen, 2274 const unsigned char *aad, 2275 unsigned long aadlen, 2276 const unsigned char *in, 2277 unsigned long inlen, 2278 unsigned char *out, 2279 unsigned char *tag, 2280 unsigned long *taglen, 2281 int direction); 2282\end{verbatim} 2283This will initialize the ChaCha20--Poly1305 state with the given key, IV and AAD value then proceed to 2284encrypt (\textit{direction} equals \textbf{CHACHA20POLY1305\_ENCRYPT}) or decrypt (\textit{direction} equals 2285\textbf{CHACHA20POLY1305\_DECRYPT}) the message text and store the final message tag. The definition of the 2286variables is the same as it is for all the manual functions. 2287 2288\chapter{One-Way Cryptographic Hash Functions} 2289\mysection{Core Functions} 2290Like the ciphers, there are hash core functions and a universal data type to hold the hash state called \textit{hash\_state}. To initialize hash 2291XXX (where XXX is the name) call: 2292\index{Hash Functions} 2293\begin{verbatim} 2294void XXX_init(hash_state *md); 2295\end{verbatim} 2296 2297This simply sets up the hash to the default state governed by the specifications of the hash. To add data to the message being hashed call: 2298\begin{verbatim} 2299int XXX_process( hash_state *md, 2300 const unsigned char *in, 2301 unsigned long inlen); 2302\end{verbatim} 2303Essentially all hash messages are virtually infinitely\footnote{Most hashes are limited to $2^{64}$ bits or 2,305,843,009,213,693,952 bytes.} long message which 2304are buffered. In the case where this limit is reached the \textit{XXX\_process()} function returns \textit{CRYPT\_HASH\_OVERFLOW}. 2305\index{CRYPT\_HASH\_OVERFLOW} 2306The data can be passed in any sized chunks as long as the order of the bytes are the same, the message digest (hash output) will be the same. For example, this means that: 2307\begin{verbatim} 2308md5_process(&md, "hello ", 6); 2309md5_process(&md, "world", 5); 2310\end{verbatim} 2311Will produce the same message digest as the single call: 2312\index{Message Digest} 2313\begin{verbatim} 2314md5_process(&md, "hello world", 11); 2315\end{verbatim} 2316 2317To finally get the message digest (the hash) call: 2318\begin{verbatim} 2319int XXX_done( hash_state *md, 2320 unsigned char *out); 2321\end{verbatim} 2322 2323This function will finish up the hash and store the result in the \textit{out} array. You must ensure that \textit{out} is long 2324enough for the hash in question. Often hashes are used to get keys for symmetric ciphers so the \textit{XXX\_done()} functions 2325will wipe the \textit{md} variable before returning automatically. 2326 2327To test a hash function call: 2328\begin{verbatim} 2329int XXX_test(void); 2330\end{verbatim} 2331 2332This will return {\bf CRYPT\_OK} if the hash matches the test vectors, otherwise it returns an error code. An 2333example snippet that hashes a message with md5 is given below. 2334\begin{small} 2335\begin{verbatim} 2336#include <tomcrypt.h> 2337int main(void) 2338{ 2339 hash_state md; 2340 unsigned char *in = "hello world", out[16]; 2341 2342 /* setup the hash */ 2343 md5_init(&md); 2344 2345 /* add the message */ 2346 md5_process(&md, in, strlen(in)); 2347 2348 /* get the hash in out[0..15] */ 2349 md5_done(&md, out); 2350 2351 return 0; 2352} 2353\end{verbatim} 2354\end{small} 2355 2356\mysection{Hash Descriptors} 2357Like the set of ciphers, the set of hashes have descriptors as well. They are stored in an array called \textit{hash\_descriptor} and 2358are defined by: 2359\begin{verbatim} 2360struct _hash_descriptor { 2361 char *name; 2362 2363 unsigned long hashsize; /* digest output size in bytes */ 2364 unsigned long blocksize; /* the block size the hash uses */ 2365 2366 void (*init) (hash_state *hash); 2367 2368 int (*process)( hash_state *hash, 2369 const unsigned char *in, 2370 unsigned long inlen); 2371 2372 int (*done) (hash_state *hash, unsigned char *out); 2373 2374 int (*test) (void); 2375}; 2376\end{verbatim} 2377 2378\index{find\_hash()} 2379The \textit{name} member is the name of the hash function (all lowercase). The \textit{hashsize} member is the size of the digest output 2380in bytes, while \textit{blocksize} is the size of blocks the hash expects to the compression function. Technically, this detail is not important 2381for high level developers but is useful to know for performance reasons. 2382 2383The \textit{init} member initializes the hash, \textit{process} passes data through the hash, \textit{done} terminates the hash and retrieves the 2384digest. The \textit{test} member tests the hash against the specified test vectors. 2385 2386There is a function to search the array as well called \textit{int find\_hash(char *name)}. It returns -1 if the hash is not found, otherwise, the 2387position in the descriptor table of the hash. 2388 2389In addition, there is also find\_hash\_oid() which finds a hash by the ASN.1 OBJECT IDENTIFIER string. 2390\index{find\_hash\_oid()} 2391\begin{verbatim} 2392int find_hash_oid(const unsigned long *ID, unsigned long IDlen); 2393\end{verbatim} 2394 2395You can use the table to indirectly call a hash function that is chosen at run-time. For example: 2396\begin{small} 2397\begin{verbatim} 2398#include <tomcrypt.h> 2399int main(void) 2400{ 2401 unsigned char buffer[100], hash[MAXBLOCKSIZE]; 2402 int idx, x; 2403 hash_state md; 2404 2405 /* register hashes .... */ 2406 if (register_hash(&md5_desc) == -1) { 2407 printf("Error registering MD5.\n"); 2408 return -1; 2409 } 2410 2411 /* register other hashes ... */ 2412 2413 /* prompt for name and strip newline */ 2414 printf("Enter hash name: \n"); 2415 fgets(buffer, sizeof(buffer), stdin); 2416 buffer[strlen(buffer) - 1] = 0; 2417 2418 /* get hash index */ 2419 idx = find_hash(buffer); 2420 if (idx == -1) { 2421 printf("Invalid hash name!\n"); 2422 return -1; 2423 } 2424 2425 /* hash input until blank line */ 2426 hash_descriptor[idx].init(&md); 2427 while (fgets(buffer, sizeof(buffer), stdin) != NULL) 2428 hash_descriptor[idx].process(&md, buffer, strlen(buffer)); 2429 hash_descriptor[idx].done(&md, hash); 2430 2431 /* dump to screen */ 2432 for (x = 0; x < hash_descriptor[idx].hashsize; x++) 2433 printf("%02x ", hash[x]); 2434 printf("\n"); 2435 return 0; 2436} 2437\end{verbatim} 2438\end{small} 2439 2440Note the usage of \textbf{MAXBLOCKSIZE}. In LibTomCrypt, no symmetric block, key or hash digest is larger than \textbf{MAXBLOCKSIZE} in 2441length. This provides a simple size you can set your automatic arrays to that will not get overrun. 2442 2443There are three helper functions to make working with hashes easier. The first is a function to hash a buffer, and produce the digest in a single 2444function call. 2445 2446\index{hash\_memory()} 2447\begin{verbatim} 2448int hash_memory( int hash, 2449 const unsigned char *in, 2450 unsigned long inlen, 2451 unsigned char *out, 2452 unsigned long *outlen); 2453\end{verbatim} 2454 2455This will hash the data pointed to by \textit{in} of length \textit{inlen}. The hash used is indexed by the \textit{hash} parameter. The message 2456digest is stored in \textit{out}, and the \textit{outlen} parameter is updated to hold the message digest size. 2457 2458The next helper function allows for the hashing of a file based on a file name. 2459\index{hash\_file()} 2460\begin{verbatim} 2461int hash_file( int hash, 2462 const char *fname, 2463 unsigned char *out, 2464 unsigned long *outlen); 2465\end{verbatim} 2466 2467This will hash the file named by \textit{fname} using the hash indexed by \textit{hash}. The file named in this function call must be readable by the 2468user owning the process performing the request. This function can be omitted by the \textbf{LTC\_NO\_FILE} define, which forces it to return \textbf{CRYPT\_NOP} 2469when it is called. The message digest is stored in \textit{out}, and the \textit{outlen} parameter is updated to hold the message digest size. 2470 2471\index{hash\_filehandle()} 2472\begin{verbatim} 2473int hash_filehandle( int hash, 2474 FILE *in, 2475 unsigned char *out, 2476 unsigned long *outlen); 2477\end{verbatim} 2478 2479This will hash the file identified by the handle \textit{in} using the hash indexed by \textit{hash}. This will begin hashing from the current file pointer position, and 2480will not rewind the file pointer when finished. This function can be omitted by the \textbf{LTC\_NO\_FILE} define, which forces it to return \textbf{CRYPT\_NOP} 2481when it is called. The message digest is stored in \textit{out}, and the \textit{outlen} parameter is updated to hold the message digest size. 2482 2483To perform the above hash with md5 the following code could be used: 2484\begin{small} 2485\begin{verbatim} 2486#include <tomcrypt.h> 2487int main(void) 2488{ 2489 int idx, err; 2490 unsigned long len; 2491 unsigned char out[MAXBLOCKSIZE]; 2492 2493 /* register the hash */ 2494 if (register_hash(&md5_desc) == -1) { 2495 printf("Error registering MD5.\n"); 2496 return -1; 2497 } 2498 2499 /* get the index of the hash */ 2500 idx = find_hash("md5"); 2501 2502 /* call the hash */ 2503 len = sizeof(out); 2504 if ((err = 2505 hash_memory(idx, "hello world", 11, out, &len)) != CRYPT_OK) { 2506 printf("Error hashing data: %s\n", error_to_string(err)); 2507 return -1; 2508 } 2509 return 0; 2510} 2511\end{verbatim} 2512\end{small} 2513 2514\subsection{Hash Registration} 2515Similar to the cipher descriptor table you must register your hash algorithms before you can use them. These functions 2516work exactly like those of the cipher registration code. The functions are: 2517\index{register\_hash()} \index{unregister\_hash()} 2518\begin{verbatim} 2519int register_hash(const struct _hash_descriptor *hash); 2520 2521int unregister_hash(const struct _hash_descriptor *hash); 2522\end{verbatim} 2523 2524The following hashes are provided as of this release within the LibTomCrypt library: 2525\index{Hash descriptor table} 2526 2527\begin{figure}[H] 2528\begin{center} 2529\begin{tabular}{|c|c|c|} 2530 \hline \textbf{Name} & \textbf{Descriptor Name} & \textbf{Size of Message Digest (bytes)} \\ 2531 \hline WHIRLPOOL & whirlpool\_desc & 64 \\ 2532 \hline SHA3-512 & sha3\_512\_desc & 64 \\ 2533 \hline SHA-512 & sha512\_desc & 64 \\ 2534 \hline BLAKE2B-512 & blake2b\_512\_desc & 64 \\ 2535 \hline SHA3-384 & sha3\_384\_desc & 48 \\ 2536 \hline SHA-384 & sha384\_desc & 48 \\ 2537 \hline RIPEMD-320 & rmd160\_desc & 40 \\ 2538 \hline SHA-512/256 & sha512\_256\_desc & 32 \\ 2539 \hline SHA3-256 & sha3\_256\_desc & 32 \\ 2540 \hline SHA-256 & sha256\_desc & 32 \\ 2541 \hline RIPEMD-256 & rmd160\_desc & 32 \\ 2542 \hline BLAKE2S-256 & blake2s\_256\_desc & 32 \\ 2543 \hline BLAKE2B-256 & blake2b\_256\_desc & 32 \\ 2544 \hline SHA-512/224 & sha512\_224\_desc & 28 \\ 2545 \hline SHA3-224 & sha3\_224\_desc & 28 \\ 2546 \hline SHA-224 & sha224\_desc & 28 \\ 2547 \hline BLAKE2S-224 & blake2s\_224\_desc & 28 \\ 2548 \hline BLAKE2B-384 & blake2b\_384\_desc & 48 \\ 2549 \hline TIGER-192 & tiger\_desc & 24 \\ 2550 \hline SHA-1 & sha1\_desc & 20 \\ 2551 \hline RIPEMD-160 & rmd160\_desc & 20 \\ 2552 \hline BLAKE2S-160 & blake2s\_160\_desc & 20 \\ 2553 \hline BLAKE2B-160 & blake2b\_160\_desc & 20 \\ 2554 \hline RIPEMD-128 & rmd128\_desc & 16 \\ 2555 \hline MD5 & md5\_desc & 16 \\ 2556 \hline MD4 & md4\_desc & 16 \\ 2557 \hline MD2 & md2\_desc & 16 \\ 2558 \hline BLAKE2S-128 & blake2s\_128\_desc & 16 \\ 2559 \hline 2560\end{tabular} 2561\end{center} 2562\caption{Built--In Software Hashes} 2563\end{figure} 2564\vfil 2565 2566\mysection{Cipher Hash Construction} 2567\index{Cipher Hash Construction} 2568An addition to the suite of hash functions is the \textit{Cipher Hash Construction} or \textit{CHC} mode. In this mode 2569applicable block ciphers (such as AES) can be turned into hash functions that other LTC functions can use. In 2570particular this allows a cryptosystem to be designed using very few moving parts. 2571 2572In order to use the CHC system the developer will have to take a few extra steps. First the \textit{chc\_desc} hash 2573descriptor must be registered with register\_hash(). At this point the CHC hash cannot be used to hash 2574data. While it is in the hash system you still have to tell the CHC code which cipher to use. This is accomplished 2575via the chc\_register() function. 2576 2577\index{chc\_register()} 2578\begin{verbatim} 2579int chc_register(int cipher); 2580\end{verbatim} 2581 2582A cipher has to be registered with CHC (and also in the cipher descriptor tables with 2583register\_cipher()). The chc\_register() function will bind a cipher to the CHC system. Only one cipher can 2584be bound to the CHC hash at a time. There are additional requirements for the system to work. 2585 2586\begin{enumerate} 2587 \item The cipher must have a block size greater than 64--bits. 2588 \item The cipher must allow an input key the size of the block size. 2589\end{enumerate} 2590 2591Example of using CHC with the AES block cipher. 2592 2593\begin{verbatim} 2594#include <tomcrypt.h> 2595int main(void) 2596{ 2597 int err; 2598 2599 /* register cipher and hash */ 2600 if (register_cipher(&aes_enc_desc) == -1) { 2601 printf("Could not register cipher\n"); 2602 return EXIT_FAILURE; 2603 } 2604 if (register_hash(&chc_desc) == -1) { 2605 printf("Could not register hash\n"); 2606 return EXIT_FAILURE; 2607 } 2608 2609 /* start chc with AES */ 2610 if ((err = chc_register(find_cipher("aes"))) != CRYPT_OK) { 2611 printf("Error binding AES to CHC: %s\n", 2612 error_to_string(err)); 2613 } 2614 2615 /* now you can use chc_hash in any LTC function 2616 * [aside from pkcs...] */ 2617} 2618\end{verbatim} 2619 2620\mysection{SHA3 SHAKE} 2621The SHA3 class of algorithms provides a special XOF (Extendable Output Functions) mode, called SHAKE. 2622SHAKE operates in 2 security configurations, 128bit or 256bit, and allows to generate message digests of an arbitrary length. 2623 2624For further information see \url{https://en.wikipedia.org/wiki/SHA-3} 2625 2626Example of using SHAKE256 with an arbitrary length output. 2627 2628\begin{verbatim} 2629#include <tomcrypt.h> 2630int main(void) 2631{ 2632 int err; 2633 hash_state state; 2634 const void* msg = "The quick brown fox jumps over the lazy dog"; 2635 unsigned char output[345]; 2636 2637 if ((err = sha3_shake_init(&state, 256)) != CRYPT_OK) { 2638 printf("Could not init SHAKE256 (%s)\n", error_to_string(err)); 2639 return EXIT_FAILURE; 2640 } 2641 if ((err = sha3_shake_process(&state, msg, strlen(msg))) != CRYPT_OK) { 2642 printf("Could not process SHAKE256 (%s)\n", error_to_string(err)); 2643 return EXIT_FAILURE; 2644 } 2645 if ((err = sha3_shake_done(&state, output, sizeof(output))) != CRYPT_OK) { 2646 printf("Could not finish SHAKE256 (%s)\n", error_to_string(err)); 2647 return EXIT_FAILURE; 2648 } 2649 return EXIT_SUCCESS; 2650} 2651\end{verbatim} 2652 2653\mysection{Notice} 2654It is highly recommended that you \textbf{not} use the MD2, MD4, MD5, or SHA-1 hashes for the purposes of digital signatures or authentication codes. 2655These hashes are provided for completeness and they still can be used for the purposes of password hashing or one-way accumulators 2656(e.g. Yarrow). 2657 2658The other hashes such as the SHA-2 (that includes SHA-512, SHA-512/384, SHA-384, SHA-512/256, SHA-256 and SHA-224) and TIGER-192 are still considered secure 2659for all purposes you would normally use a hash for. 2660 2661\chapter{Checksum Functions} 2662 2663\mysection{Preface} 2664 2665The API for all checksum functions operate in mode: \textit{init} -- \textit{update} -- \textit{update} -- ... -- \textit{finish}. 2666 2667The \textit{finish} functions allow to output a partial result if necessary. 2668 2669\mysection{CRC-32 -- Cyclic redundancy check} 2670 2671A Cyclic Redundancy Check is an error-detecting code, where LibTomCrypt implements CRC-32 with the polynomial \textit{0x04C11DB7}. 2672 2673For further information see \url{https://en.wikipedia.org/wiki/Cyclic_redundancy_check} 2674 2675\begin{verbatim} 2676void crc32_init(crc32_state *ctx); 2677void crc32_update(crc32_state *ctx, const unsigned char *input, unsigned long length); 2678void crc32_finish(crc32_state *ctx, void *hash, unsigned long size); 2679\end{verbatim} 2680 2681\mysection{Adler-32} 2682 2683Adler-32 is a checksum algorithm. 2684 2685For further information see \url{https://en.wikipedia.org/wiki/Adler-32}. 2686 2687\begin{verbatim} 2688void adler32_init(adler32_state *ctx); 2689void adler32_update(adler32_state *ctx, const unsigned char *input, unsigned long length); 2690void adler32_finish(adler32_state *ctx, void *hash, unsigned long size); 2691\end{verbatim} 2692 2693\chapter{Message Authentication Codes} 2694\mysection{HMAC Protocol} 2695Thanks to Dobes Vandermeer, the library now includes support for hash based message authentication codes, or HMAC for short. An HMAC 2696of a message is a keyed authentication code that only the owner of a private symmetric key will be able to verify. The purpose is 2697to allow an owner of a private symmetric key to produce an HMAC on a message then later verify if it is correct. Any impostor or 2698eavesdropper will not be able to verify the authenticity of a message. 2699 2700The HMAC support works much like the normal hash functions except that the initialization routine requires you to pass a key 2701and its length. The key is much like a key you would pass to a cipher. That is, it is simply an array of octets stored in 2702unsigned characters. The initialization routine is: 2703\index{hmac\_init()} 2704\begin{verbatim} 2705int hmac_init( hmac_state *hmac, 2706 int hash, 2707 const unsigned char *key, 2708 unsigned long keylen); 2709\end{verbatim} 2710The \textit{hmac} parameter is the state for the HMAC code. The \textit{hash} parameter is the index into the descriptor table of the hash you want 2711to use to authenticate the message. The \textit{key} parameter is the pointer to the array of chars that make up the key. The \textit{keylen} parameter is the 2712length (in octets) of the key you want to use to authenticate the message. To send octets of a message through the HMAC system you must use the following function: 2713\index{hmac\_process()} 2714\begin{verbatim} 2715int hmac_process( hmac_state *hmac, 2716 const unsigned char *in, 2717 unsigned long inlen); 2718\end{verbatim} 2719\textit{hmac} is the HMAC state you are working with. \textit{in} is the array of octets to send into the HMAC process. \textit{inlen} is the 2720number of octets to process. Like the hash process routines, you can send the data in arbitrarily sized chunks. When you 2721are finished with the HMAC process you must call the following function to get the HMAC code: 2722\index{hmac\_done()} 2723\begin{verbatim} 2724int hmac_done( hmac_state *hmac, 2725 unsigned char *out, 2726 unsigned long *outlen); 2727\end{verbatim} 2728The \textit{hmac} parameter is the HMAC state you are working with. The \textit{out} parameter is the array of octets where the HMAC code should be stored. 2729You must set \textit{outlen} to the size of the destination buffer before calling this function. It is updated with the length of the HMAC code 2730produced (depending on which hash was picked). If \textit{outlen} is less than the size of the message digest (and ultimately 2731the HMAC code) then the HMAC code is truncated as per FIPS-198 specifications (e.g. take the first \textit{outlen} bytes). 2732 2733There are two utility functions provided to make using HMACs easier to do. They accept the key and information about the 2734message (file pointer, address in memory), and produce the HMAC result in one shot. These are useful if you want to avoid 2735calling the three step process yourself. 2736 2737\index{hmac\_memory()} 2738\begin{verbatim} 2739int hmac_memory( 2740 int hash, 2741 const unsigned char *key, unsigned long keylen, 2742 const unsigned char *in, unsigned long inlen, 2743 unsigned char *out, unsigned long *outlen); 2744\end{verbatim} 2745This will produce an HMAC code for the array of octets in \textit{in} of length \textit{inlen}. The index into the hash descriptor 2746table must be provided in \textit{hash}. It uses the key from \textit{key} with a key length of \textit{keylen}. 2747The result is stored in the array of octets \textit{out} and the length in \textit{outlen}. The value of \textit{outlen} must be set 2748to the size of the destination buffer before calling this function. Similarly for files there is the following function: 2749\index{hmac\_file()} 2750\begin{verbatim} 2751int hmac_file( 2752 int hash, 2753 const char *fname, 2754 const unsigned char *key, unsigned long keylen, 2755 unsigned char *out, unsigned long *outlen); 2756\end{verbatim} 2757\textit{hash} is the index into the hash descriptor table of the hash you want to use. \textit{fname} is the filename to process. 2758\textit{key} is the array of octets to use as the key of length \textit{keylen}. \textit{out} is the array of octets where the 2759result should be stored. 2760 2761To test if the HMAC code is working there is the following function: 2762\index{hmac\_test()} 2763\begin{verbatim} 2764int hmac_test(void); 2765\end{verbatim} 2766Which returns {\bf CRYPT\_OK} if the code passes otherwise it returns an error code. Some example code for using the 2767HMAC system is given below. 2768 2769\begin{small} 2770\begin{verbatim} 2771#include <tomcrypt.h> 2772int main(void) 2773{ 2774 int idx, err; 2775 hmac_state hmac; 2776 unsigned char key[16], dst[MAXBLOCKSIZE]; 2777 unsigned long dstlen; 2778 2779 /* register SHA-1 */ 2780 if (register_hash(&sha1_desc) == -1) { 2781 printf("Error registering SHA1\n"); 2782 return -1; 2783 } 2784 2785 /* get index of SHA1 in hash descriptor table */ 2786 idx = find_hash("sha1"); 2787 2788 /* we would make up our symmetric key in "key[]" here */ 2789 2790 /* start the HMAC */ 2791 if ((err = hmac_init(&hmac, idx, key, 16)) != CRYPT_OK) { 2792 printf("Error setting up hmac: %s\n", error_to_string(err)); 2793 return -1; 2794 } 2795 2796 /* process a few octets */ 2797 if((err = hmac_process(&hmac, "hello", 5) != CRYPT_OK) { 2798 printf("Error processing hmac: %s\n", error_to_string(err)); 2799 return -1; 2800 } 2801 2802 /* get result (presumably to use it somehow...) */ 2803 dstlen = sizeof(dst); 2804 if ((err = hmac_done(&hmac, dst, &dstlen)) != CRYPT_OK) { 2805 printf("Error finishing hmac: %s\n", error_to_string(err)); 2806 return -1; 2807 } 2808 printf("The hmac is %lu bytes long\n", dstlen); 2809 2810 /* return */ 2811 return 0; 2812} 2813\end{verbatim} 2814\end{small} 2815 2816\mysection{OMAC Support} 2817\index{OMAC} \index{CMAC} 2818OMAC\footnote{\url{http://crypt.cis.ibaraki.ac.jp/omac/omac.html}}, which stands for \textit{One-Key CBC MAC} is an 2819algorithm which produces a Message Authentication Code (MAC) using only a block cipher such as AES. Note: OMAC has been standardized as 2820CMAC within NIST, for the purposes of this library OMAC and CMAC are synonymous. From an API standpoint, the OMAC routines work much like the 2821HMAC routines. Instead, in this case a cipher is used instead of a hash. 2822 2823To start an OMAC state you call 2824\index{omac\_init()} 2825\begin{verbatim} 2826int omac_init( omac_state *omac, 2827 int cipher, 2828 const unsigned char *key, 2829 unsigned long keylen); 2830\end{verbatim} 2831The \textit{omac} parameter is the state for the OMAC algorithm. The \textit{cipher} parameter is the index into the cipher\_descriptor table 2832of the cipher\footnote{The cipher must have a 64 or 128 bit block size. Such as CAST5, Blowfish, DES, AES, Twofish, etc.} you 2833wish to use. The \textit{key} and \textit{keylen} parameters are the keys used to authenticate the data. 2834 2835To send data through the algorithm call 2836\index{omac\_process()} 2837\begin{verbatim} 2838int omac_process( omac_state *state, 2839 const unsigned char *in, 2840 unsigned long inlen); 2841\end{verbatim} 2842This will send \textit{inlen} bytes from \textit{in} through the active OMAC state \textit{state}. Returns \textbf{CRYPT\_OK} if the 2843function succeeds. The function is not sensitive to the granularity of the data. For example, 2844 2845\begin{verbatim} 2846omac_process(&mystate, "hello", 5); 2847omac_process(&mystate, " world", 6); 2848\end{verbatim} 2849 2850Would produce the same result as, 2851 2852\begin{verbatim} 2853omac_process(&mystate, "hello world", 11); 2854\end{verbatim} 2855 2856When you are done processing the message you can call the following to compute the message tag. 2857 2858\index{omac\_done()} 2859\begin{verbatim} 2860int omac_done( omac_state *state, 2861 unsigned char *out, 2862 unsigned long *outlen); 2863\end{verbatim} 2864Which will terminate the OMAC and output the \textit{tag} (MAC) to \textit{out}. Note that unlike the HMAC and other code 2865\textit{outlen} can be smaller than the default MAC size (for instance AES would make a 16-byte tag). Part of the OMAC 2866specification states that the output may be truncated. So if you pass in $outlen = 5$ and use AES as your cipher than 2867the output MAC code will only be five bytes long. If \textit{outlen} is larger than the default size it is set to the default 2868size to show how many bytes were actually used. 2869 2870Similar to the HMAC code the file and memory functions are also provided. To OMAC a buffer of memory in one shot use the 2871following function. 2872 2873\index{omac\_memory()} 2874\begin{verbatim} 2875int omac_memory( 2876 int cipher, 2877 const unsigned char *key, unsigned long keylen, 2878 const unsigned char *in, unsigned long inlen, 2879 unsigned char *out, unsigned long *outlen); 2880\end{verbatim} 2881This will compute the OMAC of \textit{inlen} bytes of \textit{in} using the key \textit{key} of length \textit{keylen} bytes and the cipher 2882specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with the same 2883rules as omac\_done. 2884 2885To OMAC a file use 2886\index{omac\_file()} 2887\begin{verbatim} 2888int omac_file( 2889 int cipher, 2890 const unsigned char *key, unsigned long keylen, 2891 const char *filename, 2892 unsigned char *out, unsigned long *outlen); 2893\end{verbatim} 2894 2895Which will OMAC the entire contents of the file specified by \textit{filename} using the key \textit{key} of length \textit{keylen} bytes 2896and the cipher specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with 2897the same rules as omac\_done. 2898 2899To test if the OMAC code is working there is the following function: 2900\index{omac\_test()} 2901\begin{verbatim} 2902int omac_test(void); 2903\end{verbatim} 2904Which returns {\bf CRYPT\_OK} if the code passes otherwise it returns an error code. Some example code for using the 2905OMAC system is given below. 2906 2907\begin{small} 2908\begin{verbatim} 2909#include <tomcrypt.h> 2910int main(void) 2911{ 2912 int idx, err; 2913 omac_state omac; 2914 unsigned char key[16], dst[MAXBLOCKSIZE]; 2915 unsigned long dstlen; 2916 2917 /* register Rijndael */ 2918 if (register_cipher(&rijndael_desc) == -1) { 2919 printf("Error registering Rijndael\n"); 2920 return -1; 2921 } 2922 2923 /* get index of Rijndael in cipher descriptor table */ 2924 idx = find_cipher("rijndael"); 2925 2926 /* we would make up our symmetric key in "key[]" here */ 2927 2928 /* start the OMAC */ 2929 if ((err = omac_init(&omac, idx, key, 16)) != CRYPT_OK) { 2930 printf("Error setting up omac: %s\n", error_to_string(err)); 2931 return -1; 2932 } 2933 2934 /* process a few octets */ 2935 if((err = omac_process(&omac, "hello", 5) != CRYPT_OK) { 2936 printf("Error processing omac: %s\n", error_to_string(err)); 2937 return -1; 2938 } 2939 2940 /* get result (presumably to use it somehow...) */ 2941 dstlen = sizeof(dst); 2942 if ((err = omac_done(&omac, dst, &dstlen)) != CRYPT_OK) { 2943 printf("Error finishing omac: %s\n", error_to_string(err)); 2944 return -1; 2945 } 2946 printf("The omac is %lu bytes long\n", dstlen); 2947 2948 /* return */ 2949 return 0; 2950} 2951\end{verbatim} 2952\end{small} 2953 2954\mysection{PMAC Support} 2955The PMAC\footnote{J.Black, P.Rogaway, \textit{A Block--Cipher Mode of Operation for Parallelizable Message Authentication}} 2956protocol is another MAC algorithm that relies solely on a symmetric-key block cipher. It uses essentially the same 2957API as the provided OMAC code. 2958 2959A PMAC state is initialized with the following. 2960 2961\index{pmac\_init()} 2962\begin{verbatim} 2963int pmac_init( pmac_state *pmac, 2964 int cipher, 2965 const unsigned char *key, 2966 unsigned long keylen); 2967\end{verbatim} 2968Which initializes the \textit{pmac} state with the given \textit{cipher} and \textit{key} of length \textit{keylen} bytes. The chosen cipher 2969must have a 64 or 128 bit block size (e.x. AES). 2970 2971To MAC data simply send it through the process function. 2972 2973\index{pmac\_process()} 2974\begin{verbatim} 2975int pmac_process( pmac_state *state, 2976 const unsigned char *in, 2977 unsigned long inlen); 2978\end{verbatim} 2979This will process \textit{inlen} bytes of \textit{in} in the given \textit{state}. The function is not sensitive to the granularity of the 2980data. For example, 2981 2982\begin{verbatim} 2983pmac_process(&mystate, "hello", 5); 2984pmac_process(&mystate, " world", 6); 2985\end{verbatim} 2986 2987Would produce the same result as, 2988 2989\begin{verbatim} 2990pmac_process(&mystate, "hello world", 11); 2991\end{verbatim} 2992 2993When a complete message has been processed the following function can be called to compute the message tag. 2994 2995\index{pmac\_done()} 2996\begin{verbatim} 2997int pmac_done( pmac_state *state, 2998 unsigned char *out, 2999 unsigned long *outlen); 3000\end{verbatim} 3001This will store up to \textit{outlen} bytes of the tag for the given \textit{state} into \textit{out}. Note that if \textit{outlen} is larger 3002than the size of the tag it is set to the amount of bytes stored in \textit{out}. 3003 3004Similar to the OMAC code the file and memory functions are also provided. To PMAC a buffer of memory in one shot use the 3005following function. 3006 3007\index{pmac\_memory()} 3008\begin{verbatim} 3009int pmac_memory( 3010 int cipher, 3011 const unsigned char *key, unsigned long keylen, 3012 const unsigned char *in, unsigned long inlen, 3013 unsigned char *out, unsigned long *outlen); 3014\end{verbatim} 3015This will compute the PMAC of \textit{msglen} bytes of \textit{msg} using the key \textit{key} of length \textit{keylen} bytes, and the cipher 3016specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with the same 3017rules as pmac\_done(). 3018 3019To PMAC a file use 3020\index{pmac\_file()} 3021\begin{verbatim} 3022int pmac_file( 3023 int cipher, 3024 const unsigned char *key, unsigned long keylen, 3025 const char *filename, 3026 unsigned char *out, unsigned long *outlen); 3027\end{verbatim} 3028 3029Which will PMAC the entire contents of the file specified by \textit{filename} using the key \textit{key} of length \textit{keylen} bytes, 3030and the cipher specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with 3031the same rules as pmac\_done(). 3032 3033To test if the PMAC code is working there is the following function: 3034\index{pmac\_test()} 3035\begin{verbatim} 3036int pmac_test(void); 3037\end{verbatim} 3038Which returns {\bf CRYPT\_OK} if the code passes otherwise it returns an error code. 3039 3040\mysection{Pelican MAC} 3041Pelican MAC is a new (experimental) MAC by the AES team that uses four rounds of AES as a \textit{mixing function}. It achieves a very high 3042rate of processing and is potentially very secure. It requires AES to be enabled to function. You do not have to register\_cipher() AES first though 3043as it calls AES directly. 3044 3045\index{pelican\_init()} 3046\begin{verbatim} 3047int pelican_init( pelican_state *pelmac, 3048 const unsigned char *key, 3049 unsigned long keylen); 3050\end{verbatim} 3051This will initialize the Pelican state with the given AES key. Once this has been done you can begin processing data. 3052 3053\index{pelican\_process()} 3054\begin{verbatim} 3055int pelican_process( pelican_state *pelmac, 3056 const unsigned char *in, 3057 unsigned long inlen); 3058\end{verbatim} 3059This will process \textit{inlen} bytes of \textit{in} through the Pelican MAC. It's best that you pass in multiples of 16 bytes as it makes the 3060routine more efficient but you may pass in any length of text. You can call this function as many times as required to process 3061an entire message. 3062 3063\index{pelican\_done()} 3064\begin{verbatim} 3065int pelican_done(pelican_state *pelmac, unsigned char *out); 3066\end{verbatim} 3067This terminates a Pelican MAC and writes the 16--octet tag to \textit{out}. 3068 3069\subsection{Example} 3070 3071\begin{verbatim} 3072#include <tomcrypt.h> 3073int main(void) 3074{ 3075 pelican_state pelstate; 3076 unsigned char key[32], tag[16]; 3077 int err; 3078 3079 /* somehow initialize a key */ 3080 3081 /* initialize pelican mac */ 3082 if ((err = pelican_init(&pelstate, /* the state */ 3083 key, /* user key */ 3084 32 /* key length in octets */ 3085 )) != CRYPT_OK) { 3086 printf("Error initializing Pelican: %s", 3087 error_to_string(err)); 3088 return EXIT_FAILURE; 3089 } 3090 3091 /* MAC some data */ 3092 if ((err = pelican_process(&pelstate, /* the state */ 3093 "hello world", /* data to mac */ 3094 11 /* length of data */ 3095 )) != CRYPT_OK) { 3096 printf("Error processing Pelican: %s", 3097 error_to_string(err)); 3098 return EXIT_FAILURE; 3099 } 3100 3101 /* Terminate the MAC */ 3102 if ((err = pelican_done(&pelstate,/* the state */ 3103 tag /* where to store the tag */ 3104 )) != CRYPT_OK) { 3105 printf("Error terminating Pelican: %s", 3106 error_to_string(err)); 3107 return EXIT_FAILURE; 3108 } 3109 3110 /* tag[0..15] has the MAC output now */ 3111 3112 return EXIT_SUCCESS; 3113} 3114\end{verbatim} 3115 3116\mysection{XCBC-MAC} 3117As of LibTomCrypt v1.15, XCBC-MAC (RFC 3566) has been provided to support TLS encryption suites. Like OMAC, it computes a message authentication code 3118by using a cipher in CBC mode. It also uses a single key which it expands into the requisite three keys for the MAC function. A XCBC--MAC state is 3119initialized with the following function: 3120 3121\index{xcbc\_init()} 3122\begin{verbatim} 3123int xcbc_init( xcbc_state *xcbc, 3124 int cipher, 3125 const unsigned char *key, 3126 unsigned long keylen); 3127\end{verbatim} 3128 3129This will initialize the XCBC--MAC state \textit{xcbc}, with the key specified in \textit{key} of length \textit{keylen} octets. The cipher indicated 3130by the \textit{cipher} index can be either a 64 or 128--bit block cipher. This will return \textbf{CRYPT\_OK} on success. 3131 3132\index{LTC\_XCBC\_PURE} 3133It is possible to use XCBC in a three key mode by OR'ing the value \textbf{LTC\_XCBC\_PURE} against the \textit{keylen} parameter. In this mode, the key is 3134interpretted as three keys. If the cipher has a block size of $n$ octets, the first key is then $keylen - 2n$ octets and is the encryption key. The next 3135$2n$ octets are the $K_1$ and $K_2$ padding keys (used on the last block). For example, to use AES--192 \textit{keylen} should be $24 + 2 \cdot 16 = 56$ octets. 3136The three keys are interpretted as if they were concatenated in the \textit{key} buffer. 3137 3138 3139To process data through XCBC--MAC use the following function: 3140 3141\index{xcbc\_process()} 3142\begin{verbatim} 3143int xcbc_process( xcbc_state *state, 3144 const unsigned char *in, 3145 unsigned long inlen); 3146\end{verbatim} 3147 3148This will add the message octets pointed to by \textit{in} of length \textit{inlen} to the XCBC--MAC state pointed to by \textit{state}. Like the other MAC functions, 3149the granularity of the input is not important but the order is. This will return \textbf{CRYPT\_OK} on success. 3150 3151To compute the MAC tag value use the following function: 3152 3153\index{xcbc\_done()} 3154\begin{verbatim} 3155int xcbc_done( xcbc_state *state, 3156 unsigned char *out, 3157 unsigned long *outlen); 3158\end{verbatim} 3159 3160This will retrieve the XCBC--MAC tag from the state pointed to by \textit{state}, and store it in the array pointed to by \textit{out}. The \textit{outlen} parameter 3161specifies the maximum size of the destination buffer, and is updated to hold the final size of the tag when the function returns. This will return \textbf{CRYPT\_OK} on success. 3162 3163Helper functions are provided to make parsing memory buffers and files easier. The following functions are provided: 3164 3165\index{xcbc\_memory()} 3166\begin{verbatim} 3167int xcbc_memory( 3168 int cipher, 3169 const unsigned char *key, unsigned long keylen, 3170 const unsigned char *in, unsigned long inlen, 3171 unsigned char *out, unsigned long *outlen); 3172\end{verbatim} 3173This will compute the XCBC--MAC of \textit{msglen} bytes of \textit{msg}, using the key \textit{key} of length \textit{keylen} bytes, and the cipher 3174specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with the same rules as xcbc\_done(). 3175 3176To xcbc a file use 3177\index{xcbc\_file()} 3178\begin{verbatim} 3179int xcbc_file( 3180 int cipher, 3181 const unsigned char *key, unsigned long keylen, 3182 const char *filename, 3183 unsigned char *out, unsigned long *outlen); 3184\end{verbatim} 3185 3186Which will XCBC--MAC the entire contents of the file specified by \textit{filename} using the key \textit{key} of length \textit{keylen} bytes, and the cipher 3187specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with the same rules as xcbc\_done(). 3188 3189 3190To test XCBC--MAC for RFC 3566 compliance use the following function: 3191 3192\index{xcbc\_test()} 3193\begin{verbatim} 3194int xcbc_test(void); 3195\end{verbatim} 3196 3197This will return \textbf{CRYPT\_OK} on success. This requires the AES or Rijndael descriptor be previously registered, otherwise, it will return 3198\textbf{CRYPT\_NOP}. 3199 3200\mysection{F9--MAC} 3201The F9--MAC is yet another CBC--MAC variant proposed for the 3GPP standard. Originally specified to be used with the KASUMI block cipher, it can also be used 3202with other ciphers. For LibTomCrypt, the F9--MAC code can use any cipher. 3203 3204\subsection{Usage Notice} 3205F9--MAC differs slightly from the other MAC functions in that it requires the caller to perform the final message padding. The padding quite simply is a direction 3206bit followed by a 1 bit and enough zeros to make the message a multiple of the cipher block size. If the message is byte aligned, the padding takes on the form of 3207a single 0x40 or 0xC0 byte followed by enough 0x00 bytes to make the message proper multiple. 3208 3209If the user simply wants a MAC function (hint: use OMAC) padding with a single 0x40 byte should be sufficient for security purposes and still be reasonably compatible 3210with F9--MAC. 3211 3212\subsection{F9--MAC Functions} 3213A F9--MAC state is initialized with the following function: 3214\index{f9\_init()} 3215\begin{verbatim} 3216int f9_init( f9_state *f9, 3217 int cipher, 3218 const unsigned char *key, 3219 unsigned long keylen); 3220\end{verbatim} 3221 3222This will initialize the F9--MAC state \textit{f9}, with the key specified in \textit{key} of length \textit{keylen} octets. The cipher indicated 3223by the \textit{cipher} index can be either a 64 or 128--bit block cipher. This will return \textbf{CRYPT\_OK} on success. 3224 3225To process data through F9--MAC use the following function: 3226\index{f9\_process()} 3227\begin{verbatim} 3228int f9_process( f9_state *state, 3229 const unsigned char *in, 3230 unsigned long inlen); 3231\end{verbatim} 3232 3233This will add the message octets pointed to by \textit{in} of length \textit{inlen} to the F9--MAC state pointed to by \textit{state}. Like the other MAC functions, 3234the granularity of the input is not important but the order is. This will return \textbf{CRYPT\_OK} on success. 3235 3236To compute the MAC tag value use the following function: 3237 3238\index{f9\_done()} 3239\begin{verbatim} 3240int f9_done( f9_state *state, 3241 unsigned char *out, 3242 unsigned long *outlen); 3243\end{verbatim} 3244 3245This will retrieve the F9--MAC tag from the state pointed to by \textit{state}, and store it in the array pointed to by \textit{out}. The \textit{outlen} parameter 3246specifies the maximum size of the destination buffer, and is updated to hold the final size of the tag when the function returns. This will return 3247\textbf{CRYPT\_OK} on success. 3248 3249Helper functions are provided to make parsing memory buffers and files easier. The following functions are provided: 3250 3251\index{f9\_memory()} 3252\begin{verbatim} 3253int f9_memory( 3254 int cipher, 3255 const unsigned char *key, unsigned long keylen, 3256 const unsigned char *in, unsigned long inlen, 3257 unsigned char *out, unsigned long *outlen); 3258\end{verbatim} 3259This will compute the F9--MAC of \textit{msglen} bytes of \textit{msg}, using the key \textit{key} of length \textit{keylen} bytes, and the cipher 3260specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with the same rules as f9\_done(). 3261 3262To F9--MAC a file use 3263\index{f9\_file()} 3264\begin{verbatim} 3265int f9_file( 3266 int cipher, 3267 const unsigned char *key, unsigned long keylen, 3268 const char *filename, 3269 unsigned char *out, unsigned long *outlen); 3270\end{verbatim} 3271 3272Which will F9--MAC the entire contents of the file specified by \textit{filename} using the key \textit{key} of length \textit{keylen} bytes, and the cipher 3273specified by the \textit{cipher}'th entry in the cipher\_descriptor table. It will store the MAC in \textit{out} with the same rules as f9\_done(). 3274 3275 3276To test f9--MAC for RFC 3566 compliance use the following function: 3277 3278\index{f9\_test()} 3279\begin{verbatim} 3280int f9_test(void); 3281\end{verbatim} 3282 3283This will return \textbf{CRYPT\_OK} on success. This requires the AES or Rijndael descriptor be previously registered, otherwise, it will return 3284\textbf{CRYPT\_NOP}. 3285 3286\mysection{Poly1305--MAC} 3287 3288The Poly1305--MAC is a cryptographic message authentication code created by Daniel J. Bernstein. 3289More info at \url{https://en.wikipedia.org/wiki/Poly1305}. 3290 3291A Poly1305--MAC state is initialized with the following function: 3292\index{poly1305\_init()} 3293\begin{verbatim} 3294int poly1305_init( poly1305_state *st, 3295 const unsigned char *key, 3296 unsigned long keylen); 3297\end{verbatim} 3298This will initialize the Poly1305--MAC state \textit{st}, with the key specified in \textit{key} of length \textit{keylen} octets (always 32). 3299 3300To process data through Poly1305--MAC use the following function: 3301\index{poly1305\_process()} 3302\begin{verbatim} 3303int poly1305_process( poly1305_state *st, 3304 const unsigned char *in, 3305 unsigned long inlen); 3306\end{verbatim} 3307 3308This will add the message octets pointed to by \textit{in} of length \textit{inlen} to the Poly1305--MAC state pointed to by \textit{st}. 3309 3310To compute the MAC tag value use the following function: 3311\index{poly1305\_done()} 3312\begin{verbatim} 3313int poly1305_done(poly1305_state *st, 3314 unsigned char *mac, 3315 unsigned long *maclen); 3316\end{verbatim} 3317 3318This will retrieve the Poly1305--MAC tag from the state pointed to by \textit{st}, and store it in the array pointed to by \textit{mac}. 3319The \textit{maclen} parameter specifies the maximum size of the destination buffer, and is updated to hold the final size of the tag when 3320the function returns. 3321 3322Helper functions are provided to make parsing memory buffers and files easier. The following functions are provided: 3323\index{poly1305\_memory()} 3324\begin{verbatim} 3325int poly1305_memory(const unsigned char *key, 3326 unsigned long keylen, 3327 const unsigned char *in, 3328 unsigned long inlen, 3329 unsigned char *mac, 3330 unsigned long *maclen); 3331\end{verbatim} 3332This will compute the Poly1305--MAC of \textit{inlen} bytes of \textit{in}, using the key \textit{key} of length \textit{keylen} bytes. 3333It will store the MAC in \textit{mac} with the same rules as poly1305\_done(). 3334 3335To Poly1305--MAC a file use 3336\index{poly1305\_file()} 3337\begin{verbatim} 3338int poly1305_file( const char *fname, 3339 const unsigned char *key, 3340 unsigned long keylen, 3341 unsigned char *mac, 3342 unsigned long *maclen); 3343\end{verbatim} 3344 3345Which will Poly1305--MAC the entire contents of the file specified by \textit{fname} using the key \textit{key} of 3346length \textit{keylen} bytes. It will store the MAC in \textit{mac} with the same rules as poly1305\_done(). 3347 3348\mysection{BLAKE2s + BLAKE2b MAC} 3349 3350The BLAKE2s and BLAKE2b are cryptographic message authentication code designed by Jean--Philippe Aumasson, 3351Samuel Neves, Zooko Wilcox-O'Hearn, and Christian Winnerlein. More info at \url{https://tools.ietf.org/html/rfc7693}. 3352 3353A BLAKE2s/b--MAC state is initialized with the following function: 3354\index{blake2smac\_init()} 3355\begin{verbatim} 3356int blake2smac_init(blake2smac_state *st, 3357 unsigned long outlen, 3358 const unsigned char *key, 3359 unsigned long keylen); 3360\end{verbatim} 3361\index{blake2bmac\_init()} 3362\begin{verbatim} 3363int blake2bmac_init(blake2smac_state *st, 3364 unsigned long outlen, 3365 const unsigned char *key, 3366 unsigned long keylen); 3367\end{verbatim} 3368This will initialize the BLAKE2s/b--MAC state \textit{st}, with the key specified in \textit{key} of length \textit{keylen} octets (up to 64). 3369The \textit{outlen} specifies the size of the final tag (up to 64 octets). 3370 3371To process data through BLAKE2s/b--MAC use the following function: 3372\index{blake2smac\_process()} 3373\begin{verbatim} 3374int blake2smac_process( blake2smac_state *st, 3375 const unsigned char *in, 3376 unsigned long inlen); 3377\end{verbatim} 3378\index{blake2bmac\_process()} 3379\begin{verbatim} 3380int blake2bmac_process( blake2bmac_state *st, 3381 const unsigned char *in, 3382 unsigned long inlen); 3383\end{verbatim} 3384 3385This will add the message octets pointed to by \textit{in} of length \textit{inlen} to the BLAKE2s/b--MAC state pointed to by \textit{st}. 3386 3387To compute the MAC tag value use the following function: 3388\index{blake2smac\_done()} 3389\begin{verbatim} 3390int blake2smac_done(blake2smac_state *st, 3391 unsigned char *mac, 3392 unsigned long *maclen); 3393\end{verbatim} 3394\index{blake2bmac\_done()} 3395\begin{verbatim} 3396int blake2bmac_done(blake2bmac_state *st, 3397 unsigned char *mac, 3398 unsigned long *maclen); 3399\end{verbatim} 3400 3401This will retrieve the BLAKE2s/b--MAC tag from the state pointed to by \textit{st}, and store it in the array pointed to by \textit{mac}. 3402The \textit{maclen} parameter specifies the maximum size of the destination buffer, and is updated to hold the final size of the tag when 3403the function returns. 3404 3405Helper functions are provided to make parsing memory buffers and files easier. The following functions are provided: 3406\index{blake2smac\_memory()} 3407\begin{verbatim} 3408int blake2smac_memory(const unsigned char *key, 3409 unsigned long keylen, 3410 const unsigned char *in, 3411 unsigned long inlen, 3412 unsigned char *mac, 3413 unsigned long *maclen); 3414\end{verbatim} 3415\index{blake2bmac\_memory()} 3416\begin{verbatim} 3417int blake2bmac_memory(const unsigned char *key, 3418 unsigned long keylen, 3419 const unsigned char *in, 3420 unsigned long inlen, 3421 unsigned char *mac, 3422 unsigned long *maclen); 3423\end{verbatim} 3424This will compute the BLAKE2s/b--MAC of \textit{inlen} bytes of \textit{in}, using the key \textit{key} of length \textit{keylen} bytes. 3425It will store the MAC in \textit{mac} with the same rules as blake2smac\_done(). 3426 3427To BLAKE2s/b--MAC a file use 3428\index{blake2smac\_file()} 3429\begin{verbatim} 3430int blake2smac_file( const char *fname, 3431 const unsigned char *key, 3432 unsigned long keylen, 3433 unsigned char *mac, 3434 unsigned long *maclen); 3435\end{verbatim} 3436\index{blake2bmac\_file()} 3437\begin{verbatim} 3438int blake2bmac_file( const char *fname, 3439 const unsigned char *key, 3440 unsigned long keylen, 3441 unsigned char *mac, 3442 unsigned long *maclen); 3443\end{verbatim} 3444 3445Which will BLAKE2s/b--MAC the entire contents of the file specified by \textit{fname} using the key \textit{key} of 3446length \textit{keylen} bytes. It will store the MAC in \textit{mac} with the same rules as blake2smac\_done(). 3447 3448\chapter{Pseudo-Random Number Generators} 3449\mysection{Core Functions} 3450The library provides an array of core functions for Pseudo-Random Number Generators (PRNGs) as well. A cryptographic PRNG is 3451used to expand a shorter bit string into a longer bit string. PRNGs are used wherever random data is required such as Public Key (PK) 3452key generation. There is a universal structure called \textit{prng\_state}. To initialize a PRNG call: 3453\index{PRNG start} 3454\begin{verbatim} 3455int XXX_start(prng_state *prng); 3456\end{verbatim} 3457 3458This will setup the PRNG for future use and not seed it. In order for the PRNG to be cryptographically useful you must give it 3459entropy. Ideally you'd have some OS level source to tap like in UNIX. To add entropy to the PRNG call: 3460\index{PRNG add\_entropy} 3461\begin{verbatim} 3462int XXX_add_entropy(const unsigned char *in, 3463 unsigned long inlen, 3464 prng_state *prng); 3465\end{verbatim} 3466Which returns {\bf CRYPT\_OK} if the entropy was accepted. Once you think you have enough entropy you call another 3467function to put the entropy into action. 3468\index{PRNG ready} 3469\begin{verbatim} 3470int XXX_ready(prng_state *prng); 3471\end{verbatim} 3472 3473Which returns {\bf CRYPT\_OK} if it is ready. Finally to actually read bytes call: 3474\index{PRNG read} 3475\begin{verbatim} 3476unsigned long XXX_read(unsigned char *out, 3477 unsigned long outlen, 3478 prng_state *prng); 3479\end{verbatim} 3480 3481Which returns the number of bytes read from the PRNG. When you are finished with a PRNG state you call 3482the following. 3483 3484\index{PRNG done} 3485\begin{verbatim} 3486void XXX_done(prng_state *prng); 3487\end{verbatim} 3488 3489This will terminate a PRNG state and free any memory (if any) allocated. To export a PRNG state 3490so that you can later resume the PRNG call the following. 3491 3492\index{PRNG export} 3493\begin{verbatim} 3494int XXX_export(unsigned char *out, 3495 unsigned long *outlen, 3496 prng_state *prng); 3497\end{verbatim} 3498 3499This will write a \textit{PRNG state} to the buffer \textit{out} of length \textit{outlen} bytes. The idea of 3500the export is meant to be used as a \textit{seed file}. That is, when the program starts up there will not likely 3501be that much entropy available. To import a state to seed a PRNG call the following function. 3502 3503\index{PRNG import} 3504\begin{verbatim} 3505int XXX_import(const unsigned char *in, 3506 unsigned long inlen, 3507 prng_state *prng); 3508\end{verbatim} 3509 3510This will call the start and add\_entropy functions of the given PRNG. It will use the state in 3511\textit{in} of length \textit{inlen} as the initial seed. You must pass the same seed length as was exported 3512by the corresponding export function. 3513 3514Note that importing a state will not \textit{resume} the PRNG from where it left off. That is, if you export 3515a state, emit (say) 8 bytes and then import the previously exported state the next 8 bytes will not 3516specifically equal the 8 bytes you generated previously. 3517 3518When a program is first executed the normal course of operation is: 3519 3520\begin{enumerate} 3521 \item Gather entropy from your sources for a given period of time or number of events. 3522 \item Start, use your entropy via add\_entropy and ready the PRNG yourself. 3523\end{enumerate} 3524 3525When your program is finished you simply call the export function and save the state to a medium (disk, 3526flash memory, etc). The next time your application starts up you can detect the state, feed it to the 3527import function and go on your way. It is ideal that (as soon as possible) after start up you export a 3528fresh state. This helps in the case that the program aborts or the machine is powered down without 3529being given a chance to exit properly. 3530 3531Note that even if you have a state to import it is important to add new entropy to the state. However, 3532there is less pressure to do so. 3533 3534To test a PRNG for operational conformity call the following functions. 3535 3536\index{PRNG test} 3537\begin{verbatim} 3538int XXX_test(void); 3539\end{verbatim} 3540 3541This will return \textbf{CRYPT\_OK} if PRNG is operating properly. 3542 3543\subsection{Remarks} 3544 3545It is possible to be adding entropy and reading from a PRNG at the same time. For example, if you first seed the PRNG 3546and call ready() you can now read from it. You can also keep adding new entropy to it. The new entropy will not be used 3547in the PRNG until ready() is called again. This allows the PRNG to be used and re-seeded at the same time. No real error 3548checking is guaranteed to see if the entropy is sufficient, or if the PRNG is even in a ready state before reading. 3549 3550\subsection{Example} 3551Below is a simple snippet to read 10 bytes from Yarrow. It is important to note that this snippet is {\bf NOT} secure since 3552the entropy added is not random. 3553 3554\begin{verbatim} 3555#include <tomcrypt.h> 3556int main(void) 3557{ 3558 prng_state prng; 3559 unsigned char buf[10]; 3560 int err; 3561 3562 /* start it */ 3563 if ((err = yarrow_start(&prng)) != CRYPT_OK) { 3564 printf("Start error: %s\n", error_to_string(err)); 3565 } 3566 /* add entropy */ 3567 if ((err = yarrow_add_entropy("hello world", 11, &prng)) 3568 != CRYPT_OK) { 3569 printf("Add_entropy error: %s\n", error_to_string(err)); 3570 } 3571 /* ready and read */ 3572 if ((err = yarrow_ready(&prng)) != CRYPT_OK) { 3573 printf("Ready error: %s\n", error_to_string(err)); 3574 } 3575 printf("Read %lu bytes from yarrow\n", 3576 yarrow_read(buf, sizeof(buf), &prng)); 3577 return 0; 3578} 3579\end{verbatim} 3580 3581\mysection{PRNG Descriptors} 3582\index{PRNG Descriptor} 3583PRNGs have descriptors that allow plugin driven functions to be created using PRNGs. The plugin descriptors are stored in the structure \textit{prng\_descriptor}. The 3584format of an element is: 3585\begin{verbatim} 3586struct _prng_descriptor { 3587 char *name; 3588 int export_size; /* size in bytes of exported state */ 3589 3590 int (*start) (prng_state *); 3591 3592 int (*add_entropy)(const unsigned char *, unsigned long, 3593 prng_state *); 3594 3595 int (*ready) (prng_state *); 3596 3597 unsigned long (*read)(unsigned char *, unsigned long len, 3598 prng_state *); 3599 3600 void (*done)(prng_state *); 3601 3602 int (*pexport)(unsigned char *, unsigned long *, prng_state *); 3603 3604 int (*pimport)(const unsigned char *, unsigned long, prng_state *); 3605 3606 int (*test)(void); 3607}; 3608\end{verbatim} 3609 3610To find a PRNG in the descriptor table the following function can be used: 3611\index{find\_prng()} 3612\begin{verbatim} 3613int find_prng(const char *name); 3614\end{verbatim} 3615This will search the PRNG descriptor table for the PRNG named \textit{name}. It will return -1 if the PRNG is not found, otherwise, it returns 3616the index into the descriptor table. 3617 3618Just like the ciphers and hashes, you must register your prng before you can use it. The two functions provided work exactly as those for the cipher registry functions. 3619They are the following: 3620\index{register\_prng()} \index{unregister\_prng()} 3621\begin{verbatim} 3622int register_prng(const struct _prng_descriptor *prng); 3623int unregister_prng(const struct _prng_descriptor *prng); 3624\end{verbatim} 3625 3626The register function will register the PRNG, and return the index into the table where it was placed (or -1 for error). It will avoid registering the same 3627descriptor twice, and will return the index of the current placement in the table if the caller attempts to register it more than once. The unregister function 3628will return \textbf{CRYPT\_OK} if the PRNG was found and removed. Otherwise, it returns \textbf{CRYPT\_ERROR}. 3629 3630\subsection{PRNGs Provided} 3631\begin{figure}[H] 3632\begin{center} 3633\begin{small} 3634\begin{tabular}{|c|c|l|} 3635\hline \textbf{Name} & \textbf{Descriptor} & \textbf{Usage} \\ 3636\hline ChaCha20 & chacha20\_prng\_desc & Stream Cipher PRNG (recommended, fast) \\ 3637\hline Fortuna & fortuna\_desc & Fast long-term PRNG (recommended, secure) \\ 3638\hline RC4 & rc4\_desc & Stream Cipher PRNG \\ 3639\hline SOBER-128 & sober128\_desc & Stream Cipher PRNG \\ 3640\hline sprng & sprng\_desc & Secure PRNG using the System RNG \\ 3641\hline Yarrow & yarrow\_desc & Fast short-term PRNG \\ 3642\hline 3643\end{tabular} 3644\end{small} 3645\end{center} 3646\caption{List of Provided PRNGs} 3647\end{figure} 3648 3649\subsubsection{Yarrow} 3650Yarrow is fast PRNG meant to collect an unspecified amount of entropy from sources 3651(keyboard, mouse, interrupts, etc), and produce an unbounded string of random bytes. 3652 3653\textit{Note:} This PRNG is still secure for most tasks but is no longer recommended. Users 3654should use Fortuna or ChaCha20 instead. 3655 3656\subsubsection{Fortuna} 3657 3658Fortuna is a fast attack tolerant and more thoroughly designed PRNG suitable for long term 3659usage. It is faster than the default implementation of Yarrow\footnote{Yarrow has been implemented 3660to work with most cipher and hash combos based on which you have chosen to build into the library.} while 3661providing more security. 3662 3663Fortuna is slightly less flexible than Yarrow in the sense that it only works with the AES block cipher 3664and SHA--256 hash function. Technically, Fortuna will work with any block cipher that accepts a 256--bit 3665key, and any hash that produces at least a 256--bit output. However, to make the implementation simpler 3666it has been fixed to those choices. 3667 3668Fortuna is more secure than Yarrow in the sense that attackers who learn parts of the entropy being 3669added to the PRNG learn far less about the state than that of Yarrow. Without getting into too many 3670details Fortuna has the ability to recover from state determination attacks where the attacker starts 3671to learn information from the PRNGs output about the internal state. Yarrow on the other hand, cannot 3672recover from that problem until new entropy is added to the pool and put to use through the ready() function. 3673 3674For detailed information on how the algorithm works and what you have to do to maintain the secure state 3675get a copy of the book\footnote{Niels Ferguson and Bruce Schneier, Practical Cryptography. ISBN 0-471-22357-3.} or 3676read the paper online\footnote{\url{https://www.schneier.com/academic/paperfiles/fortuna.pdf} [Accessed on 7th Dec. 2017]}. 3677 3678\subsubsection{RC4} 3679 3680RC4 is an old stream cipher that can also double duty as a PRNG in a pinch. You key RC4 by 3681calling add\_entropy(), and setup the key by calling ready(). 3682 3683You really should not use RC4 for cryptographical purposes, it's broken. 3684 3685\subsubsection{SOBER-128} 3686 3687SOBER--128 is a stream cipher designed by the QUALCOMM Australia team. Like RC4, you key it by 3688calling add\_entropy(). There is no need to call ready() for this PRNG as it does not do anything. 3689 3690Note: this cipher has several oddities about how it operates. The first call to add\_entropy() sets the cipher's key. 3691Every other time call to the add\_entropy() function sets the cipher's IV variable. The IV mechanism allows you to 3692encrypt several messages with the same key, and not re--use the same key material. 3693 3694Unlike Yarrow and Fortuna, all of the entropy (and hence security) of this algorithm rests in the data 3695you pass it on the \textbf{first} call to add\_entropy(). All buffers sent to add\_entropy() must have a length 3696that is a multiple of four bytes. 3697 3698Like RC4, the output of SOBER--128 is XOR'ed against the buffer you provide it. In this manner, you can use 3699sober128\_read() as an encrypt (and decrypt) function. 3700 3701Since SOBER--128 has a fixed keying scheme, and is very fast (faster than RC4) the ideal usage of SOBER-128 is to 3702key it from the output of Fortuna (or Yarrow), and use it to encrypt messages. It is also ideal for 3703simulations which need a high quality (and fast) stream of bytes. 3704 3705\subsubsection{ChaCha20} 3706 3707ChaCha20 is a fast stream cipher built on a pseudorandom function designed by Daniel J. Bernstein. 3708It can also double duty as a PRNG. 3709 3710It is recommended to use 40 bytes of truly random bytes for initialization. 3711 3712The implementation supports adding entropy via the add\_entropy() function while already being operational. 3713 3714\subsubsection{Example Usage} 3715\begin{small} 3716\begin{verbatim} 3717#include <tomcrypt.h> 3718int main(void) 3719{ 3720 prng_state prng; 3721 unsigned char buf[32]; 3722 int err; 3723 3724 if ((err = rc4_start(&prng)) != CRYPT_OK) { 3725 printf("RC4 init error: %s\n", error_to_string(err)); 3726 exit(-1); 3727 } 3728 3729 /* use "key" as the key */ 3730 if ((err = rc4_add_entropy("key", 3, &prng)) != CRYPT_OK) { 3731 printf("RC4 add entropy error: %s\n", error_to_string(err)); 3732 exit(-1); 3733 } 3734 3735 /* setup RC4 for use */ 3736 if ((err = rc4_ready(&prng)) != CRYPT_OK) { 3737 printf("RC4 ready error: %s\n", error_to_string(err)); 3738 exit(-1); 3739 } 3740 3741 /* encrypt buffer */ 3742 strcpy(buf,"hello world"); 3743 if (rc4_read(buf, 11, &prng) != 11) { 3744 printf("RC4 read error\n"); 3745 exit(-1); 3746 } 3747 return 0; 3748} 3749\end{verbatim} 3750\end{small} 3751To decrypt you have to do the exact same steps. 3752 3753\mysection{The Secure RNG} 3754\index{Secure RNG} 3755An RNG is related to a PRNG in many ways, except that it does not expand a smaller seed to get the data. They generate their random bits 3756by performing some computation on fresh input bits. Possibly the hardest thing to get correctly in a cryptosystem is the 3757PRNG. Computers are deterministic that try hard not to stray from pre--determined paths. This makes gathering entropy needed to seed a PRNG 3758a hard task. 3759 3760There is one small function that may help on certain platforms: 3761\index{rng\_get\_bytes()} 3762\begin{verbatim} 3763unsigned long rng_get_bytes( 3764 unsigned char *buf, 3765 unsigned long len, 3766 void (*callback)(void)); 3767\end{verbatim} 3768 3769Which will try one of three methods of getting random data. The first is to open the popular \textit{/dev/random} device which 3770on most *NIX platforms provides cryptographic random bits\footnote{This device is available in Windows through the Cygwin compiler suite. It emulates \textit{/dev/random} via the Microsoft CSP.}. 3771The second method is to try the Microsoft Cryptographic Service Provider, and read the RNG. The third method is an ANSI C 3772clock drift method that is also somewhat popular but gives bits of lower entropy. The \textit{callback} parameter is a pointer to a function that returns void. It is 3773used when the slower ANSI C RNG must be used so the calling application can still work. This is useful since the ANSI C RNG has a throughput of roughly three 3774bytes a second. The callback pointer may be set to {\bf NULL} to avoid using it if you do not want to. The function returns the number of bytes actually read from 3775any RNG source. There is a function to help setup a PRNG as well: 3776\index{rng\_make\_prng()} 3777\begin{verbatim} 3778int rng_make_prng( int bits, 3779 int wprng, 3780 prng_state *prng, 3781 void (*callback)(void)); 3782\end{verbatim} 3783This will try to initialize the prng with a state of at least \textit{bits} of entropy. The \textit{callback} parameter works much like 3784the callback in \textit{rng\_get\_bytes()}. It is highly recommended that you use this function to setup your PRNGs unless you have a 3785platform where the RNG does not work well. Example usage of this function is given below: 3786 3787\begin{small} 3788\begin{verbatim} 3789#include <tomcrypt.h> 3790int main(void) 3791{ 3792 ecc_key mykey; 3793 prng_state prng; 3794 int err; 3795 3796 /* register yarrow */ 3797 if (register_prng(&yarrow_desc) == -1) { 3798 printf("Error registering Yarrow\n"); 3799 return -1; 3800 } 3801 3802 /* setup the PRNG */ 3803 if ((err = rng_make_prng(128, find_prng("yarrow"), &prng, NULL)) 3804 != CRYPT_OK) { 3805 printf("Error setting up PRNG, %s\n", error_to_string(err)); 3806 return -1; 3807 } 3808 3809 /* make a 192-bit ECC key */ 3810 if ((err = ecc_make_key(&prng, find_prng("yarrow"), 24, &mykey)) 3811 != CRYPT_OK) { 3812 printf("Error making key: %s\n", error_to_string(err)); 3813 return -1; 3814 } 3815 return 0; 3816} 3817\end{verbatim} 3818\end{small} 3819 3820\subsection{The Secure PRNG Interface} 3821\index{sprng\_desc} 3822It is possible to access the secure RNG through the PRNG interface, and in turn use it within dependent functions such 3823as the PK API. This simplifies the cryptosystem on platforms where the secure RNG is fast. The secure PRNG never 3824requires to be started, that is you need not call the start, add\_entropy, or ready functions. For example, consider 3825the previous example using this PRNG. 3826 3827\begin{small} 3828\begin{verbatim} 3829#include <tomcrypt.h> 3830int main(void) 3831{ 3832 ecc_key mykey; 3833 int err; 3834 3835 /* register SPRNG */ 3836 if (register_prng(&sprng_desc) == -1) { 3837 printf("Error registering SPRNG\n"); 3838 return -1; 3839 } 3840 3841 /* make a 192-bit ECC key */ 3842 if ((err = ecc_make_key(NULL, find_prng("sprng"), 24, &mykey)) 3843 != CRYPT_OK) { 3844 printf("Error making key: %s\n", error_to_string(err)); 3845 return -1; 3846 } 3847 return 0; 3848} 3849\end{verbatim} 3850\end{small} 3851 3852\chapter{RSA Public Key Cryptography} 3853 3854\mysection{Introduction} 3855RSA wrote the PKCS \#1 specifications which detail RSA Public Key Cryptography. In the specifications are 3856padding algorithms for encryption and signatures. The standard includes the \textit{v1.5} and \textit{v2.1} algorithms. 3857To simplify matters a little the v2.1 encryption and signature padding algorithms are called OAEP and PSS respectively. 3858 3859\mysection{PKCS \#1 Padding} 3860PKCS \#1 v1.5 padding is so simple that both signature and encryption padding are performed by the same function. Note: the 3861signature padding does \textbf{not} include the ASN.1 padding required. That is performed by the rsa\_sign\_hash\_ex() function 3862documented later on in this chapter. 3863 3864\subsection{PKCS \#1 v1.5 Encoding} 3865The following function performs PKCS \#1 v1.5 padding: 3866\index{pkcs\_1\_v1\_5\_encode()} 3867\begin{verbatim} 3868int pkcs_1_v1_5_encode( 3869 const unsigned char *msg, 3870 unsigned long msglen, 3871 int block_type, 3872 unsigned long modulus_bitlen, 3873 prng_state *prng, 3874 int prng_idx, 3875 unsigned char *out, 3876 unsigned long *outlen); 3877\end{verbatim} 3878 3879This will encode the message pointed to by \textit{msg} of length \textit{msglen} octets. The \textit{block\_type} parameter must be set to 3880\textbf{LTC\_PKCS\_1\_EME} to perform encryption padding. It must be set to \textbf{LTC\_PKCS\_1\_EMSA} to perform signature padding. The \textit{modulus\_bitlen} 3881parameter indicates the length of the modulus in bits. The padded data is stored in \textit{out} with a length of \textit{outlen} octets. The output will not be 3882longer than the modulus which helps allocate the correct output buffer size. 3883 3884Only encryption padding requires a PRNG. When performing signature padding the \textit{prng\_idx} parameter may be left to zero as it is not checked for validity. 3885 3886\subsection{PKCS \#1 v1.5 Decoding} 3887The following function performs PKCS \#1 v1.5 de--padding: 3888\index{pkcs\_1\_v1\_5\_decode()} 3889\begin{verbatim} 3890int pkcs_1_v1_5_decode( 3891 const unsigned char *msg, 3892 unsigned long msglen, 3893 int block_type, 3894 unsigned long modulus_bitlen, 3895 unsigned char *out, 3896 unsigned long *outlen, 3897 int *is_valid); 3898\end{verbatim} 3899\index{LTC\_PKCS\_1\_EME} \index{LTC\_PKCS\_1\_EMSA} 3900This will remove the PKCS padding data pointed to by \textit{msg} of length \textit{msglen}. The decoded data is stored in \textit{out} of length 3901\textit{outlen}. If the padding is valid, a 1 is stored in \textit{is\_valid}, otherwise, a 0 is stored. The \textit{block\_type} parameter must be set to either 3902\textbf{LTC\_PKCS\_1\_EME} or \textbf{LTC\_PKCS\_1\_EMSA} depending on whether encryption or signature padding is being removed. 3903 3904\mysection{PKCS \#1 v2.1 Encryption} 3905PKCS \#1 RSA Encryption amounts to OAEP padding of the input message followed by the modular exponentiation. As far as this portion of 3906the library is concerned we are only dealing with th OAEP padding of the message. 3907 3908\subsection{OAEP Encoding} 3909 3910The following function performs PKCS \#1 v2.1 encryption padding: 3911 3912\index{pkcs\_1\_oaep\_encode()} 3913\begin{alltt} 3914int pkcs_1_oaep_encode( 3915 const unsigned char *msg, 3916 unsigned long msglen, 3917 const unsigned char *lparam, 3918 unsigned long lparamlen, 3919 unsigned long modulus_bitlen, 3920 prng_state *prng, 3921 int prng_idx, 3922 int hash_idx, 3923 unsigned char *out, 3924 unsigned long *outlen); 3925\end{alltt} 3926 3927This accepts \textit{msg} as input of length \textit{msglen} which will be OAEP padded. The \textit{lparam} variable is an additional system specific 3928tag that can be applied to the encoding. This is useful to identify which system encoded the message. If no variance is desired then 3929\textit{lparam} can be set to \textbf{NULL}. 3930 3931OAEP encoding requires the length of the modulus in bits in order to calculate the size of the output. This is passed as the parameter 3932\textit{modulus\_bitlen}. \textit{hash\_idx} is the index into the hash descriptor table of the hash desired. PKCS \#1 allows any hash to be 3933used but both the encoder and decoder must use the same hash in order for this to succeed. The size of hash output affects the maximum 3934 sized input message. \textit{prng\_idx} and \textit{prng} are the random number generator arguments required to randomize the padding process. 3935The padded message is stored in \textit{out} along with the length in \textit{outlen}. 3936 3937If $h$ is the length of the hash and $m$ the length of the modulus (both in octets) then the maximum payload for \textit{msg} is 3938$m - 2h - 2$. For example, with a $1024$--bit RSA key and SHA--1 as the hash the maximum payload is $86$ bytes. 3939 3940Note that when the message is padded it still has not been RSA encrypted. You must pass the output of this function to 3941rsa\_exptmod() to encrypt it. 3942 3943\subsection{OAEP Decoding} 3944 3945\index{pkcs\_1\_oaep\_decode()} 3946\begin{alltt} 3947int pkcs_1_oaep_decode( 3948 const unsigned char *msg, 3949 unsigned long msglen, 3950 const unsigned char *lparam, 3951 unsigned long lparamlen, 3952 unsigned long modulus_bitlen, 3953 int hash_idx, 3954 unsigned char *out, 3955 unsigned long *outlen, 3956 int *res); 3957\end{alltt} 3958 3959This function decodes an OAEP encoded message and outputs the original message that was passed to the OAEP encoder. \textit{msg} is the 3960output of pkcs\_1\_oaep\_encode() of length \textit{msglen}. \textit{lparam} is the same system variable passed to the OAEP encoder. If it does not 3961match what was used during encoding this function will not decode the packet. \textit{modulus\_bitlen} is the size of the RSA modulus in bits 3962and must match what was used during encoding. Similarly the \textit{hash\_idx} index into the hash descriptor table must match what was used 3963during encoding. 3964 3965If the function succeeds it decodes the OAEP encoded message into \textit{out} of length \textit{outlen} and stores a 3966$1$ in \textit{res}. If the packet is invalid it stores $0$ in \textit{res} and if the function fails for another reason 3967it returns an error code. 3968 3969\mysection{PKCS \#1 Digital Signatures} 3970 3971\subsection{PSS Encoding} 3972PSS encoding is the second half of the PKCS \#1 standard which is padding to be applied to messages that are signed. 3973 3974\index{pkcs\_1\_pss\_encode()} 3975\begin{alltt} 3976int pkcs_1_pss_encode( 3977 const unsigned char *msghash, 3978 unsigned long msghashlen, 3979 unsigned long saltlen, 3980 prng_state *prng, 3981 int prng_idx, 3982 int hash_idx, 3983 unsigned long modulus_bitlen, 3984 unsigned char *out, 3985 unsigned long *outlen); 3986\end{alltt} 3987 3988This function assumes the message to be PSS encoded has previously been hashed. The input hash \textit{msghash} is of length 3989\textit{msghashlen}. PSS allows a variable length random salt (it can be zero length) to be introduced in the signature process. 3990\textit{hash\_idx} is the index into the hash descriptor table of the hash to use. \textit{prng\_idx} and \textit{prng} are the random 3991number generator information required for the salt. 3992 3993Similar to OAEP encoding \textit{modulus\_bitlen} is the size of the RSA modulus (in bits). It limits the size of the salt. If $m$ is the length 3994of the modulus $h$ the length of the hash output (in octets) then there can be $m - h - 2$ bytes of salt. 3995 3996This function does not actually sign the data it merely pads the hash of a message so that it can be processed by rsa\_exptmod(). 3997 3998\subsection{PSS Decoding} 3999 4000To decode a PSS encoded signature block you have to use the following. 4001 4002\index{pkcs\_1\_pss\_decode()} 4003\begin{alltt} 4004int pkcs_1_pss_decode( 4005 const unsigned char *msghash, 4006 unsigned long msghashlen, 4007 const unsigned char *sig, 4008 unsigned long siglen, 4009 unsigned long saltlen, 4010 int hash_idx, 4011 unsigned long modulus_bitlen, 4012 int *res); 4013\end{alltt} 4014This will decode the PSS encoded message in \textit{sig} of length \textit{siglen} and compare it to values in \textit{msghash} of length 4015\textit{msghashlen}. If the block is a valid PSS block and the decoded hash equals the hash supplied \textit{res} is set to non--zero. Otherwise, 4016it is set to zero. The rest of the parameters are as in the PSS encode call. 4017 4018It's important to use the same \textit{saltlen} and hash for both encoding and decoding as otherwise the procedure will not work. 4019 4020\mysection{RSA Key Operations} 4021\subsection{Background} 4022 4023RSA is a public key algorithm that is based on the inability to find the \textit{e-th} root modulo a composite of unknown 4024factorization. Normally the difficulty of breaking RSA is associated with the integer factoring problem but they are 4025not strictly equivalent. 4026 4027The system begins with with two primes $p$ and $q$ and their product $N = pq$. The order or \textit{Euler totient} of the 4028multiplicative sub-group formed modulo $N$ is given as $\phi(N) = (p - 1)(q - 1)$ which can be reduced to 4029$\mbox{lcm}(p - 1, q - 1)$. The public key consists of the composite $N$ and some integer $e$ such that 4030$\mbox{gcd}(e, \phi(N)) = 1$. The private key consists of the composite $N$ and the inverse of $e$ modulo $\phi(N)$ 4031often simply denoted as $de \equiv 1\mbox{ }(\mbox{mod }\phi(N))$. 4032 4033A person who wants to encrypt with your public key simply forms an integer (the plaintext) $M$ such that 4034$1 < M < N-2$ and computes the ciphertext $C = M^e\mbox{ }(\mbox{mod }N)$. Since finding the inverse exponent $d$ 4035given only $N$ and $e$ appears to be intractable only the owner of the private key can decrypt the ciphertext and compute 4036$C^d \equiv \left (M^e \right)^d \equiv M^1 \equiv M\mbox{ }(\mbox{mod }N)$. Similarly the owner of the private key 4037can sign a message by \textit{decrypting} it. Others can verify it by \textit{encrypting} it. 4038 4039Currently RSA is a difficult system to cryptanalyze provided that both primes are large and not close to each other. 4040Ideally $e$ should be larger than $100$ to prevent direct analysis. For example, if $e$ is three and you do not pad 4041the plaintext to be encrypted than it is possible that $M^3 < N$ in which case finding the cube-root would be trivial. 4042The most often suggested value for $e$ is $65537$ since it is large enough to make such attacks impossible and also well 4043designed for fast exponentiation (requires 16 squarings and one multiplication). 4044 4045It is important to pad the input to RSA since it has particular mathematical structure. For instance 4046$M_1^dM_2^d = (M_1M_2)^d$ which can be used to forge a signature. Suppose $M_3 = M_1M_2$ is a message you want 4047to have a forged signature for. Simply get the signatures for $M_1$ and $M_2$ on their own and multiply the result 4048together. Similar tricks can be used to deduce plaintexts from ciphertexts. It is important not only to sign 4049the hash of documents only but also to pad the inputs with data to remove such structure. 4050 4051\subsection{RSA Key Generation} 4052 4053For RSA routines a single \textit{rsa\_key} structure is used. To make a new RSA key call: 4054\index{rsa\_make\_key()} 4055\begin{verbatim} 4056int rsa_make_key(prng_state *prng, 4057 int wprng, 4058 int size, 4059 long e, 4060 rsa_key *key); 4061\end{verbatim} 4062 4063Where \textit{wprng} is the index into the PRNG descriptor array. The \textit{size} parameter is the size in bytes of the RSA modulus desired. 4064The \textit{e} parameter is the encryption exponent desired, typical values are 3, 17, 257 and 65537. Stick with 65537 since it is big enough to prevent 4065trivial math attacks, and not super slow. The \textit{key} parameter is where the constructed key is placed. All keys must be at 4066least 128 bytes, and no more than 512 bytes in size (\textit{that is from 1024 to 4096 bits}). 4067 4068\index{rsa\_free()} 4069Note: the \textit{rsa\_make\_key()} function allocates memory at run--time when you make the key. Make sure to call 4070\textit{rsa\_free()} (see below) when you are finished with the key. If \textit{rsa\_make\_key()} fails it will automatically 4071free the memory allocated. 4072 4073\index{PK\_PRIVATE} \index{PK\_PUBLIC} 4074There are two types of RSA keys. The types are {\bf PK\_PRIVATE} and {\bf PK\_PUBLIC}. The first type is a private 4075RSA key which includes the CRT parameters\footnote{As of v0.99 the PK\_PRIVATE\_OPTIMIZED type has been deprecated, and has been replaced by the 4076PK\_PRIVATE type.} in the form of a RSAPrivateKey (PKCS \#1 compliant). The second type, is a public RSA key which only includes the modulus and public exponent. 4077It takes the form of a RSAPublicKey (PKCS \#1 compliant). 4078 4079\subsection{RSA Exponentiation} 4080To do raw work with the RSA function, that is without padding, use the following function: 4081\index{rsa\_exptmod()} 4082\begin{verbatim} 4083int rsa_exptmod(const unsigned char *in, 4084 unsigned long inlen, 4085 unsigned char *out, 4086 unsigned long *outlen, 4087 int which, 4088 rsa_key *key); 4089\end{verbatim} 4090This will load the bignum from \textit{in} as a big endian integer in the format PKCS \#1 specifies, raises it to either \textit{e} or \textit{d} and stores the result 4091in \textit{out} and the size of the result in \textit{outlen}. \textit{which} is set to {\bf PK\_PUBLIC} to use \textit{e} 4092(i.e. for encryption/verifying) and set to {\bf PK\_PRIVATE} to use \textit{d} as the exponent (i.e. for decrypting/signing). 4093 4094Note: the output of this function is zero--padded as per PKCS \#1 specification. This allows this routine to work with PKCS \#1 padding functions properly. 4095 4096\subsection{RSA Key Size} 4097To fetch the key size of an RSA key, use the following function: 4098\index{rsa\_get\_size()} 4099\begin{verbatim} 4100int rsa_get_size(rsa_key *key); 4101\end{verbatim} 4102This can be used to determine the modulus size of an RSA key. 4103 4104\mysection{RSA Key Encryption} 4105Normally RSA is used to encrypt short symmetric keys which are then used in block ciphers to encrypt a message. 4106To facilitate encrypting short keys the following functions have been provided. 4107 4108\index{rsa\_encrypt\_key()} 4109\begin{verbatim} 4110int rsa_encrypt_key( 4111 const unsigned char *in, 4112 unsigned long inlen, 4113 unsigned char *out, 4114 unsigned long *outlen, 4115 const unsigned char *lparam, 4116 unsigned long lparamlen, 4117 prng_state *prng, 4118 int prng_idx, 4119 int hash_idx, 4120 rsa_key *key); 4121\end{verbatim} 4122This function will OAEP pad \textit{in} of length \textit{inlen} bytes, RSA encrypt it, and store the ciphertext 4123in \textit{out} of length \textit{outlen} octets. The \textit{lparam} and \textit{lparamlen} are the same parameters you would pass 4124to \index{pkcs\_1\_oaep\_encode()} pkcs\_1\_oaep\_encode(). 4125 4126\subsection{Extended Encryption} 4127As of v1.15, the library supports both v1.5 and v2.1 PKCS \#1 style paddings in these higher level functions. The following is the extended 4128encryption function: 4129 4130\index{rsa\_encrypt\_key\_ex()} 4131\begin{verbatim} 4132int rsa_encrypt_key_ex( 4133 const unsigned char *in, 4134 unsigned long inlen, 4135 unsigned char *out, 4136 unsigned long *outlen, 4137 const unsigned char *lparam, 4138 unsigned long lparamlen, 4139 prng_state *prng, 4140 int prng_idx, 4141 int hash_idx, 4142 int padding, 4143 rsa_key *key); 4144\end{verbatim} 4145 4146\index{LTC\_PKCS\_1\_OAEP} \index{LTC\_PKCS\_1\_V1\_5} 4147The parameters are all the same as for rsa\_encrypt\_key() except for the addition of the \textit{padding} parameter. It must be set to 4148\textbf{LTC\_PKCS\_1\_V1\_5} to perform v1.5 encryption, or set to \textbf{LTC\_PKCS\_1\_OAEP} to perform v2.1 encryption. 4149 4150When performing v1.5 encryption, the hash and lparam parameters are totally ignored and can be set to \textbf{NULL} or zero (respectively). 4151 4152\mysection{RSA Key Decryption} 4153\index{rsa\_decrypt\_key()} 4154\begin{verbatim} 4155int rsa_decrypt_key( 4156 const unsigned char *in, 4157 unsigned long inlen, 4158 unsigned char *out, 4159 unsigned long *outlen, 4160 const unsigned char *lparam, 4161 unsigned long lparamlen, 4162 int hash_idx, 4163 int *stat, 4164 rsa_key *key); 4165\end{verbatim} 4166This function will RSA decrypt \textit{in} of length \textit{inlen} then OAEP de-pad the resulting data and store it in 4167\textit{out} of length \textit{outlen}. The \textit{lparam} and \textit{lparamlen} are the same parameters you would pass 4168to pkcs\_1\_oaep\_decode(). 4169 4170If the RSA decrypted data is not a valid OAEP packet then \textit{stat} is set to $0$. Otherwise, it is set to $1$. 4171 4172\subsection{Extended Decryption} 4173As of v1.15, the library supports both v1.5 and v2.1 PKCS \#1 style paddings in these higher level functions. The following is the extended 4174decryption function: 4175 4176\index{rsa\_decrypt\_key\_ex()} 4177\begin{verbatim} 4178int rsa_decrypt_key_ex( 4179 const unsigned char *in, 4180 unsigned long inlen, 4181 unsigned char *out, 4182 unsigned long *outlen, 4183 const unsigned char *lparam, 4184 unsigned long lparamlen, 4185 int hash_idx, 4186 int padding, 4187 int *stat, 4188 rsa_key *key); 4189\end{verbatim} 4190 4191Similar to the extended encryption, the new parameter \textit{padding} indicates which version of the PKCS \#1 standard to use. 4192It must be set to \textbf{LTC\_PKCS\_1\_V1\_5} to perform v1.5 decryption, or set to \textbf{LTC\_PKCS\_1\_OAEP} to perform v2.1 decryption. 4193 4194When performing v1.5 decryption, the hash and lparam parameters are totally ignored and can be set to \textbf{NULL} or zero (respectively). 4195 4196 4197\mysection{RSA Signature Generation} 4198Similar to RSA key encryption RSA is also used to \textit{digitally sign} message digests (hashes). To facilitate this 4199process the following functions have been provided. 4200 4201\index{rsa\_sign\_hash()} 4202\begin{verbatim} 4203int rsa_sign_hash(const unsigned char *in, 4204 unsigned long inlen, 4205 unsigned char *out, 4206 unsigned long *outlen, 4207 prng_state *prng, 4208 int prng_idx, 4209 int hash_idx, 4210 unsigned long saltlen, 4211 rsa_key *key); 4212\end{verbatim} 4213 4214This will PSS encode the message digest pointed to by \textit{in} of length \textit{inlen} octets. Next, the PSS encoded hash will be RSA 4215\textit{signed} and the output stored in the buffer pointed to by \textit{out} of length \textit{outlen} octets. 4216 4217The \textit{hash\_idx} parameter indicates which hash will be used to create the PSS encoding. It should be the same as the hash used to 4218hash the message being signed. The \textit{saltlen} parameter indicates the length of the desired salt, and should typically be small. A good 4219default value is between 8 and 16 octets. Strictly, it must be small than $modulus\_len - hLen - 2$ where \textit{modulus\_len} is the size of 4220the RSA modulus (in octets), and \textit{hLen} is the length of the message digest produced by the chosen hash. 4221 4222\subsection{Extended Signatures} 4223 4224As of v1.15, the library supports both v1.5 and v2.1 signatures. The extended signature generation function has the following prototype: 4225 4226\index{rsa\_sign\_hash\_ex()} 4227\begin{verbatim} 4228int rsa_sign_hash_ex( 4229 const unsigned char *in, 4230 unsigned long inlen, 4231 unsigned char *out, 4232 unsigned long *outlen, 4233 int padding, 4234 prng_state *prng, 4235 int prng_idx, 4236 int hash_idx, 4237 unsigned long saltlen, 4238 rsa_key *key); 4239\end{verbatim} 4240 4241This will PKCS encode the message digest pointed to by \textit{in} of length \textit{inlen} octets. Next, the PKCS encoded hash will be RSA 4242\textit{signed} and the output stored in the buffer pointed to by \textit{out} of length \textit{outlen} octets. The \textit{padding} parameter 4243must be set to \textbf{LTC\_PKCS\_1\_V1\_5} to produce a v1.5 signature, otherwise, it must be set to \textbf{LTC\_PKCS\_1\_PSS} to produce a 4244v2.1 signature. 4245 4246\index{LTC\_PKCS\_1\_V1\_5\_NA1} 4247As of v1.18.0, the library also supports v1.5 signature generation without ASN.1 encoding the signature which can be indicated by passing 4248\textbf{LTC\_PKCS\_1\_V1\_5\_NA1} as \textit{padding} parameter. This option has been introduced to provide compatibilty to SSL3.0 implementations 4249which implemented this. 4250 4251When generating a standard v1.5 signature the \textit{prng}, and \textit{prng\_idx} parameters are ignored. 4252When generating a v1.5 signature without ASN.1 decoding additionally the textit{hash\_idx} parameter is ignored. 4253 4254\mysection{RSA Signature Verification} 4255\index{rsa\_verify\_hash()} 4256\begin{verbatim} 4257int rsa_verify_hash(const unsigned char *sig, 4258 unsigned long siglen, 4259 const unsigned char *msghash, 4260 unsigned long msghashlen, 4261 int hash_idx, 4262 unsigned long saltlen, 4263 int *stat, 4264 rsa_key *key); 4265\end{verbatim} 4266 4267This will RSA \textit{verify} the signature pointed to by \textit{sig} of length \textit{siglen} octets. Next, the RSA decoded data is PSS decoded 4268and the extracted hash is compared against the message digest pointed to by \textit{msghash} of length \textit{msghashlen} octets. 4269 4270If the RSA decoded data is not a valid PSS message, or if the PSS decoded hash does not match the \textit{msghash} 4271value, \textit{res} is set to $0$. Otherwise, if the function succeeds, and signature is valid \textit{res} is set to $1$. 4272 4273\subsection{RSA Signature Salt Length} 4274 4275The v2.1 signature algorithm requires a salt length to be able to properly 4276encode resp. decode. To fetch the maximum possible salt length this function 4277is provided: 4278 4279\index{rsa\_sign\_saltlen\_get\_max()} 4280\begin{verbatim} 4281int rsa_sign_saltlen_get_max(int hash_idx, rsa_key *key); 4282\end{verbatim} 4283 4284As stated in the PKCS\#1 RFC3447 "Typical salt lengths in octets are hLen 4285(the length of the output of the hash function Hash) and 0". 4286This function is provided to be able to use other lengths as well and to make 4287sure at runtime that the RSA key can handle the desired salt length. 4288 4289\subsection{Extended Verification} 4290 4291As of v1.15, the library supports both v1.5 and v2.1 signature verification. The extended signature verification function has the following prototype: 4292 4293\index{rsa\_verify\_hash\_ex()} 4294\begin{verbatim} 4295int rsa_verify_hash_ex( 4296 const unsigned char *sig, 4297 unsigned long siglen, 4298 const unsigned char *hash, 4299 unsigned long hashlen, 4300 int padding, 4301 int hash_idx, 4302 unsigned long saltlen, 4303 int *stat, 4304 rsa_key *key); 4305\end{verbatim} 4306 4307This will RSA \textit{verify} the signature pointed to by \textit{sig} of length \textit{siglen} octets. Next, the RSA decoded data is PKCS decoded 4308and the extracted hash is compared against the message digest pointed to by \textit{msghash} of length \textit{msghashlen} octets. 4309 4310If the RSA decoded data is not a valid PSS message, or if the PKCS decoded hash does not match the \textit{msghash} 4311value, \textit{res} is set to $0$. Otherwise, if the function succeeds, and signature is valid \textit{res} is set to $1$. 4312 4313The \textit{padding} parameter must be set to \textbf{LTC\_PKCS\_1\_V1\_5} to perform a v1.5 verification. Otherwise, it must be set to 4314\textbf{LTC\_PKCS\_1\_PSS} to perform a v2.1 verification. 4315 4316As of v1.18.0, the library also supports v1.5 signature verification without ASN.1 decoding the signature which can be indicated by passing 4317\textbf{LTC\_PKCS\_1\_V1\_5\_NA1} as \textit{padding} parameter. 4318 4319When performing a standard v1.5 verification the \textit{saltlen} parameter is ignored. 4320When performing a v1.5 verification without ASN.1 decoding additionally the \textit{hash\_idx} parameter is ignored. 4321 4322 4323\mysection{RSA Encryption Example} 4324\begin{small} 4325\begin{verbatim} 4326#include <tomcrypt.h> 4327int main(void) 4328{ 4329 int err, hash_idx, prng_idx, res; 4330 unsigned long l1, l2; 4331 unsigned char pt[16], pt2[16], out[1024]; 4332 rsa_key key; 4333 4334 /* register prng/hash */ 4335 if (register_prng(&sprng_desc) == -1) { 4336 printf("Error registering sprng"); 4337 return EXIT_FAILURE; 4338 } 4339 4340 /* register a math library (in this case TomsFastMath) 4341 ltc_mp = tfm_desc; 4342 4343 if (register_hash(&sha1_desc) == -1) { 4344 printf("Error registering sha1"); 4345 return EXIT_FAILURE; 4346 } 4347 hash_idx = find_hash("sha1"); 4348 prng_idx = find_prng("sprng"); 4349 4350 /* make an RSA-1024 key */ 4351 if ((err = rsa_make_key(NULL, /* PRNG state */ 4352 prng_idx, /* PRNG idx */ 4353 1024/8, /* 1024-bit key */ 4354 65537, /* we like e=65537 */ 4355 &key) /* where to store the key */ 4356 ) != CRYPT_OK) { 4357 printf("rsa_make_key %s", error_to_string(err)); 4358 return EXIT_FAILURE; 4359 } 4360 4361 /* fill in pt[] with a key we want to send ... */ 4362 l1 = sizeof(out); 4363 if ((err = rsa_encrypt_key(pt, /* data we wish to encrypt */ 4364 16, /* data is 16 bytes long */ 4365 out, /* where to store ciphertext */ 4366 &l1, /* length of ciphertext */ 4367 "TestApp", /* our lparam for this program */ 4368 7, /* lparam is 7 bytes long */ 4369 NULL, /* PRNG state */ 4370 prng_idx, /* prng idx */ 4371 hash_idx, /* hash idx */ 4372 &key) /* our RSA key */ 4373 ) != CRYPT_OK) { 4374 printf("rsa_encrypt_key %s", error_to_string(err)); 4375 return EXIT_FAILURE; 4376 } 4377 4378 /* now let's decrypt the encrypted key */ 4379 l2 = sizeof(pt2); 4380 if ((err = rsa_decrypt_key(out, /* encrypted data */ 4381 l1, /* length of ciphertext */ 4382 pt2, /* where to put plaintext */ 4383 &l2, /* plaintext length */ 4384 "TestApp", /* lparam for this program */ 4385 7, /* lparam is 7 bytes long */ 4386 hash_idx, /* hash idx */ 4387 &res, /* validity of data */ 4388 &key) /* our RSA key */ 4389 ) != CRYPT_OK) { 4390 printf("rsa_decrypt_key %s", error_to_string(err)); 4391 return EXIT_FAILURE; 4392 } 4393 /* if all went well pt == pt2, l2 == 16, res == 1 */ 4394} 4395\end{verbatim} 4396\end{small} 4397 4398\mysection{RSA Key Format} 4399 4400The RSA key format adopted for exporting and importing keys is the PKCS \#1 format defined by the ASN.1 constructs known as 4401RSAPublicKey and RSAPrivateKey. Additionally, the OpenSSL key format is supported as well. 4402 4403\subsection{RSA Key Export} 4404To export a RSA key use the following function. 4405 4406\index{rsa\_export()} 4407\begin{verbatim} 4408int rsa_export(unsigned char *out, 4409 unsigned long *outlen, 4410 int type, 4411 rsa_key *key); 4412\end{verbatim} 4413 4414This will export the RSA key depending on the value of \textit{type}. 4415 4416The RSAPublicKey (PKCS \#1 type) format will be used for the public key, 4417indicated by \textbf{PK\_PUBLIC}. 4418The RSAPrivateKey (PKCS \#1 type) format will be used for the private key, 4419indicated by \textbf{PK\_PRIVATE}. 4420 4421As of v1.18.0 this function can also export OpenSSL-compatible formatted public RSA keys. 4422By OR'ing \textbf{PK\_STD} and \textbf{PK\_PUBLIC} the public key will be exported 4423in the SubjectPublicKeyInfo (X.509 type) format. 4424 4425\subsection{RSA Key Import} 4426To import a RSA key use one of the following function. 4427 4428\subsubsection{Import from standard formats} 4429 4430This will import the key stored in \textit{in} of length inlen and import it to \textit{key}. 4431 4432These formats are normally distributed in the PEM format, consisting of a label defining the content and base64 encoded DER-serialized data. 4433 4434All the import functions expect binary DER data. 4435 4436\index{rsa\_import()} 4437\begin{verbatim} 4438int rsa_import(const unsigned char *in, 4439 unsigned long inlen, 4440 rsa_key *key); 4441\end{verbatim} 4442 4443This function can import both RSAPublicKey and RSAPrivateKey formats. 4444 4445As of v1.06 this function can also import OpenSSL DER formatted public RSA keys. They are essentially encapsulated RSAPublicKeys. LibTomCrypt will 4446import the key, strip off the additional data and fill in the \textit{rsa\_key} structure. 4447 4448\index{rsa\_import\_pkcs8()} 4449\begin{verbatim} 4450int rsa_import_pkcs8(const unsigned char *in, 4451 unsigned long inlen, 4452 const void *passwd, 4453 unsigned long passwdlen, 4454 rsa_key *key); 4455\end{verbatim} 4456 4457This function can import RSA private keys serialized in PKCS\#8 format. 4458 4459It provides a \textit{password} parameter for the encrypted PKCS\#8 format, but this functionality is currently NOT implemented. 4460 4461\index{rsa\_import\_x509()} 4462\begin{verbatim} 4463int rsa_import_x509(const unsigned char *in, 4464 unsigned long inlen, 4465 rsa_key *key); 4466\end{verbatim} 4467 4468This function can import the RSA public key from a X.509 certificate. 4469 4470\subsubsection{Import from plain big numbers} 4471 4472\index{rsa\_set\_key()} 4473\begin{verbatim} 4474int rsa_set_key(const unsigned char *N, 4475 unsigned long Nlen, 4476 const unsigned char *e, 4477 unsigned long elen, 4478 const unsigned char *d, 4479 unsigned long dlen, 4480 rsa_key *key); 4481\end{verbatim} 4482 4483This function can import the plain RSA key parameters \textit{N}, \textit{e} and \textit{d}. 4484The parameter \textit{d} is optional and only required when importing a private key. 4485 4486\index{rsa\_set\_factors()} 4487\begin{verbatim} 4488int rsa_set_factors(const unsigned char *p, 4489 unsigned long plen, 4490 const unsigned char *q, 4491 unsigned long qlen, 4492 rsa_key *key); 4493\end{verbatim} 4494 4495This function can import the plain RSA key factors \textit{p} and \textit{q}. 4496 4497\index{rsa\_set\_crt\_params()} 4498\begin{verbatim} 4499int rsa_set_crt_params(const unsigned char *dP, 4500 unsigned long dPlen, 4501 const unsigned char *dQ, 4502 unsigned long dQlen, 4503 const unsigned char *qP, 4504 unsigned long qPlen, 4505 rsa_key *key); 4506\end{verbatim} 4507 4508This function can import the plain RSA CRT (chinese remainder theorem) parameters \textit{dP}, \textit{dQ} and \textit{qP}. 4509 4510After importing \textit{p}, \textit{q}, \textit{dP}, \textit{dQ} and \textit{qP} 4511the library can perfrom the optimized CRT calculations on private key operations. 4512 4513\chapter{Diffie-Hellman Key Exchange} 4514 4515\mysection{Background} 4516 4517Diffie-Hellman was the original public key system proposed. The system is based upon the group structure 4518of finite fields. For Diffie-Hellman a prime $p$ is chosen and a ``base'' $b$ such that $b^x\mbox{ }(\mbox{mod }p)$ 4519generates a large sub-group of prime order (for unique values of $x$). 4520 4521A secret key is an exponent $x$ and a public key is the value of $y \equiv g^x\mbox{ }(\mbox{mod }p)$. The term 4522``discrete logarithm'' denotes the action of finding $x$ given only $y$, $g$ and $p$. The key exchange part of 4523Diffie-Hellman arises from the fact that two users A and B with keys $(A_x, A_y)$ and $(B_x, B_y)$ can exchange 4524a shared key $K \equiv B_y^{A_x} \equiv A_y^{B_x} \equiv g^{A_xB_x}\mbox{ }(\mbox{mod }p)$. 4525 4526From this public encryption and signatures can be developed. The trivial way to encrypt (for example) using a public key 4527$y$ is to perform the key exchange offline. The sender invents a key $k$ and its public copy 4528$k' \equiv g^k\mbox{ }(\mbox{mod }p)$ and uses $K \equiv k'^{A_x}\mbox{ }(\mbox{mod }p)$ as a key to encrypt 4529the message with. Typically $K$ would be sent to a one-way hash and the message digested used as a key in a 4530symmetric cipher. 4531 4532It is important that the order of the sub-group that $g$ generates not only be large but also prime. There are 4533discrete logarithm algorithms that take $\sqrt r$ time given the order $r$. The discrete logarithm can be computed 4534modulo each prime factor of $r$ and the results combined using the Chinese Remainder Theorem. In the cases where 4535$r$ is ``B-Smooth'' (e.g. all small factors or powers of small prime factors) the solution is trivial to find. 4536 4537To thwart such attacks the primes and bases in the library have been designed and fixed. Given a prime $p$ the order of 4538 the sub-group generated is a large prime namely ${p - 1} \over 2$. Such primes are known as ``strong primes'' and the 4539smaller prime (e.g. the order of the base) are known as Sophie-Germaine primes. 4540 4541\mysection{Core Functions} 4542 4543This library also provides core Diffie-Hellman functions so you can negotiate keys over insecure mediums. The routines 4544provided are relatively easy to use and only take two function calls to negotiate a shared key. There is a structure 4545called ``dh\_key'' which stores the Diffie-Hellman key in a format these routines can use. The first set of routines 4546are to make a Diffie-Hellman private key pair: 4547\index{dh\_make\_key()} 4548\begin{verbatim} 4549int dh_set_pg_groupsize(int groupsize, dh_key *key); 4550int dh_generate_key(prng_state *prng, int wprng, dh_key *key); 4551\end{verbatim} 4552The ``groupsize'' is the size of the modulus you want in bytes. Currently support sizes are 96 to 1024 bytes which correspond 4553to key sizes of 768 to 8192 bits. The smaller the key the faster it is to use however it will be less secure. When 4554specifying a size not explicitly supported by the library it will round {\em up} to the next key size. If the size is 4555above 512 it will return an error. So if you pass ``groupsize == 32'' it will use a 768 bit key but if you pass 4556``groupsize == 20000'' it will return an error. The primes and generators used are built-into the library and were designed 4557to meet very specific goals. The primes are strong primes which means that if $p$ is the prime then 4558$p-1$ is equal to $2r$ where $r$ is a large prime. The bases are chosen to generate a group of order $r$ to prevent 4559leaking a bit of the key. This means the bases generate a very large prime order group which is good to make cryptanalysis 4560hard. 4561 4562The next two routines are for exporting/importing Diffie-Hellman keys in/from DER encoded ASN.1. This is useful for transport 4563over communication mediums. 4564 4565\index{dh\_export()} \index{dh\_import()} 4566\begin{verbatim} 4567int dh_export(unsigned char *out, unsigned long *outlen, 4568 int type, dh_key *key); 4569 4570int dh_import(const unsigned char *in, unsigned long inlen, dh_key *key); 4571\end{verbatim} 4572 4573The ASN.1 sequence used to represent a DH key is as following: 4574 4575\begin{verbatim} 4576DiffieHellmanKey ::= SEQUENCE { 4577 version Version, 4578 flags Flags, 4579 p INTEGER, -- prime 4580 g INTEGER, -- base/group 4581 n INTEGER -- either x when private key or y when public key } 4582 4583Version ::= INTEGER { v1(0) } 4584 4585Flags ::= BIT STRING { 4586 privateKey (0) -- this BIT is '1' if it's a private key 4587 -- or '0' if it's a public key 4588} 4589\end{verbatim} 4590 4591These two functions work just like the ``rsa\_export()'' and ``rsa\_import()'' functions except these work with 4592Diffie-Hellman keys. Its important to note you do not have to free the ram for a ``dh\_key'' if an import fails. 4593 4594You can free a ``dh\_key'' using: 4595\begin{verbatim} 4596void dh_free(dh_key *key); 4597\end{verbatim} 4598After you have exported a copy of your public key (using {\bf PK\_PUBLIC} as ``type'') you can now create a shared secret 4599with the other user using: 4600\index{dh\_shared\_secret()} 4601\begin{verbatim} 4602int dh_shared_secret(dh_key *private_key, 4603 dh_key *public_key, 4604 unsigned char *out, unsigned long *outlen); 4605\end{verbatim} 4606 4607Where ``private\_key'' is the key you made and ``public\_key'' is the copy of the public key the other user sent you. The result goes 4608into ``out'' and the length into ``outlen''. If all went correctly the data in ``out'' should be identical for both parties. It is important to 4609note that the two keys have to be the same size in order for this to work. There is a function to get the size of a 4610key: 4611\index{dh\_get\_groupsize()} 4612\begin{verbatim} 4613int dh_get_groupsize(dh_key *key); 4614\end{verbatim} 4615This returns the size in bytes of the modulus chosen for that key. 4616 4617\mysection{Other Diffie-Hellman Functions} 4618 4619To be able to import Diffie-Hellman keys LibTomCrypt provides several API functions. 4620\\ 4621 4622To import the prime and group from binary format: 4623\index{dh\_set\_pg()} 4624\begin{verbatim} 4625int dh_set_pg(const unsigned char *p, unsigned long plen, 4626 const unsigned char *g, unsigned long glen, 4627 dh_key *key); 4628\end{verbatim} 4629This sets the prime \textit{p} of length \textit{plen} and the generator/base \textit{g} of length \textit{glen} in the DH key \textit{key}. 4630\\ 4631 4632To import the prime and group from an ASN.1 encoded DHparam Sequence: 4633\index{dh\_set\_pg\_dhparam()} 4634\begin{verbatim} 4635int dh_set_pg_dhparam(const unsigned char *dhparam, unsigned long dhparamlen, dh_key *key); 4636\end{verbatim} 4637This sets the parameters in \textit{dhparam} of \textit{dhparamlen} in the DH key \textit{key}. 4638\\ 4639 4640To import a private or public key from binary data: 4641\index{dh\_set\_key()} 4642\begin{verbatim} 4643int dh_set_key(const unsigned char *in, unsigned long inlen, int type, dh_key *key); 4644\end{verbatim} 4645This will import, depending on \textit{type} which can be either \textit{PK\_PRIVATE} or \textit{PK\_PUBLIC}, 4646the according part of the DH key \textit{key} from \textit{in} of length \textit{inlen}. 4647After import the key will be verified and in case of an error it will be free'd. 4648 4649\mysection{Remarks on Usage} 4650Its important that you hash the shared key before trying to use it as a key for a symmetric cipher or something. An 4651example program that communicates over sockets, using MD5 and 1024-bit DH keys is\footnote{This function is a small example. It is suggested that proper packaging be used. For example, if the public key sent is truncated these routines will not detect that.}: 4652\newpage 4653\begin{small} 4654\begin{verbatim} 4655int establish_secure_socket(int sock, int mode, unsigned char *key, 4656 prng_state *prng, int wprng) 4657{ 4658 unsigned char buf[4096], buf2[4096]; 4659 unsigned long x, len; 4660 int res, err, inlen; 4661 dh_key mykey, theirkey; 4662 4663 /* make up our private key */ 4664 if ((err = dh_set_pg_groupsize(128, &mykey)) != CRYPT_OK) { 4665 return err; 4666 } 4667 if ((err = dh_generate_key(prng, wprng, &mykey)) != CRYPT_OK) { 4668 return err; 4669 } 4670 4671 /* export our key as public */ 4672 x = sizeof(buf); 4673 if ((err = dh_export(buf, &x, PK_PUBLIC, &mykey)) != CRYPT_OK) { 4674 res = err; 4675 goto done2; 4676 } 4677 4678 if (mode == 0) { 4679 /* mode 0 so we send first */ 4680 if (send(sock, buf, x, 0) != x) { 4681 res = CRYPT_ERROR; 4682 goto done2; 4683 } 4684 4685 /* get their key */ 4686 if ((inlen = recv(sock, buf2, sizeof(buf2), 0)) <= 0) { 4687 res = CRYPT_ERROR; 4688 goto done2; 4689 } 4690 } else { 4691 /* mode >0 so we send second */ 4692 if ((inlen = recv(sock, buf2, sizeof(buf2), 0)) <= 0) { 4693 res = CRYPT_ERROR; 4694 goto done2; 4695 } 4696 4697 if (send(sock, buf, x, 0) != x) { 4698 res = CRYPT_ERROR; 4699 goto done2; 4700 } 4701 } 4702 4703 if ((err = dh_import(buf2, inlen, &theirkey)) != CRYPT_OK) { 4704 res = err; 4705 goto done2; 4706 } 4707 4708 /* make shared secret */ 4709 x = sizeof(buf); 4710 if ((err = dh_shared_secret(&mykey, &theirkey, buf, &x)) != CRYPT_OK) { 4711 res = err; 4712 goto done; 4713 } 4714 4715 /* hash it */ 4716 len = 16; /* default is MD5 so "key" must be at least 16 bytes long */ 4717 if ((err = hash_memory(find_hash("md5"), buf, x, key, &len)) != CRYPT_OK) { 4718 res = err; 4719 goto done; 4720 } 4721 4722 /* clean up and return */ 4723 res = CRYPT_OK; 4724done: 4725 dh_free(&theirkey); 4726done2: 4727 dh_free(&mykey); 4728 zeromem(buf, sizeof(buf)); 4729 zeromem(buf2, sizeof(buf2)); 4730 return res; 4731} 4732\end{verbatim} 4733\end{small} 4734\subsection{Remarks on The Snippet} 4735When the above code snippet is done (assuming all went well) there will be a shared 128-bit key in the ``key'' array 4736passed to ``establish\_secure\_socket()''. 4737 4738\chapter{Elliptic Curve Cryptography} 4739 4740\mysection{Background} 4741The library provides a set of core ECC functions as well that are designed to be the Elliptic Curve analogy of all of the 4742Diffie-Hellman routines in the previous chapter. Elliptic curves (of certain forms) have the benefit that they are harder 4743to attack (no sub-exponential attacks exist unlike normal DH crypto) in fact the fastest attack requires the square root 4744of the order of the base point in time. That means if you use a base point of order $2^{192}$ (which would represent a 4745192-bit key) then the work factor is $2^{96}$ in order to find the secret key. 4746 4747The curves in this library are taken from the following website: 4748\begin{verbatim} 4749http://csrc.nist.gov/cryptval/dss.htm 4750\end{verbatim} 4751 4752As of v1.15 three new curves from the SECG standards are also included they are the secp112r1, secp128r1, and secp160r1 curves. These curves were added to 4753support smaller devices which do not need as large keys for security. 4754 4755They are all curves over the integers modulo a prime. The curves have the basic equation that is: 4756\begin{equation} 4757y^2 = x^3 - 3x + b\mbox{ }(\mbox{mod }p) 4758\end{equation} 4759 4760The variable $b$ is chosen such that the number of points is nearly maximal. In fact the order of the base points $\beta$ 4761provided are very close to $p$ that is $\vert \vert \phi(\beta) \vert \vert \approx \vert \vert p \vert \vert$. The curves 4762range in order from $\approx 2^{112}$ points to $\approx 2^{521}$. According to the source document any key size greater 4763than or equal to 256-bits is sufficient for long term security. 4764 4765\mysection{Fixed Point Optimizations} 4766\index{Fixed Point ECC} 4767\index{MECC\_FP} 4768As of v1.12 of LibTomCrypt, support for Fixed Point ECC point multiplication has been added. It is a generic optimization that is 4769supported by any conforming math plugin. It is enabled by defining \textbf{MECC\_FP} during the build, such as 4770 4771\begin{verbatim} 4772CFLAGS="-DTFM_DESC -DMECC_FP" make 4773\end{verbatim} 4774 4775which will build LTC using the TFM math library and enabling this new feature. The feature is not enabled by default as it is \textbf{NOT} thread 4776safe (by default). It supports the LTC locking macros (such as by enabling LTC\_PTHREAD), but by default is not locked. 4777 4778\index{FP\_ENTRIES} 4779The optimization works by using a Fixed Point multiplier on any base point you use twice or more in a short period of time. It has a limited size 4780cache (of FP\_ENTRIES entries) which it uses to hold recent bases passed to ltc\_ecc\_mulmod(). Any base detected to be used twice is sent through the 4781pre--computation phase, and then the fixed point algorithm can be used. For example, if you use a NIST base point twice in a row, the 2$^{nd}$ and 4782all subsequent point multiplications with that point will use the faster algorithm. 4783 4784\index{FP\_LUT} 4785The optimization uses a window on the multiplicand of FP\_LUT bits (default: 8, min: 2, max: 12), and this controls the memory/time trade-off. The larger the 4786value the faster the algorithm will be but the more memory it will take. The memory usage is $3 \cdot 2^{FP\_LUT}$ integers which by default 4787with TFM amounts to about 400kB of memory. Tuning TFM (by changing FP\_SIZE) can decrease the usage by a fair amount. Memory is only used by a cache entry 4788if it is active. Both FP\_ENTRIES and FP\_LUT are definable on the command line if you wish to override them. For instance, 4789 4790\begin{verbatim} 4791CFLAGS="-DTFM_DESC -DMECC_FP -DFP_ENTRIES=8 -DFP_LUT=6" make 4792\end{verbatim} 4793 4794\begin{flushleft} 4795\index{FP\_SIZE} \index{TFM} \index{tfm.h} 4796would define a window of 6 bits and limit the cache to 8 entries. Generally, it is better to first tune TFM by adjusting FP\_SIZE (from tfm.h). It defaults 4797to 4096 bits (512 bytes) which is way more than what is required by ECC. At most, you need 1152 bits to accommodate ECC--521. If you're only using (say) 4798ECC--256 you will only need 576 bits, which would reduce the memory usage by 700\%. 4799\end{flushleft} 4800 4801\mysection{Key Format} 4802LibTomCrypt uses a unique format for ECC public and private keys. While ANSI X9.63 partially specifies key formats, it does it in a less than ideally simple manner. \ 4803In the case of LibTomCrypt, it is meant \textbf{solely} for NIST and SECG $GF(p)$ curves. The format of the keys is as follows: 4804 4805\index{ECC Key Format} 4806\begin{small} 4807\begin{verbatim} 4808ECCPublicKey ::= SEQUENCE { 4809 flags BIT STRING(0), -- public/private flag (always zero), 4810 keySize INTEGER, -- Curve size (in bits) divided by eight 4811 -- and rounded down, e.g. 521 => 65 4812 pubkey.x INTEGER, -- The X co-ordinate of the public key point 4813 pubkey.y INTEGER, -- The Y co-ordinate of the public key point 4814} 4815 4816ECCPrivateKey ::= SEQUENCE { 4817 flags BIT STRING(1), -- public/private flag (always one), 4818 keySize INTEGER, -- Curve size (in bits) divided by eight 4819 -- and rounded down, e.g. 521 => 65 4820 pubkey.x INTEGER, -- The X co-ordinate of the public key point 4821 pubkey.y INTEGER, -- The Y co-ordinate of the public key point 4822 secret.k INTEGER, -- The secret key scalar 4823} 4824\end{verbatim} 4825\end{small} 4826 4827The first flags bit denotes whether the key is public (zero) or private (one). 4828 4829\vfil 4830 4831\mysection{ECC Curve Parameters} 4832The library uses the following structure to describe an elliptic curve. This is used internally, as well as by the new 4833extended ECC functions which allow the user to specify their own curves. 4834 4835\index{ltc\_ecc\_set\_type} 4836\begin{verbatim} 4837/** Structure defines a NIST GF(p) curve */ 4838typedef struct { 4839 /** The size of the curve in octets */ 4840 int size; 4841 4842 /** name of curve */ 4843 char *name; 4844 4845 /** The prime that defines the field (encoded in hex) */ 4846 char *prime; 4847 4848 /** The fields B param (hex) */ 4849 char *B; 4850 4851 /** The order of the curve (hex) */ 4852 char *order; 4853 4854 /** The x co-ordinate of the base point on the curve (hex) */ 4855 char *Gx; 4856 4857 /** The y co-ordinate of the base point on the curve (hex) */ 4858 char *Gy; 4859} ltc_ecc_set_type; 4860\end{verbatim} 4861 4862The curve must be of the form $y^2 = x^3 - 3x + b$, and all of the integer parameters are encoded in hexadecimal format. 4863 4864\mysection{Core Functions} 4865\subsection{ECC Key Generation} 4866There is a key structure called \textit{ecc\_key} used by the ECC functions. There is a function to make a key: 4867\index{ecc\_make\_key()} 4868\begin{verbatim} 4869int ecc_make_key(prng_state *prng, 4870 int wprng, 4871 int keysize, 4872 ecc_key *key); 4873\end{verbatim} 4874 4875The \textit{keysize} is the size of the modulus in bytes desired. Currently directly supported values are 12, 16, 20, 24, 28, 32, 48, and 65 bytes which 4876correspond to key sizes of 112, 128, 160, 192, 224, 256, 384, and 521 bits respectively. If you pass a key size that is between any key size it will round 4877the keysize up to the next available one. 4878 4879The function will free any internally allocated resources if there is an error. 4880 4881\subsection{Extended Key Generation} 4882As of v1.16, the library supports an extended key generation routine which allows the user to specify their own curve. It is specified as follows: 4883 4884\index{ecc\_make\_key\_ex()} 4885\begin{verbatim} 4886int ecc_make_key_ex( 4887 prng_state *prng, 4888 int wprng, 4889 ecc_key *key, 4890 const ltc_ecc_set_type *dp); 4891\end{verbatim} 4892 4893This function generates a random ECC key over the curve specified by the parameters by \textit{dp}. The rest of the parameters are equivalent to 4894those from the original key generation function. 4895 4896\subsection{ECC Key Free} 4897To free the memory allocated by a ecc\_make\_key(), ecc\_make\_key\_ex(), ecc\_import(), or ecc\_import\_ex() call use the following function: 4898\index{ecc\_free()} 4899\begin{verbatim} 4900void ecc_free(ecc_key *key); 4901\end{verbatim} 4902 4903\subsection{ECC Key Export} 4904To export an ECC key using the LibTomCrypt format call the following function: 4905\index{ecc\_export()} 4906\begin{verbatim} 4907int ecc_export(unsigned char *out, 4908 unsigned long *outlen, 4909 int type, 4910 ecc_key *key); 4911\end{verbatim} 4912This will export the key with the given \textit{type} (\textbf{PK\_PUBLIC} or \textbf{PK\_PRIVATE}), and store it to \textit{out}. 4913 4914\subsection{ECC Key Import} 4915The following function imports a LibTomCrypt format ECC key: 4916\index{ecc\_import()} 4917\begin{verbatim} 4918int ecc_import(const unsigned char *in, 4919 unsigned long inlen, 4920 ecc_key *key); 4921\end{verbatim} 4922This will import the ECC key from \textit{in}, and store it in the ecc\_key structure pointed to by \textit{key}. If the operation fails it will free 4923any allocated memory automatically. 4924 4925\subsection{Extended Key Import} 4926 4927The following function imports a LibTomCrypt format ECC key using a specified set of curve parameters: 4928\index{ecc\_import\_ex()} 4929\begin{verbatim} 4930int ecc_import_ex(const unsigned char *in, 4931 unsigned long inlen, 4932 ecc_key *key, 4933 const ltc_ecc_set_type *dp); 4934\end{verbatim} 4935This will import the key from the array pointed to by \textit{in} of length \textit{inlen} octets. The key is stored in 4936the ECC structure pointed to by \textit{key}. The curve is specified by the parameters pointed to by \textit{dp}. The function will free 4937all internally allocated memory upon error. 4938 4939\subsection{ANSI X9.63 Export} 4940The following function exports an ECC public key in the ANSI X9.63 format: 4941 4942\index{ecc\_ansi\_x963\_export()} 4943\begin{verbatim} 4944int ecc_ansi_x963_export( ecc_key *key, 4945 unsigned char *out, 4946 unsigned long *outlen); 4947\end{verbatim} 4948The ECC key pointed to by \textit{key} is exported in public fashion to the array pointed to by \textit{out}. The ANSI X9.63 format used is from 4949section 4.3.6 of the standard. It does not allow for the export of private keys. 4950 4951\subsection{ANSI X9.63 Import} 4952The following function imports an ANSI X9.63 section 4.3.6 format public ECC key: 4953 4954\index{ecc\_ansi\_x963\_import()} 4955\begin{verbatim} 4956int ecc_ansi_x963_import(const unsigned char *in, 4957 unsigned long inlen, 4958 ecc_key *key); 4959\end{verbatim} 4960This will import the key stored in the array pointed to by \textit{in} of length \textit{inlen} octets. The imported key is stored in the ECC key pointed to by 4961\textit{key}. The function will free any allocated memory upon error. 4962 4963\subsection{Extended ANSI X9.63 Import} 4964The following function allows the importing of an ANSI x9.63 section 4.3.6 format public ECC key using user specified domain parameters: 4965 4966\index{ecc\_ansi\_x963\_import\_ex()} 4967\begin{verbatim} 4968int ecc_ansi_x963_import_ex(const unsigned char *in, 4969 unsigned long inlen, 4970 ecc_key *key, 4971 ltc_ecc_set_type *dp); 4972\end{verbatim} 4973This will import the key stored in the array pointed to by \textit{in} of length \textit{inlen} octets using the domain parameters pointed to by \textit{dp}. 4974The imported key is stored in the ECC key pointed to by \textit{key}. The function will free any allocated memory upon error. 4975 4976\subsection{ECC Shared Secret} 4977To construct a Diffie-Hellman shared secret with a private and public ECC key, use the following function: 4978\index{ecc\_shared\_secret()} 4979\begin{verbatim} 4980int ecc_shared_secret( ecc_key *private_key, 4981 ecc_key *public_key, 4982 unsigned char *out, 4983 unsigned long *outlen); 4984\end{verbatim} 4985The \textit{private\_key} is typically the local private key, and \textit{public\_key} is the key the remote party has shared. 4986Note: this function stores only the $x$ co-ordinate of the shared elliptic point as described in ANSI X9.63 ECC--DH. 4987 4988\mysection{ECC Diffie-Hellman Encryption} 4989ECC--DH Encryption is performed by producing a random key, hashing it, and XOR'ing the digest against the plaintext. It is not strictly ANSI X9.63 compliant 4990but it is very similar. It has been extended by using an ASN.1 sequence and hash object identifiers to allow portable usage. The following function 4991encrypts a short string (no longer than the message digest) using this technique: 4992 4993\subsection{ECC-DH Encryption} 4994\index{ecc\_encrypt\_key()} 4995\begin{verbatim} 4996int ecc_encrypt_key(const unsigned char *in, 4997 unsigned long inlen, 4998 unsigned char *out, 4999 unsigned long *outlen, 5000 prng_state *prng, 5001 int wprng, 5002 int hash, 5003 ecc_key *key); 5004\end{verbatim} 5005 5006As the name implies this function encrypts a (symmetric) key, and is not intended for encrypting long messages directly. It will encrypt the 5007plaintext in the array pointed to by \textit{in} of length \textit{inlen} octets. It uses the public ECC key pointed to by \textit{key}, and 5008hash algorithm indexed by \textit{hash} to construct a shared secret which may be XOR'ed against the plaintext. The ciphertext is stored in 5009the output buffer pointed to by \textit{out} of length \textit{outlen} octets. 5010 5011The data is encrypted to the public ECC \textit{key} such that only the holder of the private key can decrypt the payload. To have multiple 5012recipients multiple call to this function for each public ECC key is required. 5013 5014\subsection{ECC-DH Decryption} 5015\index{ecc\_decrypt\_key()} 5016\begin{verbatim} 5017int ecc_decrypt_key(const unsigned char *in, 5018 unsigned long inlen, 5019 unsigned char *out, 5020 unsigned long *outlen, 5021 ecc_key *key); 5022\end{verbatim} 5023 5024This function will decrypt an encrypted payload. The \textit{key} provided must be the private key corresponding to the public key 5025used during encryption. If the wrong key is provided the function will not specifically return an error code. It is important 5026to use some form of challenge response in that case (e.g. compute a MAC of a known string). 5027 5028\subsection{ECC Encryption Format} 5029The packet format for the encrypted keys is the following ASN.1 SEQUENCE: 5030 5031\begin{verbatim} 5032ECCEncrypt ::= SEQUENCE { 5033 hashID OBJECT IDENTIFIER, -- OID of hash used 5034 pubkey OCTET STRING , -- Encapsulated ECCPublicKey 5035 skey OCTET STRING -- xor of plaintext and 5036 --"hash of shared secret" 5037} 5038\end{verbatim} 5039 5040\mysection{EC DSA Signatures} 5041 5042There are also functions to sign and verify messages. They use the ANSI X9.62 EC-DSA algorithm to generate and verify signatures in the 5043ANSI X9.62 format. 5044 5045\subsection{EC-DSA Signature Generation} 5046To sign a message digest (hash) use the following function: 5047 5048\index{ecc\_sign\_hash()} 5049\begin{verbatim} 5050int ecc_sign_hash(const unsigned char *in, 5051 unsigned long inlen, 5052 unsigned char *out, 5053 unsigned long *outlen, 5054 prng_state *prng, 5055 int wprng, 5056 ecc_key *key); 5057\end{verbatim} 5058 5059This function will EC--DSA sign the message digest stored in the array pointed to by \textit{in} of length \textit{inlen} octets. The signature 5060will be stored in the array pointed to by \textit{out} of length \textit{outlen} octets. The function requires a properly seeded PRNG, and 5061the ECC \textit{key} provided must be a private key. 5062 5063\index{ecc\_sign\_hash\_rfc7518()} 5064\begin{verbatim} 5065int ecc_sign_hash_rfc7518(const unsigned char *in, 5066 unsigned long inlen, 5067 unsigned char *out, 5068 unsigned long *outlen, 5069 prng_state *prng, 5070 int wprng, 5071 ecc_key *key); 5072\end{verbatim} 5073 5074This function creates the same EC--DSA signature as \textit{ecc\_sign\_hash} only the output format is different. 5075The format follows \url{https://tools.ietf.org/html/rfc7518#section-3.4}, sometimes it is also called plain signature. 5076 5077\subsection{EC-DSA Signature Verification} 5078\index{ecc\_verify\_hash()} 5079\begin{verbatim} 5080int ecc_verify_hash(const unsigned char *sig, 5081 unsigned long siglen, 5082 const unsigned char *hash, 5083 unsigned long hashlen, 5084 int *stat, 5085 ecc_key *key); 5086\end{verbatim} 5087 5088This function will verify the EC-DSA signature in the array pointed to by \textit{sig} of length \textit{siglen} octets, against the message digest 5089pointed to by the array \textit{hash} of length \textit{hashlen}. It will store a non--zero value in \textit{stat} if the signature is valid. Note: 5090the function will not return an error if the signature is invalid. It will return an error, if the actual signature payload is an invalid format. 5091The ECC \textit{key} must be the public (or private) ECC key corresponding to the key that performed the signature. 5092The function \textit{ecc\_verify\_hash} implements signature format according to X9.62 EC--DSA, and the output is compliant for GF(p) curves. 5093 5094\index{ecc\_verify\_hash\_rfc7518()} 5095\begin{verbatim} 5096int ecc_verify_hash_rfc7518(const unsigned char *sig, 5097 unsigned long siglen, 5098 const unsigned char *hash, 5099 unsigned long hashlen, 5100 int *stat, 5101 ecc_key *key); 5102\end{verbatim} 5103 5104This function validate the EC--DSA signature as \textit{ecc\_verify\_hash} only the signature input format 5105follows \url{https://tools.ietf.org/html/rfc7518#section-3.4}. 5106 5107\mysection{ECC Keysizes} 5108With ECC if you try to sign a hash that is bigger than your ECC key you can run into problems. The math will still work, and in effect the signature will still 5109work. With ECC keys the strength of the signature is limited by the size of the hash, or the size of they key, whichever is smaller. For example, if you sign with 5110SHA256 and an ECC-192 key, you in effect have 96--bits of security. 5111 5112The library will not warn you if you make this mistake, so it is important to check yourself before using the signatures. 5113 5114\chapter{Digital Signature Algorithm} 5115\mysection{Introduction} 5116The Digital Signature Algorithm (or DSA) is a variant of the ElGamal Signature scheme which has been modified to 5117reduce the bandwidth of the signatures. For example, to have \textit{80-bits of security} with ElGamal, you need a group with an order of at least 1024--bits. 5118With DSA, you need a group of order at least 160--bits. By comparison, the ElGamal signature would require at least 256 bytes of storage, whereas the DSA signature 5119would require only at least 40 bytes. 5120 5121\mysection{Key Format} 5122Since no useful public standard for DSA key storage was presented to me during the course of this development I made my own ASN.1 SEQUENCE which I document 5123now so that others can interoperate with this library. 5124 5125\begin{verbatim} 5126DSAPublicKey ::= SEQUENCE { 5127 publicFlags BIT STRING(0), -- must be 0 5128 g INTEGER , -- base generator 5129 -- check that g^q mod p == 1 5130 -- and that 1 < g < p - 1 5131 p INTEGER , -- prime modulus 5132 q INTEGER , -- order of sub-group 5133 -- (must be prime) 5134 y INTEGER , -- public key, specifically, 5135 -- g^x mod p, 5136 -- check that y^q mod p == 1 5137 -- and that 1 < y < p - 1 5138} 5139 5140DSAPrivateKey ::= SEQUENCE { 5141 publicFlags BIT STRING(1), -- must be 1 5142 g INTEGER , -- base generator 5143 -- check that g^q mod p == 1 5144 -- and that 1 < g < p - 1 5145 p INTEGER , -- prime modulus 5146 q INTEGER , -- order of sub-group 5147 -- (must be prime) 5148 y INTEGER , -- public key, specifically, 5149 -- g^x mod p, 5150 -- check that y^q mod p == 1 5151 -- and that 1 < y < p - 1 5152 x INTEGER -- private key 5153} 5154\end{verbatim} 5155 5156The leading BIT STRING has a single bit in it which is zero for public keys and one for private keys. This makes the structure uniquely decodable, 5157and easy to work with. 5158 5159\mysection{Key Generation} 5160To make a DSA key you must call the following function 5161\begin{verbatim} 5162int dsa_make_key(prng_state *prng, 5163 int wprng, 5164 int group_size, 5165 int modulus_size, 5166 dsa_key *key); 5167\end{verbatim} 5168The variable \textit{prng} is an active PRNG state and \textit{wprng} the index to the descriptor. \textit{group\_size} and 5169\textit{modulus\_size} control the difficulty of forging a signature. Both parameters are in bytes. The larger the 5170\textit{group\_size} the more difficult a forgery becomes upto a limit. The value of $group\_size$ is limited by 5171$15 < group\_size < 1024$ and $modulus\_size - group\_size < 512$. Suggested values for the pairs are as follows. 5172 5173\begin{figure}[H] 5174\begin{center} 5175\begin{tabular}{|c|c|c|} 5176\hline \textbf{Bits of Security} & \textbf{group\_size} & \textbf{modulus\_size} \\ 5177\hline 80 & 20 & 128 \\ 5178\hline 120 & 30 & 256 \\ 5179\hline 140 & 35 & 384 \\ 5180\hline 160 & 40 & 512 \\ 5181\hline 5182\end{tabular} 5183\end{center} 5184\caption{DSA Key Sizes} 5185\end{figure} 5186 5187When you are finished with a DSA key you can call the following function to free the memory used. 5188\index{dsa\_free()} 5189\begin{verbatim} 5190void dsa_free(dsa_key *key); 5191\end{verbatim} 5192 5193\mysection{Key Verification} 5194Each DSA key is composed of the following variables. 5195 5196\begin{enumerate} 5197 \item $q$ a small prime of magnitude $256^{group\_size}$. 5198 \item $p = qr + 1$ a large prime of magnitude $256^{modulus\_size}$ where $r$ is a random even integer. 5199 \item $g = h^r \mbox{ (mod }p\mbox{)}$ a generator of order $q$ modulo $p$. $h$ can be any non-trivial random 5200 value. For this library they start at $h = 2$ and step until $g$ is not $1$. 5201 \item $x$ a random secret (the secret key) in the range $1 < x < q$ 5202 \item $y = g^x \mbox{ (mod }p\mbox{)}$ the public key. 5203\end{enumerate} 5204 5205A DSA key is considered valid if it passes all of the following tests. 5206 5207\begin{enumerate} 5208 \item $q$ must be prime. 5209 \item $p$ must be prime. 5210 \item $g$ cannot be one of $\lbrace -1, 0, 1 \rbrace$ (modulo $p$). 5211 \item $g$ must be less than $p$. 5212 \item $(p-1) \equiv 0 \mbox{ (mod }q\mbox{)}$. 5213 \item $g^q \equiv 1 \mbox{ (mod }p\mbox{)}$. 5214 \item $1 < y < p - 1$ 5215 \item $y^q \equiv 1 \mbox{ (mod }p\mbox{)}$. 5216\end{enumerate} 5217 5218Tests one and two ensure that the values will at least form a field which is required for the signatures to 5219function. Tests three and four ensure that the generator $g$ is not set to a trivial value which would make signature 5220forgery easier. Test five ensures that $q$ divides the order of multiplicative sub-group of $\Z/p\Z$. Test six 5221ensures that the generator actually generates a prime order group. Tests seven and eight ensure that the public key 5222is within range and belongs to a group of prime order. Note that test eight does not prove that $g$ generated $y$ only 5223that $y$ belongs to a multiplicative sub-group of order $q$. 5224 5225The following function will perform these tests. 5226 5227\index{dsa\_verify\_key()} 5228\begin{verbatim} 5229int dsa_verify_key(dsa_key *key, int *stat); 5230\end{verbatim} 5231 5232This will test \textit{key} and store the result in \textit{stat}. If the result is $stat = 0$ the DSA key failed one of the tests 5233and should not be used at all. If the result is $stat = 1$ the DSA key is valid (as far as valid mathematics are concerned). 5234 5235\mysection{Signatures} 5236\subsection{Signature Generation} 5237To generate a DSA signature call the following function: 5238 5239\index{dsa\_sign\_hash()} 5240\begin{verbatim} 5241int dsa_sign_hash(const unsigned char *in, 5242 unsigned long inlen, 5243 unsigned char *out, 5244 unsigned long *outlen, 5245 prng_state *prng, 5246 int wprng, 5247 dsa_key *key); 5248\end{verbatim} 5249 5250Which will sign the data in \textit{in} of length \textit{inlen} bytes. The signature is stored in \textit{out} and the size 5251of the signature in \textit{outlen}. If the signature is longer than the size you initially specify in \textit{outlen} nothing 5252is stored and the function returns an error code. The DSA \textit{key} must be of the \textbf{PK\_PRIVATE} persuasion. 5253 5254\subsection{Signature Verification} 5255To verify a hash created with that function use the following function: 5256 5257\index{dsa\_verify\_hash()} 5258\begin{verbatim} 5259int dsa_verify_hash(const unsigned char *sig, 5260 unsigned long siglen, 5261 const unsigned char *hash, 5262 unsigned long inlen, 5263 int *stat, 5264 dsa_key *key); 5265\end{verbatim} 5266Which will verify the data in \textit{hash} of length \textit{inlen} against the signature stored in \textit{sig} of length \textit{siglen}. 5267It will set \textit{stat} to $1$ if the signature is valid, otherwise it sets \textit{stat} to $0$. 5268 5269\mysection{DSA Encrypt and Decrypt} 5270As of version 1.07, the DSA keys can be used to encrypt and decrypt small payloads. It works similar to the ECC encryption where 5271a shared key is computed, and the hash of the shared key XOR'ed against the plaintext forms the ciphertext. The format used is functional port of 5272the ECC encryption format to the DSA algorithm. 5273 5274\subsection{DSA Encryption} 5275This function will encrypt a small payload with a recipients public DSA key. 5276 5277\index{dsa\_encrypt\_key()} 5278\begin{verbatim} 5279int dsa_encrypt_key(const unsigned char *in, 5280 unsigned long inlen, 5281 unsigned char *out, 5282 unsigned long *outlen, 5283 prng_state *prng, 5284 int wprng, 5285 int hash, 5286 dsa_key *key); 5287\end{verbatim} 5288 5289This will encrypt the payload in \textit{in} of length \textit{inlen} and store the ciphertext in the output buffer \textit{out}. The 5290length of the ciphertext \textit{outlen} must be originally set to the length of the output buffer. The DSA \textit{key} can be 5291a public key. 5292 5293\subsection{DSA Decryption} 5294 5295\index{dsa\_decrypt\_key()} 5296\begin{verbatim} 5297int dsa_decrypt_key(const unsigned char *in, 5298 unsigned long inlen, 5299 unsigned char *out, 5300 unsigned long *outlen, 5301 dsa_key *key); 5302\end{verbatim} 5303This will decrypt the ciphertext \textit{in} of length \textit{inlen}, and store the original payload in \textit{out} of length \textit{outlen}. 5304The DSA \textit{key} must be a private key. 5305 5306\mysection{DSA Key Import and Export} 5307 5308\subsection{DSA Key Export} 5309To export a DSA key so that it can be transported use the following function: 5310\index{dsa\_export()} 5311\begin{verbatim} 5312int dsa_export(unsigned char *out, 5313 unsigned long *outlen, 5314 int type, 5315 dsa_key *key); 5316\end{verbatim} 5317This will export the DSA \textit{key} to the buffer \textit{out} and set the length in \textit{outlen} (which must have been previously 5318initialized to the maximum buffer size). The \textit{type} variable may be either \textbf{PK\_PRIVATE} or \textbf{PK\_PUBLIC} 5319depending on whether you want to export a private or public copy of the DSA key. 5320 5321\subsection{DSA Key Import} 5322To import an exported DSA key use the following function 5323: 5324\index{dsa\_import()} 5325\begin{verbatim} 5326int dsa_import(const unsigned char *in, 5327 unsigned long inlen, 5328 dsa_key *key); 5329\end{verbatim} 5330 5331This will import the DSA key from the buffer \textit{in} of length \textit{inlen} to the \textit{key}. If the process fails the function 5332will automatically free all of the heap allocated in the process (you don't have to call dsa\_free()). 5333 5334\mysection{Other DSA Functions} 5335 5336The following functions allow to create a DSA key in 2 steps: 5337 5338\begin{enumerate} 5339 \item Load or generate \textit{p}, \textit{q}, \textit{g} part of the key via \textit{dsa\_set\_pqg()}, \textit{dsa\_set\_pqg\_dsaparam()} or \textit{dsa\_generate\_pqg()}. 5340 \item Load or generate the actual DSA key -- private (\textit{x} and \textit{y} values) or public (\textit{y} value). 5341\end{enumerate} 5342 5343\index{dsa\_set\_pqg()} 5344\begin{verbatim} 5345int dsa_set_pqg(const unsigned char *p, unsigned long plen, 5346 const unsigned char *q, unsigned long qlen, 5347 const unsigned char *g, unsigned long glen, 5348 dsa_key *key); 5349\end{verbatim} 5350 5351This will initialise the \textit{p}, \textit{q} and \textit{g} part of \textit{key} structure by directly loading binary 5352representation of \textit{p} (with length of \textit{plen}), \textit{q} (with length of \textit{qlen}) and \textit{g} (with length of \textit{glen}). 5353A simple DSA key validity check (without primality testing) is performed at the end of this function. 5354 5355\index{dsa\_set\_pqg\_dsaparam()} 5356\begin{verbatim} 5357int dsa_set_pqg_dsaparam(const unsigned char *dsaparam, 5358 unsigned long dsaparamlen, 5359 dsa_key *key); 5360\end{verbatim} 5361 5362This will initialise the \textit{p}, \textit{q} and \textit{g} part of \textit{key} structure by directly loading binary representation 5363of DSA parameters stored as a binary data in a buffer \textit{dsaparam} (with length of \textit{dsaparamlen}). A simple DSA key validity 5364check (without primality testing) is performed at the end of this function. The \textit{dsaparam} can be generated via: 5365\begin{verbatim} 5366 openssl dsaparam 2048 -outform DER -out dsaparam.der 5367\end{verbatim} 5368 5369\index{dsa\_generate\_pqg()} 5370\begin{verbatim} 5371int dsa_generate_pqg(prng_state *prng, 5372 int wprng, 5373 int group_size, 5374 int modulus_size, 5375 dsa_key *key); 5376\end{verbatim} 5377 5378This will initialise the \textit{p}, \textit{q} and \textit{g} part of \textit{key} structure with newly generated random values. 5379As for the parameters they are the same as by \textit{dsa\_make\_key}. 5380 5381\index{dsa\_set\_key()} 5382\begin{verbatim} 5383int dsa_set_key(const unsigned char *in, 5384 unsigned long inlen, 5385 int type, 5386 dsa_key *key); 5387\end{verbatim} 5388 5389This function can be used for setting the actual DSA key. If \textit{type} is \textit{PK\_PRIVATE} then the buffer \textit{in} 5390(with length of \textit{inlen}) contains a binary representation of \textit{x} part of the key (the public part \textit{y} is computed). 5391If \textit{type} is \textit{PK\_PUBLIC} then the buffer \textit{in} contains a binary representation of \textit{y} part of the key. 5392 5393\index{dsa\_generate\_key()} 5394\begin{verbatim} 5395int dsa_generate_key(prng_state *prng, 5396 int wprng, 5397 dsa_key *key); 5398\end{verbatim} 5399 5400This function generates a private DSA key containing both \textit{x} and \textit{y} parts. 5401 5402\chapter{Standards Support} 5403\mysection{ASN.1 Formats} 5404LibTomCrypt supports a variety of ASN.1 data types encoded with the Distinguished Encoding Rules (DER) suitable for various cryptographic protocols. The data types 5405are all provided with three basic functions with \textit{similar} prototypes. One function has been dedicated to calculate the length in octets of a given 5406format, and two functions have been dedicated to encoding and decoding the format. 5407 5408On top of the basic data types are the SEQUENCE and SET data types which are collections of other ASN.1 types. They are provided 5409in the same manner as the other data types except they use list of objects known as the \textbf{ltc\_asn1\_list} structure. It is defined as the following: 5410 5411\index{ltc\_asn1\_list structure} 5412\begin{verbatim} 5413typedef struct { 5414 ltc_asn1_type type; 5415 void *data; 5416 unsigned long size; 5417 int used; 5418 struct ltc_asn1_list_ *prev, *next, 5419 *child, *parent; 5420} ltc_asn1_list; 5421\end{verbatim} 5422 5423\index{LTC\_SET\_ASN1 macro} 5424The \textit{type} field is one of the following ASN.1 field definitions. The \textit{data} pointer is a void pointer to the data to be encoded (or the destination) and the 5425\textit{size} field is specific to what you are encoding (e.g. number of bits in the BIT STRING data type). The \textit{used} field is primarily for the CHOICE decoder 5426and reflects if the particular member of a list was the decoded data type. To help build the lists in an orderly fashion the macro 5427\textit{LTC\_SET\_ASN1(list, index, Type, Data, Size)} has been provided. 5428 5429It will assign to the \textit{index}th position in the \textit{list} the triplet (Type, Data, Size). An example usage would be: 5430 5431\begin{small} 5432\begin{verbatim} 5433... 5434ltc_asn1_list sequence[3]; 5435unsigned long three=3; 5436 5437LTC_SET_ASN1(sequence, 0, LTC_ASN1_IA5_STRING, "hello", 5); 5438LTC_SET_ASN1(sequence, 1, LTC_ASN1_SHORT_INTEGER, &three, 1); 5439LTC_SET_ASN1(sequence, 2, LTC_ASN1_NULL, NULL, 0); 5440\end{verbatim} 5441\end{small} 5442 5443The macro is relatively safe with respect to modifying variables, for instance the following code is equivalent. 5444 5445\begin{small} 5446\begin{verbatim} 5447... 5448ltc_asn1_list sequence[3]; 5449unsigned long three=3; 5450int x=0; 5451LTC_SET_ASN1(sequence, x++, LTC_ASN1_IA5_STRING, "hello", 5); 5452LTC_SET_ASN1(sequence, x++, LTC_ASN1_SHORT_INTEGER, &three, 1); 5453LTC_SET_ASN1(sequence, x++, LTC_ASN1_NULL, NULL, 0); 5454\end{verbatim} 5455\end{small} 5456 5457\begin{figure}[h] 5458\begin{center} 5459\begin{small} 5460\begin{tabular}{|l|l|} 5461\hline \textbf{Definition} & \textbf{ASN.1 Type} \\ 5462\hline LTC\_ASN1\_EOL & End of a ASN.1 list structure. \\ 5463\hline LTC\_ASN1\_BOOLEAN & BOOLEAN type \\ 5464\hline LTC\_ASN1\_INTEGER & INTEGER (uses mp\_int) \\ 5465\hline LTC\_ASN1\_SHORT\_INTEGER & INTEGER (32--bit using unsigned long) \\ 5466\hline LTC\_ASN1\_BIT\_STRING & BIT STRING (one bit per char) \\ 5467\hline LTC\_ASN1\_OCTET\_STRING & OCTET STRING (one octet per char) \\ 5468\hline LTC\_ASN1\_NULL & NULL \\ 5469\hline LTC\_ASN1\_OBJECT\_IDENTIFIER & OBJECT IDENTIFIER \\ 5470\hline LTC\_ASN1\_IA5\_STRING & IA5 STRING (one octet per char) \\ 5471\hline LTC\_ASN1\_PRINTABLE\_STRING & PRINTABLE STRING (one octet per char) \\ 5472\hline LTC\_ASN1\_UTF8\_STRING & UTF8 STRING (one wchar\_t per char) \\ 5473\hline LTC\_ASN1\_UTCTIME & UTCTIME (see ltc\_utctime structure) \\ 5474\hline LTC\_ASN1\_CHOICE & CHOICE \\ 5475\hline LTC\_ASN1\_SEQUENCE & SEQUENCE (and SEQUENCE OF) \\ 5476\hline LTC\_ASN1\_SET & SET \\ 5477\hline LTC\_ASN1\_SETOF & SET OF \\ 5478\hline LTC\_ASN1\_RAW\_BIT\_STRING & BIT STRING (one octet per char) \\ 5479\hline LTC\_ASN1\_TELETEX\_STRING & TELETEX STRING (one octet per char) \\ 5480\hline LTC\_ASN1\_CONSTRUCTED & A constructed type that is not SEQUENCE or SET \\ 5481\hline LTC\_ASN1\_CONTEXT\_SPECIFIC & A context-specific type \\ 5482\hline LTC\_ASN1\_GENERALIZEDTIME & GeneralizedTime (see ltc\_generalizedtime structure) \\ 5483\hline 5484\end{tabular} 5485\caption{List of ASN.1 Supported Types} 5486\index{ltc\_asn1\_type} 5487\end{small} 5488\end{center} 5489\end{figure} 5490 5491\subsection{SEQUENCE Type} 5492The SEQUENCE data type is a collection of other ASN.1 data types encapsulated with a small header which is a useful way of sending multiple data types in one packet. 5493 5494\subsubsection{SEQUENCE Encoding} 5495To encode a sequence a \textbf{ltc\_asn1\_list} array must be initialized with the members of the sequence and their respective pointers. The encoding is performed 5496with the following function. 5497 5498\index{der\_encode\_sequence()}\index{LTC\_ASN1\_EOL} 5499\begin{verbatim} 5500int der_encode_sequence(ltc_asn1_list *list, 5501 unsigned long inlen, 5502 unsigned char *out, 5503 unsigned long *outlen); 5504\end{verbatim} 5505This encodes a sequence of items pointed to by \textit{list} where the list has \textit{inlen} items in it. The SEQUENCE will be encoded to \textit{out} and of length \textit{outlen}. The 5506function will terminate when it reads all the items out of the list (upto \textit{inlen}) or it encounters an item in the list with a type of \textbf{LTC\_ASN1\_EOL}. 5507 5508The \textit{data} pointer in the list would be the same pointer you would pass to the respective ASN.1 encoder (e.g. der\_encode\_bit\_string()) and it is simply passed on 5509verbatim to the dependent encoder. The list can contain other SEQUENCE or SET types which enables you to have nested SEQUENCE and SET definitions. In these cases 5510the \textit{data} pointer is simply a pointer to another \textbf{ltc\_asn1\_list}. 5511 5512\subsubsection{SEQUENCE Decoding} 5513 5514\index{der\_decode\_sequence()} 5515 5516Decoding a SEQUENCE is similar to encoding. You set up an array of \textbf{ltc\_asn1\_list} where in this case the \textit{size} member is the maximum size 5517(in certain cases). For types such as IA5 STRING, BIT STRING, OCTET STRING (etc) the \textit{size} field is updated after successful decoding to reflect how many 5518units of the respective type has been loaded. 5519 5520\begin{verbatim} 5521int der_decode_sequence(const unsigned char *in, 5522 unsigned long inlen, 5523 ltc_asn1_list *list, 5524 unsigned long outlen); 5525\end{verbatim} 5526 5527This will decode upto \textit{outlen} items from the input buffer \textit{in} of length \textit{inlen} octets. The function will stop (gracefully) when it runs out of items to decode. 5528It will fail (for among other reasons) when it runs out of input bytes to read, a data type is invalid or a heap failure occurred. 5529 5530For the following types the \textit{size} field will be updated to reflect the number of units read of the given type. 5531\begin{enumerate} 5532 \item BIT STRING 5533 \item OCTET STRING 5534 \item OBJECT IDENTIFIER 5535 \item IA5 STRING 5536 \item PRINTABLE STRING 5537\end{enumerate} 5538 5539\subsubsection{SEQUENCE Length} 5540 5541The length of a SEQUENCE can be determined with the following function. 5542 5543\index{der\_length\_sequence()} 5544\begin{verbatim} 5545int der_length_sequence(ltc_asn1_list *list, 5546 unsigned long inlen, 5547 unsigned long *outlen); 5548\end{verbatim} 5549 5550This will get the encoding size for the given \textit{list} of length \textit{inlen} and store it in \textit{outlen}. 5551 5552\subsubsection{SEQUENCE Multiple Argument Lists}\index{LTC\_ASN1\_EOL} 5553 5554For small or simple sequences an encoding or decoding can be performed with one of the following two functions. 5555 5556\index{der\_encode\_sequence\_multi()} 5557\index{der\_decode\_sequence\_multi()} 5558 5559\begin{verbatim} 5560int der_encode_sequence_multi(unsigned char *out, 5561 unsigned long *outlen, ...); 5562 5563int der_decode_sequence_multi(const unsigned char *in, 5564 unsigned long inlen, ...); 5565\end{verbatim} 5566 5567These either encode or decode (respectively) a SEQUENCE data type where the items in the sequence are specified after the length parameter. 5568 5569The list of items are specified as a triple of the form \textit{(type, size, data)} where \textit{type} is an \textbf{int}, \textit{size} is a \textbf{unsigned long} 5570and \textit{data} is \textbf{void} pointer. The list of items must be terminated with an item with the type \textbf{LTC\_ASN1\_EOL}. 5571 5572It is ideal that you cast the \textit{size} values to unsigned long to ensure that the proper data type is passed to the function. Constants such as \textit{1} without 5573a cast or prototype are of type \textbf{int} by default. Appending \textit{UL} or pre-pending \textit{(unsigned long)} is enough to cast it to the correct type. 5574 5575\begin{small} 5576\begin{verbatim} 5577unsigned char buf[MAXBUFSIZE]; 5578unsigned long buflen; 5579int err; 5580 5581 buflen = sizeof(buf); 5582 if ((err = 5583 der_encode_sequence_multi(buf, &buflen, 5584 LTC_ASN1_IA5_STRING, 5UL, "Hello", 5585 LTC_ASN1_IA5_STRING, 7UL, " World!", 5586 LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { 5587 // error handling 5588 } 5589\end{verbatim} 5590\end{small} 5591 5592This example encodes a SEQUENCE with two IA5 STRING types containing ``Hello'' and `` World!'' respectively. Note the usage of the \textbf{UL} modifier 5593on the size parameters. This forces the compiler to pass the numbers as the required \textbf{unsigned long} type that the function expects. 5594 5595\subsection{SET and SET OF} 5596 5597\index{SET} \index{SET OF} 5598SET and SET OF are related to the SEQUENCE type in that they can be pretty much be decoded with the same code. However, they are different, and they should 5599be carefully noted. The SET type is an unordered array of ASN.1 types sorted by the TAG (type identifier), whereas the SET OF type is an ordered array of 5600a \textbf{single} ASN.1 object sorted in ascending order by the DER their respective encodings. 5601 5602\subsubsection{SET Encoding} 5603 5604SETs use the same array structure of ltc\_asn1\_list that the SEQUENCE functions use. They are encoded with the following function: 5605 5606\index{der\_encode\_set()} 5607\begin{verbatim} 5608int der_encode_set(ltc_asn1_list *list, 5609 unsigned long inlen, 5610 unsigned char *out, 5611 unsigned long *outlen); 5612\end{verbatim} 5613 5614This will encode the list of ASN.1 objects in \textit{list} of length \textit{inlen} objects, and store the output in \textit{out} of length \textit{outlen} bytes. 5615The function will make a copy of the list provided, and sort it by the TAG. Objects with identical TAGs are additionally sorted on their original placement in the 5616array (to make the process deterministic). 5617 5618This function will \textbf{NOT} recognize \textit{DEFAULT} objects, and it is the responsibility of the caller to remove them as required. 5619 5620\subsubsection{SET Decoding} 5621 5622The SET type can be decoded with the following function. 5623 5624\index{der\_decode\_set()} 5625\begin{verbatim} 5626int der_decode_set(const unsigned char *in, 5627 unsigned long inlen, 5628 ltc_asn1_list *list, 5629 unsigned long outlen); 5630\end{verbatim} 5631 5632This will decode the SET specified by \textit{list} of length \textit{outlen} objects from the input buffer \textit{in} of length \textit{inlen} octets. 5633 5634It handles the fact that SETs are not strictly ordered and will make multiple passes (as required) through the list to decode all the objects. 5635 5636\subsubsection{SET Length} 5637The length of a SET can be determined by calling der\_length\_sequence() since they have the same encoding length. 5638 5639\subsubsection{SET OF Encoding} 5640A \textit{SET OF} object is an array of identical objects (e.g. OCTET STRING) sorted in ascending order by the DER encoding of the object. They are 5641used to store objects deterministically based solely on their encoding. It uses the same array structure of ltc\_asn1\_list that the SEQUENCE functions 5642use. They are encoded with the following function. 5643 5644\index{der\_encode\_setof()} 5645\begin{verbatim} 5646int der_encode_setof(ltc_asn1_list *list, 5647 unsigned long inlen, 5648 unsigned char *out, 5649 unsigned long *outlen); 5650\end{verbatim} 5651 5652This will encode a \textit{SET OF} containing the \textit{list} of \textit{inlen} ASN.1 objects and store the encoding in the output buffer \textit{out} of length \textit{outlen}. 5653 5654The routine will first encode the SET OF in an unordered fashion (in a temporary buffer) then sort using the XQSORT macro and copy back to the output buffer. This 5655means you need at least enough memory to keep an additional copy of the output on the heap. 5656 5657\subsubsection{SET OF Decoding} 5658Since the decoding of a \textit{SET OF} object is unambiguous it can be decoded with der\_decode\_sequence(). 5659 5660\subsubsection{SET OF Length} 5661Like the SET type the der\_length\_sequence() function can be used to determine the length of a \textit{SET OF} object. 5662 5663\subsection{ASN.1 INTEGER} 5664 5665To encode or decode INTEGER data types use the following functions. 5666 5667\index{der\_encode\_integer()}\index{der\_decode\_integer()}\index{der\_length\_integer()} 5668\begin{verbatim} 5669int der_encode_integer( void *num, 5670 unsigned char *out, 5671 unsigned long *outlen); 5672 5673int der_decode_integer(const unsigned char *in, 5674 unsigned long inlen, 5675 void *num); 5676 5677int der_length_integer( void *num, 5678 unsigned long *len); 5679\end{verbatim} 5680 5681These will encode or decode a signed INTEGER data type using the bignum data type to store the large INTEGER. To encode smaller values without allocating 5682a bignum to store the value, the \textit{short} INTEGER functions were made available. 5683 5684\index{der\_encode\_short\_integer()}\index{der\_decode\_short\_integer()}\index{der\_length\_short\_integer()} 5685\begin{verbatim} 5686int der_encode_short_integer(unsigned long num, 5687 unsigned char *out, 5688 unsigned long *outlen); 5689 5690int der_decode_short_integer(const unsigned char *in, 5691 unsigned long inlen, 5692 unsigned long *num); 5693 5694int der_length_short_integer(unsigned long num, 5695 unsigned long *outlen); 5696\end{verbatim} 5697 5698These will encode or decode an unsigned \textbf{unsigned long} type (only reads upto 32--bits). For values in the range $0 \dots 2^{32} - 1$ the integer 5699and short integer functions can encode and decode each others outputs. 5700 5701\subsection{ASN.1 BIT STRING} 5702 5703\index{der\_encode\_bit\_string()}\index{der\_decode\_bit\_string()}\index{der\_length\_bit\_string()} 5704\begin{verbatim} 5705int der_encode_bit_string(const unsigned char *in, 5706 unsigned long inlen, 5707 unsigned char *out, 5708 unsigned long *outlen); 5709 5710int der_decode_bit_string(const unsigned char *in, 5711 unsigned long inlen, 5712 unsigned char *out, 5713 unsigned long *outlen); 5714 5715int der_length_bit_string(unsigned long nbits, 5716 unsigned long *outlen); 5717\end{verbatim} 5718 5719These will encode or decode a BIT STRING data type. The bits are passed in (or read out) using one \textbf{char} per bit. A non--zero value will be interpreted 5720as a one bit, and a zero value a zero bit. 5721 5722\subsection{ASN.1 RAW BIT STRING} 5723 5724\index{der\_encode\_raw\_bit\_string()}\index{der\_decode\_raw\_bit\_string()} 5725\begin{verbatim} 5726int der_encode_raw_bit_string(const unsigned char *in, 5727 unsigned long inlen, 5728 unsigned char *out, 5729 unsigned long *outlen); 5730 5731int der_decode_raw_bit_string(const unsigned char *in, 5732 unsigned long inlen, 5733 unsigned char *out, 5734 unsigned long *outlen); 5735\end{verbatim} 5736 5737These will encode or decode a BIT STRING data type. 5738The bits are passed in (or read out) using one \textbf{unsigned char} per 8 bit. 5739 5740This function differs from the normal BIT STRING, as it can be used to directly 5741process raw binary data and store it to resp. read it from an ASN.1 BIT STRING 5742data type. 5743 5744The length function is the same as for the normal BIT STRING \textit{der\_length\_bit\_string()}. 5745 5746\subsection{ASN.1 OCTET STRING} 5747 5748\index{der\_encode\_octet\_string()}\index{der\_decode\_octet\_string()}\index{der\_length\_octet\_string()} 5749\begin{verbatim} 5750int der_encode_octet_string(const unsigned char *in, 5751 unsigned long inlen, 5752 unsigned char *out, 5753 unsigned long *outlen); 5754 5755int der_decode_octet_string(const unsigned char *in, 5756 unsigned long inlen, 5757 unsigned char *out, 5758 unsigned long *outlen); 5759 5760int der_length_octet_string(unsigned long noctets, 5761 unsigned long *outlen); 5762\end{verbatim} 5763 5764These will encode or decode an OCTET STRING data type. The octets are stored using one \textbf{unsigned char} each. 5765 5766\subsection{ASN.1 OBJECT IDENTIFIER} 5767 5768\index{der\_encode\_object\_identifier()}\index{der\_decode\_object\_identifier()}\index{der\_length\_object\_identifier()} 5769\begin{verbatim} 5770int der_encode_object_identifier(unsigned long *words, 5771 unsigned long nwords, 5772 unsigned char *out, 5773 unsigned long *outlen); 5774 5775int der_decode_object_identifier(const unsigned char *in, 5776 unsigned long inlen, 5777 unsigned long *words, 5778 unsigned long *outlen); 5779 5780int der_length_object_identifier(unsigned long *words, 5781 unsigned long nwords, 5782 unsigned long *outlen); 5783\end{verbatim} 5784 5785These will encode or decode an OBJECT IDENTIFIER object. The words of the OID are stored in individual \textbf{unsigned long} elements, and must be in the range 5786$0 \ldots 2^{32} - 1$. 5787 5788\subsection{ASN.1 IA5 STRING} 5789 5790\index{der\_encode\_ia5\_string()}\index{der\_decode\_ia5\_string()}\index{der\_length\_ia5\_string()} 5791\begin{verbatim} 5792int der_encode_ia5_string(const unsigned char *in, 5793 unsigned long inlen, 5794 unsigned char *out, 5795 unsigned long *outlen); 5796 5797int der_decode_ia5_string(const unsigned char *in, 5798 unsigned long inlen, 5799 unsigned char *out, 5800 unsigned long *outlen); 5801 5802int der_length_ia5_string(const unsigned char *octets, 5803 unsigned long noctets, 5804 unsigned long *outlen); 5805\end{verbatim} 5806 5807These will encode or decode an IA5 STRING. The characters are read or stored in individual \textbf{char} elements. These functions performs internal character 5808to numerical conversions based on the conventions of the compiler being used. For instance, on an x86\_32 machine 'A' == 65 but the same may not be true on 5809say a SPARC machine. Internally, these functions have a table of literal characters and their numerical ASCII values. This provides a stable conversion provided 5810that the build platform honours the run--time platforms character conventions. 5811 5812\subsection{ASN.1 TELETEX STRING} 5813 5814\index{der\_decode\_teletex\_string()}\index{der\_length\_teletex\_string()} 5815\begin{verbatim} 5816int der_decode_teletex_string(const unsigned char *in, 5817 unsigned long inlen, 5818 unsigned char *out, 5819 unsigned long *outlen); 5820 5821int der_length_teletex_string(const unsigned char *octets, 5822 unsigned long noctets, 5823 unsigned long *outlen); 5824\end{verbatim} 5825 5826These will decode a TELETEX STRING. 5827The characters are read in individual \textbf{char} elements. 5828The internal structure is similar to that of the IA5 STRING implementation, to 5829be able to provide a stable conversion independent of the build-- and run--time 5830platform. 5831 5832\subsection{ASN.1 PRINTABLE STRING} 5833 5834\index{der\_encode\_printable\_string()}\index{der\_decode\_printable\_string()}\index{der\_length\_printable\_string()} 5835\begin{verbatim} 5836int der_encode_printable_string(const unsigned char *in, 5837 unsigned long inlen, 5838 unsigned char *out, 5839 unsigned long *outlen); 5840 5841int der_decode_printable_string(const unsigned char *in, 5842 unsigned long inlen, 5843 unsigned char *out, 5844 unsigned long *outlen); 5845 5846int der_length_printable_string(const unsigned char *octets, 5847 unsigned long noctets, 5848 unsigned long *outlen); 5849\end{verbatim} 5850 5851These will encode or decode an PRINTABLE STRING. The characters are read or stored in individual \textbf{char} elements. These functions performs internal character 5852to numerical conversions based on the conventions of the compiler being used. For instance, on an x86\_32 machine 'A' == 65 but the same may not be true on 5853say a SPARC machine. Internally, these functions have a table of literal characters and their numerical ASCII values. This provides a stable conversion provided 5854that the build platform honours the run-time platforms character conventions. 5855 5856\subsection{ASN.1 UTF8 STRING} 5857 5858\index{der\_encode\_utf8\_string()}\index{der\_decode\_utf8\_string()}\index{der\_length\_utf8\_string()} 5859\begin{verbatim} 5860int der_encode_utf8_string(const wchar_t *in, 5861 unsigned long inlen, 5862 unsigned char *out, 5863 unsigned long *outlen); 5864 5865int der_decode_utf8_string(const unsigned char *in, 5866 unsigned long inlen, 5867 wchar_t *out, 5868 unsigned long *outlen); 5869 5870int der_length_utf8_string(const wchar_t *octets, 5871 unsigned long noctets, 5872 unsigned long *outlen); 5873\end{verbatim} 5874 5875These will encode or decode an UTF8 STRING. The characters are read or stored in individual \textbf{wchar\_t} elements. These function performs no internal 5876mapping and treat the characters as literals. 5877 5878These functions use the \textbf{wchar\_t} type which is not universally available. In those cases, the library will typedef it to \textbf{unsigned long}. If you 5879intend to use the ISO C functions for working with wide--char arrays, you should make sure that wchar\_t has been defined previously. 5880 5881\subsection{ASN.1 UTCTIME} 5882 5883The UTCTIME type is to store a date and time in ASN.1 format. It uses the following structure to organize the time. 5884 5885\index{ltc\_utctime structure} 5886\begin{verbatim} 5887typedef struct { 5888 unsigned YY, /* year 00--99 */ 5889 MM, /* month 01--12 */ 5890 DD, /* day 01--31 */ 5891 hh, /* hour 00--23 */ 5892 mm, /* minute 00--59 */ 5893 ss, /* second 00--59 */ 5894 off_dir, /* timezone offset direction 0 == +, 1 == - */ 5895 off_hh, /* timezone offset hours */ 5896 off_mm; /* timezone offset minutes */ 5897} ltc_utctime; 5898\end{verbatim} 5899 5900The time can be offset plus or minus a set amount of hours (off\_hh) and minutes (off\_mm). When \textit{off\_dir} is zero, the time will be added otherwise it 5901will be subtracted. For instance, the array $\lbrace 5, 6, 20, 22, 4, 00, 0, 5, 0 \rbrace$ represents the current time of 5902\textit{2005, June 20th, 22:04:00} with a time offset of +05h00. 5903 5904\index{der\_encode\_utctime()}\index{der\_decode\_utctime()}\index{der\_length\_utctime()} 5905\begin{verbatim} 5906int der_encode_utctime( ltc_utctime *utctime, 5907 unsigned char *out, 5908 unsigned long *outlen); 5909 5910int der_decode_utctime(const unsigned char *in, 5911 unsigned long *inlen, 5912 ltc_utctime *out); 5913 5914int der_length_utctime( ltc_utctime *utctime, 5915 unsigned long *outlen); 5916\end{verbatim} 5917 5918The encoder will store time in one of the two ASN.1 formats, either \textit{YYMMDDhhmmssZ} or \textit{YYMMDDhhmmss$\pm$hhmm}, and perform minimal error checking on the 5919input. The decoder will read all valid ASN.1 formats and perform range checking on the values (not complete but rational) useful for catching packet errors. 5920 5921It is suggested that decoded data be further scrutinized (e.g. days of month in particular). 5922 5923\subsection{ASN.1 GeneralizedTime} 5924 5925The GeneralizedTime type is to store a date and time in ASN.1 format. It uses the following structure to organize the time. 5926 5927\index{ltc\_utctime structure} 5928\begin{verbatim} 5929typedef struct { 5930 unsigned YYYY, /* year 0--9999 */ 5931 MM, /* month 1--12 */ 5932 DD, /* day 1--31 */ 5933 hh, /* hour 0--23 */ 5934 mm, /* minute 0--59 */ 5935 ss, /* second 0--59 */ 5936 fs, /* fractional seconds 1--UINT_MAX */ 5937 off_dir, /* timezone offset direction 0 == +, 1 == - */ 5938 off_hh, /* timezone offset hours */ 5939 off_mm; /* timezone offset minutes */ 5940} ltc_generalizedtime; 5941\end{verbatim} 5942 5943The time can be offset plus or minus a set amount of hours (off\_hh) and minutes (off\_mm). When \textit{off\_dir} is zero, the time will be added otherwise it 5944will be subtracted. For instance, the array $\lbrace 2005, 6, 20, 22, 4, 0, 122, 0, 5, 0 \rbrace$ represents the current time of 5945\textit{2005, June 20th, 22:04:00.122} with a time offset of +05h00. 5946 5947\index{der\_encode\_utctime()}\index{der\_decode\_utctime()}\index{der\_length\_utctime()} 5948\begin{verbatim} 5949int der_encode_generalizedtime(ltc_generalizedtime *gtime, 5950 unsigned char *out, 5951 unsigned long *outlen); 5952 5953int der_decode_generalizedtime(const unsigned char *in, 5954 unsigned long *inlen, 5955 ltc_generalizedtime *out); 5956 5957int der_length_generalizedtime(ltc_generalizedtime *gtime, 5958 unsigned long *outlen); 5959\end{verbatim} 5960 5961The encoder will store time in one of the following ASN.1 formats, either \textit{YYYYMMDDhhmmssZ} or 5962\textit{YYYYMMDDhhmmss$\pm$hhmm} or\textit{YYYYMMDDhhmmss.fsZ} or \textit{YYYYMMDDhhmmss.fs$\pm$hhmm}, 5963and perform minimal error checking on the input. 5964The decoder will read all valid ASN.1 formats and perform range checking on the values (not complete but 5965rational) useful for catching packet errors. 5966 5967The fractional seconds are always added in case they are not $0$. 5968The implementation of fractional seconds is currently unreliable and you can't detect decoded 5969resp. encode leading $0$'s (e.g. \textit{20170424232717.005Z} would be decoded as 5970\textit{22. April 2017, 23:27:17.5}). 5971 5972It is suggested that decoded data be further scrutinized (e.g. days of month in particular). 5973 5974\subsection{ASN.1 CHOICE} 5975 5976The CHOICE ASN.1 type represents a union of ASN.1 types all of which are stored in a \textit{ltc\_asn1\_list}. There is no encoder for the CHOICE type, only a 5977decoder. The decoder will scan through the provided list attempting to use the appropriate decoder on the input packet. The list can contain any ASN.1 data 5978type\footnote{Except it cannot have LTC\_ASN1\_INTEGER and LTC\_ASN1\_SHORT\_INTEGER simultaneously.} except for other CHOICE types. 5979 5980There is no encoder for the CHOICE type as the actual DER encoding is the encoding of the chosen type. 5981 5982\index{der\_decode\_choice()} 5983\begin{verbatim} 5984int der_decode_choice(const unsigned char *in, 5985 unsigned long *inlen, 5986 ltc_asn1_list *list, 5987 unsigned long outlen); 5988\end{verbatim} 5989 5990This will decode the input in the \textit{in} field of length \textit{inlen}. It uses the provided ASN.1 list specified in the \textit{list} field which has 5991\textit{outlen} elements. The \textit{inlen} field will be updated with the length of the decoded data type, as well as the respective entry in the \textit{list} field 5992will have the \textit{used} flag set to non--zero to reflect it was the data type decoded. 5993 5994\subsection{ASN.1 Flexi Decoder} 5995The ASN.1 \textit{flexi} decoder allows the developer to decode arbitrary ASN.1 DER packets (provided they use data types LibTomCrypt supports) without first knowing 5996the structure of the data. Where der\_decode\_sequence() requires the developer to specify the data types to decode in advance the flexi decoder is entirely 5997free form. 5998 5999The flexi decoder uses the same \textit{ltc\_asn1\_list} but instead of being stored in an array it uses the linked list pointers \textit{prev}, \textit{next}, \textit{parent} 6000and \textit{child}. The list works as a \textit{doubly-linked list} structure where decoded items at the same level are siblings (using next and prev) and items 6001encoded in a SEQUENCE are stored as a child element. 6002 6003When a SEQUENCE or SET has been encountered a SEQUENCE (or SET resp.) item will be added as a sibling (e.g. list.type == LTC\_ASN1\_SEQUENCE) and the child 6004pointer points to a new list of items contained within the object. 6005 6006\index{der\_decode\_sequence\_flexi()} 6007\index{LTC\_ASN1\_CONSTRUCTED} 6008\index{LTC\_ASN1\_CONTEXT\_SPECIFIC} 6009\begin{verbatim} 6010int der_decode_sequence_flexi(const unsigned char *in, 6011 unsigned long *inlen, 6012 ltc_asn1_list **out); 6013\end{verbatim} 6014 6015This will decode items in the \textit{in} buffer of max input length \textit{inlen} and store the newly created pointer to the list in \textit{out}. This function allocates 6016all required memory for the decoding. It stores the number of octets read back into \textit{inlen}. 6017 6018The function will terminate when either it hits an invalid ASN.1 tag, or it reads \textit{inlen} octets. An early termination is a soft error, and returns 6019normally. The decoded list \textit{out} will point to the very first element of the list (e.g. both parent and prev pointers will be \textbf{NULL}). 6020 6021An invalid decoding will terminate the process, and free the allocated memory automatically. 6022 6023The flexi decoder calls itself when decoding a constructed type. This leads to 6024a 'child process' that will terminate when it decodes an unkown/invalid 6025identifier and leaves an allocated but uninitialized child element. 6026However the parent processing will continue with a "soft-error". 6027This can be detected by checking for \textit{child} elements with 6028type \textbf{LTC\_ASN1\_EOL} after decoding. 6029 6030As of v1.18.0 the flexi decoder will also decode arbitrary constructed types 6031other than SEQUENCE and SET. The \textit{type} field will be set to 6032\textbf{LTC\_ASN1\_CONSTRUCTED} and the plain identifier that was indicated in the ASN.1 6033encoding is stored in the \textit{used} field. Further decoding is done in the 6034same way as if it were a SEQUENCE or SET. 6035 6036Also as of v1.18.0 the flexi decoder is capable to handle 6037\textit{context-specific} encodings. The \textit{type} field will be set to 6038\textbf{LTC\_ASN1\_CONTEXT\_SPECIFIC} and the plain identifier that was indicated 6039in the ASN.1 encoding is stored in the \textit{used} field. Encapsulated data 6040in the \textit{context-specific} encoding is copied to newly allocated memory 6041and is accessible through the \textit{data} field. 6042 6043\textbf{Note:} the list decoded by this function is \textbf{NOT} in the correct form for der\_encode\_sequence() to use directly. You will first 6044have to convert the list by first storing all of the siblings in an array then storing all the children as sub-lists of a sequence using the \textit{.data} 6045pointer. Currently no function in LibTomCrypt provides this ability. 6046 6047\subsubsection{Sample Decoding} 6048Suppose we decode the following structure: 6049\begin{small} 6050\begin{verbatim} 6051User ::= SEQUENCE { 6052 Name IA5 STRING 6053 LoginToken SEQUENCE { 6054 passwdHash OCTET STRING 6055 pubkey ECCPublicKey 6056 } 6057 LastOn UTCTIME 6058} 6059\end{verbatim} 6060\end{small} 6061\begin{flushleft}and we decoded it with the following code:\end{flushleft} 6062 6063\begin{small} 6064\begin{verbatim} 6065unsigned char inbuf[MAXSIZE]; 6066unsigned long inbuflen; 6067ltc_asn1_list *list; 6068int err; 6069 6070/* somehow fill inbuf/inbuflen */ 6071if ((err = der_decode_sequence_flexi(inbuf, inbuflen, &list)) != CRYPT_OK) { 6072 printf("Error decoding: %s\n", error_to_string(err)); 6073 exit(EXIT_FAILURE); 6074} 6075\end{verbatim} 6076\end{small} 6077 6078At this point \textit{list} would point to the SEQUENCE identified by \textit{User}. It would have no sibblings (prev or next), and only a child node. Walking to the child 6079node with the following code will bring us to the \textit{Name} portion of the SEQUENCE: 6080\begin{small} 6081\begin{verbatim} 6082list = list->child; 6083\end{verbatim} 6084\end{small} 6085Now \textit{list} points to the \textit{Name} member (with the tag IA5 STRING). The \textit{data}, \textit{size}, and \textit{type} members of \textit{list} should reflect 6086that of an IA5 STRING. The sibbling will now be the \textit{LoginToken} SEQUENCE. The sibbling has a child node which points to the \textit{passwdHash} OCTET STRING. 6087We can walk to this node with the following code: 6088\begin{small} 6089\begin{verbatim} 6090/* list already pointing to 'Name' */ 6091list = list->next->child; 6092\end{verbatim} 6093\end{small} 6094At this point, \textit{list} will point to the \textit{passwdHash} member of the innermost SEQUENCE. This node has a sibbling, the \textit{pubkey} member of the SEQUENCE. 6095The \textit{LastOn} member of the SEQUENCE is a sibbling of the LoginToken node, if we wanted to walk there we would have to go up and over via: 6096\begin{small} 6097\begin{verbatim} 6098list = list->parent->next; 6099\end{verbatim} 6100\end{small} 6101At this point, we are pointing to the last node of the list. Lists are terminated in all directions by a \textbf{NULL} pointer. All nodes are doubly linked so that you 6102can walk up and down the nodes without keeping pointers lying around. 6103 6104 6105\subsubsection{Shrink'ing a Flexi List} 6106While decoding the flexi decoder will recursively decode an ASN.1 \textit{constructed} type it will store the decoded list 6107as well as the plain data that was decoded. 6108To free up this additional data a shrink function is provided. 6109 6110\index{der\_sequence\_shrink()} 6111\begin{verbatim} 6112void der_sequence_shrink(ltc_asn1_list *in); 6113\end{verbatim} 6114 6115This will free all the plain constructed data, but keep the decoded list intact. 6116 6117\subsubsection{Free'ing a Flexi List} 6118To free the list use the following function. 6119 6120\index{der\_sequence\_free()} 6121\begin{verbatim} 6122void der_sequence_free(ltc_asn1_list *in); 6123\end{verbatim} 6124 6125This will free all of the memory allocated by der\_decode\_sequence\_flexi(). 6126 6127\mysection{Password Based Cryptography} 6128\subsection{PKCS \#5} 6129\index{PKCS \#5} 6130In order to securely handle user passwords for the purposes of creating session keys and chaining IVs the PKCS \#5 was drafted. PKCS \#5 6131is made up of two algorithms, Algorithm One and Algorithm Two. Algorithm One is the older fairly limited algorithm which has been implemented 6132for completeness. Algorithm Two is a bit more modern and more flexible to work with. 6133 6134The OpenSSL project implemented an extension to Algorithm One that allows for arbitrary keylengths; we have a compatible implementation described below. 6135 6136\subsection{Algorithm One} 6137Algorithm One accepts as input a password, an 8--byte salt, and an iteration counter. The iteration counter is meant to act as delay for 6138people trying to brute force guess the password. The higher the iteration counter the longer the delay. This algorithm also requires a hash 6139algorithm and produces an output no longer than the output of the hash. 6140 6141\index{pkcs\_5\_alg1()} 6142\begin{alltt} 6143int pkcs_5_alg1(const unsigned char *password, 6144 unsigned long password_len, 6145 const unsigned char *salt, 6146 int iteration_count, 6147 int hash_idx, 6148 unsigned char *out, 6149 unsigned long *outlen) 6150\end{alltt} 6151Where \textit{password} is the user's password. Since the algorithm allows binary passwords you must also specify the length in \textit{password\_len}. 6152The \textit{salt} is a fixed size 8--byte array which should be random for each user and session. The \textit{iteration\_count} is the delay desired 6153on the password. The \textit{hash\_idx} is the index of the hash you wish to use in the descriptor table. 6154 6155The output of length up to \textit{outlen} is stored in \textit{out}. If \textit{outlen} is initially larger than the size of the hash functions output 6156it is set to the number of bytes stored. If it is smaller than not all of the hash output is stored in \textit{out}. 6157 6158\index{pkcs\_5\_alg1\_openssl()} 6159\begin{alltt} 6160int pkcs_5_alg1_openssl(const unsigned char *password, 6161 unsigned long password_len, 6162 const unsigned char *salt, 6163 int iteration_count, 6164 int hash_idx, 6165 unsigned char *out, 6166 unsigned long *outlen) 6167\end{alltt} 6168As above, but we generate as many bytes as requested in outlen per the OpenSSL extension to Algorithm One. If you are trying to be compatible with OpenSSL's EVP\_BytesToKey() or the "openssl enc" command line (or variants such as perl's Crypt::CBC), then use this function with MD5 as your hash (ick!) and iteration\_count=1 (double-ick!!). 6169\subsection{Algorithm Two} 6170 6171Algorithm Two is the recommended algorithm for this task. It allows variable length salts, and can produce outputs larger than the 6172hash functions output. As such, it can easily be used to derive session keys for ciphers and MACs as well initialization vectors as required 6173from a single password and invocation of this algorithm. 6174 6175\index{pkcs\_5\_alg2()} 6176\begin{alltt} 6177int pkcs_5_alg2(const unsigned char *password, 6178 unsigned long password_len, 6179 const unsigned char *salt, 6180 unsigned long salt_len, 6181 int iteration_count, 6182 int hash_idx, 6183 unsigned char *out, 6184 unsigned long *outlen) 6185\end{alltt} 6186Where \textit{password} is the users password. Since the algorithm allows binary passwords you must also specify the length in \textit{password\_len}. 6187The \textit{salt} is an array of size \textit{salt\_len}. It should be random for each user and session. The \textit{iteration\_count} is the delay desired 6188on the password. The \textit{hash\_idx} is the index of the hash you wish to use in the descriptor table. The output of length up to 6189\textit{outlen} is stored in \textit{out}. 6190 6191\begin{verbatim} 6192/* demo to show how to make session state material 6193 * from a password */ 6194#include <tomcrypt.h> 6195int main(void) 6196{ 6197 unsigned char password[100], salt[100], 6198 cipher_key[16], cipher_iv[16], 6199 mac_key[16], outbuf[48]; 6200 int err, hash_idx; 6201 unsigned long outlen, password_len, salt_len; 6202 6203 /* register hash and get it's idx .... */ 6204 6205 /* get users password and make up a salt ... */ 6206 6207 /* create the material (100 iterations in algorithm) */ 6208 outlen = sizeof(outbuf); 6209 if ((err = pkcs_5_alg2(password, password_len, salt, 6210 salt_len, 100, hash_idx, outbuf, 6211 &outlen)) 6212 != CRYPT_OK) { 6213 /* error handle */ 6214 } 6215 6216 /* now extract it */ 6217 memcpy(cipher_key, outbuf, 16); 6218 memcpy(cipher_iv, outbuf+16, 16); 6219 memcpy(mac_key, outbuf+32, 16); 6220 6221 /* use material (recall to store the salt in the output) */ 6222} 6223\end{verbatim} 6224 6225\mysection{Key Derviation Functions} 6226\subsection{HKDF} 6227\index{HKDF} 6228A key derivation function (KDF) is a basic and essential component of cryptographic systems. Its goal is to take some source of initial 6229keying material and derive from it one or more cryptographically strong secret keys. 6230 6231HKDF follows the "extract-then-expand" paradigm, where the KDF logically consists of two modules. The first stage takes the input 6232keying material and "extracts" from it a fixed-length pseudorandom key K. The second stage "expands" the key K into several additional 6233pseudorandom keys (the output of the KDF). 6234 6235In many applications, the input keying material is not necessarily distributed uniformly, and the attacker may have some partial 6236knowledge about it (for example, a Diffie-Hellman value computed by a key exchange protocol) or even partial control of it (as in some 6237entropy-gathering applications). Thus, the goal of the "extract" stage is to "concentrate" the possibly dispersed entropy of the input 6238keying material into a short, but cryptographically strong, pseudorandom key. In some applications, the input may already be a 6239good pseudorandom key; in these cases, the "extract" stage is not necessary, and the "expand" part can be used alone. 6240 6241The second stage "expands" the pseudorandom key to the desired length; the number and lengths of the output keys depend on the 6242specific cryptographic algorithms for which the keys are needed. 6243 6244\subsection{HKDF Extract} 6245To perform the extraction phase, use the following function: 6246 6247\index{hkdf\_extract()} 6248\begin{alltt} 6249int hkdf_extract( int hash_idx, 6250 const unsigned char *salt, 6251 unsigned long saltlen, 6252 const unsigned char *in, 6253 unsigned long inlen, 6254 unsigned char *out, 6255 unsigned long *outlen); 6256\end{alltt} 6257The \textit{hash\_idx} parameter is the index into the descriptor table of the hash you want to use. 6258The \textit{salt} parameter is a pointer to the array of octets of length \textit{saltlen} containing the salt or a NULL pointer if a salt is not being used (in that case set saltlen to 0). 6259\textit{in} is a pointer to an array of octets of length \textit{inlen} containing the source entropy. The extracted output is stored in the location pointed to by \textit{out}. 6260You must set \textit{outlen} to the size of the destination buffer before calling this function. It is updated to the length of the extracted output. If \textit{outlen} is too small the extracted output will be truncated. 6261 6262While the salt is optional, using one improves HKDF's security. If used, the salt should be randomly chosen, but does not need to be secret and may be re-used. Please see RFC5869 section 3.1 for more details. 6263 6264\subsection{HKDF Expand} 6265To perform the expansion phase, use the following function: 6266 6267\index{hkdf\_expand()} 6268\begin{alltt} 6269int hkdf_expand( int hash_idx, 6270 const unsigned char *info, 6271 unsigned long infolen, 6272 const unsigned char *in, 6273 unsigned long inlen, 6274 unsigned char *out, 6275 unsigned long outlen); 6276\end{alltt} 6277 6278The \textit{hash\_idx} parameter is the index into the descriptor table of the hash you want to use. 6279The \textit{info} parameter, an array of octets of length \textit{infolen}, is an optional parameter (set \textit{info} to NULL and \textit{infolen} to 0 if not using it) which 6280may be used to bind the derived keys to some application and context specific information. This prevents the same keying material from being generated in different contexts. Please see RFC5869 section 3.2 for more information. 6281The extracted keying material is passed as octet array \textit{in} of length \textit{inlen}. Expanded output of length \textit{outlen} is generated and stored in octet arrat \textit{out}. 6282 6283\subsection{HKDF Extract-and-Expand} 6284To perform both phases together, use the following function: 6285 6286\index{hkdf()} 6287\begin{alltt} 6288int hkdf( int hash_idx, 6289 const unsigned char *salt, 6290 unsigned long saltlen, 6291 const unsigned char *info, 6292 unsigned long infolen, 6293 const unsigned char *in, 6294 unsigned long inlen, 6295 unsigned char *out, 6296 unsigned long outlen); 6297\end{alltt} 6298 6299Parameters are as in \textit{hkdf\_extract()} and \textit{hkdf\_expand()}. 6300 6301\chapter{Miscellaneous} 6302\mysection{Base64 Encoding and Decoding} 6303The library provides functions to encode and decode a RFC 4648 Base64 coding scheme. 6304 6305\subsection{Standard 'base64' encoding} 6306The characters used in the mappings are: 6307\begin{verbatim} 6308ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 6309\end{verbatim} 6310Those characters are supported in the 7-bit ASCII map, which means they can be used for transport over 6311common e-mail, usenet and HTTP mediums. The format of an encoded stream is just a literal sequence of ASCII characters 6312where a group of four represent 24-bits of input. The first four chars of the encoders output is the length of the 6313original input. After the first four characters is the rest of the message. 6314 6315Often, it is desirable to line wrap the output to fit nicely in an e-mail or usenet posting. The decoder allows you to 6316put any character (that is not in the above sequence) in between any character of the encoders output. You may not however, 6317break up the first four characters. 6318 6319To encode a binary string in base64 call: 6320\index{base64\_encode()} 6321\begin{verbatim} 6322int base64_encode(const unsigned char *in, 6323 unsigned long len, 6324 unsigned char *out, 6325 unsigned long *outlen); 6326\end{verbatim} 6327Where \textit{in} is the binary string and \textit{out} is where the ASCII output is placed. You must set the value of \textit{outlen} prior 6328to calling this function and it sets the length of the base64 output in \textit{outlen} when it is done. To decode a base64 6329string call: 6330\index{base64\_decode()} 6331\begin{verbatim} 6332int base64_decode(const unsigned char *in, 6333 unsigned long len, 6334 unsigned char *out, 6335 unsigned long *outlen); 6336\end{verbatim} 6337 6338The function \textit{base64\_decode} works in a relaxed way which allows decoding some inputs that do not strictly follow the standard. 6339If you want to be strict during decoding you can use: 6340\index{base64\_strict\_decode()} 6341\begin{verbatim} 6342int base64_strict_decode(const unsigned char *in, 6343 unsigned long len, 6344 unsigned char *out, 6345 unsigned long *outlen); 6346\end{verbatim} 6347 6348\subsection{URL--safe 'base64url' encoding} 6349The characters used in the mappings are: 6350\begin{verbatim} 6351ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ 6352\end{verbatim} 6353Those characters are sometimes also called URL and filename safe alphabet. 6354The interface is analogous to \textit{base64\_xxxx} functions in previous chapter. 6355 6356\begin{verbatim} 6357int base64url_encode(const unsigned char *in, unsigned long len, 6358 unsigned char *out, unsigned long *outlen); 6359 6360int base64url_strict_encode(const unsigned char *in, unsigned long inlen, 6361 unsigned char *out, unsigned long *outlen); 6362 6363int base64url_decode(const unsigned char *in, unsigned long len, 6364 unsigned char *out, unsigned long *outlen); 6365 6366int base64url_strict_decode(const unsigned char *in, unsigned long len, 6367 unsigned char *out, unsigned long *outlen); 6368\end{verbatim} 6369 6370\mysection{Primality Testing} 6371\index{Primality Testing} 6372The library includes primality testing and random prime functions as well. The primality tester will perform the test in 6373two phases. First it will perform trial division by the first few primes. Second it will perform \textit{LTC\_MILLER\_RABIN\_REPS} (pre-defined to $35$) rounds of the 6374Rabin-Miller primality testing algorithm. If the candidate passes both phases it is declared prime otherwise it is declared 6375composite. No prime number will fail the two phases but composites can. Each round of the Rabin-Miller algorithm reduces 6376the probability of a pseudo-prime by $1 \over 4$ therefore after sixteen rounds the probability is no more than 6377$\left ( { 1 \over 4 } \right )^{8} = 2^{-16}$. In practice the probability of error is in fact much lower than that. 6378 6379When making random primes the trial division step is in fact an optimized implementation of \textit{Implementation of Fast RSA Key Generation on Smart Cards}\footnote{Chenghuai Lu, Andre L. M. dos Santos and Francisco R. Pimentel}. 6380In essence a table of machine-word sized residues are kept of a candidate modulo a set of primes. When the candidate 6381is rejected and ultimately incremented to test the next number the residues are updated without using multi-word precision 6382math operations. As a result the routine can scan ahead to the next number required for testing with very little work 6383involved. 6384 6385In the event that a composite did make it through it would most likely cause the the algorithm trying to use it to fail. For 6386instance, in RSA two primes $p$ and $q$ are required. The order of the multiplicative sub-group (modulo $pq$) is given 6387as $\phi(pq)$ or $(p - 1)(q - 1)$. The decryption exponent $d$ is found as $de \equiv 1\mbox{ }(\mbox{mod } \phi(pq))$. If either $p$ or $q$ is composite the value of $d$ will be incorrect and the user 6388will not be able to sign or decrypt messages at all. Suppose $p$ was prime and $q$ was composite this is just a variation of 6389the multi-prime RSA. Suppose $q = rs$ for two primes $r$ and $s$ then $\phi(pq) = (p - 1)(r - 1)(s - 1)$ which clearly is 6390not equal to $(p - 1)(rs - 1)$. 6391 6392These are not technically part of the LibTomMath library but this is the best place to document them. 6393To test if a \textit{mp\_int} is prime call: 6394\begin{verbatim} 6395int is_prime(mp_int *N, int *result); 6396\end{verbatim} 6397This puts a one in \textit{result} if the number is probably prime, otherwise it places a zero in it. It is assumed that if 6398it returns an error that the value in \textit{result} is undefined. To make 6399a random prime call: 6400\begin{verbatim} 6401int rand_prime( mp_int *N, 6402 unsigned long len, 6403 prng_state *prng, 6404 int wprng); 6405\end{verbatim} 6406Where \textit{len} is the size of the prime in bytes ($2 \le len \le 256$). You can set \textit{len} to the negative size you want 6407to get a prime of the form $p \equiv 3\mbox{ }(\mbox{mod } 4)$. So if you want a 1024-bit prime of this sort pass 6408\textit{len = -128} to the function. Upon success it will return {\bf CRYPT\_OK} and \textit{N} will contain an integer which 6409is very likely prime. 6410 6411\mysection{Random MPI Generation} 6412\index{Random MPI Generation} 6413 6414Several Public Key Cryptography algorithms require random MPI's for operations like signature generation. 6415The library provides two API functions to generate random MPI's which allow the utilisation of a user-defined PRNG to aquire the random data. 6416 6417\index{rand\_bn\_bits()} 6418\begin{verbatim} 6419int rand_bn_bits( void *N, 6420 int bits, 6421 prng_state *prng, 6422 int wprng); 6423\end{verbatim} 6424 6425This sets \textit{N} to a \textit{bits}-long random MPI. 6426 6427\index{rand\_bn\_upto()} 6428\begin{verbatim} 6429int rand_bn_upto( void *N, 6430 void *limit, 6431 prng_state *prng, 6432 int wprng); 6433\end{verbatim} 6434 6435This ensures that \textit{N} is set to a random MPI in the range $1 \le N < limit$. 6436 6437 6438\mysection{Helper functions} 6439 6440\subsection{Zero'ing data} 6441 6442As widely know optimizing-compilers are sometimes allowed to remove an invocation of \textit{memset(out, 0, outlen)}, which could result 6443in sensitive data beeing not zero'ed out. Therefore LibTomCrypt implements a variant of this routine which won't be optimized-away. 6444 6445\index{zeromem()} 6446\begin{verbatim} 6447void zeromem(volatile void *out, size_t outlen); 6448\end{verbatim} 6449 6450This zero's the buffer \textit{out} of size \textit{outlen}. 6451 6452\subsection{Constant-time memory compare} 6453 6454Some symmetric-key cryptographic operation-modes are vulnerable to timing attacks in case non-contant-time memory comparison functions 6455are used to compare results. Therefore LibTomCrypt implements a constant-time memory compare function. 6456 6457\index{mem\_neq()} 6458\begin{verbatim} 6459int mem_neq(const void *a, const void *b, size_t len); 6460\end{verbatim} 6461 6462This will compare the buffer \textit{a} against the buffer \textit{b} for \textit{len} bytes. 6463The return value is either \textit{0} when the content of \textit{a} and \textit{b} is equal or \textit{1} when it differs. 6464 6465\subsection{Radix to binary conversion} 6466 6467All public-key cryptographic algorithms provide a way to import and/or export their key parameters in binary format. 6468In order to be able to import keys stored in different formats, e.g. hexadecimal strings, the \textit{radix\_to\_bin()} function is provided. 6469 6470\index{radix\_to\_bin()} 6471\begin{verbatim} 6472int radix_to_bin(const void *in, int radix, void *out, unsigned long *len); 6473\end{verbatim} 6474 6475This will convert the MPI \textit{in} of radix \textit{radix} to the buffer pointed to by \textit{out}. 6476The field \textit{len} is a pointer to the length of the buffer on input and the length stored on output. 6477 6478In case you don't know the length of the buffer you can use \textit{radix\_to\_bin()} to determine the length for you. 6479 6480\begin{verbatim} 6481#include <tomcrypt.h> 6482 6483int main(void) 6484{ 6485 const char *mpi = "AABBCCDD"; 6486 unsigned long l = 0; 6487 void* buf; 6488 int ret; 6489 ltc_mp = ltm_desc; 6490 6491 if (radix_to_bin(mpi, 16, NULL, &l) != CRYPT_BUFFER_OVERFLOW) 6492 return EXIT_FAILURE; 6493 buf = malloc(l); 6494 6495 ret = EXIT_SUCCESS; 6496 if (radix_to_bin(mpi, 16, buf, &l) != CRYPT_OK) 6497 ret = EXIT_FAILURE; 6498 6499 free(buf); 6500 return ret; 6501} 6502\end{verbatim} 6503 6504 6505\mysection{Dynamic Language Support} 6506\index{Dynamic Language Support} 6507Various LibTomCrypt functions require that their callers define a struct 6508(or a union) and provide a pointer to it, or allocate sufficient memory and 6509provide its pointer. Programs written in C or C++ can obtain the necessary 6510information by simply including the appropriate header files, but dynamic 6511languages like Python don't understand C header files, and without assistance, 6512have no way to know how much memory to allocate. A similar story can be told 6513for certain LTC constant values. 6514 6515LTC's Dynamic Language Support provides functions that return the size of 6516a named struct or union, the value of a named constant, a list of all sizes 6517supported, and a list of all named constants supported. Two additional 6518functions can initialize LTM and TFM. 6519 6520To get the size of a named struct or union: 6521\begin{verbatim} 6522int crypt_get_size( const char *namein, 6523 unsigned int *sizeout); 6524\end{verbatim} 6525$namein$ is spelled exactly as found in the C header files. This function will 6526return -1 if $namein$ is not found. 6527 6528To get the value of a named constant: 6529\begin{verbatim} 6530int crypt_get_constant(const char *namein, 6531 int *valueout); 6532\end{verbatim} 6533$namein$ is spelled exactly as found in the C header files. Again, -1 is 6534returned if $namein$ is not found. 6535 6536To get the names of all the supported structs, unions and constants: 6537\begin{verbatim} 6538int crypt_list_all_sizes( char *names_list, 6539 unsigned int *names_list_size); 6540 6541int crypt_list_all_constants( char *names_list, 6542 unsigned int *names_list_size); 6543\end{verbatim} 6544You may want to call these functions twice, first to get the amount 6545of memory to be allocated for the $names_list$, and a final time to 6546actually populate $names_list$. If $names_list$ is NULL, 6547$names_list_size$ will be the minimum size needed to receive the 6548complete $names_list$. If $names_list$ is NOT NULL, $names_list$ must 6549be a pointer to sufficient memory into which the $names_list$ will be 6550written. Also, the value in $names_list_size$ sets the upper bound of 6551the number of characters to be written. A -1 return value signifies 6552insufficient space. 6553 6554The format of the $names_list$ string is a series of $name,value$ pairs 6555where each name and value is separated by a comma, the pairs are separated 6556by newlines, and the list is null terminated. 6557 6558Calling either of these functions will initialize the respective 6559math library. 6560\begin{verbatim} 6561void init_LTM(void); 6562void init_TFM(void); 6563void init_GMP(void); 6564\end{verbatim} 6565 6566Here is a Python program demonstrating how to call various LTC dynamic 6567language support functions. 6568\begin{verbatim} 6569from ctypes import * 6570 6571# load the OSX shared/dynamic library 6572LIB = CDLL('libtomcrypt.dylib') 6573 6574# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6575# print info about this library 6576 6577little = c_int() # assume False is big 6578word32 = c_int() # assume False is 64-bit 6579 6580LIB.crypt_get_constant('ENDIAN_LITTLE', byref(little)) 6581LIB.crypt_get_constant('ENDIAN_32BITWORD', byref(word32)) 6582 6583print('this lib was compiled for a %s endian %d-bit processor' 6584 % ('little' if little else 'big', 32 if word32 else 64)) 6585 6586# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6587# print the size of the struct named "sha256_state" 6588 6589struct_size = c_int() 6590 6591# don't forget to add the '_struct' or '_union' suffix 6592LIB.crypt_get_size('sha256_state_struct', byref(struct_size)) 6593 6594print('allocate %d bytes for sha256_state' % struct_size.value) 6595 6596# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6597# print a list of all supported named constants 6598 6599list_size = c_int() 6600 6601# call with NULL to calc the min size needed for the list 6602LIB.crypt_list_all_constants(None, byref(list_size)) 6603 6604# allocate required space 6605names_list = c_buffer(list_size.value) 6606 6607# call again providing a pointer to where to write the list 6608LIB.crypt_list_all_constants(names_list, byref(list_size)) 6609 6610print(names_list.value) 6611 6612# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6613# print a list of all supported named structs and unions 6614 6615list_size = c_int() 6616 6617# call with NULL to calc the min size needed for the list 6618LIB.crypt_list_all_sizes(None, byref(list_size)) 6619 6620# allocate required space 6621names_list = c_buffer(list_size.value) 6622 6623# call again providing a pointer to where to write the list 6624LIB.crypt_list_all_sizes(names_list, byref(list_size)) 6625 6626print(names_list.value) 6627\end{verbatim} 6628 6629 6630\chapter{Programming Guidelines} 6631 6632\mysection{Secure Pseudo Random Number Generators} 6633Probably the single most vulnerable point of any cryptosystem is the PRNG. Without one, generating and protecting secrets 6634would be impossible. The requirement that one be setup correctly is vitally important, and to address this point the library 6635does provide two RNG sources that will address the largest amount of end users as possible. The \textit{sprng} PRNG provides an easy to 6636access source of entropy for any application on a UNIX (and the like) or Windows computer. 6637 6638However, when the end user is not on one of these platforms, the application developer must address the issue of finding 6639entropy. This manual is not designed to be a text on cryptography. I would just like to highlight that when you design 6640a cryptosystem make sure the first problem you solve is getting a fresh source of entropy. 6641 6642\mysection{Preventing Trivial Errors} 6643Two simple ways to prevent trivial errors is to prevent overflows, and to check the return values. All of the functions 6644which output variable length strings will require you to pass the length of the destination. If the size of your output 6645buffer is smaller than the output it will report an error. Therefore, make sure the size you pass is correct! 6646 6647Also, virtually all of the functions return an error code or {\bf CRYPT\_OK}. You should detect all errors, as simple 6648typos can cause algorithms to fail to work as desired. 6649 6650\mysection{Registering Your Algorithms} 6651To avoid linking and other run--time errors it is important to register the ciphers, hashes and PRNGs you intend to use 6652before you try to use them. This includes any function which would use an algorithm indirectly through a descriptor table. 6653 6654A neat bonus to the registry system is that you can add external algorithms that are not part of the library without 6655having to hack the library. For example, suppose you have a hardware specific PRNG on your system. You could easily 6656write the few functions required plus a descriptor. After registering your PRNG, all of the library functions that 6657need a PRNG can instantly take advantage of it. The same applies for ciphers, hashes, and bignum math routines. 6658 6659\mysection{Key Sizes} 6660 6661\subsection{Symmetric Ciphers} 6662For symmetric ciphers, use as large as of a key as possible. For the most part \textit{bits are cheap} so using a 256--bit key 6663is not a hard thing to do. As a good rule of thumb do not use a key smaller than 128 bits. 6664 6665\subsection{Asymmetric Ciphers} 6666The following chart gives the work factor for solving a DH/RSA public key using the NFS. The work factor for a key of order 6667$n$ is estimated to be 6668\begin{equation} 6669e^{1.923 \cdot ln(n)^{1 \over 3} \cdot ln(ln(n))^{2 \over 3}} 6670\end{equation} 6671 6672Note that $n$ is not the bit-length but the magnitude. For example, for a 1024-bit key $n = 2^{1024}$. The work required 6673is: 6674\begin{figure}[H] 6675\begin{center} 6676\begin{tabular}{|c|c|} 6677 \hline RSA/DH Key Size (bits) & Work Factor ($log_2$) \\ 6678 \hline 512 & 63.92 \\ 6679 \hline 768 & 76.50 \\ 6680 \hline 1024 & 86.76 \\ 6681 \hline 1536 & 103.37 \\ 6682 \hline 2048 & 116.88 \\ 6683 \hline 2560 & 128.47 \\ 6684 \hline 3072 & 138.73 \\ 6685 \hline 4096 & 156.49 \\ 6686 \hline 6687\end{tabular} 6688\end{center} 6689\caption{RSA/DH Key Strength} 6690\end{figure} 6691 6692The work factor for ECC keys is much higher since the best attack is still fully exponential. Given a key of magnitude 6693$n$ it requires $\sqrt n$ work. The following table summarizes the work required: 6694\begin{figure}[H] 6695\begin{center} 6696\begin{tabular}{|c|c|} 6697 \hline ECC Key Size (bits) & Work Factor ($log_2$) \\ 6698 \hline 112 & 56 \\ 6699 \hline 128 & 64 \\ 6700 \hline 160 & 80 \\ 6701 \hline 192 & 96 \\ 6702 \hline 224 & 112 \\ 6703 \hline 256 & 128 \\ 6704 \hline 384 & 192 \\ 6705 \hline 521 & 260.5 \\ 6706 \hline 6707\end{tabular} 6708\end{center} 6709\caption{ECC Key Strength} 6710\end{figure} 6711 6712Using the above tables the following suggestions for key sizes seems appropriate: 6713\begin{center} 6714\begin{tabular}{|c|c|c|} 6715 \hline Security Goal & RSA/DH Key Size (bits) & ECC Key Size (bits) \\ 6716 \hline Near term & 1024 & 160 \\ 6717 \hline Short term & 1536 & 192 \\ 6718 \hline Long Term & 2560 & 384 \\ 6719 \hline 6720\end{tabular} 6721\end{center} 6722 6723\mysection{Thread Safety} 6724The library is not fully thread safe but several simple precautions can be taken to avoid any problems. The registry functions 6725such as register\_cipher() are not thread safe no matter what you do. It is best to call them from your programs initialization 6726code before threads are initiated. 6727 6728The rest of the code uses state variables you must pass it such as hash\_state, hmac\_state, etc. This means that if each 6729thread has its own state variables then they will not affect each other, and are fully thread safe. This is fairly simple with symmetric ciphers 6730and hashes. 6731 6732\index{LTC\_PTHREAD} 6733The only sticky issue is a shared PRNG which can be alleviated with the careful use of mutex devices. Defining LTC\_PTHREAD for instance, enables 6734pthreads based mutex locking in various routines such as the Yarrow and Fortuna PRNGs, the fixed point ECC multiplier, and other routines. 6735 6736\chapter{Configuring and Building the Library} 6737\mysection{Introduction} 6738The library is fairly flexible about how it can be built, used, and generally distributed. Additions are being made with 6739each new release that will make the library even more flexible. Each of the classes of functions can be disabled during 6740the build process to make a smaller library. This is particularly useful for shared libraries. 6741 6742As of v1.06 of the library, the build process has been moved to two steps for the typical LibTomCrypt application. This is because 6743LibTomCrypt no longer provides a math API on its own and relies on third party libraries (such as LibTomMath, GnuMP, or TomsFastMath). 6744 6745The build process now consists of installing a math library first, and then building and installing LibTomCrypt with a math library 6746configured. Note that LibTomCrypt can be built with no internal math descriptors. This means that one must be provided at either 6747build, or run time for the application. LibTomCrypt comes with three math descriptors that provide a standard interface to math 6748libraries. 6749 6750\mysection{Makefile variables} 6751 6752All GNU driven makefiles (including the makefile for ICC) use a set of common variables to control the build and install process. Most of the 6753settings can be overwritten from the command line which makes custom installation a breeze. 6754 6755\subsection{MAKE, CC, AR and CROSS\_COMPILE} 6756\index{MAKE} \index{CC} \index{AR} \index{CROSS\_COMPILE} 6757The MAKE, CC and AR flags can all be overwritten. They default to \textit{make}, \textit{\$CC} and \textit{\$AR} respectively. 6758Changing MAKE allows you to change what program will be invoked to handle sub--directories. For example, this 6759 6760\begin{verbatim} 6761gmake install MAKE=gmake 6762\end{verbatim} 6763 6764\begin{flushleft} will build and install the libraries with the \textit{gmake} tool. Similarly, \end{flushleft} 6765 6766\begin{verbatim} 6767make CC=arm-gcc AR=arm-ar 6768\end{verbatim} 6769 6770\begin{flushleft} will build the library using \textit{arm--gcc} as the compiler and \textit{arm--ar} as the archiver. \end{flushleft} 6771 6772\begin{verbatim} 6773make CROSS_COMPILE=arm-none-eabi- 6774\end{verbatim} 6775 6776\begin{flushleft} will build the library using the \textit{arm--none--eabi--} prefix'ed toolchain. \end{flushleft} 6777 6778\subsection{IGNORE\_SPEED and LTC\_DEBUG} 6779\index{IGNORE\_SPEED} \index{LTC\_DEBUG} 6780When \textbf{IGNORE\_SPEED} has been defined the default optimization flags for CFLAGS will be disabled which allows the developer to specify new 6781CFLAGS on the command line. E.g. to add debugging 6782 6783\begin{verbatim} 6784make IGNORE_SPEED=1 CFLAGS="-g3" 6785\end{verbatim} 6786 6787This will turn off optimizations and add \textit{-g3} to the CFLAGS which enables debugging. 6788 6789Alternatively one can define \textbf{LTC\_DEBUG} instead, which additionally defines \textit{LTC\_NO\_ASM} and enables debug output on test failures. 6790 6791Defining \textit{LTC\_DEBUG=2} has the effect to enable verbose output in some of the tests. 6792 6793\begin{verbatim} 6794make LTC_DEBUG=2 6795\end{verbatim} 6796 6797\begin{flushleft} will build the library without compiler-optimisation or architecture specific code and will enable debugging 6798and verbose debug output. \end{flushleft} 6799 6800\subsection{LIBNAME} 6801\index{LIBNAME} 6802\textbf{LIBNAME} is the name of the output library (archive) to create. It defaults to \textit{libtomcrypt.a} for static builds and \textit{libtomcrypt.la} for 6803shared. 6804On installation of the shared library the appropriately versioned \textit{libtomcrypt.so}, \textit{libtomcrypt.so.0} etc. will be created by \textit{libtool}. 6805 6806\subsection{Installation Directories} 6807\index{DESTDIR} \index{PREFIX} \index{LIBPATH} \index{INCPATH} \index{DATAPATH} \index{BINPATH} 6808\textbf{DESTDIR} is the location where the output will be stored. It default to an empty string. 6809\textbf{PREFIX} is the prefix for the installation directories. It defaults to \textit{/usr/local}. 6810\textbf{LIBPATH} is the location of the library directory which defaults to \textit{\$PREFIX/lib}. 6811\textbf{INCPATH} is the location of the header file directory which defaults to \textit{\$PREFIX/include}. 6812\textbf{DATAPATH} is the location of the data (documentation) directory which defaults to \textit{\$PREFIX/share/doc/libtomcrypt/pdf}. 6813\textbf{BINPATH} is the location of the binary file directory which defaults to \textit{\$PREFIX/bin}. 6814 6815They allow to configure the installation locations of the libary. 6816 6817\begin{verbatim} 6818make PREFIX=/home/tom/project DATAPATH=/home/tom/project/docs install 6819\end{verbatim} 6820 6821This will build the library and install it to the directories under \textit{/home/tom/project/}. e.g. 6822 6823\begin{small} 6824\begin{verbatim} 6825/home/tom/project/: 6826total 1 6827drwxr-xr-x 2 tom users 80 Jul 30 16:02 docs 6828drwxr-xr-x 2 tom users 528 Jul 30 16:02 include 6829drwxr-xr-x 2 tom users 80 Jul 30 16:02 lib 6830 6831/home/tom/project/docs: 6832total 452 6833-rwxr-xr-x 1 tom users 459009 Jul 30 16:02 crypt.pdf 6834 6835/home/tom/project/include: 6836total 132 6837-rwxr-xr-x 1 tom users 2482 Jul 30 16:02 tomcrypt.h 6838-rwxr-xr-x 1 tom users 702 Jul 30 16:02 tomcrypt_argchk.h 6839-rwxr-xr-x 1 tom users 2945 Jul 30 16:02 tomcrypt_cfg.h 6840-rwxr-xr-x 1 tom users 22763 Jul 30 16:02 tomcrypt_cipher.h 6841-rwxr-xr-x 1 tom users 5174 Jul 30 16:02 tomcrypt_custom.h 6842-rwxr-xr-x 1 tom users 11314 Jul 30 16:02 tomcrypt_hash.h 6843-rwxr-xr-x 1 tom users 11571 Jul 30 16:02 tomcrypt_mac.h 6844-rwxr-xr-x 1 tom users 13614 Jul 30 16:02 tomcrypt_macros.h 6845-rwxr-xr-x 1 tom users 14714 Jul 30 16:02 tomcrypt_math.h 6846-rwxr-xr-x 1 tom users 632 Jul 30 16:02 tomcrypt_misc.h 6847-rwxr-xr-x 1 tom users 10934 Jul 30 16:02 tomcrypt_pk.h 6848-rwxr-xr-x 1 tom users 2634 Jul 30 16:02 tomcrypt_pkcs.h 6849-rwxr-xr-x 1 tom users 7067 Jul 30 16:02 tomcrypt_prng.h 6850-rwxr-xr-x 1 tom users 1467 Jul 30 16:02 tomcrypt_test.h 6851 6852/home/tom/project/lib: 6853total 1073 6854-rwxr-xr-x 1 tom users 1096284 Jul 30 16:02 libtomcrypt.a 6855\end{verbatim} 6856\end{small} 6857 6858For further information see: \url{https://www.gnu.org/prep/standards/html_node/DESTDIR.html} 6859and \url{https://www.freebsd.org/doc/en/books/porters-handbook/porting-prefix.html}. 6860 6861\mysection{Extra libraries} 6862\index{EXTRALIBS} 6863\textbf{EXTRALIBS} specifies any extra libraries required to link the test programs and shared libraries. They are specified in the notation 6864that GCC expects for global archives. 6865 6866\begin{verbatim} 6867make install test timing CFLAGS="-DTFM_DESC -DUSE_TFM" EXTRALIBS=-ltfm 6868\end{verbatim} 6869 6870This will install the library using the TomsFastMath library and link the \textit{libtfm.a} library out of the default library search path. The two 6871defines are explained below. You can specify multiple archives (say if you want to support two math libraries, or add on additional code) to 6872the \textbf{EXTRALIBS} variable by separating them by a space. 6873 6874Note that \textbf{EXTRALIBS} is not required if you are only making and installing the static library but none of the test programs. 6875 6876\mysection{Building a Static Library} 6877 6878Building a static library is fairly trivial as it only requires one invocation of the GNU make command. 6879 6880\begin{verbatim} 6881make install CFLAGS="-DTFM_DESC" 6882\end{verbatim} 6883 6884That will build LibTomCrypt (including the TomsFastMath descriptor), and install it in the default locations indicated previously. You can enable 6885the built--in LibTomMath descriptor as well (or in place of the TomsFastMath descriptor). Similarly, you can build the library with no built--in 6886math descriptors. 6887 6888\begin{verbatim} 6889make install 6890\end{verbatim} 6891 6892In this case, no math descriptors are present in the library and they will have to be made available at build or run time before you can use any of the 6893public key functions. 6894 6895Note that even if you include the built--in descriptors you must link against the source library as well. 6896 6897\begin{verbatim} 6898gcc -DTFM_DESC myprogram.c -ltomcrypt -ltfm -o myprogram 6899\end{verbatim} 6900 6901This will compile \textit{myprogram} and link it against the LibTomCrypt library as well as TomsFastMath (which must have been previously installed). Note that 6902we define \textbf{TFM\_DESC} for compilation. This is so that the TFM descriptor symbol will be defined for the client application to make use of without 6903giving warnings. 6904 6905\mysection{Building a Shared Library} 6906 6907LibTomCrypt can also be built as a shared library through the \textit{makefile.shared} make script. It is similar to use as the static script except 6908that you \textbf{must} specify the \textbf{EXTRALIBS} variable at install time. 6909 6910\begin{verbatim} 6911make -f makefile.shared install CFLAGS="-DTFM_DESC" EXTRALIBS=-ltfm 6912\end{verbatim} 6913 6914This will build and install the library and link the shared object against the TomsFastMath library (which must be installed as a shared object as well). The 6915shared build process requires libtool to be installed. 6916 6917\mysection{Header Configuration} 6918The file \textit{tomcrypt\_cfg.h} is what lets you control various high level macros which control the behaviour of the library. Build options are also 6919stored in \textit{tomcrypt\_custom.h} which allow the enabling and disabling of various algorithms. 6920 6921\subsubsection{ARGTYPE} 6922This lets you control how the LTC\_ARGCHK macro will behave. The macro is used to check pointers inside the functions against 6923NULL. There are four settings for ARGTYPE. When set to 0, it will have the default behaviour of printing a message to 6924stderr and raising a SIGABRT signal. This is provided so all platforms that use LibTomCrypt can have an error that functions 6925similarly. When set to 1, it will simply pass on to the assert() macro. When set to 2, the macro will display the error to 6926stderr then return execution to the caller. This could lead to a segmentation fault (e.g. when a pointer is \textbf{NULL}) but is useful 6927if you handle signals on your own. When set to 3, it will resolve to a empty macro and no error checking will be performed. Finally, when set 6928to 4, it will return CRYPT\_INVALID\_ARG to the caller. 6929 6930\subsubsection{Endianness} 6931There are five macros related to endianness issues. For little endian platforms define, \textbf{ENDIAN\_LITTLE}. For big endian 6932platforms define \textbf{ENDIAN\_BIG}. Similarly when the default word size of an \textit{unsigned long} is 32-bits define \textbf{ENDIAN\_32BITWORD} 6933or define \textbf{ENDIAN\_64BITWORD} when its 64-bits. If you do not define any of them the library will automatically use \textbf{ENDIAN\_NEUTRAL} 6934which will work on all platforms. 6935 6936Currently LibTomCrypt will detect x86-32, x86-64, MIPS R5900, SPARC and SPARC64 running GCC as well as x86-32 running MSVC. 6937 6938\mysection{Customisation} 6939There are also options you can specify from the \textit{tomcrypt\_custom.h} header file. 6940 6941\subsection{X memory routines} 6942\index{XMALLOC}\index{XREALLOC}\index{XCALLOC}\index{XFREE}\index{XMEMSET}\index{XMEMCPY}\index{XMEMMOVE}\index{XMEMCMP}\index{XSTRCMP} 6943At the top of tomcrypt\_custom.h are a series of macros denoted as XMALLOC, XCALLOC, XREALLOC, XFREE, and so on. They resolve to 6944the name of the respective functions from the standard C library by default. This lets you substitute in your own memory routines. 6945If you substitute in your own functions they must behave like the standard C library functions in terms of what they expect as input and 6946output. 6947 6948These macros are handy for working with platforms which do not have a standard C library. 6949For instance, the OLPC\footnote{See \url{http://dev.laptop.org/git?p=bios-crypto;a=summary}} 6950bios code uses these macros to redirect to very compact heap and string operations. 6951 6952\subsection{X clock routines} 6953The rng\_get\_bytes() function can call a function that requires the clock() function. These macros let you override 6954the default clock() used with a replacement. By default the standard C library clock() function is used. 6955 6956\subsection{LTC\_NO\_FILE} 6957During the build if LTC\_NO\_FILE is defined then any function in the library that uses file I/O will not call the file I/O 6958functions and instead simply return CRYPT\_NOP. This should help resolve any linker errors stemming from a lack of 6959file I/O on embedded platforms. 6960 6961\subsection{LTC\_CLEAN\_STACK} 6962When this functions is defined the functions that store key material on the stack will clean up afterwards. 6963Assumes that you have no memory paging with the stack. 6964 6965\subsection{LTC\_TEST} 6966When this has been defined the various self--test functions (for ciphers, hashes, prngs, etc) are included in the build. This is the default configuration. 6967If LTC\_NO\_TEST has been defined, the testing routines will be compacted and only return CRYPT\_NOP. 6968 6969\subsection{LTC\_NO\_FAST} 6970When this has been defined the library will not use faster word oriented operations. By default, they are only enabled for platforms 6971which can be auto-detected. This macro ensures that they are never enabled. 6972 6973\subsection{LTC\_FAST} 6974This mode (auto-detected with x86\_32, x86\_64 platforms with GCC or CLANG) configures various routines such as ctr\_encrypt() or 6975cbc\_encrypt() that it can safely XOR multiple octets in one step by using a larger data type. This has the benefit of 6976cutting down the overhead of the respective functions. 6977 6978This mode does have one downside. It can cause unaligned reads from memory if you are not careful with the functions. This is why 6979it has been enabled by default only for the x86 class of processors where unaligned accesses are allowed. Technically LTC\_FAST 6980is not \textit{portable} since unaligned accesses are not covered by the ISO C specifications. 6981 6982In practice however, you can use it on pretty much any platform (even MIPS) with care. 6983 6984By design the \textit{fast} mode functions won't get unaligned on their own. For instance, if you call ctr\_encrypt() right after calling 6985ctr\_start() and all the inputs you gave are aligned than ctr\_encrypt() will perform aligned memory operations only. However, if you 6986call ctr\_encrypt() with an odd amount of plaintext then call it again the CTR pad (the IV) will be partially used. This will 6987cause the ctr routine to first use up the remaining pad bytes. Then if there are enough plaintext bytes left it will use 6988whole word XOR operations. These operations will be unaligned. 6989 6990The simplest precaution is to make sure you process all data in power of two blocks and handle \textit{remainder} at the end. e.g. If you are 6991CTR'ing a long stream process it in blocks of (say) four kilobytes and handle any remaining incomplete blocks at the end of the stream. 6992 6993\index{LTC\_FAST\_TYPE} 6994If you do plan on using the \textit{LTC\_FAST} mode, a \textit{LTC\_FAST\_TYPE} type which resolves to an optimal sized 6995data type you can perform integer operations with is required. For the auto-detected platforms this type will be defined automatically. Ideally it should be four or eight bytes since it must properly divide the size 6996of your block cipher (e.g. 16 bytes for AES). This means sadly if you're on a platform with 57--bit words (or something) you can't 6997use this mode. So sad. 6998 6999\subsection{LTC\_NO\_ASM} 7000When this has been defined the library will not use any inline assembler. Only a few platforms support assembler inlines but various versions of ICC and GCC 7001cannot handle all of the assembler functions. 7002 7003\subsection{Symmetric Ciphers, One-way Hashes, PRNGS and Public Key Functions} 7004There are a plethora of macros for the ciphers, hashes, PRNGs and public key functions which are fairly 7005self-explanatory. When they are defined the functionality is included otherwise it is not. There are some 7006dependency issues which are noted in the file. For instance, Yarrow requires CTR chaining mode, a block 7007cipher and a hash function. 7008 7009Also see technical note number five for more details. 7010 7011\subsection{LTC\_EASY} 7012When defined the library is configured to build fewer algorithms and modes. Mostly it sticks to NIST and ANSI approved algorithms. See 7013the header file \textit{tomcrypt\_custom.h} for more details. It is meant to provide literally an easy method of trimming the library 7014build to the most minimum of useful functionality. 7015 7016\subsection{TWOFISH\_SMALL and TWOFISH\_TABLES} 7017Twofish is a 128-bit symmetric block cipher that is provided within the library. The cipher itself is flexible enough 7018to allow some trade-offs in the implementation. When TWOFISH\_SMALL is defined the scheduled symmetric key for Twofish 7019requires only 200 bytes of memory. This is achieved by not pre-computing the substitution boxes. Having this 7020defined will also greatly slow down the cipher. When this macro is not defined Twofish will pre-compute the 7021tables at a cost of 4KB of memory. The cipher will be much faster as a result. 7022 7023When TWOFISH\_TABLES is defined the cipher will use pre-computed (and fixed in code) tables required to work. This is 7024useful when TWOFISH\_SMALL is defined as the table values are computed on the fly. When this is defined the code size 7025will increase by approximately 500 bytes. If this is defined but TWOFISH\_SMALL is not the cipher will still work but 7026it will not speed up the encryption or decryption functions. 7027 7028\subsection{GCM\_TABLES} 7029When defined GCM will use a 64KB table (per GCM state) which will greatly speed up the per--packet latency. 7030It also increases the initialization time and is not suitable when you are going to use a key a few times only. 7031 7032\subsection{GCM\_TABLES\_SSE2} 7033\index{SSE2} 7034When defined GCM will use the SSE2 instructions to perform the $GF(2^x)$ multiply using 16 128--bit XOR operations. It shaves a few cycles per byte 7035of GCM output on both the AMD64 and Intel Pentium 4 platforms. Requires GCC and an SSE2 equipped platform. 7036 7037\subsection{LTC\_SMALL\_CODE} 7038When this is defined some of the code such as the Rijndael and SAFER+ ciphers are replaced with smaller code variants. 7039These variants are slower but can save quite a bit of code space. 7040 7041\subsection{LTC\_PTHREAD} 7042When this is activated all of the descriptor table functions will use pthread locking to ensure thread safe updates to the tables. Note that 7043it doesn't prevent a thread that is passively using a table from being messed up by another thread that updates the table. 7044 7045Generally the rule of thumb is to setup the tables once at startup and then leave them be. This added build flag simply makes updating 7046the tables safer. 7047 7048\subsection{LTC\_ECC\_TIMING\_RESISTANT} 7049When this has been defined the ECC point multiplier (built--in to the library) will use a timing resistant point multiplication 7050algorithm which prevents leaking key bits of the private key (scalar). It is a slower algorithm but useful for situations 7051where timing side channels pose a significant threat. 7052 7053This is enabled by default and can be disabled by defining \textbf{LTC\_NO\_ECC\_TIMING\_RESISTANT}. 7054 7055\subsection{LTC\_RSA\_BLINDING} 7056When this has been defined the RSA modular exponentiation will use a blinding algorithm to improve timing resistance. 7057 7058This is enabled by default and can be disabled by defining \textbf{LTC\_NO\_RSA\_BLINDING}. 7059 7060\subsection{LTC\_RSA\_CRT\_HARDENING} 7061When this has been defined the RSA modular exponentiation will do some sanity checks regarding the CRT parameters and the operations' results. 7062 7063This is enabled by default and can be disabled by defining \textbf{LTC\_NO\_RSA\_CRT\_HARDENING}. 7064 7065\subsection{Math Descriptors} 7066The library comes with three math descriptors that allow you to interface the public key cryptography API to freely available math 7067libraries. When \textbf{GMP\_DESC}, \textbf{LTM\_DESC}, or \textbf{TFM\_DESC} are defined 7068descriptors for the respective library are built and included in the library as \textit{gmp\_desc}, \textit{ltm\_desc}, or \textit{tfm\_desc} respectively. 7069 7070In the test demos that use the libraries the additional flags \textbf{USE\_GMP}, \textbf{USE\_LTM}, and \textbf{USE\_TFM} can be defined 7071to tell the program which library to use. Only one of the USE flags can be defined at once. 7072 7073\index{GMP\_DESC} \index{USE\_GMP} \index{LTM\_DESC} \index{TFM\_DESC} \index{USE\_LTM} \index{USE\_TFM} 7074\begin{small} 7075\begin{verbatim} 7076make -f makefile.shared install timing CFLAGS="-DGMP_DESC -DLTM_DESC -DTFM_DESC -DUSE_TFM" \ 7077EXTRALIBS="-lgmp -ltommath -ltfm" 7078\end{verbatim} 7079\end{small} 7080 7081That will build and install the library with all descriptors (and link against all), but only use TomsFastMath in the timing demo. 7082 7083\chapter{Optimizations} 7084\mysection{Introduction} 7085The entire API was designed with plug and play in mind at the low level. That is you can swap out any cipher, hash, PRNG or bignum library and the dependent API will not 7086require updating. This has the nice benefit that one can add ciphers (etc.) not have to re--write portions of the API. For the most part, LibTomCrypt has also been written 7087to be highly portable and easy to build out of the box on pretty much any platform. As such there are no assembler inlines throughout the code, I make no assumptions 7088about the platform, etc... 7089 7090That works well for most cases but there are times where performance is of the essence. This API allows optimized routines to be dropped in--place of the existing 7091portable routines. For instance, hand optimized assembler versions of AES could be provided. Any existing function that uses the cipher could automatically use 7092the optimized code without re--writing. This also paves the way for hardware drivers that can access hardware accelerated cryptographic devices. 7093 7094At the heart of this flexibility is the \textit{descriptor} system. A descriptor is essentially just a C \textit{struct} which describes the algorithm and provides pointers 7095to functions that do the required work. For a given class of operation (e.g. cipher, hash, prng, bignum) the functions of a descriptor have identical prototypes which makes 7096development simple. In most dependent routines all an end developer has to do is register\_XXX() the descriptor and they are set. 7097 7098\mysection{Ciphers} 7099The ciphers in LibTomCrypt are accessed through the ltc\_cipher\_descriptor structure. 7100 7101\label{sec:cipherdesc} 7102\begin{small} 7103\begin{verbatim} 7104struct ltc_cipher_descriptor { 7105 /** name of cipher */ 7106 char *name; 7107 7108 /** internal ID */ 7109 unsigned char ID; 7110 7111 /** min keysize (octets) */ 7112 int min_key_length, 7113 7114 /** max keysize (octets) */ 7115 max_key_length, 7116 7117 /** block size (octets) */ 7118 block_length, 7119 7120 /** default number of rounds */ 7121 default_rounds; 7122 7123 /** Setup the cipher 7124 @param key The input symmetric key 7125 @param keylen The length of the input key (octets) 7126 @param num_rounds The requested number of rounds (0==default) 7127 @param skey [out] The destination of the scheduled key 7128 @return CRYPT_OK if successful 7129 */ 7130 int (*setup)(const unsigned char *key, 7131 int keylen, 7132 int num_rounds, 7133 symmetric_key *skey); 7134 7135 /** Encrypt a block 7136 @param pt The plaintext 7137 @param ct [out] The ciphertext 7138 @param skey The scheduled key 7139 @return CRYPT_OK if successful 7140 */ 7141 int (*ecb_encrypt)(const unsigned char *pt, 7142 unsigned char *ct, 7143 symmetric_key *skey); 7144 7145 /** Decrypt a block 7146 @param ct The ciphertext 7147 @param pt [out] The plaintext 7148 @param skey The scheduled key 7149 @return CRYPT_OK if successful 7150 */ 7151 int (*ecb_decrypt)(const unsigned char *ct, 7152 unsigned char *pt, 7153 symmetric_key *skey); 7154 7155 /** Test the block cipher 7156 @return CRYPT_OK if successful, 7157 CRYPT_NOP if self-testing has been disabled 7158 */ 7159 int (*test)(void); 7160 7161 /** Terminate the context 7162 @param skey The scheduled key 7163 */ 7164 void (*done)(symmetric_key *skey); 7165 7166 /** Determine a key size 7167 @param keysize [in/out] The size of the key desired 7168 The suggested size 7169 @return CRYPT_OK if successful 7170 */ 7171 int (*keysize)(int *keysize); 7172 7173/** Accelerators **/ 7174 /** Accelerated ECB encryption 7175 @param pt Plaintext 7176 @param ct Ciphertext 7177 @param blocks The number of complete blocks to process 7178 @param skey The scheduled key context 7179 @return CRYPT_OK if successful 7180 */ 7181 int (*accel_ecb_encrypt)(const unsigned char *pt, 7182 unsigned char *ct, 7183 unsigned long blocks, 7184 symmetric_key *skey); 7185 7186 /** Accelerated ECB decryption 7187 @param pt Plaintext 7188 @param ct Ciphertext 7189 @param blocks The number of complete blocks to process 7190 @param skey The scheduled key context 7191 @return CRYPT_OK if successful 7192 */ 7193 int (*accel_ecb_decrypt)(const unsigned char *ct, 7194 unsigned char *pt, 7195 unsigned long blocks, 7196 symmetric_key *skey); 7197 7198 /** Accelerated CBC encryption 7199 @param pt Plaintext 7200 @param ct Ciphertext 7201 @param blocks The number of complete blocks to process 7202 @param IV The initial value (input/output) 7203 @param skey The scheduled key context 7204 @return CRYPT_OK if successful 7205 */ 7206 int (*accel_cbc_encrypt)(const unsigned char *pt, 7207 unsigned char *ct, 7208 unsigned long blocks, 7209 unsigned char *IV, 7210 symmetric_key *skey); 7211 7212 /** Accelerated CBC decryption 7213 @param pt Plaintext 7214 @param ct Ciphertext 7215 @param blocks The number of complete blocks to process 7216 @param IV The initial value (input/output) 7217 @param skey The scheduled key context 7218 @return CRYPT_OK if successful 7219 */ 7220 int (*accel_cbc_decrypt)(const unsigned char *ct, 7221 unsigned char *pt, 7222 unsigned long blocks, 7223 unsigned char *IV, 7224 symmetric_key *skey); 7225 7226 /** Accelerated CTR encryption 7227 @param pt Plaintext 7228 @param ct Ciphertext 7229 @param blocks The number of complete blocks to process 7230 @param IV The initial value (input/output) 7231 @param mode little or big endian counter (mode=0 or mode=1) 7232 @param skey The scheduled key context 7233 @return CRYPT_OK if successful 7234 */ 7235 int (*accel_ctr_encrypt)(const unsigned char *pt, 7236 unsigned char *ct, 7237 unsigned long blocks, 7238 unsigned char *IV, 7239 int mode, 7240 symmetric_key *skey); 7241 7242 /** Accelerated LRW 7243 @param pt Plaintext 7244 @param ct Ciphertext 7245 @param blocks The number of complete blocks to process 7246 @param IV The initial value (input/output) 7247 @param tweak The LRW tweak 7248 @param skey The scheduled key context 7249 @return CRYPT_OK if successful 7250 */ 7251 int (*accel_lrw_encrypt)(const unsigned char *pt, 7252 unsigned char *ct, 7253 unsigned long blocks, 7254 unsigned char *IV, 7255 const unsigned char *tweak, 7256 symmetric_key *skey); 7257 7258 /** Accelerated LRW 7259 @param ct Ciphertext 7260 @param pt Plaintext 7261 @param blocks The number of complete blocks to process 7262 @param IV The initial value (input/output) 7263 @param tweak The LRW tweak 7264 @param skey The scheduled key context 7265 @return CRYPT_OK if successful 7266 */ 7267 int (*accel_lrw_decrypt)(const unsigned char *ct, 7268 unsigned char *pt, 7269 unsigned long blocks, 7270 unsigned char *IV, 7271 const unsigned char *tweak, 7272 symmetric_key *skey); 7273 7274 /** Accelerated CCM packet (one-shot) 7275 @param key The secret key to use 7276 @param keylen The length of the secret key (octets) 7277 @param uskey A previously scheduled key [can be NULL] 7278 @param nonce The session nonce [use once] 7279 @param noncelen The length of the nonce 7280 @param header The header for the session 7281 @param headerlen The length of the header (octets) 7282 @param pt [out] The plaintext 7283 @param ptlen The length of the plaintext (octets) 7284 @param ct [out] The ciphertext 7285 @param tag [out] The destination tag 7286 @param taglen [in/out] The max size and resulting size 7287 of the authentication tag 7288 @param direction Encrypt or Decrypt direction (0 or 1) 7289 @return CRYPT_OK if successful 7290 */ 7291 int (*accel_ccm_memory)( 7292 const unsigned char *key, unsigned long keylen, 7293 symmetric_key *uskey, 7294 const unsigned char *nonce, unsigned long noncelen, 7295 const unsigned char *header, unsigned long headerlen, 7296 unsigned char *pt, unsigned long ptlen, 7297 unsigned char *ct, 7298 unsigned char *tag, unsigned long *taglen, 7299 int direction); 7300 7301 /** Accelerated GCM packet (one shot) 7302 @param key The secret key 7303 @param keylen The length of the secret key 7304 @param IV The initialization vector 7305 @param IVlen The length of the initialization vector 7306 @param adata The additional authentication data (header) 7307 @param adatalen The length of the adata 7308 @param pt The plaintext 7309 @param ptlen The length of the plaintext/ciphertext 7310 @param ct The ciphertext 7311 @param tag [out] The MAC tag 7312 @param taglen [in/out] The MAC tag length 7313 @param direction Encrypt or Decrypt mode (GCM_ENCRYPT or GCM_DECRYPT) 7314 @return CRYPT_OK on success 7315 */ 7316 int (*accel_gcm_memory)( 7317 const unsigned char *key, unsigned long keylen, 7318 const unsigned char *IV, unsigned long IVlen, 7319 const unsigned char *adata, unsigned long adatalen, 7320 unsigned char *pt, unsigned long ptlen, 7321 unsigned char *ct, 7322 unsigned char *tag, unsigned long *taglen, 7323 int direction); 7324 7325 /** Accelerated one shot OMAC 7326 @param key The secret key 7327 @param keylen The key length (octets) 7328 @param in The message 7329 @param inlen Length of message (octets) 7330 @param out [out] Destination for tag 7331 @param outlen [in/out] Initial and final size of out 7332 @return CRYPT_OK on success 7333 */ 7334 int (*omac_memory)( 7335 const unsigned char *key, unsigned long keylen, 7336 const unsigned char *in, unsigned long inlen, 7337 unsigned char *out, unsigned long *outlen); 7338 7339 /** Accelerated one shot XCBC 7340 @param key The secret key 7341 @param keylen The key length (octets) 7342 @param in The message 7343 @param inlen Length of message (octets) 7344 @param out [out] Destination for tag 7345 @param outlen [in/out] Initial and final size of out 7346 @return CRYPT_OK on success 7347 */ 7348 int (*xcbc_memory)( 7349 const unsigned char *key, unsigned long keylen, 7350 const unsigned char *in, unsigned long inlen, 7351 unsigned char *out, unsigned long *outlen); 7352 7353 /** Accelerated one shot F9 7354 @param key The secret key 7355 @param keylen The key length (octets) 7356 @param in The message 7357 @param inlen Length of message (octets) 7358 @param out [out] Destination for tag 7359 @param outlen [in/out] Initial and final size of out 7360 @return CRYPT_OK on success 7361 @remark Requires manual padding 7362 */ 7363 int (*f9_memory)( 7364 const unsigned char *key, unsigned long keylen, 7365 const unsigned char *in, unsigned long inlen, 7366 unsigned char *out, unsigned long *outlen); 7367}; 7368\end{verbatim} 7369\end{small} 7370 7371\subsection{Name} 7372\index{find\_cipher()} 7373The \textit{name} parameter specifies the name of the cipher. This is what a developer would pass to find\_cipher() to find the cipher in the descriptor 7374tables. 7375 7376\subsection{Internal ID} 7377This is a single byte Internal ID you can use to distinguish ciphers from each other. 7378 7379\subsection{Key Lengths} 7380The minimum key length is \textit{min\_key\_length} and is measured in octets. Similarly the maximum key length is \textit{max\_key\_length}. They can be equal 7381and both must valid key sizes for the cipher. Values in between are not assumed to be valid though they may be. 7382 7383\subsection{Block Length} 7384The size of the ciphers plaintext or ciphertext is \textit{block\_length} and is measured in octets. 7385 7386\subsection{Rounds} 7387Some ciphers allow different number of rounds to be used. Usually you just use the default. The default round count is \textit{default\_rounds}. 7388 7389\subsection{Setup} 7390To initialize a cipher (for ECB mode) the function setup() was provided. It accepts an array of key octets \textit{key} of length \textit{keylen} octets. The user 7391can specify the number of rounds they want through \textit{num\_rounds} where $num\_rounds = 0$ means use the default. The destination of a scheduled key is stored 7392in \textit{skey}. 7393 7394Inside the \textit{symmetric\_key} union there is a \textit{void *data} which you can use to allocate data if you need a data structure that does not fit with the existing 7395ones provided. Just make sure in your \textit{done()} function that you free the allocated memory. 7396 7397\subsection{Single block ECB} 7398To process a single block in ECB mode the ecb\_encrypt() and ecb\_decrypt() functions were provided. The plaintext and ciphertext buffers are allowed to overlap so you 7399must make sure you do not overwrite the output before you are finished with the input. 7400 7401\subsection{Testing} 7402The test() function is used to self--test the \textit{device}. It takes no arguments and returns \textbf{CRYPT\_OK} if all is working properly. You may return 7403\textbf{CRYPT\_NOP} to indicate that no testing was performed. 7404 7405\subsection{Key Sizing} 7406Occasionally, a function will want to find a suitable key size to use since the input is oddly sized. The keysize() function is for this case. It accepts a 7407pointer to an integer which represents the desired size. The function then has to match it to the exact or a lower key size that is valid for the cipher. For 7408example, if the input is $25$ and $24$ is valid then it stores $24$ back in the pointed to integer. It must not round up and must return an error if the keysize 7409 cannot be mapped to a valid key size for the cipher. 7410 7411\subsection{Acceleration} 7412The next set of functions cover the accelerated functionality of the cipher descriptor. Any combination of these functions may be set to \textbf{NULL} to indicate 7413it is not supported. In those cases the software defaults are used (using the single ECB block routines). 7414 7415\subsubsection{Accelerated ECB} 7416These two functions are meant for cases where a user wants to encrypt (in ECB mode no less) an array of blocks. These functions are accessed 7417through the accel\_ecb\_encrypt and accel\_ecb\_decrypt pointers. The \textit{blocks} count is the number of complete blocks to process. 7418 7419\subsubsection{Accelerated CBC} 7420These two functions are meant for accelerated CBC encryption. These functions are accessed through the accel\_cbc\_encrypt and accel\_cbc\_decrypt pointers. 7421The \textit{blocks} value is the number of complete blocks to process. The \textit{IV} is the CBC initialization vector. It is an input upon calling this function and must be 7422updated by the function before returning. 7423 7424\subsubsection{Accelerated CTR} 7425This function is meant for accelerated CTR encryption. It is accessible through the accel\_ctr\_encrypt pointer. 7426The \textit{blocks} value is the number of complete blocks to process. The \textit{IV} is the CTR counter vector. It is an input upon calling this function and must be 7427updated by the function before returning. The \textit{mode} value indicates whether the counter is big (mode = CTR\_COUNTER\_BIG\_ENDIAN) or 7428little (mode = CTR\_COUNTER\_LITTLE\_ENDIAN) endian. 7429 7430This function (and the way it's called) differs from the other two since ctr\_encrypt() allows any size input plaintext. The accelerator will only be 7431called if the following conditions are met. 7432 7433\begin{enumerate} 7434 \item The accelerator is present 7435 \item The CTR pad is empty 7436 \item The remaining length of the input to process is greater than or equal to the block size. 7437\end{enumerate} 7438 7439The \textit{CTR pad} is empty when a multiple (including zero) blocks of text have been processed. That is, if you pass in seven bytes to AES--CTR mode you would have to 7440pass in a minimum of nine extra bytes before the accelerator could be called. The CTR accelerator must increment the counter (and store it back into the 7441buffer provided) before encrypting it to create the pad. 7442 7443The accelerator will only be used to encrypt whole blocks. Partial blocks are always handled in software. 7444 7445\subsubsection{Accelerated LRW} 7446These functions are meant for accelerated LRW. They process blocks of input in lengths of multiples of 16 octets. They must accept the \textit{IV} and \textit{tweak} 7447state variables and updated them prior to returning. Note that you may want to disable \textbf{LRW\_TABLES} in \textit{tomcrypt\_custom.h} if you intend 7448to use accelerators for LRW. 7449 7450While both encrypt and decrypt accelerators are not required it is suggested as it makes lrw\_setiv() more efficient. 7451 7452Note that calling lrw\_done() will only invoke the cipher\_descriptor[].done() function on the \textit{symmetric\_key} parameter of the LRW state. That means 7453if your device requires any (LRW specific) resources you should free them in your ciphers() done function. The simplest way to think of it is to write 7454the plugin solely to do LRW with the cipher. That way cipher\_descriptor[].setup() means to init LRW resources and cipher\_descriptor[].done() means to 7455free them. 7456 7457\subsubsection{Accelerated CCM} 7458This function is meant for accelerated CCM encryption or decryption. It processes the entire packet in one call. You can optimize the work flow somewhat 7459by allowing the caller to call the setup() function first to schedule the key if your accelerator cannot do the key schedule on the fly (for instance). This 7460function MUST support both key passing methods. 7461 7462\begin{center} 7463\begin{small} 7464\begin{tabular}{|r|r|l|} 7465\hline \textbf{key} & \textbf{uskey} & \textbf{Source of key} \\ 7466\hline NULL & NULL & Error, not supported \\ 7467\hline non-NULL & NULL & Use key, do a key schedule \\ 7468\hline NULL & non-NULL & Use uskey, key schedule not required \\ 7469\hline non-NULL & non-NULL & Use uskey, key schedule not required \\ 7470\hline 7471\end{tabular} 7472\end{small} 7473\end{center} 7474 7475\index{ccm\_memory()} This function is called when the user calls ccm\_memory(). 7476 7477\subsubsection{Accelerated GCM} 7478\index{gcm\_memory()} 7479This function is meant for accelerated GCM encryption or decryption. It processes the entire packet in one call. Note that the setup() function will not 7480be called prior to this. This function must handle scheduling the key provided on its own. It is called when the user calls gcm\_memory(). 7481 7482\subsubsection{Accelerated OMAC} 7483\index{omac\_memory()} 7484This function is meant to perform an optimized OMAC1 (CMAC) message authentication code computation when the user calls omac\_memory(). 7485 7486\subsubsection{Accelerated XCBC-MAC} 7487\index{xcbc\_memory()} 7488This function is meant to perform an optimized XCBC-MAC message authentication code computation when the user calls xcbc\_memory(). 7489 7490\subsubsection{Accelerated F9} 7491\index{f9\_memory()} 7492This function is meant to perform an optimized F9 message authentication code computation when the user calls f9\_memory(). Like f9\_memory(), it requires 7493the caller to perform any 3GPP related padding before calling in order to ensure proper compliance with F9. 7494 7495 7496\mysection{One--Way Hashes} 7497The hash functions are accessed through the ltc\_hash\_descriptor structure. 7498 7499\begin{small} 7500\begin{verbatim} 7501struct ltc_hash_descriptor { 7502 /** name of hash */ 7503 char *name; 7504 7505 /** internal ID */ 7506 unsigned char ID; 7507 7508 /** Size of digest in octets */ 7509 unsigned long hashsize; 7510 7511 /** Input block size in octets */ 7512 unsigned long blocksize; 7513 7514 /** ASN.1 OID */ 7515 unsigned long OID[16]; 7516 7517 /** Length of DER encoding */ 7518 unsigned long OIDlen; 7519 7520 /** Init a hash state 7521 @param hash The hash to initialize 7522 @return CRYPT_OK if successful 7523 */ 7524 int (*init)(hash_state *hash); 7525 7526 /** Process a block of data 7527 @param hash The hash state 7528 @param in The data to hash 7529 @param inlen The length of the data (octets) 7530 @return CRYPT_OK if successful 7531 */ 7532 int (*process)( hash_state *hash, 7533 const unsigned char *in, 7534 unsigned long inlen); 7535 7536 /** Produce the digest and store it 7537 @param hash The hash state 7538 @param out [out] The destination of the digest 7539 @return CRYPT_OK if successful 7540 */ 7541 int (*done)( hash_state *hash, 7542 unsigned char *out); 7543 7544 /** Self-test 7545 @return CRYPT_OK if successful, 7546 CRYPT_NOP if self-tests have been disabled 7547 */ 7548 int (*test)(void); 7549 7550 /* accelerated hmac callback: if you need to-do 7551 multiple packets just use the generic hmac_memory 7552 and provide a hash callback 7553 */ 7554 int (*hmac_block)(const unsigned char *key, 7555 unsigned long keylen, 7556 const unsigned char *in, 7557 unsigned long inlen, 7558 unsigned char *out, 7559 unsigned long *outlen); 7560}; 7561\end{verbatim} 7562\end{small} 7563 7564\subsection{Name} 7565This is the name the hash is known by and what find\_hash() will look for. 7566 7567\subsection{Internal ID} 7568This is the internal ID byte used to distinguish the hash from other hashes. 7569 7570\subsection{Digest Size} 7571The \textit{hashsize} variable indicates the length of the output in octets. 7572 7573\subsection{Block Size} 7574The \textit{blocksize} variable indicates the length of input (in octets) that the hash processes in a given 7575invocation. 7576 7577\subsection{OID Identifier} 7578This is the universal ASN.1 Object Identifier for the hash. 7579 7580\subsection{Initialization} 7581The init function initializes the hash and prepares it to process message bytes. 7582 7583\subsection{Process} 7584This processes message bytes. The algorithm must accept any length of input that the hash would allow. The input is not 7585guaranteed to be a multiple of the block size in length. 7586 7587\subsection{Done} 7588The done function terminates the hash and returns the message digest. 7589 7590\subsection{Acceleration} 7591A compatible accelerator must allow processing data in any granularity which may require internal padding on the driver side. 7592 7593\subsection{HMAC Acceleration} 7594The hmac\_block() callback is meant for single--shot optimized HMAC implementations. It is called directly by hmac\_memory() if present. If you need 7595to be able to process multiple blocks per MAC then you will have to simply provide a process() callback and use hmac\_memory() as provided in LibTomCrypt. 7596 7597\mysection{Pseudo--Random Number Generators} 7598The pseudo--random number generators are accessible through the ltc\_prng\_descriptor structure. 7599 7600\begin{small} 7601\begin{verbatim} 7602struct ltc_prng_descriptor { 7603 /** Name of the PRNG */ 7604 char *name; 7605 7606 /** size in bytes of exported state */ 7607 int export_size; 7608 7609 /** Start a PRNG state 7610 @param prng [out] The state to initialize 7611 @return CRYPT_OK if successful 7612 */ 7613 int (*start)(prng_state *prng); 7614 7615 /** Add entropy to the PRNG 7616 @param in The entropy 7617 @param inlen Length of the entropy (octets) 7618 @param prng The PRNG state 7619 @return CRYPT_OK if successful 7620 */ 7621 int (*add_entropy)(const unsigned char *in, 7622 unsigned long inlen, 7623 prng_state *prng); 7624 7625 /** Ready a PRNG state to read from 7626 @param prng The PRNG state to ready 7627 @return CRYPT_OK if successful 7628 */ 7629 int (*ready)(prng_state *prng); 7630 7631 /** Read from the PRNG 7632 @param out [out] Where to store the data 7633 @param outlen Length of data desired (octets) 7634 @param prng The PRNG state to read from 7635 @return Number of octets read 7636 */ 7637 unsigned long (*read)(unsigned char *out, 7638 unsigned long outlen, 7639 prng_state *prng); 7640 7641 /** Terminate a PRNG state 7642 @param prng The PRNG state to terminate 7643 @return CRYPT_OK if successful 7644 */ 7645 int (*done)(prng_state *prng); 7646 7647 /** Export a PRNG state 7648 @param out [out] The destination for the state 7649 @param outlen [in/out] The max size and resulting size 7650 @param prng The PRNG to export 7651 @return CRYPT_OK if successful 7652 */ 7653 int (*pexport)(unsigned char *out, 7654 unsigned long *outlen, 7655 prng_state *prng); 7656 7657 /** Import a PRNG state 7658 @param in The data to import 7659 @param inlen The length of the data to import (octets) 7660 @param prng The PRNG to initialize/import 7661 @return CRYPT_OK if successful 7662 */ 7663 int (*pimport)(const unsigned char *in, 7664 unsigned long inlen, 7665 prng_state *prng); 7666 7667 /** Self-test the PRNG 7668 @return CRYPT_OK if successful, 7669 CRYPT_NOP if self-testing has been disabled 7670 */ 7671 int (*test)(void); 7672}; 7673\end{verbatim} 7674\end{small} 7675 7676\subsection{Name} 7677The name by which find\_prng() will find the PRNG. 7678 7679\subsection{Export Size} 7680When an PRNG state is to be exported for future use you specify the space required in this variable. 7681 7682\subsection{Start} 7683Initialize the PRNG and make it ready to accept entropy. 7684 7685\subsection{Entropy Addition} 7686Add entropy to the PRNG state. The exact behaviour of this function depends on the particulars of the PRNG. 7687 7688\subsection{Ready} 7689This function makes the PRNG ready to read from by processing the entropy added. The behaviour of this function depends 7690on the specific PRNG used. 7691 7692\subsection{Read} 7693Read from the PRNG and return the number of bytes read. This function does not have to fill the buffer but it is best 7694if it does as many protocols do not retry reads and will fail on the first try. 7695 7696\subsection{Done} 7697Terminate a PRNG state. The behaviour of this function depends on the particular PRNG used. 7698 7699\subsection{Exporting and Importing} 7700An exported PRNG state is data that the PRNG can later import to resume activity. They're not meant to resume \textit{the same session} 7701but should at least maintain the same level of state entropy. 7702 7703\mysection{BigNum Math Descriptors} 7704The library also makes use of the math descriptors to access math functions. While bignum math libraries usually differ in implementation 7705it hasn't proven hard to write \textit{glue} to use math libraries so far. The basic descriptor looks like. 7706 7707\begin{small} 7708\begin{verbatim} 7709/** math descriptor */ 7710typedef struct { 7711 /** Name of the math provider */ 7712 char *name; 7713 7714 /** Bits per digit, amount of bits must fit in an unsigned long */ 7715 int bits_per_digit; 7716 7717/* ---- init/deinit functions ---- */ 7718 7719 /** initialize a bignum 7720 @param a The number to initialize 7721 @return CRYPT_OK on success 7722 */ 7723 int (*init)(void **a); 7724 7725 /** init copy 7726 @param dst The number to initialize and write to 7727 @param src The number to copy from 7728 @return CRYPT_OK on success 7729 */ 7730 int (*init_copy)(void **dst, void *src); 7731 7732 /** deinit 7733 @param a The number to free 7734 @return CRYPT_OK on success 7735 */ 7736 void (*deinit)(void *a); 7737 7738/* ---- data movement ---- */ 7739 7740 /** negate 7741 @param src The number to negate 7742 @param dst The destination 7743 @return CRYPT_OK on success 7744 */ 7745 int (*neg)(void *src, void *dst); 7746 7747 /** copy 7748 @param src The number to copy from 7749 @param dst The number to write to 7750 @return CRYPT_OK on success 7751 */ 7752 int (*copy)(void *src, void *dst); 7753 7754/* ---- trivial low level functions ---- */ 7755 7756 /** set small constant 7757 @param a Number to write to 7758 @param n Source upto bits_per_digit (actually meant for very small constants) 7759 @return CRYPT_OK on success 7760 */ 7761 int (*set_int)(void *a, unsigned long n); 7762 7763 /** get small constant 7764 @param a Small number to read, 7765 only fetches up to bits_per_digit from the number 7766 @return The lower bits_per_digit of the integer (unsigned) 7767 */ 7768 unsigned long (*get_int)(void *a); 7769 7770 /** get digit n 7771 @param a The number to read from 7772 @param n The number of the digit to fetch 7773 @return The bits_per_digit sized n'th digit of a 7774 */ 7775 ltc_mp_digit (*get_digit)(void *a, int n); 7776 7777 /** Get the number of digits that represent the number 7778 @param a The number to count 7779 @return The number of digits used to represent the number 7780 */ 7781 int (*get_digit_count)(void *a); 7782 7783 /** compare two integers 7784 @param a The left side integer 7785 @param b The right side integer 7786 @return LTC_MP_LT if a < b, 7787 LTC_MP_GT if a > b and 7788 LTC_MP_EQ otherwise. (signed comparison) 7789 */ 7790 int (*compare)(void *a, void *b); 7791 7792 /** compare against int 7793 @param a The left side integer 7794 @param b The right side integer (upto bits_per_digit) 7795 @return LTC_MP_LT if a < b, 7796 LTC_MP_GT if a > b and 7797 LTC_MP_EQ otherwise. (signed comparison) 7798 */ 7799 int (*compare_d)(void *a, unsigned long n); 7800 7801 /** Count the number of bits used to represent the integer 7802 @param a The integer to count 7803 @return The number of bits required to represent the integer 7804 */ 7805 int (*count_bits)(void * a); 7806 7807 /** Count the number of LSB bits which are zero 7808 @param a The integer to count 7809 @return The number of contiguous zero LSB bits 7810 */ 7811 int (*count_lsb_bits)(void *a); 7812 7813 /** Compute a power of two 7814 @param a The integer to store the power in 7815 @param n The power of two you want to store (a = 2^n) 7816 @return CRYPT_OK on success 7817 */ 7818 int (*twoexpt)(void *a , int n); 7819 7820/* ---- radix conversions ---- */ 7821 7822 /** read ascii string 7823 @param a The integer to store into 7824 @param str The string to read 7825 @param radix The radix the integer has been represented in (2-64) 7826 @return CRYPT_OK on success 7827 */ 7828 int (*read_radix)(void *a, const char *str, int radix); 7829 7830 /** write number to string 7831 @param a The integer to store 7832 @param str The destination for the string 7833 @param radix The radix the integer is to be represented in (2-64) 7834 @return CRYPT_OK on success 7835 */ 7836 int (*write_radix)(void *a, char *str, int radix); 7837 7838 /** get size as unsigned char string 7839 @param a The integer to get the size (when stored in array of octets) 7840 @return The length of the integer in octets 7841 */ 7842 unsigned long (*unsigned_size)(void *a); 7843 7844 /** store an integer as an array of octets 7845 @param src The integer to store 7846 @param dst The buffer to store the integer in 7847 @return CRYPT_OK on success 7848 */ 7849 int (*unsigned_write)(void *src, unsigned char *dst); 7850 7851 /** read an array of octets and store as integer 7852 @param dst The integer to load 7853 @param src The array of octets 7854 @param len The number of octets 7855 @return CRYPT_OK on success 7856 */ 7857 int (*unsigned_read)( void *dst, 7858 unsigned char *src, 7859 unsigned long len); 7860 7861/* ---- basic math ---- */ 7862 7863 /** add two integers 7864 @param a The first source integer 7865 @param b The second source integer 7866 @param c The destination of "a + b" 7867 @return CRYPT_OK on success 7868 */ 7869 int (*add)(void *a, void *b, void *c); 7870 7871 /** add two integers 7872 @param a The first source integer 7873 @param b The second source integer 7874 (single digit of upto bits_per_digit in length) 7875 @param c The destination of "a + b" 7876 @return CRYPT_OK on success 7877 */ 7878 int (*addi)(void *a, unsigned long b, void *c); 7879 7880 /** subtract two integers 7881 @param a The first source integer 7882 @param b The second source integer 7883 @param c The destination of "a - b" 7884 @return CRYPT_OK on success 7885 */ 7886 int (*sub)(void *a, void *b, void *c); 7887 7888 /** subtract two integers 7889 @param a The first source integer 7890 @param b The second source integer 7891 (single digit of upto bits_per_digit in length) 7892 @param c The destination of "a - b" 7893 @return CRYPT_OK on success 7894 */ 7895 int (*subi)(void *a, unsigned long b, void *c); 7896 7897 /** multiply two integers 7898 @param a The first source integer 7899 @param b The second source integer 7900 (single digit of upto bits_per_digit in length) 7901 @param c The destination of "a * b" 7902 @return CRYPT_OK on success 7903 */ 7904 int (*mul)(void *a, void *b, void *c); 7905 7906 /** multiply two integers 7907 @param a The first source integer 7908 @param b The second source integer 7909 (single digit of upto bits_per_digit in length) 7910 @param c The destination of "a * b" 7911 @return CRYPT_OK on success 7912 */ 7913 int (*muli)(void *a, unsigned long b, void *c); 7914 7915 /** Square an integer 7916 @param a The integer to square 7917 @param b The destination 7918 @return CRYPT_OK on success 7919 */ 7920 int (*sqr)(void *a, void *b); 7921 7922 /** Divide an integer 7923 @param a The dividend 7924 @param b The divisor 7925 @param c The quotient (can be NULL to signify don't care) 7926 @param d The remainder (can be NULL to signify don't care) 7927 @return CRYPT_OK on success 7928 */ 7929 int (*mpdiv)(void *a, void *b, void *c, void *d); 7930 7931 /** divide by two 7932 @param a The integer to divide (shift right) 7933 @param b The destination 7934 @return CRYPT_OK on success 7935 */ 7936 int (*div_2)(void *a, void *b); 7937 7938 /** Get remainder (small value) 7939 @param a The integer to reduce 7940 @param b The modulus (upto bits_per_digit in length) 7941 @param c The destination for the residue 7942 @return CRYPT_OK on success 7943 */ 7944 int (*modi)(void *a, unsigned long b, unsigned long *c); 7945 7946 /** gcd 7947 @param a The first integer 7948 @param b The second integer 7949 @param c The destination for (a, b) 7950 @return CRYPT_OK on success 7951 */ 7952 int (*gcd)(void *a, void *b, void *c); 7953 7954 /** lcm 7955 @param a The first integer 7956 @param b The second integer 7957 @param c The destination for [a, b] 7958 @return CRYPT_OK on success 7959 */ 7960 int (*lcm)(void *a, void *b, void *c); 7961 7962 /** Modular multiplication 7963 @param a The first source 7964 @param b The second source 7965 @param c The modulus 7966 @param d The destination (a*b mod c) 7967 @return CRYPT_OK on success 7968 */ 7969 int (*mulmod)(void *a, void *b, void *c, void *d); 7970 7971 /** Modular squaring 7972 @param a The first source 7973 @param b The modulus 7974 @param c The destination (a*a mod b) 7975 @return CRYPT_OK on success 7976 */ 7977 int (*sqrmod)(void *a, void *b, void *c); 7978 7979 /** Modular inversion 7980 @param a The value to invert 7981 @param b The modulus 7982 @param c The destination (1/a mod b) 7983 @return CRYPT_OK on success 7984 */ 7985 int (*invmod)(void *, void *, void *); 7986 7987/* ---- reduction ---- */ 7988 7989 /** setup Montgomery 7990 @param a The modulus 7991 @param b The destination for the reduction digit 7992 @return CRYPT_OK on success 7993 */ 7994 int (*montgomery_setup)(void *a, void **b); 7995 7996 /** get normalization value 7997 @param a The destination for the normalization value 7998 @param b The modulus 7999 @return CRYPT_OK on success 8000 */ 8001 int (*montgomery_normalization)(void *a, void *b); 8002 8003 /** reduce a number 8004 @param a The number [and dest] to reduce 8005 @param b The modulus 8006 @param c The value "b" from montgomery_setup() 8007 @return CRYPT_OK on success 8008 */ 8009 int (*montgomery_reduce)(void *a, void *b, void *c); 8010 8011 /** clean up (frees memory) 8012 @param a The value "b" from montgomery_setup() 8013 @return CRYPT_OK on success 8014 */ 8015 void (*montgomery_deinit)(void *a); 8016 8017/* ---- exponentiation ---- */ 8018 8019 /** Modular exponentiation 8020 @param a The base integer 8021 @param b The power (can be negative) integer 8022 @param c The modulus integer 8023 @param d The destination 8024 @return CRYPT_OK on success 8025 */ 8026 int (*exptmod)(void *a, void *b, void *c, void *d); 8027 8028 /** Primality testing 8029 @param a The integer to test 8030 @param b The number of Miller-Rabin tests that shall be executed 8031 @param c The destination of the result (FP_YES if prime) 8032 @return CRYPT_OK on success 8033 */ 8034 int (*isprime)(void *a, int b, int *c); 8035 8036/* ---- (optional) ecc point math ---- */ 8037 8038 /** ECC GF(p) point multiplication (from the NIST curves) 8039 @param k The integer to multiply the point by 8040 @param G The point to multiply 8041 @param R The destination for kG 8042 @param modulus The modulus for the field 8043 @param map Boolean indicated whether to map back to affine or not 8044 (can be ignored if you work in affine only) 8045 @return CRYPT_OK on success 8046 */ 8047 int (*ecc_ptmul)( void *k, 8048 ecc_point *G, 8049 ecc_point *R, 8050 void *modulus, 8051 int map); 8052 8053 /** ECC GF(p) point addition 8054 @param P The first point 8055 @param Q The second point 8056 @param R The destination of P + Q 8057 @param modulus The modulus 8058 @param mp The "b" value from montgomery_setup() 8059 @return CRYPT_OK on success 8060 */ 8061 int (*ecc_ptadd)(ecc_point *P, 8062 ecc_point *Q, 8063 ecc_point *R, 8064 void *modulus, 8065 void *mp); 8066 8067 /** ECC GF(p) point double 8068 @param P The first point 8069 @param R The destination of 2P 8070 @param modulus The modulus 8071 @param mp The "b" value from montgomery_setup() 8072 @return CRYPT_OK on success 8073 */ 8074 int (*ecc_ptdbl)(ecc_point *P, 8075 ecc_point *R, 8076 void *modulus, 8077 void *mp); 8078 8079 /** ECC mapping from projective to affine, 8080 currently uses (x,y,z) => (x/z^2, y/z^3, 1) 8081 @param P The point to map 8082 @param modulus The modulus 8083 @param mp The "b" value from montgomery_setup() 8084 @return CRYPT_OK on success 8085 @remark The mapping can be different but keep in mind a 8086 ecc_point only has three integers (x,y,z) so if 8087 you use a different mapping you have to make it fit. 8088 */ 8089 int (*ecc_map)(ecc_point *P, void *modulus, void *mp); 8090 8091 /** Computes kA*A + kB*B = C using Shamir's Trick 8092 @param A First point to multiply 8093 @param kA What to multiple A by 8094 @param B Second point to multiply 8095 @param kB What to multiple B by 8096 @param C [out] Destination point (can overlap with A or B) 8097 @param modulus Modulus for curve 8098 @return CRYPT_OK on success 8099 */ 8100 int (*ecc_mul2add)(ecc_point *A, void *kA, 8101 ecc_point *B, void *kB, 8102 ecc_point *C, 8103 void *modulus); 8104 8105/* ---- (optional) rsa optimized math (for internal CRT) ---- */ 8106 8107 /** RSA Key Generation 8108 @param prng An active PRNG state 8109 @param wprng The index of the PRNG desired 8110 @param size The size of the key in octets 8111 @param e The "e" value (public key). 8112 e==65537 is a good choice 8113 @param key [out] Destination of a newly created private key pair 8114 @return CRYPT_OK if successful, upon error all allocated ram is freed 8115 */ 8116 int (*rsa_keygen)(prng_state *prng, 8117 int wprng, 8118 int size, 8119 long e, 8120 rsa_key *key); 8121 8122 /** RSA exponentiation 8123 @param in The octet array representing the base 8124 @param inlen The length of the input 8125 @param out The destination (to be stored in an octet array format) 8126 @param outlen The length of the output buffer and the resulting size 8127 (zero padded to the size of the modulus) 8128 @param which PK_PUBLIC for public RSA and PK_PRIVATE for private RSA 8129 @param key The RSA key to use 8130 @return CRYPT_OK on success 8131 */ 8132 int (*rsa_me)(const unsigned char *in, unsigned long inlen, 8133 unsigned char *out, unsigned long *outlen, int which, 8134 rsa_key *key); 8135 8136/* ---- basic math continued ---- */ 8137 8138 /** Modular addition 8139 @param a The first source 8140 @param b The second source 8141 @param c The modulus 8142 @param d The destination (a + b mod c) 8143 @return CRYPT_OK on success 8144 */ 8145 int (*addmod)(void *a, void *b, void *c, void *d); 8146 8147 /** Modular substraction 8148 @param a The first source 8149 @param b The second source 8150 @param c The modulus 8151 @param d The destination (a - b mod c) 8152 @return CRYPT_OK on success 8153 */ 8154 int (*submod)(void *a, void *b, void *c, void *d); 8155 8156/* ---- misc stuff ---- */ 8157 8158 /** Make a pseudo-random mpi 8159 @param a The mpi to make random 8160 @param size The desired length 8161 @return CRYPT_OK on success 8162 */ 8163 int (*rand)(void *a, int size); 8164} ltc_math_descriptor; 8165\end{verbatim} 8166\end{small} 8167 8168Most of the functions are fairly straightforward and do not need documentation. We'll cover the basic conventions of the API and then explain the accelerated functions. 8169 8170\subsection{Conventions} 8171 8172All \textit{bignums} are accessed through an opaque \textit{void *} data type. You must internally cast the pointer if you need to access members of your bignum structure. During 8173the init calls a \textit{void **} will be passed where you allocate your structure and set the pointer then initialize the number to zero. During the deinit calls you must 8174free the bignum as well as the structure you allocated to place it in. 8175 8176All functions except the Montgomery reductions work from left to right with the arguments. For example, mul(a, b, c) computes $c \leftarrow ab$. 8177 8178All functions (except where noted otherwise) return \textbf{CRYPT\_OK} to signify a successful operation. All error codes must be valid LibTomCrypt error codes. 8179 8180The digit routines (including functions with the \textit{i} suffix) use a \textit{ltc\_mp\_digit} to represent the digit. If your internal digit is larger than this you must 8181then partition your digits. Note that if your digit is smaller than an \textit{ltc\_mp\_digit} that is also acceptable as the \textit{bits\_per\_digit} parameter will specify this. 8182 8183\subsubsection{ltc\_mp\_digit} 8184\index{ltc\_mp\_digit} 8185 8186Depending on the archtitecture \textit{ltc\_mp\_digit} is either a $32$- or $64$-bit long \textit{unsigned} data type. 8187 8188\subsection{ECC Functions} 8189The ECC system in LibTomCrypt is based off of the NIST recommended curves over $GF(p)$ and is used to implement EC-DSA and EC-DH. The ECC functions work with 8190the \textbf{ecc\_point} structure and assume the points are stored in Jacobian projective format. 8191 8192\begin{verbatim} 8193/** A point on a ECC curve, stored in Jacobian format such 8194 that (x,y,z) => (x/z^2, y/z^3, 1) when interpreted as affine */ 8195typedef struct { 8196 /** The x co-ordinate */ 8197 void *x; 8198 /** The y co-ordinate */ 8199 void *y; 8200 /** The z co-ordinate */ 8201 void *z; 8202} ecc_point; 8203\end{verbatim} 8204 8205All ECC functions must use this mapping system. The only exception is when you remap all ECC callbacks which will allow you to have more control 8206over how the ECC math will be implemented. Out of the box you only have three parameters per point to use $(x, y, z)$ however, these are just void pointers. They 8207could point to anything you want. The only further exception is the export functions which expects the values to be in affine format. 8208 8209\subsubsection{Point Multiply} 8210This will multiply the point $G$ by the scalar $k$ and store the result in the point $R$. The value should be mapped to affine only if $map$ is set to one. 8211 8212\subsubsection{Point Addition} 8213This will add the point $P$ to the point $Q$ and store it in the point $R$. The $mp$ parameter is the \textit{b} value from the montgomery\_setup() call. The input points 8214may be in either affine (with $z = 1$) or projective format and the output point is always projective. 8215 8216\subsubsection{Point Mapping} 8217This will map the point $P$ back from projective to affine. The output point $P$ must be of the form $(x, y, 1)$. 8218 8219\subsubsection{Shamir's Trick} 8220\index{Shamir's Trick} 8221\index{ltc\_ecc\_mul2add()} 8222To accelerate EC--DSA verification the library provides a built--in function called ltc\_ecc\_mul2add(). This performs two point multiplications and an addition in 8223roughly the time of one point multiplication. It is called from ecc\_verify\_hash() if an accelerator is not present. The acclerator function must allow the points to 8224overlap (e.g., $A \leftarrow k_1A + k_2B$) and must return the final point in affine format. 8225 8226 8227\subsection{RSA Functions} 8228The RSA Modular Exponentiation (ME) function is used by the RSA API to perform exponentiations for private and public key operations. In particular for 8229private key operations it uses the CRT approach to lower the time required. It is passed an RSA key with the following format. 8230 8231\begin{verbatim} 8232/** RSA PKCS style key */ 8233typedef struct Rsa_key { 8234 /** Type of key, PK_PRIVATE or PK_PUBLIC */ 8235 int type; 8236 /** The public exponent */ 8237 void *e; 8238 /** The private exponent */ 8239 void *d; 8240 /** The modulus */ 8241 void *N; 8242 /** The p factor of N */ 8243 void *p; 8244 /** The q factor of N */ 8245 void *q; 8246 /** The 1/q mod p CRT param */ 8247 void *qP; 8248 /** The d mod (p - 1) CRT param */ 8249 void *dP; 8250 /** The d mod (q - 1) CRT param */ 8251 void *dQ; 8252} rsa_key; 8253\end{verbatim} 8254 8255The call reads the \textit{in} buffer as an unsigned char array in big endian format. Then it performs the exponentiation and stores the output in big endian format 8256to the \textit{out} buffer. The output must be zero padded (leading bytes) so that the length of the output matches the length of the modulus (in bytes). For example, 8257for RSA--1024 the output is always 128 bytes regardless of how small the numerical value of the exponentiation is. 8258 8259Since the function is given the entire RSA key (for private keys only) CRT is possible as prescribed in the PKCS \#1 v2.1 specification. 8260 8261\newpage 8262\markboth{Index}{Index} 8263\input{crypt.ind} 8264 8265\end{document} 8266 8267% ref: HEAD -> master, tag: v1.18.2 8268% git commit: 7e7eb695d581782f04b24dc444cbfde86af59853 8269% commit time: 2018-07-01 22:49:01 +0200 8270