bool SecurityHelper::verifyDataObject(DataObjectRef& dObj, CertificateRef& cert) const { RSA *key; // Cannot verify without signature if (!dObj->getSignature()) { HAGGLE_ERR("No signature in data object, cannot verify\n"); return false; } writeErrors("(not this): "); key = cert->getPubKey(); if (RSA_verify(NID_sha1, dObj->getId(), sizeof(DataObjectId_t), const_cast<unsigned char *>(dObj->getSignature()), dObj->getSignatureLength(), key) != 1) { char *raw; size_t len; writeErrors(""); dObj->getRawMetadataAlloc((unsigned char **)&raw, &len); if (raw) { HAGGLE_DBG("Signature is invalid:\n%s\n", raw); free(raw); } dObj->setSignatureStatus(DataObject::SIGNATURE_INVALID); return false; } HAGGLE_DBG("Signature is valid\n"); dObj->setSignatureStatus(DataObject::SIGNATURE_VALID); return true; }
void DebugManager::dumpTo(SOCKET client_sock, DataStoreDump *dump) { size_t toSend = dump->getLen(); const char *data = dump->getData(); size_t i = 0; i = skipXMLTag(data, toSend); toSend -= i; // Send the <?xml version="1.0"?> tag: if (!sendString(client_sock, "<?xml version=\"1.0\"?>\n")) return; // Send the root tag: if (!sendString(client_sock, "<HaggleInfo>")) return; // Send the data: if (!sendBuffer(client_sock, &(data[i]), toSend)) return; DataObjectRef dObj = kernel->getThisNode()->getDataObject(false); unsigned char *buf; size_t len; if (dObj->getRawMetadataAlloc(&buf, &len)) { i = skipXMLTag((char *)buf, len); len -= i; if (!sendString(client_sock, "<ThisNode>\n")) { free(buf); return; } if (!sendBuffer(client_sock, &(buf[i]), len)) { free(buf); return; } if (!sendString(client_sock, "</ThisNode>\n")) { free(buf); return; } free(buf); } /* FIXME: With the new forwarding this thing is broken. Manager *mgr = kernel->getManager((char *)"ForwardingManager"); if (mgr) { ForwardingManager *fmgr = (ForwardingManager *) mgr; DataObjectRef dObj = fmgr->getForwarder()->myMetricDO; if (dObj) { char *buf; size_t len; if (dObj->getRawMetadataAlloc(&buf, &len)) { i = skipXMLTag(buf, len); len -= i; if (!sendString(client_sock, "<RoutingData>\n")) { free(buf); return; } if (!sendBuffer(client_sock, &(buf[i]), len)) { free(buf); return; } if (!sendString(client_sock, "</RoutingData>\n")) { free(buf); return; } free(buf); } } } */ NodeRefList nl; kernel->getNodeStore()->retrieveNeighbors(nl); if (!nl.empty()) { if (!sendString(client_sock, "<NeighborInfo>\n")) return; for (NodeRefList::iterator it = nl.begin(); it != nl.end(); it++) { if (!sendString(client_sock, "<Neighbor>")) return; if (!sendString(client_sock, (*it)->getIdStr())) return; if (!sendString(client_sock, "</Neighbor>\n")) return; } if (!sendString(client_sock, "</NeighborInfo>\n")) return; } // Send the end of the root tag: sendString(client_sock, "</HaggleInfo>"); }