Ejemplo n.º 1
0
 protected internal virtual SignatureLevelX VerifyLevelX(AdvancedSignature signature
                                                         , DateTime referenceTime, ValidationContext ctx)
 {
     try
     {
         Result levelReached = new Result();
         levelReached.SetStatus(Result.ResultStatus.VALID, null);
         TimestampVerificationResult[] x1Results   = null;
         TimestampVerificationResult[] x2Results   = null;
         IList <TimestampToken>        timestampX1 = signature.GetTimestampsX1();
         if (timestampX1 != null && !timestampX1.IsEmpty())
         {
             byte[] data = signature.GetTimestampX1Data();
             x1Results = new TimestampVerificationResult[timestampX1.Count];
             for (int i = 0; i < timestampX1.Count; i++)
             {
                 try
                 {
                     TimestampToken t = timestampX1[i];
                     x1Results[i] = new TimestampVerificationResult(t);
                     if (!t.MatchData(data))
                     {
                         levelReached.SetStatus(Result.ResultStatus.INVALID, "timestamp.dont.sign.data");
                         x1Results[i].SetSameDigest(new Result(Result.ResultStatus.INVALID, "timestamp.dont.sign.data"
                                                               ));
                     }
                     else
                     {
                         x1Results[i].SetSameDigest(new Result(Result.ResultStatus.VALID, null));
                     }
                     CheckTimeStampCertPath(t, x1Results[i], ctx, signature);
                 }
                 catch (NoSuchAlgorithmException)
                 {
                     levelReached.SetStatus(Result.ResultStatus.UNDETERMINED, "no.such.algoritm");
                 }
             }
         }
         IList <TimestampToken> timestampX2 = signature.GetTimestampsX2();
         if (timestampX2 != null && !timestampX2.IsEmpty())
         {
             byte[] data = signature.GetTimestampX2Data();
             x2Results = new TimestampVerificationResult[timestampX2.Count];
             int i = 0;
             foreach (TimestampToken t in timestampX2)
             {
                 try
                 {
                     x2Results[i] = new TimestampVerificationResult(t);
                     if (!t.MatchData(data))
                     {
                         levelReached.SetStatus(Result.ResultStatus.INVALID, "timestamp.dont.sign.data");
                         x2Results[i].SetSameDigest(new Result(Result.ResultStatus.INVALID, "timestamp.dont.sign.data"
                                                               ));
                     }
                     else
                     {
                         x2Results[i].SetSameDigest(new Result(Result.ResultStatus.VALID, null));
                     }
                     CheckTimeStampCertPath(t, x2Results[i], ctx, signature);
                 }
                 catch (NoSuchAlgorithmException)
                 {
                     levelReached.SetStatus(Result.ResultStatus.UNDETERMINED, "no.such.algoritm");
                 }
             }
         }
         if ((timestampX1 == null || timestampX1.IsEmpty()) && (timestampX2 == null || timestampX2
                                                                .IsEmpty()))
         {
             levelReached.SetStatus(Result.ResultStatus.INVALID, "no.timestamp");
         }
         return(new SignatureLevelX(signature, levelReached, x1Results, x2Results));
     }
     catch (Exception)
     {
         return(new SignatureLevelX(signature, new Result(Result.ResultStatus.INVALID, "exception.while.verifying"
                                                          )));
     }
 }