Annotation of rpl/src/chiffrement.c, revision 1.23
1.1 bertrand 1: /*
2: ================================================================================
1.23 ! bertrand 3: RPL/2 (R) version 4.1.24
1.17 bertrand 4: Copyright (C) 1989-2015 Dr. BERTRAND Joël
1.1 bertrand 5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.4 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
1.4 bertrand 28: Fonction de chiffrement d'un séquence d'octets
1.1 bertrand 29: ================================================================================
1.4 bertrand 30: Entrées : pointeur sur une structure
1.1 bertrand 31: --------------------------------------------------------------------------------
1.4 bertrand 32: Sorties :
1.1 bertrand 33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
1.4 bertrand 38: unsigned char *
1.19 bertrand 39: chiffrement(struct_processus *s_etat_processus,
40: const EVP_CIPHER *type_chiffrement, logical1 encodage,
1.9 bertrand 41: unsigned char *message, integer8 longueur_message,
42: unsigned char *clef, integer8 longueur_clef,
1.4 bertrand 43: unsigned char *vecteur_initialisation,
1.9 bertrand 44: integer8 *longueur_message_chiffre)
1.4 bertrand 45: {
1.6 bertrand 46: int i;
47: int longueur_bloc_de_chiffrement;
1.4 bertrand 48: int longueur_message_1;
49: int longueur_message_2;
50:
51: unsigned char *message_chiffre;
52:
53: EVP_CIPHER_CTX contexte;
54:
55: EVP_CIPHER_CTX_init(&contexte);
56:
1.6 bertrand 57: longueur_bloc_de_chiffrement = EVP_CIPHER_block_size(type_chiffrement);
58:
1.4 bertrand 59: if (EVP_CipherInit_ex(&contexte, type_chiffrement, NULL, clef,
60: vecteur_initialisation, (encodage == d_vrai) ? 1 : 0) != 1)
61: {
62: EVP_CIPHER_CTX_cleanup(&contexte);
63: return(NULL);
64: }
65:
66: (*longueur_message_chiffre) = ((longueur_message /
67: longueur_bloc_de_chiffrement) + 1) * longueur_bloc_de_chiffrement;
68:
1.9 bertrand 69: if ((message_chiffre = malloc(((size_t) (*longueur_message_chiffre)) *
1.4 bertrand 70: sizeof(unsigned char))) == NULL)
71: {
72: return(NULL);
73: }
74:
75: if (EVP_CipherUpdate(&contexte, message_chiffre, &longueur_message_1,
1.9 bertrand 76: message, (int) longueur_message) != 1)
1.4 bertrand 77: {
78: free(message_chiffre);
79: EVP_CIPHER_CTX_cleanup(&contexte);
80: return(NULL);
81: }
82:
83: if (EVP_CipherFinal_ex(&contexte, message_chiffre + longueur_message_1,
84: &longueur_message_2) != 1)
85: {
86: free(message_chiffre);
87: EVP_CIPHER_CTX_cleanup(&contexte);
88: return(NULL);
89: }
90:
91: (*longueur_message_chiffre) = longueur_message_1 + longueur_message_2;
1.6 bertrand 92:
93: // Mise à jour du vecteur d'initialisation
94:
1.7 bertrand 95: for(i = 0; i < EVP_CIPHER_iv_length(type_chiffrement); i++)
1.6 bertrand 96: {
97: vecteur_initialisation[i] = contexte.iv[i];
98: }
99:
1.4 bertrand 100: EVP_CIPHER_CTX_cleanup(&contexte);
101:
102: return(message_chiffre);
103: }
104:
1.1 bertrand 105: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>