E-IMZO QR kodini va eimzo://sign?qc=… deeplinkini native Swift'da yaratadi. Tashqi bog'liqliklar yo'q.
- iOS 13+ (E-IMZO'ni ochish yordamchilari bilan), macOS 10.15+ (faqat payload)
- Swift 6, Swift Package Manager
Xcode → File → Add Package Dependencies… → https://github.com/Xaliljon/EImzoKit
yoki Package.swift:
.package(url: "https://github.com/Xaliljon/EImzoKit", from: "0.1.0")Info.plist ga (faqat EImzo.isAppInstalled uchun kerak, openApp busiz ham ishlaydi):
<key>LSApplicationQueriesSchemes</key>
<array>
<string>eimzo</string>
</array>import EImzoKit
// 1. Backend E-IMZO'da sessiya yaratadi: siteId, documentId, challange
let session = try await api.createSession()
// 2. Payload va deeplink
let qrCode = try EImzo.qrCode(
siteId: session.siteId,
documentId: session.documentId,
challenge: session.challenge
)
let deeplink = EImzo.deeplink(qrCode: qrCode)
// 3. E-IMZO'ni ochish
if !(await EImzo.openApp(deeplink)) {
// E-IMZO o'rnatilmagan: EImzo.appStoreURL ni taklif qiling yoki QR kodni ko'rsating
}
// 4. E-IMZO ilovaga callback qaytarmaydi. Foydalanuvchi qaytganda (scenePhase == .active)
// backenddan statusni so'rang: 1 — imzolandi, 2 — kutilmoqda.Hujjat imzolash uchun: EImzo.qrCode(siteId:documentId:document:) — fayl Data sifatida, matn esa
Data(text.utf8) ko'rinishida.
Noto'g'ri siteId/documentId (bo'sh, hex emas yoki umumiy uzunligi toq) bo'lsa
EImzoError.invalidIdentifiers tashlanadi.
payload = siteId + documentId + OzDSt1106(challenge) + CRC32
deeplink = eimzo://sign?qc=<payload>
siteId,documentId,challange— backend E-IMZO REST API'dan oladi (/frontend/mobile/auth).- OzDSt 1106 — E-IMZO ishlatadigan ko'rinishda GOST R 34.11-94 (RFC 5831) hashi, RFC 4357 dagi "D-A" S-box bilan. Matn UTF-8 baytlari bo'yicha hashlanadi. Natija — 64 ta hex belgi.
- CRC32 —
siteId + documentId + hashning hex-dekodlangan baytlaridan, 8 ta hex belgi. - Hex kichik harfda, E-IMZO'ning rasmiy web va Android namunalaridagi kabi.
Misol (E-IMZO test serveridagi sessiya): siteId=20e2, documentId=7E744E86,
challenge=56AAB952AB6D359A859086C64B9FE312 →
eimzo://sign?qc=20e27E744E86f2c2e107d1a1b82f1f473821e339255ebd1eb74408e53393a755d00dc4a50541dadd21fb
Example/EImzoExample.xcodeproj ni ochib ishga tushiring (iOS 17+): sessiya → deeplink → E-IMZO →
qaytganda status. Sessiya va status E-IMZO'ning ochiq test serveridan (test.e-imzo.uz) olinadi,
rasmiy Android namunasidagi kabi.
EImzoBackend
protokolini o'z API'ingiz bilan yozing. Backend E-IMZO'ning /frontend/mobile/auth va
/frontend/mobile/status metodlarini chaqiradi, imzo qo'yilgach /backend/mobile/authenticate/{documentId}
orqali foydalanuvchini tekshirib, o'z tokeningizni beradi.
Simulatorda E-IMZO yo'q: ilovadagi QR kodni haqiqiy telefondagi E-IMZO bilan skanerlasangiz, ilova statusni o'zi tekshirib, "Imzolandi" holatiga o'tadi.
swift test- E-IMZO'ning rasmiy
pkcs.jsdagi GOST test vektorlari. - Blok chegaralari va 1 000 000 bayt — LibreSSL
openssl dgst -md_gost94natijalari bilan. - To'liq payloadlar LibreSSL +
zlib.crc32bilan mustaqil hisoblangan.
- qo0p/e-imzo-doc, qo0p/SampleAndroidAppCallDeeplinkEIMZO — E-IMZO'ning rasmiy hujjatlari va namunalari
- RFC 5831 (GOST R 34.11-94), RFC 4357 (S-box parametrlari)