#ifndef AWS_CAL_ECC_H
#define AWS_CAL_ECC_H
#include <aws/cal/exports.h>
#include <aws/common/atomics.h>
#include <aws/common/byte_buf.h>
#include <aws/common/common.h>
enum aws_ecc_curve_name {
AWS_CAL_ECDSA_P256,
AWS_CAL_ECDSA_P384,
};
struct aws_ecc_key_pair;
typedef void aws_ecc_key_pair_destroy_fn(struct aws_ecc_key_pair *key_pair);
typedef int aws_ecc_key_pair_sign_message_fn(
const struct aws_ecc_key_pair *key_pair,
const struct aws_byte_cursor *message,
struct aws_byte_buf *signature_output);
typedef int aws_ecc_key_pair_derive_public_key_fn(struct aws_ecc_key_pair *key_pair);
typedef int aws_ecc_key_pair_verify_signature_fn(
const struct aws_ecc_key_pair *signer,
const struct aws_byte_cursor *message,
const struct aws_byte_cursor *signature);
typedef size_t aws_ecc_key_pair_signature_length_fn(const struct aws_ecc_key_pair *signer);
struct aws_ecc_key_pair_vtable {
aws_ecc_key_pair_destroy_fn *destroy;
aws_ecc_key_pair_derive_public_key_fn *derive_pub_key;
aws_ecc_key_pair_sign_message_fn *sign_message;
aws_ecc_key_pair_verify_signature_fn *verify_signature;
aws_ecc_key_pair_signature_length_fn *signature_length;
};
struct aws_ecc_key_pair {
struct aws_allocator *allocator;
struct aws_atomic_var ref_count;
enum aws_ecc_curve_name curve_name;
struct aws_byte_buf key_buf;
struct aws_byte_buf pub_x;
struct aws_byte_buf pub_y;
struct aws_byte_buf priv_d;
struct aws_ecc_key_pair_vtable *vtable;
void *impl;
};
AWS_EXTERN_C_BEGIN
AWS_CAL_API void aws_ecc_key_pair_acquire(struct aws_ecc_key_pair *key_pair);
AWS_CAL_API void aws_ecc_key_pair_release(struct aws_ecc_key_pair *key_pair);
AWS_CAL_API struct aws_ecc_key_pair *aws_ecc_key_pair_new_from_private_key(
struct aws_allocator *allocator,
enum aws_ecc_curve_name curve_name,
const struct aws_byte_cursor *priv_key);
#if !defined(AWS_OS_IOS)
AWS_CAL_API struct aws_ecc_key_pair *aws_ecc_key_pair_new_generate_random(
struct aws_allocator *allocator,
enum aws_ecc_curve_name curve_name);
#endif
AWS_CAL_API struct aws_ecc_key_pair *aws_ecc_key_pair_new_from_public_key(
struct aws_allocator *allocator,
enum aws_ecc_curve_name curve_name,
const struct aws_byte_cursor *public_key_x,
const struct aws_byte_cursor *public_key_y);
AWS_CAL_API struct aws_ecc_key_pair *aws_ecc_key_pair_new_from_asn1(
struct aws_allocator *allocator,
const struct aws_byte_cursor *encoded_keys);
AWS_CAL_API struct aws_ecc_key_pair *aws_ecc_key_new_from_hex_coordinates(
struct aws_allocator *allocator,
enum aws_ecc_curve_name curve_name,
struct aws_byte_cursor pub_x_hex_cursor,
struct aws_byte_cursor pub_y_hex_cursor);
AWS_CAL_API int aws_ecc_key_pair_derive_public_key(struct aws_ecc_key_pair *key_pair);
AWS_CAL_API int aws_ecc_curve_name_from_oid(struct aws_byte_cursor *oid, enum aws_ecc_curve_name *curve_name);
AWS_CAL_API int aws_ecc_oid_from_curve_name(enum aws_ecc_curve_name curve_name, struct aws_byte_cursor *oid);
AWS_CAL_API int aws_ecc_key_pair_sign_message(
const struct aws_ecc_key_pair *key_pair,
const struct aws_byte_cursor *message,
struct aws_byte_buf *signature);
AWS_CAL_API int aws_ecc_key_pair_verify_signature(
const struct aws_ecc_key_pair *key_pair,
const struct aws_byte_cursor *message,
const struct aws_byte_cursor *signature);
AWS_CAL_API size_t aws_ecc_key_pair_signature_length(const struct aws_ecc_key_pair *key_pair);
AWS_CAL_API void aws_ecc_key_pair_get_public_key(
const struct aws_ecc_key_pair *key_pair,
struct aws_byte_cursor *pub_x,
struct aws_byte_cursor *pub_y);
AWS_CAL_API void aws_ecc_key_pair_get_private_key(
const struct aws_ecc_key_pair *key_pair,
struct aws_byte_cursor *private_d);
AWS_CAL_API size_t aws_ecc_key_coordinate_byte_size_from_curve_name(enum aws_ecc_curve_name curve_name);
AWS_EXTERN_C_END
#endif