BOOL Csp::CPGetKeyParam( IN HCRYPTPROV hProv, IN HCRYPTKEY hKey, IN DWORD dwParam, OUT LPBYTE pbData, IN OUT LPDWORD pcbDataLen, IN DWORD dwFlags){ DECL_RET(ret); try { CSPContext * it = *findContext(hProv); CSPKeyContext * key = *it->findKeyContext(hKey); packData dat(pbData,pcbDataLen); flagCheck f(dwFlags,true); switch (dwParam) { //TODO: rest of the params case KP_ALGID: m_log << "KP_ALGID " << key->m_algId << std::endl; dat.setValue(key->m_algId); break; case KP_CERTIFICATE: m_log << "KP_CERTIFICATE " << key->m_algId << std::endl; if (GET_ALG_TYPE(key->m_algId) != ALG_TYPE_RSA) throw err_badType(); dat.setValue(key->m_certificateBlob); break; default: throw err_badType(); break; } ret.SetOk(); } catch(std::runtime_error &err) { ret.logReturn(err); } return ret; }
bool QQmlAndroidContextual::initContext(QQmlAndroidContext *context) { if (!context) context = findContext(this); setContext(context); return context; }
MessageItem *DataModel::findMessage(const QString &context, const QString &sourcetext, const QString &comment) const { if (ContextItem *ctx = findContext(context)) return ctx->findMessage(sourcetext, comment); return 0; }
void QQmlAndroidContextual::resolveContext() { if (!m_context) { setContext(findContext(this)); if (!m_context) qWarning() << "QQmlAndroidContextual: could not resolve context for" << this; } }
BOOL Csp::CPDestroyKey( IN HCRYPTPROV hProv, IN HCRYPTKEY hKey){ DECL_RET(ret); try { CSPContext * it = *findContext(hProv); it->m_keys.erase(it->findKeyContext(hKey)); ret.SetOk(); } catch(std::runtime_error &err) { ret.logReturn(err); } return ret; }
Context& Messages::findContext(const QString& name) { for (unsigned int i = 0; i < _contexts.size(); ++i) if (_contexts[i].name == name) return _contexts[i]; Context context; context.name = name; _contexts.push_back(context); return findContext(name); }
BOOL Csp::CPGenKey( IN HCRYPTPROV hProv, IN ALG_ID Algid, IN DWORD dwFlags, OUT HCRYPTKEY *phKey){ try { CSPContext * it = *findContext(hProv); throw std::runtime_error("not implemented"); } catch(std::runtime_error &) { return FALSE; } return TRUE; }
BOOL Csp::CPGetUserKey( IN HCRYPTPROV hProv, IN DWORD dwKeySpec, OUT HCRYPTKEY *phUserKey){ DECL_RET(ret); try { CSPContext * it = *findContext(hProv); m_log << "GetUserKey, " << it->m_containerName << " dwKeySpec:" << dwKeySpec << std::endl; CSPKeyContext * key = it->createKeyContext(); key->setPubkeySpec(dwKeySpec); key->m_keyId = getNextHandle(); it->m_keys.push_back(key); *phUserKey = key->m_keyId; ret.SetOk(); } catch(std::runtime_error &err) { ret.logReturn(err); } return ret; }
BOOL Csp::CPExportKey( IN HCRYPTPROV hProv, IN HCRYPTKEY hKey, IN HCRYPTKEY hPubKey, IN DWORD dwBlobType, IN DWORD dwFlags, OUT LPBYTE pbData, IN OUT LPDWORD pcbDataLen){ DECL_RET(ret); try { CSPContext * it = *findContext(hProv); CSPKeyContext * key = *it->findKeyContext(hKey); switch (dwBlobType) { case PUBLICKEYBLOB: { if (hPubKey) throw err_badKey(); packData dat(pbData,pcbDataLen); struct { PUBLICKEYSTRUC pubkeyStruc; RSAPUBKEY rsaKey; BYTE modulus[2048 / 8]; } RSABlob; PCCERT_CONTEXT ctx = CertCreateCertificateContext(X509_ASN_ENCODING, &key->m_certificateBlob[0],(DWORD)key->m_certificateBlob.size()); PCRYPT_BIT_BLOB pubKey = &ctx->pCertInfo->SubjectPublicKeyInfo.PublicKey; DWORD actSize = sizeof(RSABlob); err_crypto::check(CryptDecodeObject(X509_ASN_ENCODING, RSA_CSP_PUBLICKEYBLOB,pubKey->pbData,pubKey->cbData, 0, &RSABlob, &actSize)); dat.setValue(RSABlob); //key->m_certificateBlo ret.SetOk(); break; } default: throw std::runtime_error("not implemented"); } } catch(std::runtime_error &err) { ret.logReturn(err); } return ret; }
bool Messages::merge(const QString& filePath) { QFile file(filePath); if (!file.open(IO_ReadOnly)) return false; QDomDocument doc; if (!doc.setContent(&file)) return false; file.close(); QDomElement root = doc.documentElement(); for (uint i = 0; i < root.childNodes().count(); ++i) { QDomNode node = root.childNodes().item(i); if (node.isNull()) continue; QDomElement e = node.toElement(); if (e.isNull()) continue; QString tag = e.tagName(); QString text = e.text(); if (tag == "context") { QDomNodeList nodes = e.childNodes(); QDomElement n = nodes.item(0).toElement(); assert(n.tagName() == "name"); QString name = n.text(); if (contextExists(name)) { Context& context = findContext(name); context.merge(nodes); } } else { qWarning("Error: unknown root tag: " + tag); } } return true; }