===== İmza Doğrulama İşlemleri ===== İmza doğrulama işlemi birçok kontrolcünün bir araya gelmesiyle yapılmaktadır. Bu kontrolcüler, imzanın yapısal kontrollerinden ve sertifika kontrollerinden oluşmaktadır. Sertifika kontrolleri sertifikanın yapısal kontrollerinden, sertifikanın güvenilir bir kökten verilmiş olmasından ve sertifika iptal kontrolünden oluşmaktadır. Sertifika iptal kontrolü için sertifikayı veren kuruluşun yayınlandığı uygun zamanlı SİL veya ÇİSDUP bilgisine ihtiyaç duyulmaktadır. Sertifika doğrulama işlemi için, sertifika doğrulama işleminin konfigurasyonunu barındıran xml formatında politika dosyasına ihtiyaç vardır. Bu xml dosyası dışında birçok parametre kullanılabilir. Bu parametrelere [[esya:cades:imza-parametreler |Parametreler]] bölümünden veya ''EParameters'' sınıfından bakabilirsiniz. İmzalanmış verinin doğrulama işleminden ''SignedDataValidation'' sınıfı sorumludur. ''SignedDataValidation'' sınıfının ''verify(…)'' methodu kullanılarak, imza doğrulama işlemi gerçeklenir. ''verify(…)'' fonksiyonu imzalanmış verinin byte array halini ve imzalanmış verinin hangi parametrelere göre doğrulanacağı bilgisini alır. ''SignedDataValidation'' sınıfındaki ''verify(…)'' fonksiyonu ile imzalanmış döküman, bir bütün halinde doğrulanır. İçindeki imzalardan biri doğrulanamamışsa, ''verify(…)'' fonksiyonu başarısız değer döner. İmza doğrulama yapan örnek kod bloğu; byte[] signedData = AsnIO.dosyadanOKU(SIGNATURE_FILE); ValidationPolicy policy= PolicyReader.readValidationPolicy(new FileInputStream(POLICY_FILE)); Hashtable params = new Hashtable(); params.put(EParameters.P_CERT_VALIDATION_POLICY, policy); SignedDataValidation sdv = new SignedDataValidation(); SignedDataValidationResult sdvr = sdv.verify(signedData, params); if(sdvr.getSDStatus() != SignedData_Status.ALL_VALID) System.out.println("İmzaların hepsi doğrulamadı"); System.out.println(sdvr.toString()); byte[] signedData = AsnIO.dosyadanOKU(SIGNATURE_FILE); ValidationPolicy policy = PolicyReader.readValidationPolicy(new FileStream(POLICY_FILE, FileMode.Open, FileAccess.Read)); Dictionary params_ = new Dictionary(); params_[EParameters.P_CERT_VALIDATION_POLICY] = policy; SignedDataValidation sdv = new SignedDataValidation(); SignedDataValidationResult sdvr = sdv.verify(signedData, params_); if (sdvr.getSDStatus() != SignedData_Status.ALL_VALID) Console.WriteLine("İmzaların hepsi doğrulamadı"); Console.WriteLine(sdvr.ToString()); Eğer imza bütünleşik ise, ''BaseSignedData'' sınıfının ''getContent()'' fonksiyonu ile imzalanan içerik alınabilir. ==== İmza Doğrulama Sonucu ==== ''SignedDataValidation'' sınıfının ''verify(...)'' fonksiyonu doğrulama sonucu olarak ''SignatureValidationResult'' tipinde bir nesne döner. ''getSDStatus()'' fonksiyonu, eğer bütün imzalar doğrulanmış ise ''ALL_VALID'', eğer imzalardan en az bir tanesi doğrulanamamışsa ''NOT_ALL_VALID'' döner. ''SignedDataValidation'' nesnesinin ''toString()'' metodu, bütün imzalar için kontrol sonucu açıklamalarını döner. Eğer özellikle bir imzanın sonucu elde edilmek isteniyorsa, bu sonuç imza ağacında gezerek elde edilebilir. Bu ağaç yapısı, BaseSignedData yapısındaki imzaların veri yapısı ile aynıdır. Örneğin birinci paralel imzanın, birinci seri imzasına ve bu imzanın doğrulama sonucuna aşağıdaki örnek kod ile ulaşılabilir. BaseSignedData bs = getBaseSignedData(); SignedDataValidationResult sdvr = getValidationResult(); SignerfirstCounterSigner = bs.getSignerList().get(0).getCounterSigners().get(0); SignatureValidationResultfirstCounterSignerVR = sdvr. getSDValidationResults().get(0). getCounterSigValidationResults(). get(0); BaseSignedData bs = getBaseSignedData(); SignedDataValidationResult sdvr = getValidationResult(); Signer firstCounterSigner = bs.getSignerList()[0].getCounterSigners()[0]; SignatureValidationResult firstCounterSignerVR = sdvr.getSDValidationResults()[0]. getCounterSigValidationResults()[0]; Her imzanın doğrulama sonucu ''SignatureValidationResult'' nesnelerinde tutulur. Bir imzacının doğrulama sonucundan, seri imzacılarının doğrulama sonuçlarına da erişilebilir. ''SignatureValidationResult'' nesnelerinin ''toString()'' fonksiyonu, imzacının ve seri imzacıların doğrulama kontrolcülerinin sonuçlarını döner. Eğer sadece o imzaya ait kontrolcülerin açıklamaları elde edilmek isteniyorsa ''getValidationDetails()'' fonksiyonunu kullanılmalıdır. İmza tipi geliştikçe, kontrol edilmesi gereken yapı ve sertifika sayısı artmaktadır. Zaman damgaları, imza yapısına bir imza olarak eklendiklerinden ayrıca bir imza olarak kontrol edilmektedirler. ''SignatureValidationResult'' nesnesinden bir imzanın doğrulama sonucu ''getSignatureStatus()'' fonksiyonu ile ''Signature_Status'' yapısında alınabilir. Eğer imza sonucu ''INCOMPLETE'' ise sertifika doğrulama verisine ulaşılamamıştır. ==== Ön Doğrulama ==== Bir imzanın doğrulanması için, imza atıldıktan sonra sertifika iptal bilgilerinin güncellenebilmesi için belirli bir süre geçmesi gerekmektedir. Bu süreye "kesinleşme süresi"(grace period) denilmektedir. API'de bu süre ''P_GRACE_PERIOD'' parametresi ile ayarlanabilir; varsayılan değeri 86400 saniye yani 24 saattir. Bir imza doğrulanmaya çalışıldığında, kesinleşme süresi bitmemiş olsa bile imza ve sertifika doğrulanabilmektedir. Öndoğrulama denilen bu doğrulama bir kesinlik içermemektedir. Kesin bir doğrulama yapılabilmesi için kesinleşme süresinin geçmesi gerekmektedir. Bir imzanın doğrulanmasının ön doğrulama olduğunu aşağıdaki örnek kod ile öğrenebilirsiniz. Ön doğrulama için olgunlaşmamış anlamına gelen "PREMATURE" kelimesi, kesinleşmiş imza için olgunlaşmış anlamına gelen "MATURE" kelimesi kullanılmaktadır. ''SignatureValidationResult'' nesnesinin ''getValidationState()'' fonksiyonu ile ön doğrulama yapılıp yapılmadığı bilgisi alınabilir. SignedDataValidationResultsdvr = getValidationResult(); if(sdvr.getSDValidationResults(). get(0).getValidationState() == ValidationState.PREMATURE) System.out.println("Ön doğrulama yapıldı."); SignedDataValidationResult sdvr = getValidationResult(); if (sdvr.getSDValidationResults()[0].getValidationState() == ValidationState.PREMATURE) Console.WriteLine("Ön doğrulama yapıldı"); Ön doğrulama ile kesin doğrulama arasında doğabilecek fark; ön doğrulama sırasında geçerli olan bir sertifikanın, kesin doğrulamada iptal edilmiş olabilmesidir. Kullanıcı akıllı kartını çaldırdığında bu senaryo ile karşılaşılabilir. ÇiSDuP için kesinleşme süresi kısa olabilmektedir. Yalnız iptal bilgileri için SİL kullanılıyorsa bu süre uzayabilmektedir. "E-İmza Profilleri" dökümanı ÇiSDuP kullanıldığında kesinleşme süresinin çok kısa olduğundan yok sayılabileceğini öngörüyor. ÇiSDuP kullanarak sertifika doğrulama yapıldığında, kesinleşme süresi için beklenmediğinden büyük avantaj sağlanmaktadır. ==== Ayrık İmzanın Doğrulanması ==== Ayrık imza doğrulanırken, imzalanan dökümanının parametre olarak verilmesi gerekmektedir.Bunun için ''P_EXTERNAL_CONTENT'' parametresine ISignable türünden nesne verilmelidir. byte[] signedData = AsnIO.dosyadanOKU(SIGNATURE_FILE); ISignable content = new SignableFile(new File(CONTENT_FILE)); ValidationPolicy policy = PolicyReader.readValidationPolicy(new FileInputStream(POLICY_FILE)); Hashtable params = new Hashtable(); params.put(EParameters.P_CERT_VALIDATION_POLICY, policy); params.put(EParameters.P_EXTERNAL_CONTENT, content ); SignedDataValidation sdv = new SignedDataValidation(); SignedDataValidationResult sdvr = sdv.verify(signedData, params); if(sdvr.getSDStatus() != SignedData_Status.ALL_VALID) System.out.println("İmzaların hepsi doğrulamadı"); System.out.println(sdvr.toString()); byte[] signedData = AsnIO.dosyadanOKU(SIGNATURE_FILE); ISignable content = new SignableFile(new FileInfo(CONTENT_FILE)); ValidationPolicy policy = PolicyReader.readValidationPolicy(new FileStream(POLICY_FILE, FileMode.Open, FileAccess.Read)); Dictionary params_ = new Dictionary(); params_[EParameters.P_CERT_VALIDATION_POLICY] = policy; params_[EParameters.P_EXTERNAL_CONTENT] = content; SignedDataValidation sdv = new SignedDataValidation(); SignedDataValidationResult sdvr = sdv.verify(signedData, params_); if (sdvr.getSDStatus() != SignedData_Status.ALL_VALID) Console.WriteLine("İmzaların hepsi doğrulamadı"); Console.WriteLine(sdvr.ToString());