1 #define PERL_NO_GET_CONTEXT
8 #include <u2f-server.h>
12 MODULE = PVE::U2F PACKAGE = PVE::U2F
14 #// Context creation and destruction
29 u2fs_ctx_t *ctx = NULL;
30 if (u2fs_init(&ctx) != U2FS_OK) {
31 RETVAL = &PL_sv_undef;
33 RETVAL = newSVpv((char*)&ctx, sizeof(ctx));
42 if (ctx == &PL_sv_undef) {
43 croak("u2fs xs: double free");
45 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
47 sv_setsv(ctx, &PL_sv_undef);
50 #// Context initialization before registration/authentication
53 set_origin_impl(ctx, origin)
57 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
58 RETVAL = u2fs_set_origin(*pctx, origin);
63 set_appid_impl(ctx, appid)
67 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
68 RETVAL = u2fs_set_appid(*pctx, appid);
73 set_challenge_impl(ctx, challenge)
77 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
78 RETVAL = u2fs_set_challenge(*pctx, challenge);
83 set_keyHandle_impl(ctx, keyHandle)
87 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
88 RETVAL = u2fs_set_keyHandle(*pctx, keyHandle);
93 set_publicKey_impl(ctx, publicKey)
95 unsigned char *publicKey
97 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
98 RETVAL = u2fs_set_publicKey(*pctx, publicKey);
102 #// Registration functions
105 registration_challenge_impl(ctx, outref=&PL_sv_undef)
109 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
111 u2fs_rc rc = u2fs_registration_challenge(*pctx, &output);
113 sv_setpv(outref, output);
120 registration_verify_impl(ctx, response, kh=&PL_sv_undef, pk=&PL_sv_undef)
126 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
127 u2fs_reg_res_t *result = NULL;
128 u2fs_rc rc = u2fs_registration_verify(*pctx, response, &result);
130 const char *keyHandle = u2fs_get_registration_keyHandle(result);
131 const char *publicKey_raw = u2fs_get_registration_publicKey(result);
132 char *publicKey = base64(publicKey_raw, U2FS_PUBLIC_KEY_LEN);
133 sv_setpv(kh, keyHandle);
134 sv_setpv(pk, publicKey);
135 free(publicKey); publicKey = NULL;
136 u2fs_free_reg_res(result);
142 #// Authentication functions
144 auth_challenge_impl(ctx, outref=&PL_sv_undef)
148 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
150 u2fs_rc rc = u2fs_authentication_challenge(*pctx, &output);
152 sv_setpv(outref, output);
159 auth_verify_impl(ctx, response, verified=&PL_sv_undef, counter=&PL_sv_undef, presence=&PL_sv_undef)
166 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
167 u2fs_auth_res_t *result = NULL;
168 u2fs_rc rc = u2fs_authentication_verify(*pctx, response, &result);
170 u2fs_rc a_verified = 0;
171 uint32_t a_count = 0;
172 uint8_t a_presence = 0;
173 rc = u2fs_get_authentication_result(result, &a_verified, &a_count, &a_presence);
175 sv_setiv(verified, a_verified);
176 sv_setuv(counter, a_count);
177 sv_setuv(presence, a_presence);
179 u2fs_free_auth_res(result);