Block SecTpmMemory::signInTpm(const uint8_t *data, size_t dataLength, const Name& keyName, DigestAlgorithm digestAlgorithm) { if (digestAlgorithm != DIGEST_ALGORITHM_SHA256) return ConstBufferPtr(); // Find the private key and sign. PrivateKeyStore::iterator privateKey = privateKeyStore_.find(keyName.toUri()); if (privateKey == privateKeyStore_.end()) throw Error(string("MemoryPrivateKeyStorage: Cannot find private key ") + keyName.toUri()); uint8_t digest[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, data, dataLength); SHA256_Final(digest, &sha256); BufferPtr signatureBuffer = ptr_lib::make_shared<Buffer>(); signatureBuffer->resize(RSA_size(privateKey->second->getPrivateKey())); unsigned int signatureBitsLength; if (!RSA_sign(NID_sha256, digest, sizeof(digest), signatureBuffer->buf(), &signatureBitsLength, privateKey->second->getPrivateKey())) { throw Error("Error in RSA_sign"); } return Block(Tlv::SignatureValue, signatureBuffer); }
BufferPtr serializeMsg(const Msg& msg) { int size = msg.ByteSize(); BufferPtr bytes = std::make_shared<Buffer>(size); msg.SerializeToArray(bytes->buf(), size); return bytes; }