| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /* eccsi.h
- *
- * Copyright (C) 2006-2023 wolfSSL Inc.
- *
- * This file is part of wolfSSL.
- *
- * wolfSSL is free software; 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.
- *
- * wolfSSL 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
- */
- /*!
- \file wolfssl/wolfcrypt/eccsi.h
- */
- #ifndef WOLF_CRYPT_ECCSI_H
- #define WOLF_CRYPT_ECCSI_H
- #include <wolfssl/wolfcrypt/types.h>
- #ifdef WOLFCRYPT_HAVE_ECCSI
- #include <wolfssl/wolfcrypt/wolfmath.h>
- #include <wolfssl/wolfcrypt/ecc.h>
- #include <wolfssl/wolfcrypt/hash.h>
- #include <wolfssl/wolfcrypt/hmac.h>
- #define WOLFCRYPT_ECCSI_KMS
- #define WOLFCRYPT_ECCSI_CLIENT
- #define MAX_ECCSI_BYTES (256 / 8)
- /* Maximum number of loops of attempting to generate key pairs and signatures.
- */
- #ifndef ECCSI_MAX_GEN_COUNT
- #define ECCSI_MAX_GEN_COUNT 10
- #endif
- typedef struct EccsiKeyParams {
- /** Order (q) of elliptic curve as an MP integer. */
- mp_int order;
- #ifdef WOLFCRYPT_ECCSI_CLIENT
- /** A parameter of elliptic curve as an MP integer. */
- mp_int a;
- /** P parameter of elliptic curve as an MP integer. */
- mp_int b;
- /** Prime of elliptic curve as an MP integer. */
- mp_int prime;
- #endif
- /** Base point for elliptic curve operations as an ECC point. */
- ecc_point* base;
- /** Bit indicates order (q) is set as an MP integer in ECCSI key. */
- byte haveOrder:1;
- /** Bit indicates A is set as an MP integer in ECCSI key. */
- byte haveA:1;
- /** Bit indicates B is set as an MP integer in ECCSI key. */
- byte haveB:1;
- /** Bit indicates prime is set as an MP integer in ECCSI key. */
- byte havePrime:1;
- /** Bit indicates base point is set as an MP integer in ECCSI key. */
- byte haveBase:1;
- } EccsiKeyParams;
- /**
- * ECCSI key.
- */
- typedef struct EccsiKey {
- /** ECC key to perform elliptic curve operations with. */
- ecc_key ecc;
- /** ECC key to perform public key elliptic curve operations with. */
- ecc_key pubkey;
- /** ECC parameter in forms that can be used in computation. */
- EccsiKeyParams params;
- #ifdef WOLFCRYPT_ECCSI_CLIENT
- /** Temporary MP integer used during operations.. */
- mp_int tmp;
- /** Secret Signing Key */
- mp_int ssk;
- /** Public Validation Token (PVT) */
- ecc_point* pvt;
- #endif
- /** Generic hash algorithm object. */
- wc_HashAlg hash;
- /** Temporary buffer for use in operations. */
- byte data[(MAX_ECCSI_BYTES * 2) + 1];
- #ifdef WOLFCRYPT_ECCSI_CLIENT
- /** Hash of identity - used in signing/verification. */
- byte idHash[WC_MAX_DIGEST_SIZE];
- /** Size of hash of identity in bytes. */
- byte idHashSz;
- #endif
- /** Heap hint for dynamic memory allocation. */
- void* heap;
- /** Bit indicates KPAK (public key) is in montgomery form. */
- word16 kpakMont:1;
- } EccsiKey;
- #ifdef __cplusplus
- extern "C" {
- #endif
- WOLFSSL_API int wc_InitEccsiKey(EccsiKey* key, void* heap, int devId);
- WOLFSSL_API int wc_InitEccsiKey_ex(EccsiKey* key, int keySz, int curveId,
- void* heap, int devId);
- WOLFSSL_API void wc_FreeEccsiKey(EccsiKey* key);
- WOLFSSL_API int wc_MakeEccsiKey(EccsiKey* key, WC_RNG* rng);
- WOLFSSL_API int wc_MakeEccsiPair(EccsiKey* key, WC_RNG* rng,
- enum wc_HashType hashType, const byte* id, word32 idSz, mp_int* ssk,
- ecc_point* pvt);
- WOLFSSL_API int wc_ValidateEccsiPair(EccsiKey* key, enum wc_HashType hashType,
- const byte* id, word32 idSz, const mp_int* ssk, ecc_point* pvt,
- int* valid);
- WOLFSSL_API int wc_ValidateEccsiPvt(EccsiKey* key, const ecc_point* pvt,
- int* valid);
- WOLFSSL_API int wc_EncodeEccsiPair(const EccsiKey* key, mp_int* ssk,
- ecc_point* pvt, byte* data, word32* sz);
- WOLFSSL_API int wc_EncodeEccsiSsk(const EccsiKey* key, mp_int* ssk, byte* data,
- word32* sz);
- WOLFSSL_API int wc_EncodeEccsiPvt(const EccsiKey* key, ecc_point* pvt,
- byte* data, word32* sz, int raw);
- WOLFSSL_API int wc_DecodeEccsiPair(const EccsiKey* key, const byte* data,
- word32 sz, mp_int* ssk, ecc_point* pvt);
- WOLFSSL_API int wc_DecodeEccsiSsk(const EccsiKey* key, const byte* data,
- word32 sz, mp_int* ssk);
- WOLFSSL_API int wc_DecodeEccsiPvt(const EccsiKey* key, const byte* data,
- word32 sz, ecc_point* pvt);
- WOLFSSL_API int wc_DecodeEccsiPvtFromSig(const EccsiKey* key, const byte* sig,
- word32 sz, ecc_point* pvt);
- WOLFSSL_API int wc_ExportEccsiKey(EccsiKey* key, byte* data, word32* sz);
- WOLFSSL_API int wc_ImportEccsiKey(EccsiKey* key, const byte* data, word32 sz);
- WOLFSSL_API int wc_ExportEccsiPrivateKey(EccsiKey* key, byte* data, word32* sz);
- WOLFSSL_API int wc_ImportEccsiPrivateKey(EccsiKey* key, const byte* data,
- word32 sz);
- WOLFSSL_API int wc_ExportEccsiPublicKey(EccsiKey* key, byte* data, word32* sz,
- int raw);
- WOLFSSL_API int wc_ImportEccsiPublicKey(EccsiKey* key, const byte* data,
- word32 sz, int trusted);
- WOLFSSL_API int wc_HashEccsiId(EccsiKey* key, enum wc_HashType hashType,
- const byte* id, word32 idSz, ecc_point* pvt, byte* hash, byte* hashSz);
- WOLFSSL_API int wc_SetEccsiHash(EccsiKey* key, const byte* hash, byte hashSz);
- WOLFSSL_API int wc_SetEccsiPair(EccsiKey* key, const mp_int* ssk,
- const ecc_point* pvt);
- WOLFSSL_API int wc_SignEccsiHash(EccsiKey* key, WC_RNG* rng,
- enum wc_HashType hashType, const byte* msg, word32 msgSz, byte* sig,
- word32* sigSz);
- WOLFSSL_API int wc_VerifyEccsiHash(EccsiKey* key, enum wc_HashType hashType,
- const byte* msg, word32 msgSz, const byte* sig, word32 sigSz,
- int* verified);
- #ifdef __cplusplus
- } /* extern "C" */
- #endif
- #endif /* WOLFCRYPT_HAVE_ECCSI */
- #endif /* WOLF_CRYPT_ECCSI_H */
|