@pagopa/io-react-native-iso18013 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/IoReactNativeIso18013.podspec +29 -0
- package/LICENSE +20 -0
- package/README.md +30 -0
- package/android/build.gradle +83 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/ioreactnativeiso18013/Base64Utils.kt +56 -0
- package/android/src/main/java/com/ioreactnativeiso18013/IoReactNativeCborModule.kt +209 -0
- package/android/src/main/java/com/ioreactnativeiso18013/IoReactNativeIso18013Module.kt +439 -0
- package/android/src/main/java/com/ioreactnativeiso18013/IoReactNativeIso18013Package.kt +17 -0
- package/ios/Base64Utils.swift +47 -0
- package/ios/IoReactNativeCbor.mm +32 -0
- package/ios/IoReactNativeCbor.swift +188 -0
- package/ios/IoReactNativeIso18013-Bridging-Header.h +2 -0
- package/ios/IoReactNativeIso18013.mm +43 -0
- package/ios/IoReactNativeIso18013.swift +491 -0
- package/lib/module/cbor/cbor/README.md +95 -0
- package/lib/module/cbor/cbor/decoder.js +51 -0
- package/lib/module/cbor/cbor/decoder.js.map +1 -0
- package/lib/module/cbor/cbor/failure.js +2 -0
- package/lib/module/cbor/cbor/failure.js.map +1 -0
- package/lib/module/cbor/cbor/index.js +5 -0
- package/lib/module/cbor/cbor/index.js.map +1 -0
- package/lib/module/cbor/cbor/schema.js +117 -0
- package/lib/module/cbor/cbor/schema.js.map +1 -0
- package/lib/module/cbor/cbor/schema.utils.js +16 -0
- package/lib/module/cbor/cbor/schema.utils.js.map +1 -0
- package/lib/module/cbor/cose/README.md +53 -0
- package/lib/module/cbor/cose/failure.js +2 -0
- package/lib/module/cbor/cose/failure.js.map +1 -0
- package/lib/module/cbor/cose/index.js +4 -0
- package/lib/module/cbor/cose/index.js.map +1 -0
- package/lib/module/cbor/cose/sign.js +23 -0
- package/lib/module/cbor/cose/sign.js.map +1 -0
- package/lib/module/cbor/index.js +13 -0
- package/lib/module/cbor/index.js.map +1 -0
- package/lib/module/index.js +8 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/iso18013/index.js +14 -0
- package/lib/module/iso18013/index.js.map +1 -0
- package/lib/module/iso18013/iso18013-5/README.md +234 -0
- package/lib/module/iso18013/iso18013-5/index.js +5 -0
- package/lib/module/iso18013/iso18013-5/index.js.map +1 -0
- package/lib/module/iso18013/iso18013-5/proximity.js +112 -0
- package/lib/module/iso18013/iso18013-5/proximity.js.map +1 -0
- package/lib/module/iso18013/iso18013-5/schema.js +79 -0
- package/lib/module/iso18013/iso18013-5/schema.js.map +1 -0
- package/lib/module/iso18013/iso18013-7/README.md +59 -0
- package/lib/module/iso18013/iso18013-7/index.js +4 -0
- package/lib/module/iso18013/iso18013-7/index.js.map +1 -0
- package/lib/module/iso18013/iso18013-7/remote.js +31 -0
- package/lib/module/iso18013/iso18013-7/remote.js.map +1 -0
- package/lib/module/iso18013/types.js +2 -0
- package/lib/module/iso18013/types.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/cbor/cbor/decoder.d.ts +35 -0
- package/lib/typescript/src/cbor/cbor/decoder.d.ts.map +1 -0
- package/lib/typescript/src/cbor/cbor/failure.d.ts +15 -0
- package/lib/typescript/src/cbor/cbor/failure.d.ts.map +1 -0
- package/lib/typescript/src/cbor/cbor/index.d.ts +4 -0
- package/lib/typescript/src/cbor/cbor/index.d.ts.map +1 -0
- package/lib/typescript/src/cbor/cbor/schema.d.ts +2420 -0
- package/lib/typescript/src/cbor/cbor/schema.d.ts.map +1 -0
- package/lib/typescript/src/cbor/cbor/schema.utils.d.ts +8 -0
- package/lib/typescript/src/cbor/cbor/schema.utils.d.ts.map +1 -0
- package/lib/typescript/src/cbor/cose/failure.d.ts +15 -0
- package/lib/typescript/src/cbor/cose/failure.d.ts.map +1 -0
- package/lib/typescript/src/cbor/cose/index.d.ts +3 -0
- package/lib/typescript/src/cbor/cose/index.d.ts.map +1 -0
- package/lib/typescript/src/cbor/cose/sign.d.ts +19 -0
- package/lib/typescript/src/cbor/cose/sign.d.ts.map +1 -0
- package/lib/typescript/src/cbor/index.d.ts +2 -0
- package/lib/typescript/src/cbor/index.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +6 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/iso18013/index.d.ts +3 -0
- package/lib/typescript/src/iso18013/index.d.ts.map +1 -0
- package/lib/typescript/src/iso18013/iso18013-5/index.d.ts +4 -0
- package/lib/typescript/src/iso18013/iso18013-5/index.d.ts.map +1 -0
- package/lib/typescript/src/iso18013/iso18013-5/proximity.d.ts +88 -0
- package/lib/typescript/src/iso18013/iso18013-5/proximity.d.ts.map +1 -0
- package/lib/typescript/src/iso18013/iso18013-5/schema.d.ts +85 -0
- package/lib/typescript/src/iso18013/iso18013-5/schema.d.ts.map +1 -0
- package/lib/typescript/src/iso18013/iso18013-7/index.d.ts +3 -0
- package/lib/typescript/src/iso18013/iso18013-7/index.d.ts.map +1 -0
- package/lib/typescript/src/iso18013/iso18013-7/remote.d.ts +29 -0
- package/lib/typescript/src/iso18013/iso18013-7/remote.d.ts.map +1 -0
- package/lib/typescript/src/iso18013/types.d.ts +16 -0
- package/lib/typescript/src/iso18013/types.d.ts.map +1 -0
- package/package.json +163 -0
- package/src/cbor/cbor/README.md +95 -0
- package/src/cbor/cbor/decoder.ts +56 -0
- package/src/cbor/cbor/failure.ts +18 -0
- package/src/cbor/cbor/index.ts +9 -0
- package/src/cbor/cbor/schema.ts +150 -0
- package/src/cbor/cbor/schema.utils.ts +13 -0
- package/src/cbor/cose/README.md +53 -0
- package/src/cbor/cose/failure.ts +20 -0
- package/src/cbor/cose/index.ts +2 -0
- package/src/cbor/cose/sign.ts +25 -0
- package/src/cbor/index.ts +18 -0
- package/src/index.tsx +5 -0
- package/src/iso18013/index.ts +25 -0
- package/src/iso18013/iso18013-5/README.md +234 -0
- package/src/iso18013/iso18013-5/index.ts +23 -0
- package/src/iso18013/iso18013-5/proximity.ts +134 -0
- package/src/iso18013/iso18013-5/schema.ts +87 -0
- package/src/iso18013/iso18013-7/README.md +59 -0
- package/src/iso18013/iso18013-7/index.ts +7 -0
- package/src/iso18013/iso18013-7/remote.ts +54 -0
- package/src/iso18013/types.ts +16 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import IOWalletCBOR
|
|
2
|
+
import IOWalletProximity
|
|
3
|
+
import CryptoKit
|
|
4
|
+
|
|
5
|
+
@objc(IoReactNativeCbor)
|
|
6
|
+
class IoReactNativeCbor: NSObject {
|
|
7
|
+
private typealias ME = ModuleException
|
|
8
|
+
private let keyConfig: KeyConfig = .ec
|
|
9
|
+
|
|
10
|
+
@objc func decode(
|
|
11
|
+
_ cbor: String,
|
|
12
|
+
resolver resolve: RCTPromiseResolveBlock,
|
|
13
|
+
rejecter reject: RCTPromiseRejectBlock
|
|
14
|
+
) {
|
|
15
|
+
guard let data = try? Base64Utils.decodeBase64OrBase64URL(base: cbor) else {
|
|
16
|
+
ME.invalidEncoding.reject(reject: reject)
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
guard let json = CborCose.jsonFromCBOR(data: data) else {
|
|
21
|
+
ME.unableToDecode.reject(reject: reject)
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
resolve(json);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@objc func decodeDocuments(
|
|
30
|
+
_ mdoc: String,
|
|
31
|
+
resolver resolve: RCTPromiseResolveBlock,
|
|
32
|
+
rejecter reject: RCTPromiseRejectBlock
|
|
33
|
+
) {
|
|
34
|
+
guard let data = try? Base64Utils.decodeBase64OrBase64URL(base: mdoc) else {
|
|
35
|
+
ME.invalidEncoding.reject(reject: reject)
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
guard let json = CborCose.decodeCBOR(data: data, true, true) else {
|
|
40
|
+
ME.unableToDecode.reject(reject: reject)
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
resolve(json);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@objc func decodeIssuerSigned(
|
|
48
|
+
_ issuerSigned: String,
|
|
49
|
+
resolver resolve: RCTPromiseResolveBlock,
|
|
50
|
+
rejecter reject: RCTPromiseRejectBlock
|
|
51
|
+
) {
|
|
52
|
+
guard let data = try? Base64Utils.decodeBase64OrBase64URL(base: issuerSigned) else {
|
|
53
|
+
ME.invalidEncoding.reject(reject: reject)
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
guard let json = CborCose.issuerSignedCborToJson(data: data) else {
|
|
58
|
+
ME.unableToDecode.reject(reject: reject)
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
resolve(json);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@objc func sign(
|
|
66
|
+
_ payloadData: String,
|
|
67
|
+
keyTag: String,
|
|
68
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
69
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
70
|
+
) {
|
|
71
|
+
DispatchQueue.global().async { [weak self] in
|
|
72
|
+
guard self != nil else {
|
|
73
|
+
ME.threadingError.reject(reject: reject)
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
guard let data = try? Base64Utils.decodeBase64OrBase64URL(base: payloadData) else {
|
|
78
|
+
ME.invalidEncoding.reject(reject: reject)
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
guard let coseKey = CoseKeyPrivate(crv: .p256, keyTag: keyTag) else {
|
|
83
|
+
ME.publicKeyNotFound.reject(reject: reject)
|
|
84
|
+
return
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let signedPayload = CborCose.sign(data: data, privateKey: coseKey)
|
|
88
|
+
resolve(signedPayload.base64EncodedString())
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@objc func verify(
|
|
93
|
+
_ sign1Data: String,
|
|
94
|
+
jwk: NSDictionary,
|
|
95
|
+
resolver resolve: RCTPromiseResolveBlock,
|
|
96
|
+
rejecter reject: RCTPromiseRejectBlock
|
|
97
|
+
) {
|
|
98
|
+
do {
|
|
99
|
+
guard let data = try? Base64Utils.decodeBase64OrBase64URL(base: sign1Data) else {
|
|
100
|
+
ME.invalidEncoding.reject(reject: reject)
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let publicKeyJson = try JSONSerialization.data(withJSONObject: jwk, options:[] )
|
|
105
|
+
let publicKeyString = String(data: publicKeyJson, encoding: .utf8)!
|
|
106
|
+
let publicKey = CoseKey(jwk: publicKeyString)!
|
|
107
|
+
|
|
108
|
+
let verified = CborCose.verify(data: data, publicKey: publicKey)
|
|
109
|
+
|
|
110
|
+
resolve(verified)
|
|
111
|
+
} catch {
|
|
112
|
+
ME.unknownException.reject(reject: reject)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private func keyExists(keyTag: String) -> (key: SecKey?, status: OSStatus) {
|
|
117
|
+
let getQuery = privateKeyKeychainQuery(keyTag: keyTag)
|
|
118
|
+
var item: CFTypeRef?
|
|
119
|
+
let status = SecItemCopyMatching(getQuery as CFDictionary, &item)
|
|
120
|
+
return (status == errSecSuccess ? (item as! SecKey) : nil, status)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private func privateKeyKeychainQuery(
|
|
124
|
+
keyTag: String
|
|
125
|
+
) -> [String : Any] {
|
|
126
|
+
return [
|
|
127
|
+
kSecClass as String: kSecClassKey,
|
|
128
|
+
kSecAttrApplicationTag as String: keyTag,
|
|
129
|
+
kSecAttrKeyType as String: keyConfig.keyType(),
|
|
130
|
+
kSecReturnRef as String: true
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private enum KeyConfig: Int, CaseIterable {
|
|
135
|
+
case ec
|
|
136
|
+
|
|
137
|
+
func keyType() -> CFString {
|
|
138
|
+
switch self {
|
|
139
|
+
case .ec:
|
|
140
|
+
return kSecAttrKeyTypeECSECPrimeRandom
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
func keySizeInBits() -> Int {
|
|
145
|
+
switch self {
|
|
146
|
+
case .ec:
|
|
147
|
+
return 256
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
func keySignAlgorithm() -> SecKeyAlgorithm {
|
|
152
|
+
switch self {
|
|
153
|
+
case .ec:
|
|
154
|
+
return .ecdsaSignatureMessageX962SHA256
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private enum ModuleException: String, CaseIterable {
|
|
160
|
+
case unableToDecode = "UNABLE_TO_DECODE"
|
|
161
|
+
case publicKeyNotFound = "PUBLIC_KEY_NOT_FOUND"
|
|
162
|
+
case invalidEncoding = "INVALID_ENCODING"
|
|
163
|
+
case threadingError = "THREADING_ERROR"
|
|
164
|
+
case unknownException = "UNKNOWN_EXCEPTION"
|
|
165
|
+
|
|
166
|
+
func error(userInfo: [String : Any]? = nil) -> NSError {
|
|
167
|
+
switch self {
|
|
168
|
+
case .unableToDecode:
|
|
169
|
+
return NSError(domain: self.rawValue, code: -1, userInfo: userInfo)
|
|
170
|
+
case .publicKeyNotFound:
|
|
171
|
+
return NSError(domain: self.rawValue, code: -1, userInfo: userInfo)
|
|
172
|
+
case .invalidEncoding:
|
|
173
|
+
return NSError(domain: self.rawValue, code: -1, userInfo: userInfo)
|
|
174
|
+
case .threadingError:
|
|
175
|
+
return NSError(domain: self.rawValue, code: -1, userInfo: userInfo)
|
|
176
|
+
case .unknownException:
|
|
177
|
+
return NSError(domain: self.rawValue, code: -1, userInfo: userInfo)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
func reject(reject: RCTPromiseRejectBlock, _ moreUserInfo: (String, Any)...) {
|
|
182
|
+
var userInfo = [String : Any]()
|
|
183
|
+
moreUserInfo.forEach { userInfo[$0.0] = $0.1 }
|
|
184
|
+
let error = error(userInfo: userInfo)
|
|
185
|
+
reject("\(error.code)", error.domain, error)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
2
|
+
#import <React/RCTEventEmitter.h>
|
|
3
|
+
|
|
4
|
+
@interface RCT_EXTERN_MODULE(IoReactNativeIso18013, RCTEventEmitter)
|
|
5
|
+
|
|
6
|
+
RCT_EXTERN_METHOD(start:(NSArray *)certificates
|
|
7
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
8
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
9
|
+
|
|
10
|
+
RCT_EXTERN_METHOD(getQrCodeString:(RCTPromiseResolveBlock)resolve
|
|
11
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
12
|
+
|
|
13
|
+
RCT_EXTERN_METHOD(close:(RCTPromiseResolveBlock)resolve
|
|
14
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
15
|
+
|
|
16
|
+
RCT_EXTERN_METHOD(generateResponse:(NSArray *)documents
|
|
17
|
+
withAcceptedFields:(NSDictionary *)acceptedFields
|
|
18
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
19
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
20
|
+
|
|
21
|
+
RCT_EXTERN_METHOD(sendResponse:(NSString)response
|
|
22
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
23
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
24
|
+
|
|
25
|
+
RCT_EXTERN_METHOD(sendErrorResponse:(NSInteger)status
|
|
26
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
27
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
28
|
+
|
|
29
|
+
RCT_EXTERN_METHOD(generateOID4VPDeviceResponse: (NSString)clientId
|
|
30
|
+
responseUri: (NSString*)responseUri
|
|
31
|
+
authorizationRequestNonce: (NSString*)authorizationRequestNonce
|
|
32
|
+
mdocGeneratedNonce: (NSString*)mdocGeneratedNonce
|
|
33
|
+
documents: (NSArray*)documents
|
|
34
|
+
fieldRequestedAndAccepted: (NSString*)fieldRequestedAndAccepted
|
|
35
|
+
resolver: (RCTPromiseResolveBlock)resolve
|
|
36
|
+
rejecter: (RCTPromiseRejectBlock)reject)
|
|
37
|
+
|
|
38
|
+
+ (BOOL)requiresMainQueueSetup
|
|
39
|
+
{
|
|
40
|
+
return YES;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@end
|