]> AND Private Git Repository - Cipher_code.git/blob - Arduino/libraries/AESLib-master/bcal-basic.c
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Merge branch 'master' of ssh://info.iut-bm.univ-fcomte.fr/Cipher_code
[Cipher_code.git] / Arduino / libraries / AESLib-master / bcal-basic.c
1 /* bcal-basic.c */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2009  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 <stdlib.h>
21 #include <stdint.h>
22 #include <string.h>
23
24 #if (defined(__AVR__))
25 #include <avr\pgmspace.h>
26 #else
27 #include <pgmspace.h>
28 #endif
29 #include "blockcipher_descriptor.h"
30 #include "keysize_descriptor.h"
31
32 uint8_t bcal_cipher_init(const bcdesc_t* cipher_descriptor,
33                          const void* key, uint16_t keysize_b, bcgen_ctx_t* ctx){
34         if(!is_valid_keysize_P((PGM_VOID_P)pgm_read_word(&(cipher_descriptor->valid_keysize_desc)),
35                                keysize_b)){
36                 return 1;
37         }
38         uint8_t flags;
39         bc_init_fpt init_fpt;
40         ctx->desc_ptr = (bcdesc_t*)cipher_descriptor;
41         ctx->keysize  = keysize_b;
42         flags = pgm_read_byte(cipher_descriptor->flags);
43         init_fpt.initvoid = (void_fpt)(pgm_read_word(&(cipher_descriptor->init.initvoid)));
44         if(init_fpt.initvoid == NULL){
45                 if(!(ctx->ctx = malloc((keysize_b+7)/8)))
46                         return 2;
47                 memcpy(ctx->ctx, key, (keysize_b+7)/8);
48                 return 0;
49         }
50         if(!(ctx->ctx = malloc(pgm_read_word(&(cipher_descriptor->ctxsize_B)))))
51                 return 3;
52         if((flags&BC_INIT_TYPE)==BC_INIT_TYPE_1){
53                 init_fpt.init1((void*)key, (ctx->ctx));
54         }else{
55                 init_fpt.init2((void*)key, keysize_b, (ctx->ctx));
56         }
57         return 0;
58 }
59
60 void bcal_cipher_free(bcgen_ctx_t* ctx){
61         if(!ctx)
62                 return;
63         bc_free_fpt free_fpt;
64         free_fpt = (bc_free_fpt)(pgm_read_word(&(ctx->desc_ptr->free)));
65         if(free_fpt)
66                 free_fpt((ctx->ctx));
67         free(ctx->ctx);
68 }
69
70 void bcal_cipher_enc(void* block, const bcgen_ctx_t* ctx){
71         bc_enc_fpt enc_fpt;
72         enc_fpt.encvoid = (void_fpt)pgm_read_word(&(ctx->desc_ptr->enc.encvoid));
73         if(!enc_fpt.encvoid){
74                 /* very bad error, no enciphering function specified */
75                 return;
76         }
77         enc_fpt.enc1(block, (ctx->ctx));
78         
79 }
80
81 void bcal_cipher_dec(void* block, const bcgen_ctx_t* ctx){
82         bc_dec_fpt dec_fpt;
83         dec_fpt.decvoid = (void_fpt)pgm_read_word(&(ctx->desc_ptr->dec.decvoid));
84         if(!dec_fpt.decvoid){
85                 /* very bad error, no deciphering function specified */
86                 return;
87         }
88         dec_fpt.dec1(block, (ctx->ctx));
89 }
90
91 uint16_t bcal_cipher_getBlocksize_b(const bcdesc_t* desc){
92         return pgm_read_word(&(desc->blocksize_b));
93 }
94
95 PGM_VOID_P bcal_cipher_getKeysizeDesc(const bcdesc_t* desc){
96         return (PGM_VOID_P)pgm_read_word(&(desc->valid_keysize_desc));
97 }
98
99