| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 | /* * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License").  You may not use * this file except in compliance with the License.  You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html *//* Internal EC functions for other submodules: not for application use */#ifndef OSSL_CRYPTO_ECX_H# define OSSL_CRYPTO_ECX_H# pragma once# include <openssl/opensslconf.h># ifndef OPENSSL_NO_ECX#  include <openssl/core.h>#  include <openssl/e_os2.h>#  include <openssl/crypto.h>#  include "internal/refcount.h"#  include "crypto/types.h"#  define X25519_KEYLEN         32#  define X448_KEYLEN           56#  define ED25519_KEYLEN        32#  define ED448_KEYLEN          57#  define MAX_KEYLEN  ED448_KEYLEN#  define X25519_BITS           253#  define X25519_SECURITY_BITS  128#  define X448_BITS             448#  define X448_SECURITY_BITS    224#  define ED25519_BITS          256/* RFC8032 Section 8.5 */#  define ED25519_SECURITY_BITS 128#  define ED25519_SIGSIZE       64#  define ED448_BITS            456/* RFC8032 Section 8.5 */#  define ED448_SECURITY_BITS   224#  define ED448_SIGSIZE         114typedef enum {    ECX_KEY_TYPE_X25519,    ECX_KEY_TYPE_X448,    ECX_KEY_TYPE_ED25519,    ECX_KEY_TYPE_ED448} ECX_KEY_TYPE;#define KEYTYPE2NID(type) \    ((type) == ECX_KEY_TYPE_X25519 \     ?  EVP_PKEY_X25519 \     : ((type) == ECX_KEY_TYPE_X448 \        ? EVP_PKEY_X448 \        : ((type) == ECX_KEY_TYPE_ED25519 \           ? EVP_PKEY_ED25519 \           : EVP_PKEY_ED448)))struct ecx_key_st {    OSSL_LIB_CTX *libctx;    char *propq;    unsigned int haspubkey:1;    unsigned char pubkey[MAX_KEYLEN];    unsigned char *privkey;    size_t keylen;    ECX_KEY_TYPE type;    CRYPTO_REF_COUNT references;};size_t ossl_ecx_key_length(ECX_KEY_TYPE type);ECX_KEY *ossl_ecx_key_new(OSSL_LIB_CTX *libctx, ECX_KEY_TYPE type,                          int haspubkey, const char *propq);void ossl_ecx_key_set0_libctx(ECX_KEY *key, OSSL_LIB_CTX *libctx);unsigned char *ossl_ecx_key_allocate_privkey(ECX_KEY *key);void ossl_ecx_key_free(ECX_KEY *key);int ossl_ecx_key_up_ref(ECX_KEY *key);ECX_KEY *ossl_ecx_key_dup(const ECX_KEY *key, int selection);int ossl_ecx_compute_key(ECX_KEY *peer, ECX_KEY *priv, size_t keylen,                         unsigned char *secret, size_t *secretlen,                         size_t outlen);int ossl_x25519(uint8_t out_shared_key[32], const uint8_t private_key[32],                const uint8_t peer_public_value[32]);void ossl_x25519_public_from_private(uint8_t out_public_value[32],                                     const uint8_t private_key[32]);intossl_ed25519_public_from_private(OSSL_LIB_CTX *ctx, uint8_t out_public_key[32],                                 const uint8_t private_key[32],                                 const char *propq);intossl_ed25519_sign(uint8_t *out_sig, const uint8_t *tbs, size_t tbs_len,                  const uint8_t public_key[32], const uint8_t private_key[32],                  const uint8_t dom2flag, const uint8_t phflag, const uint8_t csflag,                  const uint8_t *context, size_t context_len,                  OSSL_LIB_CTX *libctx, const char *propq);intossl_ed25519_verify(const uint8_t *tbs, size_t tbs_len,                    const uint8_t signature[64], const uint8_t public_key[32],                    const uint8_t dom2flag, const uint8_t phflag, const uint8_t csflag,                    const uint8_t *context, size_t context_len,                    OSSL_LIB_CTX *libctx, const char *propq);intossl_ed448_public_from_private(OSSL_LIB_CTX *ctx, uint8_t out_public_key[57],                               const uint8_t private_key[57], const char *propq);intossl_ed448_sign(OSSL_LIB_CTX *ctx, uint8_t *out_sig,                const uint8_t *message, size_t message_len,                const uint8_t public_key[57], const uint8_t private_key[57],                const uint8_t *context, size_t context_len,                const uint8_t phflag, const char *propq);intossl_ed448_verify(OSSL_LIB_CTX *ctx,                  const uint8_t *message, size_t message_len,                  const uint8_t signature[114], const uint8_t public_key[57],                  const uint8_t *context, size_t context_len,                  const uint8_t phflag, const char *propq);intossl_x448(uint8_t out_shared_key[56], const uint8_t private_key[56],          const uint8_t peer_public_value[56]);voidossl_x448_public_from_private(uint8_t out_public_value[56],                              const uint8_t private_key[56]);/* Backend support */typedef enum {    KEY_OP_PUBLIC,    KEY_OP_PRIVATE,    KEY_OP_KEYGEN} ecx_key_op_t;ECX_KEY *ossl_ecx_key_op(const X509_ALGOR *palg,                         const unsigned char *p, int plen,                         int pkey_id, ecx_key_op_t op,                         OSSL_LIB_CTX *libctx, const char *propq);int ossl_ecx_public_from_private(ECX_KEY *key);int ossl_ecx_key_fromdata(ECX_KEY *ecx, const OSSL_PARAM params[],                          int include_private);ECX_KEY *ossl_ecx_key_from_pkcs8(const PKCS8_PRIV_KEY_INFO *p8inf,                                 OSSL_LIB_CTX *libctx, const char *propq);ECX_KEY *ossl_evp_pkey_get1_X25519(EVP_PKEY *pkey);ECX_KEY *ossl_evp_pkey_get1_X448(EVP_PKEY *pkey);ECX_KEY *ossl_evp_pkey_get1_ED25519(EVP_PKEY *pkey);ECX_KEY *ossl_evp_pkey_get1_ED448(EVP_PKEY *pkey);# endif /* OPENSSL_NO_ECX */#endif
 |