API C/C++
HSM Dinamo
Loading...
Looking for...
No entries found
skeep_new_split_recover.c

Example of creating, splitting and recovering a secret using the Safe Keeping module.

See Note on examples.
/* skeep_new_split_recover.c
*
* Exemplo que demonstra como criar um segredo, dividi-lo em partes (shares) e
* recuperá-lo a partir de M partes.
*
* 1. Cria um segredo
* 2. Divide o segredo em N partes onde M partes são necessárias para
* recuperar o segredo. Opcionalmente: gerar o checksum de cada parte.
* 3. Recupera o segredo a partir de M partes
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "dinamo.h" /* header do Dinamo */
#define HOST_ADDR "127.0.0.1"
#define USER_ID "master"
#define USER_PWD "12345678"
static int OpenSession(HSESSIONCTX *hSession, const char *cszIp, const char *cszUser,
const char *cszPassword)
{
struct AUTH_PWD authPwd;
/* Inicializa a estrutura para conexao com o HSM */
strncpy(authPwd.szAddr, HOST_ADDR, sizeof(authPwd.szAddr));
authPwd.nPort = DEFAULT_PORT;
strncpy(authPwd.szUserId, USER_ID, sizeof(authPwd.szUserId));
strncpy(authPwd.szPassword, USER_PWD, sizeof(authPwd.szPassword));
return DOpenSession(hSession, SS_USER_PWD, (BYTE *)&authPwd, sizeof(authPwd), ENCRYPTED_CONN);
}
static void PrintError(const char *cszFunction, int nRet)
{
printf("Falha na funcao: %s \nCodigo de erro: %d\n", cszFunction, nRet);
}
int main()
{
int nRet = 0;
HSESSIONCTX hSession = NULL;
#define M (2) /* Numero minimo de partes (shares) para recuperar o segredo */
#define N (3) /* Numero total de partes (shares) */
const char *szId = "segredo";
BYTE bSecLevel = DN_SKEEP_SEC_LEVEL_160b; /* Nivel de seguranca do segredo */
WORD wAuthType = DN_SKEEP_TYPE_NMIND; /* Tipo de autenticacao do segredo. Neste teste, não é o padrão usuário e senha. */
int i = 0;
SKeepShare shares[N] = {0}; /* Vetor de partes */
SKeepRecoverInfo stRecoverInfo = {0}; /* Estrutura para recuperar o segredo */
/* Inicializa as bibliotecas do Dinamo */
nRet = DInitialize(0);
if (nRet)
{
PrintError("DInitialize", nRet);
goto clean;
}
printf("Bibliotecas inicializadas.\n");
/* Abre sessão com o HSM */
nRet = OpenSession(&hSession, HOST_ADDR, USER_ID, USER_PWD);
if (nRet)
{
PrintError("DOpenSession", nRet);
goto clean;
}
printf("Sessao com o Dinamo estabelecida.\n");
/*
1. Cria um segredo
*/
nRet = DSKeepNewSecret(hSession, szId, bSecLevel, wAuthType, 0);
if(nRet)
{
PrintError("DSKeepNewSecret", nRet);
goto clean;
}
printf("Segredo criado com sucesso.\n");
/*
2. Divide o segredo em partes.
O segredo é dividido em N partes, sendo que M partes são necessárias
para recuperar o segredo.
*/
nRet = DSKeepSplitSecret(hSession, szId, bSecLevel, wAuthType, M, N, shares, 0);
if (nRet)
{
PrintError("DSKeepSplitSecret", nRet);
goto clean;
}
printf("Segredo dividido com sucesso.\n");
/*
Opcional: Calcular o checksum de cada parte.
O checksum é utilizado para verificar a digitação correta do parte na
aplicação de cerimônia.
O ideal é que ele seja guardado junto com o parte e verificado antes
de fazer a recuperação do segredo.
*/
for (i = 0; i < N; i++)
{
char szShareCks[DN_SKEEP_SHARE_CKS_LEN + 1] = {0};
nRet = DSKeepCalcShareCks(DN_SKEEP_GEN_SHARE_CKS, shares[i].szShare, szShareCks);
if (nRet)
{
PrintError("DSKeepSplitSecret", nRet);
goto clean;
}
printf("Parte %d: %s [%s]\n", i, shares[i].szShare, szShareCks);
}
/*
3. Recupera o segredo a partir de M partes
*/
nRet = DSKeepRecoverSecret(hSession, szId, shares, M, &stRecoverInfo, 0);
if (nRet)
{
PrintError("DSKeepRecoverSecret", nRet);
goto clean;
}
printf("Segredo recuperado com sucesso.\n");
printf("Segredo: %s\n", stRecoverInfo.szSecret);
/* Remove o segredo */
nRet = DSKeepRemoveSecret(hSession, szId, bSecLevel, wAuthType, 0);
if (nRet)
{
PrintError("DSKeepRemoveSecret", nRet);
goto clean;
}
printf("Segredo removido com sucesso.\n");
clean:
DCloseSession(&hSession, 0);
printf("Sessao encerrada.\n");
printf("Bibliotecas finalizadas.\n");
return nRet;
}
Application Programming Interface (API) do HSM Dinamo.
void * HSESSIONCTX
Definição dinamo.h:68
#define DEFAULT_PORT
Definição dinamo.h:1934
unsigned short WORD
Definição dinamo.h:48
unsigned char BYTE
Definição dinamo.h:45
#define ENCRYPTED_CONN
Definição dinamo.h:570
#define SS_USER_PWD
Definição dinamo.h:561
int AAP_API DOpenSession(HSESSIONCTX *phSession, DWORD dwParam, BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
int AAP_API DCloseSession(HSESSIONCTX *phSession, DWORD dwFlags)
int AAP_API DInitialize(DWORD dwReserved)
int AAP_API DFinalize()
int AAP_API DSKeepNewSecret(HSESSIONCTX hSession, const char *cszId, BYTE bSecLevel, WORD wAuthType, DWORD dwReserved)
#define DN_SKEEP_SEC_LEVEL_160b
Definição dinamo.h:9239
#define DN_SKEEP_GEN_SHARE_CKS
Definição dinamo.h:9352
#define DN_SKEEP_SHARE_CKS_LEN
Definição dinamo.h:9350
int AAP_API DSKeepRemoveSecret(HSESSIONCTX hSession, const char *cszId, BYTE bSecLevel, WORD wAuthType, DWORD dwReserved)
int AAP_API DSKeepCalcShareCks(DWORD dwType, const char *cszShare, char *szCks)
#define DN_SKEEP_TYPE_NMIND
Definição dinamo.h:9242
int AAP_API DSKeepSplitSecret(HSESSIONCTX hSession, const char *cszId, BYTE bSecLevel, WORD wAuthType, BYTE bM, BYTE bN, SKeepShare *pstShares, DWORD dwReserved)
int AAP_API DSKeepRecoverSecret(HSESSIONCTX hSession, const char *cszId, const SKeepShare *cpstShares, DWORD dwSharesCount, SKeepRecoverInfo *pstRecoverInfo, DWORD dwReserved)
Definição dinamo.h:3110
int nPort
Definição dinamo.h:3112
char szUserId[MAX_USR_LEN]
Definição dinamo.h:3113
char szAddr[MAX_ADDR_LEN]
Definição dinamo.h:3111
char szPassword[MAX_USR_PWD]
Definição dinamo.h:3114
Definição dinamo.h:3661
char szSecret[DN_SKEEP_M_OF_N_S_LEN+1]
Definição dinamo.h:3663
Definição dinamo.h:3670