API C/C
HSM Dinamo
Cargando...
Buscando...
No se han encontrado entradas
user_otp.c

Ejemplo de uso de OTP para autenticar usuarios de HSM.

Véase la nota sobre ejemplos.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <dinamo.h>
/* Parámetros de conexión */
#define HSM_USR_ADM "maestro"
#define HSM_USR "usuario"
#define HSM_IP "127.0.0.1"
#define HSM_PWD "12345678"
int NewHsmUser(HSESSIONCTX hSession, const char *szUser, const char *szPwd)
{
int nRet = 0;
struct USER_INFO stUserInfo = { 0 };
/* Rellena la estructura de usuario */
strncpy(stUserInfo. szUserId, szUser, sizeof(stUserInfo.szUserId));
strncpy(stUserInfo. szPassword, szPwd, sizeof(stUserInfo.szPassword));
/* Crea un nuevo usuario en HSM */
nRet = DCreateUser(hSession, stUserInfo);
si (nRet)
{
printf("DCreateUser : ¡Falló! %d.\n", nRet);
devolver nRet;
}
Devuelve 0;
}
int main(void)
{
int nRet = 0;
struct AUTH_PWD_EX stAuthInfoAdm = {0};
struct AUTH_PWD_EX stAuthInfoUser = { 0 };
HSESSIONCTX hSessionAdm = NULL;
HSESSIONCTX hSessionUser = NULL;
OATH_SA_v1 stTokenParam = { 0 };
const char cszOTP[] = "992271";
/*
* Semilla utilizada para generar el Blob HOTP.
*
* Esta semilla se puede transformar de binario a Base32
* e importado en el cliente (Google Authenticator, por ejemplo).
*
*/
BYTE pbOtpKey[20] =
{
0xD5, 0x17, 0xED, 0x40, 0x1D, 0xF3, 0x03, 0x38, 0x37, 0xE0, 0x8B, 0x62, 0x55, 0xBE, 0xDB, 0xF9,
0x52, 0x0E, 0xF8, 0x8E,
};
/*
Rellena la estructura del usuario administrador
*/
strncpy(stAuthInfoAdm. szAddr, HSM_IP, sizeof(stAuthInfoAdm.szAddr));
strncpy(stAuthInfoAdm.szUserId, HSM_USR_ADM, sizeof(stAuthInfoAdm.szUserId));
strncpy(stAuthInfoAdm. szContraseña, HSM_PWD, sizeof(stAuthInfoAdm.szContraseña));
stAuthInfoAdm. nPort = DEFAULT_PORT;
stAuthInfoAdm. nStrongAuthLen = 0;
stAuthInfoAdm. pbStrongAuth = NULL;
stAuthInfoAdm. dwAuthType = SA_AUTH_NONE;
/*
Conectar con un usuario con permisos de administrador
para asociar un token otp a un usuario ordinario.
*/
nRet = DOpenSession(&hSessionAdm,
(BYTE *) &stAuthInfoAdm,
sizeof(struct AUTH_PWD_EX),
if(nRet)
{
printf("DOpenSession (adm) : ¡Error! %d.\n", nRet);
ir a limpiar;
}
/* Crea un usuario de prueba ordinario */
nRet = NewHsmUser(hSessionAdm, HSM_USR, HSM_PWD);
si (nRet)
{
printf("NewHsmUser : ¡Falló! %d.\n", nRet);
ir a limpiar;
}
/* Asocia el token con el usuario común. */
memcpy(stTokenParam.key, pbOtpKey, sizeof(pbOtpKey));
stTokenParam.key_len = sizeof(pbOtpKey);
nRet = DAssignToken(hSessionAdm,
HSM_USR,
(BYTE *)&stTokenParam,
sizeof(stTokenParam));
if( nRet )
{
printf("DAssignToken : ¡Falló! %d.\n", nRet);
ir a limpiar;
}
/*
Cumple la estructura del usuario ordinario.
*/
strncpy(stAuthInfoUser.szAddr, HSM_IP, sizeof(stAuthInfoUser.szAddr));
strncpy(stAuthInfoUser.szUserId, HSM_USR, sizeof(stAuthInfoUser.szUserId));
strncpy(stAuthInfoUser.szContraseña, HSM_PWD, sizeof(stAuthInfoUser.szContraseña));
stAuthInfoUser.nPort = DEFAULT_PORT;
stAuthInfoUser.pbStrongAuth =(BYTE *)cszOTP;
stAuthInfoUser.nStrongAuthLen = (int)sizeof(cszOTP) - 1;
stAuthInfoUser.dwAuthType = SA_AUTH_OTP;
nRet = DOpenSession(&hSessionUser,
(BYTE *)&stAuthInfoUser,
sizeof(struct AUTH_PWD_EX),
si (nRet)
{
printf("DOpenSession (usuario) : ¡Error! %d.\n", nRet);
ir a limpiar;
}
/*
Resincroniza el token OTP del usuario ordinario.
Se utiliza cuando el testigo HOTP(evento) no está sincronizado.
Se pasan 2 OTP consecutivos para que el HSM ajuste la ventana de eventos
*/
nRet = DOATHResync( hSessionAdm,
HSM_USR,
"758993",
"864532",
0);
si (nRet)
{
printf("DOATHResync : ¡Falló! %d.\n", nRet);
ir a limpiar;
}
/*
Desvincula el token del usuario ordinario.
*/
nRet = DUnassignToken( hSessionAdm,
HSM_USR);
si (nRet)
{
printf("DUnassignToken : ¡Falló! %d.\n", nRet);
ir a limpiar;
}
limpia:
DCloseSession(&hSessionUser, 0);
// Remove o usuário criado
if (hSessionAdm != NULL)
{
DRemoveUser(hSessionAdm, HSM_USR);
}
DCloseSession(&hSessionAdm, 0);
devolver nRet;
}
Interfaz de programación de aplicaciones (API) de HSM Dinamo.
void * HSESSIONCTX
Definición dinamo.h:68
#define PUERTO_DEFAULT
Definición dinamo.h:1948
#define CACHE_BYPASS
dinamoDefinición.h:589
#define SA_AUTH_NONE
dinamoDefinición.h:594
#define SA_AUTH_OTP
dinamoDefinición.h:595
unsigned char BYTE
Definición dinamo.h:45
#define LB_BYPASS
dinamoDefinición.h:588
#define OATH_SA_v1_HOTP_DYN_TRUNC_OFF
dinamoDefinición.h:853
#define ENCRYPTED_CONN
dinamoDefinición.h:585
#define OATH_SA_v1_type_SHA1
dinamoDefinición.h:852
#define SS_USR_PWD_EX
dinamoDefinición.h:579
#define AT_OATH_TOKEN
dinamoDefinición.h:844
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 DRemoveUser(HSESSIONCTX hSession, char *szUserId)
int AAP_API DUnassignToken(const HSESSIONCTX hSession, const DWORD dwParam, const char *szUserId)
int AAP_API DAssignToken(const HSESSIONCTX hSession, const char *szUserId, const DWORD dwParam, BYTE *pbData, const DWORD dwDataLen)
int AAP_API DCreateUser(HSESSIONCTX hSession, struct USER_INFO userInfo)
int AAP_API DOATHResync(const HSESSIONCTX hSession, char *szUser, char *szOTP1, char *szOTP2, DWORD dwParam)
dinamoDefinición.h:3101
int nPuerto
Definición dinamo.h:3103
char szUserId[MAX_USR_LEN]
Definición dinamo.h:3104
DWORD dwAuthType
Definición dinamo.h:3106
char szAddr[MAX_ADDR_LEN]
Definición dinamo.h:3102
char szContraseña[MAX_USR_PWD]
Definición dinamo.h:3105
int nStrongAuthLen
dinamoDefinición.h:3112
BYTE * pbStrongAuth
Definición dinamo.h:3111
dinamoDefinición.h:2806
BYTE key_len
Definición dinamo.h:2811
BYTE clave[MAX_OATH_HMAC_LEN]
Definición dinamo.h:2812
Tipo BYTE
Definición dinamo.h:2807
BYTE truncation_offset
Definición dinamo.h:2813
dinamoDefinición.h:3167
char szContraseña[MAX_USR_PWD+1]
Definición dinamo.h:3169
char szUserId[MAX_USR_LEN+1]
Definición dinamo.h:3168