Java Cryptography Architecture და Java Cryptography Extension განსაზღვრავენ Java პროგრამირების ენაზე დაფუძნებულ სისტემებში კრიპტოგრაფიისა და მასთან დაკავშირებული სხვა ოპერაციების ზოგად ჩარჩოებს. იქიდან გამომდინარე, რომ ID ბარათი წარმოადგენს კრიპტოგრაფიულ საშუალებას, ბუნებრივია რომ მას შეეძლოს სტანდარტული ინტერფეისის გამოყენებით კრიპტოგრაფიული ოპერაციების ჩატარება.

 

ამ მიზნით შექმნილია სპეციალური პროვაიდერი JCA/JCE წესების მიხედვით.

მხარდაჭერილი ინტერფეისები

კრიპტოგრაფიული პროვაიდერი მხარს უჭერს შემდეგ ინტერფეისებს:

  1. KeyStore - ამ ინტერფეისით შესაძლებელია მისწვდეთ ID ბარათის მომხმარებლის გასაღებებს, სერტიფიკატებს, ასევე სერტიფიკაციის შუალედური ცენტრების (GEO Authentication CA, GEO Signing CA) და ძირეულ (Root) სერტიფიკატს.
  2. Signature - ამ ინტერფეისით შესაძლებელია ციფრული ხელმოწერის განხორციელება. მხარდაჭერილია 3 ალგორითმი
    1. NONEwithRSA
    2. SHA1withRSA
    3. SHA256withRSA

პროვაიდერის ინსტალაცია

პროვაიდერის ინსტალაცია შესაძლებელია როგორც ცენტრალიზებულად, JRE გარემოში .jar ფაილების განთავსებით, ისე ლოკალურად პროგრამაში – ამ jar ფაილების CLASSPATH–ში განთავსებით. პროვაიდერის კლასის სრული სახელია ge.eid.card.mw.jca.EIDProvider

ამ ეტაპზე jar ფაილების გადაწერა შეგიძლიათ ამავე გვერდიდან

ახლო მომავალში ეს ფაილები ასევე დაიდება id.ge –ს Maven–რეპოზიტორიში. ორივე ფაილი ოპერირებისათვის ასევე საჭიროებს sl4j ბიბლიოთეკას, რომლის გადმოწერაც შესაძლებელია მისი გვერდიდან.

ორივე ფაილი ციფრულად ხელმოწერილია სახელმწიფო სერვისების განვითარების სააგენტოს გასაღებით, რომელიც გაცემულია სერტიფიკაციის ცენტრ VeriSign–ის მიერ. აქედან გამომდინარე, მისი ამუშავებისათვის დამატებითი სერტიფიკატების იმპორტი საჭირო არ არის.

სამაგალითო კოდი

import ge.eid.card.mw.jca.EIDProvider;
import java.math.BigInteger;
import java.security.KeyStore;
import java.security.KeyStore.Entry;
import java.security.PrivateKey;
import java.security.Security;
import java.security.Signature;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import javax.security.auth.callback.CallbackHandler;
/**
 * Hello world!
 * 
 */
public class App {
    public static void main(String[] args) throws Exception {
		// პროვაიდერის შექმნა
        EIDProvider prov = new EIDProvider();

		// PIN კოდების შეყვანის Callback-ის შექმნა
		// თუკი ქვემოთ მოყვანილ 2 სტრიქონს გამოტოვებთ, PIN კოდის შეყვანა 
		// საჭირო იქნება გრაფიკულ დიალოგში
        CallbackHandler cmdLineHdlr = new com.sun.security.auth.callback.TextCallbackHandler();
        prov.setCallbackHandler(cmdLineHdlr);

		// პროვაიდერის რეგისტრაცია
        Security.addProvider(prov);
        
		// პროვაიდერი არეგისტრირებს KeyStore-ს სახელად GE_EID
        KeyStore ks = KeyStore.getInstance("GE_EID");
        ks.load(null, new char[] {});

		// ასე შეგვიძლია დავათვალიეროთ KeyStore-ს შიგთავსი
        Enumeration<String> aliases = ks.aliases();
        while (aliases.hasMoreElements()) {
            String alias = aliases.nextElement();
            if (ks.isCertificateEntry(alias)) {
                X509Certificate cert = (X509Certificate) ks
                        .getCertificate(alias);
                System.out.println(alias + "\t" + cert.getSubjectDN());
            }
        }

		// ავიღოთ აუთენტიფიკაციის გასაღები
		// რასაკვირველია, ეს ობიექტი შეიცავს არა გასაღებს არამედ მითითებას მასზე
        PrivateKey pk = (PrivateKey) ks.getKey("CitizenAuth.1", null);
		
		// ავიღოთ SHA256withRSA ხელმოწერა ID ბარათის პროვაიდერიდან
		Signature sign = Signature.getInstance("SHA256withRSA", "GE_EID");
        sign.initSign(pk);

		// ხელი მოვაწეროთ ტექსტს Hello World!
        sign.update("Hello World!".getBytes());		
		byte[] buffer = sign.sign();
		System.out.println("Signed Data: " + (new BigInteger(1, buffer).toString(16)));

		// ავიღოთ SHA256withRSA ხელმოწერა Java-ს სტანდარტული საშუალებებით
		Signature sign1 = Signature.getInstance("SHA256withRSA");

        // შევამოწმოთ ხელმოწერის სისწორე
		sign1.initVerify(ks.getCertificate("CitizenAuth.1"));
        sign1.update("Hello World!".getBytes());
        boolean isValid = sign1.verify(buffer);
        System.out.println("Valid? " + isValid);

    }
}