142 lines
5.2 KiB
C
142 lines
5.2 KiB
C
/***************************************************************************
|
|
*
|
|
Copyright 2013 CertiVox UK Ltd. *
|
|
*
|
|
This file is part of CertiVox MIRACL Crypto SDK. *
|
|
*
|
|
The CertiVox MIRACL Crypto SDK provides developers with an *
|
|
extensive and efficient set of cryptographic functions. *
|
|
For further information about its features and functionalities please *
|
|
refer to http://www.certivox.com *
|
|
*
|
|
* The CertiVox MIRACL Crypto SDK is free software: you can *
|
|
redistribute it and/or modify it under the terms of the *
|
|
GNU Affero General Public License as published by the *
|
|
Free Software Foundation, either version 3 of the License, *
|
|
or (at your option) any later version. *
|
|
*
|
|
* The CertiVox MIRACL Crypto SDK is distributed in the hope *
|
|
that it will be useful, but WITHOUT ANY WARRANTY; without even the *
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
See the GNU Affero General Public License for more details. *
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public *
|
|
License along with CertiVox MIRACL Crypto SDK. *
|
|
If not, see <http://www.gnu.org/licenses/>. *
|
|
*
|
|
You can be released from the requirements of the license by purchasing *
|
|
a commercial license. Buying such a license is mandatory as soon as you *
|
|
develop commercial activities involving the CertiVox MIRACL Crypto SDK *
|
|
without disclosing the source code of your own applications, or shipping *
|
|
the CertiVox MIRACL Crypto SDK with a closed source product. *
|
|
*
|
|
***************************************************************************/
|
|
|
|
/*
|
|
* MIRACL ECDH header file
|
|
* Author: M. Scott 2013
|
|
*/
|
|
|
|
#ifndef ECDH_H
|
|
#define ECDH_H
|
|
|
|
#include "miracl.h"
|
|
#include "octet.h"
|
|
|
|
#define EAS 16 /* Symmetric Key size - 128 bits */
|
|
#define EGS 32 /* ECCSI Group Size - 256 bits */
|
|
#define EFS 32 /* ECCSI Field Size - 256 bits */
|
|
|
|
#define ECDH_OK 0
|
|
#define ECDH_DOMAIN_ERROR -1
|
|
#define ECDH_INVALID_PUBLIC_KEY -2
|
|
#define ECDH_ERROR -3
|
|
#define ECDH_INVALID -4
|
|
#define ECDH_DOMAIN_NOT_FOUND -5
|
|
#define ECDH_OUT_OF_MEMORY -6
|
|
#define ECDH_DIV_BY_ZERO -7
|
|
#define ECDH_BAD_ASSUMPTION -8
|
|
|
|
extern const mr_small ecrom[];
|
|
|
|
/* ECp domain parameters */
|
|
|
|
typedef struct
|
|
{
|
|
int nibbles;
|
|
char Q[EFS];
|
|
char A[EFS];
|
|
char B[EFS];
|
|
char R[EGS];
|
|
char Gx[EFS];
|
|
char Gy[EFS];
|
|
} ecp_domain;
|
|
|
|
#define HASH_BYTES 32
|
|
|
|
#if HASH_BYTES==20
|
|
#define HASHFUNC sha
|
|
#define SHS_INIT shs_init
|
|
#define SHS_PROCESS shs_process
|
|
#define SHS_HASH shs_hash
|
|
#define HASH_BLOCK 64
|
|
#endif
|
|
|
|
#if HASH_BYTES==32
|
|
#define HASHFUNC sha256
|
|
#define SHS_INIT shs256_init
|
|
#define SHS_PROCESS shs256_process
|
|
#define SHS_HASH shs256_hash
|
|
#define HASH_BLOCK 64
|
|
#endif
|
|
|
|
#if HASH_BYTES==48
|
|
#define HASHFUNC sha384
|
|
#define SHS_INIT shs384_init
|
|
#define SHS_PROCESS shs384_process
|
|
#define SHS_HASH shs384_hash
|
|
#define HASH_BLOCK 128
|
|
#endif
|
|
|
|
#if HASH_BYTES==64
|
|
#define HASHFUNC sha512
|
|
#define SHS_INIT shs512_init
|
|
#define SHS_PROCESS shs512_process
|
|
#define SHS_HASH shs512_hash
|
|
#define HASH_BLOCK 128
|
|
#endif
|
|
|
|
/* ECDH Auxiliary Functions */
|
|
|
|
extern void CREATE_CSPRNG(csprng *,octet *);
|
|
extern void KILL_CSPRNG(csprng *);
|
|
extern void HASH(octet *,octet *);
|
|
extern BOOL HMAC(octet *,octet *,int,octet *);
|
|
extern void KDF1(octet *,int,octet *);
|
|
extern void KDF2(octet *,octet *,int,octet *);
|
|
extern void PBKDF2(octet *,octet *,int,int,octet *);
|
|
extern void AES_CBC_IV0_ENCRYPT(octet *,octet *,octet *);
|
|
extern BOOL AES_CBC_IV0_DECRYPT(octet *,octet *,octet *);
|
|
|
|
/* ECDH primitives - support functions */
|
|
|
|
extern void ECP_DOMAIN_KILL(ecp_domain *);
|
|
extern int ECP_DOMAIN_INIT(ecp_domain *,const void *);
|
|
extern int ECP_KEY_PAIR_GENERATE(ecp_domain *,csprng *,octet *,octet *);
|
|
extern int ECP_PUBLIC_KEY_VALIDATE(ecp_domain *,BOOL,octet *);
|
|
|
|
/* ECDH primitives */
|
|
|
|
extern int ECPSVDP_DH(ecp_domain *,octet *,octet *,octet *);
|
|
extern int ECPSVDP_DHC(ecp_domain *,octet *,octet *,BOOL,octet *);
|
|
|
|
/* ECIES functions */
|
|
extern void ECP_ECIES_ENCRYPT(ecp_domain *,octet *,octet *,csprng *,octet *,octet *,int,octet *,octet *,octet *);
|
|
extern BOOL ECP_ECIES_DECRYPT(ecp_domain *,octet *,octet *,octet *,octet *,octet *,octet *,octet *);
|
|
|
|
/* ECDSA functions */
|
|
extern int ECPSP_DSA(ecp_domain *,csprng *,octet *,octet *,octet *,octet *);
|
|
extern int ECPVP_DSA(ecp_domain *,octet *,octet *,octet *,octet *);
|
|
#endif
|
|
|