@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.
Files changed (113) hide show
  1. package/IoReactNativeIso18013.podspec +29 -0
  2. package/LICENSE +20 -0
  3. package/README.md +30 -0
  4. package/android/build.gradle +83 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/AndroidManifestNew.xml +2 -0
  8. package/android/src/main/java/com/ioreactnativeiso18013/Base64Utils.kt +56 -0
  9. package/android/src/main/java/com/ioreactnativeiso18013/IoReactNativeCborModule.kt +209 -0
  10. package/android/src/main/java/com/ioreactnativeiso18013/IoReactNativeIso18013Module.kt +439 -0
  11. package/android/src/main/java/com/ioreactnativeiso18013/IoReactNativeIso18013Package.kt +17 -0
  12. package/ios/Base64Utils.swift +47 -0
  13. package/ios/IoReactNativeCbor.mm +32 -0
  14. package/ios/IoReactNativeCbor.swift +188 -0
  15. package/ios/IoReactNativeIso18013-Bridging-Header.h +2 -0
  16. package/ios/IoReactNativeIso18013.mm +43 -0
  17. package/ios/IoReactNativeIso18013.swift +491 -0
  18. package/lib/module/cbor/cbor/README.md +95 -0
  19. package/lib/module/cbor/cbor/decoder.js +51 -0
  20. package/lib/module/cbor/cbor/decoder.js.map +1 -0
  21. package/lib/module/cbor/cbor/failure.js +2 -0
  22. package/lib/module/cbor/cbor/failure.js.map +1 -0
  23. package/lib/module/cbor/cbor/index.js +5 -0
  24. package/lib/module/cbor/cbor/index.js.map +1 -0
  25. package/lib/module/cbor/cbor/schema.js +117 -0
  26. package/lib/module/cbor/cbor/schema.js.map +1 -0
  27. package/lib/module/cbor/cbor/schema.utils.js +16 -0
  28. package/lib/module/cbor/cbor/schema.utils.js.map +1 -0
  29. package/lib/module/cbor/cose/README.md +53 -0
  30. package/lib/module/cbor/cose/failure.js +2 -0
  31. package/lib/module/cbor/cose/failure.js.map +1 -0
  32. package/lib/module/cbor/cose/index.js +4 -0
  33. package/lib/module/cbor/cose/index.js.map +1 -0
  34. package/lib/module/cbor/cose/sign.js +23 -0
  35. package/lib/module/cbor/cose/sign.js.map +1 -0
  36. package/lib/module/cbor/index.js +13 -0
  37. package/lib/module/cbor/index.js.map +1 -0
  38. package/lib/module/index.js +8 -0
  39. package/lib/module/index.js.map +1 -0
  40. package/lib/module/iso18013/index.js +14 -0
  41. package/lib/module/iso18013/index.js.map +1 -0
  42. package/lib/module/iso18013/iso18013-5/README.md +234 -0
  43. package/lib/module/iso18013/iso18013-5/index.js +5 -0
  44. package/lib/module/iso18013/iso18013-5/index.js.map +1 -0
  45. package/lib/module/iso18013/iso18013-5/proximity.js +112 -0
  46. package/lib/module/iso18013/iso18013-5/proximity.js.map +1 -0
  47. package/lib/module/iso18013/iso18013-5/schema.js +79 -0
  48. package/lib/module/iso18013/iso18013-5/schema.js.map +1 -0
  49. package/lib/module/iso18013/iso18013-7/README.md +59 -0
  50. package/lib/module/iso18013/iso18013-7/index.js +4 -0
  51. package/lib/module/iso18013/iso18013-7/index.js.map +1 -0
  52. package/lib/module/iso18013/iso18013-7/remote.js +31 -0
  53. package/lib/module/iso18013/iso18013-7/remote.js.map +1 -0
  54. package/lib/module/iso18013/types.js +2 -0
  55. package/lib/module/iso18013/types.js.map +1 -0
  56. package/lib/module/package.json +1 -0
  57. package/lib/typescript/package.json +1 -0
  58. package/lib/typescript/src/cbor/cbor/decoder.d.ts +35 -0
  59. package/lib/typescript/src/cbor/cbor/decoder.d.ts.map +1 -0
  60. package/lib/typescript/src/cbor/cbor/failure.d.ts +15 -0
  61. package/lib/typescript/src/cbor/cbor/failure.d.ts.map +1 -0
  62. package/lib/typescript/src/cbor/cbor/index.d.ts +4 -0
  63. package/lib/typescript/src/cbor/cbor/index.d.ts.map +1 -0
  64. package/lib/typescript/src/cbor/cbor/schema.d.ts +2420 -0
  65. package/lib/typescript/src/cbor/cbor/schema.d.ts.map +1 -0
  66. package/lib/typescript/src/cbor/cbor/schema.utils.d.ts +8 -0
  67. package/lib/typescript/src/cbor/cbor/schema.utils.d.ts.map +1 -0
  68. package/lib/typescript/src/cbor/cose/failure.d.ts +15 -0
  69. package/lib/typescript/src/cbor/cose/failure.d.ts.map +1 -0
  70. package/lib/typescript/src/cbor/cose/index.d.ts +3 -0
  71. package/lib/typescript/src/cbor/cose/index.d.ts.map +1 -0
  72. package/lib/typescript/src/cbor/cose/sign.d.ts +19 -0
  73. package/lib/typescript/src/cbor/cose/sign.d.ts.map +1 -0
  74. package/lib/typescript/src/cbor/index.d.ts +2 -0
  75. package/lib/typescript/src/cbor/index.d.ts.map +1 -0
  76. package/lib/typescript/src/index.d.ts +6 -0
  77. package/lib/typescript/src/index.d.ts.map +1 -0
  78. package/lib/typescript/src/iso18013/index.d.ts +3 -0
  79. package/lib/typescript/src/iso18013/index.d.ts.map +1 -0
  80. package/lib/typescript/src/iso18013/iso18013-5/index.d.ts +4 -0
  81. package/lib/typescript/src/iso18013/iso18013-5/index.d.ts.map +1 -0
  82. package/lib/typescript/src/iso18013/iso18013-5/proximity.d.ts +88 -0
  83. package/lib/typescript/src/iso18013/iso18013-5/proximity.d.ts.map +1 -0
  84. package/lib/typescript/src/iso18013/iso18013-5/schema.d.ts +85 -0
  85. package/lib/typescript/src/iso18013/iso18013-5/schema.d.ts.map +1 -0
  86. package/lib/typescript/src/iso18013/iso18013-7/index.d.ts +3 -0
  87. package/lib/typescript/src/iso18013/iso18013-7/index.d.ts.map +1 -0
  88. package/lib/typescript/src/iso18013/iso18013-7/remote.d.ts +29 -0
  89. package/lib/typescript/src/iso18013/iso18013-7/remote.d.ts.map +1 -0
  90. package/lib/typescript/src/iso18013/types.d.ts +16 -0
  91. package/lib/typescript/src/iso18013/types.d.ts.map +1 -0
  92. package/package.json +163 -0
  93. package/src/cbor/cbor/README.md +95 -0
  94. package/src/cbor/cbor/decoder.ts +56 -0
  95. package/src/cbor/cbor/failure.ts +18 -0
  96. package/src/cbor/cbor/index.ts +9 -0
  97. package/src/cbor/cbor/schema.ts +150 -0
  98. package/src/cbor/cbor/schema.utils.ts +13 -0
  99. package/src/cbor/cose/README.md +53 -0
  100. package/src/cbor/cose/failure.ts +20 -0
  101. package/src/cbor/cose/index.ts +2 -0
  102. package/src/cbor/cose/sign.ts +25 -0
  103. package/src/cbor/index.ts +18 -0
  104. package/src/index.tsx +5 -0
  105. package/src/iso18013/index.ts +25 -0
  106. package/src/iso18013/iso18013-5/README.md +234 -0
  107. package/src/iso18013/iso18013-5/index.ts +23 -0
  108. package/src/iso18013/iso18013-5/proximity.ts +134 -0
  109. package/src/iso18013/iso18013-5/schema.ts +87 -0
  110. package/src/iso18013/iso18013-7/README.md +59 -0
  111. package/src/iso18013/iso18013-7/index.ts +7 -0
  112. package/src/iso18013/iso18013-7/remote.ts +54 -0
  113. 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,2 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
@@ -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