31 QList<QAsn1Element> items;
32 items << QAsn1Element::fromObjectId(
"1.2.840.113549.1.7.1");
33 items << wrap(QAsn1Element::Context0Type,
34 QAsn1Element(QAsn1Element::OctetStringType, data));
35 return QAsn1Element::fromVector(items);
51 QByteArray passUnicode(passPhrase.size() * 2 + 2,
'\0');
52 char *p = passUnicode.data();
53 for (
int i = 0; i < passPhrase.size(); ++i) {
54 quint16 ch = passPhrase[i].unicode();
55 *(p++) = (ch & 0xff00) >> 8;
62 const int sSize = v * ((salt.size() + v - 1) / v);
64 for (
int i = 0; i < sSize; ++i)
65 S[i] = salt[i % salt.size()];
66 const int pSize = v * ((passUnicode.size() + v - 1) / v);
68 for (
int i = 0; i < pSize; ++i)
69 P[i] = passUnicode[i % passUnicode.size()];
73 const int c = (n + u - 1) / u;
77 for (
int i = 0; i < c; ++i) {
79 QByteArray Ai = D + I;
80 for (
int j = 0; j < r; ++j)
81 Ai = QCryptographicHash::hash(Ai, QCryptographicHash::Sha1);
83 for (
int j = 0; j < v; ++j)
87 for (
int p = 0; p < I.size(); p += v) {
89 for (
int j = v - 1; j >= 0; --j) {
90 quint16 v = quint8(I[p + j]) + quint8(B[j]) + carry;
92 carry = (v & 0xff00) >> 8;
111 QList<QAsn1Element> items;
112 items << QAsn1Element::fromObjectId(
"1.2.840.113549.1.12.10.1.3");
115 QList<QAsn1Element> certItems;
116 certItems << QAsn1Element::fromObjectId(
"1.2.840.113549.1.9.22.1");
117 certItems << wrap(QAsn1Element::Context0Type,
118 QAsn1Element(QAsn1Element::OctetStringType, cert.toDer()));
119 items << wrap(QAsn1Element::Context0Type,
120 QAsn1Element::fromVector(certItems));
123 const QByteArray localKeyId = cert.digest(QCryptographicHash::Sha1);
124 QList<QAsn1Element> idItems;
125 idItems << QAsn1Element::fromObjectId(
"1.2.840.113549.1.9.21");
126 idItems << wrap(QAsn1Element::SetType,
127 QAsn1Element(QAsn1Element::OctetStringType, localKeyId));
128 items << wrap(QAsn1Element::SetType, QAsn1Element::fromVector(idItems));
131 QAsn1Element root = wrap(QAsn1Element::SequenceType, QAsn1Element::fromVector(items));
133 QDataStream stream(&ba, QIODevice::WriteOnly);
140 Q_ASSERT(key.algorithm() == QSsl::Rsa || key.algorithm() == QSsl::Dsa);
142 QList<QAsn1Element> keyItems;
144 QList<QAsn1Element> algoItems;
145 if (key.algorithm() == QSsl::Rsa)
147 else if (key.algorithm() == QSsl::Dsa)
150 keyItems << QAsn1Element::fromVector(algoItems);
152 return QAsn1Element::fromVector(keyItems);
157 const int iterations = 2048;
158 QByteArray salt = _q_PKCS12_salt();
159 QByteArray cKey = _q_PKCS12_keygen(1, salt, passPhrase, 24, iterations);
160 QByteArray cIv = _q_PKCS12_keygen(2, salt, passPhrase, 8, iterations);
164 QDataStream plainStream(&plain, QIODevice::WriteOnly);
165 _q_PKCS12_key(key).write(plainStream);
166 QByteArray crypted = QSslKeyPrivate::encrypt(QTlsPrivate::Cipher::DesEde3Cbc,
169 QList<QAsn1Element> items;
170 items << QAsn1Element::fromObjectId(
"1.2.840.113549.1.12.10.1.2");
173 QList<QAsn1Element> keyItems;
174 QList<QAsn1Element> algoItems;
175 algoItems << QAsn1Element::fromObjectId(
"1.2.840.113549.1.12.1.3");
176 QList<QAsn1Element> paramItems;
179 algoItems << QAsn1Element::fromVector(paramItems);
180 keyItems << QAsn1Element::fromVector(algoItems);
182 items << wrap(QAsn1Element::Context0Type,
183 QAsn1Element::fromVector(keyItems));
186 QList<QAsn1Element> idItems;
187 idItems << QAsn1Element::fromObjectId(
"1.2.840.113549.1.9.21");
188 idItems << wrap(QAsn1Element::SetType,
189 QAsn1Element(QAsn1Element::OctetStringType, localKeyId));
190 items << wrap(QAsn1Element::SetType,
191 QAsn1Element::fromVector(idItems));
194 QAsn1Element root = wrap(QAsn1Element::SequenceType, QAsn1Element::fromVector(items));
196 QDataStream stream(&ba, QIODevice::WriteOnly);
203 QList<QAsn1Element> items;
206 for (
int i = 0; i < certs.size(); ++i)
207 items << _q_PKCS7_data(_q_PKCS12_certBag(certs[i]));
211 const QByteArray localKeyId = certs.first().digest(QCryptographicHash::Sha1);
212 items << _q_PKCS7_data(_q_PKCS12_shroudedKeyBag(key, passPhrase, localKeyId));
218 QDataStream stream(&ba, QIODevice::WriteOnly);
225 const int iterations = 2048;
228 QByteArray macSalt = _q_PKCS12_salt();
229 QByteArray key = _q_PKCS12_keygen(3, macSalt, passPhrase, 20, iterations);
232 QMessageAuthenticationCode hmac(QCryptographicHash::Sha1, key);
235 QList<QAsn1Element> algoItems;
236 algoItems << QAsn1Element::fromObjectId(
"1.3.14.3.2.26");
239 QList<QAsn1Element> digestItems;
240 digestItems << QAsn1Element::fromVector(algoItems);
243 QList<QAsn1Element> macItems;
244 macItems << QAsn1Element::fromVector(digestItems);
247 return QAsn1Element::fromVector(macItems);
252 QList<QAsn1Element> items;
258 const QByteArray data = _q_PKCS12_bag(certs, key, passPhrase);
259 items << _q_PKCS7_data(data);
262 items << _q_PKCS12_mac(data, passPhrase);
267 QDataStream stream(&ba, QIODevice::WriteOnly);