/* -----------------------------------------------------------------------
 *
 * Copyright (c) 2002-2005 Mr Ludovic FLAMENT <ludovic.flament@free.fr>, LIEVIN, FRANCE
 *
 * Termes :
 *
 * L'utilisation et/ou la redistribution de ce code (avec ou sans modification),
 * ainsi que de tous les composants du produit (librairies, documentation, exemples, ...)
 * est soumise aux termes de la licence qui vous est attribuée par son auteur.
 *
 * -----------------------------------------------------------------------
 */

#ifndef _ECCTK_ECC_H_
#define _ECCTK_ECC_H_

/*! \file ecctk-ecc.h
 *
 * Ce fichier contiend les références des fonctions disponibles
 * pour la mise en oeuvre des algorithmes directement basés sur les
 * courbes elliptiques (signature, échange de clefs, authentification, ...).
 *
 * \author Ludovic FLAMENT <ludovic.flament\@free.fr>
 *
 * \warning L'utilisation et/ou la redistribution de ce code (avec ou sans modification),
 * ainsi que de tous les composants du produit (librairies, documentation, exemples, ...)
 * est soumise aux termes de la licence qui vous est attribuée par son auteur.
 */

#ifdef EXPORT_FUNCTIONS
#define DLL_EXPORT __declspec(dllexport)
#else
#ifndef DOXYGEN
#define DLL_EXPORT
#endif
#endif

#include <include/ecctk-prototype.h>

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^131) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 07ebcb7eecc296a1c4a1a14f2c9e44352e
 *  - b = 00610b0a57c73649ad0093bdd622a61d81
 *
 * - le polynome irréductible définissant GF(2^131) :
 *  - p(x) = x^131 + x^13 + x^2 + x + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 00439cbc8dc73aa981030d5bc57b331663
 *  - Py = 014904c07d4f25a16c2de036d60b762bd4
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 0400000000000000026abb991fe311fe83
 */
#define ECCTK_CURVE_CERTICOM_131		0x1311

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^131) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 07a11b09a76b562144418ff3ff8c2570b
 *  - b = 0217c05610884b63b9c6c7291678f9d341
 *
 * - le polynome irréductible définissant GF(2^131) :
 *  - p(x) = x^131 + x^8 + x^3 + x^2 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 0081baf91fdf9833c40f9c181343638399
 *  - Py = 078c6e7ea38c001f73c8134b1b4ef9e150
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 0400000000000000023123953a9464b54d
 */
#define ECCTK_CURVE_SEC1_131			0x1312

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^131) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 03e5a88919d7cafcbf415f07c2176573b2
 *  - b = 04b8266a46c55657ac734ce38f018f2192
 *
 * - le polynome irréductible définissant GF(2^131) :
 *  - p(x) = x^131 + x^8 + x^3 + x^2 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 0356dcd8f2f95031ad652d23951bb366a8
 *  - Py = 0648f06d867940a5366d9e265de9eb240f
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 0400000000000000016954a233049ba98f
 */
#define ECCTK_CURVE_SEC2_131			0x1313

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = 041cb121ce2b31f608a76fc8f23d73cb66
 *  - b = 02f74f717e8dec90991e5ea9b2ff03da58
 *  - p = 048e1d43f293469e33194c43186b3abc0b
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 03df84a96b5688ef574fa91a32e197198a
 *  - Py = 014721161917a44fb7b4626f36f0942e71
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 048e1d43f293469e317f7ed728f6b8e6f1
 */
#define ECCTK_CURVE_CERTICOM_PRIME_131	0x1314

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = ffffffffffffffffffffffffffffffff7ffffffc
 *  - b = 1c97befc54bd7a8b65acf89f81d4d4adc565fa45
 *  - p = ffffffffffffffffffffffffffffffff7fffffff
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 4a96b5688ef573284664698968c38bb913cbfc82
 *  - Py = 23a628553168947d59dcc912042351377ac5fb32
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 0100000000000000000001f4c8f927aed3ca752257
 */
#define	ECCTK_CURVE_SEC_PRIME_160		0x1601

#ifndef ECCTK_EVALUATION
/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^163) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 025c4beac8074b8c2d9df63af91263eb8229b3c967
 *  - b = 00c9517d06d5240d3cff38c74b20b6cd4d6f9dd4d9
 *
 * - le polynome irréductible définissant GF(2^163) :
 *  - p(x) = x^163 + x^8 + x^2 + x + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 023a2e99904996e8679b50ff1e49add8bd2388f387
 *  - Py = 05fcbfe4098477c9d187ea1cf615c7e91529e73ba2
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 0400000000000000000001e60fc8821cc74daeafc1
 */
#define ECCTK_CURVE_CERTICOM_163		0x1631

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^163) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 07b6882caaefa84f9554ff8428bd88e246d2782ae2
 *  - b = 0713612dcddcb40aab946bda29ca91f73af958afd9
 *
 * - le polynome irréductible définissant GF(2^163) :
 *  - p(x) = x^163 + x^7 + x^6 + x^3 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 0369979697ab43897789566789567f787a7876a654
 *  - Py = 00435edb42efafb2989d51fefce3c80988f41ff883
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 03ffffffffffffffffffff48aab689c29ca710279b
 */
#define ECCTK_CURVE_SEC1_163			0x1632

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^163) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 000000000000000000000000000000000000000001
 *  - b = 020a601907b8c953ca1481eb10512f78744a3205fd
 *
 * - le polynome irréductible définissant GF(2^163) :
 *  - p(x) = x^163 + x^7 + x^6 + x^3 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 03f0eba16286a2d57ea0991168d4994637e8343e36
 *  - Py = 00d51fbc6c71a0094fa2cdd545b11c5c0c797324f1
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 040000000000000000000292fe77e70c12a4234c33
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC2_163			0x1633

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = 043182d283fce3880730c9a2fdd3f6016529a166af
 *  - b = 020c61e9459e53d8871bcaadc2dfc8ad5225228035
 *  - p = 05177b8a2a0fd6a4ff55cda06b0924e125f86cad9b
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 0017e7012277e1b4e43f7bf74657e8be08baca175b
 *  - Py = 00aa03a0a82690704697e8c504cb135b2b6eef3c83
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 05177b8a2a0fd6a4ff55cca7b8a1e21c88bd53b2c1
 */
#define ECCTK_CURVE_CERTICOM_PRIME_163	0x1634

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^191) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 2011d237b30025cfd61f8d6f66741ca6cedd313f9bd4431f
 *  - b = 2e45ef571f00786f67b0081b9495a3d95462f5de0aa185ec
 *
 * - le polynome irréductible définissant GF(2^191) :
 *  - p(x) = x^191 + x^9 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 52f3e1ecfcf3b0a6e0945d6b92a8ffc42c280545c0f8321b
 *  - Py = 00f19f7a172a1f7191614db1dae7cabc01e85806d42e2627
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 40000000000000000000000004a20e90c39067c893bbb9a5
 */
#define ECCTK_CURVE_CERTICOM_191		0x1911

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = 3bd4fda00a3e52e1af5c9456686ab1b96195810c27c5b110
 *  - b = 24d1d4331f8651b052e8042fa43255886e09bef9d3174872
 *  - p = 7df5bb7bf830f63c77667331106f9001b27d39941032f5e5
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 3b511bc3229cb4ae654dfbc63210e2783e91f43aa68d0ef4
 *  - Py = 4619a505395a031a304c0b72061099f3d0840ca61de2f4bc
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 7df5bb7bf830f63c776673315f1259168cf997380aca72c3
 */
#define ECCTK_CURVE_CERTICOM_PRIME_191	0x1912

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = fffffffffffffffffffffffffffffffefffffffffffffffc
 *  - b = 64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1
 *  - p = fffffffffffffffffffffffffffffffeffffffffffffffff
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012
 *  - Py = 07192b95ffc8da78631011ed6b24cdd573f977a11e794811
 *
 * - l'ordre du point P sur la courbe :
 *  - n = ffffffffffffffffffffffff99def836146bc9b1b4d22831
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_PRIME_192		0x1921

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^193) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 0017858feb7a98975169e171f77b4087de098ac8a911df7b01
 *  - b = 00fdfb49bfe6c3a89facadaa7a1e5bbc7cc1c2e5d831478814
 *
 * - le polynome irréductible définissant GF(2^193) :
 *  - p(x) = x^193 + x^15 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 01f481bc5f0ff84a74ad6cdf6fdef4bf6179625372d8c0c5e1
 *  - Py = 0025e399f2903712ccf3ea9e3a1ad17fb0b3201b6af7ce1b05
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 01000000000000000000000000c7f34a778f443acc920eba49
 */
#define ECCTK_CURVE_SEC1_193			0x1931

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^193) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 0163f35a5137c2ce3ea6ed8667190b0bc43ecd69977702709b
 *  - b = 00c9bb9e8927d4d64c377e2ab2856a5b16e3efb7f61d4316ae
 *
 * - le polynome irréductible définissant GF(2^193) :
 *  - p(x) = x^193 + x^15 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 00d9b67d192e0367c803f39e1a7e82ca14a651350aae617e8f
 *  - Py = 01ce94335607c304ac29e7defbd9ca01f596f927224cdecf6c
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 010000000000000000000000015aab561b005413ccd4ee99d5
 */
#define ECCTK_CURVE_SEC2_193			0x1932

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = fffffffffffffffffffffffffffffffefffffffffffffffffffffffe
 *  - b = b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4
 *  - p = ffffffffffffffffffffffffffffffff000000000000000000000001
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21
 *  - Py = bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34
 *
 * - l'ordre du point P sur la courbe :
 *  - n = ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_PRIME_224		0x2241

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^233) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 000000000000000000000000000000000000000000000000000000000001
 *  - b = 0066647ede6c332c7f8c0923bb58213b333b20e9ce4281fe115f7d8f90ad
 *
 * - le polynome irréductible définissant GF(2^233) :
 *  - p(x) = x^233 + x^74 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 00fac9dfcbac8313bb2139f1bb755fef65bc391f8b36f8f8eb7371fd558b
 *  - Py = 01006a08a41903350678e58528bebf8a0beff867a7ca36716f7e01f81052
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 01000000000000000000000000000013e974e72f8a6922031d2603cfe0d7
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_233				0x2331

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^239) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 23aacc83de3549beae1b601eda88bf45517d5adfed437f71784b5dd911df
 *  - b = 790408f2eedaf392b012edefb3392f30f4327c0ca3f31fc383c422aa8c16
 *
 * - le polynome irréductible définissant GF(2^239) :
 *  - p(x) = x^239 + x^36 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 4bc630d209d98b810fa42a95fdb77f87dbe68cc076110aade0b2afc47b2b
 *  - Py = 194c8da12f2763e3e9aa84f4f17d56ff10fcf20f300fd1278ffb976a91c2
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 2000000000000000000000000000000f4d42ffe1492a4993f1cad666e447
 */
#define ECCTK_CURVE_CERTICOM_239		0x2391

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = ffffffff00000001000000000000000000000000fffffffffffffffffffffffc
 *  - b = 5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b
 *  - p = ffffffff00000001000000000000000000000000ffffffffffffffffffffffff
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296
 *  - Py = 4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5
 *
 * - l'ordre du point P sur la courbe :
 *  - n = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_PRIME_256		0x2561

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^283) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 000000000000000000000000000000000000000000000000000000000000000000000001
 *  - b = 027b680ac8b8596da5a4af8a19a0303fca97fd7645309fa2a581485af6263e313b79a2f5
 *
 * - le polynome irréductible définissant GF(2^283) :
 *  - p(x) = x^283 + x^12 + x^7 + x^5 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 05f939258db7dd90e1934f8c70b0dfec2eed25b8557eac9c80e2e198f8cdbecd86b12053
 *  - Py = 03676854fe24141cb98fe6d4b20d02b4516ff702350eddb0826779c813f0df45be8112f4
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 03ffffffffffffffffffffffffffffffffffef90399660fc938a90165b042a7cefadb307
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_283				0x2831

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^359) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 6962e67e43fb6d66c46c7fddf5a22e2c8857537c428fd691a26d2f9baeb871c276dfa9928f01634b1459cf431e
 *  - b = 2472e2d0197c49363f1fe7f5b6db075d52b6947d135d8ca445805d39bc345626089687742b6329e70680231988
 *
 * - le polynome irréductible définissant GF(2^359) :
 *  - p(x) = x^359 + x^68 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 0ef6a87d27d25ea944a629664a9d34664c6a79dd86360d8ab57fae11df30cb6e78c7e01ba3adc081fa76048092
 *  - Py = 1da4ed719174e356fc0f968e80d2974965bb90805dbb1d8fe57333dfa50d163b88465bb5fb55046f949ae27f51
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 01af286bca1af286bca1af286bca1af286bca1af286bc9fb8f6b85c556892c20a7eb964fe7719e74f490758d3b 
 */
#define ECCTK_CURVE_CERTICOM_359		0x3591

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc
 *  - b = b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef
 *  - p = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7
 *  - Py = 3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f
 *
 * - l'ordre du point P sur la courbe :
 *  - n = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_PRIME_384		0x3841

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^409) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
 *  - b = 0021a5c2c8ee9feb5c4b9a753b7b476b7fd6422ef1f3dd674761fa99d6ac27c8a9a197b272822f6cd57a55aa4f50ae317b13545f
 *
 * - le polynome irréductible définissant GF(2^409) :
 *  - p(x) = x^409 + x^87 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 015d4860d088ddb3496b0c6064756260441cde4af1771d4db01ffe5b34e59703dc255a868a1180515603aeab60794e54bb7996a7
 *  - Py = 0061b1cfab6be5f32bbfa78324ed106a7636b9c5a7bd198d0158aa4f5488d08f38514f1fdf4b4f40d2181b3681c364ba0273c706
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 010000000000000000000000000000000000000000000000000001e2aad6a612f33307be5fa47c3c9e052f838164cd37d9a21173
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_409				0x4091

/*!
 * \ingroup ecc_curve_gfp
 * courbe elliptique sur GF(p) définie par :
 * - l'équation y^2 = x^3 + a*x + b (mod p) (4*a^3 + 27*b^2 != 0 (mod p))
 *  - a = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc
 *  - b = 0051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00
 *  - p = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66
 *  - Py = 011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_PRIME_521		0x5211

/*!
 * \ingroup ecc_curve_gf2m
 * courbe elliptique sur GF(2^571) définie par :
 * - l'équation y^2 + x*y = x^3 + a*x^2 + b
 *  - a = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
 *  - b = 02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a
 *
 * - le polynome irréductible définissant GF(2^571) :
 *  - p(x) = x^571 + x^10 + x^5 + x^2 + 1
 *
 * - le point P(Px, Py) de la courbe :
 *  - Px = 0303001d34b856296c16c0d40d3cd7750a93d1d2955fa80aa5f40fc8db7b2abdbde53950f4c0d293cdd711a35b67fb1499ae60038614f1394abfa3b4c850d927e1e7769c8eec2d19
 *  - Py = 037bf27342da639b6dccfffeb73d69d78c6c27a6009cbbca1980f8533921e8a684423e43bab08a576291af8f461bb2a8b3531d2f0485c19b16e2f1516e23dd3c1a4827af1b8ac15b
 *
 * - l'ordre du point P sur la courbe :
 *  - n = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47
 *
 * \remark courbe recommandée par le NIST
 */
#define ECCTK_CURVE_SEC_571				0x5711

#endif /* ECCTK_EVALUATION */

/*!
 * \ingroup ecc_acipher
 *
 * Utilisation de l'algorithme ECIES pour le chiffrement asymétrique
 */
#define ECCTK_ECC_ALGO_ECIES	0x01

/*!
 * \ingroup ecc_acipher
 *
 * Utilisation de l'algorithme PSEC3 pour le chiffrement asymétrique
 */
#define ECCTK_ECC_ALGO_PSEC3	0x02

/*!
 * \ingroup ecc_sign
 *
 * Utilisation de l'algorithme ECDSA pour la signature
 */
#define ECCTK_ECC_ALGO_ECDSA	0x03

/*!
 * \ingroup ecc_sign
 *
 * Utilisation de l'algorithme ECNR pour la signature
 */
#define ECCTK_ECC_ALGO_ECNR		0x04

/*!
 * \ingroup ecc_ka
 *
 * Utilisation de l'algorithme DHKA pour l'authentificiation
 */
#define ECCTK_ECC_ALGO_DHKA		0x05

/*!
 * \ingroup ecc_ka
 *
 * Utilisation de l'algorithme MQVKA pour l'authentificiation
 */
#define ECCTK_ECC_ALGO_MQVKA	0x06

/*!
 * \ingroup ecc_util
 *
 * Compression/décompression des données avant/après chiffrement/déchiffrement
 */
#define ECCTK_COMPRESS_ON		0x01

/*!
 * \ingroup ecc_util
 *
 * Pas de compression/décompression des données avant/après chiffrement/déchiffrement
 */
#define ECCTK_COMPRESS_OFF		0x02

/*!
 * \ingroup ecc_util
 *
 * Taille maximal (en octets) d'un secret pouvant être partagé
 */
#define ECCTK_ECC_SECRET_SHARING_SECRET_MAX_SIZE	63

/*!
 * \ingroup ecc_error
 *
 * Aucune erreur 
 */
#define ECCTK_ECC_NO_ERROR				  0

/*!
 * \ingroup ecc_error
 *
 * Erreur interne
 */
#define ECCTK_ECC_ERROR_INTERNAL		 -1

/*!
 * \ingroup ecc_error
 *
 * Impossible d'ouvrir le fichier
 */
#define ECCTK_ECC_ERROR_OPEN_FILE		 -2

/*!
 * \ingroup ecc_error
 *
 * Impossible de créer un fichier
 */
#define ECCTK_ECC_ERROR_TMPFILE			 -3

/*!
 * \ingroup ecc_error
 *
 * Argument null trouvé
 */
#define ECCTK_ECC_ERROR_NULL_ARG		 -4

/*!
 * \ingroup ecc_error
 *
 * Le buffer de sortie est trop petit
 */
#define ECCTK_ECC_ERROR_OUT_TOO_SMALL	 -5

/*!
 * \ingroup ecc_error
 *
 * Erreur sur le context de clef publique
 */
#define ECCTK_ECC_ERROR_KPUB_CTX		 -6

/*!
 * \ingroup ecc_error
 *
 * Erreur sur le context de clef privée
 */
#define ECCTK_ECC_ERROR_KPRV_CTX		 -7

/*!
 * \ingroup ecc_error
 *
 * Erreur sur le context de chiffrement
 */
#define ECCTK_ECC_ERROR_CIPHER_CTX		 -8

/*!
 * \ingroup ecc_error
 *
 * Erreur sur le context PSEC3
 */
#define ECCTK_ECC_ERROR_PSEC3_CTX		 -9

/*!
 * \ingroup ecc_error
 *
 * Erreur sur le context ECIES
 */
#define ECCTK_ECC_ERROR_ECIES_CTX		-10

/*!
 * \ingroup ecc_error
 *
 * Impossible de lire la signature
 */
#define ECCTK_ECC_ERROR_READ_SIGN		-11

/*!
 * \ingroup ecc_error
 *
 * La vérification à échouée
 */
#define ECCTK_ECC_ERROR_VERIFY			-12

/*!
 * \ingroup ecc_error
 *
 * Erreur durant le calcul de l'empreinte du fichier
 */
#define ECCTK_ECC_ERROR_HASH_FILE		-13

/*!
 * \ingroup ecc_error
 *
 * Erreur durant le calcul de l'empreinte du buffer
 */
#define ECCTK_ECC_ERROR_HASH_BUF		-14

/*!
 * \ingroup ecc_error
 *
 * Impossible de lire le Key Aggremmet
 */
#define ECCTK_ECC_ERROR_READ_KA			-15

/*!
 * \ingroup ecc_error
 *
 * Erreur durant la compression
 */
#define ECCTK_ECC_ERROR_COMPRESS		-16

/*!
 * \ingroup ecc_error
 *
 * Erreur durant la décompression
 */
#define ECCTK_ECC_ERROR_DECOMPRESS		-17

/*!
 * \ingroup ecc_error
 *
 * Erreur durant l'éxecution de l'algorithe PSEC3
 */
#define ECCTK_ECC_ERROR_PSEC3			-18

/*!
 * \ingroup ecc_error
 *
 * Erreur durant l'éxecution de l'algorithe ECIES
 */
#define ECCTK_ECC_ERROR_ECIES			-19

/*!
 * \ingroup ecc_error
 *
 * Erreur durant le chiffrement symétrique
 */
#define ECCTK_ECC_ERROR_ENCRYPT			-20

/*!
 * \ingroup ecc_error
 *
 * Erreur durant le déchiffrement symétrique
 */
#define ECCTK_ECC_ERROR_DECRYPT			-21

/*!
 * \ingroup ecc_error
 *
 * Erreur durant la génération d'un bi-clef
 */
#define ECCTK_ECC_ERROR_GENKEY			-22

/*!
 * \ingroup ecc_error
 *
 * Erreur durant l'écriture dans un fichier
 */
#define ECCTK_ECC_ERROR_WRITE_FILE		-23

/*!
 * \ingroup ecc_error
 *
 * Impossible d'utiliser l'algorithme spécifié (hash/hmac/mac)
 */
#define ECCTK_ECC_ERROR_BAD_ALGORITHM	-24

/*!
 * \ingroup ecc_error
 *
 * Erreur durant une convertion DER vers PEM ou PEM vers DER
 */
#define ECCTK_ECC_ERROR_DER_PEM			-25

/*!
 * \ingroup ecc_error
 *
 * Erreur durant la génération de la courbe
 */
#define ECCTK_ECC_ERROR_GENERATE_CURVE	-26

/*!
 * \ingroup ecc_error
 *
 * Les paramètres nécessaires aux opérations sur GF(2^m) ne sont pas initialisés
 */
#define ECCTK_ECC_ERROR_GF2M_NOT_INIT	-27

/*!
 * \ingroup ecc_error
 *
 * Les paramètres nécessaires aux opérations sur GF(p) ne sont pas initialisés
 * 
 */
#define ECCTK_ECC_ERROR_GFP_NOT_INIT	-28

#ifdef __cplusplus
extern "C" {
#endif

	struct kprv_ctx;
	/*!
	 * \ingroup ecc_kprv
	 * Context utilisé pour effectuer les opérations avec les clefs privées
	 */
	typedef struct kprv_ctx KPRV_CTX;

	struct kpub_ctx;
	/*!
	 * \ingroup ecc_kpub
	 *Context utilisé pour effectuer les opérations avec les clefs publiques
	 */
	typedef struct kpub_ctx KPUB_CTX;

	struct sign_ctx;
	/*!
	 * \ingroup ecc_sign
	 * Context utilisé pour effectuer les opérations avec les algorithmes de signature
	 */
	typedef struct sign_ctx SIGN_CTX;

	struct psec3_ctx;
	/*!
	 * \ingroup ecc_acipher_psec3
	 * Context utilisé pour effectuer les opérations avec l'algorithme PSEC3
	 */
	typedef struct psec3_ctx PSEC3_CTX;

	struct ecies_ctx;
	/*!
	 * \ingroup ecc_acipher_ecies
	 * Context utilisé pour effectuer les opérations avec l'algorithme ECIES
	 */
	typedef struct ecies_ctx ECIES_CTX;

	struct ka_ctx;
	/*!
	 * \ingroup ecc_ka
	 * Context utilisé pour effectuer les opérations avec les algorithmes d'authentification
	 */
	typedef struct ka_ctx KA_CTX;

	struct sharing_ctx;
	/*!
	 * \ingroup ecc_share
	 * Context utilisé pour effectuer les opérations avec l'algorithme de partage de secret
	 */
	typedef struct sharing_ctx SHARING_CTX;

	struct ecc_cipher_ctx;
	/*!
	 * \ingroup ecc_scipher
	 * Context utilisé pour effectuer les opérations avec les algorithmes de chiffrement symétrique
	 */
	typedef struct ecc_cipher_ctx ECC_CIPHER_CTX;


	/*!
	 * \ingroup ecc_kprv
	 * \brief Effacement et libération d'un context de clef privée
	 *
	 * \param Ctx : un context de clef privée précédemment initialisé.
	 */
	void DLL_EXPORT KprvCtxFree(KPRV_CTX *Ctx);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet de lire une clef privée dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une clef privée.
	 * \param Size	 : taille du buffer mémoire.
	 *
	 * \return un context de clef privée initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPRV_CTX * ReadStreamKprvCtx(u1byte *Buffer, u4byte Size);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet de lire une clef privée dans un fichier
	 *
	 * \param File : fichier contenant une clef privée.
	 *
	 * \return un context de clef privée initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPRV_CTX * ReadFileKprvCtx(s1byte *File);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet d'écrire un context de clef privée dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de clef privée à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteFileKprvCtx(s1byte *File, KPRV_CTX *Ctx);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet d'écrire un context de clef privée dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire de sortie pour le context.
	 * \param Size	 : pointeur sur taille du buffer mémoire.
	 * \param Ctx	 : context de clef privée à écrire.
	 *
	 * \remark le buffer mémoire peut-être NULL.
	 * \remark la taille du buffer mémoire est toujours mise à jour.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteStreamKprvCtx(u1byte *Buffer, u4byte *Size, KPRV_CTX *Ctx);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet de lire une clef privée au format PEM dans un fichier
	 *
	 * \param File : fichier contenant une clef privée.
	 *
	 * \return un context de clef privée initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPRV_CTX * PemReadFileKprvCtx(s1byte *File);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet de lire une clef privée au format PEM dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une clef privée.
	 *
	 * \return un context de clef privée initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPRV_CTX * PemReadStreamKprvCtx(s1byte *Buffer);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet d'écrire au format PEM un context de clef privée dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de clef privée à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT PemWriteFileKprvCtx(s1byte *File, KPRV_CTX *Ctx);
	
	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet d'écrire au format PEM un context de clef privée dans un buffer mémoire 
	 *
	 * \param Ctx	: context de clef privée à écrire.
	 *
	 * \return buffer mémoire alloué contenant le context de clef privée, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT s1byte * PemWriteStreamKprvCtx(KPRV_CTX *Ctx);

	/*!
	 * \ingroup ecc_kprv
	 * \brief Permet de générer une clef privée
	 *
	 * \param Curve		: référence de la courbe pour génération de la clef privée
	 * \param Password	: mot de passe pour protéger la clef privée
	 *
	 * \remark le mot de passe peut-être NULL, dans ce cas la clef n'est pas protégée.
	 *
	 * \return context de clef privée initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPRV_CTX * GeneratePrivateKey(u2byte Curve, s1byte *Password);


	/*!
	 * \ingroup ecc_kpub
	 * \brief Effacement et libération d'un context de clef publique
	 *
	 * \param Ctx : un context de clef publique précédemment initialisé.
	 */
	void DLL_EXPORT KpubCtxFree(KPUB_CTX *Ctx);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet de lire une clef publique dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une clef publique.
	 * \param Size	 : taille du buffer mémoire.
	 *
	 * \return un context de clef publique initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPUB_CTX * ReadStreamKpubCtx(u1byte *Buffer, u4byte Size);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet de lire une clef publique dans un fichier
	 *
	 * \param File : fichier contenant une clef publique.
	 *
	 * \return un context de clef publique initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPUB_CTX * ReadFileKpubCtx(s1byte *File);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet d'écrire un context de clef publique dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de clef publique à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteFileKpubCtx(s1byte *File, KPUB_CTX *Ctx);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet d'écrire un context de clef publique dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire de sortie pour le context.
	 * \param Size	 : pointeur sur taille du buffer mémoire.
	 * \param Ctx	 : context de clef publique à écrire.
	 *
	 * \remark le buffer mémoire peut-être NULL.
	 * \remark la taille du buffer mémoire est toujours mise à jour.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteStreamKpubCtx(u1byte *Buffer, u4byte *Size, KPUB_CTX *Ctx);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet de lire une clef publique au format PEM dans un fichier
	 *
	 * \param File : fichier contenant une clef publique.
	 *
	 * \return un context de clef publique initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPUB_CTX * PemReadFileKpubCtx(s1byte *File);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet de lire une clef publique au format PEM dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une clef publique.
	 *
	 * \return un context de clef publique initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPUB_CTX * PemReadStreamKpubCtx(s1byte *Buffer);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet d'écrire au format PEM un context de clef publique dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de clef publique à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT PemWriteFileKpubCtx(s1byte *File, KPUB_CTX *Ctx);
	
	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet d'écrire au format PEM un context de clef publique dans un buffer mémoire 
	 *
	 * \param Ctx	: context de clef publique à écrire.
	 *
	 * \return buffer mémoire alloué contenant le context de clef publique, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT s1byte * PemWriteStreamKpubCtx(KPUB_CTX *Ctx);

	/*!
	 * \ingroup ecc_kpub
	 * \brief Permet de générer une clef publique à partir d'une clef privée
	 *
	 * \param Ctx		: context de clef privée initialisé.
	 * \param Password	: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return context de clef publique initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KPUB_CTX * GeneratePublicKey(KPRV_CTX *Ctx, s1byte *Password);


	/*!
	 * \ingroup ecc_sign
	 * \brief Effacement et libération d'un context de signature
	 *
	 * \param Ctx : un context de signature précédemment initialisé.
	 */
	void DLL_EXPORT SignCtxFree(SIGN_CTX *Ctx);

	/*!
	 * \ingroup ecc_sign
	 * \brief Permet de lire une signature dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une signature.
	 * \param Size	 : taille du buffer mémoire.
	 *
	 * \return un context de signature initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * ReadStreamSignCtx(u1byte *Buffer, u4byte Size);

	/*!
	 * \ingroup ecc_sign
	 * \brief Permet de lire une signature dans un fichier
	 *
	 * \param File : fichier contenant une signature.
	 *
	 * \return un context de signature initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * ReadFileSignCtx(s1byte *File);

	/*!
	 * \ingroup ecc_sign
	 * \brief Permet d'écrire un context de signature dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de signature à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteFileSignCtx(s1byte *File, SIGN_CTX *Ctx);

	/*!
	 * \ingroup ecc_sign
	 * \brief Permet d'écrire un context de signature dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire de sortie pour le context.
	 * \param Size	 : pointeur sur taille du buffer mémoire.
	 * \param Ctx	 : context de signature à écrire.
	 *
	 * \remark le buffer mémoire peut-être NULL.
	 * \remark la taille du buffer mémoire est toujours mise à jour.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteStreamSignCtx(u1byte *Buffer, u4byte *Size, SIGN_CTX *Ctx);

	/*!
	 * \ingroup ecc_sign
	 * \brief Permet de lire une signature au format PEM dans un fichier
	 *
	 * \param File : fichier contenant une signature.
	 *
	 * \return un context de signature initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * PemReadFileSignCtx(s1byte *File);

	/*!
	 * \ingroup ecc_sign
	 * \brief Permet de lire une signature au format PEM dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une signature.
	 *
	 * \return un context de signature initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * PemReadStreamSignCtx(s1byte *Buffer);

	/*!
	 * \ingroup ecc_sign
	 * \brief Permet d'écrire au format PEM un context de signature dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de signature à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT PemWriteFileSignCtx(s1byte *File, SIGN_CTX *Ctx);
	
	/*!
	 * \ingroup ecc_sign
	 * \brief Permet d'écrire au format PEM un context de signature dans un buffer mémoire 
	 *
	 * \param Ctx	: context de signature à écrire.
	 *
	 * \return buffer mémoire alloué contenant le context de signature, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT s1byte * PemWriteStreamSignCtx(SIGN_CTX *Ctx);

	/*!
	 * \ingroup ecc_sign_dsa
	 * \brief Permet de signer un fichier en utilisant l'algorithme ECDSA
	 *
	 * \param File		: nom du fichier à signer.
	 * \param Algo		: algorithme de hash pour l'intégrité
	 * \param Ctx		: context de clef privée initialisé.
	 * \param Password	: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return context de signature ECDSA initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * SignFileEcdsa(s1byte *File, s2byte Algo, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_sign_dsa
	 * \brief Permet de vérifier la signature d'un fichier en utilisant l'algorithme ECDSA
	 *
	 * \param File	: nom du fichier à vérifier.
	 * \param Sctx	: context de signature ECDSA initialisé.
	 * \param Kctx	: context de clef publique initialisé.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT VerifyFileEcdsa(s1byte *File, SIGN_CTX *Sctx, KPUB_CTX *Kctx);

	/*!
	 * \ingroup ecc_sign_dsa
	 * \brief Permet de signer un buffer mémoire en utilisant l'algorithme ECDSA
	 *
	 * \param Buffer	: buffer mémoire à signer.
	 * \param Size		: taille du buffer mémoire à signer.
	 * \param Algo		: algorithme de hash pour l'intégrité
	 * \param Ctx		: context de clef privée initialisé.
	 * \param Password	: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return context de signature ECDSA initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * SignStreamEcdsa(u1byte *Buffer, u4byte Size, s2byte Algo, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_sign_dsa
	 * \brief Permet de vérifier la signature d'un fichier en utilisant l'algorithme ECDSA
	 *
	 * \param Buffer	: buffer mémoire à vérifier.
	 * \param Size		: taille du buffer mémoire à vérifier.
	 * \param Sctx		: context de signature ECDSA initialisé.
	 * \param Kctx		: context de clef publique initialisé.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT VerifyStreamEcdsa(u1byte *Buffer, u4byte Size, SIGN_CTX *Sctx, KPUB_CTX *Kctx);

	/*!
	 * \ingroup ecc_sign_nr
	 * \brief Permet de signer un fichier en utilisant l'algorithme ECNR
	 *
	 * \param File		: nom du fichier à signer.
	 * \param Algo		: algorithme de hash pour l'intégrité
	 * \param Ctx		: context de clef privée initialisé.
	 * \param Password	: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return context de signature ECNR initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * SignFileEcnr(s1byte *File, s2byte Algo, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_sign_nr
	 * \brief Permet de vérifier la signature d'un fichier en utilisant l'algorithme ECNR
	 *
	 * \param File	: nom du fichier à vérifier.
	 * \param Sctx	: context de signature ECNR initialisé.
	 * \param Kctx	: context de clef publique initialisé.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT VerifyFileEcnr(s1byte *File, SIGN_CTX *Sctx, KPUB_CTX *Kctx);

	/*!
	 * \ingroup ecc_sign_nr
	 * \brief Permet de signer un buffer mémoire en utilisant l'algorithme ECNR
	 *
	 * \param Buffer	: buffer mémoire à signer.
	 * \param Size		: taille du buffer mémoire à signer.
	 * \param Algo		: algorithme de hash pour l'intégrité
	 * \param Ctx		: context de clef privée initialisé.
	 * \param Password	: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return context de signature ECNR initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SIGN_CTX * SignStreamEcnr(u1byte *Buffer, u4byte Size, s2byte Algo, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_sign_nr
	 * \brief Permet de vérifier la signature d'un fichier en utilisant l'algorithme ECNR
	 *
	 * \param Buffer	: buffer mémoire à vérifier.
	 * \param Size		: taille du buffer mémoire à vérifier.
	 * \param Sctx		: context de signature ECNR initialisé.
	 * \param Kctx		: context de clef publique initialisé.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT VerifyStreamEcnr(u1byte *Buffer, u4byte Size, SIGN_CTX *Sctx, KPUB_CTX *Kctx);


	/*!
	 * \ingroup ecc_scipher
	 * \brief Effacement et libération d'un context de chiffrement
	 *
	 * \param Ctx : un context de chiffrement précédemment initialisé.
	 */
	void DLL_EXPORT EccCipherCtxFree(ECC_CIPHER_CTX *Ctx);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet de créer un context de chiffrement.
	 *
	 * \param Algo		: algorithme utilisé.
	 * \param Mode		: mode opératoire utilisé.
	 * \param Compress	: active ou non la compression de données avant chiffrement.
	 * \param Keysize	: taille de la clef de session.
	 * \param IVsize	: taille du vecteur d'initialisation.
	 * \param IV		: buffer contenant le vecteur d'initialisation.
	 *
	 * \remark si le mode opératoire est l'ECB, le vecteur d'initialisation peut être null.
	 * \remark les tailles de la clef de session et du vecteur d'initialisation doivent être en octets.
	 *
	 * \warning si les tailles du vecteur d'initialisation ou de la clef de session sont supérieur aux valeurs maximales
	 * pour l'algorithme considéré, les valeurs maximales sont prises en comptes.
	 *
	 * \return un context de chiffrement initialisé, ou NULL en cas d'erreur
	 */
	DLL_EXPORT ECC_CIPHER_CTX * CreateEccCipherCtx (u1byte Algo,
													u1byte Mode,
													u1byte Compress,
													u2byte Keysize,
													u2byte IVsize,
													u1byte *IV);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet de lire une structure de chiffrement dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une structure de chiffrement.
	 * \param Size	 : taille du buffer mémoire.
	 *
	 * \return un context de chiffrement initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT ECC_CIPHER_CTX * ReadStreamEccCipherCtx(u1byte *Buffer, u4byte Size);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet de lire une structure de chiffrement dans un fichier
	 *
	 * \param File : fichier contenant une structure de chiffrement.
	 *
	 * \return un context de chiffrement initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT ECC_CIPHER_CTX * ReadFileEccCipherCtx(s1byte *File);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet d'écrire un context de chiffrement dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de chiffrement à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteFileEccCipherCtx(s1byte *File, ECC_CIPHER_CTX *Ctx);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet d'écrire un context de chiffrement dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire de sortie pour le context.
	 * \param Size	 : pointeur sur taille du buffer mémoire.
	 * \param Ctx	 : context de chiffrement à écrire.
	 *
	 * \remark le buffer mémoire peut-être NULL.
	 * \remark la taille du buffer mémoire est toujours mise à jour.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteStreamEccCipherCtx(u1byte *Buffer, u4byte *Size, ECC_CIPHER_CTX *Ctx);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet de lire une structure de chiffrement au format PEM dans un fichier
	 *
	 * \param File : fichier contenant une structure de chiffrement.
	 *
	 * \return un context de chiffrement initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT ECC_CIPHER_CTX * PemReadFileEccCipherCtx(s1byte *File);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet de lire une structure de chiffrement au format PEM dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une structure de chiffrement.
	 *
	 * \return un context de chiffrement initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT ECC_CIPHER_CTX * PemReadStreamEccCipherCtx(s1byte *Buffer);

	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet d'écrire au format PEM un context de chiffrement dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de chiffrement à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT PemWriteFileEccCipherCtx(s1byte *File, ECC_CIPHER_CTX *Ctx);
	
	/*!
	 * \ingroup ecc_scipher
	 * \brief Permet d'écrire au format PEM un context de chiffrement dans un buffer mémoire 
	 *
	 * \param Ctx	: context de chiffrement à écrire.
	 *
	 * \return buffer mémoire alloué contenant le context de chiffrement, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT s1byte * PemWriteStreamEccCipherCtx(ECC_CIPHER_CTX *Ctx);


	/*!
	 * \ingroup ecc_acipher_psec3
	 * \brief Permet de déchiffrer un fichier en utilisant l'algorithme PSEC3
	 *
	 * \param EncryptFile	: nom du fichier chiffré.
	 * \param DecryptFile	: nom du fichier de sortie (déchiffré).
	 * \param Ctx			: context de clef privée initialisé.
	 * \param Password		: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT DecryptFilePsec3(s1byte *EncryptFile, s1byte *DecryptFile, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_acipher_psec3
	 * \brief Permet de chiffrer un fichier en utilisant l'algorithme PSEC3
	 *
	 * \param PlainFile		: nom du fichier à chiffrer.
	 * \param EncryptFile	: nom du fichier de sortie (chiffré).
	 * \param Algo			: algorithme de hash pour l'intégrité
	 * \param Kctx			: context de clef publique initialisé.
	 * \param Cctx			: context de chiffrement initialisé.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT EncryptFilePsec3(s1byte *PlainFile, s1byte *EncryptFile, s2byte Algo, KPUB_CTX *Kctx, ECC_CIPHER_CTX *Cctx);

	/*!
	 * \ingroup ecc_acipher_psec3
	 * \brief Permet de déchiffrer un buffer mémoire en utilisant l'algorithme PSEC3
	 *
	 * \param BufferIn		: buffer mémoire chiffré.
	 * \param BufferInSize	: taille du buffer mémoire chiffré.
	 * \param BufferOutSize	: pointeur sur taille du buffer mémoire de sortie(déchiffré).
	 * \param Ctx			: context de clef privée initialisé.
	 * \param Password		: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
 	 * \remark BufferOutSize est toujours mis à jour.
	 *
	 * \return buffer mémoire alloué contenant le déchiffrement, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * DecryptStreamPsec3(u1byte *BufferIn, u4byte BufferInSize, s4byte *BufferOutSize, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_acipher_psec3
	 * \brief Permet de chiffrer un buffer mémoire en utilisant l'algorithme PSEC3
	 *
	 * \param BufferIn		: buffer mémoire à chiffrer.
	 * \param BufferInSize	: taille du buffer mémoire à chiffrer.
 	 * \param BufferOutSize	: pointeur sur taille du buffer mémoire de sortie (chiffré).
	 * \param Algo			: algorithme de hash pour l'intégrité
	 * \param Kctx			: context de clef publique initialisé.
	 * \param Cctx			: context de chiffrement initialisé.
	 *
 	 * \remark BufferOutSize est toujours mis à jour.
	 *
	 * \return buffer mémoire alloué contenant le chiffrement, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * EncryptStreamPsec3(u1byte *BufferIn, u4byte BufferInSize, s4byte *BufferOutSize, s2byte Algo, KPUB_CTX *Kctx, ECC_CIPHER_CTX *Cctx);

	/*!
	 * \ingroup ecc_acipher_ecies
	 * \brief Permet de déchiffrer un fichier en utilisant l'algorithme ECIES
	 *
	 * \param EncryptFile	: nom du fichier chiffré.
	 * \param DecryptFile	: nom du fichier de sortie (déchiffré).
	 * \param Ctx			: context de clef privée initialisé.
	 * \param Password		: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT DecryptFileEcies(s1byte *EncryptFile, s1byte *DecryptFile, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_acipher_ecies
	 * \brief Permet de chiffrer un fichier en utilisant l'algorithme ECIES
	 *
	 * \param PlainFile		: nom du fichier à chiffrer.
	 * \param EncryptFile	: nom du fichier de sortie (chiffré).
	 * \param Algo			: algorithme de hmac pour l'intégrité
	 * \param Kctx			: context de clef publique initialisé.
	 * \param Cctx			: context de chiffrement initialisé.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT EncryptFileEcies(s1byte *PlainFile, s1byte *EncryptFile, s2byte Algo, KPUB_CTX *Kctx, ECC_CIPHER_CTX *Cctx);

	/*!
	 * \ingroup ecc_acipher_ecies
	 * \brief Permet de déchiffrer un buffer mémoire en utilisant l'algorithme ECIES
	 *
	 * \param BufferIn		: buffer mémoire chiffré.
	 * \param BufferInSize	: taille du buffer mémoire chiffré.
	 * \param BufferOutSize	: pointeur sur taille du buffer mémoire de sortie(déchiffré).
	 * \param Ctx			: context de clef privée initialisé.
	 * \param Password		: mot de passe protégeant la clef privée.
	 *
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
 	 * \remark BufferOutSize est toujours mis à jour.
	 *
	 * \return buffer mémoire alloué contenant le déchiffrement, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * DecryptStreamEcies(u1byte *BufferIn, u4byte BufferInSize, s4byte *BufferOutSize, KPRV_CTX *Ctx, s1byte *Password);

	/*!
	 * \ingroup ecc_acipher_ecies
	 * \brief Permet de chiffrer un buffer mémoire en utilisant l'algorithme ECIES
	 *
	 * \param BufferIn		: buffer mémoire à chiffrer.
	 * \param BufferInSize	: taille du buffer mémoire à chiffrer.
 	 * \param BufferOutSize	: pointeur sur taille du buffer mémoire de sortie (chiffré).
	 * \param Algo			: algorithme de hmac pour l'intégrité
	 * \param Kctx			: context de clef publique initialisé.
	 * \param Cctx			: context de chiffrement initialisé.
	 *
 	 * \remark BufferOutSize est toujours mise à jour.
	 *
	 * \return buffer mémoire alloué contenant le chiffrement, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * EncryptStreamEcies(u1byte *BufferIn, u4byte BufferInSize, s4byte *BufferOutSize, s2byte Algo, KPUB_CTX *Kctx, ECC_CIPHER_CTX *Cctx);


	/*!
	 * \ingroup ecc_share
	 * \brief Effacement et libération d'un pointeur sur des context de partage de secret.
	 *
	 * \param Ctx : un pointeur sur des context de partage de secret précédemment initialisé.
	 */
	void DLL_EXPORT SharingPtFree(SHARING_CTX **Ctx);

	/*!
	 * \ingroup ecc_share
	 * \brief Allcation d'un pointeur sur des context de partage de secret
	 *
	 * \param m : le nombre de context de partage de secret allant être utilisés.
	 */
	DLL_EXPORT SHARING_CTX ** SharingPtInit(int m);

	/*!
	 * \ingroup ecc_share
	 * \brief Effacement et libération d'un context de partage de secret.
	 *
	 * \param Ctx : un context de partage de secret précédemment initialisé.
	 */
	void DLL_EXPORT SharingCtxFree(SHARING_CTX *Ctx);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet de lire une structure de partage de secret dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une structure de partage de secret.
	 * \param Size	 : taille du buffer mémoire.
	 *
	 * \return un context de partage de secret initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SHARING_CTX * ReadStreamSharingCtx(u1byte *Buffer, u4byte Size);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet de lire une structure de partage de secret dans un fichier
	 *
	 * \param File : fichier contenant une structure de partage de secret.
	 *
	 * \return un context de partage de secret initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SHARING_CTX * ReadFileSharingCtx(s1byte *File);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet d'écrire un context de partage de secret dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de partage de secret à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteFileSharingCtx(s1byte *File, SHARING_CTX *Ctx);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet d'écrire un context de partage de secret dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire de sortie pour le context.
	 * \param Size	 : pointeur sur taille du buffer mémoire.
	 * \param Ctx	 : context de partage de secret à écrire.
	 *
	 * \remark le buffer mémoire peut-être NULL.
	 * \remark la taille du buffer mémoire est toujours mise à jour.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteStreamSharingCtx(u1byte *Buffer, u4byte *Size, SHARING_CTX *Ctx);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet de lire un context de partage de secret au format PEM dans un fichier
	 *
	 * \param File : fichier contenant un context de partage de secret.
	 *
	 * \return un context de partage de secret initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SHARING_CTX * PemReadFileSharingCtx(s1byte *File);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet de lire un context de partage de secret au format PEM dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant un context de partage de secret.
	 *
	 * \return un context de partage de secret initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SHARING_CTX * PemReadStreamSharingCtx(s1byte *Buffer);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet d'écrire au format PEM un context de partage de secret dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context de partage de secret à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT PemWriteFileSharingCtx(s1byte *File, SHARING_CTX *Ctx);
	
	/*!
	 * \ingroup ecc_share
	 * \brief Permet d'écrire au format PEM un context de partage de secret dans un buffer mémoire 
	 *
	 * \param Ctx	: context de partage de secret à écrire.
	 *
	 * \return buffer mémoire alloué contenant le context de partage de secret, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT s1byte * PemWriteStreamSharingCtx(SHARING_CTX *Ctx);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet de retrouver un secret à partir des secrets partagés
	 *
	 * \param Ctx	 : tableau contenant les contexts de partages de secret nécessaire à la résolution du système.
 	 * \param Size	 : pointeur sur taille du buffer secret retourné.
	 *
	 * \remark la taille du secret est mise à jour, si il n'y a pas d'erreurs.
	 *
	 * \return buffer mémoire alloué contenant le secret, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * ResolveSecretSharingCtx(SHARING_CTX **Ctx, u2byte *Size);

	/*!
	 * \ingroup ecc_share
	 * \brief Permet de créer des secrets partagés à partir d'un secret
	 *
	 * \param Secret	: buffer contenant le secret à partager.
 	 * \param Size		: taille du buffer contenant le secret.
 	 * \param Nb		: nombre de secrets partagés nécessaire à la reconstruction du secret.
	 * \param NbGen		: nombre de secrets partagés à générer.
	 *
	 * \warning la taille du secret doit être au maximum 63 octets
	 *
	 * \return tableau de contexts contenant les secrets partagés, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT SHARING_CTX ** CreateSecretSharingCtx(u1byte *Secret, u2byte Size, u2byte Nb, u2byte NbGen);


	/*!
	 * \ingroup ecc_ka
	 * \brief Effacement et libération d'un context d'authentification
	 *
	 * \param Ctx : un context d'authentification précédemment initialisé.
	 */
	void DLL_EXPORT KaCtxFree(KA_CTX *Ctx);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet de lire une structure d'authentification dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant une structure d'authentification.
	 * \param Size	 : taille du buffer mémoire.
	 *
	 * \return un context d'authentification initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KA_CTX * ReadStreamKaCtx(u1byte *Buffer, u4byte Size);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet de lire une structure d'authentification dans un fichier
	 *
	 * \param File : fichier contenant une structure d'authentification.
	 *
	 * \return un context d'authentification initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KA_CTX * ReadFileKaCtx(s1byte *File);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet d'écrire un context d'authentification dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context d'authentification à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteFileKaCtx(s1byte *File, KA_CTX *Ctx);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet d'écrire un context d'authentification dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire de sortie pour le context.
	 * \param Size	 : pointeur sur taille du buffer mémoire.
	 * \param Ctx	 : context d'authentification à écrire.
	 *
	 * \remark le buffer mémoire peut-être NULL.
	 * \remark la taille du buffer mémoire est toujours mise à jour.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT WriteStreamKaCtx(u1byte *Buffer, u4byte *Size, KA_CTX *Ctx);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet de lire un context d'authentification au format PEM dans un fichier
	 *
	 * \param File : fichier contenant un context d'authentification.
	 *
	 * \return un context d'authentification initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KA_CTX * PemReadFileKaCtx(s1byte *File);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet de lire un context d'authentification au format PEM dans un buffer mémoire
	 *
	 * \param Buffer : buffer mémoire contenant un context d'authentification.
	 *
	 * \return un context d'authentification initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KA_CTX * PemReadStreamKaCtx(s1byte *Buffer);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet d'écrire au format PEM un context d'authentification dans un fichier
	 *
	 * \param File	: fichier de sortie pour le context.
	 * \param Ctx	: context d'authentification à écrire.
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT PemWriteFileKaCtx(s1byte *File, KA_CTX *Ctx);
	
	/*!
	 * \ingroup ecc_ka
	 * \brief Permet d'écrire au format PEM un context d'authentification dans un buffer mémoire 
	 *
	 * \param Ctx	: context d'authentification à écrire.
	 *
	 * \return buffer mémoire alloué contenant le context d'authentification, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT s1byte * PemWriteStreamKaCtx(KA_CTX *Ctx);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet de créer un context pour l'authentification Diffie-Hellman
	 *
	 * \param KpubCtx	: context initialisé de la clef publique du correspondant.
	 * \param KprvCtx	: context initialisé de la clef privée de l'initiateur.
	 * \param Password	: mot de passe protégeant la clef privée
	 *
	 * \remark les contexts de clef publique et privée doivent-être associés à la même courbe.
	 * \remark si la clef privée n'est pas protégée, le mot de passe peut-être NULL.
	 *
	 * \return context d'authentification Diffie-Hellman initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KA_CTX * CreateDHKeyAgreement(KPUB_CTX *KpubCtx, KPRV_CTX *KprvCtx, s1byte *Password);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet de créer un context pour l'authentification Menezes-Qu-Vanstone
	 *
	 * \param Sctx			: context initialisé de la première clef privée de l'initiateur.
	 * \param U_ctx			: context initialisé de la seconde clef privée de l'initiateur.
	 * \param V_ctx			: context initialisé de le seconde clef publique de l'initiateur.
	 * \param Wprime_ctx	: context initialisé de clef première clef publique du correspondant.
	 * \param Vprime_ctx	: context initialisé de clef seconde clef publique du correspondant.
	 * \param Spassword		: mot de passe protégeant la première clef privée de l'initiateur.
	 * \param Upassword		: mot de passe protégeant la seconde clef privée de l'initiateur.
	 *
	 * \remark si les clefs privées ne sont pas protégées, les mot de passe peuvent-être NULL.
	 *
	 * \return context d'authentification Menezes-Qu-Vanstone initialisé, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT KA_CTX * CreateMQVKeyAgreement(KPRV_CTX *Sctx, KPRV_CTX *U_ctx, KPUB_CTX *V_ctx, KPUB_CTX *Wprime_ctx, KPUB_CTX *Vprime_ctx, s1byte *Spassword, s1byte *Upassword);

	/*!
	 * \ingroup ecc_ka
	 * \brief Permet d'effectuer une authentification Diffie-Hellman ou Menezes-Qu-Vanstone
	 *
	 * \param Ka1 : context d'authentification initialisé de l'initiateur.
	 * \param Ka2 : context d'authentification initialisé du correspondant.
	 *
	 * \remark il n'y a pas d'ordre spécifique pour les contexts.
	 * \remark il faut que les deux contexts soient initialisés pour le même algorithme (Diffie-Hellman ou Menezes-Qu-Vanstone).
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT VerifyKeyAgreement(KA_CTX *Ka1, KA_CTX *Ka2);


	/*!
	 * \ingroup ecc_rand
	 * \brief Permet de générer une valeur pseudo-aléatoire d'une taille donnée (algorithme Mersenne Twister)
	 *
	 * \param Size : taille en bits de la valeur pseudo-aléatoire désirée.
	 *
	 * \warning cette version utilise l'algorithme Mersenne Twister et il est déconseillé de l'utiliser directement
	 * pour la génération de clef cryptographique
	 *
	 * \return buffer alloué contenant la valeur pseudo-aléatoire, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * GenerateRandom(u4byte Size);

	/*!
	 * \ingroup ecc_rand
	 * \brief Permet de générer une valeur pseudo-aléatoire d'une taille donnée (algorithme du standard FIPS-186)
	 *
	 * \param Size : taille en bits de la valeur pseudo-aléatoire désirée.
	 *
	 * \warning cette version utilise un algorithme basé sur le standard FIPS-186 et peut-être utilisée pour la génération
	 * de clef cryptographique.
	 *
	 * \return buffer alloué contenant la valeur pseudo-aléatoire, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * GenerateRandomFips186(u4byte Size);

	/*!
	 * \ingroup ecc_rand
	 * \brief Permet de générer une valeur pseudo-aléatoire d'une taille donnée (algorithme du standard ANSI X9.17)
	 *
	 * \param Size : taille en bits de la valeur pseudo-aléatoire désirée.
	 *
	 * \warning cette version utilise un algorithme basé sur le standard ANSI X9.17 et peut-être utilisée pour la génération
	 * de clef cryptographique.
	 *
	 * \return buffer alloué contenant la valeur pseudo-aléatoire, ou NULL en cas d'erreur.
	 */
	DLL_EXPORT u1byte * GenerateRandomAnsiX9_17(u4byte Size);
	
	/*!
	 * \ingroup ecc_util
	 * \brief Permet de lire de manière sécurisé un password sur une console
	 *
	 * \param Buffer	: buffer de sortie du mot de passe lu.
	 * \param Size		: taille en octet du buffer.
	 *
	 * \return la taille du mot de passe, ou -1 en cas d'erreur.
	 */
	s2byte DLL_EXPORT  SecureReadPassword(s1byte *Buffer, u2byte Size);

	/*!
	 * \ingroup ecc_util
	 * \brief Permet d'obtenir des informations sur la librairie
	 *
	 * \param Information est le buffer dans lequel sont placées les informations sur la librairie
	 * \param Size est la taille du buffer Information
	 *
	 * \remark si Size n'est pas assez grand, les informations sont tronquées
	 */
	DLL_EXPORT void EcctkEccInfo(char *Information, u2byte Size);

	/*!
	 * \ingroup ecc_util
	 * \brief Permet de mettre en place les paramètres nécessaires aux opérations sur GF(2^m)
	 *
	 * \warning les fonctions utilisant les courbes définies sur GF(2^m) ne fonctionne pas si cette fonction n'est pas 
	 * appelée au préalable
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT InitializeEcctkGf2m();

	/*!
	 * \ingroup ecc_util
	 * \brief Permet de libérer la mémoire utilisée par les paramètres nécessaires aux opérations sur GF(2^m)
	 */
	void DLL_EXPORT FreeEcctkGf2m();

	/*!
	 * \ingroup ecc_util
	 * \brief Permet de mettre en place les paramètres nécessaires aux opérations sur GF(p)
	 *
	 * \warning les fonctions utilisant les courbes définies sur GF(p) ne fonctionne pas si cette fonction n'est pas 
	 * appelée au préalable
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT InitializeEcctkGfp();

	/*!
	 * \ingroup ecc_util
	 * \brief Permet de libérer la mémoire utilisée par les paramètres nécessaires aux opérations sur GF(p)
	 */
	void DLL_EXPORT FreeEcctkGfp();

	/*!
	 * \ingroup ecc_util
	 * \brief Permet de mettre en place les paramètres nécessaires aux opérations sur GF(2^m) & GF(p)
	 *
	 * \remark cette fonction appelle les deux fonctions InitializeEcctkGf2m & InitializeEcctkGfp
	 *
	 * \return code d'erreur de la fonction.
	 */
	s2byte DLL_EXPORT InitializeEcctkAll();

	/*!
	 * \ingroup ecc_util
	 * \brief Permet de libérer la mémoire utilisée par les paramètres nécessaires aux opérations sur GF(2^m) & GF(p)
	 *
	 * \remark cette fonction appelle les deux fonctions FreeEcctkGf2m & FreeEcctkGfp
	 */
	void DLL_EXPORT FreeEcctkAll();

#ifdef __cplusplus
};
#endif

#endif
