[toolchain] Add get key to buffer API for grpc_ratls

This commit is contained in:
Zheng, Qi 2023-04-17 19:35:19 +08:00 committed by volcano
parent 6f9ae75f96
commit 4cbf728910
2 changed files with 78 additions and 12 deletions

@ -35,6 +35,15 @@ using ratls::GrSecret;
using ratls::SecretRequest; using ratls::SecretRequest;
using ratls::SecretReply; using ratls::SecretReply;
typedef enum {
GRPC_RATLS_SUCCESS = 0, /// Success
GRPC_RATLS_ERR = -1, /// General error
GRPC_RATLS_INVALID_PARAM = -2, /// Invalid parameter
GRPC_RATLS_BUF_ERR = -3, /// Invalid buffer or buffer allocation failure
GRPC_RATLS_NO_SECRET = -4, /// No valid secret
GRPC_RATLS_BUF_TOO_SMALL = -5 /// Buffer is too small
} grpc_ratls_result_t;
// Client // Client
class GrSecretClient { class GrSecretClient {
public: public:
@ -115,11 +124,11 @@ void base64_decode(const char *b64input, unsigned char *dest, size_t dest_len) {
} }
} }
int grpc_ratls_get_secret( static grpc_ratls_result_t grpc_ratls_get_secret_string(
const char *server_addr, const char *server_addr,
const char *config_json, const char *config_json,
const char *name, const char *name,
const char *secret_file std::string* secret_string
) )
{ {
auto cred = grpc::sgx::TlsCredentials(config_json); auto cred = grpc::sgx::TlsCredentials(config_json);
@ -131,24 +140,73 @@ int grpc_ratls_get_secret(
// std::cout << "secret received: " << secret << "len: " << secret.length() << std::endl; // std::cout << "secret received: " << secret << "len: " << secret.length() << std::endl;
if (secret.empty()) { if (secret.empty()) {
return -1; return GRPC_RATLS_NO_SECRET;
} else { } else {
//Decode From Base64 //Decode From Base64
size_t len = base64_decode_len(secret.c_str()); size_t len = base64_decode_len(secret.c_str());
if (len) { if (len) {
char *secret_orig = (char *)malloc(len); char *secret_orig = (char *)malloc(len);
if (!secret_orig) {
return GRPC_RATLS_BUF_ERR;
}
base64_decode(secret.c_str(), (unsigned char *)secret_orig, len); base64_decode(secret.c_str(), (unsigned char *)secret_orig, len);
std::string secret_string(secret_orig, secret_orig + len - 1); secret_string->assign(secret_orig, secret_orig + len - 1);
free(secret_orig);
return GRPC_RATLS_SUCCESS;
}
return GRPC_RATLS_ERR;
}
}
// Get secret to file
int grpc_ratls_get_secret(
const char *server_addr,
const char *config_json,
const char *name,
const char *secret_file
)
{
std::string secret_string;
grpc_ratls_result_t ret = grpc_ratls_get_secret_string(
server_addr, config_json, name, &secret_string
);
if (ret == GRPC_RATLS_SUCCESS) {
//write to file //write to file
std::ofstream myfile; std::ofstream myfile;
myfile.open(secret_file); myfile.open(secret_file);
myfile << secret_string; myfile << secret_string;
myfile.close(); myfile.close();
return 0;
} }
return -2; return ret;
} }
// Get secret to buffer
int grpc_ratls_get_secret_to_buf(
const char *server_addr,
const char *config_json,
const char *name,
char *secret_buf,
unsigned int *buf_len
)
{
std::string secret_string;
grpc_ratls_result_t ret = grpc_ratls_get_secret_string(
server_addr, config_json, name, &secret_string
);
if (ret == GRPC_RATLS_SUCCESS) {
if (*buf_len < secret_string.size()) {
std::cout << "buffer size is smaller than the secret string length " << secret_string.size() << std::endl;;
return GRPC_RATLS_BUF_TOO_SMALL;
}
//write to buffer
memcpy(secret_buf, secret_string.data(), secret_string.size());
*buf_len = secret_string.size();
}
return ret;
} }

@ -13,6 +13,14 @@ extern int grpc_ratls_get_secret(
const char *secret_file // secret file to be saved const char *secret_file // secret file to be saved
); );
extern int grpc_ratls_get_secret_to_buf(
const char *server_addr, // grpc server address+port, such as "localhost:50051"
const char *config_json, // ratls handshake config json file
const char *name, // secret name to be requested
char *secret_buf, // buffer to save secret
unsigned int *buf_len // buffer size
);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif