3 This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * a implementation of the PRESENT block-cipher
23 * email: daniel.otte@rub.de
30 #include <avr/pgmspace.h>
32 #include "present_common.h"
33 #include "present128.h"
36 void key_update_128(uint8_t *buffer, uint8_t round){
39 union __attribute__((packed)){
43 /* rotate buffer 67 right */
45 tmp.v8[0] = buffer[j];
46 buffer[j] = buffer[j + 8];
47 buffer[j + 8] = tmp.v8[0];
50 t8 = (uint16_t)buffer[15] << (5);
52 tmp.v8[1] = buffer[j];
54 buffer[j] = tmp.v8[1] | t8;
55 t8 = tmp.v8[0] & 0xe0;
57 /* rotating done now substitution */
58 buffer[0] = present_sbox(buffer[0]);
59 /* xor with round counter */
60 buffer[8] ^= round << 6;
61 buffer[7] ^= round >> 2;
66 void key_update_128_inv(uint8_t *buffer, uint8_t round){
69 union __attribute__((packed)){
73 /* xor with round counter */
74 buffer[8] ^= round << 6;
75 buffer[7] ^= round >> 2;
77 /* rotating done now substitution */
78 buffer[0] = present_sbox_inv(buffer[0]);
80 /* rotate buffer 67 left */
82 tmp.v8[0] = buffer[j];
83 buffer[j] = buffer[j + 8];
84 buffer[j + 8] = tmp.v8[0];
87 t8 = (uint16_t)buffer[0] >> (5);
89 tmp.v8[0] = buffer[j];
91 buffer[j] = tmp.v8[0] | t8;
92 t8 = tmp.v8[1] & 0x07;
96 void present128_init(const uint8_t *key, uint8_t keysize_b, present128_ctx_t *ctx){
98 memcpy(ctx->fwd_key, key, 16);
99 memcpy(ctx->rev_key, key, 16);
101 key_update_128(ctx->rev_key, i);
105 void present128_enc(void *buffer, present128_ctx_t *ctx){
106 present_generic_enc(buffer, (uint8_t*)ctx, 16, key_update_128);
109 void present128_dec(void *buffer, present128_ctx_t *ctx){
110 present_generic_dec(buffer, (uint8_t*)ctx, 16, key_update_128_inv);
114 void present128_enc(void *buffer, present128_ctx_t *ctx){
115 uint8_t i,j,tmp[8], k[16];
116 memcpy(k, ctx->fwd_key, 16);
117 memxor(buffer, k, 8);
121 tmp[j] = present_sbox(((uint8_t*)buffer)[j]);
123 present_p(buffer, tmp);
124 key_update_128(k, i);
125 memxor(buffer, k, 8);
129 void present128_dec(void *buffer, present128_ctx_t *ctx){
130 uint8_t j,tmp[8], k[16];
132 memcpy(k, ctx->rev_key, 16);
133 memxor(buffer, k, 8);
136 present_p(tmp, buffer);
137 present_p(buffer, tmp);
140 ((uint8_t*)buffer)[j] = present_sbox_inv(((uint8_t*)buffer)[j]);
142 key_update_128_inv(k, i);
143 memxor(buffer, k, 8);