.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{ . if \nF \{ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "fr::crypto::EVP_EncryptInit 3SSL" .TH fr::crypto::EVP_EncryptInit 3SSL "2015-12-31" "1.0.2a 1.0.2c" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NOM" .IX Header "NOM" EVP_CIPHER_CTX_init, EVP_EncryptInit_ex, EVP_EncryptUpdate, EVP_EncryptFinal_ex, EVP_DecryptInit_ex, EVP_DecryptUpdate, EVP_DecryptFinal_ex, EVP_CipherInit_ex, EVP_CipherUpdate, EVP_CipherFinal_ex, EVP_CIPHER_CTX_set_key_length, EVP_CIPHER_CTX_ctrl, EVP_CIPHER_CTX_cleanup, EVP_EncryptInit, EVP_EncryptFinal, EVP_DecryptInit, EVP_DecryptFinal, EVP_CipherInit, EVP_CipherFinal, EVP_get_cipherbyname, EVP_get_cipherbynid, EVP_get_cipherbyobj, EVP_CIPHER_nid, EVP_CIPHER_block_size, EVP_CIPHER_key_length, EVP_CIPHER_iv_length, EVP_CIPHER_flags, EVP_CIPHER_mode, EVP_CIPHER_type, EVP_CIPHER_CTX_cipher, EVP_CIPHER_CTX_nid, EVP_CIPHER_CTX_block_size, EVP_CIPHER_CTX_key_length, EVP_CIPHER_CTX_iv_length, EVP_CIPHER_CTX_get_app_data, EVP_CIPHER_CTX_set_app_data, EVP_CIPHER_CTX_type, EVP_CIPHER_CTX_flags, EVP_CIPHER_CTX_mode, EVP_CIPHER_param_to_asn1, EVP_CIPHER_asn1_to_param, EVP_CIPHER_CTX_set_padding, EVP_enc_null, EVP_des_cbc, EVP_des_ecb, EVP_des_cfb, EVP_des_ofb, EVP_des_ede_cbc, EVP_des_ede, EVP_des_ede_ofb, EVP_des_ede_cfb, EVP_des_ede3_cbc, EVP_des_ede3, EVP_des_ede3_ofb, EVP_des_ede3_cfb, EVP_desx_cbc, EVP_rc4, EVP_rc4_40, EVP_idea_cbc, EVP_idea_ecb, EVP_idea_cfb, EVP_idea_ofb, EVP_idea_cbc, EVP_rc2_cbc, EVP_rc2_ecb, EVP_rc2_cfb, EVP_rc2_ofb, EVP_rc2_40_cbc, EVP_rc2_64_cbc, EVP_bf_cbc, EVP_bf_ecb, EVP_bf_cfb, EVP_bf_ofb, EVP_cast5_cbc, EVP_cast5_ecb, EVP_cast5_cfb, EVP_cast5_ofb, EVP_rc5_32_12_16_cbc, EVP_rc5_32_12_16_ecb, EVP_rc5_32_12_16_cfb, EVP_rc5_32_12_16_ofb, EVP_aes_128_gcm, EVP_aes_192_gcm, EVP_aes_256_gcm, EVP_aes_128_ccm, EVP_aes_192_ccm, EVP_aes_256_ccm \- Routines de chiffrement \s-1EVP\s0 .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fB #include \fR .PP \&\fB void EVP_CIPHER_CTX_init(\s-1EVP_CIPHER_CTX\s0 *a);\fR .PP \&\fB int EVP_EncryptInit_ex(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, const \s-1EVP_CIPHER\s0 *\fR\fItype\fR\fB,\fR \fB\s-1ENGINE\s0 *\fR\fIimpl\fR\fB, unsigned char *\fR\fIkey\fR\fB, unsigned char *\fR\fIiv\fR\fB);\fR \fBint EVP_EncryptUpdate(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *\fR\fIout\fR\fB,\fR \fBint *\fR\fIoutl\fR\fB, unsigned char *\fR\fIin\fR\fB, int\fR \fIinl\fR\fB);\fR \fBint EVP_EncryptFinal_ex(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *\fR\fIout\fR\fB,\fR \fBint *\fR\fIoutl\fR\fB);\fR .PP \&\fB int EVP_DecryptInit_ex(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, const \s-1EVP_CIPHER\s0 *\fR\fItype\fR\fB,\fR \fB\s-1ENGINE\s0 *\fR\fIimpl\fR\fB, unsigned char *\fR\fIkey\fR\fB, unsigned char *\fR\fIiv\fR\fB);\fR \fBint EVP_DecryptUpdate(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *\fR\fIout\fR\fB,\fR \fBint *\fR\fIoutl\fR\fB, unsigned char *\fR\fIin\fR\fB, int\fR \fIinl\fR\fB);\fR \fBint EVP_DecryptFinal_ex(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *outm,\fR \fBint *\fR\fIoutl\fR\fB);\fR .PP \&\fB int EVP_CipherInit_ex(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, const \s-1EVP_CIPHER\s0 *\fR\fItype\fR\fB,\fR \fB\s-1ENGINE\s0 *\fR\fIimpl\fR\fB, unsigned char *\fR\fIkey\fR\fB, unsigned char *\fR\fIiv\fR\fB, int enc);\fR \fBint EVP_CipherUpdate(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *\fR\fIout\fR\fB,\fR \fBint *\fR\fIoutl\fR\fB, unsigned char *\fR\fIin\fR\fB, int\fR \fIinl\fR\fB);\fR \fBint EVP_CipherFinal_ex(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *outm,\fR \fBint *\fR\fIoutl\fRB);> .PP \&\fB int EVP_EncryptInit(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, const \s-1EVP_CIPHER\s0 *\fR\fItype\fR\fB,\fR \fBunsigned char *\fR\fIkey\fR\fB, unsigned char *\fR\fIiv\fR\fB);\fR \fBint EVP_EncryptFinal(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *\fR\fIout\fR\fB,\fR \fBint *\fR\fIoutl\fR\fB);\fR .PP \&\fB int EVP_DecryptInit(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, const \s-1EVP_CIPHER\s0 *\fR\fItype\fR\fB,\fR \fBunsigned char *\fR\fIkey\fR\fB, unsigned char *\fR\fIiv\fR\fB);\fR \fBint EVP_DecryptFinal(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *\fR\fIoutm\fR\fB,\fR \fBint *\fR\fIoutl\fR\fB);\fR .PP \&\fB int EVP_CipherInit(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, const \s-1EVP_CIPHER\s0 *\fR\fItype\fR\fB,\fR \fBunsigned char *\fR\fIkey\fR\fB, unsigned char *\fR\fIiv\fR\fB, int\fR \fIenc\fR\fB);\fR \fBint EVP_CipherFinal(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, unsigned char *\fR\fIoutm\fR\fB,\fR \fBint *\fR\fIoutl\fR\fB);\fR .PP \&\fB int EVP_CIPHER_CTX_set_padding(\s-1EVP_CIPHER_CTX\s0 *x, int padding);\fR \fBint EVP_CIPHER_CTX_set_key_length(\s-1EVP_CIPHER_CTX\s0 *x, int keylen);\fR \fBint EVP_CIPHER_CTX_ctrl(\s-1EVP_CIPHER_CTX\s0 *\fR\fIctx\fR\fB, int\fR \fItype\fR\fB, int arg, void *ptr);\fR \fBint EVP_CIPHER_CTX_cleanup(\s-1EVP_CIPHER_CTX\s0 *a);\fR .PP \&\fB const \s-1EVP_CIPHER\s0 *EVP_get_cipherbyname(const char *name);\fR \fB#define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a))\fR \fB#define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a))\fR .PP \&\fB #define EVP_CIPHER_nid(e) ((e)\->nid)\fR \fB#define EVP_CIPHER_block_size(e) ((e)\->block_size)\fR \fB#define EVP_CIPHER_key_length(e) ((e)\->key_len)\fR \fB#define EVP_CIPHER_iv_length(e) ((e)\->iv_len)\fR \fB#define EVP_CIPHER_flags(e) ((e)\->flags)\fR \fB#define EVP_CIPHER_mode(e) ((e)\->flags) & \s-1EVP_CIPH_MODE\s0)\fR \fBint EVP_CIPHER_type(const \s-1EVP_CIPHER\s0 *\fR\fIctx\fR\fB);\fR .PP \&\fB #define EVP_CIPHER_CTX_cipher(e) ((e)\->cipher)\fR \fB#define EVP_CIPHER_CTX_nid(e) ((e)\->cipher\->nid)\fR \fB#define EVP_CIPHER_CTX_block_size(e) ((e)\->cipher\->block_size)\fR \fB#define EVP_CIPHER_CTX_key_length(e) ((e)\->key_len)\fR \fB#define EVP_CIPHER_CTX_iv_length(e) ((e)\->cipher\->iv_len)\fR \fB#define EVP_CIPHER_CTX_get_app_data(e) ((e)\->app_data)\fR \fB#define EVP_CIPHER_CTX_set_app_data(e,d) ((e)\->app_data=(char *)(d))\fR \fB#define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c))\fR \fB#define EVP_CIPHER_CTX_flags(e) ((e)\->cipher\->flags)\fR \fB#define EVP_CIPHER_CTX_mode(e) ((e)\->cipher\->flags & \s-1EVP_CIPH_MODE\s0)\fR .PP \&\fB int EVP_CIPHER_param_to_asn1(\s-1EVP_CIPHER_CTX\s0 *c, \s-1ASN1_TYPE\s0 *\fR\fItype\fR\fB);\fR \fBint EVP_CIPHER_asn1_to_param(\s-1EVP_CIPHER_CTX\s0 *c, \s-1ASN1_TYPE\s0 *\fR\fItype\fR\fB);\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" Les routines de chiffrement \s-1EVP\s0 sont des interfaces de haut niveau pour certains algorithmes de chiffrement symétrique. .PP \&\fBEVP_CIPHER_CTX_init\fR() initialise le contexte de chiffrement \fIctx\fR. .PP \&\fBEVP_EncryptInit_ex\fR() définit le contexte de chiffrement \fIctx\fR pour un chiffrement avec l’algorithme de \fItype\fR de l’ENGINE \fIimpl\fR. \fIctx\fR doit être initialisé avant l’appel de cette fonction. \fItype\fR est normalement fourni par une fonction telle que \fBEVP_des_cbc\fR(). Si \fIimpl\fR est \s-1NULL,\s0 alors l’implémentation par défaut est utilisée. \fIkey\fR est la clef symétrique à utiliser et \fIiv\fR est le vecteur d'initialisation à utiliser (si nécessaire) ; le nombre réel d’octets à utiliser pour la clef et le vecteur dépend de l’algorithme. Il est possible de définir tous les paramètres à \s-1NULL\s0 à l’exception de \fItype\fR lors de l’appel initial et fournir les paramètres restants lors les prochains appels en ayant tous \&\fItype\fR définis à \s-1NULL.\s0 Cela est fait quand les paramètres de l’algorithme ne sont pas adéquats. .PP \&\fBEVP_EncryptUpdate\fR() chiffre \fIinl\fR octets du tampon \fIin\fR et écrit le résultat dans \fIout\fR. Cette fonction peut être appelée de multiples fois pour chiffrer des blocs successifs de données. Le total des données écrites est fonction de l’alignement des blocs : par conséquent, le total des données écrites peut être de zéro octet jusqu’à (inl + cipher_block_size − 1), aussi \fIout\fR doit être suffisamment grand. Le nombre réel d’octets écrits est placé dans \fIoutl\fR. .PP Si le remplissage est activé (action par défaut), alors \&\fBEVP_EncryptFinal_ex\fR() chiffre les données « finales », c’est\-à\-dire les données restantes dans un bloc incomplet. Pour cela, le remplissage par bloc standard (alias remplissage \s-1PKCS\s0) est utilisé. Les données finales chiffrées sont écrites dans \fIout\fR qui doit être suffisamment grand pour un bloc chiffré. Le nombre d’octets écrits est placé dans \&\fIoutl\fR. Après l’appel de cette fonction l’opération de chiffrement est terminée et aucun appel ne peut plus être fait à \fBEVP_EncryptUpdate\fR(). .PP Si le remplissage n’est pas activé, alors \fBEVP_EncryptFinal_ex\fR() ne chiffrera plus aucune donnée et une erreur sera renvoyée si quelques données subsistent dans un bloc incomplet : c’est\-à\-dire, la taille totale des données n’est pas un multiple de la taille du bloc. .PP \&\fBEVP_DecryptInit_ex\fR(), \fBEVP_DecryptUpdate\fR()et \fBEVP_DecryptFinal_ex\fR() sont les opérations de déchiffrement correspondantes. \fBEVP_DecryptFinal\fR() renverra un code d’erreur si le remplissage est activé et le bloc final non correctement formaté. Les paramètres et limitations sont identiques aux opérations de chiffrement à l’exception que, si le remplissage est activé, le tampon \fIout\fR des données déchiffrées transmis pour \&\fBEVP_DecryptUpdate\fR() doit être de taille suffisante pour (\fIinl + cipher_block_size\fR) octets, à moins que la taille du bloc de chiffrement soit \fB1\fR, auquel cas \fIinl\fR octets sont suffisants. .PP \&\fBEVP_CipherInit_ex\fR(), \fBEVP_CipherUpdate\fR() et \fBEVP_CipherFinal_ex\fR() sont des fonctions qui peuvent être utilisées pour le chiffrement et le déchiffrement. L’opération réalisée dépend de la valeur du paramètre \&\fIenc\fR. Il doit être défini à \fB1\fR pour le chiffrement, \fB0\fR pour le déchiffrement et \fB\-1\fR pour ne pas changer sa valeur (la valeur du moment de « enc » fournie par un précédent appel). .PP \&\fBEVP_CIPHER_CTX_cleanup\fR() supprime toute donnée d’un contexte de chiffrement et libère toute mémoire qui lui soit allouée. Cette fonction doit être appelée après toute opération de chiffrement de façon qu’aucune donnée sensible ne subsiste en mémoire. .PP \&\fBEVP_EncryptInit\fR(), \fBEVP_DecryptInit\fR() et \fBEVP_CipherInit\fR() se comportent de manière similaire à \fBEVP_EncryptInit_ex\fR(), \&\fBEVP_DecryptInit_ex\fR et \fBEVP_CipherInit_ex\fR() à l’exception que les paramètres de \fIctx\fR n’ont nul besoin d’être initialisés et utilisent toujours l’implémentation par défaut de l’algorithme de chiffrement. .PP \&\fBEVP_EncryptFinal\fR(), \fBEVP_DecryptFinal\fR() et \fBEVP_CipherFinal\fR() se comportent de manière similaire à \fBEVP_EncryptFinal_ex\fR(), \&\fBEVP_DecryptFinal_ex\fR() et \fBEVP_CipherFinal_ex\fR() à l’exception que \fIctx\fR est automatiquement nettoyé après l’appel. .PP \&\fBEVP_get_cipherbyname\fR(), \fBEVP_get_cipherbynid\fR() et \&\fBEVP_get_cipherbyobj\fR() renvoient une structure \fB\s-1EVP_CIPHER\s0\fR lorsqu’un nom d’algorithme de chiffrement, un \s-1NID\s0 ou une structure \fB\s-1ASN1_OBJECT\s0\fR est fourni. .PP \&\fBEVP_CIPHER_nid\fR() et \fBEVP_CIPHER_CTX_nid\fR() renvoie l’identifiant \s-1NID\s0 d’un chiffrement lorsqu’une structure \fB\s-1EVP_CIPHER\s0\fR ou \fB\s-1EVP_CIPHER_CTX\s0\fR est fournie. La valeur courante du \s-1NID\s0 est une valeur interne qui pourrait ne pas avoir un \s-1OBJECT IDENTIFIER\s0 correspondant. .PP \&\fBEVP_CIPHER_CTX_set_padding\fR() autorise ou non le remplissage. Par défaut le remplissage des opérations de chiffrement est fait en utilisant le remplissage de bloc standard et est contrôlé puis supprimé lors du déchiffrement. Si le paramètre \fIpad\fR vaut zéro, alors aucun remplissage n’est réalisé, le total des données chiffrées ou déchiffrées doit alors être un multiple de la taille de bloc ou une erreur s’ensuivra. .PP \&\fBEVP_CIPHER_key_length\fR() et \fBEVP_CIPHER_CTX_key_length\fR() renvoient la longueur de clef d’un chiffrement quand une structure \fB\s-1EVP_CIPHER\s0\fR ou \&\fB\s-1EVP_CIPHER_CTX\s0\fR est fournie. La constante \fB\s-1EVP_MAX_KEY_LENGTH\s0\fR est la longueur maximale de clef pour tous les algorithmes de chiffrement. Remarque : bien que \fBEVP_CIPHER_key_length\fR() est déterminée pour un algorithme de chiffrement, la valeur de \&\fBEVP_CIPHER_CTX_key_length\fR() peut être différente pour des longueurs de clef variables d’algorithme de chiffrement. .PP \&\fBEVP_CIPHER_CTX_set_key_length\fR() définit la longueur de clef d’un contexte de chiffrement. Si le chiffrement a une longueur fixe de clef, alors essayer de définir la longueur de clef à une valeur différente est fautif. .PP \&\fBEVP_CIPHER_iv_length\fR() et \fBEVP_CIPHER_CTX_iv_length\fR() renvoient la longueur du vecteur d'initialisation du chiffrement lorsque est fournie \&\fB\s-1EVP_CIPHER\s0\fR ou \fB\s-1EVP_CIPHER_CTX\s0\fR. Zéro sera renvoyé si l’algorithme de chiffrement n’utilise pas de vecteur d'initialisation. La constante \&\fB\s-1EVP_MAX_IV_LENGTH\s0\fR est la longueur maximale du vecteur d'initialisation de tous les algorithmes de chiffrement. .PP \&\fBEVP_CIPHER_block_size\fR() et \fBEVP_CIPHER_CTX_block_size3\fR() renvoie la taille de bloc d’un chiffrement lorsqu'est fourni une structure \&\fB\s-1EVP_CIPHER\s0\fR ou \fB\s-1EVP_CIPHER_CTX\s0\fR. La constante \fB\s-1EVP_MAX_IV_LENGTH\s0\fR est aussi la longueur maximale pour les algorithmes de chiffrement. .PP \&\fBEVP_CIPHER_type\fR() et \fBEVP_CIPHER_CTX_type\fR() renvoient le type des algorithmes de chiffrement ou de contexte. Ce « type » est l’identifiant \s-1NID\s0 réel de \s-1OBJECT IDENTIFIER\s0 du chiffrement et donc ignore les paramètres de l’algorithme, et \s-1RC2 40\s0 bits et \s-1RC2 128\s0 bits ont le même \s-1NID.\s0 Si l’algorithme n’a pas d’identifiant objet ou n’est pas pris en charge par \&\s-1ASN1,\s0 cette fonction renverra \fBNID_undef\fR. .PP \&\fBEVP_CIPHER_CTX_cipher\fR() renvoie la structure \fB\s-1EVP_CIPHER\s0\fR lorsqu’est fournie une structure \fB\s-1EVP_CIPHER_CTX\s0\fR. .PP \&\fBEVP_CIPHER_mode\fR() et \fBEVP_CIPHER_CTX_mode\fR() renvoient le mode de chiffrement par bloc : \fB\s-1EVP_CIPH_ECB_MODE\s0\fR, \fB\s-1EVP_CIPH_CBC_MODE\s0\fR, \&\fB\s-1EVP_CIPH_CFB_MODE\s0\fR ou \fB\s-1EVP_CIPH_OFB_MODE\s0\fR. Si le chiffrement est un chiffrement par flot, alors \fB\s-1EVP_CIPH_STREAM_CIPHER\s0\fR est renvoyé. .PP \&\fBEVP_CIPHER_param_to_asn1\fR() définit le « paramètre » \&\fBAlgorithmIdentifier\fR en fonction de l’algorithme de chiffrement fourni. Classiquement, cela inclut n’importe quel paramètre et un vecteur d'initialisation. Le vecteur du chiffrement (s’il existe) doit être défini quand cet appel est fait. Cet appel doit être fait avant que l’algorithme soit pratiquement « utilisé » (avant n’importe quel appel \&\fBEVP_EncryptUpdate\fR(), \fBEVP_DecryptUpdate\fR() par exemple). Cette fonction peut échouer si l’algorithme n’est nullement pris en charge par \s-1ASN1.\s0 .PP \&\fBEVP_CIPHER_asn1_to_param\fR() définit les paramètres de l’algorithme de chiffrement en fonction des « paramètres » \s-1ASN1 \&\s0\fBAlgorithmIdentifier\fR. L’effet exact dépend de l’algorithme. Dans le cas de \&\s-1RC2\s0 par exemple, le vecteur d'initialisation et la clef utilisée seront définis. Cette fonction devrait être appelée après que le type de l’algorithme de base soit défini mais avant que la clef ne soit définie. Par exemple \fBEVP_CipherInit\fR() sera appelée avec le vecteur et la clef définis à \s-1NULL, \s0\fBEVP_CIPHER_asn1_to_param\fR() sera appelée puis finalement \&\fBEVP_CipherInit\fR() le sera avec tous les paramètres sauf la clef définie à \&\s-1NULL.\s0 Il est possible que cette fonction échoue si l’algorithme n’est nullement pris en charge par \s-1ASN1\s0 ou que les paramètres ne peuvent être définis (par exemple, la longueur réelle de la clef \s-1RC2\s0 n’est pas prise en charge). .PP \&\fBEVP_CIPHER_CTX_ctrl\fR() permet de déterminer et définir les paramètres particuliers de différents algorithmes. .SH "VALEURS DE RETOUR" .IX Header "VALEURS DE RETOUR" \&\fBEVP_EncryptInit_ex\fR(), \fBEVP_EncryptUpdate\fR() et \fBEVP_EncryptFinal_ex\fR() renvoient \fB1\fR lors d’un succès et \fB0\fR lors d’un échec. .PP \&\fBEVP_DecryptInit_ex\fR() et \fBEVP_DecryptUpdate\fR() renvoient \fB1\fR lors d’un succès et \fB0\fR lors d’un échec. \fBEVP_DecryptFinal_ex\fR() renvoie \fB0\fR si le déchiffrement est un échec ou \fB1\fR si c’est une réussite. .PP \&\fBEVP_CipherInit_ex\fR() et \fBEVP_CipherUpdate\fR() renvoient \fB1\fR pour un succès et \fB0\fR pour un échec. \fBEVP_CipherFinal_ex\fR() renvoie \fB0\fR pour un échec de déchiffrement et \fB1\fR pour une réussite. .PP \&\fBEVP_CIPHER_CTX_cleanup\fR() renvoie \fB1\fR pour un succès et \fB0\fR pour un échec. .PP \&\fBEVP_get_cipherbyname\fR(), \fBEVP_get_cipherbynid\fR() et \&\fBEVP_get_cipherbyobj\fR() renvoient une structure \fB\s-1EVP_CIPHER\s0\fR ou \s-1NULL\s0 en cas d’erreur. .PP \&\fBEVP_CIPHER_nid\fR() et \fBEVP_CIPHER_CTX_nid\fR() renvoient un identifiant \s-1NID.\s0 .PP \&\fBEVP_CIPHER_block_size\fR() et \fBEVP_CIPHER_CTX_block_size\fR() renvoient la taille de bloc. .PP \&\fBEVP_CIPHER_key_length\fR() et \fBEVP_CIPHER_CTX_key_length\fR() renvoient la longueur de clef. .PP \&\fBEVP_CIPHER_CTX_set_padding\fR() renvoie toujours \fB1\fR. .PP \&\fBEVP_CIPHER_iv_length\fR() et \fBEVP_CIPHER_CTX_iv_length\fR() renvoient la longueur du vecteur d'initialisation ou \fB0\fR si l’algorithme de chiffrement n’utilise pas de vecteur. .PP \&\fBEVP_CIPHER_type\fR() et \fBEVP_CIPHER_CTX_type\fR() renvoient le \s-1NID\s0 du \s-1OBJECT IDENTIFIER\s0 de l’algorithme de chiffrement ou \fBNID_undef\fR s’il n’a aucun \&\s-1OBJECT IDENTIFIER\s0 de défini. .PP \&\fBEVP_CIPHER_CTX_cipher\fR() renvoie une structure \fB\s-1EVP_CIPHER\s0\fR. .PP \&\fBEVP_CIPHER_param_to_asn1\fR() et \fBEVP_CIPHER_asn1_to_param\fR() renvoient \&\fB1\fR pour une réussite ou zéro pour un échec. .SH "LISTE DES ALGORITHMES DE CHIFFREMENT" .IX Header "LISTE DES ALGORITHMES DE CHIFFREMENT" Tous les algorithmes ont une longueur fixe de clef sauf stipulation contraire. .IP "\fBEVP_enc_null\fR()" 4 .IX Item "EVP_enc_null()" Algorithme \s-1NULL,\s0 sans action .IP "\fBEVP_des_cbc\fR(void), \fBEVP_des_ecb\fR(void), \fBEVP_des_cfb\fR(void), \fBEVP_des_ofb\fR(void)" 4 .IX Item "EVP_des_cbc(void), EVP_des_ecb(void), EVP_des_cfb(void), EVP_des_ofb(void)" Respectivement, \s-1DES\s0 avec les modes \s-1CBC, ECB, CFB\s0 et \s-1OFB.\s0 .IP "\fBEVP_des_ede_cbc\fR(void), \fBEVP_des_ede\fR(), \fBEVP_des_ede_ofb\fR(void), \fBEVP_des_ede_cfb\fR(void)" 4 .IX Item "EVP_des_ede_cbc(void), EVP_des_ede(), EVP_des_ede_ofb(void), EVP_des_ede_cfb(void)" Respectivement, triple \s-1DES\s0 à deux clefs avec les modes \s-1CBC, ECB, CFB\s0 et \s-1OFB.\s0 .IP "\fBEVP_des_ede3_cbc\fR(void), \fBEVP_des_ede3\fR(), \fBEVP_des_ede3_ofb\fR(void), \fBEVP_des_ede3_cfb\fR(void)" 4 .IX Item "EVP_des_ede3_cbc(void), EVP_des_ede3(), EVP_des_ede3_ofb(void), EVP_des_ede3_cfb(void)" Respectivement, triple \s-1DES\s0 à trois clefs avec les modes \s-1CBC, ECB, CFB\s0 et \&\s-1OFB.\s0 .IP "\fBEVP_desx_cbc\fR(void)" 4 .IX Item "EVP_desx_cbc(void)" Algorithme \s-1DESX\s0 avec le mode \s-1CBC.\s0 .IP "\fBEVP_rc4\fR(void)" 4 .IX Item "EVP_rc4(void)" Chiffrement par flot \s-1RC4.\s0 Algorithme avec une longueur de clef variable, par défaut 128 bits. .IP "\fBEVP_rc4_40\fR(void)" 4 .IX Item "EVP_rc4_40(void)" Algorithme de chiffrement \s-1RC4\s0 avec une longueur de clef de 40 bits. Obsolète, de préférence utiliser \fBEVP_rc4\fR() et la fonction \&\fBEVP_CIPHER_CTX_set_key_length\fR(). .IP "\fBEVP_idea_cbc\fR() \fBEVP_idea_ecb\fR(void), \fBEVP_idea_cfb\fR(void), \fBEVP_idea_ofb\fR(void), \fBEVP_idea_cbc\fR(void)" 4 .IX Item "EVP_idea_cbc() EVP_idea_ecb(void), EVP_idea_cfb(void), EVP_idea_ofb(void), EVP_idea_cbc(void)" Algorithme de chiffrement \s-1IDEA\s0 avec les modes \s-1CBC, ECB, CFB\s0 et \s-1OFB\s0 respectivement. .IP "\fBEVP_rc2_cbc\fR(void), \fBEVP_rc2_ecb\fR(void), \fBEVP_rc2_cfb\fR(void), \fBEVP_rc2_ofb\fR(void)" 4 .IX Item "EVP_rc2_cbc(void), EVP_rc2_ecb(void), EVP_rc2_cfb(void), EVP_rc2_ofb(void)" Algorithme de chiffrement \s-1RC2\s0 avec respectivement les modes \s-1CBC, ECB, CFB,\s0 et \s-1OFB.\s0 Algorithme avec une longueur de clef variable et un paramètre additionnel « effective key bits » ou « effective key length » (par défaut, défini à 128 bits). .IP "\fBEVP_rc2_40_cbc\fR(void), \fBEVP_rc2_64_cbc\fR(void)" 4 .IX Item "EVP_rc2_40_cbc(void), EVP_rc2_64_cbc(void)" Algorithme de chiffrement \s-1RC2\s0 avec le mode \s-1CBC\s0 et par défaut, une longueur de clef et une longueur de clef efficace de 40 et 64 bits. Obsolète, de préférence utiliser \fBEVP_rc2_cbc\fR(), \fBEVP_CIPHER_CTX_set_key_length\fR() et \&\fBEVP_CIPHER_CTX_ctrl\fR() pour définir la longueur de clef et la longueur de clef efficace. .IP "\fBEVP_bf_cbc\fR(void), \fBEVP_bf_ecb\fR(void), \fBEVP_bf_cfb\fR(void), \fBEVP_bf_ofb\fR(void);" 4 .IX Item "EVP_bf_cbc(void), EVP_bf_ecb(void), EVP_bf_cfb(void), EVP_bf_ofb(void);" Algorithme de chiffrement Blowfish avec respectivement les modes \s-1CBC, ECB, CFB\s0 et \s-1OFB.\s0 Algorithme à longueur de clef variable. .IP "\fBEVP_cast5_cbc\fR(void), \fBEVP_cast5_ecb\fR(void), \fBEVP_cast5_cfb\fR(void), \fBEVP_cast5_ofb\fR(void)" 4 .IX Item "EVP_cast5_cbc(void), EVP_cast5_ecb(void), EVP_cast5_cfb(void), EVP_cast5_ofb(void)" Algorithme de chiffrement \s-1CAST\s0 avec respectivement les modes \s-1CBC, ECB, CFB\s0 et \s-1OFB.\s0 Algorithme à longueur de clef variable. .IP "\fBEVP_rc5_32_12_16_cbc\fR(void), \fBEVP_rc5_32_12_16_ecb\fR(void), \fBEVP_rc5_32_12_16_cfb\fR(void), \fBEVP_rc5_32_12_16_ofb\fR(void)" 4 .IX Item "EVP_rc5_32_12_16_cbc(void), EVP_rc5_32_12_16_ecb(void), EVP_rc5_32_12_16_cfb(void), EVP_rc5_32_12_16_ofb(void)" Algorithme de chiffrement \s-1RC5\s0 avec respectivement les modes \s-1CBC, ECB, CFB\s0 et \&\s-1OFB.\s0 Algorithme à longueur de clef variable avec un paramètre additionnel « nombre de tours ». Par défaut, la longueur de clef est de 128 bits et le nombre de tours 12. .IP "\fBEVP_aes_128_gcm\fR(void), \fBEVP_aes_192_gcm\fR(void), \fBEVP_aes_256_gcm\fR(void)" 4 .IX Item "EVP_aes_128_gcm(void), EVP_aes_192_gcm(void), EVP_aes_256_gcm(void)" Mode \s-1AES\s0 Galois Counter (\s-1GCM\s0) pour des clefs respectivement de 128, 192 et 256 bits. Ces algorithmes de chiffrement demandent des opérations de contrôle supplémentaires pour fonctionner correctement. Consultez la section \&\fBMode \s-1GCM\s0\fR ci-dessous pour plus de détails. .IP "\fBEVP_aes_128_ccm\fR(void), \fBEVP_aes_192_ccm\fR(void), \fBEVP_aes_256_ccm\fR(void)" 4 .IX Item "EVP_aes_128_ccm(void), EVP_aes_192_ccm(void), EVP_aes_256_ccm(void)" Mode \s-1AES\s0 Counter avec CBC-MAC (\s-1CCM\s0) pour des clefs respectivement de 128, 192 et 256 bits. Ces algorithmes de chiffrement demandent des opérations de contrôle supplémentaires pour fonctionner correctement. Consultez la section \&\fBMode \s-1CCM\s0\fR ci-dessous pour plus de détails. .SH "Mode GCM" .IX Header "Mode GCM" Pour les algorithmes de chiffrement en mode \s-1GCM,\s0 le comportement de l’interface \s-1EVP\s0 est subtilement modifiée et plusieurs opérations de contrôle spécifiques à \s-1GCM\s0 sont prises en charge. .PP Pour indiquer n’importe quelle autre donnée d’authentification (\s-1AAD\s0), un appel à \fBEVP_CipherUpdate\fR(), \fBEVP_EncryptUpdate\fR() ou \&\fBEVP_DecryptUpdate\fR() devrait être fait avec le paramètre de sortie \fIout\fR réglé à \s-1NULL.\s0 .PP Lors du déchiffrement, la valeur de retour de \fBEVP_DecryptFinal\fR() ou \&\fBEVP_CipherFinal\fR() renseigne sur la réussite de l’opération. En cas de non succès, l’opération d’authentification a échoué et aucune donnée de sortie \&\fBne doit pas\fR être utilisée car corrompue. .PP Les contrôles suivants sont pris en charge dans le mode \s-1GCM :\s0 .PP .Vb 1 \& EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, ivlen, NULL); .Ve .PP Indication de la longueur du vecteur d'initialisation pour \s-1GCM.\s0 Cet appel peut être fait seulement avant de définir un vecteur d’initialisation Sans appel, une longueur de vecteur \s-1GCM\s0 est utilisée (96 bits pour \s-1AES\s0). EVP_CIPHER_CTX_ctrl(ctx, \s-1EVP_CTRL_GCM_GET_TAG,\s0 taglen, tag); .PP Écriture de \fItaglen\fR octets de valeur de la balise dans le tampon indiqué par \fItag\fR. Cet appel peut être fait seulement lors du chiffrement des données et \fBaprès\fR le traitement de toutes les données (p. ex., après un appel à \fBEVP_EncryptFinal\fR()). .PP .Vb 1 \& EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, taglen, tag); .Ve .PP Définition de la balise attendue à \fItaglen\fR octets à partir de \fItag\fR. Cet appel est seulement possible lors du déchiffrement des données et doit être fait \fBavant\fR le traitement de toute donnée (p. ex., avant n’importe quel appel \fBEVP_DecryptUpdate\fR()). .PP Consultez \fB\s-1EXEMPLES\s0\fR ci-dessous par un exemple d’utilisation du mode \s-1GCM\s0 .SH "Mode CCM" .IX Header "Mode CCM" Le comportement des algorithmes de chiffrement de mode \s-1CCM\s0 est similaire au mode \s-1CCM\s0 mais avec quelques obligations supplémentaires et des valeurs de contrôle différentes. .PP Comme pour le mode \s-1GCM,\s0 n’importe quelle autre donnée d’authentification (\s-1AAD\s0) est fournie en appelant \fBEVP_CipherUpdate\fR(), \fBEVP_EncryptUpdate\fR() ou \fBEVP_DecryptUpdate\fR() avec le paramètre \fIout\fR défini à \s-1NULL.\s0 En plus, la longueur du texte chiffré ou non \fBdoit\fR être fournie à \&\fBEVP_CipherUpdate\fR(), \fBEVP_EncryptUpdate\fR() ou \fBEVP_DecryptUpdate\fR() avec les paramètres d’entrée et de sortie (\fIin\fR et \fIout\fR) définis à \s-1NULL\s0 et la longueur indiquée dans le paramètre \fIinl\fR. .PP Les contrôles suivants sont pris en charge dans le mode \s-1CCM :\s0 .PP .Vb 1 \& EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, taglen, tag); .Ve .PP Cet appel est fait pour définir la valeur de la balise attendue \fI\s-1CCM\s0\fR lors du déchiffrement, ou la longueur de la balise (avec le paramètre \fItag\fR réglé à \s-1NULL\s0) lors du chiffrement. La longueur de la balise est souvent \&\fBM\fR. Si elle n’est pas précisée, une valeur par défaut est utilisée (12 pour \s-1AES\s0). .PP .Vb 1 \& EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_L, ivlen, NULL); .Ve .PP Définition de la valeur \fIL\fR du \s-1CCM.\s0 Non définie, une valeur par défaut est utilisée (8 pour \s-1AES\s0). .PP .Vb 1 \& EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, ivlen, NULL); .Ve .PP Définition de la longueur (vecteur d'initialisation) circonstancielle du \&\s-1CGM.\s0 Cet appel peut seulement être fait avant de préciser la valeur du moment. La valeur du moment est donné par \fI15 \- L\fR, ainsi c’est sept par défaut pour \s-1AES.\s0 .SH "NOTES" .IX Header "NOTES" Lorsque cela est possible, l’interface \s-1EVP\s0 pour les algorithmes symétriques devrait être utilisée de préférence aux interfaces de bas niveau. Cela parce que le code devient évident pour l’algorithme utilisé et plus souple. De plus, l’interface \s-1EVP\s0 garantit l’utilisation de l’accélération de chiffrement particulière à certaines plateformes telles que AES-NI (l’interface de bas niveau n’offre aucune garantie). .PP Le remplissage \s-1PKCS\s0 est réalisé en ajoutant \fIn\fR octets de valeur \fIn\fR pour que la longueur totale des données chiffrées soit un multiple de la taille de bloc. Comme le remplissage est toujours réalisé, si la taille des données est déjà un multiple de la taille de bloc, \fIn\fR sera égal à la taille de bloc. Par exemple, si la taille de bloc est \fB8\fR et \fB11\fR octets sont à chiffrés, alors \fB5\fR bits de remplissage de valeur \fB5\fR seront ajoutés. .PP Lors du déchiffrement, le bloc terminal est contrôlé pour s’assurer de sa forme correcte. .PP Bien que l’opération de déchiffrement puisse produire une erreur si le remplissage est activé, cela n’est pas un test fort pour l’exactitude des données d’entrée ou de la clef. Un bloc aléatoire a au mieux une chance sur 256 d’être d’un format correct et les problèmes avec les données précédentes ne provoqueront pas une erreur finale de déchiffrement. .PP Si le remplissage est activé, l’opération de déchiffrement sera toujours réussie si le total des données est un multiple de la taille de bloc. .PP Les fonctions \fBEVP_EncryptInit\fR(), \fBEVP_EncryptFinal\fR(), \&\fBEVP_DecryptInit\fR(), \fBEVP_CipherInit\fR() et \fBEVP_CipherFinal\fR() sont obsolètes mais sont conservées pour des raisons de compatibilité avec le code existant. \fBEVP_EncryptInit_ex\fR(), \fBEVP_EncryptFinal_ex\fR(), \&\fBEVP_DecryptInit_ex\fR(), \fBEVP_DecryptFinal_ex\fR(), \fBEVP_CipherInit_ex\fR() et \&\fBEVP_CipherFinal_ex\fR() doivent être utilisées car elles peuvent réutiliser le contexte existant sans avoir à allouer ou libérer à chaque appel. .SH "BOGUES" .IX Header "BOGUES" Pour \s-1RC5,\s0 le nombre de tours peut être actuellement être 8, 12 ou 16. C’est une limitation du code \s-1RC5\s0 actuel plutôt que de l’interface \s-1EVP.\s0 .PP \&\fB\s-1EVP_MAX_KEY_LENGTH\s0\fR et \fB\s-1EVP_MAX_IV_LENGTH\s0\fR font seulement référence aux algorithmes internes de chiffrement avec des longueurs de clef par défaut. Si des algorithmes personnalisés dépassent ces longueurs, les résultats sont imprévisibles. Cela est dû au fait qu’en pratique une clef générique est définie en un tableau « unsigned char » contenant \&\fB\s-1EVP_MAX_KEY_LENGTH\s0\fR. .PP Le code \s-1ASN1\s0 est incomplet (et parfois inexact), il a été testé pour certains algorithmes communs S/MIME (\s-1RC2, DES,\s0 triple \s-1DES\s0) avec le mode \s-1CBC.\s0 .SH "EXEMPLES" .IX Header "EXEMPLES" Chiffrer une chaîne en utilisant \s-1IDEA :\s0 .PP .Vb 12 \& int do_crypt(char *outfile) \& { \& unsigned char outbuf[1024]; \& int outlen, tmplen; \& /* Clef et VI bogués : normalement définis à partir \& * d’une autre source. \& */ \& unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; \& unsigned char iv[] = {1,2,3,4,5,6,7,8}; \& char intext[] = "Un texte chiffré"; \& EVP_CIPHER_CTX ctx; \& FILE *out; \& \& EVP_CIPHER_CTX_init(&ctx); \& EVP_EncryptInit_ex(&ctx, EVP_idea_cbc(), NULL, key, iv); \& \& if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext))) \& { \& /* Erreur */ \& return 0; \& } \& /* Le tampon fourni à EVP_EncryptFinal() doit, après les données \& * être juste chiffré pour éviter d’être surchargé. \& */ \& if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen)) \& { \& /* Erreur */ \& return 0; \& } \& outlen += tmplen; \& EVP_CIPHER_CTX_cleanup(&ctx); \& /* Mode binaire nécessaire pour fopen car les données chiffrées sont \& * des données binaires. strlen() ne peut être utilisée car \& * elles peuvent n’être terminées par NULL et peuvent comporter des \& * NULL. \& */ \& out = fopen(outfile, "wb"); \& fwrite(outbuf, 1, outlen, out); \& fclose(out); \& return 1; \& } .Ve .PP Le texte chiffré de l’exemple ci-dessus peut être décodé en utilisant l’utilitaire openssl avec la ligne de commande (montrée sur deux lignes par souci de clarté) : .PP .Vb 2 \& openssl idea \-d . Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages-fr-extra.