public void ParseWithRsa1985KeyDkimRecord() { IRsaPublicKeyEvaluator rsaPublicKeyEvaluator = A.Fake <IRsaPublicKeyEvaluator>(); int anOut; A.CallTo(() => rsaPublicKeyEvaluator.TryGetKeyLengthSize(A <string> ._, out anOut)).Returns(true).AssignsOutAndRefParameters(1985); IDkimRecordParser parser = Create(rsaPublicKeyEvaluator); string record = "v=DKIM1;" + "k=rsa;" + "n=hello world;" + "s=*;" + "h=sha256;" + "t=y;" + "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvtzV5FCafF4GWCsuV0qhyDpV8pz7QrFxF8JABDl+kewpUIhTRujuKQbeAIuPzbiTe0djy1tPIyzEASChfPpSg7C9RrJlKlluyYN1H4ORJQsnAuwAy8+Eur+Zjo1o6xItxsac9RUvl4eCm8ZSkhtdu1HMRV0+rq2S1+E0cqwyO7xw2alhLRmu96Dgy2j4dz/8teguAUEaNGQECcd7h7DM" + "8vo8IZgyJHJdaMQHX7zhuRUP8fjsrD5YUfOsm/kzSJfSKEk9cXwKk8p5QoiHG+W4/tc/nyl+uqz9fUF/K0d9qCvHE31mu3to2GCakABPU9XpczhIwYkGB6ASdd53PKhXJwIDAQAB"; DkimRecord dkimRecord = parser.Parse(new DnsRecord(record, new List <string>())); Assert.That(dkimRecord.Errors.Count, Is.EqualTo(1)); Assert.That(dkimRecord.Errors.First().ErrorType, Is.EqualTo(EvaluationErrorType.Warning)); Assert.That(dkimRecord.Errors.First().Id, Is.EqualTo(Guid.Parse("d16be8d5-8ed6-4dd0-a8aa-c8f1380a8d3c"))); }
public Task <List <EvaluationError> > Evaluate(DkimRecord record) { PublicKeyData publicKeyData = record.Tags.OfType <PublicKeyData>().FirstOrDefault(); PublicKeyType publicKeyType = record.Tags.OfType <PublicKeyType>().FirstOrDefault(); List <EvaluationError> errors = new List <EvaluationError>(); if (publicKeyData != null && publicKeyType != null && !string.IsNullOrEmpty(publicKeyData.Value)) { if (publicKeyType.KeyType != KeyType.Unknown) { switch (publicKeyType.KeyType) { case KeyType.Ed25519: break; case KeyType.Rsa: string key = publicKeyData.Value.TrimEnd(';'); if (!_publicKeyEvaluator.TryGetKeyLengthSize(key, out int keyLength)) { Guid Error3Id = Guid.Parse("21B09D43-685C-4CAE-989E-7194CA093863"); errors.Add(new EvaluationError(Error3Id, EvaluationErrorType.Error, DKimEvaluatorRulesResources.CorruptPublicKeyErrorMessage, DKimEvaluatorRulesMarkdownResources.CorruptPublicKeyErrorMessage)); } else if (keyLength < 2048) { if (keyLength < 1024) { Guid Error1Id = Guid.Parse("C740A1B0-394B-4397-A4E6-178C3137A84D"); errors.Add(new EvaluationError(Error1Id, EvaluationErrorType.Error, string.Format(DKimEvaluatorRulesResources.PublicKeyIsToShortErrorMessage, keyLength), string.Empty)); } else if (keyLength >= 1024 && keyLength < 2048) { Guid Error2Id = Guid.Parse("D16BE8D5-8ED6-4DD0-A8AA-C8F1380A8D3C"); errors.Add(new EvaluationError(Error2Id, EvaluationErrorType.Warning, string.Format( DKimEvaluatorRulesResources.PublicKeyIsToShortUseLongerErrorMessage, keyLength), string.Empty)); } } break; } } else { Guid Error3Id = Guid.Parse("FF2380B4-8DE6-4B97-B69A-F3382EBF3DE2"); errors.Add(new EvaluationError(Error3Id, EvaluationErrorType.Error, DKimEvaluatorRulesResources.IncorrectPublicKeyConfigured, DKimEvaluatorRulesMarkdownResources.IncorrectPublicKeyConfigured)); } } else { Guid Error3Id = Guid.Parse("7150FEC3-0464-4CD5-B774-D1D7BCFF7EC5"); errors.Add(new EvaluationError(Error3Id, EvaluationErrorType.Info, DKimEvaluatorRulesResources.NullPublicKeyConfigured, DKimEvaluatorRulesMarkdownResources.NullPublicKeyConfigured)); } return(Task.FromResult(errors)); }