ETSI STF525 / Internal Testing test suite
This project provides an internal testing test suite and its associated Test Adapter/Codec
security_ecc.hh
Go to the documentation of this file.
1 
11 #pragma once
12 
13 #include <vector>
14 
15 #include <openssl/err.h>
16 #include <openssl/ec.h>
17 #include <openssl/pem.h>
18 #include <openssl/bn.h>
19 
23 enum class ec_elliptic_curves: unsigned char {
24  nist_p_256,
27 }; // End of class ec_elliptic_curves
28 
32 enum class encryption_algotithm: unsigned char {
37 }; // End of class encryption_algotithm
38 
43 class security_ecc {
46  EC_KEY* _ec_key;
47  const EC_GROUP* _ec_group;
48  BN_CTX* _bn_ctx;
49  std::vector<unsigned char> _pri_key;
50  std::vector<unsigned char> _pub_key_x;
51  std::vector<unsigned char> _pub_key_y;
52  std::vector<unsigned char> _eph_key;
53  std::vector<unsigned char> _enc_key_x;
54  std::vector<unsigned char> _enc_key_y;
55  std::vector<unsigned char> _sym_key;
56  std::vector<unsigned char> _nonce;
57  std::vector<unsigned char> _tag;
59 public:
60 
65  security_ecc(const ec_elliptic_curves p_elliptic_curve);
72  security_ecc(const ec_elliptic_curves p_elliptic_curve, const std::vector<unsigned char>& p_private_key);
79  security_ecc(const ec_elliptic_curves p_elliptic_curve, const std::vector<unsigned char>& p_public_key_x, const std::vector<unsigned char>& p_public_key_y);
83  virtual ~security_ecc();
84 
91  int generate();
100  int sign(const std::vector<unsigned char>& p_data, std::vector<unsigned char>& p_r_sig, std::vector<unsigned char>& p_s_sig);
108  int sign_verif(const std::vector<unsigned char>& p_data, const std::vector<unsigned char>& p_signature);
109 
121  int encrypt(const encryption_algotithm p_enc_algorithm, const std::vector<unsigned char>& p_message, std::vector<unsigned char>& p_enc_message);
135  int encrypt(const encryption_algotithm p_enc_algorithm, const std::vector<unsigned char>& p_symmetric_key, const std::vector<unsigned char>& p_nonce, const std::vector<unsigned char>& p_message, std::vector<unsigned char>& p_enc_message);
149  int decrypt(const encryption_algotithm p_enc_algorithm, const std::vector<unsigned char>& p_key, const std::vector<unsigned char>& p_nonce, const std::vector<unsigned char>& p_tag, const std::vector<unsigned char>& p_enc_message, std::vector<unsigned char>& p_message);
150 
151  // TODO To be reorganised
162  int generate_and_derive_ephemeral_key(const std::vector<unsigned char>& p_peer_public_enc_key_x, const std::vector<unsigned char>& p_peer_public_enc_key_y);
163 
164 
165 
166 // int generate_ephemeral_key(const encryption_algotithm p_enc_algorithm, const std::vector<unsigned char>& p_public_enc_key_x, const std::vector<unsigned char>& p_public_enc_key_y);
167  int decrypt(const std::vector<unsigned char>& p_nonce, const std::vector<unsigned char>& p_tag, const std::vector<unsigned char>& p_enc_message, std::vector<unsigned char>& p_message);
168 
169  inline const std::vector<unsigned char>& private_key() const { return _pri_key; };
170  inline const std::vector<unsigned char>& public_key_x() const { return _pub_key_x; };
171  inline const std::vector<unsigned char>& public_key_y() const { return _pub_key_y; };
172  inline const std::vector<unsigned char>& ephemeral_key() const { return _eph_key; };
173  inline const std::vector<unsigned char>& encryption_key_x() const { return _enc_key_x; };
174  inline const std::vector<unsigned char>& encryption_key_y() const { return _enc_key_y; };
175  inline const std::vector<unsigned char>& symmetric_encryption_key() const { return _sym_key; };
176  inline const std::vector<unsigned char>& nonce() const { return _nonce; };
177  inline const std::vector<unsigned char>& tag() const { return _tag; };
178 
179 private:
180 
185  const int init();
191  int bin_to_ec_point(const std::vector<unsigned char>& p_public_key_x, const std::vector<unsigned char>& p_public_key_y, EC_POINT** p_ec_point);
197  int public_key_to_bin(std::vector<unsigned char>& p_bin_key);
198 }; // End of class security_ecc
std::vector< unsigned char > _pub_key_x
Definition: security_ecc.hh:50
const std::vector< unsigned char > & encryption_key_x() const
Definition: security_ecc.hh:173
std::vector< unsigned char > _nonce
Definition: security_ecc.hh:56
const std::vector< unsigned char > & nonce() const
Definition: security_ecc.hh:176
const std::vector< unsigned char > & public_key_x() const
Definition: security_ecc.hh:170
const std::vector< unsigned char > & tag() const
Definition: security_ecc.hh:177
BN_CTX * _bn_ctx
Definition: security_ecc.hh:48
const std::vector< unsigned char > & ephemeral_key() const
Definition: security_ecc.hh:172
const std::vector< unsigned char > & private_key() const
Definition: security_ecc.hh:169
const std::vector< unsigned char > & encryption_key_y() const
Definition: security_ecc.hh:174
const EC_GROUP * _ec_group
Definition: security_ecc.hh:47
ec_elliptic_curves
Definition: security_ecc.hh:23
const std::vector< unsigned char > & public_key_y() const
Definition: security_ecc.hh:171
std::vector< unsigned char > _sym_key
Definition: security_ecc.hh:55
This class implements the generation of a key pair private/public.
Definition: security_ecc.hh:43
std::vector< unsigned char > _pri_key
Definition: security_ecc.hh:49
std::vector< unsigned char > _pub_key_y
Definition: security_ecc.hh:51
const std::vector< unsigned char > & symmetric_encryption_key() const
Definition: security_ecc.hh:175
encryption_algotithm _encryption_algotithm
Definition: security_ecc.hh:45
std::vector< unsigned char > _enc_key_x
Definition: security_ecc.hh:53
EC_KEY * _ec_key
Definition: security_ecc.hh:46
ec_elliptic_curves _elliptic_curve
Definition: security_ecc.hh:44
std::vector< unsigned char > _eph_key
Definition: security_ecc.hh:52
encryption_algotithm
Definition: security_ecc.hh:32
std::vector< unsigned char > _enc_key_y
Definition: security_ecc.hh:54
std::vector< unsigned char > _tag
Definition: security_ecc.hh:57