2015-09-03 2 views
1

Я хочу поставить цифровую подпись в формате PDF документ, но я получаю expectionДлина DER составляет более 4 байтов?

длина МЭД более чем 4 байта.

Вот мой код:

public static Asn1EncodableVector GetTimestamp(byte[] signature) 
{ 

     ITSAClient tsc = new TSAClientBouncyCastle("https://wstsa.kibs.mk/wsTSA.asmx", null, null); 
     //return tsc.GetTimeStampToken(null, tsImprint); 
     HashAlgorithm sha = new SHA1CryptoServiceProvider(); 


     //byte[] hash = sha1.ComputeHash(bytData); 
     String ID_TIME_STAMP_TOKEN = "1.2.840.113549.1.9.16.2.14"; // RFC 3161 id-aa-timeStampToken 
     mk.kibs.wstsatest.wsTSATest oWS1 = new mk.kibs.wstsatest.wsTSATest(); 
    // HashAlgorithm sha = new SHA1CryptoServiceProvider(); 

     mk.kibs.wstsatest.TSCheck_Bytes bytes = new mk.kibs.wstsatest.TSCheck_Bytes(); 
     mk.kibs.wstsatest.TSResponse_Bytes b = new mk.kibs.wstsatest.TSResponse_Bytes(); 
     byte[] filename = File.ReadAllBytes(@"C:\Users\nikola.nedelkovski\Desktop\nalozinovi.pdf"); 

     SHA1CryptoServiceProvider shax = new SHA1CryptoServiceProvider(); 
     byte [] hashx = shax.ComputeHash(filename); 
    // Asn1InputStream tempstream = new Asn1InputStream(new MemoryStream(tsc.GetTimeStampToken(null, hashx))); 
     // mk.kibs.wstsatest.TSResponse_Bytes resp1 = oWS1.funGenerateTS_Bytes(hashx); 

     oWS1.Dispose(); 
    //  hashx = b.bytTSToken; 
     //hashx = bytes.bytHashMessage; 
     bytes.bytHashMessage = hashx; 
     Asn1InputStream tempstream = new Asn1InputStream(new MemoryStream(hashx)); 

     Asn1EncodableVector unauthAttributes = new Asn1EncodableVector(); 

     Asn1EncodableVector v = new Asn1EncodableVector(); 
     v.Add(new DerObjectIdentifier(ID_TIME_STAMP_TOKEN)); // id-aa-timeStampToken 
     Asn1Sequence seq = (Asn1Sequence)tempstream.ReadObject(); 
     v.Add(new DerSet(seq)); 

     unauthAttributes.Add(new DerSequence(v)); 
     //return unauthAttributes; 
    // return unauthAttributes; 
     return unauthAttributes; 
    } 

    public static X509Certificate2 GetCertificate() 
    { 
     X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
     st.Open(OpenFlags.ReadOnly); 
     X509Certificate2Collection col = st.Certificates; 
     X509Certificate2 card = null; 
     X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, "Certificates", "Select one to sign", X509SelectionFlag.SingleSelection); 
     if (sel.Count > 0) 
     { 
      X509Certificate2Enumerator en = sel.GetEnumerator(); 
      en.MoveNext(); 
      card = en.Current; 
     } 
     st.Close(); 
     return card; 
} 

Исключение брошено в следующей строке: вы можете найти его в коде упоминается

Asn1Sequence seq = (Asn1Sequence)tempstream.ReadObject(); 

Любая помощь или предложения, пожалуйста?

ответ

1

Ну, вы создаете хэш, который состоит из двоичных байтов, которые могут иметь любое значение. Затем вы выполняете:

Asn1Sequence seq = (Asn1Sequence)tempstream.ReadObject(); 

по двоичным данным, неотличимым от случайных. Случайные двоичные данные не представляют собой последовательность ASN.1.

Вам необходимо перепроектировать ваш метод и понять, что вы делаете. Вполне возможно, вы должны генерировать ASN.1 SEQUENCE самостоятельно, а не разбирать его.

Смежные вопросы