mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-06-18 11:49:39 -04:00
OpenSSHKey: correctly parse aes-256-cbc/ctr keys (#1682)
AES-256 uses a 32-byte (256-bit) key size. This un-breaks the loader and tests added for AES-256-CBC and AES-256-CTR PEM keys. * OpenSSHKey: correctly parse encrypted PEM AES-256-CBC/AES-256-CTR keys * OpenSSHKey: use correct key derivation for AES-256
This commit is contained in:
parent
d1c5a1a5f8
commit
c21f4b5ec2
3 changed files with 152 additions and 42 deletions
|
@ -319,9 +319,9 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase)
|
||||||
|
|
||||||
if (m_cipherName.compare("aes-128-cbc", Qt::CaseInsensitive) == 0) {
|
if (m_cipherName.compare("aes-128-cbc", Qt::CaseInsensitive) == 0) {
|
||||||
cipher.reset(new SymmetricCipher(SymmetricCipher::Aes128, SymmetricCipher::Cbc, SymmetricCipher::Decrypt));
|
cipher.reset(new SymmetricCipher(SymmetricCipher::Aes128, SymmetricCipher::Cbc, SymmetricCipher::Decrypt));
|
||||||
} else if (m_cipherName == "aes256-cbc") {
|
} else if (m_cipherName == "aes256-cbc" || m_cipherName.compare("aes-256-cbc", Qt::CaseInsensitive) == 0) {
|
||||||
cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt));
|
cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt));
|
||||||
} else if (m_cipherName == "aes256-ctr") {
|
} else if (m_cipherName == "aes256-ctr" || m_cipherName.compare("aes-256-ctr", Qt::CaseInsensitive) == 0) {
|
||||||
cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Decrypt));
|
cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Decrypt));
|
||||||
} else if (m_cipherName != "none") {
|
} else if (m_cipherName != "none") {
|
||||||
m_error = tr("Unknown cipher: %1").arg(m_cipherName);
|
m_error = tr("Unknown cipher: %1").arg(m_cipherName);
|
||||||
|
@ -372,10 +372,22 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QCryptographicHash hash(QCryptographicHash::Md5);
|
QByteArray keyData;
|
||||||
hash.addData(passphrase.toUtf8());
|
QByteArray mdBuf;
|
||||||
hash.addData(m_cipherIV.data(), 8);
|
do {
|
||||||
QByteArray keyData = hash.result();
|
QCryptographicHash hash(QCryptographicHash::Md5);
|
||||||
|
hash.addData(mdBuf);
|
||||||
|
hash.addData(passphrase.toUtf8());
|
||||||
|
hash.addData(m_cipherIV.data(), 8);
|
||||||
|
mdBuf = hash.result();
|
||||||
|
keyData.append(mdBuf);
|
||||||
|
} while(keyData.size() < cipher->keySize());
|
||||||
|
|
||||||
|
if (keyData.size() > cipher->keySize()) {
|
||||||
|
// If our key size isn't a multiple of 16 (e.g. AES-192 or something),
|
||||||
|
// then we will need to truncate it.
|
||||||
|
keyData.resize(cipher->keySize());
|
||||||
|
}
|
||||||
|
|
||||||
if (!cipher->init(keyData, m_cipherIV)) {
|
if (!cipher->init(keyData, m_cipherIV)) {
|
||||||
m_error = cipher->errorString();
|
m_error = cipher->errorString();
|
||||||
|
|
|
@ -90,39 +90,39 @@ void TestOpenSSHKey::testParseDSA()
|
||||||
QCOMPARE(key.fingerprint(), QString("SHA256:tbbNuLN1hja8JNASDTlLOZQsbTlJDzJlz/oAGK3sX18"));
|
QCOMPARE(key.fingerprint(), QString("SHA256:tbbNuLN1hja8JNASDTlLOZQsbTlJDzJlz/oAGK3sX18"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestOpenSSHKey::testDecryptAES128CBC()
|
void TestOpenSSHKey::testDecryptRSAAES128CBC()
|
||||||
{
|
{
|
||||||
const QString keyString = QString(
|
const QString keyString = QString(
|
||||||
"-----BEGIN RSA PRIVATE KEY-----\n"
|
"-----BEGIN RSA PRIVATE KEY-----\n"
|
||||||
"Proc-Type: 4,ENCRYPTED\n"
|
"Proc-Type: 4,ENCRYPTED\n"
|
||||||
"DEK-Info: AES-128-CBC,804E4D214D1263FF94E3743FE799DBB4\n"
|
"DEK-Info: AES-128-CBC,804E4D214D1263FF94E3743FE799DBB4\n"
|
||||||
"\n"
|
"\n"
|
||||||
"lM9TDfOTbiRhaGGDh7Hn+rqw8CCWcYBZYu7smyYLdnWKXKPmbne8CQFZBAS1FJwZ\n"
|
"lM9TDfOTbiRhaGGDh7Hn+rqw8CCWcYBZYu7smyYLdnWKXKPmbne8CQFZBAS1FJwZ\n"
|
||||||
"6Mj6n075yFGyzN9/OfeqKiUA4adlbwLbGwB+yyKsC2FlsvRIEr4hup02WWM47vHj\n"
|
"6Mj6n075yFGyzN9/OfeqKiUA4adlbwLbGwB+yyKsC2FlsvRIEr4hup02WWM47vHj\n"
|
||||||
"DS4TRmNkE7MKFLhpNCyt5OGGM45s+/lwVTw51K0Hm99TBd72IrX4jfY9ZxAVbL3l\n"
|
"DS4TRmNkE7MKFLhpNCyt5OGGM45s+/lwVTw51K0Hm99TBd72IrX4jfY9ZxAVbL3l\n"
|
||||||
"aTohL8x6oOTe7q318QgJoFi+DjJhDWLGLLJ7fBqD2imz2fmrY4j8Jpw2sDe1rj82\n"
|
"aTohL8x6oOTe7q318QgJoFi+DjJhDWLGLLJ7fBqD2imz2fmrY4j8Jpw2sDe1rj82\n"
|
||||||
"gMqqNG3FrfN0S4uYlWYH5pAh+BUcB1UdmTU/rV5wJMK1oUytmZv/J2+X/0k3Y93F\n"
|
"gMqqNG3FrfN0S4uYlWYH5pAh+BUcB1UdmTU/rV5wJMK1oUytmZv/J2+X/0k3Y93F\n"
|
||||||
"aw6JWOy28OizW+TQXvv8gREWsp5PEclqUZhhGQbVbCQCiDOxg+xiXNySdRH1IqjR\n"
|
"aw6JWOy28OizW+TQXvv8gREWsp5PEclqUZhhGQbVbCQCiDOxg+xiXNySdRH1IqjR\n"
|
||||||
"zQiKgD4SPzkxQekExPaIQT/KutWZdMNYybEqooCx8YyeDoN31z7Wa2rv6OulOn/j\n"
|
"zQiKgD4SPzkxQekExPaIQT/KutWZdMNYybEqooCx8YyeDoN31z7Wa2rv6OulOn/j\n"
|
||||||
"wJFvyd2PT/6brHKI4ky8RYroDf4FbVYKfyEW5CSAg2OyL/tY/kSPgy/k0WT7fDwq\n"
|
"wJFvyd2PT/6brHKI4ky8RYroDf4FbVYKfyEW5CSAg2OyL/tY/kSPgy/k0WT7fDwq\n"
|
||||||
"dPSuYM9yeWNL6kAhDqDOv8+s3xvOVEljktBvQvItQwVLmHszC3E2AcnaxzdblKPu\n"
|
"dPSuYM9yeWNL6kAhDqDOv8+s3xvOVEljktBvQvItQwVLmHszC3E2AcnaxzdblKPu\n"
|
||||||
"e3+mBT80NXHjERK2ht+/9JYseK1ujNbNAaG8SbKfU3FF0VlyJ0QW6TuIEdpNnymT\n"
|
"e3+mBT80NXHjERK2ht+/9JYseK1ujNbNAaG8SbKfU3FF0VlyJ0QW6TuIEdpNnymT\n"
|
||||||
"0fm0cDfKNaoeJIFnBRZhgIOJAic9DM0cTe/vSG69DaUYsaQPp36al7Fbux3GpFHS\n"
|
"0fm0cDfKNaoeJIFnBRZhgIOJAic9DM0cTe/vSG69DaUYsaQPp36al7Fbux3GpFHS\n"
|
||||||
"OtJEySYGro/6zvJ9dDIEfIGZjA3RaMt6+DuyJZXQdT2RNXa9j60xW7dXh0En4n82\n"
|
"OtJEySYGro/6zvJ9dDIEfIGZjA3RaMt6+DuyJZXQdT2RNXa9j60xW7dXh0En4n82\n"
|
||||||
"JUKTxYhDPLS5c8BzpJqoopxpKwElmrJ7Y3xpd6z2vIlD8ftuZrkk6siTMNQ2s7MI\n"
|
"JUKTxYhDPLS5c8BzpJqoopxpKwElmrJ7Y3xpd6z2vIlD8ftuZrkk6siTMNQ2s7MI\n"
|
||||||
"Xl332O+0H4k7uSfczHPOOw36TFhNjGQAP0b7O+0/RVG0ttOIoAn7ZkX3nfdbtG5B\n"
|
"Xl332O+0H4k7uSfczHPOOw36TFhNjGQAP0b7O+0/RVG0ttOIoAn7ZkX3nfdbtG5B\n"
|
||||||
"DWKvDaopvrcC2/scQ5uLUnqnBiGw1XiYpdg5ang7knHNzHZAIekVaYYZigpCAKp+\n"
|
"DWKvDaopvrcC2/scQ5uLUnqnBiGw1XiYpdg5ang7knHNzHZAIekVaYYZigpCAKp+\n"
|
||||||
"OtoaDeUEzqFhYVmF8ad1fgvC9ZUsuxS4XUHCKl0H6CJcvW9MJPVbveqYoK+j9qKd\n"
|
"OtoaDeUEzqFhYVmF8ad1fgvC9ZUsuxS4XUHCKl0H6CJcvW9MJPVbveqYoK+j9qKd\n"
|
||||||
"iMIkQBP1kE2rzGZVGUkZTpM9LVD9nP0nsbr6E8BatFcNgRirsg2BTJglNpXlCmY6\n"
|
"iMIkQBP1kE2rzGZVGUkZTpM9LVD9nP0nsbr6E8BatFcNgRirsg2BTJglNpXlCmY6\n"
|
||||||
"ldzJ/ELBbzoXIn+0wTGai0o4eBPx55baef69JfPuZqEB9pLNE+mHstrqIwcfqYu4\n"
|
"ldzJ/ELBbzoXIn+0wTGai0o4eBPx55baef69JfPuZqEB9pLNE+mHstrqIwcfqYu4\n"
|
||||||
"M+Vzun1QshRMj9a1PVkIHfs1fLeebI4QCHO0vJlc9K4iYPM4rsDNO3YaAgGRuARS\n"
|
"M+Vzun1QshRMj9a1PVkIHfs1fLeebI4QCHO0vJlc9K4iYPM4rsDNO3YaAgGRuARS\n"
|
||||||
"f3McGiGFxkv5zxe8i05ZBnn+exE77jpRKxd223jAMe2wu4WiFB7ZVo4Db6b5Oo2T\n"
|
"f3McGiGFxkv5zxe8i05ZBnn+exE77jpRKxd223jAMe2wu4WiFB7ZVo4Db6b5Oo2T\n"
|
||||||
"TPh3VuY7TNMEKkcUi+mGLKjroocQ5j8WQYlfnyOaTalUVQDzOTNb67QIIoiszR0U\n"
|
"TPh3VuY7TNMEKkcUi+mGLKjroocQ5j8WQYlfnyOaTalUVQDzOTNb67QIIoiszR0U\n"
|
||||||
"+AXGyxHj0QtotZFoPME+AbS9Zqy3SgSOuIzPBPU5zS4uoKNdD5NPE5YAuafCjsDy\n"
|
"+AXGyxHj0QtotZFoPME+AbS9Zqy3SgSOuIzPBPU5zS4uoKNdD5NPE5YAuafCjsDy\n"
|
||||||
"MT4DVy+cPOQYUK022S7T2nsA1btmvUvD5LL2Mc8VuKsWOn/7FKZua6OCfipt6oX0\n"
|
"MT4DVy+cPOQYUK022S7T2nsA1btmvUvD5LL2Mc8VuKsWOn/7FKZua6OCfipt6oX0\n"
|
||||||
"1tzYrw0/ALK+CIdVdYIiPPfxGZkr+JSLOOg7u50tpmen9GzxgNTv63miygwUAIDF\n"
|
"1tzYrw0/ALK+CIdVdYIiPPfxGZkr+JSLOOg7u50tpmen9GzxgNTv63miygwUAIDF\n"
|
||||||
"u0GbQwOueoA453/N75FcXOgrbqTdivyadUbRP+l7YJk/SfIytyJMOigejp+Z1lzF\n"
|
"u0GbQwOueoA453/N75FcXOgrbqTdivyadUbRP+l7YJk/SfIytyJMOigejp+Z1lzF\n"
|
||||||
"-----END RSA PRIVATE KEY-----\n"
|
"-----END RSA PRIVATE KEY-----\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
const QByteArray keyData = keyString.toLatin1();
|
const QByteArray keyData = keyString.toLatin1();
|
||||||
|
@ -181,7 +181,7 @@ void TestOpenSSHKey::testParseRSA()
|
||||||
QCOMPARE(key.fingerprint(), QString("SHA256:DYdaZciYNxCejr+/8x+OKYxeTU1D5UsuIFUG4PWRFkk"));
|
QCOMPARE(key.fingerprint(), QString("SHA256:DYdaZciYNxCejr+/8x+OKYxeTU1D5UsuIFUG4PWRFkk"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestOpenSSHKey::testDecryptAES256CBC()
|
void TestOpenSSHKey::testDecryptOpenSSHAES256CBC()
|
||||||
{
|
{
|
||||||
const QString keyString = QString(
|
const QString keyString = QString(
|
||||||
"-----BEGIN OPENSSH PRIVATE KEY-----\n"
|
"-----BEGIN OPENSSH PRIVATE KEY-----\n"
|
||||||
|
@ -215,7 +215,55 @@ void TestOpenSSHKey::testDecryptAES256CBC()
|
||||||
QVERIFY(privateKey.length() == 158);
|
QVERIFY(privateKey.length() == 158);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestOpenSSHKey::testDecryptAES256CTR()
|
void TestOpenSSHKey::testDecryptRSAAES256CBC()
|
||||||
|
{
|
||||||
|
const QString keyString = QString(
|
||||||
|
"-----BEGIN RSA PRIVATE KEY-----\n"
|
||||||
|
"Proc-Type: 4,ENCRYPTED\n"
|
||||||
|
"DEK-Info: AES-256-CBC,D51E3F558B621BD9384627762CBD16AC\n"
|
||||||
|
"\n"
|
||||||
|
"b6nr/06Gj8/Nw3ZFMePFyZeuBodExvZZtZPSH3t/2ArcxXOkoqUhLmlcY/JrvnBF\n"
|
||||||
|
"JHc34wx/6Yng7mqtUMuk2iMemTzOj3JRx8zHUhwPLnjM/tmeOm0wBUb3WB4+rFZW\n"
|
||||||
|
"s1PaIgeKywKgFK0UkcSRpMuSaxheWmHrtJkBsHTF7Tg3ogPL8Dc+nhQlbe/ZGaQb\n"
|
||||||
|
"vMdSYcBMaXngS5ZiOafXeY8+l+IMMOZwy5vPTFQGqKHIzOxFhShs1hSExnwOXy69\n"
|
||||||
|
"wxrA/QftjNEy5ixIeGT7iQfRB04tEVg0DjYphTPmI2ophzFlwJVBjhj2cmmnsMZg\n"
|
||||||
|
"a2TdT/78KZsw2cA5ieMcU6d7Yz5p5nu5dyTbZonn6qWficdZRJwZnVb5ikPnJYbZ\n"
|
||||||
|
"1YJRHHND+RWtpanxz7WhStscTCLeI9w9j2gqBJSjKDPgJaoMiA+tyEoakNlPYg+9\n"
|
||||||
|
"DadJkBGP0g5E9zw0n4niqQ7eCxk7qolmW6Wtn2zL4UyeJKGi9NWFSGW9x/PmAIse\n"
|
||||||
|
"E2KVodiJMRNa8/qUZcW58ZG2uRnFTsW4BXdmzOy/Zp53TVGWStBVLDcldSD03ItD\n"
|
||||||
|
"JIWQWDgWp5xyVqPl+8mkW7xDY0GRVSJCyRkctQeGTGysy0BcNjgQQtiA3lPC0rY5\n"
|
||||||
|
"m2VxrCYU1KuyHsAjs/V8THcW4a1UdPcVBg1QbCh29bMoM6u4MuXVt7rkwxAV9HJa\n"
|
||||||
|
"VbwPsKy7V6G60KaAFIiOs0wdOzBZBoPGd9vBQOEzATh2FYJruDo2OfzEnhv25RxE\n"
|
||||||
|
"1q+C/Jds9cWqaNY8kNtUG799XIKkjrC6KvnoV6UA4BkGs2DAcO9rnwtl/hToEoBe\n"
|
||||||
|
"ZVj72dlTuS6l9rHqKaz2GI0k0SEt/ZoakPHeDRgPNcDvEZWitV8MuD6Mwb47Y88u\n"
|
||||||
|
"sjBmS5k4sJOtB4bLg/UShcqYfkv2OTsK90qGQtba9vMk04Xh1FuxB4fHa5VoKrsX\n"
|
||||||
|
"Th/LB34xoYugd16NPmLuawhSo70o4bT70GYpxnb4brGfjWiuthRdegAG9ESSX+M6\n"
|
||||||
|
"rNKQPnn2GSroIpkoA4k0PaflcE5tpzeIiJdv0h65N3vw6MFnCaWy8sRSy9fMyRim\n"
|
||||||
|
"U8QZB2jcp+YjUU/eny3scuh0Vqt6g1tfFbI84pCC5bArBirf63MeMtwDU/IVImax\n"
|
||||||
|
"xzKOzl7k8ropA+rhAJ4Z9X35EmUncBXhf8g39w6nFuSlqjE6rMxCrsrehljQ1Iuz\n"
|
||||||
|
"bujaJ2PKpf98OejHDKnMDOfBBq0DdeERCYWlCcqWSgrEgHh4vB5dEQAPP5bAkdZj\n"
|
||||||
|
"m0Dq+gF99yadioxf3/MUZVTa1dHklBJJkXTYVPeyH07Th5j7bGCcVb9Zd2Ao/Dia\n"
|
||||||
|
"MPWf6xViCC6d0njCLQY2R8mOR5OMVsdlFrsKZMQ/lqjS/WSM6URDkuGb0Cq94TQd\n"
|
||||||
|
"7DoblcA50FTwYrVXMygWygbjzJxhcoJDHztzwoqLT/ghh+6zRg6R/fY222tHHbhz\n"
|
||||||
|
"nePf421NILzfxnuW+GOwRCM5+IHE3OBS/PYDGijjRFHU4ky0rRRDE64m9CeFzeBh\n"
|
||||||
|
"CnFvW6Yx3Hrh5tXBP7kRZ6KjyrPP7tI4ciVSJceSBLRzFmoBr10kRMm+VsUh2xZH\n"
|
||||||
|
"-----END RSA PRIVATE KEY-----\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
const QByteArray keyData = keyString.toLatin1();
|
||||||
|
|
||||||
|
OpenSSHKey key;
|
||||||
|
QVERIFY(key.parse(keyData));
|
||||||
|
QVERIFY(key.encrypted());
|
||||||
|
QCOMPARE(key.cipherName(), QString("AES-256-CBC"));
|
||||||
|
QVERIFY(!key.openPrivateKey("incorrectpassphrase"));
|
||||||
|
QVERIFY(key.openPrivateKey("correctpassphrase"));
|
||||||
|
QCOMPARE(key.type(), QString("ssh-rsa"));
|
||||||
|
QCOMPARE(key.comment(), QString(""));
|
||||||
|
QCOMPARE(key.fingerprint(), QString("SHA256:1Hsebt2WWnmc72FERsUOgvaajIGHkrMONxXylcmk87U"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestOpenSSHKey::testDecryptOpenSSHAES256CTR()
|
||||||
{
|
{
|
||||||
const QString keyString = QString(
|
const QString keyString = QString(
|
||||||
"-----BEGIN OPENSSH PRIVATE KEY-----\n"
|
"-----BEGIN OPENSSH PRIVATE KEY-----\n"
|
||||||
|
@ -248,3 +296,51 @@ void TestOpenSSHKey::testDecryptAES256CTR()
|
||||||
QVERIFY(publicKey.length() == 51);
|
QVERIFY(publicKey.length() == 51);
|
||||||
QVERIFY(privateKey.length() == 158);
|
QVERIFY(privateKey.length() == 158);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestOpenSSHKey::testDecryptRSAAES256CTR()
|
||||||
|
{
|
||||||
|
const QString keyString = QString(
|
||||||
|
"-----BEGIN RSA PRIVATE KEY-----\n"
|
||||||
|
"Proc-Type: 4,ENCRYPTED\n"
|
||||||
|
"DEK-Info: AES-256-CTR,192421854316290DFA8F469A1E8CB9BB\n"
|
||||||
|
"\n"
|
||||||
|
"3h7gUWua+jcvhYj1vUusbMdOG9j8SmNWFV5Hfersi8nF4ddsWEQDnMrRuhtIn4tU\n"
|
||||||
|
"GcLY+SXguim5XXwF8gG1tmvpvFMhudTfX+0cIAX7eAVmqLy2RTA18DWqDwWokVP0\n"
|
||||||
|
"RJPgRJJSorjMtu2F0YGVVjElW7pHIal7luNk3BDgYUMlgSg0BGOWb+9BkXcEnfc8\n"
|
||||||
|
"KEwsJw2onoR2eXo6rYnczGaqPhAPu+I+PfUn0J8PFiffWc1KebRntLdRWeNsBS4p\n"
|
||||||
|
"oxtqByzMYIu/WPSJJ5iFoNdKaWQPiZJB+juwI1wNLEtpzKkhpc7/6mOy87h+0eGV\n"
|
||||||
|
"fF7javrbHv37eE+k2iZXrcLfvRpiBqt5+uhhCaM8TivBeUho5J38ru/wt/dk+OvY\n"
|
||||||
|
"tzXboWA4zVnaYmqta1CkXYKOmb5a8TWEwtxmAuE6kCz/n3pPa6gwkwsyGI65IEyX\n"
|
||||||
|
"ycJsbwUilAzXTcz5bIruGx38Sa9fndAN9llOQMS/hdyNs5W5dO1XZ5gU+ARPce+j\n"
|
||||||
|
"+A2R8oCUv+2ciEu8z3F++U9aTRmTlD3xeIM0IWUFXKt8Y9fSRC5XoPCbZYNxnV6/\n"
|
||||||
|
"hn9NPKCb890Faxies3MABOB5IZ0aTPWkx9ntxFhMaXyfkX2YthNO0GzAENPP9Knt\n"
|
||||||
|
"DYhQePlKQ7sNi8+wzsHNeDxNuL/+Rib2MN3ankDtHIsqFz/Em+rD0+3ya8bLy3pP\n"
|
||||||
|
"eeUiNpezL+uxI5llq/pikzK4sOgvH1r5YEkMxt9I09grkBwxR7DMBo0vgRE2MLiL\n"
|
||||||
|
"nlri8TDwArC1+0gE8NspkkClsBOHXuVlGZo5lup2tn5MzERQcLvuFnAby/GnaVXQ\n"
|
||||||
|
"Hm76teb1wMdL58FrdZsKR6e80E+F6JpTsz0a3XJqptgAwGsoxqizkUNJG5hRP8bi\n"
|
||||||
|
"NBCFQZPeYi/GxgN5O2UkxhgRkKAcrHg+G87nhLk1ipsc214rb6iOspNizP6fGDuv\n"
|
||||||
|
"/bsNTpYRgMNxCLh5Nv0HSUqckoNKOcIVe/9nF5/LLFGfhz95agjKTbBygThFK28N\n"
|
||||||
|
"bnHq5fO9yKCMrGCRBQ6No1wwexyS4IAq17LcQP3k4w4n+Wt2GjO5HIldGOEyGqCE\n"
|
||||||
|
"zeHYrPpGXF/yf3XTm00XghdQtVtRJptdddXVGZN3EN2w7/ghOSIIlsJO9C4IRgU3\n"
|
||||||
|
"WkhX7oOpSE4wmXd5Ada+D1U46snW5nWANWko2NmQNVDeJcvuymL6t2ccNYeFWiA+\n"
|
||||||
|
"Hlv0avBnqng7ZWPxYacqZI3+vU0rN9usN1pzwY/4NsBa34o3M7u6KvzEkyewbyUT\n"
|
||||||
|
"VfXLJ8XRzb2u4NqQv0WiTBIRxvVB1sRPcrwB4HWKHwRFT8T7f1fefteROrKV7aKm\n"
|
||||||
|
"Q48pckidDM0ORh1yIET8u24Mreo5eeWXjVJ9MHoM0486VySYxMwk8yp4tnaHx5kd\n"
|
||||||
|
"fGlBbbwFOifhzjAk0u3KJRAG85t2GZhfTMo1IHS2kdu4Xs1N00ZmK0hjeGG+DCwy\n"
|
||||||
|
"06ZKHOF5BHWU3SpQEjCsPDwfIpOINWGAJJnp6NIVf7FkHwViV50GWWGSZal4NqZy\n"
|
||||||
|
"kR19buHiOb7KnGoPCw8MUmIym8v30FePhM4YQ7ASmRtsXlAhQNRX\n"
|
||||||
|
"-----END RSA PRIVATE KEY-----\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
const QByteArray keyData = keyString.toLatin1();
|
||||||
|
|
||||||
|
OpenSSHKey key;
|
||||||
|
QVERIFY(key.parse(keyData));
|
||||||
|
QVERIFY(key.encrypted());
|
||||||
|
QCOMPARE(key.cipherName(), QString("AES-256-CTR"));
|
||||||
|
QVERIFY(!key.openPrivateKey("incorrectpassphrase"));
|
||||||
|
QVERIFY(key.openPrivateKey("correctpassphrase"));
|
||||||
|
QCOMPARE(key.type(), QString("ssh-rsa"));
|
||||||
|
QCOMPARE(key.comment(), QString(""));
|
||||||
|
QCOMPARE(key.fingerprint(), QString("SHA256:1Hsebt2WWnmc72FERsUOgvaajIGHkrMONxXylcmk87U"));
|
||||||
|
}
|
||||||
|
|
|
@ -31,9 +31,11 @@ private slots:
|
||||||
void testParse();
|
void testParse();
|
||||||
void testParseDSA();
|
void testParseDSA();
|
||||||
void testParseRSA();
|
void testParseRSA();
|
||||||
void testDecryptAES128CBC();
|
void testDecryptRSAAES128CBC();
|
||||||
void testDecryptAES256CBC();
|
void testDecryptOpenSSHAES256CBC();
|
||||||
void testDecryptAES256CTR();
|
void testDecryptRSAAES256CBC();
|
||||||
|
void testDecryptOpenSSHAES256CTR();
|
||||||
|
void testDecryptRSAAES256CTR();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TESTOPENSSHKEY_H
|
#endif // TESTOPENSSHKEY_H
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue