Pointers

Smart pointers

Elegant code from this github issue. Look how destructor is called in the style of defer-ed functions when the object goes out of scope.

int main() {
    std::string filename = "test.pem";
    std::string password = "password";
    {
        std::unique_ptr<EVP_PKEY, decltype(&::EVP_PKEY_free)> key(EVP_RSA_gen(2048), ::EVP_PKEY_free);

        std::unique_ptr<BIO, decltype(&::BIO_free)> out(BIO_new(BIO_s_file()), ::BIO_free);
        if (out != nullptr) {
            if (BIO_write_filename(out.get(), const_cast<char *>(filename.c_str())) > 0) {
                int size = PEM_write_bio_PrivateKey(out.get(), key.get(), nullptr, nullptr, 0,
                                                    nullptr, const_cast<char *>(password.data()));
                std::cout << size << std::endl;
            }
        }
    }
    {
        std::string invalidPassword = "invalid";
        std::unique_ptr<BIO, decltype(&::BIO_free)> in(BIO_new(BIO_s_file()), ::BIO_free);
        if (in != nullptr) {
            if (BIO_read_filename(in.get(), filename.c_str()) > 0) {
                EVP_PKEY *pkey = PEM_read_bio_PrivateKey(in.get(), nullptr, nullptr, nullptr);
                std::cout << (pkey == nullptr) << std::endl;
            }
        }
    }
}