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