Beispiel #1
0
        public async Task <VerificationResponseModel> VerifyIdentityAsync(VerificationRequestModel requestModel)
        {
            var identityVerificationRequest = _mapper.Map <IdentityVerificationRequest>(requestModel);
            var verified = await _verifier.VerifyAsync(identityVerificationRequest);

            var entity = await _kycRepository.GetByKycIdAsync(requestModel.KycId);

            entity.Status = verified ? KycStatus.VerificationPassed : KycStatus.VerificationFailed;
            await _kycRepository.UpdateAsync(entity);

            var responseModel = _mapper.Map <VerificationResponseModel>(identityVerificationRequest);

            responseModel.UserId     = requestModel.UserId;
            responseModel.IsVerified = verified;

            // Send Kafka Message
            var kafkaMessage = new KafkaMessage <string, VerificationResponseModel>
            {
                Key         = Guid.NewGuid().ToString(),
                Value       = responseModel,
                MessageType = nameof(VerificationResponseModel)
            };

            await _verificationProducer.ProduceAsync(kafkaMessage);

            return(responseModel);
        }
Beispiel #2
0
        /// <summary>
        /// Verifies a <see cref="PasswordRecord"/> by specified password.
        /// </summary>
        public async Task <VerificationResult> VerifyAsync(PasswordRecord pwdRecord, string password)
        {
            var pwdBytes = Bytes.FromString(password);
            var skC      = this.ctx.GetClientSecretKeyForVersion(pwdRecord.Version);
            var pkS      = this.ctx.GetServerPublicKeyForVersion(pwdRecord.Version);
            var c0       = this.ctx.Crypto.ComputeC0(skC, pwdBytes, pwdRecord.ClientNonce, pwdRecord.RecordT0);

            var parameters = new VerificationRequestModel
            {
                AppId        = this.ctx.AppId,
                Version      = pwdRecord.Version,
                Verification = new VerificationModel
                {
                    C0 = c0,
                    Ns = pwdRecord.ServerNonce
                }
            };

            byte[] m = null;

            var serverResult = await this.ctx.Client.VerifyAsync(parameters).ConfigureAwait(false);

            if (serverResult.IsSuccess)
            {
                var proofModel = serverResult.ProofOfSuccess ?? throw new ProofNotProvidedException();

                var proof = new ProofOfSuccess
                {
                    Term1  = proofModel.Term1,
                    Term2  = proofModel.Term2,
                    Term3  = proofModel.Term3,
                    BlindX = proofModel.BlindX,
                };

                var isValid = this.ctx.Crypto.ValidateProofOfSuccess(proof, pkS, pwdRecord.ServerNonce, c0, serverResult.C1);
                if (!isValid)
                {
                    throw new ProofOfSuccessNotValidException();
                }

                m = this.ctx.Crypto.DecryptM(skC, pwdBytes, pwdRecord.ClientNonce, pwdRecord.RecordT1, serverResult.C1);
            }
            else
            {
                var proofModel = serverResult.ProofOfFail ?? throw new ProofNotProvidedException();

                var proof = new ProofOfFail
                {
                    Term1  = proofModel.Term1,
                    Term2  = proofModel.Term2,
                    Term3  = proofModel.Term3,
                    Term4  = proofModel.Term4,
                    BlindA = proofModel.BlindA,
                    BlindB = proofModel.BlindB,
                };

                var isValid = this.ctx.Crypto.ValidateProofOfFail(proof, pkS, pwdRecord.ServerNonce, c0, serverResult.C1);

                if (!isValid)
                {
                    throw new ProofOfFailNotValidException();
                }
            }

            var result = new VerificationResult
            {
                IsSuccess = serverResult.IsSuccess,
                Key       = m
            };

            return(result);
        }