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); }
/// <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); }