Güvenli Mesajlaşma - Bölüm 1
Elektronik kimlik kartındaki bazı alanları kart erişim cihazı (KEC) ile okuyabilmek için rol doğrulama işleminin yapılması gerekli. Rol doğrulamadan önce ise KEC'in GEM donanımı ile Rol Sahibi (RS) arasında bir güvenli iletişim kanalı kurulmalı. Bahsedilenler, TS 13681 numaralı standartın bir özeti.
Burada 3'lü bir yapı söz konusu:
RS <----> Uygulama <----> GEM
Akış, uygulama tarafından yönetilmekte. RS ve KEC'in işlemleri gerçekleştirebilmesi için bazı metotları sağlaması gerekmekte.
1. Uygulama, getCvc ve getCaCvc metotlarını çağırarak, RS ve KEC'den Güvenli İletişim (Gİ) CV (Card Verifiable) sertifikalarını ve bu sertifikaların alt kök (caCVC) CV sertifikasını ister. Uygulama, VerifyCvcChain metodunu RS üzerinde GEM’den aldığı sertifikalar ile, KEC üzerinde ise RS’den aldığı sertifikalar ile çağırır. Bu metotlar CVC’lerin geçerli bir kökten türediklerini ve tarihlerinin eskimemiş olduğunu denetlemelidir.
2. Uygulama, KEC vasıtasıyla GEM’den, GEM seri numarasını ve 8 byte’lık rastgele sayı (GEM.RND) alır. GEM Seri No ile GEM.RND birleştirilir. RS’deki SignAndEncrypt metoduna gönderilir. ISO9796-2 Scheme 1 imzalama, Sha256 digest ve RSA kullanılarak, implicit trailer ile uygulanmalı.Bu imzalama metodu kurtarılabilir ve imza içine eklenen verinin geri elde edilebilir olduğu bir yöntem. RS, SignAndEncrypt metoduna gelen verinin içinden son 8 byte’ı GEM.RND olarak o güvenli iletişim oturumu için saklamalı. Daha sonra 32 byte uzunluğunda bir kROL rastgele değeri üretmeli ve aynı oturum değerinde saklamalı. kROL değeri imzaya kurtarılabilir veri olarak dahil edilmeli. RSA-2048 sertifikalar 256 byte’lık bir blok genişliğine sahip. Trailer(2 byte), kROL (32 byte), imzalanacak veri (16 byte) boyutundan geri kalanlar rastgele sayıyla (pRND1) doldurulmalıdır. İmzalama gerçekleştikten sonra Minimum bulma fonksiyonu olarak RS.Gİ sertifikası modulus değeri - imza değeri, imza değerinden daha küçükse, imza değeri olarak o seçilmelidir. Aksi halde imza değerinin kendisi kullanılmalıdır. Daha sonra elde edilen imza değerinin GEM.Gİ sertifikası ile şifrelenmesi gerekir.
3. Uygulama, RS’in SignAndEncrypt metodundan elde ettiği değeri KEC vasıtasıyla GEM’de doğrulamalıdır.
Daha sonra, uygulama aynı işlemlerin GEM üzerinde yapılması için RS’in GetSerialNumber ve GetRandom metotları ile değerleri alır, birleştirir ve GEM üzerinde SignAndEncrpyt metodunu çalıştırır. RS üzerindeki imzalama yöntemini kullanarak veriyi GEM.Gİ sertifikası ile imzalar ve RS.Gİ sertifikası ile şifreler. Standart üzerinde, üretilen imzanın hep implicit trailer (‘6A’…’BC’) sahip olacağı anlaşılmasına rağmen kullandığım test GEM’inin her zaman explicit trailer ile imza ürettiğini farkettim. Bu da, RS tarafında imzayı doğrularken öncelikle imzayı validate edip, içinden trailer’ın ne olduğunu öğrenip daha sonra BouncyCastle’a geçmemi gerektirdi. İki kez imza doğrulamaya ait RSA işlemini yapmamak için önbellekleyen bir cipher yazılması düşünülebilir.