]> git.cryptolib.org Git - avr-crypto-lib.git/blob - keccak/keccak-stub.c
[keccak-asm] clean up
[avr-crypto-lib.git] / keccak / keccak-stub.c
1 /* keecak.c */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de)
5
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.
10
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.
15
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/>.
18 */
19
20 #include <stdint.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include "memxor.h"
24 #include "keccak.h"
25
26 void keccak_f1600(uint8_t a[200]);
27
28 void keccak_lastBlock(keccak_ctx_t* ctx, const void* block, uint16_t length_b){
29     uint8_t length_B;
30     while(length_b >= ctx->r){
31         keccak_nextBlock(ctx, block);
32         block = (uint8_t*)block + ctx->bs;
33         length_b -=  ctx->r;
34     }
35     length_B = length_b / 8;
36     memxor(ctx->a, block, length_B);
37     /* append 1 */
38     if(length_b & 7){
39         /* we have some single bits */
40         uint8_t t;
41         t = ((uint8_t*)block)[length_B] >> (8 - (length_b & 7));
42         t |= 0x01 << (length_b & 7);
43         ctx->a[length_B] ^= t;
44     }else{
45         ctx->a[length_B] ^= 0x01;
46     }
47     if(length_b == ctx->r - 1){
48         keccak_f1600(ctx->a);
49     }
50     ctx->a[ctx->bs - 1] ^= 0x80;
51     keccak_f1600(ctx->a);
52 }
53
54