azure-protected-vm-secrets/BcryptError.h (74 lines of code) (raw):
#pragma once
#define UMDF_USING_NTSTATUS
#include <windows.h>
#include <bcrypt.h>
#ifndef _NTSTATUS_
#include <ntstatus.h>
#endif
#include <string>
#include <stdexcept>
#include <sstream>
#include "ReturnCodes.h"
class BcryptError : public std::runtime_error {
private:
NTSTATUS status;
ErrorCode lib_rc;
public:
BcryptError(NTSTATUS status, const std::string& description, ErrorCode rc = ErrorCode::GeneralError)
: lib_rc(rc), std::runtime_error(description), status(status) {}
NTSTATUS getStatusCode() const { return status; }
const char* getErrorInfo() const {
switch (status) {
case STATUS_AUTH_TAG_MISMATCH:
return "(Bcrypt) Auth tag mismatch";
break;
case STATUS_NOT_FOUND:
return "(Bcrypt) Not Found";
break;
case STATUS_NO_MEMORY:
return "(Bcrypt) No Memory";
break;
case STATUS_INVALID_PARAMETER:
return "(Bcrypt) Invalid parameter";
break;
case STATUS_INVALID_HANDLE:
return "(Bcrypt) Invalid handle";
break;
case STATUS_NOT_SUPPORTED:
return "(Bcrypt) Not supported";
break;
case STATUS_BUFFER_TOO_SMALL:
return "(Bcrypt) Buffer Too Small";
break;
case STATUS_INVALID_BUFFER_SIZE:
return "(Bcrypt) Invalid Buffer Size";
break;
case STATUS_INVALID_SIGNATURE:
return "(Bcrypt) Invalid Signature";
break;
default:
return "(Bcrypt) Unknown error";
break;
}
}
void SetLibRC(ErrorCode rc) { lib_rc = rc; }
ErrorCode GetLibRC() { return lib_rc; }
};
class WinCryptError : public std::runtime_error {
private:
DWORD errorcode;
ErrorCode lib_rc;
public:
WinCryptError(const std::string& description, DWORD errorcode, ErrorCode rc = ErrorCode::GeneralError)
: lib_rc(rc), std::runtime_error(description), errorcode(errorcode) {}
void SetLibRC(ErrorCode rc) { lib_rc = rc; }
ErrorCode GetLibRC() { return lib_rc; }
std::string GetErrorMessage() {
std::ostringstream ss;
ss << "WinCryptError: " << what();
if (errorcode != 0) {
ss << errorcode;
}
return ss.str();
}
};