Bu, dökümanın eski bir sürümüdür!
Basic Electroinc Signature (BES) can be created on Android platform. Current version only supports AKIS smartcards.
While creating signature on Android, APDU commands are used in order to communicate with the smartcard.
Android sisteminde imza oluşturulurken kart ile iletişim apdu komutları üzerinden sağlanmaktadır.İmzalama işlemleri için APDUSmartCard sınıfı uygun parametrelerle oluşturulmakta ve getSigner() metodunda alınan BaseSigner nesnesi imzalamada kullanılmaktadır. İmzalama işlemlerinde kullanılacak olan APDUSmartCard sınıfı oluşturulurken, uygun TerminalHandler sınıfı oluşturulmalı ve kullanılmalıdır. Mevcut sürümde ACSTerminalHandler sınfı oluşturulabilmektedir. Kartla yapılan işlemlerde, android sistemi ilk kullanımda, karta erişmek için kullanıcıdan usb erişim onayı istemektedir. Bu onay ekranının görülebilmesi ve düzgün çalışması amacıyla ACSTerminalHandler sınıfına usb erişim hakları için oluşturulmuş bir android sınıfı olan PendingIntent nesnesi verilmelidir. Android sistemindeki benzer akışlardan dolayı kart işlemleri doğrudan ana gui sınıfında yapılmamalı, AsyncTask sınıfından türetilen bir sınıf içerisinde işlemler yapılmalıdır.
Takılı olan kart okuyuculardaki sertifikaları listeleyen ve seçilen dosyayı imzalayan örnek bir android uygulaması(eclipse projesi olarak) paket içerisinde bulunmaktadır. İmzalama için gerekli jar dosyaları bu örnek eclipse projesine bakılarak görülebilir.
Android imzada test lisansı ile çalışırken sadece test sertifikaları ile işlem yapılabilecek ve işlemlerde 5 sn’lik bir gecikme yaşanacaktır.
Yukarıda bahsedilen akışla ilgili örnek bir fonksiyon aşağıdadır. Kod içerisinde gerekli kısımlarda yorumlar bulunmaktadır.
public void signWithFirstCertificate() { try { //Burada gömülü lisans dosyası yüklenmektedir. Resources res = getResources(); InputStream lisansStream = res.openRawResource(R.raw.lisans); LicenseUtil.setLicenseXml(lisansStream); lisansStream.close(); Activity callerActivity = this; //ACSTerminalHandler oluşturulurken bunu çağıran Activity parametre olarak verilmelidir. ACSTerminalHandler acsTerminalHandler = new ACSTerminalHandler((Activity)this); //APDUSmartCard sınıfı uygun TerminalHandler sınıfı ile çağrılmalıdır. APDUSmartCard apduSmartCard = new APDUSmartCard(acsTerminalHandler); //Kullanıcıdan usb erişim onayı alınabilmesi için oluşturulmuş olan PendingIntent nesnesi terminal handler sınıfına verilmelidir. PendingIntent permissionIntent = PendingIntent.getBroadcast(callerActivity, 0, new Intent("tr.gov.tubitak.bilgem.esya.android.signexample.USB_PERMISSION"), 0); acsTerminalHandler.setPermissionIntent(permissionIntent); //Akis kart iletişimi için SecureMessaging devre dışı bırakılmalıdır. apduSmartCard.setDisableSecureMessaging(true); //Bağlı kart okuyucular okunuyor. CardTerminal[] terminalList = apduSmartCard.getTerminalList(); if(terminalList == null || terminalList.length == 0) { throw new Exception("Bağlı kart okuyucu sayısı 0"); } CardTerminal cardTerminal = terminalList[0]; apduSmartCard.openSession(cardTerminal); //İlk kart okuyucudan sertifika listesi alınıyor. List<byte[]> signCertValueList = mApduSmartCard.getSignatureCertificates(); if(signCertValueList == null || signCertValueList.size() == 0) { throw new Exception("Kart içerisinde sertifika sayısı 0"); } //İlk sertifika ile işlem yapılacak. ECertificate signingCert = new ECertificate(signCertValueList.get(0)); String cardPin = "511661"; apduSmartCard.login(cardPin); //İmzalamada kullanılacak BaseSigner APDUSmartCard sınıfından alınıyor. BaseSigner signer = apduSmartCard.getSigner(signingCert.asX509Certificate(), Algorithms.SIGNATURE_RSA_SHA1); BaseSignedData bsd = new BaseSignedData(); //İmzalanacak olan dosya yolu String sourceFilePath = "/tmp/TextForSign.txt"; ISignable content = new SignableFile(new File(sourceFilePath)); bsd.addContent(content); //Since SigningTime attribute is optional,add it to optional attributes list List<IAttribute> optionalAttributes = new ArrayList<IAttribute>(); optionalAttributes.add(new SigningTimeAttr(Calendar.getInstance())); HashMap<String, Object> params = new HashMap<String, Object>(); //Android ile imza atılırken sertifika kontrolü devre dışı bırakılmalıdır. //Mevcut sürümde sertifika doğrulama desteği bulunmamaktadır. params.put(EParameters.P_VALIDATE_CERTIFICATE_BEFORE_SIGNING,false); bsd.addSigner(ESignatureType.TYPE_BES, signingCert, signer, optionalAttributes, params); byte [] signedDocument = bsd.getEncoded(); String destFilePath = sourceFilePath+ ".imz"; //İmzalı hali dosyaya yazılıyor. AsnIO.dosyayaz(signedDocument, destFilePath); apduSmartCard.logout(); apduSmartCard.closeSession(); } catch (Exception e) { e.printStackTrace(); } }