public async void Generate() { Console.Write("Key type (pgp or rsa) and format (msft or pem): "); var line = Console.In.ReadLine().Split(' '); IAuthTypeHandler handler = null; switch (line[0]) { case "rsa": switch (line[1]) { case "msft": handler = new RSAAuthHandlerMsft(); break; case "pem": handler = new RSAAuthHandlerBouncy(); break; default: Console.WriteLine("Invalid key format"); return; } break; case "pgp": switch (line[1]) { case "pem": handler = new OpenPGPAuthHandler(); break; default: Console.WriteLine("Invalid key format (only pem)"); return; } break; default: Console.WriteLine("Invalid key type"); return; } await Generate(handler); }
public async Task <LoginResult> LoginPublicKeyChallenge(int userId, PublicKey publicKey, PrivateKey privateKey, string challenge, string answer, IAuthTypeHandler authTypeHandler) { if (publicKey == null) { throw new ArgumentNullException(nameof(publicKey)); } if (privateKey == null) { throw new ArgumentNullException(nameof(privateKey)); } var user = await GetUser(userId, userId); if (user != null) { throw new ArgumentNullException(nameof(user)); } var result = new LoginResult(); using var answerEncryptedStream = new MemoryStream(Convert.FromBase64String(answer)); using var answerDecryptedStream = new MemoryStream(); await authTypeHandler.DecryptAndVerifyStreamAsync(answerEncryptedStream, answerDecryptedStream, privateKey, publicKey, null); var answerDecrypted = answerDecryptedStream.ToArray(); if (Convert.FromBase64String(challenge).SequenceEqual(answerDecrypted)) { var claims = new Claim[] { new Claim("PublicKey", publicKey.Value), new Claim("PublicKeyType", publicKey.Type.ToString()), new Claim("PublicKeyId", publicKey.Id.ToString()) }; await _signInManager.SignInWithClaimsAsync(user, new AuthenticationProperties() { AllowRefresh = false, ExpiresUtc = DateTime.UtcNow.AddDays(30), IsPersistent = true, IssuedUtc = DateTime.UtcNow, RedirectUri = "/Account/Login", }, claims); } else { result.Error = new Exception("Answer does not match challenge"); } return(result); }