1 #define PERL_NO_GET_CONTEXT
8 #include <u2f-server.h>
10 MODULE = PVE::U2F PACKAGE = PVE::U2F
12 #// Context creation and destruction
27 u2fs_ctx_t *ctx = NULL;
28 if (u2fs_init(&ctx) != U2FS_OK) {
29 RETVAL = &PL_sv_undef;
31 RETVAL = newSVpv((char*)&ctx, sizeof(ctx));
40 if (ctx == &PL_sv_undef) {
41 croak("u2fs xs: double free");
43 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
45 sv_setsv(ctx, &PL_sv_undef);
48 #// Context initialization before registration/authentication
51 set_origin_impl(ctx, origin)
55 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
56 RETVAL = u2fs_set_origin(*pctx, origin);
61 set_appid_impl(ctx, appid)
65 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
66 RETVAL = u2fs_set_appid(*pctx, appid);
71 set_challenge_impl(ctx, challenge)
75 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
76 RETVAL = u2fs_set_challenge(*pctx, challenge);
81 set_keyHandle_impl(ctx, keyHandle)
85 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
86 RETVAL = u2fs_set_keyHandle(*pctx, keyHandle);
91 set_publicKey_impl(ctx, publicKey)
93 unsigned char *publicKey
95 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
96 RETVAL = u2fs_set_publicKey(*pctx, publicKey);
100 #// Registration functions
103 registration_challenge_impl(ctx, outref=&PL_sv_undef)
107 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
109 u2fs_rc rc = u2fs_registration_challenge(*pctx, &output);
111 sv_setpv(outref, output);
118 registration_verify_impl(ctx, response, kh=&PL_sv_undef, pk=&PL_sv_undef)
124 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
125 u2fs_reg_res_t *result = NULL;
126 u2fs_rc rc = u2fs_registration_verify(*pctx, response, &result);
128 const char *keyHandle = u2fs_get_registration_keyHandle(result);
129 const char *publicKey = u2fs_get_registration_publicKey(result);
130 sv_setpv(kh, keyHandle);
131 sv_setpv(pk, publicKey);
132 u2fs_free_reg_res(result);
138 #// Authentication functions
140 auth_challenge_impl(ctx, outref=&PL_sv_undef)
144 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
146 u2fs_rc rc = u2fs_authentication_challenge(*pctx, &output);
148 sv_setpv(outref, output);
155 auth_verify_impl(ctx, response, verified=&PL_sv_undef, counter=&PL_sv_undef, presence=&PL_sv_undef)
162 u2fs_ctx_t **pctx = (u2fs_ctx_t**)SvPV_nolen(ctx);
163 u2fs_auth_res_t *result = NULL;
164 u2fs_rc rc = u2fs_authentication_verify(*pctx, response, &result);
166 u2fs_rc a_verified = 0;
167 uint32_t a_count = 0;
168 uint8_t a_presence = 0;
169 rc = u2fs_get_authentication_result(result, &a_verified, &a_count, &a_presence);
171 sv_setiv(verified, a_verified);
172 sv_setuv(counter, a_count);
173 sv_setuv(presence, a_presence);
175 u2fs_free_auth_res(result);