DINAMO Networks is now aDINAMO cyber security company!
API C/C++
HSM DINAMO
Loading...
Searching...
No entry found
pix_handle_stats.c

Example of configuring the HTTP connection cache in ` PIX ` and reading the handle and cache counters.

See Note on examples.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <dinamo.h> /* header do Dinamo */
#define HOST_ADDR "127.0.0.1"
#define USER_ID "master"
#define USER_PWD "12345678"
int main()
{
int nRet = 0;
struct AUTH_PWD authPwd;
HPIXSESSIONCTX hPIXSession = NULL;
const char szKeyId[] = "key";
const char szKeyCert[] = "key_cert";
const char szPIXChain[] = "pix_chain";
const char szUrl[] = "https://127.0.0.1:8000";
BYTE pbTestData[] = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><xml>sdfsdf</xml>";
DWORD dwMaxHandles = 6; //Teto de conexões simultâneas. Zero, o padrão, é sem limite.
DWORD dwIdleTTL = 300; //Segundos até uma conexão ociosa do cache ser fechada.
PIX_REQUEST stRequest;
PIX_RESPONSE stResponse;
PIX_HANDLE_STATS stHandleStats;
PIX_POOL_STATS stPoolStats;
DWORD dwDataLen = 0;
ND_uint64_t nHttpRet = 0;
//Inicializa as bibliotecas do Dinamo
nRet = DInitialize(0);
if (nRet) {
printf("Falha na funcao: DInitialize \nCodigo de erro: %d\n", nRet);
goto clean;
}
printf("Bibliotecas inicializadas.\n");
/*
O cache é de escopo da biblioteca, então é configurado antes de qualquer tráfego.
Como cada conexão do cache é um handle, PIXCP_MAX_HANDLES é o próprio limite de
conexões apresentado ao peer.
*/
nRet = DPIXSetCacheParam(PIXCP_MAX_HANDLES, (BYTE *)&dwMaxHandles, sizeof(dwMaxHandles), 0);
if (nRet) {
printf("Falha na funcao: DPIXSetCacheParam \nCodigo de erro: %d\n", nRet);
goto clean;
}
nRet = DPIXSetCacheParam(PIXCP_IDLE_TTL, (BYTE *)&dwIdleTTL, sizeof(dwIdleTTL), 0);
if (nRet) {
printf("Falha na funcao: DPIXSetCacheParam \nCodigo de erro: %d\n", nRet);
goto clean;
}
printf("Cache de conexoes HTTP configurado.\n");
//Inicializa a estrutura para conexão com o HSM
memset(&authPwd, 0, sizeof(authPwd));
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));
nRet = DPIXOpenHandle(&hPIXSession,
szKeyId,
szKeyCert,
szPIXChain,
(BYTE *)&authPwd,
sizeof(authPwd),
0);
if (nRet) {
printf("Falha na funcao: DPIXOpenHandle \nCodigo de erro: %d\n", nRet);
goto clean;
}
memset(&stRequest, 0, sizeof(stRequest));
stRequest.dwMethod = PIX_HTTP_POST;
stRequest.szURL = szUrl;
stRequest.pbBody = pbTestData;
stRequest.dwBodyLen = sizeof(pbTestData) - 1;
stRequest.dwTimeOut = 30000;
memset(&stResponse, 0, sizeof(stResponse));
nRet = DPIXRequest(hPIXSession, &stRequest, &stResponse, 0);
if (nRet) {
printf("Falha na funcao: DPIXRequest \nCodigo de erro: %d\n", nRet);
goto clean;
}
DPIXFreeResponse(&stResponse);
printf("PIX post executado com sucesso.\n");
/* ---- Contadores do handle ---------------------------------------------------- */
//Código HTTP da última requisição feita com este handle.
dwDataLen = sizeof(nHttpRet);
nRet = DPIXGetHandleParam(hPIXSession, PIXP_HTTP_RET, (BYTE *)&nHttpRet, &dwDataLen, 0);
if (nRet) {
printf("Falha na funcao: DPIXGetHandleParam \nCodigo de erro: %d\n", nRet);
goto clean;
}
printf("Codigo HTTP da ultima requisicao: %llu\n", nHttpRet);
//Tempos da última requisição.
memset(&stDetails, 0, sizeof(stDetails));
dwDataLen = sizeof(stDetails);
nRet = DPIXGetHandleParam(hPIXSession, PIXP_HTTP_REQ_DETAILS, (BYTE *)&stDetails, &dwDataLen, 0);
if (nRet) {
printf("Falha na funcao: DPIXGetHandleParam \nCodigo de erro: %d\n", nRet);
goto clean;
}
printf("Tempo total: %llu ms, handshake TLS: %llu ms.\n",
(unsigned long long)stDetails.total_time,
(unsigned long long)stDetails.appconnect_time);
/*
Contadores acumulados deste handle. Assim como em PIX_POOL_STATS, dwVersion informa
à biblioteca qual leiaute o chamador conhece, e precisa ser preenchida antes da
chamada.
*/
memset(&stHandleStats, 0, sizeof(stHandleStats));
dwDataLen = sizeof(stHandleStats);
nRet = DPIXGetHandleParam(hPIXSession, PIXP_STATS, (BYTE *)&stHandleStats, &dwDataLen, 0);
if (nRet) {
printf("Falha na funcao: DPIXGetHandleParam \nCodigo de erro: %d\n", nRet);
goto clean;
}
printf("Handle: %llu handshake(s) TLS, %llu assinatura(s) no HSM.\n",
(unsigned long long)stHandleStats.ssl_hook_count,
(unsigned long long)stHandleStats.hsm_sign_count);
/* ---- Contadores do cache ------------------------------------------------------ */
//Aqui dwVersion precisa ser informada antes da chamada.
memset(&stPoolStats, 0, sizeof(stPoolStats));
dwDataLen = sizeof(stPoolStats);
nRet = DPIXGetCacheParam(PIXCP_STATS, (BYTE *)&stPoolStats, &dwDataLen, 0);
if (nRet) {
printf("Falha na funcao: DPIXGetCacheParam \nCodigo de erro: %d\n", nRet);
goto clean;
}
printf("Cache: %llu conexao(oes) viva(s), maximo ja atingido %llu.\n",
(unsigned long long)stPoolStats.handles_live,
(unsigned long long)stPoolStats.handles_high_water);
/*
Uma assinatura no HSM acontece a cada handshake completo. Quando hsm_sign_count
fica abaixo de ssl_hook_count, a diferença são as sessões TLS retomadas: o
handshake retomado não envia CertificateVerify e portanto não usa a chave do HSM.
*/
printf("Cache: %llu handshake(s) TLS, %llu assinatura(s) no HSM, %llu retomada(s).\n",
(unsigned long long)stPoolStats.ssl_hook_count,
(unsigned long long)stPoolStats.hsm_sign_count,
(unsigned long long)(stPoolStats.ssl_hook_count - stPoolStats.hsm_sign_count));
/*
Marca as conexões do cache para serem fechadas.
*/
nRet = DPIXSetCacheParam(PIXCP_CLEAR, NULL, 0, 0);
if (nRet) {
printf("Falha na funcao: DPIXSetCacheParam \nCodigo de erro: %d\n", nRet);
goto clean;
}
printf("Cache de conexoes HTTP marcado para fechamento.\n");
clean:
if (hPIXSession) {
DPIXCloseHandle(&hPIXSession, 0);
printf("Handle PIX encerrado.\n");
}
printf("Bibliotecas finalizada.\n");
return nRet;
}
Application Programming Interface (API) do HSM Dinamo.
#define PIX_RESPONSE_VERSION
Definição dinamo.h:2803
#define DEFAULT_PORT
Definição dinamo.h:2091
#define PIXP_HTTP_RET
Definição dinamo.h:2855
unsigned char BYTE
Definição dinamo.h:44
#define PIXCP_MAX_HANDLES
Definição dinamo.h:2880
#define PIX_HTTP_POST
Definição dinamo.h:2797
#define PIXCP_STATS
Definição dinamo.h:2882
#define PIXP_HTTP_REQ_DETAILS
Definição dinamo.h:2856
unsigned int DWORD
Definição dinamo.h:45
#define PIX_POOL_STATS_VERSION
Definição dinamo.h:2885
void * HPIXSESSIONCTX
Definição dinamo.h:68
#define PIXCP_CLEAR
Definição dinamo.h:2879
#define PIX_REQUEST_VERSION
Definição dinamo.h:2802
#define ENCRYPTED_CONN
Definição dinamo.h:586
#define SS_USER_PWD
Definição dinamo.h:577
#define PIXCP_IDLE_TTL
Definição dinamo.h:2881
#define PIXP_STATS
Definição dinamo.h:2857
unsigned long long ND_uint64_t
Definição dinamo.h:36
#define PIX_HANDLE_STATS_VERSION
Definição dinamo.h:2884
int AAP_API DPIXSetCacheParam(DWORD dwParam, BYTE *pbData, DWORD dwDataLen, DWORD dwReserved)
Configura o cache de sessões HTTP do PIX, usado pelas funções DPIXPost(), DPIXPut(),...
int AAP_API DPIXCloseHandle(HPIXSESSIONCTX *phPIXSession, DWORD dwReserved)
Destrói um handle PIX criado por DPIXOpenHandle(), apagando da memória as credenciais nele armazenada...
int AAP_API DPIXGetCacheParam(DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwReserved)
Recupera a configuração e os contadores do cache de sessões HTTP do PIX.
int AAP_API DPIXRequest(HPIXSESSIONCTX hPIXSession, const PIX_REQUEST *pstRequest, PIX_RESPONSE *pstResponse, DWORD dwReserved)
Executa uma requisição HTTP com um handle PIX, para qualquer método.
int AAP_API DPIXOpenHandle(HPIXSESSIONCTX *phPIXSession, const char *szKeyId, const char *szCertId, const char *szPIXCertChainId, DWORD dwParam, BYTE *pbData, DWORD dwDataLen, DWORD dwFlags, DWORD dwPixFlags)
Cria um handle PIX, que encapsula uma conexão HTTP persistente e o material TLS (certificado,...
int AAP_API DPIXGetHandleParam(HPIXSESSIONCTX hPIXSession, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwReserved)
Recupera informações e contadores de um handle PIX.
int AAP_API DPIXFreeResponse(PIX_RESPONSE *pstResponse)
Libera os buffers de uma PIX_RESPONSE preenchida por DPIXRequest().
int AAP_API DInitialize(DWORD dwReserved)
int AAP_API DFinalize()
Definição dinamo.h:3545
int nPort
Definição dinamo.h:3547
char szUserId[MAX_USR_LEN]
Definição dinamo.h:3548
char szAddr[MAX_ADDR_LEN]
Definição dinamo.h:3546
char szPassword[MAX_USR_PWD]
Definição dinamo.h:3549
Definição dinamo.h:2892
ND_uint64_t ssl_hook_count
Definição dinamo.h:2895
ND_uint64_t hsm_sign_count
Definição dinamo.h:2896
DWORD dwVersion
Definição dinamo.h:2893
Definição dinamo.h:2772
ND_uint64_t appconnect_time
Definição dinamo.h:2775
ND_uint64_t total_time
Definição dinamo.h:2778
Definição dinamo.h:2924
ND_uint64_t handles_live
Definição dinamo.h:2927
ND_uint64_t ssl_hook_count
Definição dinamo.h:2934
ND_uint64_t hsm_sign_count
Definição dinamo.h:2935
DWORD dwVersion
Definição dinamo.h:2925
ND_uint64_t handles_high_water
Definição dinamo.h:2929
Definição dinamo.h:2817
const char * szURL
Definição dinamo.h:2821
DWORD dwTimeOut
Definição dinamo.h:2829
DWORD dwBodyLen
Definição dinamo.h:2827
DWORD dwMethod
Definição dinamo.h:2820
DWORD dwVersion
Definição dinamo.h:2818
BYTE * pbBody
Definição dinamo.h:2826
Definição dinamo.h:2841
DWORD dwVersion
Definição dinamo.h:2842