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);
        }
Example #2
0
        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);
        }