+typedef struct {
+ SilcStack stack;
+ unsigned char *pubdata;
+ SilcUInt32 pubdata_len;
+ SilcAuthGenerated generated;
+ void *context;
+} *SilcAuthGenerateContext;
+
+/* Signature callback */
+
+static void
+silc_auth_public_key_auth_generate_cb(SilcBool success,
+ const unsigned char *signature,
+ SilcUInt32 signature_len,
+ void *context)
+{
+ SilcAuthGenerateContext a = context;
+ SilcStack stack = a->stack;
+ SilcBuffer buf;
+
+ if (!success) {
+ a->generated(NULL, context);
+ silc_sfree(stack, a->pubdata);
+ silc_sfree(stack, a);
+ silc_stack_free(stack);
+ return;
+ }
+
+ /* Encode Authentication Payload */
+ buf = silc_auth_payload_encode(stack, SILC_AUTH_PUBLIC_KEY, a->pubdata,
+ a->pubdata_len, signature, signature_len);
+
+ a->generated(buf, context);
+
+ silc_buffer_sfree(stack, buf);
+ silc_sfree(stack, a->pubdata);
+ silc_sfree(stack, a);
+ silc_stack_free(stack);
+}
+