+/* Sign context */
+typedef struct {
+ SilcSshPrivateKey privkey;
+ SilcPKCSSignCb sign_cb;
+ void *context;
+} *SilcSshSign;
+
+/* Sign callback. This formats the signature into SSH2 protocool compliant
+ format. */
+
+static void silc_pkcs_ssh_sign_cb(SilcBool success,
+ const unsigned char *signature,
+ SilcUInt32 signature_len,
+ void *context)
+{
+ SilcSshSign sign = context;
+ SilcBufferStruct sig;
+
+ memset(&sig, 0, sizeof(sig));
+ if (silc_buffer_format(&sig,
+ SILC_STR_UI_INT(7),
+ SILC_STR_UI32_STRING("ssh-"),
+ SILC_STR_UI32_STRING(sign->privkey->pkcs->name),
+ SILC_STR_UI_INT(signature_len),
+ SILC_STR_DATA(signature, signature_len),
+ SILC_STR_END) < 0) {
+ silc_free(sign);
+ sign->sign_cb(FALSE, NULL, 0, sign->context);
+ }
+
+ /* Deliver result */
+ sign->sign_cb(TRUE, silc_buffer_data(&sig), silc_buffer_len(&sig),
+ sign->context);
+
+ silc_buffer_purge(&sig);
+ silc_free(sign);
+}
+