/*
 * libZRTP SDK library, implements the ZRTP secure VoIP protocol.
 * Copyright (c) 2006-2009 Philip R. Zimmermann.  All rights reserved.
 * Contact: http://philzimmermann.com
 * For licensing and other legal details, see the file zrtp_legal.c.
 */
 
#ifndef __ZRTP_CRYPTO_EC_H__
#define __ZRTP_CRYPTO_EC_H__

#include "bn.h"

#include "zrtp_config.h"
#include "zrtp_types.h"
#include "zrtp_error.h"

#define ZRTP_MAXECBITS	521
#define ZRTP_MAXECWORDS	((ZRTP_MAXECBITS+7)/8)

typedef struct zrtp_ec_params
{
	unsigned		ec_bits;						/* # EC bits: 256, 384, 521 */
	uint8_t			P_data[ZRTP_MAXECWORDS];		/* curve field prime */
	uint8_t			n_data[ZRTP_MAXECWORDS];		/* curve order (# points) */
	uint8_t			b_data[ZRTP_MAXECWORDS];		/* curve param, y^3 = x^2 -3x + b */
	uint8_t			Gx_data[ZRTP_MAXECWORDS];		/* curve point, x coordinate */
	uint8_t			Gy_data[ZRTP_MAXECWORDS];		/* curve point, y coordinate */
} zrtp_ec_params_t;

#if defined(__cplusplus)
extern "C"
{
#endif 
 
/*============================================================================*/
/* 	  Elliptic Curve library                 		      					  */
/*============================================================================*/

int zrtp_ecAdd ( struct BigNum *rsltx,
				 struct BigNum *rslty,
				 struct BigNum *p1x,
				 struct BigNum *p1y,
				 struct BigNum *p2x,
				 struct BigNum *p2y,
				 struct BigNum *mod);

int zrtp_ecMul ( struct BigNum *rsltx,
				 struct BigNum *rslty,
				 struct BigNum *mult,
				 struct BigNum *basex,
				 struct BigNum *basey,
				 struct BigNum *mod);

zrtp_status_t zrtp_ec_random_point( zrtp_global_t *zrtp,
									struct BigNum *P,
									struct BigNum *n,
									struct BigNum *Gx,
									struct BigNum *Gy,
									struct BigNum *pkx,
									struct BigNum *pky,
									struct BigNum *sv,
									uint8_t *test_sv_data,
									size_t test_sv_data_len);

extern zrtp_status_t zrtp_ec_init_params(struct zrtp_ec_params *params, uint32_t bits );


/* Useful bignum utility functions not defined in bignum library */
int bnAddMod_ (struct BigNum *rslt, struct BigNum *n1, struct BigNum *mod);
int bnAddQMod_ (struct BigNum *rslt, unsigned n1, struct BigNum *mod);
int bnSubMod_ (struct BigNum *rslt, struct BigNum *n1, struct BigNum *mod);
int bnSubQMod_ (struct BigNum *rslt, unsigned n1, struct BigNum *mod);
int bnMulMod_ (struct BigNum *rslt, struct BigNum *n1, struct BigNum *n2, struct BigNum *mod);
int bnMulQMod_ (struct BigNum *rslt, struct BigNum *n1, unsigned n2, struct BigNum *mod);
int bnSquareMod_ (struct BigNum *rslt, struct BigNum *n1, struct BigNum *mod);

#if defined(__cplusplus)
}
#endif

#endif /* __ZRTP_CRYPTO_EC_H__ */