Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用cmsSigner在数字签名上添加时间戳_C#_Timestamp_Bouncycastle - Fatal编程技术网

C# 如何使用cmsSigner在数字签名上添加时间戳

C# 如何使用cmsSigner在数字签名上添加时间戳,c#,timestamp,bouncycastle,C#,Timestamp,Bouncycastle,我尝试使用SignedCms在签名上设置时间戳,我成功返回castle bouncy的Timestank,但我需要在签名上实现授权服务器的时间戳 我尝试添加未签名的属性,但没有效果 这是我的签名码: static public byte[] SignMsg(Byte[] msg, X509Certificate2 signerCert, bool detached, Arquivo arquivo) { ContentInfo contentInfo = new

我尝试使用SignedCms在签名上设置时间戳,我成功返回castle bouncy的Timestank,但我需要在签名上实现授权服务器的时间戳

我尝试添加未签名的属性,但没有效果

这是我的签名码:

static public byte[] SignMsg(Byte[] msg, X509Certificate2 signerCert, bool detached, Arquivo arquivo)
    {    
        ContentInfo contentInfo = new ContentInfo(msg);
        SignedCms signedCms = new SignedCms(contentInfo, detached);
        CmsSigner cmsSigner = new CmsSigner(signerCert);

        cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;
        NetworkCredential myCred = new NetworkCredential(
            "user", "pass");

            CredentialCache myCache = new CredentialCache();

            myCache.Add(new Uri("http://tsatest2.digistamp.com/tsa"), "Basic", myCred);

        UserCredentials user = new UserCredentials(myCred);
        var d = RequestTimeStampToken("http://tsatest2.digistamp.com/tsa", arquivo.arquivo,null, user);
        var x = d.Time;
        var chain = new X509Chain();
        System.Security.Cryptography.AsnEncodedData timeData = new Pkcs9AttributeObject(Oid.SHA256.OID, d.EncodedToken);
        cmsSigner.UnsignedAttributes.Add(timeData);

        signedCms.ComputeSignature(cmsSigner, false);
        return signedCms.Encode();
}
这是我对请求的答复:

public static TimeStampToken RequestTimeStampToken(string tsaUri, string pathToFile)
    {
        return RequestTimeStampToken(tsaUri, pathToFile, null, null);
    }

public static TimeStampToken RequestTimeStampToken(string tsaUri, string pathToFileToTimestamp, Oid digestType, UserCredentials credentials)
    {
        if (null == pathToFileToTimestamp)
        {
            throw new ArgumentNullException("pathToFileToTimestamp");
        }

        using (FileStream fs = new FileStream(pathToFileToTimestamp, FileMode.Open, FileAccess.Read))
        {
            return RequestTimeStampToken(tsaUri, fs, digestType, credentials);
        }
}

public static TimeStampToken RequestTimeStampToken(string tsaUri, Stream dataToTimestamp, Oid digestType, UserCredentials credentials)
    {
        if (null == tsaUri)
        {
            throw new ArgumentNullException("tsaUri");
        }

        if (null == dataToTimestamp)
        {
            throw new ArgumentNullException("dataToTimestamp");
        }

        if (null == digestType)
        {
            digestType = Oid.SHA512;
        }

        byte[] digest = DigestUtils.ComputeDigest(dataToTimestamp, digestType);
        Request request = new Request(digest, digestType.OID);
        return RequestTST(tsaUri, request, credentials);
}


private static TimeStampToken RequestTST(string tsaUri, Request request, UserCredentials credentials = null)
    {
        byte[] responseBytes = null;
        UriBuilder urib = new UriBuilder(tsaUri);

        switch (urib.Uri.Scheme)
        {
            case "http":
            case "https":
                responseBytes = GetHttpResponse(tsaUri, request.ToByteArray(), credentials);
                break;
            case "tcp":
                responseBytes = GetTcpResponse(tsaUri, request.ToByteArray());
                break;
            default:
                throw new TimeStampException("Unknown protocol.");
        }

        Response response = new Response(responseBytes);
        ValidateResponse(request, response);
        return response.TST;
}

public Response(byte[] response)
    {
        if (null == response)
        {
            throw new ArgumentNullException("response");
        }

        this.response = new TimeStampResponse(response);

        if (null != this.response.TimeStampToken)
        {
            Org.BouncyCastle.Asn1.Tsp.TimeStampResp asn1Response = Org.BouncyCastle.Asn1.Tsp.TimeStampResp.GetInstance(Org.BouncyCastle.Asn1.Asn1Sequence.FromByteArray(response));
            var derTst = asn1Response.TimeStampToken.GetDerEncoded();

            this.TST = new TimeStampToken(derTst);
        }
    }
我希望在数字签名中包含时间戳,以及授权服务器验证的信息