Как добавить метку времени на цифровую подпись с помощью cmsSigner - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь установить метку времени в своей подписи с помощью SignedCms, мне удалось вернуть метку времени восстановления замка, но мне нужно применить метку времени сервера авторизации в моей подписи.

Я пытался добавить UnsignedAttributes, но безрезультатно.

Это мой код подписи:

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);
        }
    }

Я хочу включить отметку времени в цифровую подпись и информацию о том, что она была проверена сервером авторизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...