1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner.
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works.
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @file ocb_encrypt.c
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   OCB implementation, encrypt data, by Tom St Denis
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h"
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef OCB_MODE
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Encrypt a block of data with OCB.
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ocb     The OCB state
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param pt      The plaintext (length of the block size of the block cipher)
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param ct      [out] The ciphertext (same size as the pt)
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint ocb_encrypt(ocb_state *ocb, const unsigned char *pt, unsigned char *ct)
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char Z[MAXBLOCKSIZE], tmp[MAXBLOCKSIZE];
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err, x;
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(ocb != NULL);
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(pt  != NULL);
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(ct  != NULL);
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = cipher_is_valid(ocb->cipher)) != CRYPT_OK) {
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return err;
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if (ocb->block_len != cipher_descriptor[ocb->cipher].block_length) {
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return CRYPT_INVALID_ARG;
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* compute checksum */
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < ocb->block_len; x++) {
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       ocb->checksum[x] ^= pt[x];
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* Get Z[i] value */
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ocb_shift_xor(ocb, Z);
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* xor pt in, encrypt, xor Z out */
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < ocb->block_len; x++) {
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       tmp[x] = pt[x] ^ Z[x];
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   if ((err = cipher_descriptor[ocb->cipher].ecb_encrypt(tmp, ct, &ocb->key)) != CRYPT_OK) {
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      return err;
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < ocb->block_len; x++) {
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       ct[x] ^= Z[x];
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   zeromem(Z, sizeof(Z));
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   zeromem(tmp, sizeof(tmp));
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/encauth/ocb/ocb_encrypt.c,v $ */
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.5 $ */
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/03/31 14:15:35 $ */
73