AusweisApp2
EcdsaPublicKey.h
gehe zur Dokumentation dieser Datei
1 
5 #pragma once
6 
7 #include "ASN1TemplateUtil.h"
8 #include "SecurityProtocol.h"
9 
10 #include <QByteArray>
11 #include <QSharedPointer>
12 
13 #include <openssl/asn1t.h>
14 #include <openssl/evp.h>
15 
16 #if OPENSSL_VERSION_NUMBER < 0x30000000L
17  #include <openssl/ec.h>
18 #endif
19 
20 
21 namespace governikus
22 {
23 
44 using EcdsaPublicKey = struct ecdsapublickey_st
45 {
46  ASN1_OBJECT* mObjectIdentifier;
47  ASN1_OCTET_STRING* mPrimeModulus;
48  ASN1_OCTET_STRING* mFirstCoefficient;
49  ASN1_OCTET_STRING* mSecondCoefficient;
50  ASN1_OCTET_STRING* mBasePoint;
51  ASN1_OCTET_STRING* mOrderOfTheBasePoint;
52  ASN1_OCTET_STRING* mPublicPoint;
53  ASN1_OCTET_STRING* mCofactor;
54 
55  static QSharedPointer<ecdsapublickey_st> fromHex(const QByteArray& pHexValue);
56  static QSharedPointer<ecdsapublickey_st> decode(const QByteArray& pBytes);
57  QByteArray encode();
58 
59  [[nodiscard]] bool isComplete() const;
60  [[nodiscard]] SecurityProtocol getSecurityProtocol() const;
61 
65  [[nodiscard]] Oid getOid() const;
66  [[nodiscard]] QByteArray getUncompressedPublicPoint() const;
67 
74  [[nodiscard]] QSharedPointer<EVP_PKEY> createKey(const QByteArray& pPublicPoint) const;
75 
76 #ifndef QT_NO_DEBUG
77 
83  [[nodiscard]] QSharedPointer<EVP_PKEY> createKey() const;
84 #endif
85 
86  private:
87  struct CurveData
88  {
89  QSharedPointer<BIGNUM> p;
90  QSharedPointer<BIGNUM> a;
91  QSharedPointer<BIGNUM> b;
92  QSharedPointer<BIGNUM> order;
93  QSharedPointer<BIGNUM> cofactor;
94 
95  [[nodiscard]] bool isValid() const
96  {
97  return !p.isNull() && !a.isNull() && !b.isNull() && !order.isNull();
98  }
99 
100 
101  };
102 
103  [[nodiscard]] static bool isAllValid(const ecdsapublickey_st* pKey);
104  [[nodiscard]] static bool isAllInvalid(const ecdsapublickey_st* pKey);
105 
106  [[nodiscard]] CurveData createCurveData() const;
107  [[nodiscard]] QSharedPointer<EVP_PKEY> createKey(const uchar* pPublicPoint, int pPublicPointLength) const;
108 #if OPENSSL_VERSION_NUMBER < 0x30000000L
109  [[nodiscard]] QSharedPointer<EC_GROUP> createGroup(const CurveData& pData) const;
110 #endif
111 
112  public:
113  static int decodeCallback(int pOperation, ASN1_VALUE** pVal, const ASN1_ITEM* pIt, void* pExarg);
114 };
115 
116 
117 DECLARE_ASN1_FUNCTIONS(EcdsaPublicKey)
119 
120 } // namespace governikus
#define DECLARE_ASN1_OBJECT(name)
Definition: ASN1TemplateUtil.h:176
Implementation of GeneralAuthenticate response APDUs.
Definition: CommandApdu.h:16
ASN1_OCTET_STRING * mPrimeModulus
Definition: EcdsaPublicKey.h:47
ASN1_OCTET_STRING * mSecondCoefficient
Definition: EcdsaPublicKey.h:49
ASN1_OCTET_STRING * mBasePoint
Definition: EcdsaPublicKey.h:50
Oid getOid() const
QSharedPointer< EVP_PKEY > createKey(const QByteArray &pPublicPoint) const
ASN1_OCTET_STRING * mCofactor
Definition: EcdsaPublicKey.h:53
bool isComplete() const
Definition: EcdsaPublicKey.cpp:97
SecurityProtocol getSecurityProtocol() const
Definition: EcdsaPublicKey.cpp:121
ASN1_OCTET_STRING * mOrderOfTheBasePoint
Definition: EcdsaPublicKey.h:51
ASN1_OCTET_STRING * mFirstCoefficient
Definition: EcdsaPublicKey.h:48
QByteArray encode() const
ASN1_OCTET_STRING * mPublicPoint
Definition: EcdsaPublicKey.h:52
struct ecdsapublickey_st { ASN1_OBJECT *mObjectIdentifier EcdsaPublicKey
According to TR-03110-3 chapter D elliptic curve public keys are defined as follows:
Definition: EcdsaPublicKey.h:46
QByteArray getUncompressedPublicPoint() const
Definition: EcdsaPublicKey.cpp:133