@coderoftime/fints 0.1.0 → 0.3.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 (289) hide show
  1. package/CHANGELOG.md +519 -1
  2. package/README.md +138 -40
  3. package/dist/client.d.ts +49 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +242 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/core/account.d.ts +46 -7
  8. package/dist/core/account.d.ts.map +1 -1
  9. package/dist/core/account.js +143 -24
  10. package/dist/core/account.js.map +1 -1
  11. package/dist/core/amount.d.ts +15 -4
  12. package/dist/core/amount.d.ts.map +1 -1
  13. package/dist/core/amount.js +46 -9
  14. package/dist/core/amount.js.map +1 -1
  15. package/dist/core/balance.d.ts +4 -0
  16. package/dist/core/balance.d.ts.map +1 -1
  17. package/dist/core/balance.js +11 -5
  18. package/dist/core/balance.js.map +1 -1
  19. package/dist/core/bank-info.d.ts +21 -4
  20. package/dist/core/bank-info.d.ts.map +1 -1
  21. package/dist/core/bank-info.js +26 -5
  22. package/dist/core/bank-info.js.map +1 -1
  23. package/dist/core/client.d.ts +81 -19
  24. package/dist/core/client.d.ts.map +1 -1
  25. package/dist/core/config.d.ts +40 -20
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +85 -30
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/errors.d.ts +100 -26
  30. package/dist/core/errors.d.ts.map +1 -1
  31. package/dist/core/errors.js +136 -53
  32. package/dist/core/errors.js.map +1 -1
  33. package/dist/core/feedback.d.ts +11 -1
  34. package/dist/core/feedback.d.ts.map +1 -1
  35. package/dist/core/feedback.js +14 -2
  36. package/dist/core/feedback.js.map +1 -1
  37. package/dist/core/transaction.d.ts +11 -1
  38. package/dist/core/transaction.d.ts.map +1 -1
  39. package/dist/core/transaction.js +21 -4
  40. package/dist/core/transaction.js.map +1 -1
  41. package/dist/core/transport.d.ts +48 -6
  42. package/dist/core/transport.d.ts.map +1 -1
  43. package/dist/core/transport.js +126 -29
  44. package/dist/core/transport.js.map +1 -1
  45. package/dist/formats/camt.d.ts +28 -5
  46. package/dist/formats/camt.d.ts.map +1 -1
  47. package/dist/formats/camt.js +132 -50
  48. package/dist/formats/camt.js.map +1 -1
  49. package/dist/formats/mt940.d.ts +29 -5
  50. package/dist/formats/mt940.d.ts.map +1 -1
  51. package/dist/formats/mt940.js +209 -113
  52. package/dist/formats/mt940.js.map +1 -1
  53. package/dist/formats/readers.d.ts +6 -2
  54. package/dist/formats/readers.d.ts.map +1 -1
  55. package/dist/formats/readers.js +28 -29
  56. package/dist/formats/readers.js.map +1 -1
  57. package/dist/formats/record-budget.d.ts +7 -0
  58. package/dist/formats/record-budget.d.ts.map +1 -0
  59. package/dist/formats/record-budget.js +17 -0
  60. package/dist/formats/record-budget.js.map +1 -0
  61. package/dist/formats/sepa-purpose.d.ts +9 -0
  62. package/dist/formats/sepa-purpose.d.ts.map +1 -1
  63. package/dist/formats/sepa-purpose.js +32 -2
  64. package/dist/formats/sepa-purpose.js.map +1 -1
  65. package/dist/index.d.ts +3 -3
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/session/app-approval.d.ts +11 -5
  70. package/dist/session/app-approval.d.ts.map +1 -1
  71. package/dist/session/app-approval.js +23 -12
  72. package/dist/session/app-approval.js.map +1 -1
  73. package/dist/session/dialog-runner.d.ts +11 -11
  74. package/dist/session/dialog-runner.d.ts.map +1 -1
  75. package/dist/session/dialog-runner.js +34 -19
  76. package/dist/session/dialog-runner.js.map +1 -1
  77. package/dist/session/login-guard.d.ts +54 -49
  78. package/dist/session/login-guard.d.ts.map +1 -1
  79. package/dist/session/login-guard.js +170 -83
  80. package/dist/session/login-guard.js.map +1 -1
  81. package/dist/session/sepa-accounts.d.ts +20 -14
  82. package/dist/session/sepa-accounts.d.ts.map +1 -1
  83. package/dist/session/sepa-accounts.js +62 -46
  84. package/dist/session/sepa-accounts.js.map +1 -1
  85. package/dist/session/session-setup.d.ts +41 -24
  86. package/dist/session/session-setup.d.ts.map +1 -1
  87. package/dist/session/session-setup.js +106 -63
  88. package/dist/session/session-setup.js.map +1 -1
  89. package/dist/session/session-state.d.ts +10 -6
  90. package/dist/session/session-state.d.ts.map +1 -1
  91. package/dist/session/session-state.js +72 -18
  92. package/dist/session/session-state.js.map +1 -1
  93. package/dist/session/signed-dialog.d.ts +83 -0
  94. package/dist/session/signed-dialog.d.ts.map +1 -0
  95. package/dist/session/signed-dialog.js +185 -0
  96. package/dist/session/signed-dialog.js.map +1 -0
  97. package/dist/session/tan-selection.d.ts +26 -18
  98. package/dist/session/tan-selection.d.ts.map +1 -1
  99. package/dist/session/tan-selection.js +44 -33
  100. package/dist/session/tan-selection.js.map +1 -1
  101. package/dist/session/user-prompts.d.ts +14 -5
  102. package/dist/session/user-prompts.d.ts.map +1 -1
  103. package/dist/session/user-prompts.js +53 -18
  104. package/dist/session/user-prompts.js.map +1 -1
  105. package/dist/tan/challenge.d.ts +47 -24
  106. package/dist/tan/challenge.d.ts.map +1 -1
  107. package/dist/tan/challenge.js +56 -51
  108. package/dist/tan/challenge.js.map +1 -1
  109. package/dist/tan/flicker.d.ts +11 -1
  110. package/dist/tan/flicker.d.ts.map +1 -1
  111. package/dist/tan/flicker.js +70 -24
  112. package/dist/tan/flicker.js.map +1 -1
  113. package/dist/tan/tan-image.d.ts +6 -2
  114. package/dist/tan/tan-image.d.ts.map +1 -1
  115. package/dist/tan/tan-image.js +14 -6
  116. package/dist/tan/tan-image.js.map +1 -1
  117. package/dist/tan/tan-models.d.ts +14 -2
  118. package/dist/tan/tan-models.d.ts.map +1 -1
  119. package/dist/tan/tan-models.js +24 -7
  120. package/dist/tan/tan-models.js.map +1 -1
  121. package/dist/util/arguments.d.ts +13 -0
  122. package/dist/util/arguments.d.ts.map +1 -0
  123. package/dist/util/arguments.js +40 -0
  124. package/dist/util/arguments.js.map +1 -0
  125. package/dist/util/async.d.ts +4 -3
  126. package/dist/util/async.d.ts.map +1 -1
  127. package/dist/util/async.js +6 -7
  128. package/dist/util/async.js.map +1 -1
  129. package/dist/util/bytes.d.ts +3 -4
  130. package/dist/util/bytes.d.ts.map +1 -1
  131. package/dist/util/bytes.js +13 -21
  132. package/dist/util/bytes.js.map +1 -1
  133. package/dist/util/call-context.d.ts.map +1 -1
  134. package/dist/util/call-context.js +3 -2
  135. package/dist/util/call-context.js.map +1 -1
  136. package/dist/util/dates.d.ts +6 -20
  137. package/dist/util/dates.d.ts.map +1 -1
  138. package/dist/util/dates.js +58 -28
  139. package/dist/util/dates.js.map +1 -1
  140. package/dist/util/errors.d.ts +13 -3
  141. package/dist/util/errors.d.ts.map +1 -1
  142. package/dist/util/errors.js +19 -6
  143. package/dist/util/errors.js.map +1 -1
  144. package/dist/util/immutable-map.d.ts +5 -2
  145. package/dist/util/immutable-map.d.ts.map +1 -1
  146. package/dist/util/immutable-map.js +15 -12
  147. package/dist/util/immutable-map.js.map +1 -1
  148. package/dist/util/inspect.d.ts +11 -0
  149. package/dist/util/inspect.d.ts.map +1 -0
  150. package/dist/util/inspect.js +14 -0
  151. package/dist/util/inspect.js.map +1 -0
  152. package/dist/util/json.d.ts +4 -0
  153. package/dist/util/json.d.ts.map +1 -1
  154. package/dist/util/json.js +18 -0
  155. package/dist/util/json.js.map +1 -1
  156. package/dist/util/text.d.ts +38 -5
  157. package/dist/util/text.d.ts.map +1 -1
  158. package/dist/util/text.js +90 -16
  159. package/dist/util/text.js.map +1 -1
  160. package/dist/util/xml.d.ts +9 -6
  161. package/dist/util/xml.d.ts.map +1 -1
  162. package/dist/util/xml.js +129 -56
  163. package/dist/util/xml.js.map +1 -1
  164. package/dist/v3/account-extension.d.ts.map +1 -1
  165. package/dist/v3/account-extension.js +7 -10
  166. package/dist/v3/account-extension.js.map +1 -1
  167. package/dist/v3/bank-connection.d.ts +54 -0
  168. package/dist/v3/bank-connection.d.ts.map +1 -0
  169. package/dist/v3/bank-connection.js +118 -0
  170. package/dist/v3/bank-connection.js.map +1 -0
  171. package/dist/v3/dialog.d.ts +84 -46
  172. package/dist/v3/dialog.d.ts.map +1 -1
  173. package/dist/v3/dialog.js +174 -60
  174. package/dist/v3/dialog.js.map +1 -1
  175. package/dist/v3/message.d.ts +32 -11
  176. package/dist/v3/message.d.ts.map +1 -1
  177. package/dist/v3/message.js +144 -83
  178. package/dist/v3/message.js.map +1 -1
  179. package/dist/v3/parameter-store.d.ts +111 -0
  180. package/dist/v3/parameter-store.d.ts.map +1 -0
  181. package/dist/v3/parameter-store.js +197 -0
  182. package/dist/v3/parameter-store.js.map +1 -0
  183. package/dist/v3/parameters.d.ts +44 -17
  184. package/dist/v3/parameters.d.ts.map +1 -1
  185. package/dist/v3/parameters.js +136 -60
  186. package/dist/v3/parameters.js.map +1 -1
  187. package/dist/v3/protocol.d.ts +50 -50
  188. package/dist/v3/protocol.d.ts.map +1 -1
  189. package/dist/v3/protocol.js +91 -210
  190. package/dist/v3/protocol.js.map +1 -1
  191. package/dist/v3/queries.d.ts +51 -0
  192. package/dist/v3/queries.d.ts.map +1 -0
  193. package/dist/v3/queries.js +128 -0
  194. package/dist/v3/queries.js.map +1 -0
  195. package/dist/v3/segments.d.ts +43 -19
  196. package/dist/v3/segments.d.ts.map +1 -1
  197. package/dist/v3/segments.js +84 -33
  198. package/dist/v3/segments.js.map +1 -1
  199. package/dist/v3/syntax.d.ts +68 -13
  200. package/dist/v3/syntax.d.ts.map +1 -1
  201. package/dist/v3/syntax.js +183 -102
  202. package/dist/v3/syntax.js.map +1 -1
  203. package/package.json +10 -6
  204. package/src/client.ts +293 -0
  205. package/src/core/account.ts +153 -24
  206. package/src/core/amount.ts +45 -10
  207. package/src/core/balance.ts +12 -5
  208. package/src/core/bank-info.ts +29 -5
  209. package/src/core/client.ts +83 -19
  210. package/src/core/config.ts +95 -35
  211. package/src/core/errors.ts +148 -54
  212. package/src/core/feedback.ts +16 -2
  213. package/src/core/transaction.ts +22 -4
  214. package/src/core/transport.ts +153 -32
  215. package/src/formats/camt.ts +153 -45
  216. package/src/formats/mt940.ts +244 -122
  217. package/src/formats/readers.ts +28 -31
  218. package/src/formats/record-budget.ts +18 -0
  219. package/src/formats/sepa-purpose.ts +29 -2
  220. package/src/index.ts +4 -2
  221. package/src/session/app-approval.ts +51 -38
  222. package/src/session/dialog-runner.ts +61 -31
  223. package/src/session/login-guard.ts +189 -87
  224. package/src/session/sepa-accounts.ts +63 -45
  225. package/src/session/session-setup.ts +105 -68
  226. package/src/session/session-state.ts +74 -23
  227. package/src/session/signed-dialog.ts +222 -0
  228. package/src/session/tan-selection.ts +50 -39
  229. package/src/session/user-prompts.ts +62 -18
  230. package/src/tan/challenge.ts +87 -64
  231. package/src/tan/flicker.ts +72 -23
  232. package/src/tan/tan-image.ts +15 -6
  233. package/src/tan/tan-models.ts +26 -7
  234. package/src/util/arguments.ts +40 -0
  235. package/src/util/async.ts +10 -9
  236. package/src/util/bytes.ts +14 -20
  237. package/src/util/call-context.ts +3 -2
  238. package/src/util/dates.ts +64 -33
  239. package/src/util/errors.ts +22 -6
  240. package/src/util/immutable-map.ts +15 -12
  241. package/src/util/inspect.ts +14 -0
  242. package/src/util/json.ts +16 -0
  243. package/src/util/text.ts +87 -15
  244. package/src/util/xml.ts +130 -52
  245. package/src/v3/account-extension.ts +7 -12
  246. package/src/v3/bank-connection.ts +126 -0
  247. package/src/v3/dialog.ts +186 -92
  248. package/src/v3/message.ts +140 -79
  249. package/src/v3/parameter-store.ts +226 -0
  250. package/src/v3/parameters.ts +166 -66
  251. package/src/v3/protocol.ts +103 -253
  252. package/src/v3/queries.ts +198 -0
  253. package/src/v3/segments.ts +86 -31
  254. package/src/v3/syntax.ts +172 -93
  255. package/dist/session/bank-connection.d.ts +0 -28
  256. package/dist/session/bank-connection.d.ts.map +0 -1
  257. package/dist/session/bank-connection.js +0 -48
  258. package/dist/session/bank-connection.js.map +0 -1
  259. package/dist/session/parameter-data.d.ts +0 -83
  260. package/dist/session/parameter-data.d.ts.map +0 -1
  261. package/dist/session/parameter-data.js +0 -68
  262. package/dist/session/parameter-data.js.map +0 -1
  263. package/dist/session/pin-tan-client.d.ts +0 -54
  264. package/dist/session/pin-tan-client.d.ts.map +0 -1
  265. package/dist/session/pin-tan-client.js +0 -153
  266. package/dist/session/pin-tan-client.js.map +0 -1
  267. package/dist/session/pin-tan-dialog.d.ts +0 -71
  268. package/dist/session/pin-tan-dialog.d.ts.map +0 -1
  269. package/dist/session/pin-tan-dialog.js +0 -124
  270. package/dist/session/pin-tan-dialog.js.map +0 -1
  271. package/dist/session/protocol.d.ts +0 -209
  272. package/dist/session/protocol.d.ts.map +0 -1
  273. package/dist/session/protocol.js +0 -75
  274. package/dist/session/protocol.js.map +0 -1
  275. package/dist/session/response-handler.d.ts +0 -48
  276. package/dist/session/response-handler.d.ts.map +0 -1
  277. package/dist/session/response-handler.js +0 -121
  278. package/dist/session/response-handler.js.map +0 -1
  279. package/dist/v3/client.d.ts +0 -24
  280. package/dist/v3/client.d.ts.map +0 -1
  281. package/dist/v3/client.js +0 -16
  282. package/dist/v3/client.js.map +0 -1
  283. package/src/session/bank-connection.ts +0 -51
  284. package/src/session/parameter-data.ts +0 -137
  285. package/src/session/pin-tan-client.ts +0 -186
  286. package/src/session/pin-tan-dialog.ts +0 -160
  287. package/src/session/protocol.ts +0 -311
  288. package/src/session/response-handler.ts +0 -130
  289. package/src/v3/client.ts +0 -29
@@ -2,11 +2,11 @@
2
2
  import { BankMessage } from '../core/bank-info.js';
3
3
  import { FinTsFeedback } from '../core/feedback.js';
4
4
  import { TanMethod } from '../tan/tan-models.js';
5
- import { base64Encode, BytesBuilder, latin1Decode, latin1Encode } from '../util/bytes.js';
5
+ import { base64Encode, concatBytes, latin1Encode, utf8Decode } from '../util/bytes.js';
6
6
  import { formatFintsDate, formatFintsTime } from '../util/dates.js';
7
7
  import { FormatError } from '../util/errors.js';
8
8
  import { decodeBankText, decodeBase64Lines } from '../util/text.js';
9
- import { Binary, parseSegments, SegmentSpec } from './syntax.js';
9
+ import { Binary, parsedElementBytes, parseSegments, SegmentSpec, Verbatim, } from './syntax.js';
10
10
  function isTwoStep(c) {
11
11
  return c.securityFunction !== TanMethod.oneStep.securityFunction;
12
12
  }
@@ -18,7 +18,7 @@ const signedArea = 1;
18
18
  const issuer = 1;
19
19
  /** Security identification: message sender (MS), empty CID, then the customer system ID. */
20
20
  function sender(systemId) {
21
- return [1, null, systemId];
21
+ return [1, null, new Verbatim(systemId)];
22
22
  }
23
23
  /** Security reference number, the same in every message. */
24
24
  const securityReference = 1;
@@ -43,10 +43,14 @@ const noCompression = 0;
43
43
  function keyName(c, keyType) {
44
44
  return [c.countryCode, c.bankCode, c.userId, keyType, 0, 0];
45
45
  }
46
- /** A random integer from 0 below `bound`, from a cryptographically secure source. */
46
+ /** A random integer from 0 below `bound`, each equally likely, from a cryptographically secure source. */
47
47
  function secureRandom(bound) {
48
+ // Values from the last multiple of `bound` on cover only the low remainders, which they would make more likely.
49
+ const limit = 2 ** 32 - (2 ** 32 % bound);
48
50
  const values = new Uint32Array(1);
49
- crypto.getRandomValues(values);
51
+ do {
52
+ crypto.getRandomValues(values);
53
+ } while (values[0] >= limit);
50
54
  return values[0] % bound;
51
55
  }
52
56
  /** A random 14-digit reference that ties the signature head (HNSHK) to the signature end (HNSHA). */
@@ -56,16 +60,17 @@ function securityControlReference() {
56
60
  /** A message to send, and the same message with PIN and TAN masked for logging. */
57
61
  export class OutgoingMessage {
58
62
  bytes;
59
- maskedParts;
60
- constructor(bytes,
61
- /** The parts of the masked message, each decoded on its own as the bank's text is. */
62
- maskedParts) {
63
+ buildMasked;
64
+ constructor(bytes, buildMasked) {
63
65
  this.bytes = bytes;
64
- this.maskedParts = maskedParts;
66
+ this.buildMasked = buildMasked;
65
67
  }
66
- /** The message with PIN and TAN masked; decoded only when a logger asks for it. */
68
+ /**
69
+ * The message with PIN and TAN masked; built only when a logger asks for it. It is decoded as a whole, as the bank's
70
+ * text is, so a message that mixes ISO 8859-1 text with UTF-8 text (`encodeText`) shows all of it as ISO 8859-1.
71
+ */
67
72
  get masked() {
68
- return this.maskedParts.map(decodeBankText).join('');
73
+ return decodeBankText(this.buildMasked());
69
74
  }
70
75
  }
71
76
  /**
@@ -74,64 +79,59 @@ export class OutgoingMessage {
74
79
  * With `security` the segments are signed with PIN and optional `tan` (HNSHK … HNSHA) and wrapped in the encryption
75
80
  * envelope (HNVSK, HNVSD) that PIN/TAN uses without actual encryption.
76
81
  *
77
- * The masked message states the sizes of its masked content, so that the log does not tell how long PIN and TAN are.
82
+ * The masked message is built as the message is, from the same time stamp and security control reference, with `***`
83
+ * for PIN and TAN, so that the log does not tell how long they are.
78
84
  */
79
85
  export function buildMessage(parts) {
80
- const body = parts.security === undefined
81
- ? plainBody(parts.segments)
82
- : signedBody(parts.segments, parts.security, parts.tan, parts.now ?? new Date());
86
+ const { security, tan } = parts;
87
+ if (security === undefined) {
88
+ const bytes = withHeaderAndTrailer(parts, plainBody(parts.segments));
89
+ return new OutgoingMessage(bytes, () => bytes);
90
+ }
91
+ const time = parts.now ?? new Date();
92
+ const controlReference = securityControlReference();
93
+ const build = (pin, tanValue) => withHeaderAndTrailer(parts, signedBody(parts.segments, security, pin, tanValue, time, controlReference));
94
+ return new OutgoingMessage(build(security.pin, tan), () => build('***', tan === undefined ? undefined : '***'));
95
+ }
96
+ /** `body` between the header and the trailer of message `messageNumber` of the dialog `dialogId`. */
97
+ function withHeaderAndTrailer(parts, body) {
83
98
  const trailer = new SegmentSpec('HNHBS', 1, [parts.messageNumber]).build(body.nextNumber);
99
+ const header = (size) => new SegmentSpec('HNHBK', 3, [
100
+ size.toString().padStart(12, '0'),
101
+ 300,
102
+ new Verbatim(parts.dialogId),
103
+ parts.messageNumber,
104
+ ]).build(1);
84
105
  // The header states the size of the whole message, itself included; its own size does not depend on it.
85
- const header = (size) => new SegmentSpec('HNHBK', 3, [size.toString().padStart(12, '0'), 300, parts.dialogId, parts.messageNumber]).build(1);
86
- const sizeOf = (sections) => header(0).length + lengthOf(sections) + trailer.length;
87
- const result = new BytesBuilder();
88
- result.add(header(sizeOf([body.bytes])));
89
- result.add(body.bytes);
90
- result.add(trailer);
91
- return new OutgoingMessage(result.takeBytes(), [header(sizeOf(body.masked)), ...body.masked, trailer]);
92
- }
93
- /** The number of bytes in `parts` together. */
94
- function lengthOf(parts) {
95
- return parts.reduce((sum, part) => sum + part.length, 0);
106
+ const size = header(0).length + body.segments.reduce((sum, s) => sum + s.length, 0) + trailer.length;
107
+ return concatBytes([header(size), ...body.segments, trailer]);
96
108
  }
97
109
  /** The segments of a message without security, as the anonymous dialog sends them. */
98
110
  function plainBody(segments) {
99
- const built = segments.map((segment, i) => segment.build(i + 2));
100
- const bytes = new BytesBuilder();
101
- built.forEach((b) => {
102
- bytes.add(b);
103
- });
104
- return { bytes: bytes.takeBytes(), masked: built, nextNumber: built.length + 2 };
111
+ return { segments: segments.map((segment, i) => segment.build(i + 2)), nextNumber: segments.length + 2 };
105
112
  }
106
- /** The segments signed with PIN and optional `tan`, inside the encryption envelope. */
107
- function signedBody(segments, security, tan, time) {
113
+ /** The segments signed with `pin` and optional `tan`, inside the encryption envelope. */
114
+ function signedBody(segments, security, pin, tan, time, controlReference) {
108
115
  const profile = ['PIN', isTwoStep(security) ? 2 : 1];
109
- const controlReference = securityControlReference();
110
- const inner = new BytesBuilder();
111
- const maskedInner = [];
112
- const addInner = (built, masked) => {
113
- inner.add(built);
114
- maskedInner.push(masked ?? built);
115
- };
116
- addInner(new SegmentSpec('HNSHK', 4, [
117
- profile,
118
- security.securityFunction,
119
- controlReference,
120
- signedArea,
121
- issuer,
122
- sender(security.systemId),
123
- securityReference,
124
- timestamp(time),
125
- hashAlgorithm,
126
- signatureAlgorithm,
127
- keyName(security, 'S'),
128
- ]).build(2));
116
+ const inner = [
117
+ new SegmentSpec('HNSHK', 4, [
118
+ profile,
119
+ security.securityFunction,
120
+ controlReference,
121
+ signedArea,
122
+ issuer,
123
+ sender(security.systemId),
124
+ securityReference,
125
+ timestamp(time),
126
+ hashAlgorithm,
127
+ signatureAlgorithm,
128
+ keyName(security, 'S'),
129
+ ]).build(2),
130
+ ];
129
131
  let number = 3;
130
132
  for (const segment of segments)
131
- addInner(segment.build(number++));
132
- const signatureEnd = (pin, tanValue) => new SegmentSpec('HNSHA', 2, [controlReference, null, [pin, tanValue]]);
133
- addInner(signatureEnd(security.pin, tan).build(number), signatureEnd('***', tan === undefined ? undefined : '***').build(number));
134
- const innerBytes = inner.takeBytes();
133
+ inner.push(segment.build(number++));
134
+ inner.push(new SegmentSpec('HNSHA', 2, [controlReference, null, [pin, tan]]).build(number));
135
135
  const encryptionHead = new SegmentSpec('HNVSK', 3, [
136
136
  profile,
137
137
  plainText,
@@ -142,16 +142,8 @@ function signedBody(segments, security, tan, time) {
142
142
  keyName(security, 'V'),
143
143
  noCompression,
144
144
  ]).build(998);
145
- const bytes = new BytesBuilder();
146
- bytes.add(encryptionHead);
147
- bytes.add(new SegmentSpec('HNVSD', 1, [new Binary(innerBytes)]).build(999));
148
- const masked = [
149
- encryptionHead,
150
- latin1Encode(`HNVSD:999:1+@${lengthOf(maskedInner)}@`),
151
- ...maskedInner,
152
- latin1Encode("'"),
153
- ];
154
- return { bytes: bytes.takeBytes(), masked, nextNumber: number + 1 };
145
+ const encryptedData = new SegmentSpec('HNVSD', 1, [new Binary(concatBytes(inner))]).build(999);
146
+ return { segments: [encryptionHead, encryptedData], nextNumber: number + 1 };
155
147
  }
156
148
  /** A received message, with the segments of the encryption envelope unpacked. */
157
149
  export class IncomingMessage3 {
@@ -164,8 +156,11 @@ export class IncomingMessage3 {
164
156
  * approval reports on the order of an earlier message (PIN/TAN B.4.2.1).
165
157
  */
166
158
  feedback;
159
+ /** Whether the bank rejected the message as a whole (an error in HIRMG), rather than single orders in it. */
167
160
  messageRejected;
168
- constructor(segments, size) {
161
+ constructor(segments,
162
+ /** The memory the message holds, in bytes: its length, and what its parts take beyond that. */
163
+ size) {
169
164
  this.segments = segments;
170
165
  this.size = size;
171
166
  this.feedback = Object.freeze(['HIRMG', 'HIRMS'].flatMap((type) => segments.filter((s) => s.type === type).flatMap(feedbackOf)));
@@ -175,34 +170,95 @@ export class IncomingMessage3 {
175
170
  .some((f) => f.isError);
176
171
  }
177
172
  /**
178
- * Parses a message; throws `FormatError` if `data` is not a FinTS message, such as the HTML page of a proxy or a
179
- * maintenance notice.
173
+ * Parses a message; throws `FormatError` if `data` is not one complete FinTS message, such as the HTML page of a
174
+ * proxy, a maintenance notice, a message cut short, which lacks the message trailer (HNHBS) at its end, or two
175
+ * messages run together, whose second would pass for part of the first. It does as well for more than one encrypted
176
+ * part (HNVSD), each of which `parseSegments` would allow as many data elements as the whole message.
177
+ *
178
+ * Its `size` counts the memory of the data elements it keeps along with its bytes, since a message of many short
179
+ * elements takes far more memory than bytes.
180
180
  */
181
181
  static parse(data) {
182
- const outer = parseSegments(data);
182
+ let outer = [];
183
+ try {
184
+ outer = parseSegments(data);
185
+ }
186
+ catch (error) {
187
+ // Text that is no FinTS message, such as a web page, seldom ends with a segment terminator; that it has no
188
+ // message header says more than what the parser trips over first.
189
+ if (!(error instanceof FormatError) || startsWithMessageHeader(data))
190
+ throw error;
191
+ }
183
192
  if (outer[0]?.type !== 'HNHBK')
184
193
  throw new FormatError('Not a FinTS message: no message header');
194
+ if (outer.at(-1)?.type !== 'HNHBS')
195
+ throw new FormatError('Incomplete FinTS message: no message trailer');
196
+ if (outer.filter((s) => s.type === 'HNHBK' || s.type === 'HNHBS').length > 2) {
197
+ throw new FormatError('More than one FinTS message');
198
+ }
199
+ if (outer.filter((s) => s.type === 'HNVSD').length > 1) {
200
+ throw new FormatError('More than one encrypted part (HNVSD)');
201
+ }
185
202
  const segments = [];
186
203
  for (const s of outer) {
187
- if (s.type === 'HNVSD') {
188
- const payload = s.binary(1);
189
- if (payload !== undefined)
190
- segments.push(...parseSegments(payload));
191
- }
192
- else {
204
+ if (s.type !== 'HNVSD') {
193
205
  segments.push(s);
206
+ continue;
194
207
  }
208
+ const payload = s.binary(1);
209
+ if (payload === undefined)
210
+ throw new FormatError('Encrypted data (HNVSD) without binary data');
211
+ for (const inner of parseSegments(payload))
212
+ segments.push(inner);
195
213
  }
196
- return new IncomingMessage3(segments, data.length);
214
+ let elements = 0;
215
+ for (const s of segments)
216
+ for (const group of s.elements)
217
+ elements += group.length;
218
+ return new IncomingMessage3(segments, data.length + elements * parsedElementBytes);
197
219
  }
198
220
  static combine(first, second) {
199
221
  return new IncomingMessage3([...first.segments, ...second.segments], first.size + second.size);
200
222
  }
223
+ /** Free-text messages the bank addresses to the user. */
201
224
  get bankMessages() {
202
225
  return this.findAll('HIKIM').map((m) => new BankMessage(m.text(1) ?? '', m.text(2) ?? ''));
203
226
  }
227
+ /** The dialog ID the bank assigned, as `Segment.verbatim` reads it, to send back byte for byte. */
204
228
  get dialogId() {
205
- return this.find('HNHBK')?.text(3);
229
+ return this.find('HNHBK')?.verbatim(3);
230
+ }
231
+ /**
232
+ * Whether the message answers message `number` of the dialog `dialogId`: header and trailer carry that number, and the
233
+ * header names that message where it names the message it refers to (Bezugsnachricht). The dialog ID counts only once
234
+ * the bank has assigned one; before, `dialogId` is `undefined`, since every first message goes out under the same.
235
+ */
236
+ answers(number, dialogId) {
237
+ const header = this.find('HNHBK');
238
+ // The trailer comes last, after the segments of the encryption envelope, which might hold one of their own.
239
+ const trailer = this.segments.at(-1);
240
+ if (header === undefined || trailer?.type !== 'HNHBS')
241
+ return false;
242
+ const inDialog = (id) => dialogId === undefined || id === dialogId;
243
+ const namesReference = header.group(5).some((e) => !e.isEmpty);
244
+ return (header.integer(4) === number &&
245
+ trailer.integer(1) === number &&
246
+ inDialog(header.verbatim(3)) &&
247
+ (!namesReference || (header.integer(5, 1) === number && inDialog(header.verbatim(5, 0)))));
248
+ }
249
+ /**
250
+ * Whether the message is the bank's dialog abort message (Formals B.7.6) for message `number` of the dialog
251
+ * `dialogId`: unencrypted, with nothing but the header, an error for the whole message (HIRMG) and the trailer. Its
252
+ * header names the dialog ID and the message number where the bank knows them, and `unbekannt` and 9999 where not.
253
+ */
254
+ aborts(number, dialogId) {
255
+ const header = this.segments[0];
256
+ const id = header.verbatim(3);
257
+ const messageNumber = header.integer(4);
258
+ return (this.segments.length === 3 &&
259
+ this.messageRejected &&
260
+ (id === 'unbekannt' || id === dialogId) &&
261
+ (messageNumber === 9999 || messageNumber === number));
206
262
  }
207
263
  find(type) {
208
264
  return this.segments.find((s) => s.type === type);
@@ -211,6 +267,10 @@ export class IncomingMessage3 {
211
267
  return this.segments.filter((s) => s.type === type);
212
268
  }
213
269
  }
270
+ /**
271
+ * The return codes of `s`. Their parameters are values the client or the app sends back, such as the position to
272
+ * continue at or new login data, so they are read as `Segment.verbatim` reads them.
273
+ */
214
274
  function feedbackOf(s) {
215
275
  const feedback = [];
216
276
  for (let i = 1; i < s.length; i++) {
@@ -220,7 +280,7 @@ function feedbackOf(s) {
220
280
  const parameters = [];
221
281
  // Empty parameters stay, as empty text, so that each keeps its position.
222
282
  for (let j = 3; j < s.group(i).length; j++)
223
- parameters.push(s.text(i, j) ?? '');
283
+ parameters.push(s.verbatim(i, j) ?? '');
224
284
  feedback.push(new FinTsFeedback({ code, reference: s.text(i, 1), text: s.text(i, 2) ?? '', parameters }));
225
285
  }
226
286
  return feedback;
@@ -234,7 +294,8 @@ export function decodeTransport(body) {
234
294
  if (startsWithMessageHeader(body))
235
295
  return body;
236
296
  try {
237
- return decodeBase64Lines(latin1Decode(body));
297
+ // Base64 is ASCII, which UTF-8 decodes natively; anything else is no base64 either way.
298
+ return decodeBase64Lines(utf8Decode(body, true));
238
299
  }
239
300
  catch (error) {
240
301
  if (error instanceof FormatError)
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/v3/message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/v3/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { FinTsConfig } from '../core/config.js';
2
+ import { type JsonObject } from '../util/json.js';
3
+ import type { IncomingMessage3 } from './message.js';
4
+ import { Bpd3, Upd3 } from './parameters.js';
5
+ import { Verbatim } from './syntax.js';
6
+ /** The limits the bank parameter data set on the messages the client sends (`ParameterStore.limits`). */
7
+ export interface MessageLimits {
8
+ /** The shortest and longest PIN a login may carry. */
9
+ readonly pinLength: {
10
+ readonly min: number | undefined;
11
+ readonly max: number | undefined;
12
+ } | undefined;
13
+ /** The size of the largest message, in kilobytes. */
14
+ readonly maxMessageSize: number | undefined;
15
+ }
16
+ /**
17
+ * The parameter data and IDs the bank sends the user `config` names, which the messages and business transactions
18
+ * take, and which the saved state keeps: the bank and user parameter data, the customer system ID, and the names of
19
+ * the TAN media as the bank sent them.
20
+ */
21
+ export declare class ParameterStore {
22
+ readonly config: FinTsConfig;
23
+ private systemIdValue;
24
+ private bpd;
25
+ /**
26
+ * Whether the bank parameter data came from the anonymous dialog. They serve until those of a dialog signed with the
27
+ * PIN come: the bank may send a user other ones (PIN/TAN B.4.3.1), and the anonymous dialog may have had to do
28
+ * without the announcement of strong customer authentication. So signed dialogs report version 0 for them, which has
29
+ * the bank send its parameter data anew.
30
+ */
31
+ private bpdAnonymous;
32
+ /** The limits a refresh took from the anonymous dialog's parameter data (`keepRefreshedLimits`). */
33
+ private refreshedLimits;
34
+ private upd;
35
+ /**
36
+ * The names of the TAN media in the bank's last list whose text would not go back as the bank sent them, by their
37
+ * text, as `parseTanMedia` notes them (`readTanMediumNames` for a state of 0.2.0). Saved with the state, as the
38
+ * medium in use is.
39
+ */
40
+ private tanMediumNames;
41
+ constructor(config: FinTsConfig);
42
+ /** The bank parameter data received so far, if any. */
43
+ get bankParameters(): Bpd3 | undefined;
44
+ /** The user parameter data received so far, if any. */
45
+ get userParameters(): Upd3 | undefined;
46
+ /**
47
+ * The customer system ID the bank assigned in the synchronization, as `Segment.verbatim` reads it; `undefined`
48
+ * before. No dialog signed with the PIN starts without it.
49
+ */
50
+ get systemId(): string | undefined;
51
+ /**
52
+ * The limits on the messages the client sends: those of the bank parameter data, unless a refresh took others
53
+ * (`keepRefreshedLimits`).
54
+ */
55
+ get limits(): MessageLimits;
56
+ /**
57
+ * The version of the bank parameter data a dialog reports: 0 where there are none, only the anonymous dialog's, or
58
+ * where limits a refresh took stand in for theirs (`keepRefreshedLimits`).
59
+ */
60
+ get reportedBpdVersion(): number;
61
+ /**
62
+ * The version of the user parameter data a signed dialog reports: 0 where there are none, or where they name another
63
+ * user ID than the one logging in, so that the bank sends the user's anew. They may be another user's, as where a
64
+ * relay mixed up the answers to the synchronizations of two users and the bank takes the other user's customer system
65
+ * ID. A bank that names the user by another ID than the login's, such as for an alias, only sends its user parameter
66
+ * data at every login.
67
+ */
68
+ get reportedUpdVersion(): number;
69
+ /**
70
+ * Drops the customer system ID the bank no longer accepts, so that a synchronization is required again, and with it
71
+ * the user parameter data, which the next login delivers anew: what came along with an ID the bank does not know may
72
+ * not be the user's either (`reportedUpdVersion`). Returns whether there was an ID.
73
+ */
74
+ forgetSystemId(): boolean;
75
+ /**
76
+ * Keeps the parameter data and IDs in `response`, an answer to the opening of a signed dialog: the login, which may be
77
+ * a synchronization, or its approval. The bank sends them there (Formals C.3.1); taken from the answer to an order,
78
+ * the parameter data a bank repeats there in part would replace the complete ones.
79
+ */
80
+ keep(response: IncomingMessage3): void;
81
+ /**
82
+ * Keeps the bank parameter data in `response`, the answer of an anonymous dialog, where there are none from a dialog
83
+ * signed with the PIN: until those come, the dialogs signed with the PIN have the bank send its parameter data anew,
84
+ * since it may send a user other ones (PIN/TAN B.4.3.1). Keeps nothing that belongs to a user.
85
+ */
86
+ keepAnonymous(response: IncomingMessage3): void;
87
+ /**
88
+ * Keeps the limits of the bank parameter data in `response`, the answer of an anonymous dialog the client asked for
89
+ * after the limits kept ruled out a login: those may be outdated, as saved ones are. Parameter data of the version
90
+ * kept tell nothing new, and the bank may send a user other ones than the anonymous dialog (PIN/TAN B.4.3.1), so of
91
+ * those of another version it keeps the limits only, and the PIN lengths only where they state them (HIPINS). They
92
+ * stand in for those kept until a dialog signed with the PIN brings parameter data.
93
+ */
94
+ keepRefreshedLimits(response: IncomingMessage3): void;
95
+ private keepBankParameters;
96
+ /** Keeps `names`, the names of the bank's latest list of TAN media as `parseTanMedia` notes them. */
97
+ keepTanMediumNames(names: Map<string, string>): void;
98
+ /**
99
+ * The TAN medium `name` to send: as the bank sent it, where its last list of TAN media noted that (`parseTanMedia`);
100
+ * otherwise as text, which goes out without the blanks at either end a name the app passes may have.
101
+ */
102
+ tanMediumToSend(name: string): string | Verbatim;
103
+ /** The parameter data and IDs as JSON data, for the client's saved state. */
104
+ saveState(): JsonObject;
105
+ /**
106
+ * Restores what `saveState` saved, with `tanMedium`, the medium in use the state holds; throws if `saved` is damaged,
107
+ * leaving the store unchanged.
108
+ */
109
+ restoreState(saved: JsonObject, tanMedium?: string): void;
110
+ }
111
+ //# sourceMappingURL=parameter-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-store.d.ts","sourceRoot":"","sources":["../../src/v3/parameter-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAA+D,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE/G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,IAAI,EAAkB,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,yGAAyG;AACzG,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IAEvG,qDAAqD;IACrD,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED;;;;GAIG;AACH,qBAAa,cAAc;IAuBb,QAAQ,CAAC,MAAM,EAAE,WAAW;IAtBxC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,GAAG,CAAmB;IAE9B;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAS;IAE7B,oGAAoG;IACpG,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,GAAG,CAAmB;IAE9B;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAA6B;gBAE9B,MAAM,EAAE,WAAW;IAExC,uDAAuD;IACvD,IAAI,cAAc,IAAI,IAAI,GAAG,SAAS,CAErC;IAED,uDAAuD;IACvD,IAAI,cAAc,IAAI,IAAI,GAAG,SAAS,CAErC;IAED;;;OAGG;IACH,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,CAG1B;IAED;;;OAGG;IACH,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED;;;;;;OAMG;IACH,IAAI,kBAAkB,IAAI,MAAM,CAG/B;IAED;;;;OAIG;IACH,cAAc,IAAI,OAAO;IAOzB;;;;OAIG;IACH,IAAI,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAMtC;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI/C;;;;;;OAMG;IACH,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IASrD,OAAO,CAAC,kBAAkB;IAQ1B,qGAAqG;IACrG,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIpD;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ;IAKhD,6EAA6E;IAC7E,SAAS,IAAI,UAAU;IAWvB;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;CAmB1D"}