common/crypto/signature_verifier.h (39 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#pragma once
#include <cryptopp/filters.h>
#include <cryptopp/xed25519.h>
#include <shared_mutex>
#include <string>
#include "absl/status/statusor.h"
#include "common/crypto/signature_verifier_interface.h"
#include "common/proto/signature_info.pb.h"
namespace resdb {
// SignatureVerifier used to sign signatures using private_key,
// and verify signatures using the public keys of the senders identified
// by their node_id.
class SignatureVerifier : public SignatureVerifierInterface {
public:
SignatureVerifier(const KeyInfo& private_key,
const CertificateInfo& certificate_info);
virtual ~SignatureVerifier() = default;
// Set the public key that contains the public key, node id,
// and its certificate.
bool AddPublicKey(const CertificateKey& pub_key, bool need_verify = true);
// Get the public key of node id. KeyInfo contains the key and its hash type.
absl::StatusOr<KeyInfo> GetPublicKey(int64_t node_id) const;
// Get all the public keys.
std::vector<CertificateKey> GetAllPublicKeys() const;
// Get the number of public keys it contains.
size_t GetPublicKeysSize() const;
// Sign messages using the private key.
virtual absl::StatusOr<SignatureInfo> SignMessage(const std::string& message);
absl::StatusOr<SignatureInfo> SignCertificateKeyInfo(
const CertificateKeyInfo& info);
// Verify messages using the public key from the sender.
virtual bool VerifyMessage(const std::string& message,
const SignatureInfo& sign);
bool VerifyMessage(const google::protobuf::Message& message,
const SignatureInfo& sign);
bool VerifyKey(const CertificateKeyInfo& info, const SignatureInfo& sign);
static std::string CalculateHash(const std::string& str);
static bool VerifyMessage(const std::string& message,
const KeyInfo& public_key,
const std::string& signature);
private:
std::map<int64_t, CertificateKey> keys_;
// GUARDED_BY(mutex_); // public keys of nodes, including the public key and
// its encrpt type.
KeyInfo private_key_; // public-private keys of self.
KeyInfo admin_public_key_; // public key of admin.
int64_t node_id_; // id of current node.
std::unique_ptr<CryptoPP::ed25519::Signer> signer_;
mutable std::shared_mutex mutex_;
};
} // namespace resdb