public async Task cancel(SezameCancelCallbackType callback)
        {
            var webRequestHandler = new WebRequestHandler();

            webRequestHandler.ClientCertificates.Add(certificate); // X509Certificate
            var invoker = new SezameRegistrationServiceInvoker(webRequestHandler, true);
            await invoker.CancelAsync();

            var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

            store.Open(OpenFlags.ReadWrite);
            store.Remove(certificate);
            store.Close();

            status       = "new";
            clientcode   = "";
            sharedsecret = "";
            email        = "";
            writeSetting("status", status);
            writeSetting("clientcode", clientcode);
            writeSetting("sharedsecret", sharedsecret);
            writeSetting("email", email);

            callback();
        }
        public async Task register(string email, string applicationName, SezameRegisterCallbackType callback)
        {
            var invoker  = new SezameRegistrationServiceInvoker();
            var response = await invoker.RegisterAsync(email, applicationName);

            clientcode   = response.GetParameter(SezameResultKey.ClientCode);
            sharedsecret = response.GetParameter(SezameResultKey.SharedSecret);
            this.email   = email;
            writeSetting("status", "register");
            writeSetting("clientcode", clientcode);
            writeSetting("sharedsecret", sharedsecret);
            writeSetting("email", email);
            callback(clientcode, sharedsecret);
        }
        public async Task sign(string pemCertificationRequest, SezameSignCallbackType callback)
        {
            var invoker  = new SezameRegistrationServiceInvoker();
            var response = await invoker.SignAsync(pemCertificationRequest, sharedsecret);

            pemCertificate = response.GetParameter(SezameResultKey.Certificate);

            pemCertificate = Regex.Replace(pemCertificate, "-----BEGIN CERTIFICATE-----", "");
            pemCertificate = Regex.Replace(pemCertificate, "-----END CERTIFICATE-----", "");
            var certificateByteData = Convert.FromBase64String(pemCertificate);

            AsymmetricKeyParameter privateKey = keyPair.Private;

            // http://paulstovell.com/blog/x509certificate2
            // Convert X509Certificate to X509Certificate2
            certificate = new X509Certificate2(certificateByteData, "test", X509KeyStorageFlags.Exportable);

            // Convert BouncyCastle Private Key to RSA
            var rsaPriv = DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)keyPair.Private);

            // Setup RSACryptoServiceProvider with "KeyContainerName" set

            var csp = new CspParameters();

            csp.KeyContainerName = "KeyContainer";
            var rsaPrivate = new RSACryptoServiceProvider(csp);

            // Import private key from BouncyCastle's rsa
            rsaPrivate.ImportParameters(rsaPriv.ExportParameters(true));

            // Set private key on our X509Certificate2
            certificate.PrivateKey = rsaPrivate;

            var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

            store.Open(OpenFlags.ReadWrite);
            store.Add(certificate);
            store.Close();

            status = "ready";

            callback(certificate);
        }