#pragma once

#include "HybridRsaSpec.hpp"
#include <NitroModules/ArrayBuffer.hpp>

namespace margelo::nitro::nitrokryptom {

class HybridRsa: public HybridRsaSpec {
public:
    HybridRsa(): HybridObject(TAG) { }
    
public:
    
    std::shared_ptr<Promise<HybridKeypair>> generateKeypair(double keySize) override;
    std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> sign(const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& key) override;
    std::shared_ptr<Promise<bool>> verify(const std::shared_ptr<ArrayBuffer>& signature, const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& key) override;
    std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> encrypt(RsaEncryptionAlgorithmSpec algorithm, const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& publicKey) override;
    std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> decrypt(RsaEncryptionAlgorithmSpec algorithm, const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& privateKey) override;
    void checkValidPublic(const std::shared_ptr<ArrayBuffer>& publicKey) override;
    void checkValidPrivate(const std::shared_ptr<ArrayBuffer>& privateKey) override;
};

}

