Files
mars-matrixssl/crypto/pubkey/pubkey.h
J Harper b8dcfd8759 3.8.6
2016-10-10 21:59:05 +01:00

211 lines
5.4 KiB
C

/**
* @file pubkey.h
* @version $Format:%h%d$
*
* Public and Private key header.
*/
/*
* Copyright (c) 2013-2016 INSIDE Secure Corporation
* Copyright (c) PeerSec Networks, 2002-2011
* All Rights Reserved
*
* The latest version of this code is available at http://www.matrixssl.org
*
* This software is open source; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This General Public License does NOT permit incorporating this software
* into proprietary programs. If you are unable to comply with the GPL, a
* commercial license for this software may be purchased from INSIDE at
* http://www.insidesecure.com/
*
* This program is distributed in WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* http://www.gnu.org/copyleft/gpl.html
*/
/******************************************************************************/
#ifndef _h_PS_PUBKEY
#define _h_PS_PUBKEY
/******************************************************************************/
#include "pubkey_matrix.h"
#ifdef USE_OPENSSL_CRYPTO
#include "pubkey_openssl.h"
#endif
/******************************************************************************/
#ifdef USE_RSA
/**
The included pubkey_* header must define:
typedef ... psRsaKey_t;
and
PS_RSA_STATIC_INIT
*/
#ifndef PS_RSA_STATIC_INIT
#define PS_RSA_STATIC_INIT { .size = NULL }
#endif
#endif /* USE_RSA */
/******************************************************************************/
#ifdef USE_ECC
#define ECC_MAXSIZE 132 /* max private key size */
/* NOTE: In MatrixSSL usage, the ecFlags are 24 bits only */
#define IS_SECP192R1 0x00000001
#define IS_SECP224R1 0x00000002
#define IS_SECP256R1 0x00000004
#define IS_SECP384R1 0x00000008
#define IS_SECP521R1 0x00000010
/* WARNING: Public points on Brainpool curves are not validated */
#define IS_BRAIN224R1 0x00010000
#define IS_BRAIN256R1 0x00020000
#define IS_BRAIN384R1 0x00040000
#define IS_BRAIN512R1 0x00080000
/* TLS needs one bit of info (last bit) */
#define IS_RECVD_EXT 0x00800000
/**
@see https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8
*/
enum {
IANA_SECP192R1 = 19,
IANA_SECP224R1 = 21,
IANA_SECP256R1 = 23,
IANA_SECP384R1,
IANA_SECP521R1,
IANA_BRAIN256R1,
IANA_BRAIN384R1,
IANA_BRAIN512R1,
IANA_BRAIN224R1 = 255 /**< @note this is not defined by IANA */
};
/**
@see ANSI X9.62 or X9.63
*/
enum {
ANSI_INFINITY = 0,
ANSI_COMPRESSED0 = 2,
ANSI_COMPRESSED1,
ANSI_UNCOMPRESSED,
ANSI_HYBRID0 = 6,
ANSI_HYBRID1
};
/**
The included pubkey_* header must define the following.
typedef ... psEccCurve_t;
typedef ... psEccPoint_t;
typedef ... psEccKey_t;
and
PS_ECC_STATIC_INIT
and implement the following functions.
*/
#ifndef PS_ECC_STATIC_INIT
#define PS_ECC_STATIC_INIT { .type = 0 }
#endif
extern void psGetEccCurveIdList(unsigned char *curveList, uint8_t *len);
extern void userSuppliedEccList(unsigned char *curveList, uint8_t *len,
uint32_t curves);
extern uint32_t compiledInEcFlags(void);
extern int32_t getEcPubKey(psPool_t *pool, const unsigned char **pp, uint16_t len,
psEccKey_t *pubKey, unsigned char sha1KeyHash[SHA1_HASH_SIZE]);
extern int32_t getEccParamById(uint16_t curveId, const psEccCurve_t **curve);
extern int32_t getEccParamByName(const char *curveName,
const psEccCurve_t **curve);
extern int32_t getEccParamByOid(uint32_t oid, const psEccCurve_t **curve);
#endif
/******************************************************************************/
#ifdef USE_DH
/**
The included pubkey_* header must define:
typedef ... psDhParams_t;
typedef ... psDhKey_t;
and
PS_DH_STATIC_INIT
*/
#ifndef PS_DH_STATIC_INIT
#define PS_DH_STATIC_INIT { .type = 0 }
#endif
#endif
/******************************************************************************/
/** Public or private key */
enum PACKED {
PS_PUBKEY = 1,
PS_PRIVKEY
};
/** Public Key types for psPubKey_t */
enum PACKED {
PS_NOKEY = 0,
PS_RSA,
PS_DSA,
PS_ECC,
PS_DH
};
/** Signature types */
enum PACKED {
RSA_TYPE_SIG = 5,
ECDSA_TYPE_SIG,
RSAPSS_TYPE_SIG,
DSA_TYPE_SIG
};
/**
Univeral public key type.
The pubKey name comes from the generic public-key crypto terminology and
does not mean these key are restricted to the public side only. These
may be private keys.
*/
typedef struct {
#if defined(USE_RSA) || defined(USE_ECC)
union {
#ifdef USE_RSA
psRsaKey_t rsa;
#endif
#ifdef USE_ECC
psEccKey_t ecc;
#endif
#ifdef USE_DH
psDhKey_t dh;
#endif
} key;
#endif
psPool_t *pool;
uint16_t keysize; /* in bytes. 512 max for RSA 4096 */
uint8_t type; /* PS_RSA, PS_ECC, PS_DH */
} psPubKey_t;
extern int32_t pkcs1Pad(const unsigned char *in, uint16_t inlen,
unsigned char *out, uint16_t outlen,
uint8_t cryptType, void *userPtr);
extern int32_t pkcs1Unpad(const unsigned char *in, uint16_t inlen,
unsigned char *out, uint16_t outlen,
uint8_t decryptType);
/******************************************************************************/
#endif /* _h_PS_PUBKEY */