示例#1
0
        /**
         * Return an appropriate TimeStampResponse.
         * <p>
         * If genTime is null a timeNotAvailable error response will be returned.
         *
         * @param request the request this response is for.
         * @param serialNumber serial number for the response token.
         * @param genTime generation time for the response token.
         * @param provider provider to use for signature calculation.
         * @return
         * @throws NoSuchAlgorithmException
         * @throws NoSuchProviderException
         * @throws TSPException
         * </p>
         */
        public TimeStampResponse Generate(
            TimeStampRequest request,
            BigInteger serialNumber,
            DateTimeObject genTime)
        {
            TimeStampResp resp;

            try
            {
                if (genTime == null)
                {
                    throw new TspValidationException("The time source is not available.",
                                                     PkiFailureInfo.TimeNotAvailable);
                }

                request.Validate(acceptedAlgorithms, acceptedPolicies, acceptedExtensions);

                this.status = PkiStatus.Granted;
                this.AddStatusString("Operation Okay");

                PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();

                ContentInfo tstTokenContentInfo;
                try
                {
                    TimeStampToken token   = tokenGenerator.Generate(request, serialNumber, genTime.Value);
                    byte[]         encoded = token.ToCmsSignedData().GetEncoded();

                    tstTokenContentInfo = ContentInfo.GetInstance(Asn1Object.FromByteArray(encoded));
                }
                catch (IOException e)
                {
                    throw new TspException("Timestamp token received cannot be converted to ContentInfo", e);
                }

                resp = new TimeStampResp(pkiStatusInfo, tstTokenContentInfo);
            }
            catch (TspValidationException e)
            {
                status = PkiStatus.Rejection;

                this.SetFailInfoField(e.FailureCode);
                this.AddStatusString(e.Message);

                PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();

                resp = new TimeStampResp(pkiStatusInfo, null);
            }

            try
            {
                return(new TimeStampResponse(resp));
            }
            catch (IOException e)
            {
                throw new TspException("created badly formatted response!", e);
            }
        }
 private CertStatus(Asn1Sequence seq)
 {
     certHash = Asn1OctetString.GetInstance(seq[0]);
     certReqId = DerInteger.GetInstance(seq[1]);
     if (seq.Count > 2)
     {
         statusInfo = PkiStatusInfo.GetInstance(seq[2]);
     }
 }
示例#3
0
 public virtual PkiStatusInfo[] GetStatus()
 {
     PkiStatusInfo[] array = new PkiStatusInfo[status.Count];
     for (int i = 0; i != array.Length; i++)
     {
         array[i] = PkiStatusInfo.GetInstance(status[i]);
     }
     return(array);
 }
示例#4
0
 public ErrorMsgContent(PkiStatusInfo pkiStatusInfo, DerInteger errorCode, PkiFreeText errorDetails)
 {
     if (pkiStatusInfo == null)
     {
         throw new ArgumentNullException("pkiStatusInfo");
     }
     this.pkiStatusInfo = pkiStatusInfo;
     this.errorCode     = errorCode;
     this.errorDetails  = errorDetails;
 }
示例#5
0
 public virtual RevRepContentBuilder Add(PkiStatusInfo status, CertId certId)
 {
     if (this.status.Count != revCerts.Count)
     {
         throw new InvalidOperationException("status and revCerts sequence must be in common order");
     }
     this.status.Add(status);
     revCerts.Add(certId);
     return(this);
 }
示例#6
0
        private TimeStampResp(
            Asn1Sequence seq)
        {
            this.pkiStatusInfo = PkiStatusInfo.GetInstance(seq[0]);

            if (seq.Count > 1)
            {
                this.timeStampToken = ContentInfo.GetInstance(seq[1]);
            }
        }
        public override void Respond(HttpListenerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (!string.Equals(context.Request.ContentType, RequestContentType, StringComparison.OrdinalIgnoreCase))
            {
                context.Response.StatusCode = 400;

                return;
            }

            var           bytes   = ReadRequestBody(context.Request);
            var           request = new TimeStampRequest(bytes);
            PkiStatusInfo statusInfo;
            BcContentInfo timeStampToken = null;

            if (_options.ReturnFailure)
            {
                statusInfo = new PkiStatusInfo(
                    (int)PkiStatus.Rejection,
                    new PkiFreeText(new DerUtf8String("Unsupported algorithm")),
                    new PkiFailureInfo(PkiFailureInfo.BadAlg));
            }
            else
            {
                statusInfo = new PkiStatusInfo((int)PkiStatus.Granted);

                var generalizedTime = DateTime.UtcNow;

                if (_options.GeneralizedTime.HasValue)
                {
                    generalizedTime = _options.GeneralizedTime.Value.UtcDateTime;
                }

                CmsSignedData timestamp = GenerateTimestamp(request, _nextSerialNumber, generalizedTime);

                timeStampToken = timestamp.ContentInfo;
            }

            _serialNumbers.Add(_nextSerialNumber);
            _nextSerialNumber = _nextSerialNumber.Add(BigInteger.One);

            context.Response.ContentType = ResponseContentType;

            var response = new TimeStampResp(statusInfo, timeStampToken);

            WriteResponseBody(context.Response, response.GetEncoded());
        }
示例#8
0
 public CertResponse(DerInteger certReqId, PkiStatusInfo status, CertifiedKeyPair certifiedKeyPair, Asn1OctetString rspInfo)
 {
     if (certReqId == null)
     {
         throw new ArgumentNullException("certReqId");
     }
     if (status == null)
     {
         throw new ArgumentNullException("status");
     }
     this.certReqId        = certReqId;
     this.status           = status;
     this.certifiedKeyPair = certifiedKeyPair;
     this.rspInfo          = rspInfo;
 }
示例#9
0
        public TimeStampResponse Generate(TimeStampRequest request, BigInteger serialNumber, DateTimeObject genTime)
        {
            //IL_0076: Expected O, but got Unknown
            //IL_00cf: Expected O, but got Unknown
            TimeStampResp resp;

            try
            {
                if (genTime == null)
                {
                    throw new TspValidationException("The time source is not available.", 512);
                }
                request.Validate(acceptedAlgorithms, acceptedPolicies, acceptedExtensions);
                status = PkiStatus.Granted;
                AddStatusString("Operation Okay");
                PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();
                ContentInfo   instance;
                try
                {
                    TimeStampToken timeStampToken = tokenGenerator.Generate(request, serialNumber, genTime.Value);
                    byte[]         encoded        = timeStampToken.ToCmsSignedData().GetEncoded();
                    instance = ContentInfo.GetInstance(Asn1Object.FromByteArray(encoded));
                }
                catch (IOException val)
                {
                    IOException e = val;
                    throw new TspException("Timestamp token received cannot be converted to ContentInfo", (global::System.Exception)(object) e);
                }
                resp = new TimeStampResp(pkiStatusInfo, instance);
            }
            catch (TspValidationException ex)
            {
                status = PkiStatus.Rejection;
                SetFailInfoField(ex.FailureCode);
                AddStatusString(((global::System.Exception)ex).get_Message());
                PkiStatusInfo pkiStatusInfo2 = GetPkiStatusInfo();
                resp = new TimeStampResp(pkiStatusInfo2, null);
            }
            try
            {
                return(new TimeStampResponse(resp));
            }
            catch (IOException val2)
            {
                IOException e2 = val2;
                throw new TspException("created badly formatted response!", (global::System.Exception)(object) e2);
            }
        }
示例#10
0
 private ErrorMsgContent(Asn1Sequence seq)
 {
     pkiStatusInfo = PkiStatusInfo.GetInstance(seq[0]);
     for (int i = 1; i < seq.Count; i++)
     {
         Asn1Encodable asn1Encodable = seq[i];
         if (asn1Encodable is DerInteger)
         {
             errorCode = DerInteger.GetInstance(asn1Encodable);
         }
         else
         {
             errorDetails = PkiFreeText.GetInstance(asn1Encodable);
         }
     }
 }
示例#11
0
    public TimeStampResponse GenerateFailResponse(PkiStatus status, int failInfoField, string statusString)
    {
        this.status = status;
        SetFailInfoField(failInfoField);
        if (statusString != null)
        {
            AddStatusString(statusString);
        }
        PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();
        TimeStampResp resp          = new TimeStampResp(pkiStatusInfo, null);

        try
        {
            return(new TimeStampResponse(resp));
        }
        catch (IOException e)
        {
            throw new TspException("created badly formatted response!", e);
        }
    }
示例#12
0
        public TimeStampResponse GenerateFailResponse(PkiStatus status, int failInfoField, string statusString)
        {
            //IL_0031: Expected O, but got Unknown
            this.status = status;
            SetFailInfoField(failInfoField);
            if (statusString != null)
            {
                AddStatusString(statusString);
            }
            PkiStatusInfo pkiStatusInfo = GetPkiStatusInfo();
            TimeStampResp resp          = new TimeStampResp(pkiStatusInfo, null);

            try
            {
                return(new TimeStampResponse(resp));
            }
            catch (IOException val)
            {
                IOException e = val;
                throw new TspException("created badly formatted response!", (global::System.Exception)(object) e);
            }
        }
示例#13
0
 public CertResponse(DerInteger certReqId, PkiStatusInfo status)
     : this(certReqId, status, null, null)
 {
 }
示例#14
0
 public TimeStampResp(PkiStatusInfo pkiStatusInfo, ContentInfo timeStampToken)
 {
     this.pkiStatusInfo  = pkiStatusInfo;
     this.timeStampToken = timeStampToken;
 }
示例#15
0
 public ErrorMsgContent(PkiStatusInfo pkiStatusInfo)
     : this(pkiStatusInfo, null, null)
 {
 }
        /// <summary>
        /// Retrieves the <see cref="TimeStampRequest"/> from the <see cref="TspHttpRequest"/>
        /// </summary>
        /// <param name="tspHttpRequest"><see cref="TspHttpRequest"/></param>
        /// <returns><see cref="TspReqResult"/> containing the <see cref="TimeStampRequest"/> and the <see cref="PkiStatusInfo"/></returns>
        private TspReqResult GetTimeStampRequest(TspHttpRequest tspHttpRequest)
        {
            // Validates the header of the request
            if (tspHttpRequest.MediaType != "application/timestamp-query")
            {
                var pkiStatusInfo = new PkiStatusInfo(
                    (int)PkiStatus.Rejection,
                    new PkiFreeText(new DerUtf8String("Content type is not 'application/timestamp-query'.")),
                    new PkiFailureInfo(PkiFailureInfo.BadRequest));

                return(new TspReqResult
                {
                    PkiStatusInfo = pkiStatusInfo
                });
            }

            // Try to create  the TimeStampRequest from the http request
            TimeStampRequest timeStampRequest;

            try
            {
                timeStampRequest = new TimeStampRequest(tspHttpRequest.Content);
            }
            catch (Exception)
            {
                var pkiStatusInfo = new PkiStatusInfo(
                    (int)PkiStatus.Rejection,
                    new PkiFreeText(new DerUtf8String("Query in bad format")),
                    new PkiFailureInfo(PkiFailureInfo.BadDataFormat));

                return(new TspReqResult
                {
                    PkiStatusInfo = pkiStatusInfo
                });
            }

            // Validates whether the request uses accepted hash algorithms
            if (AcceptedAlgorithms.All(algorithm => algorithm.Id != timeStampRequest.MessageImprintAlgOid))
            {
                var pkiStatusInfo = new PkiStatusInfo(
                    (int)PkiStatus.Rejection,
                    new PkiFreeText(new DerUtf8String("Hash Algorithm is not accepted.")),
                    new PkiFailureInfo(PkiFailureInfo.BadAlg));

                return(new TspReqResult
                {
                    PkiStatusInfo = pkiStatusInfo
                });
            }

            // Validates whether the hashed message length matches the digest length of the hash algorithm
            if (timeStampRequest.GetMessageImprintDigest().Length != TspAlgorithmUtil.GetDigestLength(new DerObjectIdentifier(timeStampRequest.MessageImprintAlgOid)))
            {
                var pkiStatusInfo = new PkiStatusInfo(
                    (int)PkiStatus.Rejection,
                    new PkiFreeText(new DerUtf8String("Digest length is not equal the message imprint length.")),
                    new PkiFailureInfo(PkiFailureInfo.BadDataFormat));

                return(new TspReqResult
                {
                    PkiStatusInfo = pkiStatusInfo
                });
            }

            // Validates whether the TSA accepts the policy for stamping
            if (timeStampRequest.ReqPolicy != null && timeStampRequest.ReqPolicy != BcTimeStampResponderRepository.GetPolicyOid())
            {
                var pkiStatusInfo = new PkiStatusInfo(
                    (int)PkiStatus.Rejection,
                    new PkiFreeText(new DerUtf8String("TSP policy is unknown.")),
                    new PkiFailureInfo(PkiFailureInfo.UnacceptedPolicy));

                return(new TspReqResult
                {
                    PkiStatusInfo = pkiStatusInfo
                });
            }

            // Validates whether the TSA accepts the extensions
            if (timeStampRequest.HasExtensions)
            {
                var acceptedExtensions = BcTimeStampResponderRepository.GetAcceptedExtensions();
                var extensions         = timeStampRequest.GetExtensionOids()
                                         .Cast <DerObjectIdentifier>()
                                         .Select(oid => timeStampRequest.GetExtension(oid));

                if (extensions.Any(e => !acceptedExtensions.Any(a => a.IsCritical == e.IsCritical && Equals(a.Value, e.Value))))
                {
                    var pkiStatusInfo = new PkiStatusInfo(
                        (int)PkiStatus.Rejection,
                        new PkiFreeText(new DerUtf8String("TSP does not recognizes any extensions")),
                        new PkiFailureInfo(PkiFailureInfo.UnacceptedExtension));

                    return(new TspReqResult
                    {
                        PkiStatusInfo = pkiStatusInfo
                    });
                }
            }

            // returns the time stamp request with granted status
            return(new TspReqResult
            {
                PkiStatusInfo = new PkiStatusInfo((int)PkiStatus.Granted),
                TimeStampRequest = timeStampRequest
            });
        }
示例#17
0
 public CertStatus(byte[] certHash, BigInteger certReqId, PkiStatusInfo statusInfo)
 {
     this.certHash = new DerOctetString(certHash);
     this.certReqId = new DerInteger(certReqId);
     this.statusInfo = statusInfo;
 }
示例#18
0
 public virtual RevRepContentBuilder Add(PkiStatusInfo status)
 {
     this.status.Add(status);
     return(this);
 }