An authentication provider.
More...
#include <CryptoBackend.h>
Inherited by libcdoc::PKCS11Backend, and libcdoc::WinBackend.
|
| CryptoBackend ()=default |
|
virtual | ~CryptoBackend () noexcept=default |
|
| CryptoBackend (const CryptoBackend &)=delete |
|
CryptoBackend & | operator= (const CryptoBackend &)=delete |
|
| CDOC_DISABLE_MOVE (CryptoBackend) |
|
virtual std::string | getLastErrorStr (result_t code) const |
|
virtual result_t | random (std::vector< uint8_t > &dst, unsigned int size) |
| Fill vector with random bytes.
|
|
virtual result_t | deriveECDH1 (std::vector< uint8_t > &dst, const std::vector< uint8_t > &public_key, unsigned int idx) |
| Derive shared secret.
|
|
virtual result_t | decryptRSA (std::vector< uint8_t > &dst, const std::vector< uint8_t > &data, bool oaep, unsigned int idx) |
| decryptRSA
|
|
virtual result_t | deriveConcatKDF (std::vector< uint8_t > &dst, const std::vector< uint8_t > &public_key, const std::string &digest, const std::vector< uint8_t > &algorithm_id, const std::vector< uint8_t > &party_uinfo, const std::vector< uint8_t > &party_vinfo, unsigned int idx) |
| Derive key by ConcatKDF algorithm.
|
|
virtual result_t | deriveHMACExtract (std::vector< uint8_t > &dst, const std::vector< uint8_t > &public_key, const std::vector< uint8_t > &salt, unsigned int idx) |
| Get CDoc2 KEK pre-master from ECC key.
|
|
virtual result_t | getSecret (std::vector< uint8_t > &dst, unsigned int idx) |
| Get secret value (either password or symmetric key) for a lock.
|
|
virtual result_t | getKeyMaterial (std::vector< uint8_t > &dst, const std::vector< uint8_t > &pw_salt, int32_t kdf_iter, unsigned int idx) |
| Get CDoc2 key material for HKDF expansion.
|
|
virtual result_t | extractHKDF (std::vector< uint8_t > &dst, const std::vector< uint8_t > &salt, const std::vector< uint8_t > &pw_salt, int32_t kdf_iter, unsigned int idx) |
| Get CDoc2 KEK pre-master from symmetric key.
|
|
virtual result_t | sign (std::vector< uint8_t > &dst, HashAlgorithm algorithm, const std::vector< uint8_t > &digest, unsigned int idx) |
| sign Sign message with given algorithm
|
|
virtual int | test (libcdoc::Lock &lock) |
|
An authentication provider.
Implements cryptographic methods that may need either user action (supplying password) or external communication (PKCS11). At minimum one should implement:
- deriveECDH1 for ECC keys
- decryptRSA for RSA keys
- getSecret for symmetric keys.
ECC and symmetric keys have also frontend methods; implementing these allows the program to perform certain cryptographic procedures in controlled environment and (in case of symmetric keys) avoid exposing secret keys/passwords.
◆ HashAlgorithm
Enumerator |
---|
SHA_224 | |
SHA_256 | |
SHA_384 | |
SHA_512 | |
◆ CryptoBackend() [1/2]
libcdoc::CryptoBackend::CryptoBackend |
( |
| ) |
|
|
default |
◆ ~CryptoBackend()
virtual libcdoc::CryptoBackend::~CryptoBackend |
( |
| ) |
|
|
virtualdefaultnoexcept |
◆ CryptoBackend() [2/2]
◆ CDOC_DISABLE_MOVE()
◆ decryptRSA()
virtual result_t libcdoc::CryptoBackend::decryptRSA |
( |
std::vector< uint8_t > & |
dst, |
|
|
const std::vector< uint8_t > & |
data, |
|
|
bool |
oaep, |
|
|
unsigned int |
idx |
|
) |
| |
|
inlinevirtual |
◆ deriveConcatKDF()
virtual result_t libcdoc::CryptoBackend::deriveConcatKDF |
( |
std::vector< uint8_t > & |
dst, |
|
|
const std::vector< uint8_t > & |
public_key, |
|
|
const std::string & |
digest, |
|
|
const std::vector< uint8_t > & |
algorithm_id, |
|
|
const std::vector< uint8_t > & |
party_uinfo, |
|
|
const std::vector< uint8_t > & |
party_vinfo, |
|
|
unsigned int |
idx |
|
) |
| |
|
virtual |
Derive key by ConcatKDF algorithm.
The ConcatKDF key derivation algorithm is defined in Section 5.8.1 of NIST SP 800-56A. The default implementation calls deriveECDH1 and performs local concatKDF
- Parameters
-
dst | the container for derived key |
public_key | ECDH public Key used to derive shared secret |
digest | Digest method to use for ConcatKDF algorithm |
algorithm_id | OtherInfo info parameters to input |
party_uinfo | OtherInfo info parameters to input |
party_vinfo | OtherInfo info parameters to input |
idx | lock index (0-based) in container |
- Returns
- error code or OK
Reimplemented in libcdoc::WinBackend.
◆ deriveECDH1()
virtual result_t libcdoc::CryptoBackend::deriveECDH1 |
( |
std::vector< uint8_t > & |
dst, |
|
|
const std::vector< uint8_t > & |
public_key, |
|
|
unsigned int |
idx |
|
) |
| |
|
inlinevirtual |
Derive shared secret.
Derive a shared secret from private key of given lock and public key using ECDH1 algorithm.
- Parameters
-
dst | the container for shared secret |
public_key | ECDH public key used to derive shared secret |
idx | lock index (0-based) in container |
- Returns
- error code or OK
Reimplemented in libcdoc::PKCS11Backend.
References libcdoc::NOT_IMPLEMENTED.
◆ deriveHMACExtract()
virtual result_t libcdoc::CryptoBackend::deriveHMACExtract |
( |
std::vector< uint8_t > & |
dst, |
|
|
const std::vector< uint8_t > & |
public_key, |
|
|
const std::vector< uint8_t > & |
salt, |
|
|
unsigned int |
idx |
|
) |
| |
|
virtual |
Get CDoc2 KEK pre-master from ECC key.
Calculates KEK (Key Encryption Key) pre-master from an ECC public key. The default implementation calls deriveECDH1 and performs local HMAC extract
- Parameters
-
dst | the container for derived key |
public_key | ECDH public Key used to derive shared secret |
salt | salt for key derivation |
idx | lock index (0-based) in container |
- Returns
- error code or OK
Reimplemented in libcdoc::WinBackend.
◆ extractHKDF()
virtual result_t libcdoc::CryptoBackend::extractHKDF |
( |
std::vector< uint8_t > & |
dst, |
|
|
const std::vector< uint8_t > & |
salt, |
|
|
const std::vector< uint8_t > & |
pw_salt, |
|
|
int32_t |
kdf_iter, |
|
|
unsigned int |
idx |
|
) |
| |
|
virtual |
Get CDoc2 KEK pre-master from symmetric key.
Calculates KEK (Key Encryption Key) pre-master from a symmetric key (either password or key-based). The default implementation calls getKeyMaterial and performs local HKDF extract.
- Parameters
-
dst | the destination container for KEK pre-master |
salt | the salt value for HKDF extract |
pw_salt | the salt value for PBKDF |
kdf_iter | the number of KDF iterations. If kdf_iter is 0, the key is plain symmetric key instead of password. |
idx | lock or recipient index (0-based) in container |
- Returns
- error code or OK
Reimplemented in libcdoc::PKCS11Backend.
◆ getKeyMaterial()
virtual result_t libcdoc::CryptoBackend::getKeyMaterial |
( |
std::vector< uint8_t > & |
dst, |
|
|
const std::vector< uint8_t > & |
pw_salt, |
|
|
int32_t |
kdf_iter, |
|
|
unsigned int |
idx |
|
) |
| |
|
virtual |
Get CDoc2 key material for HKDF expansion.
Fetches key material for a symmetric key (either password or key-based). The default implementation calls getSecret and performs PBKDF2_SHA256 if key is password-based.
- Parameters
-
dst | the destination container for key material |
pw_salt | the salt value for PBKDF |
kdf_iter | kdf_iter the number of KDF iterations. If kdf_iter is 0, the key is plain symmetric key instead of password. |
idx | lock or recipient index (0-based) in container |
- Returns
- error code or OK
◆ getLastErrorStr()
virtual std::string libcdoc::CryptoBackend::getLastErrorStr |
( |
result_t |
code | ) |
const |
|
virtual |
◆ getSecret()
virtual result_t libcdoc::CryptoBackend::getSecret |
( |
std::vector< uint8_t > & |
dst, |
|
|
unsigned int |
idx |
|
) |
| |
|
inlinevirtual |
Get secret value (either password or symmetric key) for a lock.
- Parameters
-
dst | the destination container for secret |
idx | lock or recipient index (0-based) in container |
- Returns
- error code or OK
References libcdoc::NOT_IMPLEMENTED.
◆ operator=()
◆ random()
virtual result_t libcdoc::CryptoBackend::random |
( |
std::vector< uint8_t > & |
dst, |
|
|
unsigned int |
size |
|
) |
| |
|
virtual |
Fill vector with random bytes.
Trim vector to requested size and fill it with random bytes. The default implementation uses OpenSSL randomness generator.
- Parameters
-
dst | the destination container for randomness |
size | the requested amount of random data |
- Returns
- error code or OK
◆ sign()
virtual result_t libcdoc::CryptoBackend::sign |
( |
std::vector< uint8_t > & |
dst, |
|
|
HashAlgorithm |
algorithm, |
|
|
const std::vector< uint8_t > & |
digest, |
|
|
unsigned int |
idx |
|
) |
| |
|
inlinevirtual |
sign Sign message with given algorithm
- Parameters
-
dst | the destination container for signed message |
algorithm | hashing algorithm |
digest | a message to sign |
idx | lock or recipient index (0-based) in container |
- Returns
- error code or OK
Reimplemented in libcdoc::WinBackend, and libcdoc::PKCS11Backend.
References libcdoc::NOT_IMPLEMENTED.
◆ test()
◆ ECC_KEY_LEN
constexpr int libcdoc::CryptoBackend::ECC_KEY_LEN = 32 |
|
staticconstexpr |
◆ INVALID_PARAMS
constexpr int libcdoc::CryptoBackend::INVALID_PARAMS = -201 |
|
staticconstexpr |
◆ OPENSSL_ERROR
constexpr int libcdoc::CryptoBackend::OPENSSL_ERROR = -202 |
|
staticconstexpr |
The documentation for this struct was generated from the following file: