2 puan yazan GN⁺ 2023-10-29 | 1 yorum | WhatsApp'ta paylaş
  • Seattle Public Library ve King County Library System’in plastik kartları azaltma hedefiyle, iPhone Wallet kartlarının JSON, görsel ve imza yapısıyla doğrudan uğraşmak gerekti
  • Wallet yalnızca QR code, PDF417, Aztec Code ve Code 128’i desteklediği için kütüphane kartının Codabar barkodu yerel barkod olarak eklenemedi; fiilen taranacak barkod için görsel kullanılarak bir geçici çözüm uygulandı
  • Kartın Apple’ın güvendiği bir anahtarla imzalanması gerekiyordu; ancak yıllık 99 dolarlık Apple Developer üyeliği yerine, çevrimdışı oluşturma yapabilen bir iOS kart uygulamasında sertifika ve anahtar bulunup kullanıldı
  • storeCard yerleşimi, çözünürlüğe göre logolar, Codabar strip.png ve boş bir PKBarcodeFormatCode128 öğesi birleştirilerek ekranda görsel barkod gösterilirken iOS’un ekran parlaklığını artırma davranışı korundu
  • Tamamlanan .pkpass, manifest oluşturma, openssl smime ile imzalama ve ZIP paketleme yoluyla üretilebildi; gerçek kütüphane testi henüz yapılmamış olsa da ayrı bir tarayıcı telefon ekranındaki barkodu okudu

Hedef: Plastik kart olmadan kütüphane barkodunu kullanmak

  • Seattle Public Library ve King County Library System, ödünç alma hesabına bağlı üzerinde barkod basılı plastik kartlar veriyor
  • 2023 itibarıyla Seattle kütüphanesindeki çoğu işlem self-servis ve genellikle kütüphane barkodu elle girilebiliyor
  • Yine de barkodu hemen göstermek çok daha pratik olduğundan, hedef neredeyse hiç kullanılmayan plastik kartı cüzdanda taşımak yerine iPhone Wallet uygulamasına koymaktı

Wallet kartları JSON, görsel ve imzadan oluşur

  • Wallet uygulaması bugün ödeme kartları, kimlikler, anahtarlar gibi şeyleri yönetiyor; ancak 2012’de Passbook ilk çıktığında yalnızca “kartları” yönetiyordu
  • Apple’ın kart belgelerine göre kart, e-posta veya web üzerinden dağıtılabilen kendi kendine yeterli bir ZIP dosyasıdır ve içinde JSON ile PNG bulunur
  • .pkpass dosyasının temel yapısı basittir
    • pass.json: Görsel olmayan kart içeriğini tanımlar
    • manifest.json: Diğer dosyaların SHA-1 sağlama toplamları listesi
    • signature: manifest.json içeriği için S/MIME imzası
    • Desteklenen görsel dosyaları

Codabar desteğinin olmaması ilk engeldi

  • Wallet kartlarının desteklediği yalnızca dört barkod türü vardır
    • QR code
    • PDF417
    • Aztec Code
    • Code 128
  • Kütüphane kartı, kütüphanelerde yaygın kullanılan Codabar biçimindeydi
  • Kütüphane barkod tarayıcılarının başka doğrusal barkodları destekleme ihtimali olsa da tüm şubelerde kesin çalıştığı söylenebilecek tek biçim Codabar’dı
  • Sonuçta Wallet’ın yerleşik barkod özelliği yerine, taranabilir bir Codabar görseli üretip kartın içine koymak gerekti

Kart imzalama sertifikası sorunu

  • Wallet kartları kriptografik imza gerektirir ve Apple sertifika otoritelerinden birinin güvendiği bir anahtarla imzalanmalıdır
  • Uçuş kapısı değişikliği veya koltuk değişikliği gibi satıcının kartı otomatik güncellemesi gereken durumlarda imza bir ölçüde makuldür
  • Apple geliştiricisiyseniz kart imzalama anahtarını nispeten kolay alabilirsiniz; ancak bu iş için yılda 99 dolar ödemek istenmedi

Mevcut kart oluşturma uygulamalarının uygun olmama nedenleri

  • Apple geliştiricisi olan kişiler tarafından yapılmış çeşitli kart tasarım uygulamaları vardı, ancak gereken düzeyde kontrol sunmuyorlardı
  • Logo boyutu kontrolü

    • Apple, kartın sol üstündeki logo için en fazla 50 device-independent pixels yüksekliğe izin veriyor
    • Metnin sağında yer alan kare logo için yaklaşık 40px yükseklik en uygun olandı
    • Geliştiricinin ayrı ayrı logo.png, logo@2x.png, logo@3x.png sağlaması gerekir; ancak uygulamalar genellikle tek logo seçimine izin verip ölçek kontrolü sunmaz
  • Ekran parlaklığı davranışı

    • Normal desteklenen barkodu olan bir kart açıldığında, tarayıcıyla kontrast için ekran parlaklaşır
    • Gerçekte çalışmayan bir barkod göstermeden iOS’un ekranı parlaklaştırmasını sağlamak için pass.json dosyasını doğrudan düzenlemek gerekiyordu
    • Ücretsiz indirilebilen uygulamalarda bile Wallet’a kaydedilebilen kart sayısını sınırlayıp ödeme isteyenler olabiliyordu

Çevrimdışı oluşturma uygulamasında imzalama anahtarını bulmak

  • Birkaç ücretsiz başlangıç seviyesinde kart oluşturma uygulaması indirildi ve çevrimdışıyken de kart oluşturup oluşturmadıkları kontrol edildi
  • Uçak modu ve Wi‑Fi kapalıyken yapılan testte, en az bir uygulamanın çevrimdışı kart oluşturabildiği görüldü
  • Anahtarın iptal edilmesini önlemek için söz konusu uygulamanın adı açıklanmıyor
  • Süreç beklenenden daha basitti
    • Apple silicon Mac’lerde iOS uygulamaları çalıştırılabildiği için uygulama Mac’e indirildi
    • Paketlenmiş iOS uygulama bundle’ının içinde göze çarpan bir .p12 dosyası bulundu
    • PKCS#12 dosyası içe aktarma parolası gerektirdiğinden, ana ikili dosyada strings çalıştırılarak parola gibi görünen dizeler arandı
  • openssl pkcs12 ile sertifika bilgileri kontrol edildiğinde issuer alanı Apple Worldwide Developer Relations Certification Authority olarak göründü
  • Sertifika zinciri de gereklidir; ara sertifika uygulama bundle’ının içinde olabilir ve X.509 uzantı alanındaki URL’den de indirilebilir

Kart yerleşiminin yapılandırılması

  • Kart stili olarak boarding pass, coupon, event ticket, generic, store card seçeneklerinden biri seçilmelidir
  • Büyük yatay görsel eklemek için strip görselini destekleyen bir yerleşim gerekir
    • Adaylar coupon, event ticket, store card
    • Fiziksel kütüphane kartına en çok benzeyen biçim olduğu için store card seçildi
  • pass.json dosyasında şu değerler bulunur
    • passTypeIdentifier
    • teamIdentifier
    • formatVersion
    • serialNumber
    • organizationName
    • logoText
    • description
    • storeCard
    • backgroundColor
    • foregroundColor
    • sharingProhibited
  • passTypeIdentifier ve teamIdentifier, Apple sertifikası subject alanındaki sırasıyla UID ve OU alanlarıyla eşleşmelidir
  • Aynı passTypeIdentifier ile oluşturulan her kartın benzersiz bir serialNumber değeri olmalıdır
  • Görseller kullanım amacına göre hazırlandı
    • icon.png zorunludur ancak kartın kendisinde gösterilmez
    • logo.png sol üstte gösterilen logodur
    • 40×40 logo.png, 80×80 logo@2x.png, 120×120 logo@3x.png oluşturuldu
    • logo@3x.png, icon.png olarak kopyalandı
    • Önceden oluşturulan barkod strip.png içine kondu

Codabar barkod görseli oluşturmak

  • iOS, strip.png dosyasını cihaz ekranındaki kutuya uyacak şekilde ölçekleyip kırptığı için strip.png için çözünürlüğe göre üç ayrı sürüm oluşturmak gerekmedi
  • İki kütüphane kartı başlangıç ve bitiş sembolleri olarak A ve D kullanıyor
  • Başlangıç ve bitiş sembollerini doğrulamanın en kolay yolu bir barkod tarayıcı kullanmaktır; yoksa Wikipedia’nın Codabar kodlama tablosu ile gözle karşılaştırılabilir
  • Çevrimiçi ve hemen kullanılabilecek Codabar oluşturucular çok fazla değildi; ancak biçimin kendisini doğrudan uygulamak kolaydı
  • Prototipte Rust için Barcoders kütüphanesi ile SVG oluşturuldu, SVG ayarlandıktan sonra PNG’ye aktarıldı
  • Son yerleşim taranabilirlik ve iOS’un küçültülmüş gösterimi dikkate alınarak belirlendi
    • Barkod yüksekliği, başlangıç ve bitiş sembolleri dahil toplam sembol sayısının 2 katı birim olarak ayarlandı
    • Örneğin 13 haneli barkod numarası 15 sembol olduğundan yükseklik 30 birim yapıldı
    • Başlangıçtan önce ve bitişten sonra ayrı ayrı 15 birimlik quiet space bırakıldı
    • Barkodun üstüne ve altına ayrı ayrı 50 birim padding kondu
    • iOS’un görüntüyü her zaman küçültmesi için her birim 8 piksele büyütüldü
    • Örnek 15 sembollü barkodda nihai görsel yüksekliği 1040 piksel, barkodun kendi yüksekliği ise 240 pikseldir
  • Yukarıdaki yerleşimde Codabar BMP oluşturan ve bunu sips ile PNG’ye dönüştüren 69 satırlık bir shell script yazıldı
  • Script çıktısı strip.png olarak kaydedildiğinde karta konacak barkod görseli hazır olur

Barkod numarasını gösterme ve ekran parlaklığı geçici çözümü

  • Barkod numarası, barkodun altında secondaryFields ile gösterilir
    • key: number
    • label: CARD NUMBER
    • value: kart numarası
  • iOS, barkodu olan bir kart seçildiğinde tarayıcıya yardımcı olmak için ekranı parlaklaştırır
  • Görsel olarak eklenen Codabar tek başına iOS’un barkod bulunduğunu düşünmesini sağlamaz
  • Bu davranışı elde etmek için pass.json üst seviyesinde boş bir barkod öğesi belirtildi
    • message boş dizedir
    • format PKBarcodeFormatCode128 olur
    • messageEncoding iso-8859-1 olur
  • Bu yöntem, kartın alt kısmında barkod göstermeden iPhone’un ekranı barkodu olan bir karttaki gibi parlaklaştırmasını sağladı

İmzalama ve paketleme

  • Tüm dosyalar hazırlandıktan sonra manifest.json oluşturulmalıdır
  • manifest.json, anahtar olarak dosya adlarını, değer olarak SHA-1 sağlama toplamlarını içeren bir nesnedir
  • sha1sum ve jq birleştirilerek PNG dosyaları ile pass.json için manifest oluşturuldu
  • Manifest imzası openssl smime komutuyla yapıldı
    • imzalayan sertifikası
    • private key
    • Apple WWDR ara sertifikası
    • girdi manifest.json
    • çıktı signature
  • openssl smime komutunun -attime seçeneğiyle istenen imzalama zamanı belirtilebilir
    • Seçenek değeri UNIX epoch’tur
    • Apple’dan alınan veya bulunan sertifika süresi dolmuş olsa bile o zamanla imzalanabilir
  • Son olarak aşağıdaki dosyalar ZIP içine konup .pkpass oluşturulur
    • PNG görselleri
    • pass.json
    • manifest.json
    • signature

Test sonuçları ve eksikler

  • macOS’ta kartın geçerli olduğunu ve genel olarak doğru göründüğünü kontrol etmeye yarayan bir kart önizleme aracı vardır
  • Geçerli değilse hatalar Console.app içinde bulunabilir
  • Önizleme aracı %100 doğru değildir, ancak iCloud üzerinden iPhone’a gönderme düğmesi vardır
  • Tamamlanan kart gerçek kütüphanede henüz test edilmedi
  • Ayrı bir barkod tarayıcı, telefon ekranındaki barkodu gerçek plastik karttaki gibi okuyabildi
    • Ancak ekran parlaklığı en yükseğe çıkarıldığında iyi okunuyordu
    • Boş barkod geçici çözümüyle yükselen parlaklıktan daha parlak ayarlanmıştı
  • Kart spesifikasyonunun 10 yıldır neredeyse hiç değişmemiş olması iyi; ancak PNG ve JSON’dan oluşan zararsız bir kartı imzalamak için yıllık 99 dolarlık Apple Developer üyeliği gerekmesi üzücü
  • Bazı kart özellikleri için imza gerektiği söylenebilir; ancak bu işte yapılanlar için imza gerekmemeli
  • Apple Wallet’a Codabar desteği eklerse, kütüphane sistemindeki tüm tarayıcıların Code 128 destekleyip desteklemediğini denetlemeye gerek kalmadan dijital kütüphane kartları desteklenebilir

1 yorum

 
GN⁺ 2023-10-29
Hacker News yorumları
  • Sırada ORCA kartını da ele alsalar iyi olur. Seattle, ABD’nin teknoloji merkezlerinden biri ama metro/toplu taşımanın kendisi zaten pek iyi olmadığı gibi, denediğim neredeyse tüm büyük şehirlerin toplu taşımasına kıyasla teknik olarak da geride kalıyor.
    Avrupa’daki herhangi bir şehir, CDMX, Denver ile karşılaştırınca hepsi Seattle’dan çok daha ileride; kişisel olarak Denver’ın en iyisi olduğunu düşünüyorum.
    ORCA’yı işleten kurumlardan biri Android uygulamasına NFC desteği ekleyeceğine dair bir blog yazısı bile yayımlamıştı, ama o yazı artık yok ve aradan birkaç yıl geçmiş olmasına rağmen bu özellik hâlâ yok.

    • Birkaç gün önce Google Wallet’ın yakında bunu destekleyeceği yazıldı: https://blog.google/products/google-pay/commute-around-the-w...
    • Bizim yerel ulaşım sistemi yakın zamanda temassız ödeme ekledi; artık herhangi bir kredi kartı ya da Apple Pay/Google Pay kullanılabiliyor.
      Aynı kartı kullandığınız sürece aktarmalar ve birkaç günlük pass’ler gibi şeyleri sorunsuz hallediyor; belirli bir süre içinde belli sayının üzerinde biniş yaparsanız daha fazla ücret almamak gibi doğru ücreti otomatik uyguluyor.
    • Çoğu toplu taşıma sisteminin ücretsiz yolculuğa geçerse kaybedeceği gelir yalnızca bir kısmı oluşturuyor; buna kıyasla ücret toplama sistemini sürdürmenin maliyetinin ne kadar olduğunu merak ediyorum.
    • Bununla bağlantılı olarak, root’lu Android ile NFC kart klonlamanın bir yolu yok mu?
      Ofis kapım NFC kartla açıldığı için iOS’ta mümkün olup olmadığını araştırmıştım; hatırladığım kadarıyla Apple, NFC donanımını sıradan PassKit’ten daha sıkı kontrol ediyor, bu yüzden normal uygulamalarla zor görünüyor.
    • https://info.myorca.com/news/can-i-use-my-phone-to-pay-for-a...
      ORCA’ya 2023 içinde temassız ödemenin geleceği söylenmişti; bunun gerçek olması için artık yaklaşık iki ay kaldı.
      Google, Google Wallet’ta ORCA’yı yakında destekleyeceğini yazdığı için iyimserim.
  • Google Wallet’ın Apple Passbook gibi herhangi bir barkodu eklemeye izin vermemesinden hoşlanmayan Android kullanıcıları için F-Droid’de Loyalty Card Keychain adlı harika bir uygulama var: https://f-droid.org/en/packages/protect.card_locker/
    Numarayı elle girebilir ya da mevcut barkodu tarayabilir, Codabar dâhil çeşitli barkod biçimlerinden birini seçip kaydedebilirsiniz. Uygulamanın ana ekranında bir öğeye dokunduğunuzda oluşturulan barkodu gösteriyor ve ekran parlaklığını da artırıyor.
    Barkodu göstermek dışında pek bir şey yapmadığı için olsa gerek, uygulama da çok hızlı açılıyor. Tek işlevi var ama belki de en sevdiğim uygulama.
    Şimdilerde Catima kullanılması öneriliyor gibi; kısa süre denedim, benzer şekilde basit ve aynı kod tabanına dayanıyor gibi görünüyor.

  • Pass’in kriptografik olarak imzalanması ve Apple sertifika otoritesinin bildiği bir anahtarla imzalanması gerektiğinin neden mantıklı olduğunu anlamıyorum. Bu tür güncellemeler için zaten iyi desteklenen HTTPS var.
    Apple, pass’in yalnızca güncelleme anında değil, telefonda çevrimdışıyken de doğrulanmasını istiyor olabilir ama yine de garip. Kötü niyetli biri pass’i güncellemek yerine tamamen değiştirebilir.

    • İlk pass’in, güncellemeye izin verecek açık anahtarı belirtmesi yeterli olurdu.
      Bunu Apple geliştirici hesabına bağlamanın güncelleme sorununa nasıl yardımcı olacağını hiç anlamıyorum.
      Apple tarafından onaylanmış bir taraf olma şartı için aklıma gelen tek gerekçe sahte bilet satışı. “Konser X bileti” adlı pkpass dosyasının gerçek olup olmadığını, bu şart olsa da olmasa da bilmenin bir yolu yok.
      Dolandırıcılık bildirimi gelirse ilgili geliştirici hesabını iptal ederek karşılık vermeye çalışıyor olabilirler, ama bu da çözüm gibi görünmüyor. Geliştirici hesabı ücreti, yakalanmadan önce dolandırıcılıkla kazanılabilecek paradan muhtemelen çok daha ucuzdur.
  • Ben sadece kütüphane kartı numaramın bulunduğu barkod PNG’sini kendime e-postayla gönderiyorum; kiosk önünde Photos ya da Gmail uygulamasıyla açıp kullanıyorum.

    • Wallet pass’leri, ilgili pass’in “ilgili” olarak görüneceği konum ve zaman aralığını tanımlayabiliyor.
      MakePass uygulamasıyla StarBucks üyelik kodumu içeren bir pass oluşturdum; sık gittiğim mağazanın yakınına geldiğimde telefon kilit ekranında StarBucks pass’ini otomatik öneriyor.
      Etkinlik biletlerinde de aynı şekilde konum ve zaman aralığı belirlerseniz, mekâna vardığınızda pass’i aramanıza gerek kalmadan otomatik öneriliyor. Etkinlik bitince artık önerilmiyor ve ana ekranı kalabalıklaştırmamak için “Expired Passes” bölümüne taşınıyor.
      MakePass: https://pvieito.com
    • Yazıya göz gezdirirken neden sadece fotoğrafını çekmediğini arıyordum.
  • Güzel bir blog yazısıydı ama sonu “bu pass’i gerçek kütüphanede henüz test etmedim” diye bitiyor.
    Eğlence için yapılmış bir proje olduğunu anlıyorum ama sonucu paylaşmadan önce nihai çözümü test etmek için gereken 10 dakikayı neden ayırmadığını anlamıyorum.

    • Bu kısım yüzünden yazının bütün etkisi azaldı. “Koşu sırasında oksijen kaybına dair harika bir bilimsel teorim var. Kabul ediyorum, henüz koşuya başlamadım ama…” gibi bir his veriyor.
    • Sonuçta taranacak barkodu temsil eden bir piksel kümesinden ibaret. Doğru görüntülendiği sürece ne ters gidebilir ki?
    • Kütüphane cumartesi günleri açık olmayabilir.
  • Barkod oluştururken kişisel olarak PostScript tabanlı barkod oluşturucuyu tercih ederim
    https://bwipp.terryburton.co.uk/

  • Bu sorunu kütüphane kartının fotoğrafını çekerek çözdüm. Kitap ödünç alırken fotoğrafı açıp tarayıcıya tutmak yeterli

    • Barkod görselini konum tabanlı bildirime koydum; mahalledeki kütüphaneye gidince bildirim olarak çıkıyor
    • Statik bir barkodsa sadece fotoğraf olması yeterli. Wallet’a koymanın büyük bir avantajı yok
      Telefondaki fotoğraf albümünde tüm kimlik kartlarımı saklıyorum
  • Android’de benzer bir şey yapmak isterseniz Google Play ve F-Droid’de bulunan Catima var. Birçok barkod türünü destekliyor
    https://catima.app/

    • Google Pay veya Samsung Pay de kullanılabilir
  • Ucuz lazer tipi 1 boyutlu barkod tarayıcıları ekrandan barkod okuyamaz. eInk belki çalışabilir
    Sık gittiğim süpermarketin üyelik kartı barkod tabanlı olduğu için kullanışsız; neyse ki barkod okuyucu klavyeyi taklit ediyor, bu yüzden kodu doğrudan klavyeyle girebiliyorum

    • Benim anladığım kadarıyla eski sistemler dijital görüntü sensörüyle taramak yerine, dönen bir lazer ışını ve basit bir fotodiyotla beyaz/siyah barkod alanlarından yansıyan parlaklık değişimlerini okuyor
      Kamera tabanlı tarayıcılar barkod aydınlatmasının ortam ışığı mı, kendi LED’i mi, yoksa arkadan aydınlatmalı ekran mı olduğuna aldırmaz; ama lazer tabanlı sistemler kendi ışıklarının yansımasına dayandığı için aktif arka aydınlatmalı ekranlarda hiç çalışmaz
      e-ink veya pasif LCD ekranlarda çalışıp çalışmadığını merak ediyorum
    • Bluetooth MCU ve E-ink ekran ile ucuz bir barkod gösterici yaptım; yalnızca 1 boyutlu barkod tarayıcılarının hepsinde sorunsuz çalışıyor
    • Costco’nun taşınabilir tarayıcısının üyelik kartına çok dar ve küçük basılmış üye barkodunu ne kadar hızlı ve kolay okuduğunu her gördüğümde hayran kalıyorum
      Dışarıdan basit bir kırmızı çizgili 2D tip gibi görünüyor, ama demek ki donanım gerçekten önemli
  • KCLS hesap numarasını ezberledim. Ezberlemek 30 saniye kadar sürer; kişiye göre değişir ama bence bu yöntem daha hızlı olur
    Sonrasında barkodu taratmak yerine hesap numarasını girmek yeterli; telefonu çıkarıp hazırlamaktan daha az zaman alma ihtimali yüksek
    SPL’nin de aynı şekilde olup olmadığını bilmiyorum. Seattle’da yaşamadığım için kontrol edemem

    • Ezberlemek istemiyorsanız istediğiniz parola yöneticisine kaydedebilirsiniz