@@ -94,14 +94,32 @@ CDocSupport::getCDocFileList(QString filename)
9494 return files;
9595}
9696
97+ static libcdoc::result_t
98+ getDecryptStatus (const std::vector<uint8_t >& result, QCryptoBackend::PinStatus pin_status)
99+ {
100+ switch (pin_status) {
101+ case QCryptoBackend::PinOK:
102+ return (result.empty ()) ? DDCryptoBackend::BACKEND_ERROR : libcdoc::OK;
103+ case QCryptoBackend::PinCanceled:
104+ return DDCryptoBackend::PIN_CANCELED;
105+ case QCryptoBackend::PinIncorrect:
106+ return DDCryptoBackend::PIN_INCORRECT;
107+ case QCryptoBackend::PinLocked:
108+ return DDCryptoBackend::PIN_LOCKED;
109+ default :
110+ return DDCryptoBackend::BACKEND_ERROR;
111+ }
112+ }
113+
97114libcdoc::result_t
98115DDCryptoBackend::decryptRSA (std::vector<uint8_t >& result, const std::vector<uint8_t > &data, bool oaep, unsigned int idx)
99116{
117+ QCryptoBackend::PinStatus pin_status;
100118 QByteArray qkek = qApp->signer ()->decrypt ([qdata = toByteArray (data), &oaep](QCryptoBackend *backend) {
101119 return backend->decrypt (qdata, oaep);
102- });
120+ }, pin_status );
103121 result.assign (qkek.cbegin (), qkek.cend ());
104- return (result. empty ()) ? BACKEND_ERROR : libcdoc::OK ;
122+ return getDecryptStatus (result, pin_status) ;
105123}
106124
107125constexpr std::string_view SHA256_MTH {" http://www.w3.org/2001/04/xmlenc#sha256" };
@@ -115,22 +133,24 @@ libcdoc::result_t
115133DDCryptoBackend::deriveConcatKDF (std::vector<uint8_t >& dst, const std::vector<uint8_t > &publicKey, const std::string &digest,
116134 const std::vector<uint8_t > &algorithmID, const std::vector<uint8_t > &partyUInfo, const std::vector<uint8_t > &partyVInfo, unsigned int idx)
117135{
136+ QCryptoBackend::PinStatus pin_status;
118137 QByteArray decryptedKey = qApp->signer ()->decrypt ([&publicKey, &digest, &algorithmID, &partyUInfo, &partyVInfo](QCryptoBackend *backend) {
119138 return backend->deriveConcatKDF (toByteArray (publicKey), SHA_MTH[digest],
120139 toByteArray (algorithmID), toByteArray (partyUInfo), toByteArray (partyVInfo));
121- });
140+ }, pin_status );
122141 dst.assign (decryptedKey.cbegin (), decryptedKey.cend ());
123- return (dst. empty ()) ? BACKEND_ERROR : libcdoc::OK ;
142+ return getDecryptStatus (dst, pin_status) ;
124143}
125144
126145libcdoc::result_t
127146DDCryptoBackend::deriveHMACExtract (std::vector<uint8_t >& dst, const std::vector<uint8_t > &key_material, const std::vector<uint8_t > &salt, unsigned int idx)
128147{
148+ QCryptoBackend::PinStatus pin_status;
129149 QByteArray qkekpm = qApp->signer ()->decrypt ([qkey_material = toByteArray (key_material), qsalt = toByteArray (salt)](QCryptoBackend *backend) {
130150 return backend->deriveHMACExtract (qkey_material, qsalt, ECC_KEY_LEN);
131- });
151+ }, pin_status );
132152 dst = std::vector<uint8_t >(qkekpm.cbegin (), qkekpm.cend ());
133- return (dst. empty ()) ? BACKEND_ERROR : libcdoc::OK ;
153+ return getDecryptStatus (dst, pin_status) ;
134154}
135155
136156libcdoc::result_t
@@ -143,8 +163,15 @@ DDCryptoBackend::getSecret(std::vector<uint8_t>& _secret, unsigned int idx)
143163std::string
144164DDCryptoBackend::getLastErrorStr (libcdoc::result_t code) const
145165{
146- if (code == BACKEND_ERROR) {
147- return qApp->signer ()->getLastErrorStr ().toStdString ();
166+ switch (code) {
167+ case PIN_CANCELED:
168+ return " PIN entry canceled" ;
169+ case PIN_INCORRECT:
170+ return " PIN incorrect" ;
171+ case PIN_LOCKED:
172+ return " PIN locked" ;
173+ case BACKEND_ERROR:
174+ return qApp->signer ()->getLastErrorStr ().toStdString ();
148175 }
149176 return libcdoc::CryptoBackend::getLastErrorStr (code);
150177}
0 commit comments