/*
* COPYRIGHT (c) International Business Machines Corp. 2001-2017
*
* This program is provided under the terms of the Common Public License,
* version 1.0 (CPL-1.0). Any use, reproduction or distribution for this
* software constitutes recipient's acceptance of CPL-1.0 terms which can be
* found in the file LICENSE file or at
* https://opensource.org/licenses/cpl1.0.php
*/
#ifndef _EC_DEFS
#define _EC_DEFS
#include <openssl/opensslv.h>
#include "ec_curves.h"
/* OpenSSL compat */
#if OPENSSL_VERSION_NUMBER < 0x10101000L
# define EC_POINT_get_affine_coordinates EC_POINT_get_affine_coordinates_GFp
# define EC_POINT_set_compressed_coordinates \
EC_POINT_set_compressed_coordinates_GFp
#endif
// Elliptic Curve type
//
#define PRIME_CURVE 0x00
#define BRAINPOOL_CURVE 0x01
#define MONTGOMERY_CURVE 0x02
#define EDWARDS_CURVE 0x03
// Elliptic Curve length in bits
//
#define CURVE160 0x00A0
#define CURVE192 0x00C0
#define CURVE224 0x00E0
#define CURVE256 0x0100
#define CURVE320 0x0140
#define CURVE384 0x0180
#define CURVE456 0x01C8
#define CURVE512 0x0200
#define CURVE521 0x0209
/* Supported Elliptic Curves */
#define NUMEC 24 /* number of supported curves */
extern const CK_BYTE brainpoolP160r1[];
extern const CK_BYTE brainpoolP160t1[];
extern const CK_BYTE brainpoolP192r1[];
extern const CK_BYTE brainpoolP192t1[];
extern const CK_BYTE brainpoolP224r1[];
extern const CK_BYTE brainpoolP224t1[];
extern const CK_BYTE brainpoolP256r1[];
extern const CK_BYTE brainpoolP256t1[];
extern const CK_BYTE brainpoolP320r1[];
extern const CK_BYTE brainpoolP320t1[];
extern const CK_BYTE brainpoolP384r1[];
extern const CK_BYTE brainpoolP384t1[];
extern const CK_BYTE brainpoolP512r1[];
extern const CK_BYTE brainpoolP512t1[];
extern const CK_BYTE prime192v1[];
extern const CK_BYTE secp224r1[];
extern const CK_BYTE prime256v1[];
extern const CK_BYTE secp384r1[];
extern const CK_BYTE secp521r1[];
extern const CK_BYTE secp256k1[];
extern const CK_BYTE curve25519[];
extern const CK_BYTE curve448[];
extern const CK_BYTE ed25519[];
extern const CK_BYTE ed448[];
// structure of supported Elliptic Curves
struct _ec {
uint8_t curve_type; /* uint8_t - prime or brainpool curve */
uint16_t len_bits; /* uint16_t - len in bits */
int nid;
CK_ULONG data_size;
void const *data;
} __attribute__ ((__packed__));
extern const struct _ec der_ec_supported[NUMEC];
#define MAX_ECDH_SHARED_SECRET_SIZE 66
#define MAX_SUPPORTED_HASH_LENGTH 64
/*
* Refer to CCA Programmer's Guide, PKA Key Token Build
* Key value structure elements, ECC keys
*/
typedef struct {
uint8_t curve_type; /* 00 = prime, 01 = brainpool */
uint8_t reserved;
uint16_t p_bitlen;
uint16_t d_length;
uint16_t q_length;
// followed by d || q
} __attribute__((packed)) ECC_PAIR;
typedef struct {
uint8_t curve_type; /* 00 = prime, 01 = brainpool */
uint8_t reserved;
uint16_t p_bitlen;
uint16_t q_length;
// followed by q
} __attribute__((packed)) ECC_PUBL;
#endif