Arduino Cryptography Library
OFB.cpp
1 /*
2  * Copyright (C) 2015 Southern Storm Software, Pty Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  */
22 
23 #include "OFB.h"
24 #include "Crypto.h"
25 #include <string.h>
26 
43  : blockCipher(0)
44  , posn(16)
45 {
46 }
47 
52 {
53  clean(iv);
54 }
55 
56 size_t OFBCommon::keySize() const
57 {
58  return blockCipher->keySize();
59 }
60 
61 size_t OFBCommon::ivSize() const
62 {
63  return 16;
64 }
65 
66 bool OFBCommon::setKey(const uint8_t *key, size_t len)
67 {
68  // Verify the cipher's block size, just in case.
69  if (blockCipher->blockSize() != 16)
70  return false;
71 
72  // Set the key on the underlying block cipher.
73  return blockCipher->setKey(key, len);
74 }
75 
76 bool OFBCommon::setIV(const uint8_t *iv, size_t len)
77 {
78  if (len != 16)
79  return false;
80  memcpy(this->iv, iv, 16);
81  posn = 16;
82  return true;
83 }
84 
85 void OFBCommon::encrypt(uint8_t *output, const uint8_t *input, size_t len)
86 {
87  uint8_t size;
88  while (len > 0) {
89  // If we have exhausted the current keystream block, then encrypt
90  // the IV/ciphertext to get another keystream block.
91  if (posn >= 16) {
92  blockCipher->encryptBlock(iv, iv);
93  posn = 0;
94  }
95 
96  // XOR the plaintext with the encrypted IV to get the new ciphertext.
97  size = 16 - posn;
98  if (size > len)
99  size = len;
100  len -= size;
101  while (size > 0) {
102  *output++ = *input++ ^ iv[posn++];
103  --size;
104  }
105  }
106 }
107 
108 void OFBCommon::decrypt(uint8_t *output, const uint8_t *input, size_t len)
109 {
110  encrypt(output, input, len);
111 }
112 
114 {
115  blockCipher->clear();
116  clean(iv);
117  posn = 16;
118 }
119 
virtual void clear()=0
Clears all security-sensitive state from this block cipher.
virtual size_t blockSize() const =0
Size of a single block processed by this cipher, in bytes.
virtual bool setKey(const uint8_t *key, size_t len)=0
Sets the key to use for future encryption and decryption operations.
virtual void encryptBlock(uint8_t *output, const uint8_t *input)=0
Encrypts a single block using this cipher.
virtual size_t keySize() const =0
Default size of the key for this block cipher, in bytes.
size_t keySize() const
Default size of the key for this cipher, in bytes.
Definition: OFB.cpp:56
bool setIV(const uint8_t *iv, size_t len)
Sets the initialization vector to use for future encryption and decryption operations.
Definition: OFB.cpp:76
void clear()
Clears all security-sensitive state from this cipher.
Definition: OFB.cpp:113
OFBCommon()
Constructs a new cipher in OFB mode.
Definition: OFB.cpp:42
void encrypt(uint8_t *output, const uint8_t *input, size_t len)
Encrypts an input buffer and writes the ciphertext to an output buffer.
Definition: OFB.cpp:85
size_t ivSize() const
Size of the initialization vector for this cipher, in bytes.
Definition: OFB.cpp:61
virtual ~OFBCommon()
Destroys this cipher object after clearing sensitive information.
Definition: OFB.cpp:51
bool setKey(const uint8_t *key, size_t len)
Sets the key to use for future encryption and decryption operations.
Definition: OFB.cpp:66
void decrypt(uint8_t *output, const uint8_t *input, size_t len)
Decrypts an input buffer and writes the plaintext to an output buffer.
Definition: OFB.cpp:108