124 Commits

Author SHA1 Message Date
nanov
5e73d3ce5e bump 2019-12-18 16:53:18 +02:00
nanov
c7e739f767 lock 2019-12-18 16:49:26 +02:00
nanov
478571e447 chore: update deps 2019-12-18 16:49:20 +02:00
nanov
f6dfdf4c40 feat: generalize examples 2019-12-18 16:48:05 +02:00
Dimitar Nanov
fcbf4ca165 Merge pull request #28 from Herrie82/herrie/config
examples: Externalize configuration values and allow for multiple env…
2019-12-18 10:37:02 +02:00
nanov
6187902ae5 chore: transfer to new repository 2019-12-16 14:28:35 +02:00
Dimitar Nanov
65658ab131 Merge pull request #29 from Herrie82/herrie/send-XG1
Add XG1 order type and example
2019-12-13 10:36:30 +02:00
Herrie
d38460011c Add XG1 order type and example
XG1 order type is used for ISO XML 20022 CGI (Common Global Implementation) which should be a unified format that works within a country (irrespective of bank).

Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-29 14:38:46 +01:00
Dimitar Nanov
b9058fac93 Merge pull request #27 from Herrie82/herrie/SupportedBank
README.md: Add Bank GPB International S.A. to supported bank list
2019-11-29 14:14:10 +02:00
Herrie
c3d3decd6a examples: Externalize configuration values and allow for multiple environments
In order to more easily manage testing of various order types as well as production, development etc. environments, externalize this config values.

Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-29 13:12:15 +01:00
Herrie
a5b65f815e README.md: Add Bank GPB International S.A. to supported bank list
I was able to test DKI, INI, HAA, HAC, HEV, HVD, STA, VMK, XG1 with Bank GPB International S.A., so I think we're good to add it to the supported bank list.

Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-29 11:46:53 +01:00
nanov
5f57a072ea chore: changelog 2019-11-26 18:25:29 +02:00
nanov
f95ecc60b8 chore: changelog 2019-11-26 18:24:35 +02:00
nanov
3873ff49d1 bump version 2019-11-26 18:23:52 +02:00
nanov
9725380edd feat: add C53, C52 and DKI orders 2019-11-26 18:22:09 +02:00
nanov
f2a3d6f067 chore: gitignore 2019-11-26 18:21:56 +02:00
Dimitar Nanov
6d882f56fe Merge pull request #26 from Herrie82/herrie/DKI
* Add DKI, C52, C53 order types.
* Some examples for STA, VMK, C52, C53, DKI and HKD order types.
* Rename example for HBT into HTD.
2019-11-26 18:15:32 +02:00
nanov
88ba543784 feat: add ebics 061011 error 2019-11-26 18:13:30 +02:00
Herrie
f8c9cc7ba8 Add C52/C53 order types and examples
Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-25 16:22:39 +01:00
Herrie
0c08d534ff Add examples for MT940 and MT942
Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-25 16:22:39 +01:00
Herrie
ad7d55ce7c Add example for HKD order type
Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-25 16:20:59 +01:00
Herrie
c15e19d22f Rename send-hbt-order.js to send-htd-order.js
To reflect the name of the order type correctly.

Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-25 16:20:59 +01:00
Herrie
d2473bb81d Add DKI order type
To download Exchange rate files and fix syntax error.

Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-25 16:20:59 +01:00
nanov
4e6383e23c chore: add coveralls to travis 2019-11-20 19:46:39 +02:00
nanov
a4a64709f0 chore: update dependencies 2019-11-20 19:40:23 +02:00
nanov
7533a861e5 chore: add coveralls badge 2019-11-20 19:38:57 +02:00
nanov
e56e7f224b test: add coveralls support 2019-11-20 19:37:32 +02:00
nanov
6d73ef77d4 test: add additional tests 2019-11-20 14:42:22 +02:00
nanov
a10a3a8d63 feat: async letter serialization 2019-11-20 14:40:18 +02:00
nanov
67d74cfa00 test: add more tests 2019-11-20 11:12:37 +02:00
nanov
ddd0933c0b chore: add Herrie82 to contributors list 2019-11-19 19:48:05 +02:00
Dimitar Nanov
ea52c71fb2 Merge pull request #24 from Herrie82/herrie/english
feat: Add English template & flexible generation
2019-11-19 19:46:46 +02:00
Dimitar Nanov
ddcd31a5c0 Merge pull request #23 from Herrie82/master
chore: Various fixes for spelling
2019-11-19 19:44:11 +02:00
Herrie
95403cbe6f Bank Letter: Add English template & flexible generation
Allow for both German (de) and English (en) initialization letters.

Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-19 16:57:13 +01:00
Herman van Hazendonk
0b9d93f745 Various fixes for spelling
Various minor spelling mistake fixes.

Signed-off-by: Herman van Hazendonk <github.com@herrie.org>
2019-11-19 14:48:26 +01:00
nanov
6ecb256483 tests: start Client tests 2019-11-08 11:24:59 +02:00
nanov
d482b1dde1 chore: update readme 2019-11-07 11:53:09 +02:00
nanov
ecf51680c5 chore: add logo 2019-11-07 11:49:22 +02:00
nanov
9a748fa2bc chore: changelog and files settings 2019-11-07 11:42:37 +02:00
nanov
7355096dfd v0.1.2 2019-11-07 11:37:34 +02:00
nanov
25eedd5071 chore: update package.json 2019-11-07 11:36:04 +02:00
Dimitar Nanov
4182e7956a Merge pull request #22 from eCollect/release-it
chore: add changelog configoration
2019-11-07 11:35:34 +02:00
nanov
fee2aa4681 chore: add version script 2019-11-07 11:35:11 +02:00
nanov
1f34dcbfb6 add changelog configoration 2019-11-07 11:20:34 +02:00
nanov
3a64d95eb5 chore: add tags 2019-11-07 10:58:38 +02:00
Dimitar Nanov
926d1bca18 Merge pull request #21 from eCollect/feat/drop-bn.js
Closes #17 and #13
2019-11-07 10:52:01 +02:00
nanov
6d601f4186 chore: fix package json syntax 2019-11-07 10:42:11 +02:00
nanov
2d05bf88f9 chore: add contributors to package json 2019-11-07 10:41:43 +02:00
nanov
10e0d602bd chore: update license expression in package.json 2019-11-07 10:38:01 +02:00
nanov
eea0a49130 feat: drop bn.js 2019-11-07 10:37:31 +02:00
nanov
3e95478b3b feat: add nyc and cleanup .gitignore 2019-11-07 10:35:31 +02:00
nanov
4496cbf560 feat: remove toBuffer from number 2019-11-07 10:30:03 +02:00
nanov
0efc46b014 feat add BigNumber tests 2019-11-07 10:27:20 +02:00
nanov
eafe2f9f55 chore: restructure BigNumber 2019-11-07 10:27:08 +02:00
nanov
24afdeb257 chroe: import consts 2019-11-07 10:26:53 +02:00
nanov
34051f0a9f feat: migrate Crypto to own BigNumber 2019-11-07 08:58:52 +02:00
nanov
14779088f1 chore: lint 2019-11-07 08:57:54 +02:00
nanov
aad0bd97c8 feat: implement all needed BigNumber methods 2019-11-07 08:57:44 +02:00
nanov
429e807994 fix number generarion 2019-11-06 17:27:48 +02:00
nanov
bb8d1cfaa0 wip: migrate MFG1 to BigNumber 2019-11-06 17:16:56 +02:00
nanov
cda36bfcb3 wip: implement BigNumber wrapper 2019-11-06 17:16:15 +02:00
Dimitar Nanov
d21d89fb36 Merge pull request #20 from eCollect/feat/drop-moment
Drop moment dependency
2019-11-06 16:55:15 +02:00
nanov
df9c330411 feat: drop moment dependency 2019-11-06 16:52:31 +02:00
nanov
2a17ff6056 chore: write tests for date range 2019-11-06 16:52:20 +02:00
nanov
33ac6ac60f feat: implement date handling and formatting 2019-11-06 16:51:59 +02:00
nanov
e9f7c11bbb v0.1.1 2019-11-05 06:48:24 +02:00
nanov
9aabe933e9 chore: update license 2019-11-05 06:41:31 +02:00
nanov
dc5f52198b v0.1.0 2019-11-05 06:26:02 +02:00
nanov
bb5e551057 chore: cleanup readme 2019-11-05 06:24:39 +02:00
nanov
0a3a4631df update readme 2019-11-05 06:23:45 +02:00
nanov
3ffa323264 chore: commit test keys for tests to pass 2019-11-05 06:22:16 +02:00
nanov
e56dc082d0 chore: add travis config 2019-11-05 06:13:27 +02:00
nanov
0c01420c1e chore: cleanup 2019-11-05 06:09:07 +02:00
nanov
0964992164 chore: drop node-rsa 2019-11-05 06:00:09 +02:00
Dimitar Nanov
5c419630c1 Merge pull request #16 from eCollect/feat/handle-unsual-exponent
Feat: handle unsual exponent migrate to node-forge
2019-11-05 05:58:50 +02:00
Dimitar Nanov
594f2a2623 Merge pull request #15 from eCollect/chore/tests
Add order generation tests and fix linting
2019-11-05 05:55:33 +02:00
nanov
fa557f5e9b feat: tests 2019-11-05 05:54:32 +02:00
nanov
cf16abc843 chire: jsdoc 2019-11-05 05:54:16 +02:00
nanov
c60fed4d58 chore: lint 2019-11-05 05:54:09 +02:00
nanov
9aa2ab7380 chore: lint 2019-11-05 05:53:20 +02:00
nanov
fe2ad67139 chore: update linter 2019-11-05 05:49:07 +02:00
Vladislav Hristov
104ec67f8c chore: add ; at the end of Key.js 2019-11-01 16:52:36 +02:00
Vladislav Hristov
e8a80932e1 fit: key size is now calculated instead of hardcoded 2019-11-01 16:50:39 +02:00
Vladislav Hristov
ce6cd02e58 fit: BankLetter.js get key size 2019-11-01 16:28:04 +02:00
Vladislav Hristov
836ec0ebf3 fit(tests): use new Key in keys test 2019-11-01 13:49:59 +02:00
Vladislav Hristov
59a281c895 feat: use new Key in Keys manager 2019-11-01 13:49:33 +02:00
Vladislav Hristov
61ada747f3 clean: remove modulus and exponent property from bankKeys() 2019-11-01 13:48:51 +02:00
Vladislav Hristov
f15e09840a add: add Key class to manage a single key 2019-11-01 13:44:29 +02:00
nanov
422821fbbd feat: test all H004 orders 2019-11-01 11:27:36 +02:00
nanov
e40f79cee6 feat: prepare order generation tests 2019-11-01 08:13:53 +02:00
Dimitar Nanov
837fdaa08c Merge pull request #14 from yagop/test/mocha-script
test script run mocha
2019-11-01 05:59:38 +02:00
Yago Perez
361acf89d0 test script run mocha 2019-10-31 21:40:07 +01:00
Vladislav Hristov
4149c01695 wip: migrate to node-forge 2019-10-31 18:57:42 +02:00
Vladislav Hristov
1c1f112ff5 fix: modulus zero byte handling 2019-10-30 10:53:03 +02:00
nanov
1320f6f21d chore: update deps 2019-10-14 14:19:11 +03:00
Vladislav Hristov
0049fffc00 up the version to 0.0.8 2019-10-08 16:10:08 +03:00
Vladislav Hristov
2c9040904a chore: remove console.log statements 2019-10-08 16:09:08 +03:00
Dimitar Nanov
0f6dcf9eb2 Merge pull request #11 from yagop/fix-version
chore: readme maintenance
2019-10-03 09:32:17 +03:00
nanov
ca31edf245 chore: add yagop to contributors 2019-10-03 09:30:49 +03:00
nanov
4464349d0f chore: remove version from readme 2019-10-03 09:29:35 +03:00
Dimitar Nanov
15546df9ea Merge pull request #10 from yagop/examples
Provide examples
2019-10-03 09:20:29 +03:00
Yago Perez
40467a2c5e v0.0.35 -> v0.0.7 2019-10-03 00:20:36 +02:00
Yago Perez
eb9fbf5834 Change HBT order text 2019-10-03 00:10:52 +02:00
Yago Perez
166c61aec4 examples/send-hbt-order.js 2019-10-02 23:58:37 +02:00
Yago Perez
5a63e19aab examples/save-bank-kesy.js 2019-10-02 23:58:35 +02:00
Yago Perez
9e6c318372 keys -> passphrase 2019-10-02 23:58:33 +02:00
Yago Perez
ce6e58b3f3 examples/bankLetter.js 2019-10-02 23:58:29 +02:00
Yago Perez
7dad7c8787 initialize.js 2019-10-02 23:56:51 +02:00
Dimitar Nanov
79f17e1404 bump version 2019-08-02 10:52:48 +03:00
Dimitar Nanov
3ef32c8ce5 Merge pull request #7 from anandsahil/addCAMT53OrderType
* Add Z53 order type
* Create utils container and move dateRange functionality to there
2019-08-01 16:59:25 +03:00
anandsahil
aa761cf7ad move dateRange from constants to utils 2019-08-01 14:14:30 +02:00
anandsahil
5ff3147124 add new order type XZ53 and removed repeated dateRange to consts 2019-08-01 14:00:07 +02:00
anandsahil
01d4634d86 Merge remote-tracking branch 'src/master' 2019-08-01 13:52:51 +02:00
sahil anand
89904afa63 Merge pull request #2 from anandsahil/minorChanges
remove eCollect from constant and minor verbose error handeling
2019-07-25 17:40:29 +02:00
sahil anand
4907524259 Merge pull request #1 from anandsahil/and-XCT-order-type
add iso pain format XCT order type
2019-07-25 17:40:04 +02:00
Dimitar Nanov
c9f52d3bd9 bump 2019-07-24 09:12:06 +03:00
Dimitar Nanov
f5b05ae491 Merge pull request #4 from anandsahil/minorChanges
remove eCollect from constant and minor verbose error handaling
2019-07-24 09:05:14 +03:00
Dimitar Nanov
9f88b048d7 Merge pull request #5 from anandsahil/and-XCT-order-type
add iso pain format XCT order type
2019-07-24 09:04:22 +03:00
anandsahil
d06e92c51c add iso pain format XCT order type 2019-07-22 17:36:38 +02:00
anandsahil
cb2062ae2f remove eCollect from constant and minor verbose error handeling 2019-07-22 17:31:24 +02:00
Dimitar Nanov
07a48e9cc5 0.0.5 2019-06-28 17:12:49 +03:00
Dimitar Nanov
800002701d Merge pull request #3 from vasyas/master
Fix parsing of the bank keys in the HPB response
2019-06-28 17:09:49 +03:00
vasyas
5f0b6cd374 #2 corrected bank keys parsing 2019-06-27 00:13:44 +03:00
vasyas
c571ef181b tc for bank keys parsing error 2019-06-27 00:10:53 +03:00
80 changed files with 12087 additions and 227 deletions

View File

@@ -10,6 +10,9 @@ charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.xml]
insert_final_newline = false
[*.json]
indent_size = 2

View File

@@ -1,4 +1,5 @@
node_modules/
examples/
build/
static/
config/

View File

@@ -1,34 +1,4 @@
{
"extends": "airbnb-base",
"env": {
"node": true
},
"parserOptions": {
"ecmaVersion": 8,
"sourceType": "script",
"ecmaFeatures": {
"modules": false
}
},
"rules": {
"max-len": 0,
"linebreak-style": 0,
"no-plusplus": [
2,
{
"allowForLoopAfterthoughts": true
}
],
"no-continue": 0,
"indent": [2, "tab"],
"no-tabs": 0,
"strict": [2, "safe"],
"curly": [2, "multi", "consistent"],
"import/no-extraneous-dependencies": 0,
"import/no-unresolved": 0,
"no-underscore-dangle": 0,
"no-param-reassign": 0,
"generator-star-spacing": 0,
"jsx-a11y/href-no-hash": "off"
}
"extends": "ecollect-base",
"root": true
}

31
.gitignore vendored
View File

@@ -1,14 +1,23 @@
npm-debug.log
node_modules
# mac shit
.DS_Store
*.local.json5
yarn.lock
/project.sublime-workspace
/public/css/style.css.map
/.idea
# nyc test coverage
.nyc_output
coverage/
# Dependency directories
node_modules/
# Optional npm cache directory
.npm
npm-debug.log
# Optional eslint cache
.eslintcache
# vscode
/.vscode
*.pid
/coverage
package-lock.json
*.key
*.html
# Tests temporary
.test_tmp

8
.travis.yml Normal file
View File

@@ -0,0 +1,8 @@
language: node_js
node_js:
- "8"
- "9"
- "10"
- "11"
- "12"
after_success: npm run coverage

108
CHANGELOG.md Normal file
View File

@@ -0,0 +1,108 @@
### Changelog
#### [v0.1.3](https://github.com/eCollect/node-ebics-client/compare/v0.1.2...v0.1.3)
> 26 November 2019
- * Add DKI, C52, C53 order types. [`#26`](https://github.com/eCollect/node-ebics-client/pull/26)
- Bank Letter: Add English template & flexible generation [`95403cb`](https://github.com/eCollect/node-ebics-client/commit/95403cbe6f90c81a696bb589533d713a4ba04873)
#### [v0.1.2](https://github.com/eCollect/node-ebics-client/compare/v0.1.1...v0.1.2)
> 7 November 2019
- chore: add changelog configoration [`#22`](https://github.com/eCollect/node-ebics-client/pull/22)
- Closes #17 and #13 [`#21`](https://github.com/eCollect/node-ebics-client/pull/21)
- Drop moment dependency [`#20`](https://github.com/eCollect/node-ebics-client/pull/20)
- feat: add nyc and cleanup .gitignore [`3e95478`](https://github.com/eCollect/node-ebics-client/commit/3e95478b3be719c86f32c7df10c42e46b7518669)
- feat: drop bn.js [`eea0a49`](https://github.com/eCollect/node-ebics-client/commit/eea0a49130e30c123b110120c69d7b7c19fd12ba)
- add changelog configoration [`1f34dcb`](https://github.com/eCollect/node-ebics-client/commit/1f34dcbfb6e0febbb93d5356fa36ac57d697a990)
#### [v0.1.1](https://github.com/eCollect/node-ebics-client/compare/v0.1.0...v0.1.1)
> 5 November 2019
- chore: update license [`9aabe93`](https://github.com/eCollect/node-ebics-client/commit/9aabe933e91b506ea38820b952ce8e5e58b4c2ff)
#### [v0.1.0](https://github.com/eCollect/node-ebics-client/compare/v0.0.8...v0.1.0)
> 5 November 2019
- Feat: handle unsual exponent migrate to node-forge [`#16`](https://github.com/eCollect/node-ebics-client/pull/16)
- Add order generation tests and fix linting [`#15`](https://github.com/eCollect/node-ebics-client/pull/15)
- test script run mocha [`#14`](https://github.com/eCollect/node-ebics-client/pull/14)
- feat: prepare order generation tests [`e40f79c`](https://github.com/eCollect/node-ebics-client/commit/e40f79cee68a194272c93f07e763175b213a77a1)
- chore: cleanup [`0c01420`](https://github.com/eCollect/node-ebics-client/commit/0c01420c1e14992a4169098ccd47cd196b899f06)
#### [v0.0.36](https://github.com/eCollect/node-ebics-client/compare/v0.0.35...v0.0.36)
> 1 June 2018
- various modular fixes [`8492d94`](https://github.com/eCollect/node-ebics-client/commit/8492d940542f61b17aa3a2da7de23f6539ffaad5)
#### [v0.0.35](https://github.com/eCollect/node-ebics-client/compare/v0.0.3...v0.0.35)
> 31 May 2018
- update License to GPL v3 [`babcf76`](https://github.com/eCollect/node-ebics-client/commit/babcf76b61af6eb737ab291a301e71bb84621820)
- Add MGF1.js file - mask generation utility class [`7e6e2ff`](https://github.com/eCollect/node-ebics-client/commit/7e6e2ff142688b0c453369fa7137b49e8b89cd81)
- Add sign, _emsaPSS and _modPowe methods in Key.js file [`5ace213`](https://github.com/eCollect/node-ebics-client/commit/5ace2137231af9a3563ab31fa0f70fbdf4b148cb)
#### [v0.0.8](https://github.com/eCollect/node-ebics-client/compare/v0.0.7...v0.0.8)
> 8 October 2019
- chore: readme maintenance [`#11`](https://github.com/eCollect/node-ebics-client/pull/11)
- Provide examples [`#10`](https://github.com/eCollect/node-ebics-client/pull/10)
- initialize.js [`7dad7c8`](https://github.com/eCollect/node-ebics-client/commit/7dad7c878722be94e03808cef3af38d34019c623)
- examples/bankLetter.js [`ce6e58b`](https://github.com/eCollect/node-ebics-client/commit/ce6e58b3f33017967e5b26fe15a2c435012b8af6)
- examples/send-hbt-order.js [`166c61a`](https://github.com/eCollect/node-ebics-client/commit/166c61aec4a247d923de82278271ec02cbef815f)
#### [v0.0.7](https://github.com/eCollect/node-ebics-client/compare/v0.0.6...v0.0.7)
> 2 August 2019
- * Add Z53 order type [`#7`](https://github.com/eCollect/node-ebics-client/pull/7)
- remove eCollect from constant and minor verbose error handeling [`#2`](https://github.com/eCollect/node-ebics-client/pull/2)
- add iso pain format XCT order type [`#1`](https://github.com/eCollect/node-ebics-client/pull/1)
- add new order type XZ53 and removed repeated dateRange to consts [`5ff3147`](https://github.com/eCollect/node-ebics-client/commit/5ff314712443c4c8465f46292b010cfedfed8c2e)
- move dateRange from constants to utils [`aa761cf`](https://github.com/eCollect/node-ebics-client/commit/aa761cf7ad87a271d6e6d9eed40e04eb4376f6c5)
- bump version [`79f17e1`](https://github.com/eCollect/node-ebics-client/commit/79f17e14045d121c9505eb3118967f5f88ae79e2)
#### [v0.0.6](https://github.com/eCollect/node-ebics-client/compare/v0.0.5...v0.0.6)
> 24 July 2019
- remove eCollect from constant and minor verbose error handaling [`#4`](https://github.com/eCollect/node-ebics-client/pull/4)
- add iso pain format XCT order type [`#5`](https://github.com/eCollect/node-ebics-client/pull/5)
- remove eCollect from constant and minor verbose error handeling [`cb2062a`](https://github.com/eCollect/node-ebics-client/commit/cb2062ae2fbd8e8881de26561efddad1f272e065)
- bump [`c9f52d3`](https://github.com/eCollect/node-ebics-client/commit/c9f52d3bd99b9f8761652365b217d9580fa34632)
#### [v0.0.5](https://github.com/eCollect/node-ebics-client/compare/v0.0.4...v0.0.5)
> 28 June 2019
- Fix parsing of the bank keys in the HPB response [`#3`](https://github.com/eCollect/node-ebics-client/pull/3)
- tc for bank keys parsing error [`c571ef1`](https://github.com/eCollect/node-ebics-client/commit/c571ef181bca2e0cbec70bc6df53c706acd6c829)
- #2 corrected bank keys parsing [`5f0b6cd`](https://github.com/eCollect/node-ebics-client/commit/5f0b6cd3747c4613920d2f71f3c04ce13225d397)
#### [v0.0.4](https://github.com/eCollect/node-ebics-client/compare/v0.0.36...v0.0.4)
> 3 September 2018
- Major changes. Separating responsibilities. Orders builder, serializer. [`ff9a3a1`](https://github.com/eCollect/node-ebics-client/commit/ff9a3a16b47d0a25674134c875bfd651995837e4)
- code optimization [`1876360`](https://github.com/eCollect/node-ebics-client/commit/187636019c290d757aca77d4c14fb4f2519acd38)
- client and order optimization [`9454992`](https://github.com/eCollect/node-ebics-client/commit/945499290a8698aed504b573019de2c23148006a)
#### v0.0.3
> 17 May 2018
- initial commit [`1f947ff`](https://github.com/eCollect/node-ebics-client/commit/1f947ff1480c522f89fa1f547581b55e2378d920)
- Initial commit [`cd37de3`](https://github.com/eCollect/node-ebics-client/commit/cd37de3895e32a61798c79ce3a6447e2f269019d)

View File

@@ -1,5 +1,19 @@
# node-ebics-client v0.0.35
---
<p align="center">
<img src="assets/logo.png" width="300px" height="auto"/>
</p>
<h1 align="center">node-ebics-client</h1>
<p align="center">
<a href="https://travis-ci.org/eCollect/node-ebics-client" title="Build Status"><img src="https://travis-ci.org/eCollect/node-ebics-client.svg?branch=master" alt="Build Status" /></a>
<a href="https://www.npmjs.com/package/ebics-client" title="Build Status">
<img alt="ebics-client" src="https://img.shields.io/npm/v/ebics-client">
</a>
<a href="https://snyk.io/test/github/ecollect/node-ebics-client" title="Known Vulnerabilities">
<img src="https://snyk.io/test/github/ecollect/node-ebics-client/badge.svg" alt="Known Vulnerabilities">
</a>
<a href="/eCollect/node-ebics-client/blob/master/LICENSE" title="GPL-3.0"><img alt="GPL-3.0" src="https://img.shields.io/github/license/eCollect/node-ebics-client"></a>
<a href='https://coveralls.io/github/eCollect/node-ebics-client?branch=master' title="Coverage Status"><img src='https://coveralls.io/repos/github/eCollect/node-ebics-client/badge.svg?branch=master' alt='Coverage Status' /></a>
</p>
Pure node.js ( >=8 ) implementation of [EBICS](https://en.wikipedia.org/wiki/Electronic_Banking_Internet_Communication_Standard) ( Electronic Banking Internet Communication ).
@@ -12,6 +26,8 @@ The client is currently tested and verified to work with the following banks:
* [Credit Suisse (Schweiz) AG](https://www.credit-suisse.com/ch/en.html)
* [Zürcher Kantonalbank](https://www.zkb.ch/en/lg/ew.html)
* [Raiffeisen Schweiz](https://www.raiffeisen.ch/rch/de.html)
* [BW Bank](https://www.bw-bank.de/de/home.html)
* [Bank GPB International S.A.](https://gazprombank.lu/e-banking)
## Inspiration
@@ -21,4 +37,6 @@ The basic concept of this library was inspired by the [EPICS](https://github.com
## Copyright
Copyright: eCollect AG, 2018.
Copyright: eCollect AG, 2018-9.
Licensed under the [GPLv3](LICENSE) license.

BIN
assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

25
changelog-template.hbs Normal file
View File

@@ -0,0 +1,25 @@
### Changelog
{{#each releases}}
{{#if href}}
###{{#unless major}}#{{/unless}} [{{title}}]({{href}})
{{else}}
#### {{title}}
{{/if}}
{{#if tag}}
> {{niceDate}}
{{/if}}
{{#if summary}}
{{summary}}
{{/if}}
{{#each merges}}
- {{message}}{{#if href}} [`#{{id}}`]({{href}}){{/if}}
{{/each}}
{{#commit-list commits heading='' message='' exclude='wip: '}}
- {{#if breaking}}**Breaking change:** {{/if}}{{subject}}{{#if href}} [`{{shorthash}}`]({{href}}){{/if}}
{{/commit-list}}
{{/each}}

26
examples/bankLetter.js Executable file
View File

@@ -0,0 +1,26 @@
#! /usr/bin/env node
'use strict';
const ebics = require('../index');
const path = require('path');
const fs = require('fs');
const os = require('os');
const configjs = require('./config.js');
const client = gClient;
const bankName = gConfig.bankName;
const languageCode = gConfig.languageCode;
const template = fs.readFileSync('../templates/ini_'+languageCode+'.hbs').toString();
const letter = new ebics.BankLetter({ client, bankName, template });
const bankLetterFile = path.join(os.homedir(), 'bankLetter_'+languageCode+'.html');
letter.serialize(bankLetterFile)
.then(() => {
console.log('Send your bank the letter (%s)', bankLetterFile);
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,10 @@
{
"serverAddress": "https://ebics-test.server",
"partnerId": "EBICS ParnerID Test",
"userId": "MyUserIdTest",
"hostId": "MyHostIdTest",
"passphrase": "MyPasswordTest",
"keyStorage": "./keys-test",
"bankName":"Test Bank",
"languageCode":"en"
}

View File

@@ -0,0 +1,10 @@
{
"serverAddress": "https://ebics.server",
"partnerId": "EBICS ParnerID Production",
"userId": "MyUserIdProduction",
"hostId": "MyHostIdProduction",
"passphrase": "MyPasswordProduction",
"keyStorage": "./keys-prod",
"bankName":"Production Bank",
"languageCode":"en"
}

21
examples/getClient.js Normal file
View File

@@ -0,0 +1,21 @@
'use strict';
const { Client, fsKeysStorage } = require('../index');
const loadConfig = require('./loadConfig');
module.exports = ({
serverAddress,
partnerId,
userId,
hostId,
passphrase,
keyStoragePath,
} = loadConfig()) => new Client({
serverAddress,
partnerId,
userId,
hostId,
passphrase,
keyStorage: fsKeysStorage(keyStoragePath),
});

26
examples/initialize.js Executable file
View File

@@ -0,0 +1,26 @@
#! /usr/bin/env node
'use strict';
const ebics = require('../index');
const configjs = require('./config.js');
const client = gClient;
// New keys will be generated and saved in ./keys-test
client.send(ebics.Orders.INI)
.then((resp) => {
console.log('Response for INI order %j', resp);
return client.send(ebics.Orders.HIA);
})
.then((resp) => {
console.log('Response for HIA order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something might went wrong');
console.log('Public keys should be sent to bank now. See examples/bankLetter.js');
})
.catch((err) => {
console.error(err);
process.exit(1);
});

35
examples/loadConfig.js Normal file
View File

@@ -0,0 +1,35 @@
'use strict';
const fs = require('fs');
const path = require('path');
const safeLoadJson = (file) => {
if (!file)
return {};
try {
return JSON.parse(fs.readFileSync(file));
} catch (e) {
console.warn(`Couldn't load ${file} config file.`);
return {};
}
}
const getDefaultEnv = () => {
const [,,parArg] = process.argv;
return parArg || process.env.NODE_ENV;
}
const loadConfig = (configDirectory = path.join(__dirname, './config'), env = getDefaultEnv()) => {
console.log(`Loading config form ${configDirectory} with env set to ${env}.`);
const baseConfigFile = path.join(configDirectory, 'config.json');
const envConfigFile = env ? path.join(configDirectory, `config.${env}.json`) : null;
return {
...safeLoadJson(baseConfigFile),
...safeLoadJson(envConfigFile),
}
}
module.exports = loadConfig();

View File

@@ -0,0 +1,21 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// Client keys must be already generated and send by letter.
// The bank should have enabled the user
client.send(ebics.Orders.HPB)
.then((resp) => {
console.log('Response for HPB order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
console.log('Received bank keys: %j', resp.bankKeys);
return client.setBankKeys(resp.bankKeys);
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,21 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// The bank keys must have been already saved
client.send(ebics.Orders.C52(null, null)) // startDate 'YYYY-MM-DD', endDate 'YYYY-MM-DD'
.then((resp) => {
console.log('Response for C52 order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
// Parsing and processing the CAMT052 file should happen somewhere here, ideally after saving it to disk
const data = Buffer.from(resp.orderData);
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,21 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// The bank keys must have been already saved
client.send(ebics.Orders.C53(null, null)) // startDate 'YYYY-MM-DD', endDate 'YYYY-MM-DD'
.then((resp) => {
console.log('Response for C53 order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
// Parsing and processing the CAMT053 file should happen somewhere here, ideally after saving it to disk
const data = Buffer.from(resp.orderData);
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,21 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// The bank keys must have been already saved
client.send(ebics.Orders.DKI(null, null)) // startDate 'YYYY-MM-DD', endDate 'YYYY-MM-DD'
.then((resp) => {
console.log('Response for DKI order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
// Processing of the Exchange Rate file should go here, ideally after saving it to disk
const data = Buffer.from(resp.orderData);
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,20 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// The bank keys must have been already saved
client.send(ebics.Orders.HKD)
.then((resp) => {
console.log('Response for HKD order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
const data = Buffer.from(resp.orderData);
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,20 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// The bank keys must have been already saved
client.send(ebics.Orders.HTD)
.then((resp) => {
console.log('Response for HTD order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
const data = Buffer.from(resp.orderData);
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,21 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// The bank keys must have been already saved
client.send(ebics.Orders.STA(null, null)) // startDate 'YYYY-MM-DD', endDate 'YYYY-MM-DD'
.then((resp) => {
console.log('Response for STA order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
// Parsing and processing the MT940 file should happen somewhere here, ideally after saving it to disk
const data = Buffer.from(resp.orderData);
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,21 @@
#! /usr/bin/env node
'use strict';
const client = require('./getClient')();
// The bank keys must have been already saved
client.send(ebics.Orders.VMK(null, null)) // startDate 'YYYY-MM-DD', endDate 'YYYY-MM-DD'
.then((resp) => {
console.log('Response for VMK order %j', resp);
if (resp.technicalCode !== '000000')
throw new Error('Something went wrong');
// Parsing and processing the MT942 file should happen somewhere here, ideally after saving it to disk
const data = Buffer.from(resp.orderData);
console.log(data.toString('utf8'));
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -0,0 +1,20 @@
#! /usr/bin/env node
'use strict';
const ebics = require('../index');
const fs = require('fs');
const client = require('./getClient')();
// The bank keys must have been already saved
const paymentFile = fs.readFileSync('mytestfile.xml').toString();
client.send(ebics.Orders.XG1(paymentFile))
.then((resp) => {
console.log('Response for XG1 order %j', resp);
})
.catch((err) => {
console.error(err);
process.exit(1);
});

View File

@@ -2,21 +2,18 @@
const fs = require('fs');
const moment = require('moment');
const handlebars = require('handlebars');
const Crypto = require('./crypto/Crypto');
// const BN = require('bn.js');
const { date } = require('./utils.js');
const registerHelpers = () => {
handlebars.registerHelper('today', () => moment().format('DD.MM.YYYY'));
handlebars.registerHelper('today', () => date.toISODate(Date.now(), false));
handlebars.registerHelper('now', () => moment().format('HH:mm:ss'));
handlebars.registerHelper('now', () => date.toISOTime(Date.now(), false));
handlebars.registerHelper('keyExponentBits', k => Buffer.byteLength(k.e()) * 8);
// handlebars.registerHelper('keyExponentBits', k => Buffer.byteLength(new BN(k.key.keyPair.e).toBuffer()) * 8);
handlebars.registerHelper('keyModulusBits', k => k.key.getKeySize());
// return Buffer.byteLength(new BN(k.key.keyPair.e).toBuffer()) * 8;
handlebars.registerHelper('keyModulusBits', k => k.size());
handlebars.registerHelper('keyExponent', k => k.e('hex'));
@@ -24,11 +21,15 @@ const registerHelpers = () => {
handlebars.registerHelper('sha256', (k) => {
const digest = Buffer.from(Crypto.digestPublicKey(k), 'base64').toString('HEX');
// const digest = Buffer.from(k.publicDigest(), 'base64').toString('HEX');
return digest.toUpperCase().match(/.{1,2}/g).join(' ');
});
};
const writeFile = (file, content) => new Promise((resolve, reject) => fs.writeFile(file, content, (err, result) => {
if (err)
return reject(err);
return resolve(result);
}));
module.exports = class BankLetter {
constructor({
client,
@@ -60,14 +61,7 @@ module.exports = class BankLetter {
async serialize(path) {
const letter = await this.generate();
try {
fs.writeFileSync(path, letter);
console.log('Data written to file');
} catch (error) {
console.log(error);
throw error;
}
return new Promise(resolve => resolve(true));
await writeFile(path, letter);
return true;
}
};

View File

@@ -13,14 +13,47 @@ const response = require('./middleware/response');
const stringifyKeys = (keys) => {
Object.keys(keys).map((key) => {
keys[key] = keys[key] === null ? null : keys[key].toPem();
return key;
});
return JSON.stringify(keys);
};
/**
* Keys persistent object
* @typedef {Object} KeysObject
* @property {string} A006 - PEM representation of the A006 private key
* @property {string} E002 - PEM representation of the E002 private key
* @property {string} X002 - PEM representation of the X002 private key
* @property {string} bankX002 - PEM representation of the bankX002 public key
* @property {string} bankE002 - PEM representation of the bankE002 public key
*/
/**
* Key storage implementation
* @typedef {Object} KeyStorage
* @property {(data: KeysObject):Promise<void>} write - writes the keys to storage
* @property {():Promise<KeysObject>} read - reads the keys from storage
*/
/**
* Client initialization options
* @typedef {Object} EbicClientOptions
* @property {string} url - EBICS URL provided by the bank
* @property {string} partnerId - PARTNERID provided by the bank
* @property {string} hostId - HOSTID provided by the bank
* @property {string} userId - USERID provided by the bank
* @property {string} passphrase - passphrase for keys encryption
* @property {KeyStorage} keyStorage - keyStorage implementation
* @property {object} [tracesStorage] - traces (logs) storage implementation
*/
module.exports = class Client {
/**
*Creates an instance of Client.
* @param {EbicClientOptions} clientOptions
*/
constructor({
url,
partnerId,
@@ -31,18 +64,18 @@ module.exports = class Client {
tracesStorage,
}) {
if (!url)
throw new Error('EBICS URL is requierd');
throw new Error('EBICS URL is required');
if (!partnerId)
throw new Error('partnerId is requierd');
throw new Error('partnerId is required');
if (!userId)
throw new Error('userId is requierd');
throw new Error('userId is required');
if (!hostId)
throw new Error('hostId is requierd');
throw new Error('hostId is required');
if (!passphrase)
throw new Error('passphrase is requierd');
throw new Error('passphrase is required');
if (!keyStorage || typeof keyStorage.read !== 'function' || typeof keyStorage.write !== 'function')
throw new Error('keyStorage implemntation missing or wrong');
throw new Error('keyStorage implementation missing or wrong');
this.url = url;
this.partnerId = partnerId;
@@ -174,6 +207,12 @@ module.exports = class Client {
});
}
async signOrder(order) {
const { version } = order;
const keys = await this.keys();
return signer.version(version).sign((await serializer.use(order, this)).toXML(), keys.x());
}
async keys() {
try {
const keysString = await this._readKeys();

View File

@@ -1,9 +1,8 @@
'use strict';
const packageJson = require('../package.json');
const { version } = require('../package.json');
const name = 'eCollect Node Ebics Client';
const { version } = packageJson;
const name = 'Node Ebics Client';
const orderOperations = {
ini: 'INI',
upload: 'UPLOAD',

66
lib/crypto/BigNumber.js Normal file
View File

@@ -0,0 +1,66 @@
'use strict';
const { jsbn: { BigInteger } } = require('node-forge');
class BigNumber {
constructor(value, radix = 10) {
if (value === null || value === undefined)
throw new Error('value is missing.');
this._n = new BigInteger(null);
if (value instanceof BigNumber)
this._n = value._n;
else if (value instanceof BigInteger)
this._n = value;
else if (typeof value === 'number')
this._n.fromInt(value);
else if (typeof value === 'string')
this._n.fromString(value, radix);
else if (Buffer.isBuffer(value))
this._n.fromString(value.toString('hex'), 16);
else if (Array.isArray(value))
this._n.fromString(Buffer.from(value).toString('hex'), 16);
else
throw new TypeError('Unsupported value type.');
}
toBEBuffer(length) {
const arr = this._n.toByteArray();
if (length === undefined)
return Buffer.from(arr);
if (arr.length > length)
throw new Error('Number out of range.');
while (arr.length < length)
arr.unshift(0);
return Buffer.from(arr);
}
toString(radix = 10) {
const result = this._n.toString(radix);
if (radix === 16)
return result.padStart(2, '0');
return result;
}
and(num) {
return new BigNumber(this._n.and(new BigNumber(num)._n));
}
mul(num) {
return new BigNumber(this._n.multiply(new BigNumber(num)._n));
}
mod(num) {
return new BigNumber(this._n.mod(new BigNumber(num)._n));
}
shrn(num) {
return new BigNumber(this._n.shiftRight(new BigNumber(num)._n));
}
}
module.exports = BigNumber;

View File

@@ -2,15 +2,14 @@
const crypto = require('crypto');
const BN = require('bn.js');
const BigNumber = require('./BigNumber.js');
const mgf1 = require('./MGF1');
const modPow = (base, power, mod) => {
let result = new BN(1);
let result = new BigNumber(1);
while (power > 0) {
result = power.and(new BN(1)) == 1 ? (result.mul(base)).mod(mod) : result; // eslint-disable-line
result = power.and(new BigNumber(1)) == 1 ? (result.mul(base)).mod(mod) : result; // eslint-disable-line
base = (base.mul(base)).mod(mod);
power = power.shrn(1);
}
@@ -28,10 +27,13 @@ const emsaPSS = (msg, salt) => {
const dbMask = mgf1.generate(mTickHash, db.length);
const maskedDb = mgf1.xor(db, dbMask);
let maskedDbMsb = mgf1.rjust(new BN(maskedDb.slice(0, 1), 2).toString(2), 8, '0');
let maskedDbMsb = mgf1.rjust(new BigNumber(maskedDb.slice(0, 1)).toString(2), 8, '0');
maskedDbMsb = `0${maskedDbMsb.substr(1)}`;
maskedDb[0] = (new BN(maskedDbMsb, 2).toBuffer())[0]; // eslint-disable-line
// console.log((new BN(maskedDbMsb, 2).toBuffer())[0], new BigNumber(maskedDbMsb, 2).toBuffer()[0]);
// maskedDb[0] = (new BN(maskedDbMsb, 2).toBuffer())[0]; // eslint-disable-line
maskedDb[0] = new BigNumber(maskedDbMsb, 2).toBEBuffer()[0]; // eslint-disable-line
return Buffer.concat([maskedDb, mTickHash, Buffer.from('BC', 'hex')]);
};
@@ -65,11 +67,12 @@ module.exports = class Crypto {
}
static sign(key, msg, salt = crypto.randomBytes(32)) {
const base = new BN(emsaPSS(msg, salt));
const power = new BN(key.d());
const mod = new BN(key.n());
// console.log(key.d());
const base = new BigNumber(emsaPSS(msg, salt));
const power = new BigNumber(key.d());
const mod = new BigNumber(key.n());
return (modPow(base, power, mod)).toBuffer().toString('base64');
return (modPow(base, power, mod)).toBEBuffer().toString('base64');
}
static pad(d) {

View File

@@ -1,13 +1,13 @@
'use strict';
const crypto = require('crypto');
const BN = require('bn.js');
const BigNumber = require('./BigNumber.js');
const MFG_LEN = 32;
const divceil = (a, b) => ~~(((a + b) - 1) / b); // eslint-disable-line no-bitwise
const rjust = (string, width, padding) => {
padding = padding || ' ';
const rjust = (string, width, padding = ' ') => {
padding = padding.substr(0, 1);
if (string.length < width)
return padding.repeat(width - string.length) + string;
@@ -26,7 +26,7 @@ const i2osp = (x, len) => {
if (x >= 256 ** len)
throw new Error('Integer too large');
return Buffer.from(rjust((Buffer.from((new BN(x)).toArray('be', 4)).toString()).replace(/\x00/gi, ''), len, '\x00')); // eslint-disable-line no-control-regex
return Buffer.from(rjust(new BigNumber(x).toBEBuffer(4).toString().replace(/\x00/gi, ''), len, '\x00')); // eslint-disable-line no-control-regex
};
module.exports = {

138
lib/keymanagers/Key.js Normal file
View File

@@ -0,0 +1,138 @@
'use strict';
const {
pki: {
rsa,
publicKeyToPem,
privateKeyToPem,
publicKeyFromPem,
privateKeyFromPem,
},
jsbn: {
BigInteger,
},
} = require('node-forge');
const getKeyType = (str) => {
const matches = str.match(/(PRIVATE|PUBLIC) KEY/);
if (!matches)
return null;
return matches[1].toLowerCase();
};
const keyFromPem = (pem) => {
const type = getKeyType(pem);
const isPublic = type === 'public';
const key = isPublic ? publicKeyFromPem(pem) : privateKeyFromPem(pem);
return {
isPublic,
key,
};
};
/**
* Creates a public key from modulus and exponent
* @param {Buffer} mod - the modulus
* @param {Buffer} exp - the exponent
*/
const keyFromModAndExp = (mod, exp) => {
const bnMod = new BigInteger(mod.toString('hex'), 16);
const bnExp = new BigInteger(exp.toString('hex'), 16);
return {
key: rsa.setPublicKey(bnMod, bnExp),
isPublic: true,
};
};
module.exports = class Key {
constructor({
pem = null, mod = null, exp = null, size = 2048,
} = {}) {
// generate new private key
if (!pem && !mod && !exp) {
const keyPair = rsa.generateKeyPair(size);
this.keyIsPublic = false;
this.privateKey = keyPair.privateKey;
this.publicKey = keyPair.publicKey;
return;
}
// new key from pem string
if (pem) {
const { key, isPublic } = keyFromPem(pem);
this.keyIsPublic = isPublic;
this.privateKey = isPublic ? null : key;
this.publicKey = isPublic ? key : null;
return;
}
// new key from mod and exp
if (mod && exp) {
const { key, isPublic } = keyFromModAndExp(mod, exp);
this.keyIsPublic = isPublic;
this.privateKey = isPublic ? null : key;
this.publicKey = isPublic ? key : null;
return;
}
// not good
throw new Error(`Can not create key without ${!mod ? 'modulus' : 'exponent'}.`);
}
static generate(size = 2048) {
return new Key({ size });
}
static importKey({ mod, exp }) {
return new Key({ mod, exp });
}
n(to = 'buff') {
const key = this.keyIsPublic ? this.publicKey : this.privateKey;
const keyN = Buffer.from(key.n.toByteArray());
return to === 'hex' ? keyN.toString('hex', 1) : keyN;
}
e(to = 'buff') {
const key = this.keyIsPublic ? this.publicKey : this.privateKey;
const eKey = Buffer.from(key.e.toByteArray());
return to === 'hex' ? eKey.toString('hex') : eKey;
}
d() {
if (this.keyIsPublic)
throw new Error('Can not get d component out of public key.');
return Buffer.from(this.privateKey.d.toByteArray());
}
isPrivate() {
return !this.keyIsPublic;
}
isPublic() {
return this.keyIsPublic;
}
// eslint-disable-next-line class-methods-use-this
size() {
const keyN = this.n('hex');
const bn = new BigInteger(keyN, 16);
return bn.bitLength();
}
toPem() {
return this.keyIsPublic ? publicKeyToPem(this.publicKey) : privateKeyToPem(this.privateKey);
}
};

View File

@@ -1,8 +1,13 @@
'use strict';
const Key = require('./keyRSA');
const Key = require('./Key');
const keyOrNull = key => (key ? Key(key) : null);
const keyOrNull = (key) => {
if (key instanceof Key)
return key;
return key ? new Key({ pem: key }) : null;
};
module.exports = class Keys {
constructor({
@@ -25,15 +30,15 @@ module.exports = class Keys {
const keys = {};
Object.keys({ A006: '', X002: '', E002: '' }).forEach((key) => {
keys[key] = Key().generate();
keys[key] = Key.generate(); // Key().generate();
});
return new Keys(keys);
}
setBankKeys(bankKeys) {
this.keys.bankX002 = Key().importKey(bankKeys.bankX002);
this.keys.bankE002 = Key().importKey(bankKeys.bankE002);
this.keys.bankX002 = new Key(bankKeys.bankX002); // Key().importKey(bankKeys.bankX002);
this.keys.bankE002 = new Key(bankKeys.bankE002); // Key().importKey(bankKeys.bankE002);
}
a() {

View File

@@ -1,49 +0,0 @@
'use strict';
const BN = require('bn.js');
const NodeRSA = require('node-rsa');
const keyOrNull = (encodedKey) => {
if (encodedKey === null) return new NodeRSA();
return (encodedKey instanceof NodeRSA) ? encodedKey : new NodeRSA(encodedKey);
};
module.exports = encodedKey => ({
key: keyOrNull(encodedKey),
generate(keySize = 2048) {
return new NodeRSA({ b: keySize });
},
importKey({ mod, exp }) {
this.key = new NodeRSA();
this.key.importKey({ n: mod, e: exp }, 'components-public');
return this;
},
n(to = 'buff') {
const keyN = Buffer.from(this.key.exportKey('components-public').n);
return to === 'hex'
? keyN.toString('hex', 1)
: keyN;
},
e(to = 'buff') {
const eKey = new BN(this.key.exportKey('components-public').e).toBuffer();
return to === 'hex'
? eKey.toString('hex')
: eKey;
},
d() {
return this.key.keyPair.d.toBuffer();
},
toPem() {
return this.key.isPrivate() ? this.key.exportKey('pkcs1-private-pem') : this.key.exportKey('pkcs8-public-pem');
},
});

View File

@@ -10,12 +10,12 @@ const errors = {
'011000': {
symbol: 'EBICS_DOWNLOAD_POSTPROCESS_DONE',
short_text: 'Positive acknowledgement received',
meaning: "After receipt of a positive acknowledgement the download task was finished at the server's end and the EBICS transaction ended.",
meaning: "After receipt of a positive acknowledgment the download task was finished at the server's end and the EBICS transaction ended.",
},
'011001': {
symbol: 'EBICS_DOWNLOAD_POSTPROCESS_SKIPPED',
short_text: 'Negative acknowledgement received',
meaning: "After receipt of a negative acknowledgement the transaction was ended at the server's end without finishing the download task",
short_text: 'Negative acknowledgment received',
meaning: "After receipt of a negative acknowledgment the transaction was ended at the server's end without finishing the download task",
},
'011101': {
symbol: 'EBICS_TX_SEGMENT_NUMBER_UNDERRUN',
@@ -32,6 +32,11 @@ const errors = {
short_text: 'Authentication signature error',
meaning: 'Verification of the authentication signature was not successful',
},
'061011': {
symbol: 'EBICS_INVALID_HOST_ID',
short_text: 'The transmitted HostID is unknown on the bank side',
meaning: 'The transmitted HostID is unknown on the bank side',
},
'061002': {
symbol: 'EBICS_INVALID_REQUEST',
short_text: 'Message not EBICSconformant',
@@ -104,8 +109,8 @@ const errors = {
},
'091102': {
symbol: 'EBICS_TX_ABORT',
short_text: 'Transaction cancelled',
meaning: "The transaction was cancelled at the server's end since recovery of the transaction is not supported or is no longer possible due to the recovery counter being too high",
short_text: 'Transaction canceled',
meaning: "The transaction was canceled at the server's end since recovery of the transaction is not supported or is no longer possible due to the recovery counter being too high",
},
'091103': {
symbol: 'EBICS_TX_MESSAGE_REPLAY',

View File

@@ -2,7 +2,6 @@
const zlib = require('zlib');
const crypto = require('crypto');
const BN = require('bn.js');
const Crypto = require('../../crypto/Crypto');
@@ -52,7 +51,6 @@ module.exports = (xml, keys) => ({
transactionKey() {
const keyNodeText = this.doc.getElementsByTagNameNS('urn:org:ebics:H004', 'TransactionKey')[0].textContent;
return Crypto.privateDecrypt(this.keys.e(), Buffer.from(keyNodeText, 'base64'));
},
@@ -65,14 +63,14 @@ module.exports = (xml, keys) => ({
orderId() {
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
const node = select('//xmlns:header/xmlns:mutable/xmlns:OrderID', this.doc);
const node = select('.//xmlns:header/xmlns:mutable/xmlns:OrderID', this.doc);
return node.length ? node[0].textContent : '';
},
businessCode() {
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
const node = select('//xmlns:body/xmlns:ReturnCode', this.doc)
const node = select('//xmlns:body/xmlns:ReturnCode', this.doc);
return node.length ? node[0].textContent : '';
},
@@ -124,13 +122,15 @@ module.exports = (xml, keys) => ({
for (let i = 0; i < keyNodes.length; i++) {
const type = lastChild(keyNodes[i].parentNode).textContent;
const modulus = xpath.select("//*[local-name(.)='Modulus']", keyNodes[i])[0].textContent;
const exponent = xpath.select("//*[local-name(.)='Exponent']", keyNodes[i])[0].textContent;
const modulus = xpath.select(".//*[local-name(.)='Modulus']", keyNodes[i])[0].textContent;
const exponent = xpath.select(".//*[local-name(.)='Exponent']", keyNodes[i])[0].textContent;
const mod = new BN(Buffer.from(modulus, 'base64'), 2).toBuffer();
const exp = new BN(Buffer.from(exponent, 'base64')).toNumber();
bankKeys[`bank${type}`] = { mod, exp };
const mod = Buffer.from(modulus, 'base64');
const exp = Buffer.from(exponent, 'base64');
bankKeys[`bank${type}`] = {
mod,
exp,
};
}
return bankKeys;

View File

@@ -3,7 +3,6 @@
const js2xmlparser = require('js2xmlparser');
const Crypto = require('../../../crypto/Crypto');
const genericSerializer = require('./generic');
module.exports = {

View File

@@ -0,0 +1,13 @@
'use strict';
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'C52',
OrderAttribute: 'DZHNN',
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -0,0 +1,13 @@
'use strict';
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'C53',
OrderAttribute: 'DZHNN',
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -0,0 +1,13 @@
'use strict';
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'DKI',
OrderAttribute: 'DZHNN',
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -1,23 +1,13 @@
'use strict';
const dateRange = (start, end) => {
if (start && end)
return {
DateRange: {
Start: start,
End: end,
},
};
return {};
};
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'HAC',
OrderAttribute: 'DZHNN',
StandardOrderParams: dateRange(start, end),
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -1,23 +1,13 @@
'use strict';
const dateRange = (start, end) => {
if (start && end)
return {
DateRange: {
Start: start,
End: end,
},
};
return {};
};
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'PTK',
OrderAttribute: 'DZHNN',
StandardOrderParams: dateRange(start, end),
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -1,23 +1,13 @@
'use strict';
const dateRange = (start, end) => {
if (start && end)
return {
DateRange: {
Start: start,
End: end,
},
};
return {};
};
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'STA',
OrderAttribute: 'DZHNN',
StandardOrderParams: dateRange(start, end),
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -1,23 +1,13 @@
'use strict';
const dateRange = (start, end) => {
if (start && end)
return {
DateRange: {
Start: start,
End: end,
},
};
return {};
};
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'VMK',
OrderAttribute: 'DZHNN',
StandardOrderParams: dateRange(start, end),
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -0,0 +1,8 @@
'use strict';
module.exports = document => ({
version: 'h004',
orderDetails: { OrderType: 'XCT', OrderAttribute: 'OZHNN', StandardOrderParams: {} },
operation: 'upload',
document,
});

View File

@@ -0,0 +1,8 @@
'use strict';
module.exports = document => ({
version: 'h004',
orderDetails: { OrderType: 'XG1', OrderAttribute: 'OZHNN', StandardOrderParams: {} },
operation: 'upload',
document,
});

View File

@@ -0,0 +1,13 @@
'use strict';
const utils = require('../utils');
module.exports = (start = null, end = null) => ({
version: 'h004',
orderDetails: {
OrderType: 'Z53',
OrderAttribute: 'DZHNN',
StandardOrderParams: utils.dateRange(start, end),
},
operation: 'download',
});

View File

@@ -12,6 +12,8 @@ const CDS = require('./CDS');
const CCT = require('./CCT');
const CCS = require('./CCS');
const XE3 = require('./XE3');
const XCT = require('./XCT');
const XG1 = require('./XG1');
const STA = require('./STA');
const VMK = require('./VMK');
@@ -21,11 +23,16 @@ const HPD = require('./HPD');
const HKD = require('./HKD');
const PTK = require('./PTK');
const HAC = require('./HAC');
const Z53 = require('./Z53');
const DKI = require('./DKI');
const C52 = require('./C52');
const C53 = require('./C53');
module.exports = {
INI,
HIA,
HPB,
Z53,
AZV,
CD1,
@@ -35,6 +42,8 @@ module.exports = {
CCT,
CCS,
XE3,
XCT,
XG1,
STA,
VMK,
@@ -44,4 +53,7 @@ module.exports = {
HKD,
PTK,
HAC,
DKI,
C52,
C53,
};

View File

@@ -4,9 +4,7 @@ const fs = require('fs');
const uuidv1 = require('uuid/v1');
const traceName = (uuid, label, type, ext = 'xml') => {
return `${uuid}_${label}_${type}.${ext}`;
};
const traceName = (uuid, label, type, ext = 'xml') => `${uuid}_${label}_${type}.${ext}`;
module.exports = dir => ({
traceData: '',
@@ -58,9 +56,7 @@ module.exports = dir => ({
try {
fs.writeFileSync(path, this.traceData);
console.log("Data written to file");
} catch (error) {
console.log(error);
throw error;
}
},

46
lib/utils.js Normal file
View File

@@ -0,0 +1,46 @@
'use strict';
const prefixNumber = (n) => {
if (n < 10)
return `0${n}`;
return n.toString();
};
const date = {
getDateObject(d = Date.now()) {
const dateObject = new Date(d);
// eslint-disable-next-line no-restricted-globals
if (isNaN(dateObject))
throw new Error(`${d} is invalid date.`);
return dateObject;
},
toISODate(d = Date.now(), utc = true) {
const t = date.getDateObject(d);
if (utc)
return `${t.getUTCFullYear()}-${prefixNumber(t.getUTCMonth() + 1)}-${prefixNumber(t.getUTCDate())}`;
return `${t.getFullYear()}-${prefixNumber(t.getMonth() + 1)}-${prefixNumber(t.getDate())}`;
},
toISOTime(d = Date.now(), utc = true) {
const t = date.getDateObject(d);
if (utc)
return `${prefixNumber(t.getUTCHours())}:${prefixNumber(t.getUTCMinutes())}:${prefixNumber(t.getUTCSeconds())}`;
return `${prefixNumber(t.getHours())}:${prefixNumber(t.getMinutes())}:${prefixNumber(t.getSeconds())}`;
},
};
const dateRange = (start, end) => {
if (start && end)
return {
DateRange: {
Start: date.toISODate(start),
End: date.toISODate(end),
},
};
return {};
};
module.exports = {
dateRange,
date,
};

3866
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,38 +1,74 @@
{
"name": "ebics-client",
"version": "0.0.4",
"version": "0.1.4",
"description": "Node.js ISO 20022 Compliant EBICS Client",
"main": "index.js",
"files": [
"lib/**/*",
"templates/**/*"
],
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"lint": "eslint .",
"test": "nyc mocha test/**/*.js",
"coverage": "nyc report --reporter=text-lcov | coveralls",
"version": "auto-changelog -p -t changelog-template.hbs && git add CHANGELOG.md"
},
"repository": {
"type": "git",
"url": "https://github.com/eCollect/node-ebics-client"
"url": "https://github.com/node-ebics/node-ebics-client"
},
"keywords": [
"EBICS",
"ISO20022",
"nodejs",
"api"
"api",
"banking"
],
"author": "eCollect Sofia Tech Team",
"license": "MIT",
"contributors": [
{
"name": "Dimitar Nanov",
"url": "https://nanov.io",
"email": "dimitar@nanov.io"
},
{
"name": "Vladislav Hristov",
"url": "https://github.com/vladhristov",
"email": "vlad.s.ch@gmail.com"
},
{
"name": "Vasyl Stashuk",
"url": "https://github.com/vasyas"
},
{
"name": "Yago",
"url": "https://github.com/yagop"
},
{
"name": "Herman van Hazendonk",
"email": "github.com@herrie.org"
}
],
"license": "GPL-3.0-only",
"dependencies": {
"bn.js": "^4.11.8",
"handlebars": "^4.0.11",
"js2xmlparser": "^3.0.0",
"moment": "^2.22.1",
"node-rsa": "^0.4.2",
"request": "^2.87.0",
"uuid": "^3.3.2",
"xml-crypto": "^0.10.1",
"auto-changelog": "^1.16.2",
"handlebars": "^4.5.3",
"js2xmlparser": "^4.0.0",
"node-forge": "^0.9.1",
"request": "^2.88.0",
"uuid": "^3.3.3",
"xml-crypto": "^1.4.0",
"xmldom": "^0.1.27",
"xpath": "0.0.27"
},
"devDependencies": {
"eslint": "^4.19.1",
"eslint-config-airbnb-base": "^12.1.0",
"eslint-plugin-import": "^2.12.0"
"chai": "^4.2.0",
"coveralls": "^3.0.9",
"eslint": "^6.7.2",
"eslint-config-ecollect-base": "^0.1.2",
"eslint-plugin-import": "^2.18.2",
"libxmljs": "^0.19.7",
"mocha": "^6.2.2",
"nyc": "^14.1.1"
}
}

164
templates/ini_en.hbs Normal file
View File

@@ -0,0 +1,164 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta charset="UTF-8" />
<title>EBICS ini</title>
</head>
<body>
<div>
<h2>EBICS-Initialization letter (INI)</h2>
<table>
<tr>
<td>Date</td>
<td>{{ today }}</td>
</tr>
<tr>
<td>Time</td>
<td>{{ now }}</td>
</tr>
<tr>
<td>Recipient</td>
<td>{{ bankName }}</td>
</tr>
<tr>
<td>User ID</td>
<td>{{ userId }}</td>
</tr>
<tr>
<td>Customer ID</td>
<td>{{ partnerId }}</td>
</tr>
</table>
<p>Public authentication key (A006)</p>
<p>Exponent ({{ keyExponentBits A006 }} Bit):</p>
<p>
<code>{{ keyExponent A006 }}</code>
</p>
<p>Modulus ({{ keyModulusBits A006 }} Bit):</p>
<p>
<code>{{ keyModulus A006 }}</code>
</p>
<p>SHA-256 Hash:</p>
<p>
<code>{{ sha256 A006 }}</code>
</p>
<p>I hereby confirm the above public key for my electronic signature.</p>
<br/>
<br/>
<br/>
<br/>
<table>
<tr>
<td>_________________________</td>
<td>_________________________</td>
<td>_________________________</td>
</tr>
<tr>
<td>City/Date</td>
<td>Name/Company</td>
<td>Signature</td>
</tr>
</table>
</div>
<div style="page-break-after:always"></div>
<h2>EBICS-Initialization letter (HIA) - Page 1/2</h2>
<table>
<tr>
<td>Date</td>
<td>{{ today }}</td>
</tr>
<tr>
<td>Time</td>
<td>{{ now }}</td>
</tr>
<tr>
<td>Recipient</td>
<td>{{ bankName }}</td>
</tr>
<tr>
<td>User ID</td>
<td>{{ userId }}</td>
</tr>
<tr>
<td>Customer ID</td>
<td>{{ partnerId }}</td>
</tr>
</table>
<div>
<p>Public Identification Key (X002)</p>
<p>Exponent ({{ keyExponentBits X002 }} Bit):</p>
<p>
<code>{{ keyExponent X002 }}</code>
</p>
<p>Modulus ({{ keyModulusBits X002 }} Bit):</p>
<p>
<code>{{ keyModulus X002 }}</code>
</p>
<p>SHA-256 Hash:</p>
<p>
<code>{{ sha256 X002 }}</code>
</p>
<p> Continuation on Page 2 ...</p>
<div style="page-break-after:always"></div>
<h2>EBICS-Initialization letter (HIA) - Page 2/2</h2>
<table>
<tr>
<td>Date</td>
<td>{{ today }}</td>
</tr>
<tr>
<td>Time</td>
<td>{{ now }}</td>
</tr>
<tr>
<td>Recipient</td>
<td>{{ bankName }}</td>
</tr>
<tr>
<td>User ID</td>
<td>{{ userId }}</td>
</tr>
<tr>
<td>Customer ID</td>
<td>{{ partnerId }}</td>
</tr>
</table>
</div>
<div>
<p>Public Encryption Key (E002)</p>
<p>Exponent ({{ keyExponentBits E002 }} Bit):</p>
<p>
<code>{{ keyExponent E002 }}</code>
</p>
<p>Modulus ({{ keyModulusBits E002 }} Bit):</p>
<p>
<code>{{ keyModulus E002 }}</code>
</p>
<p>SHA-256 Hash:</p>
<p>
<code>{{ sha256 E002 }}</code>
</p>
<p>I hereby confirm the above public keys for my EBICS access.</p>
<br/>
<br/>
<br/>
<br/>
<table>
<tr>
<td>_________________________</td>
<td>_________________________</td>
<td>_________________________</td>
</tr>
<tr>
<td>City/Date</td>
<td>Name/Company</td>
<td>Signature</td>
</tr>
</table>
</div>
</body>
</html>

21
test/fixtures/HPB_response.xml vendored Normal file
View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<ebicsKeyManagementResponse xmlns="urn:org:ebics:H004" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Revision="1" Version="H004" xsi:schemaLocation="urn:org:ebics:H004 ebics_keymgmt_response_H004.xsd">
<header authenticate="true">
<static/>
<mutable>
<ReturnCode>000000</ReturnCode>
<ReportText>[EBICS_OK] OK</ReportText>
</mutable>
</header>
<body>
<DataTransfer>
<DataEncryptionInfo authenticate="true">
<EncryptionPubKeyDigest Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" Version="E002">nuZyAjQoIvH4MwnrCWB82TC/vcNqigpqPtMXwO1Xk9U=</EncryptionPubKeyDigest>
<TransactionKey>QgfTQqhocARTcpcgySGxn5a+uBuFsHCX0oBINQQIfsgMRR+wEZ3zlXQMUm5GUwwOci2wjkRHJ3PoO4Yd0KzDNWiXFuX/9n00bpnNN5MsTCRgDqJRzZrA1jDxWRBVY/sv3l1gS/ERwyWqub456VZ7DYlXlRA8yp5lormoxftpIt6/Cf0ShmhS8qlUkLYSn/8ugQRl1KRTID5ZSXPjDYAIVZ0izVxblaBYXgs6RH9VvP4uKSn4CFYiFp+alo6EcxFNgMVUnfzaEbsPH/aX9Y3tbdWhATBZSxTT8iMoi2ARhz9VB711aavB8vgzcD6jH3ZtIm+sCb3UC3A/KehEn9GjIA==</TransactionKey>
</DataEncryptionInfo>
<OrderData>xlQf5zxlUo4LwjkoDsh926OISQwn6PhpxF3CkZI34EO84tfK25zLbqriXiqwDycl2YjYrQxbj8B4k1auNe86a+JigQOoBBCL8gvsoxO+NlziPNzf8sP99dQSp436q7KOhVm4gz2ZZT3D3O5FSqpOKsQ0fJku7D76beoxqxUT+hD0UxgsGLsbGgNLzHPalnFJctuaZtqQmo24Uk6hOwLrFJoQwUbPEffU5GGARWrZVxGQr5Zw4zrtLlZzP1RXk9JZFnhx00KvKiaoxAQXxXUC0BeDM97tIMEiaRNbO3ne+mHtK8vXzc305X5yR0B6ocwbFAmzGQ/e6Fyy6XPIGsbXoLjJGod6ayIU1SJGx/JRyOU4cLkjJZLUQMyCdJ6bA5uYf1AePUDvUA3tAOd6W0cC7DPAlwcrWhSZkPLIawequyjO39LTkEcmINEigd4i3sCrG4e1k303gyIKUg79kApl46onW2vruN3DwswunI10JGXxqex7ccvd2JvD6Pc8cAH1RMg8FIucYd//Joh1XK+QkRdIZMWKg4/lkoWmgVN7ssMmrtsKE2pNFAsIRfgxd8bB64sHZ3XKSyZKTk4LnWdJHZopP/xTs9a+/G3Kd/sIsy4W4sIKZCWU8NL11YOaqfwxY/rYNMaQzhAmawFfWvt74iisFG81Wv+Ijja/dPFmbk3Mup2Dfnlfu26MDblC8+aiaPHypmPuzREqGjW/9d2vtLQz0IXX3X6H4pFXneSjKlwXlDk1WGuiOvXH4gmXEpfWTX9rq+rUyskwwL8ssW5eeeyJ5W2LhVKQllOi/bvrAL5kyrfDMxvOuFIBLxBf//xE</OrderData>
</DataTransfer>
<ReturnCode authenticate="true">000000</ReturnCode>
<TimestampBankParameter authenticate="true">2016-08-10T16:16:17.512Z</TimestampBankParameter>
</body>
</ebicsKeyManagementResponse>

22
test/fixtures/HPB_response_data.xml vendored Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<HPBResponseOrderData xmlns="urn:org:ebics:H004" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="urn:org:ebics:H004 ebics_orders_H004.xsd">
<AuthenticationPubKeyInfo>
<PubKeyValue>
<ds:RSAKeyValue>
<ds:Modulus>AJWVHQIfP0H1fr5Y7IjSlDmFksqQ+0E+CjzbEeE6r444LCuSXwbGKF6DJqguyX1qGYxjHRvVtdkNa+GNAtlZnmuPeLHPBUOs5Zx9J5JP4JZOcKd/wnRDIasTkg3NrtZ22tjOrWx26VuR6h7dUH2oJRnFDHmbXoCDMxkqJUNr/TM89p5slJ9Oj5+NAaOzm+7AlwbJ95EI/xc2jEfhp+GdF9CYdS/m2AZaAt79y6QDtBSDdAs0OHTgsOIjbjZkptBF/Gkip2sOordjsChRNLHLDcAOWbsg1NVMuhXs1b6+bCVLXQcGhFydYhqvrXB7pFS0++hlyzqGhbZK5cwEe/v8EJk=</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</PubKeyValue>
<AuthenticationVersion>X002</AuthenticationVersion>
</AuthenticationPubKeyInfo>
<EncryptionPubKeyInfo>
<PubKeyValue>
<ds:RSAKeyValue>
<ds:Modulus>AJWVHQIfP0H1fr5Y7IjSlDmFksqQ+0E+CjzbEeE6r444LCuSXwbGKF6DJqguyX1qGYxjHRvVtdkNa+GNAtlZnmuPeLHPBUOs5Zx9J5JP4JZOcKd/wnRDIasTkg3NrtZ22tjOrWx26VuR6h7dUH2oJRnFDHmbXoCDMxkqJUNr/TM89p5slJ9Oj5+NAaOzm+7AlwbJ95EI/xc2jEfhp+GdF9CYdS/m2AZaAt79y6QDtBSDdAs0OHTgsOIjbjZkptBF/Gkip2sOordjsChRNLHLDcAOWbsg1NVMuhXs1b6+bCVLXQcGhFydYhqvrXB7pFS0++hlyzqGhbZK5cwEe/v8EJk=</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</PubKeyValue>
<EncryptionVersion>E002</EncryptionVersion>
</EncryptionPubKeyInfo>
<HostID>CRSISOTB</HostID>
</HPBResponseOrderData>

13
test/fixtures/INI_reposne.xml vendored Normal file
View File

@@ -0,0 +1,13 @@
<h004:ebicsKeyManagementResponse xmlns:h004="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:org:ebics:H004 ebics_H004.xsd" Version="H004" Revision="1">
<h004:header authenticate="true">
<h004:static />
<h004:mutable>
<h004:OrderID>B004</h004:OrderID>
<h004:ReturnCode>000000</h004:ReturnCode>
<h004:ReportText>[EBICS_OK] OK</h004:ReportText>
</h004:mutable>
</h004:header>
<h004:body>
<h004:ReturnCode authenticate="true">000000</h004:ReturnCode>
</h004:body>
</h004:ebicsKeyManagementResponse>

164
test/fixtures/Letter_DE.html vendored Normal file
View File

@@ -0,0 +1,164 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta charset="UTF-8" />
<title>EBICS ini</title>
</head>
<body>
<div>
<h2>EBICS-Initialisierungsbrief (INI)</h2>
<table>
<tr>
<td>Datum</td>
<td>2019-11-20</td>
</tr>
<tr>
<td>Uhrzeit</td>
<td>14:14:03</td>
</tr>
<tr>
<td>Empfänger</td>
<td>Credit Suisse AG</td>
</tr>
<tr>
<td>User-ID</td>
<td>CRS04381</td>
</tr>
<tr>
<td>Kunden-ID</td>
<td>CRS04381</td>
</tr>
</table>
<p>Öffentlicher Schlüssel für die elektronische Unterschrift (A006)</p>
<p>Exponent (24 Bit):</p>
<p>
<code>010001</code>
</p>
<p>Modulus (2048 Bit):</p>
<p>
<code>AB E6 54 CA EF B8 AD 81 C2 79 74 9C 42 39 82 A7 A4 1C 76 C8 00 69 68 90 79 59 22 DA 6F 1B C6 12 DA B1 32 8F 97 57 D0 71 2F 09 90 63 96 CA 80 00 8B D3 B8 1A D9 D2 91 14 08 84 BA F7 CF 78 6D E6 40 74 7B FF 48 44 9D D6 DE 1D 9A F3 07 F4 48 AC A2 3C E2 2C 79 34 98 59 E3 48 64 EF 9E E2 C4 9C BC CE DA 1E 31 EC 4D 51 85 62 05 6B FC CB 8D B1 09 DF 17 3C 2C 68 D4 C7 3F 15 BF 4C A6 65 E4 D9 A3 CD 3E 3F 1F 20 16 5E A2 27 93 35 86 DE D7 A8 5D 8F E1 0C A5 02 AF C7 7B 51 9C D0 00 5C 2D 46 E8 42 D3 2F 8A 8C 31 C2 ED 61 01 4F B5 B2 E7 3E 11 18 8C D7 83 23 1E D5 24 BE A9 A4 5C 56 8C CC 52 75 E1 15 63 39 90 AB 36 CE 30 1D 3B 50 85 7D CE 7A 72 77 67 77 4C 5E 37 BE 95 31 91 A7 51 A7 BC C6 C6 BD 2B 85 3D 08 29 90 B1 F6 77 2F 23 9F FD 2A 03 03 04 E1 CB F6 66 6A D9 EC B5 66 60 89</code>
</p>
<p>Hash (SHA-256):</p>
<p>
<code>85 F0 4F 8B 97 6A F0 E2 FD 9F 21 2B 0B B3 A2 7A 97 B3 BB 57 B3 1B 55 14 F7 ED B5 CB CD E4 FE 79</code>
</p>
<p>Ich bestätige hiermit den obigen öffentlichen Schlüssel für meine elektronische Unterschrift.</p>
<br/>
<br/>
<br/>
<br/>
<table>
<tr>
<td>_________________________</td>
<td>_________________________</td>
<td>_________________________</td>
</tr>
<tr>
<td>Ort/Datum</td>
<td>Name/Firma</td>
<td>Unterschrift</td>
</tr>
</table>
</div>
<div style="page-break-after:always"></div>
<h2>EBICS-Initialisierungsbrief (HIA) - Seite 1/2</h2>
<table>
<tr>
<td>Datum</td>
<td>2019-11-20</td>
</tr>
<tr>
<td>Uhrzeit</td>
<td>14:14:03</td>
</tr>
<tr>
<td>Empfänger</td>
<td>Credit Suisse AG</td>
</tr>
<tr>
<td>User-ID</td>
<td>CRS04381</td>
</tr>
<tr>
<td>Kunden-ID</td>
<td>CRS04381</td>
</tr>
</table>
<div>
<p>Öffentlicher Authentifikationsschlüssel (X002)</p>
<p>Exponent (24 Bit):</p>
<p>
<code>010001</code>
</p>
<p>Modulus (2048 Bit):</p>
<p>
<code>8A ED FC 0F 2C 86 EA E3 07 D9 0D 75 DD E6 25 4F 20 40 41 43 D6 22 C0 59 A9 38 F6 54 42 74 ED 5C 38 C4 6C 63 F2 0F A2 65 85 D9 58 1A 1E F5 1E C4 9E E3 66 5B 67 6B 37 B0 FA BD 8C FE 12 D3 F0 3A C8 23 22 56 3F 30 B0 FB 70 C5 7B 17 41 15 A8 EE 54 F3 1F AF DE 13 7E 96 38 AF 9B 69 28 22 1F 9A 7C C4 C6 1D 35 59 66 40 81 7F D7 48 DA B9 51 EF A9 0C 96 C5 7A 55 25 66 A5 63 B6 4A 45 F0 97 0F 56 60 18 5B CE 08 A2 7D 87 64 18 A2 4A E1 B3 8E 75 24 3F FC AC 23 A5 33 BF 0C 41 E3 96 B5 D2 54 CA 37 07 40 A9 E3 2B 01 17 A6 21 AE 07 1E 52 0A 00 E1 95 F3 BE BC 19 EA E9 90 48 17 38 60 DE 68 BD 85 36 37 59 14 E0 BC 07 C5 B8 50 0A 87 87 90 13 91 6C 4F 03 2B 40 27 14 2B 7F A9 D7 71 12 57 E5 A9 72 CE 16 B7 7B 5E 7D A2 52 D6 CE 9D 39 DA 44 C0 41 EF 02 37 7B 93 98 CC 35 D8 06 D1 79 57</code>
</p>
<p>Hash (SHA-256):</p>
<p>
<code>F8 3B D7 EB 6F 2B 48 4B 2B 0A BD CA C7 EF F8 56 11 D1 90 32 D6 CC 67 3B 8A 3E 74 F5 F8 B4 E1 AA</code>
</p>
<p> Fortsetzung auf Seite 2 ...</p>
<div style="page-break-after:always"></div>
<h2>EBICS-Initialisierungsbrief (HIA) - Seite 2/2</h2>
<table>
<tr>
<td>Datum</td>
<td>2019-11-20</td>
</tr>
<tr>
<td>Uhrzeit</td>
<td>14:14:03</td>
</tr>
<tr>
<td>Empfänger</td>
<td>Credit Suisse AG</td>
</tr>
<tr>
<td>User-ID</td>
<td>CRS04381</td>
</tr>
<tr>
<td>Kunden-ID</td>
<td>CRS04381</td>
</tr>
</table>
</div>
<div>
<p>Öffentlicher Verschlüsselungsschlüssel (E002)</p>
<p>Exponent (24 Bit):</p>
<p>
<code>010001</code>
</p>
<p>Modulus (2048 Bit):</p>
<p>
<code>93 10 E9 40 2A B1 77 DB 31 C7 EB 13 5A E6 21 FD 6B 18 2B 74 40 67 B1 C9 6D B6 09 4A 1D CD F0 A7 DC 51 A4 53 EF AE 14 0D 9E A0 FB E4 EE D0 2E CF 6C 4C 5E 99 83 F3 A3 8E C3 FE F5 C1 DA E2 E6 52 96 A1 5B 9C 10 2D D1 F1 A2 0F 8E 3E 5D 81 55 DF 19 11 5B 5E 62 DB 95 56 0E 19 4C EF F3 87 50 EB 5F B7 42 3C 5D CB 47 51 81 E7 3F 39 6A 4A CA 6E 29 55 2B 22 14 FE 24 DA 5D DB 0C 99 D2 61 7A FB 40 B7 61 B8 82 89 BE 59 4C 64 92 9A F2 5E 82 62 3A 98 11 61 A3 77 0F 13 38 5D FD 13 BD 9C 4A 96 F9 34 8A 3B 99 4D 25 7B 1B A8 3F 90 F7 6F 9D 09 74 DB 4C B7 27 A3 0B EC 7C 05 E5 F3 1C F7 C2 59 0D 3A 57 86 D5 AD AF 1E CC 84 9F B8 4C DF 8A 35 22 CF D5 B8 12 2B 44 E4 12 BE 26 F7 D7 31 31 31 BB 3D 3C 49 7E C6 AF 44 4D 00 1F FC 04 84 2F 10 8B 2C 78 15 0F 22 46 70 78 2B 25 56 16 36 FB 9F</code>
</p>
<p>Hash (SHA-256):</p>
<p>
<code>9E E6 72 02 34 28 22 F1 F8 33 09 EB 09 60 7C D9 30 BF BD C3 6A 8A 0A 6A 3E D3 17 C0 ED 57 93 D5</code>
</p>
<p>Ich bestätige hiermit die obigen öffentlichen Schlüssel für meinen EBICS-Zugang.</p>
<br/>
<br/>
<br/>
<br/>
<table>
<tr>
<td>_________________________</td>
<td>_________________________</td>
<td>_________________________</td>
</tr>
<tr>
<td>Ort/Datum</td>
<td>Name/Firma</td>
<td>Unterschrift</td>
</tr>
</table>
</div>
</body>
</html>

40
test/fixtures/STA_response_part1.xml vendored Normal file
View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<ebicsResponse xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:org:ebics:H004 http://www.ebics.org/H004/ebics_response_H004.xsd" Version="H004" Revision="1">
<header authenticate="true">
<static>
<TransactionID>ECD6F062AAEDFA77250526A68CBEC549</TransactionID>
<NumSegments>2</NumSegments>
</static>
<mutable>
<TransactionPhase>Initialisation</TransactionPhase>
<SegmentNumber lastSegment="false">1</SegmentNumber>
<ReturnCode>000000</ReturnCode>
<ReportText>[EBICS_OK] OK</ReportText>
</mutable>
</header>
<AuthSignature>
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#xpointer(//*[@authenticate='true'])">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>OnY4VczV+1XfplpMS/SCKFWn+FDMge40X8TJ9pA6HEI=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>Qiz8clr/Ym+wLpB8CzTuxKP5rgIR2P4SaX8O4gGZx0Di8Lzd4hsBO3koqIuX11NRZo0RYA5E/IKQCoYLepkcM4QHvLT37YidbrXsTZe6cml/yF8OdyRAcd/9U7AoA9GKENFk4lnBFfZYmM4ADK6wVOCE/ABaOk0NeCDDbxrKA75tfTxwxTvQBfUOHZ87LrZxuQf//L9pzmtI07/7GbsQX8ZceQq40SpBFZn/oRvT/Q38Qu2ZO59MZexJn+BTzlhpfv9fQGF/sgXkdhUkPTEW3nL4j7ehasq3CtySGO2RnEppohEvJ4m07RDtEY3OWyAAZoPFVpvnECM6pOLbIuR40w==</ds:SignatureValue>
</AuthSignature>
<body>
<DataTransfer>
<DataEncryptionInfo authenticate="true">
<EncryptionPubKeyDigest Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" Version="E002">IUW05JB5cuCzRYYa4kIAZ2ehYVrLI3lKvxZvo1uP+ug=</EncryptionPubKeyDigest>
<TransactionKey>CPdd6ODXrCxHWpYrwS/5a3NIZ1R2SDscHHJSONc2I7g8ara7qv5Ra7H03W+336DPQLZQxH+EBRWdE2FQ1vrVTcypK6fkFarmO1dEtQt6Ka89AozC7aQMyp4yGl+zlF+XvFkJXZbRXgoEOPsgcG0xM6nKLXnr1ThYRFOoAasigLDGwqxliyhoR94F9dL7YB8Le/uZeRj78mNp4smkE5ZKKyPhwVx+0IW78YuVCSC2c2qbsMmm4evAvycdpLfuuoG4KVlNMIlvkKeBfMZFELcmeKKm85D2zPYkZ7cqG2IfAAp5qdS6K8P7RY4gtjUhOtP5mi8bZt/ZcjioUmIR9dAMnA==</TransactionKey>
</DataEncryptionInfo>
<OrderData>lJ/v1HvOYAZKTPkxULH4mOcUy01+EaAsxLzCPhtieAo9m5AtU5URdyBVfmclHbtWe3ELb02lR37bChynq0Esqpljxx7CiB+kl/bVs7XkNQQmtGPlh08O7ApJ7AHdKPFFvE+SM2OWpSwUrqJGtmyaU6s+RM66o/3Q0wvKi4y3+Q2jm8nkiWZpPfNt52g4ReE9Ge86o+L+EBOBgZm634L5Z/i6pq908mXBAklPdk1ERdEgWONaOeYYmB70FToplR1gINJEF2CnfAtD/wV+DuQFPDth+EWHqhe3a4xO0d9eJ55ou2QCYOPUC2g/qz1sp7GR74W7P5IWJdmnUEuPFsKJ6OvM+1V8S06jZGDa/QhUGDK8F3G/TMP09W1MsrlQTRr3YQ5H43+pMY7I6Jysze+X9OKZZTTpv4GmYm1USjmraGyMuPF3j9hrlmpttK+1gg2WzytCJO44YsZp9ckls8JNK4bT5uwTuomKZoRgmiIOTcMh4VP7V28TWj2XdF+T6rBFILTvQyXMOzvbe1kLwg2O31JDBdJ8X1fHCYJxKsIrYCSDPz4sha8h7QmHrCSFmjoXb+LUElnbLXZVRkY5/Dc73EM6Es3wAgjwSJK2asRqdqU0PhbS5qpIlgYKsNcb+Wes</OrderData>
</DataTransfer>
<ReturnCode authenticate="true">000000</ReturnCode>
<TimestampBankParameter authenticate="true">2013-12-09T15:14:30.000Z</TimestampBankParameter>
</body>
</ebicsResponse>

40
test/fixtures/STA_response_part2.xml vendored Normal file
View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<ebicsResponse xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:org:ebics:H004 http://www.ebics.org/H004/ebics_response_H004.xsd" Version="H004" Revision="1">
<header authenticate="true">
<static>
<TransactionID>ECD6F062AAEDFA77250526A68CBEC549</TransactionID>
<NumSegments>1</NumSegments>
</static>
<mutable>
<TransactionPhase>Initialisation</TransactionPhase>
<SegmentNumber lastSegment="true">1</SegmentNumber>
<ReturnCode>000000</ReturnCode>
<ReportText>[EBICS_OK] OK</ReportText>
</mutable>
</header>
<AuthSignature>
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#xpointer(//*[@authenticate='true'])">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>OnY4VczV+1XfplpMS/SCKFWn+FDMge40X8TJ9pA6HEI=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>Qiz8clr/Ym+wLpB8CzTuxKP5rgIR2P4SaX8O4gGZx0Di8Lzd4hsBO3koqIuX11NRZo0RYA5E/IKQCoYLepkcM4QHvLT37YidbrXsTZe6cml/yF8OdyRAcd/9U7AoA9GKENFk4lnBFfZYmM4ADK6wVOCE/ABaOk0NeCDDbxrKA75tfTxwxTvQBfUOHZ87LrZxuQf//L9pzmtI07/7GbsQX8ZceQq40SpBFZn/oRvT/Q38Qu2ZO59MZexJn+BTzlhpfv9fQGF/sgXkdhUkPTEW3nL4j7ehasq3CtySGO2RnEppohEvJ4m07RDtEY3OWyAAZoPFVpvnECM6pOLbIuR40w==</ds:SignatureValue>
</AuthSignature>
<body>
<DataTransfer>
<DataEncryptionInfo authenticate="true">
<EncryptionPubKeyDigest Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" Version="E002">IUW05JB5cuCzRYYa4kIAZ2ehYVrLI3lKvxZvo1uP+ug=</EncryptionPubKeyDigest>
<TransactionKey>CPdd6ODXrCxHWpYrwS/5a3NIZ1R2SDscHHJSONc2I7g8ara7qv5Ra7H03W+336DPQLZQxH+EBRWdE2FQ1vrVTcypK6fkFarmO1dEtQt6Ka89AozC7aQMyp4yGl+zlF+XvFkJXZbRXgoEOPsgcG0xM6nKLXnr1ThYRFOoAasigLDGwqxliyhoR94F9dL7YB8Le/uZeRj78mNp4smkE5ZKKyPhwVx+0IW78YuVCSC2c2qbsMmm4evAvycdpLfuuoG4KVlNMIlvkKeBfMZFELcmeKKm85D2zPYkZ7cqG2IfAAp5qdS6K8P7RY4gtjUhOtP5mi8bZt/ZcjioUmIR9dAMnA==</TransactionKey>
</DataEncryptionInfo>
<OrderData>lJ/v1HvOYAZKTPkxULH4mOcUy01+EaAsxLzCPhtieAo9m5AtU5URdyBVfmclHbtWe3ELb02lR37bChynq0Esqpljxx7CiB+kl/bVs7XkNQQmtGPlh08O7ApJ7AHdKPFFvE+SM2OWpSwUrqJGtmyaU6s+RM66o/3Q0wvKi4y3+Q2jm8nkiWZpPfNt52g4ReE9Ge86o+L+EBOBgZm634L5Z/i6pq908mXBAklPdk1ERdEgWONaOeYYmB70FToplR1gINJEF2CnfAtD/wV+DuQFPDth+EWHqhe3a4xO0d9eJ55ou2QCYOPUC2g/qz1sp7GR74W7P5IWJdmnUEuPFsKJ6OvM+1V8S06jZGDa/QhUGDK8F3G/TMP09W1MsrlQTRr3YQ5H43+pMY7I6Jysze+X9OKZZTTpv4GmYm1USjmraGyMuPF3j9hrlmpttK+1gg2WzytCJO44YsZp9ckls8JNK4bT5uwTuomKZoRgmiIOTcMh4VP7V28TWj2XdF+T6rBFILTvQyXMOzvbe1kLwg2O31JDBdJ8X1fHCYJxKsIrYCSDPz4sha8h7QmHrCSFmjoXb+LUElnbLXZVRkY5/Dc73EM6Es3wAgjwSJK2asRqdqU0PhbS5qpIlgYKsNcb+Wes</OrderData>
</DataTransfer>
<ReturnCode authenticate="true">000000</ReturnCode>
<TimestampBankParameter authenticate="true">2013-12-09T15:14:30.000Z</TimestampBankParameter>
</body>
</ebicsResponse>

43
test/fixtures/keys.js vendored Normal file
View File

@@ -0,0 +1,43 @@
'use strict';
const publicSmallExpPEM = '';
const publicSmallExpMod = '';
const publicSmallExpExp = '';
const publicBigPEM = `-----BEGIN PUBLIC KEY-----
MIIBJDANBgkqhkiG9w0BAQEFAAOCAREAMIIBDAKCAQEAuvqhJ2ptulHGUmYq3BOO
NoIDXOUDrVV3s188wvU3Fj9TcO3yBqWuJ5GMEzRIOfi8Pb4AkJBjjPOR0Taby7+n
7coa2Zm0ZprGzXVM1Gb0aG3BAbDaFbvdF25NLAtkmtKKW/8YfXy89qvy6+UEBdOa
1UTLaR+9Pf63Wa+qu638udSDe3refHdZV1bKUR1UOZ/1iWn5b7aq4vITRPNNWXk5
eG8He2lWzYHg5+yY4ckBooh1K5cMwl5s+Iz24iWtqIlV5EyORbdfGatrNzv6S7Lx
FngEGCL5e97qU1pAcarE9XmrlJ5dHl9LQPaw957AlZuOFpVEE5shXZkSgRYrHv2m
cQIFAQAAAA8=
-----END PUBLIC KEY-----`;
const publicBigModString = 'ALr6oSdqbbpRxlJmKtwTjjaCA1zlA61Vd7NfPML1NxY/U3Dt8galrieRjBM0SDn4vD2+AJCQY4zzkdE2m8u/p+3KGtmZtGaaxs11TNRm9GhtwQGw2hW73RduTSwLZJrSilv/GH18vPar8uvlBAXTmtVEy2kfvT3+t1mvqrut/LnUg3t63nx3WVdWylEdVDmf9Ylp+W+2quLyE0TzTVl5OXhvB3tpVs2B4OfsmOHJAaKIdSuXDMJebPiM9uIlraiJVeRMjkW3Xxmrazc7+kuy8RZ4BBgi+Xve6lNaQHGqxPV5q5SeXR5fS0D2sPeewJWbjhaVRBObIV2ZEoEWKx79pnE=';
const publicBigModBytes = [0, 186, 250, 161, 39, 106, 109, 186, 81, 198, 82, 102, 42, 220, 19, 142, 54, 130, 3, 92, 229, 3, 173, 85, 119, 179, 95, 60, 194, 245, 55, 22, 63, 83, 112, 237, 242, 6, 165, 174, 39, 145, 140, 19, 52, 72, 57, 248, 188, 61, 190, 0, 144, 144, 99, 140, 243, 145, 209, 54, 155, 203, 191, 167, 237, 202, 26, 217, 153, 180, 102, 154, 198, 205, 117, 76, 212, 102, 244, 104, 109, 193, 1, 176, 218, 21, 187, 221, 23, 110, 77, 44, 11, 100, 154, 210, 138, 91, 255, 24, 125, 124, 188, 246, 171, 242, 235, 229, 4, 5, 211, 154, 213, 68, 203, 105, 31, 189, 61, 254, 183, 89, 175, 170, 187, 173, 252, 185, 212, 131, 123, 122, 222, 124, 119, 89, 87, 86, 202, 81, 29, 84, 57, 159, 245, 137, 105, 249, 111, 182, 170, 226, 242, 19, 68, 243, 77, 89, 121, 57, 120, 111, 7, 123, 105, 86, 205, 129, 224, 231, 236, 152, 225, 201, 1, 162, 136, 117, 43, 151, 12, 194, 94, 108, 248, 140, 246, 226, 37, 173, 168, 137, 85, 228, 76, 142, 69, 183, 95, 25, 171, 107, 55, 59, 250, 75, 178, 241, 22, 120, 4, 24, 34, 249, 123, 222, 234, 83, 90, 64, 113, 170, 196, 245, 121, 171, 148, 158, 93, 30, 95, 75, 64, 246, 176, 247, 158, 192, 149, 155, 142, 22, 149, 68, 19, 155, 33, 93, 153, 18, 129, 22, 43, 30, 253, 166, 113];
const publicBigExpString = 'AQAAAA8=';
const publicBigExpBytes = [1, 0, 0, 0, 15];
const pblc = {
big: {
pem: publicBigPEM,
mod: {
bytes: publicBigModBytes,
string: publicBigModString,
},
exp: {
bytes: publicBigExpBytes,
string: publicBigExpString,
},
},
small: {
pem: publicSmallExpPEM,
mod: publicSmallExpMod,
exp: publicSmallExpExp,
},
};
module.exports = {
pblc,
};

108
test/spec/H004.js Normal file
View File

@@ -0,0 +1,108 @@
'use strict';
/* eslint-env node, mocha */
const { assert } = require('chai');
const path = require('path');
const fs = require('fs');
const ebics = require('../../');
const libxml = require('libxmljs');
const schemaPath = path.resolve(__dirname, '../xsd/ebics_H004.xsd');
const schemaDoc = libxml.parseXml(fs.readFileSync(schemaPath, { encoding: 'utf8' }));
const schemaDir = path.dirname(schemaPath);
const cwd = process.cwd();
const validateXML = (str) => {
try {
process.chdir(schemaDir);
const isValid = libxml.parseXmlString(str).validate(schemaDoc);
process.chdir(cwd);
return isValid;
} catch (e) {
process.chdir(cwd);
return false;
}
};
const client = new ebics.Client({
url: 'https://iso20022test.credit-suisse.com/ebicsweb/ebicsweb',
partnerId: 'CRS04381',
userId: 'CRS04381',
hostId: 'CRSISOTB',
passphrase: 'test',
keyStorage: ebics.fsKeysStorage(path.resolve(__dirname, '../support/TEST_KEYS.key')),
});
const { Orders } = ebics;
/*
upload :
const AZV = require('./AZV');
const CD1 = require('./CD1');
const CDB = require('./CDB');
const CDD = require('./CDD');
const CDS = require('./CDS');
const CCT = require('./CCT');
const CCS = require('./CCS');
const XE3 = require('./XE3');
const XCT = require('./XCT');
*/
const uploadBuilder = fn => fn('');
const dateBuilder = fn => fn('2018-01-01', '2019-01-01');
const fnOrders = {
// upload | document
AZV: uploadBuilder,
CD1: uploadBuilder,
CDB: uploadBuilder,
CDD: uploadBuilder,
CDS: uploadBuilder,
CCT: uploadBuilder,
CCS: uploadBuilder,
XE3: uploadBuilder,
XCT: uploadBuilder,
// download
STA: dateBuilder,
VMK: dateBuilder,
HAA: dateBuilder,
HTD: dateBuilder,
HPD: dateBuilder,
HKD: dateBuilder,
PTK: dateBuilder,
HAC: dateBuilder,
Z53: dateBuilder,
DKI: dateBuilder,
C53: dateBuilder,
C52: dateBuilder,
};
const getOrderObject = (name, order) => {
if (typeof order === 'object')
return order;
if (fnOrders[name])
return fnOrders[name](order);
return null;
};
describe('H004 order generation', () => {
// eslint-disable-next-line no-restricted-syntax
for (const [name, orderDefinition] of Object.entries(Orders)) {
const order = getOrderObject(name, orderDefinition);
if (!order)
continue;
const type = order.orderDetails.OrderType;
const { operation } = order;
it(`[${operation}] ${type} order generation`, async () => {
const signedOrder = await client.signOrder(order);
assert.isTrue(validateXML(signedOrder));
});
}
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,49 @@
'use strict';
/* eslint-env node, mocha */
const { assert } = require('chai');
const { join, resolve } = require('path');
const { readFileSync, mkdirSync, existsSync } = require('fs');
const BankLetter = require('../../lib/BankLetter');
const ebics = require('../../');
const client = new ebics.Client({
url: 'https://iso20022test.credit-suisse.com/ebicsweb/ebicsweb',
partnerId: 'CRS04381',
userId: 'CRS04381',
hostId: 'CRSISOTB',
passphrase: 'test',
keyStorage: ebics.fsKeysStorage(resolve(__dirname, '../support/TEST_KEYS.key')),
});
const createDir = (where) => {
try {
mkdirSync(where);
} catch (e) {
if (e.code !== 'EEXIST')
throw e;
}
};
describe('BankLetter', () => {
let bankLetterGenerator = null;
it('creates an instance', () => assert.doesNotThrow(() => {
bankLetterGenerator = new BankLetter({
client,
bankName: 'Credit Suisse AG',
template: readFileSync(join(__dirname, '../../templates/ini_de.hbs'), { encoding: 'utf8' }),
});
}));
it('genrates a letter', async () => assert.doesNotThrow(async () => bankLetterGenerator.generate()));
it('throws with invalid serliazitaion path', async () => bankLetterGenerator.serialize('').catch(e => assert.instanceOf(e, Error)));
it('serliaziers a letter to disk', async () => {
createDir('.test_tmp');
await bankLetterGenerator.serialize('.test_tmp/test_letter.html').then(t => assert.equal(t, true));
assert.equal(existsSync('.test_tmp/test_letter.html'), true);
});
});

47
test/unit/BigNumber.js Normal file
View File

@@ -0,0 +1,47 @@
'use strict';
/* eslint-env node, mocha */
const { assert } = require('chai');
const { jsbn: { BigInteger } } = require('node-forge');
const BigNumber = require('../../lib/crypto/BigNumber');
const types = [
{ name: 'BigNumber', value: new BigNumber(11) },
{ name: 'BigInteger', value: new BigInteger('11') },
{ name: 'string with default radix', value: '11' },
{ name: 'string with radix 16', value: '0b', radix: 16 },
{ name: 'Buffer', value: Buffer.from('0b', 'hex') },
{ name: 'Array', value: [11] },
];
describe('BigNumber', () => {
describe('creating an instance', () => {
it('should throw with no value given', () => assert.throws(() => new BigNumber()));
it('should throw wrong value type', () => assert.throws(() => new BigNumber({})));
for (const { name, value, radix } of types) {
let instance;
describe(`out of ${name}`, () => {
it('create instance', () => assert.doesNotThrow(() => {
instance = new BigNumber(value, radix);
}));
it('toString with radix 10', () => assert.equal(instance.toString(), '11'));
it('toString with radix 16', () => assert.equal(instance.toString(16), '0b'));
it('toBEBuffer without length', () => assert.equal(instance.toBEBuffer().toString('hex'), '0b'));
it('toBEBuffer with length', () => assert.equal(instance.toBEBuffer(4).toString('hex'), '0000000b'));
});
}
});
describe('exports', () => {
it('toBEBuffer with too short length should throw', () => assert.throw(() => new BigNumber(837462187362).toBEBuffer(1)));
});
describe('operators', () => {
const num = new BigNumber(1);
it('and', () => assert.equal(num.and(1), 1));
it('mul', () => assert.equal(num.mul(2), 2));
it('mod', () => assert.equal(num.mod(1), 0));
it('shrn', () => assert.equal(num.shrn(1), 0));
});
});

29
test/unit/ClientTest.js Normal file
View File

@@ -0,0 +1,29 @@
'use strict';
/* eslint-env node, mocha */
const { assert } = require('chai');
const { Client, fsKeysStorage, tracesStorage } = require('../../index.js');
describe('Client', () => {
describe('instantiating', () => {
it('should throw with no options provided', () => assert.throws(() => new Client()));
it('should throw with no url provided', () => assert.throws(() => new Client({})));
it('should throw with no partnerId provided', () => assert.throws(() => new Client({ url: 'https://myebics.com' })));
it('should throw with no userId provided', () => assert.throws(() => new Client({ url: 'https://myebics.com', partnerId: 'partnerId' })));
it('should throw with no hostId provided', () => assert.throws(() => new Client({ url: 'https://myebics.com', partnerId: 'partnerId', userId: 'userId' })));
it('should throw with no passphrase provided', () => assert.throws(() => new Client({
url: 'https://myebics.com', partnerId: 'partnerId', userId: 'userId', hostId: 'hostId',
})));
it('should throw with no keyStorage provided', () => assert.throws(() => new Client({
url: 'https://myebics.com', partnerId: 'partnerId', userId: 'userId', hostId: 'hostId', passphrase: 'test',
})));
it('should create an isntance without tracesStorage', () => assert.doesNotThrow(() => new Client({
url: 'https://myebics.com', partnerId: 'partnerId', userId: 'userId', hostId: 'hostId', passphrase: 'test', keyStorage: fsKeysStorage('./test.key'),
})));
it('should create an isntance with tracesStorage', () => assert.doesNotThrow(() => new Client({
url: 'https://myebics.com', partnerId: 'partnerId', userId: 'userId', hostId: 'hostId', passphrase: 'test', keyStorage: fsKeysStorage('./test.key'), tracesStorage: tracesStorage('./'),
})));
});
});

92
test/unit/keys.js Normal file
View File

@@ -0,0 +1,92 @@
'use strict';
/* eslint-env node, mocha */
const { assert } = require('chai');
const fixtures = require('../fixtures/keys');
// const Key = require('../lib/keymanagers/keyRSA');
const Key = require('../../lib/keymanagers/Key');
const stripWhitespace = str => str.replace(/\s+/g, '');
describe('Keys management', () => {
describe('generates brand new', () => {
const keySize = 2048;
// const newKey = Key().generate(keySize);
const newKey = Key.generate();
it('private key', () => {
assert.isTrue(newKey.isPrivate());
});
it('that has the right key size', () => {
// const newKeySize = newKey.size(); // console.log(newKey.size());
assert(newKey.size(), keySize);
});
});
describe('creates public key from mod and exp', () => {
const { pem, mod, exp } = fixtures.pblc.big;
describe('that are strings', () => {
const m = Buffer.from(mod.string, 'base64');
const e = Buffer.from(exp.string, 'base64');
/* const newKey = Key().importKey({
mod: m, exp: e, modulus: mod.string, exponent: exp.string,
}); */
const newKey = new Key({ mod: m, exp: e });
it('and is really public', () => {
assert.isTrue(newKey.isPublic());
});
it('and has a propper mod in bytes', () => {
assert.deepEqual([...newKey.n()], mod.bytes);
});
it('and has a propper pem string', () => {
assert.equal(stripWhitespace(newKey.toPem()), stripWhitespace(pem));
});
});
describe('that are bytes', () => {
const m = Buffer.from(mod.bytes);
const e = Buffer.from(exp.bytes);
/* const newKey = Key().importKey({
mod: m, exp: e, modulus: mod.string, exponent: exp.string,
}); */
const newKey = new Key({ mod: m, exp: e });
it('and is really public', () => {
assert.isTrue(newKey.isPublic());
});
it('and has a propper mod as a string', () => {
assert.equal(newKey.n().toString('base64'), mod.string);
});
it('and has a propper pem string', () => {
assert.equal(stripWhitespace(newKey.toPem()), stripWhitespace(pem));
});
});
});
describe('creates public key from pem string', () => {
const { pem } = fixtures.pblc.big;
// const newKey = Key(pem);
const newKey = new Key({ pem });
it('and is really public', () => {
assert.isTrue(newKey.isPublic());
});
it('and has a propper(the same) pem string', () => {
/* newKey.pempem = {
modulus: mod.string,
exponent: exp.string,
}; */
assert.equal(stripWhitespace(newKey.toPem()), stripWhitespace(pem));
});
});
});

41
test/unit/middlewares.js Normal file
View File

@@ -0,0 +1,41 @@
'use strict';
/* eslint-env node, mocha */
const { assert } = require('chai');
const { resolve } = require('path');
const response = require('../../lib/middleware/response');
const serializer = require('../../lib/middleware/serializer');
const signer = require('../../lib/middleware/signer');
const ebics = require('../../');
const client = new ebics.Client({
url: 'https://iso20022test.credit-suisse.com/ebicsweb/ebicsweb',
partnerId: 'CRS04381',
userId: 'CRS04381',
hostId: 'CRSISOTB',
passphrase: 'test',
keyStorage: ebics.fsKeysStorage(resolve(__dirname, '../support/TEST_KEYS.key')),
});
describe('Middlewares', () => {
describe('Response Middleware', () => {
it('should not throw with supported protocol version', () => assert.doesNotThrow(() => response.version('H004')));
it('should throw with no unsupported protocol version', () => assert.throws(() => response.version('H003')));
});
describe('Signer Middleware', () => {
it('should not throw with supported protocol version', () => assert.doesNotThrow(() => signer.version('H004')));
it('should throw with no unsupported protocol version', () => assert.throws(() => signer.version('H003')));
});
describe('Serializer Middleware', () => {
it('should not throw with supported protocol version and ini operation', () => assert.doesNotThrow(() => serializer.use(ebics.Orders.INI, client)));
it('should not throw with supported protocol version and download operation', () => assert.doesNotThrow(() => serializer.use(ebics.Orders.STA('2018-01-01', '2018-02-01'), client)));
it('should not throw with supported protocol version and upload operation', () => assert.doesNotThrow(() => serializer.use(ebics.Orders.AZV('<xml />'), client)));
it('should throw with no supported protocol version and ', () => assert.throws(() => serializer.use({ version: 'H004', operation: 'unspported' }, client)));
it('should throw with no unuspported protocol version', () => assert.throws(() => serializer.use({ version: 'H003' }, client)));
});
});

111
test/unit/responseParser.js Normal file
View File

@@ -0,0 +1,111 @@
'use strict';
/* eslint-env node, mocha */
const { readFileSync } = require('fs');
const { join, resolve } = require('path');
const { assert } = require('chai');
const H004Response = require('../../lib/orders/H004/response');
const ebics = require('../../');
const client = new ebics.Client({
url: 'https://iso20022test.credit-suisse.com/ebicsweb/ebicsweb',
partnerId: 'CRS04381',
userId: 'CRS04381',
hostId: 'CRSISOTB',
passphrase: 'test',
keyStorage: ebics.fsKeysStorage(resolve(__dirname, '../support/TEST_KEYS.key')),
});
const buildResponse = (xmlPath) => {
const response = H004Response('<xml/>', {});
const xml = readFileSync(xmlPath, { encoding: 'utf8' });
response.orderData = () => xml;
return response;
};
const fixtures = {
HPB: async () => H004Response(readFileSync(join(__dirname, '../fixtures/HPB_response.xml'), { encoding: 'utf8' }), await client.keys()),
HPB_DATA: () => buildResponse(join(__dirname, '../fixtures/HPB_response_data.xml')),
INI: () => H004Response(readFileSync(join(__dirname, '../fixtures/INI_reposne.xml'), { encoding: 'utf8' }), client.keys()),
STA_1: () => H004Response(readFileSync(join(__dirname, '../fixtures/STA_response_part1.xml'), { encoding: 'utf8' }), client.keys()),
STA_2: () => H004Response(readFileSync(join(__dirname, '../fixtures/STA_response_part2.xml'), { encoding: 'utf8' }), client.keys()),
x002mod: 'AJWVHQIfP0H1fr5Y7IjSlDmFksqQ+0E+CjzbEeE6r444LCuSXwbGKF6DJqguyX1qGYxjHRvVtdkNa+GNAtlZnmuPeLHPBUOs5Zx9J5JP4JZOcKd/wnRDIasTkg3NrtZ22tjOrWx26VuR6h7dUH2oJRnFDHmbXoCDMxkqJUNr/TM89p5slJ9Oj5+NAaOzm+7AlwbJ95EI/xc2jEfhp+GdF9CYdS/m2AZaAt79y6QDtBSDdAs0OHTgsOIjbjZkptBF/Gkip2sOordjsChRNLHLDcAOWbsg1NVMuhXs1b6+bCVLXQcGhFydYhqvrXB7pFS0++hlyzqGhbZK5cwEe/v8EJk=',
e002mod: 'AJWVHQIfP0H1fr5Y7IjSlDmFksqQ+0E+CjzbEeE6r444LCuSXwbGKF6DJqguyX1qGYxjHRvVtdkNa+GNAtlZnmuPeLHPBUOs5Zx9J5JP4JZOcKd/wnRDIasTkg3NrtZ22tjOrWx26VuR6h7dUH2oJRnFDHmbXoCDMxkqJUNr/TM89p5slJ9Oj5+NAaOzm+7AlwbJ95EI/xc2jEfhp+GdF9CYdS/m2AZaAt79y6QDtBSDdAs0OHTgsOIjbjZkptBF/Gkip2sOordjsChRNLHLDcAOWbsg1NVMuhXs1b6+bCVLXQcGhFydYhqvrXB7pFS0++hlyzqGhbZK5cwEe/v8EJk=',
};
describe('H004 response parsing', () => {
it('parses bank keys', () => {
const response = fixtures.HPB_DATA();
const bankKeys = response.bankKeys();
assert.equal(bankKeys.bankX002.mod.toString('base64'), fixtures.x002mod);
assert.equal(bankKeys.bankE002.mod.toString('base64'), fixtures.e002mod);
});
it('detects unsegmented response', () => {
const response = fixtures.HPB_DATA();
assert.equal(response.isSegmented(), false);
assert.equal(response.isLastSegment(), false);
});
it('detects segmented response', () => {
const responsePart1 = fixtures.STA_1();
const responsePart2 = fixtures.STA_2();
assert.equal(responsePart1.isSegmented(), true);
assert.equal(responsePart1.isLastSegment(), false);
assert.equal(responsePart2.isSegmented(), true);
assert.equal(responsePart2.isLastSegment(), true);
});
it('parses OrderID', () => {
const response = fixtures.INI();
assert.equal(response.orderId(), 'B004');
});
it('parses BuissnessCode', () => {
const response = fixtures.INI();
const code = response.businessCode();
assert.equal(code, '000000');
assert.equal(response.businessSymbol(code), 'EBICS_OK');
assert.equal(response.businessMeaning(code), 'No technical errors occurred during processing of the EBICS request');
assert.equal(response.businessShortText(code), 'OK');
});
it('parses TechnicalCode', () => {
const response = fixtures.INI();
const code = response.technicalCode();
assert.equal(code, '000000');
assert.equal(response.technicalSymbol(code), '[EBICS_OK] OK');
assert.equal(response.technicalMeaning(code), 'No technical errors occurred during processing of the EBICS request');
assert.equal(response.technicalShortText(code), 'OK');
});
it('parses TransactionID', () => {
const response = fixtures.STA_1();
const code = response.transactionId();
assert.equal(code, 'ECD6F062AAEDFA77250526A68CBEC549');
});
it('parses TransactionKey', async () => {
const response = await fixtures.HPB();
const code = response.transactionKey().toString('base64');
assert.equal(code, '2OTepxiy49uayuzZlYFf8Q==');
});
it('parses OrderData', async () => {
const response = await fixtures.HPB();
const orderBuffer = response.orderData();
assert.deepEqual(orderBuffer, readFileSync(join(__dirname, '../fixtures/HPB_response_data.xml')));
});
it('generates XML', async () => {
const response = await fixtures.HPB();
const xmlString = response.toXML().replace('\\n', '\n');
assert.deepEqual(xmlString, readFileSync(join(__dirname, '../fixtures/HPB_response.xml'), { encoding: 'utf8' }));
});
});

29
test/unit/utils.js Normal file
View File

@@ -0,0 +1,29 @@
'use strict';
/* eslint-env node, mocha */
const { assert } = require('chai');
const utils = require('../../lib/utils');
describe('utils', () => {
describe('dateRange', () => {
describe('dateRange', () => {
it('should generate empty object with partial parameters', () => {
assert.isEmpty(utils.dateRange());
});
it('should throw with invalid date', () => {
assert.throws(() => utils.dateRange('2018-15-15', '2018-20-20'));
});
it('should work for valid string input', () => {
assert.containsAllDeepKeys(utils.dateRange('2018-01-15', '2018-01-20'), { DateRange: { Start: '2018-01-15', End: '2018-01-20' } });
});
it('should work for Date string input', () => {
assert.containsAllDeepKeys(utils.dateRange(new Date('2018-01-15'), new Date('2018-01-20')), { DateRange: { Start: '2018-01-15', End: '2018-01-20' } });
});
it('should work for timestamp string input', () => {
assert.containsAllDeepKeys(utils.dateRange(new Date('2018-01-15').getTime(), new Date('2018-01-20').getTime()), { DateRange: { Start: '2018-01-15', End: '2018-01-20' } });
});
});
});
});

11
test/xsd/ebics_H004.xsd Executable file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ebics="urn:org:ebics:H004" targetNamespace="urn:org:ebics:H004" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<annotation>
<documentation xml:lang="de">ebics_H004.xsd inkludiert alle Schemadateien des EBICS-Protokolls, um die Eindeutigkeit von Element- und Typnamen im EBCIS Namespace zu erzwingen.</documentation>
<documentation xml:lang="en">ebics_H004.xsd includes all schema files for the EBICS protocol in order to enforce unique element and type names in the EBICS namespace.</documentation>
</annotation>
<include schemaLocation="ebics_request_H004.xsd"/>
<include schemaLocation="ebics_response_H004.xsd"/>
<include schemaLocation="ebics_keymgmt_request_H004.xsd"/>
<include schemaLocation="ebics_keymgmt_response_H004.xsd"/>
</schema>

135
test/xsd/ebics_hev.xsd Executable file
View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ebics="http://www.ebics.org/H000" targetNamespace="http://www.ebics.org/H000" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<xs:annotation>
<xs:documentation xml:lang="de">ebics_hev.xsd ist das EBICS-Protokollschema entweder für Anfragen oder Rückmeldungen der Bank zu unterstützten EBICS-Versionen.</xs:documentation>
<xs:documentation xml:lang="en">ebics_hev.xsd is the appropriate EBICS protocol schema either for requests or responses according the EBICS versions supported by a bank.</xs:documentation>
</xs:annotation>
<xs:simpleType name="HostIDType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für die Host-ID.</xs:documentation>
<xs:documentation xml:lang="en">Dataype for Host-ID.</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<xs:maxLength value="35"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="OrderTBaseType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für allgemeine Auftragsarten (Grundtyp).</xs:documentation>
<xs:documentation xml:lang="en">Datatype for general order types (basic type).</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<xs:length value="3"/>
<xs:pattern value="HEV"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ReturnCodeType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für Antwortcodes.</xs:documentation>
<xs:documentation xml:lang="en">Datatype for the return code</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<xs:length value="6"/>
<xs:pattern value="\d{6}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ReportTextType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für den Erklärungstext zum Antwortcode.</xs:documentation>
<xs:documentation xml:lang="en">Datatype for report text with respect to the return code</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:normalizedString">
<xs:maxLength value="256"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="VersionNumberType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für eine Versionsnummer</xs:documentation>
<xs:documentation xml:lang="en">Datatype for a release number </xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<xs:length value="5"/>
<xs:pattern value="[0-9]{2}[.][0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ProtocolVersionType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für Versionsnummer des EBICS-schemas</xs:documentation>
<xs:documentation xml:lang="en">Datatype for release-number of the EBICS scheme</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<xs:length value="4"/>
<xs:pattern value="H\d{3}"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="SystemReturnCodeType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für technische Fehler.</xs:documentation>
<xs:documentation xml:lang="en">Datatype for technical error</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="ReturnCode" type="ebics:ReturnCodeType">
<xs:annotation>
<xs:documentation xml:lang="de">Rückmeldung des Ausführungsstatus mit einer eindeutigen Fehlernummer.</xs:documentation>
<xs:documentation xml:lang="en">Confirmation of the carried out status with a unique error code.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ReportText" type="ebics:ReportTextType">
<xs:annotation>
<xs:documentation xml:lang="de">Klartext der Rückmeldung des Ausführungsstatus.</xs:documentation>
<xs:documentation xml:lang="en">Clear text of the response (carried out status).</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HEVRequestDataType">
<xs:annotation>
<xs:documentation xml:lang="de">Datentyp für die Request-Daten</xs:documentation>
<xs:documentation xml:lang="en">Data type for Request data</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="HostID" type="ebics:HostIDType"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HEVResponseDataType">
<xs:annotation>
<xs:documentation xml:lang="en">Datentyp für die Response-Daten</xs:documentation>
<xs:documentation xml:lang="en">Data type for Request data</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="SystemReturnCode" type="ebics:SystemReturnCodeType"/>
<xs:element name="VersionNumber" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation xml:lang="de">Von der Bank unterstützte EBICS-Versionen, z.B. 2.4</xs:documentation>
<xs:documentation xml:lang="en">EBICS-releases supported by the bank, e.g. 2.4</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="ebics:VersionNumberType">
<xs:attribute name="ProtocolVersion" type="ebics:ProtocolVersionType" use="required">
<xs:annotation>
<xs:documentation xml:lang="de">der EBICS-Version eindeutig zugeordnete Schema-Version, z.B. H003</xs:documentation>
<xs:documentation xml:lang="en">EBICS-scheme-version, e.g. H003, well-defined for EBICS-release-Version</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ebicsHEVRequest" type="ebics:HEVRequestDataType">
<xs:annotation>
<xs:documentation xml:lang="de">Requestdaten</xs:documentation>
<xs:documentation xml:lang="en">request data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ebicsHEVResponse" type="ebics:HEVResponseDataType">
<xs:annotation>
<xs:documentation xml:lang="de">Responsedaten</xs:documentation>
<xs:documentation xml:lang="en">response data</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>

View File

@@ -0,0 +1,543 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Mit XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) von benutzerservice benutzerservice (SIZ GmbH) bearbeitet -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ebics="urn:org:ebics:H004" targetNamespace="urn:org:ebics:H004" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<annotation>
<documentation xml:lang="de">ebics_keymgmt_request_H004.xsd ist das EBICS-Protokollschema für Schlüsselmanagement-Anfragen (HIA, HPB, HSA, INI).</documentation>
</annotation>
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd">
<annotation>
<documentation xml:lang="de">XML-Signature.</documentation>
</annotation>
</import>
<include schemaLocation="ebics_types_H004.xsd"/>
<include schemaLocation="ebics_orders_H004.xsd"/>
<complexType name="StaticHeaderBaseType" abstract="true">
<annotation>
<documentation xml:lang="de">Datentyp für den statischen EBICS-Header (allgemein).</documentation>
</annotation>
<sequence>
<element name="HostID" type="ebics:HostIDType">
<annotation>
<documentation xml:lang="de">Hostname des Banksystems.</documentation>
</annotation>
</element>
<element name="Nonce" type="ebics:NonceType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Zufallswert; damit wird die Initialisierungsnachricht des Clients einzigartig; nur anzugeben, falls Authentifikationssignatur vorhanden.</documentation>
</annotation>
</element>
<element name="Timestamp" type="ebics:TimestampType" minOccurs="0">
<annotation>
<documentation xml:lang="de">aktueller Zeitstempel zur Begrenzung der serverseitigen Nonce-Speicherung; nur anzugeben, falls Authentifikationssignatur vorhanden.</documentation>
</annotation>
</element>
<element name="PartnerID" type="ebics:PartnerIDType">
<annotation>
<documentation xml:lang="de">Kunden-ID des serverseitig administrierten Kunden.</documentation>
</annotation>
</element>
<element name="UserID" type="ebics:UserIDType">
<annotation>
<documentation xml:lang="de">Teilnehmer-ID des serverseitig zu diesem Kunden administrierten Teilnehmers.</documentation>
</annotation>
</element>
<element name="SystemID" type="ebics:UserIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">technische User-ID für Multi-User-Systeme.</documentation>
</annotation>
</element>
<element name="Product" type="ebics:ProductElementType" nillable="true" minOccurs="0">
<annotation>
<documentation xml:lang="de">Kennung des Kundenprodukts bzw. Herstellerkennung oder Name.</documentation>
</annotation>
</element>
<element name="OrderDetails" type="ebics:OrderDetailsType">
<annotation>
<documentation xml:lang="de">Auftragsdetails.</documentation>
</annotation>
</element>
<element name="SecurityMedium" type="ebics:SecurityMediumType">
<annotation>
<documentation xml:lang="de">Angabe des Sicherheitsmediums, das der Kunde verwendet.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="OrderDetailsType" abstract="true">
<annotation>
<documentation xml:lang="de">Datentyp für OrderDetails im statischen EBICS-Header (allgemein).</documentation>
</annotation>
<sequence>
<element name="OrderType" type="ebics:OrderTBaseType">
<annotation>
<documentation xml:lang="de">Auftragsart.</documentation>
</annotation>
</element>
<element name="OrderAttribute" type="ebics:OrderAttributeBaseType">
<annotation>
<documentation xml:lang="de">Auftragsattribut.</documentation>
</annotation>
</element>
</sequence>
</complexType>
<complexType name="ProductElementType">
<annotation>
<documentation xml:lang="de">Datentyp für Element mit Kennung des Kundenprodukts bzw. Herstellerkennung oder Name.</documentation>
</annotation>
<simpleContent>
<extension base="ebics:ProductType">
<attribute name="Language" type="ebics:LanguageType" use="required">
<annotation>
<documentation xml:lang="de">Sprachkennzeichen der Kundenproduktversion (gemäß ISO 639).</documentation>
</annotation>
</attribute>
<attribute name="InstituteID" type="ebics:InstituteIDType" use="optional">
<annotation>
<documentation xml:lang="de">Kennung des Herausgebers des Kundenprodukts bzw. des betreuenden Kreditinstituts.</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
<complexType name="EmptyMutableHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den leeren variablen EBICS-Header von Key Managemen Aufträgen.</documentation>
</annotation>
<sequence>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<element name="ebicsUnsecuredRequest">
<annotation>
<documentation>Anfragestruktur für ungesicherte Auftragsarten HIA (Authentifikations- und Verschlüsselungsschlüssel senden) und INI (bankfachllichen Schlüssel senden).</documentation>
</annotation>
<complexType>
<sequence>
<element name="header">
<annotation>
<documentation xml:lang="de">enthält die technischen Transaktionsdaten.</documentation>
</annotation>
<complexType>
<sequence>
<element name="static" type="ebics:UnsecuredRequestStaticHeaderType">
<annotation>
<documentation xml:lang="de">enhält alle festen Headereinträge.</documentation>
</annotation>
</element>
<element name="mutable" type="ebics:EmptyMutableHeaderType">
<annotation>
<documentation xml:lang="de">enthält alle variablen Headereinträge.</documentation>
</annotation>
</element>
</sequence>
<attributeGroup ref="ebics:AuthenticationMarker"/>
</complexType>
</element>
<element name="body">
<annotation>
<documentation xml:lang="de">enthält die Auftragsdaten.</documentation>
</annotation>
<complexType>
<sequence>
<annotation>
<documentation xml:lang="de"/>
</annotation>
<element name="DataTransfer">
<annotation>
<documentation xml:lang="de">Transfer von Auftragsdaten.</documentation>
</annotation>
<complexType>
<sequence>
<element name="OrderData">
<annotation>
<documentation xml:lang="de">enthält Auftragsdaten.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:OrderDataType">
<anyAttribute namespace="##targetNamespace" processContents="lax"/>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
<attributeGroup ref="ebics:VersionAttrGroup"/>
</complexType>
</element>
<complexType name="UnsecuredRequestStaticHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den statischen EBICS-Header bei ungesicherten Sendeauftragsarten (Aufträge HIA und INI): kein Nonce, kein Timestamp, keine EU-Datei, keine X001 Authentifizierung, keine Verschlüsselung, keine Digests der öffentlichen Bankschlüssel, Nutzdaten komprimiert, Auftragsattribut DZNNN</documentation>
</annotation>
<complexContent>
<restriction base="ebics:StaticHeaderBaseType">
<sequence>
<element name="HostID" type="ebics:HostIDType">
<annotation>
<documentation xml:lang="de">Hostname des Banksystems.</documentation>
</annotation>
</element>
<element name="Nonce" type="ebics:NonceType" minOccurs="0" maxOccurs="0">
<annotation>
<documentation xml:lang="de">Zufallswert; damit wird die Initialisierungsnachricht des Clients einzigartig; nicht anzugeben für ebicsUnsecuredRequest.</documentation>
</annotation>
</element>
<element name="Timestamp" type="ebics:TimestampType" minOccurs="0" maxOccurs="0">
<annotation>
<documentation xml:lang="de">aktueller Zeitstempel zur Begrenzung der serverseitigen Nonce-Speicherung; nicht anzugeben für ebicsUnsecuredRequest.</documentation>
</annotation>
</element>
<element name="PartnerID" type="ebics:PartnerIDType">
<annotation>
<documentation xml:lang="de">Kunden-ID des serverseitig administrierten Kunden.</documentation>
</annotation>
</element>
<element name="UserID" type="ebics:UserIDType">
<annotation>
<documentation xml:lang="de">Teilnehmer-ID des serverseitig zu diesem Kunden administrierten Teilnehmers.</documentation>
</annotation>
</element>
<element name="SystemID" type="ebics:UserIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">technische User-ID für Multi-User-Systeme.</documentation>
</annotation>
</element>
<element name="Product" type="ebics:ProductElementType" nillable="true" minOccurs="0">
<annotation>
<documentation xml:lang="de">Kennung des Kundenprodukts bzw. Herstellerkennung oder Name.</documentation>
</annotation>
</element>
<element name="OrderDetails" type="ebics:UnsecuredReqOrderDetailsType">
<annotation>
<documentation xml:lang="de">Auftragsdetails.</documentation>
</annotation>
</element>
<element name="SecurityMedium" type="ebics:SecurityMediumType">
<annotation>
<documentation xml:lang="de">Angabe des Sicherheitsmediums, das der Kunde verwendet.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</restriction>
</complexContent>
</complexType>
<complexType name="UnsecuredReqOrderDetailsType">
<annotation>
<documentation xml:lang="de">Datentyp für OrderDetails im statischen EBICS-Header von ebicsUnsecuredRequest.</documentation>
</annotation>
<complexContent>
<restriction base="ebics:OrderDetailsType">
<sequence>
<element name="OrderType" type="ebics:OrderTBaseType">
<annotation>
<documentation xml:lang="de">Auftragsart.</documentation>
</annotation>
</element>
<element name="OrderAttribute" type="ebics:OrderAttributeBaseType" fixed="DZNNN">
<annotation>
<documentation xml:lang="de">Auftragsattribut: DZNNN.</documentation>
</annotation>
</element>
</sequence>
</restriction>
</complexContent>
</complexType>
<element name="ebicsNoPubKeyDigestsRequest">
<annotation>
<documentation>Anfragestruktur für Auftragsarten ohne Übertragung der Digests der öffentlichen Bankschlüssel (HPB Bankschlüssel abholen).</documentation>
</annotation>
<complexType>
<sequence>
<element name="header">
<annotation>
<documentation xml:lang="de">enthält die technischen Transaktionsdaten.</documentation>
</annotation>
<complexType>
<sequence>
<element name="static" type="ebics:NoPubKeyDigestsRequestStaticHeaderType">
<annotation>
<documentation xml:lang="de">enhält alle festen Headereinträge.</documentation>
</annotation>
</element>
<element name="mutable" type="ebics:EmptyMutableHeaderType">
<annotation>
<documentation xml:lang="de">enthält alle variablen Headereinträge.</documentation>
</annotation>
</element>
</sequence>
<attributeGroup ref="ebics:AuthenticationMarker"/>
</complexType>
</element>
<element ref="ebics:AuthSignature">
<annotation>
<documentation xml:lang="de">Authentifikationssignatur.</documentation>
</annotation>
</element>
<element name="body">
<annotation>
<documentation xml:lang="de">enthält optionale Zertifikate (vorgesehen).</documentation>
</annotation>
<complexType>
<sequence>
<annotation>
<documentation xml:lang="de"/>
</annotation>
<element ref="ds:X509Data" minOccurs="0" maxOccurs="0">
<annotation>
<documentation xml:lang="de">X.509-Daten des Teilnehmers.</documentation>
</annotation>
</element>
</sequence>
</complexType>
</element>
</sequence>
<attributeGroup ref="ebics:VersionAttrGroup"/>
</complexType>
</element>
<complexType name="NoPubKeyDigestsRequestStaticHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den statischen EBICS-Header bei Aufträgen ohne Übertragung der Digests der Bankschlüssel (Auftrag HBP): keine Digests der öffentlichen Bankschlüssel, keine EU-Datei, keine Nutzdaten, OrderId optional!, Nonce, Timestamp, X001 Authentifizierung, Auftragsattribut DZHNN</documentation>
</annotation>
<complexContent>
<restriction base="ebics:StaticHeaderBaseType">
<sequence>
<element name="HostID" type="ebics:HostIDType">
<annotation>
<documentation xml:lang="de">Hostname des Banksystems.</documentation>
</annotation>
</element>
<element name="Nonce" type="ebics:NonceType">
<annotation>
<documentation xml:lang="de">Zufallswert; damit wird die Initialisierungsnachricht des Clients einzigartig.</documentation>
</annotation>
</element>
<element name="Timestamp" type="ebics:TimestampType">
<annotation>
<documentation xml:lang="de">aktueller Zeitstempel zur Begrenzung der serverseitigen Nonce-Speicherung.</documentation>
</annotation>
</element>
<element name="PartnerID" type="ebics:PartnerIDType">
<annotation>
<documentation xml:lang="de">Kunden-ID des serverseitig administrierten Kunden.</documentation>
</annotation>
</element>
<element name="UserID" type="ebics:UserIDType">
<annotation>
<documentation xml:lang="de">Teilnehmer-ID des serverseitig zu diesem Kunden administrierten Teilnehmers.</documentation>
</annotation>
</element>
<element name="SystemID" type="ebics:UserIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">technische User-ID für Multi-User-Systeme.</documentation>
</annotation>
</element>
<element name="Product" type="ebics:ProductElementType" nillable="true" minOccurs="0">
<annotation>
<documentation xml:lang="de">Kennung des Kundenprodukts bzw. Herstellerkennung oder Name.</documentation>
</annotation>
</element>
<element name="OrderDetails" type="ebics:NoPubKeyDigestsReqOrderDetailsType">
<annotation>
<documentation xml:lang="de">Auftragsdetails.</documentation>
</annotation>
</element>
<element name="SecurityMedium" type="ebics:SecurityMediumType">
<annotation>
<documentation xml:lang="de">Angabe des Sicherheitsmediums, das der Kunde verwendet.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</restriction>
</complexContent>
</complexType>
<complexType name="NoPubKeyDigestsReqOrderDetailsType">
<annotation>
<documentation xml:lang="de">Datentyp für OrderDetails im statischen EBICS-Header von ebicsNoPubKeyDigestsRequest.</documentation>
</annotation>
<complexContent>
<restriction base="ebics:OrderDetailsType">
<sequence>
<element name="OrderType" type="ebics:OrderTBaseType">
<annotation>
<documentation xml:lang="de">Auftragsart.</documentation>
</annotation>
</element>
<element name="OrderAttribute" type="ebics:OrderAttributeBaseType" fixed="DZHNN">
<annotation>
<documentation xml:lang="de">Auftragsattribut: DZHNN.</documentation>
</annotation>
</element>
</sequence>
</restriction>
</complexContent>
</complexType>
<element name="ebicsUnsignedRequest">
<annotation>
<documentation xml:lang="en">The structure for uploads contains order data and the ESs, but without an authentication signature and data digest of bank keys.</documentation>
<documentation>Anfragestruktur für Sendeaufträge mit EU-Datei und Nutzdaten aber ohne Authentifizierungssignatur und Digests der Bankschlüssel.</documentation>
</annotation>
<complexType>
<sequence>
<element name="header">
<annotation>
<documentation xml:lang="en">Contains technical transaction data.</documentation>
<documentation xml:lang="de">enthält die technischen Transaktionsdaten.</documentation>
</annotation>
<complexType>
<sequence>
<element name="static" type="ebics:UnsignedRequestStaticHeaderType">
<annotation>
<documentation xml:lang="en">Contains all fixed header entries.</documentation>
<documentation xml:lang="de">enhält alle festen Headereinträge.</documentation>
</annotation>
</element>
<element name="mutable" type="ebics:EmptyMutableHeaderType">
<annotation>
<documentation xml:lang="en">Contains all mutable header entries.</documentation>
<documentation xml:lang="de">enthält alle variablen Headereinträge.</documentation>
</annotation>
</element>
</sequence>
<attributeGroup ref="ebics:AuthenticationMarker"/>
</complexType>
</element>
<element name="body">
<annotation>
<documentation xml:lang="en">Contains the order data and the ESs.</documentation>
<documentation xml:lang="de">enthält die Auftragsdaten und EUs.</documentation>
</annotation>
<complexType>
<sequence>
<annotation>
<documentation xml:lang="de"/>
</annotation>
<element name="DataTransfer">
<annotation>
<documentation xml:lang="en">Transfer of order data and the ESs.</documentation>
<documentation xml:lang="de">Transfer von Auftragsdaten und EUs.</documentation>
</annotation>
<complexType>
<sequence>
<element name="SignatureData">
<annotation>
<documentation xml:lang="en">Contains the ESs.</documentation>
<documentation xml:lang="de">enthält Signaturdaten (EUs).</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:SignatureDataType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</simpleContent>
</complexType>
</element>
<element name="OrderData">
<annotation>
<documentation xml:lang="en">Contains the order data</documentation>
<documentation xml:lang="de">enthält Auftragsdaten.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:OrderDataType">
<anyAttribute namespace="##targetNamespace" processContents="lax"/>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
<attributeGroup ref="ebics:VersionAttrGroup"/>
</complexType>
</element>
<complexType name="UnsignedRequestStaticHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den statischen EBICS-Header für ebicsUnsignedRequest.Datentyp für den statischen EBICS-Header bei Aufträgen ohne Authentifizierungssignatur (Auftrag HSA): keine X001 Authentifizierung, keine Digests der öffentlichen Bankschlüssel, EU-Datei, Nutzdaten, Nonce, Timestamp, OrderId, Auftragsattribut OZNNN</documentation>
</annotation>
<complexContent>
<restriction base="ebics:StaticHeaderBaseType">
<sequence>
<element name="HostID" type="ebics:HostIDType">
<annotation>
<documentation xml:lang="de">Hostname des Banksystems.</documentation>
</annotation>
</element>
<element name="Nonce" type="ebics:NonceType" minOccurs="0" maxOccurs="0">
<annotation>
<documentation xml:lang="de">Zufallswert; damit wird die Initialisierungsnachricht des Clients einzigartig; nicht anzugeben bei ebicsUnsignedRequest.</documentation>
</annotation>
</element>
<element name="Timestamp" type="ebics:TimestampType" minOccurs="0" maxOccurs="0">
<annotation>
<documentation xml:lang="de">aktueller Zeitstempel zur Begrenzung der serverseitigen Nonce-Speicherung; nicht anzugeben bei ebicsUnsignedRequest.</documentation>
</annotation>
</element>
<element name="PartnerID" type="ebics:PartnerIDType">
<annotation>
<documentation xml:lang="de">Kunden-ID des serverseitig administrierten Kunden.</documentation>
</annotation>
</element>
<element name="UserID" type="ebics:UserIDType">
<annotation>
<documentation xml:lang="de">Teilnehmer-ID des serverseitig zu diesem Kunden administrierten Teilnehmers.</documentation>
</annotation>
</element>
<element name="SystemID" type="ebics:UserIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">technische User-ID für Multi-User-Systeme.</documentation>
</annotation>
</element>
<element name="Product" type="ebics:ProductElementType" nillable="true" minOccurs="0">
<annotation>
<documentation xml:lang="de">Kennung des Kundenprodukts bzw. Herstellerkennung oder Name.</documentation>
</annotation>
</element>
<element name="OrderDetails" type="ebics:UnsignedReqOrderDetailsType">
<annotation>
<documentation xml:lang="de">Auftragsdetails.</documentation>
</annotation>
</element>
<element name="SecurityMedium" type="ebics:SecurityMediumType">
<annotation>
<documentation xml:lang="de">Angabe des Sicherheitsmediums, das der Kunde verwendet.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</restriction>
</complexContent>
</complexType>
<complexType name="UnsignedReqOrderDetailsType">
<annotation>
<documentation xml:lang="de">Datentyp für OrderDetails im statischen EBICS-Header von ebicsUnsignedRequest.</documentation>
</annotation>
<complexContent>
<restriction base="ebics:OrderDetailsType">
<sequence>
<element name="OrderType" type="ebics:OrderTBaseType">
<annotation>
<documentation xml:lang="de">Auftragsart.</documentation>
</annotation>
</element>
<element name="OrderAttribute" type="ebics:OrderAttributeBaseType" fixed="OZNNN">
<annotation>
<documentation xml:lang="de">Auftragsattribut: OZNNN.</documentation>
</annotation>
</element>
</sequence>
</restriction>
</complexContent>
</complexType>
</schema>

View File

@@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Mit XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) von benutzerservice benutzerservice (SIZ GmbH) bearbeitet -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ebics="urn:org:ebics:H004" targetNamespace="urn:org:ebics:H004" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<annotation>
<documentation xml:lang="de">ebics_keymgmt_response_H004.xsd ist das EBICS-Protokollschema für Schlüsselmanagement-Antwortnachrichten (HIA, HPB, HSA, INI).</documentation>
</annotation>
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd">
<annotation>
<documentation xml:lang="de">XML-Signature.</documentation>
</annotation>
</import>
<include schemaLocation="ebics_types_H004.xsd"/>
<include schemaLocation="ebics_orders_H004.xsd"/>
<element name="ebicsKeyManagementResponse">
<annotation>
<documentation xml:lang="de">Electronic Banking Internet Communication Standard des Zentralen Kreditausschusses (ZKA): Multibankfähige Schnittstelle zur internetbasierten Kommunikation.</documentation>
</annotation>
<complexType>
<sequence>
<element name="header">
<annotation>
<documentation xml:lang="de">enthält die technischen Transaktionsdaten.</documentation>
</annotation>
<complexType>
<sequence>
<element name="static">
<annotation>
<documentation xml:lang="de">enhält alle festen Headereinträge.</documentation>
</annotation>
<complexType>
<sequence/>
</complexType>
</element>
<element name="mutable" type="ebics:KeyMgmntResponseMutableHeaderType">
<annotation>
<documentation xml:lang="de">enthält alle variablen Headereinträge.</documentation>
</annotation>
</element>
</sequence>
<attributeGroup ref="ebics:AuthenticationMarker"/>
</complexType>
</element>
<element name="body">
<annotation>
<documentation xml:lang="de">enthält die Auftragsdaten und den fachlichen ReturnCode.</documentation>
</annotation>
<complexType>
<sequence>
<element name="DataTransfer" minOccurs="0">
<annotation>
<documentation xml:lang="de">Transfer von Auftragsdaten; nur bei Download anzugeben (HPB).</documentation>
</annotation>
<complexType>
<sequence>
<element name="DataEncryptionInfo">
<annotation>
<documentation xml:lang="de">Informationen zur Verschlüsselung der Auftragsdaten</documentation>
</annotation>
<complexType>
<complexContent>
<extension base="ebics:DataEncryptionInfoType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</complexContent>
</complexType>
</element>
<element name="OrderData">
<annotation>
<documentation xml:lang="de">enthält Auftragsdaten.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:OrderDataType">
<anyAttribute namespace="##targetNamespace" processContents="lax"/>
</extension>
</simpleContent>
</complexType>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<element name="ReturnCode">
<annotation>
<documentation xml:lang="de">Antwortcode für den vorangegangenen Transfer.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:ReturnCodeType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</simpleContent>
</complexType>
</element>
<element name="TimestampBankParameter" minOccurs="0">
<annotation>
<documentation xml:lang="de">Zeitstempel der letzten Aktualisierung der Bankparameter; nur in der Initialisierungsphase anzugeben.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:TimestampType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
<attributeGroup ref="ebics:VersionAttrGroup"/>
</complexType>
</element>
<complexType name="KeyMgmntResponseMutableHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den variablen EBICS-Header.</documentation>
</annotation>
<sequence>
<element name="OrderID" type="ebics:OrderIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Auftragsnummer von Sendeaufträgen gemäß DFÜ-Abkommen (used for all key management order types except download order type HPB).</documentation>
</annotation>
</element>
<element name="ReturnCode" type="ebics:ReturnCodeType">
<annotation>
<documentation xml:lang="de">Rückmeldung des Ausführungsstatus mit einer eindeutigen Fehlernummer.</documentation>
</annotation>
</element>
<element name="ReportText" type="ebics:ReportTextType">
<annotation>
<documentation xml:lang="de">Klartext der Rückmeldung des Ausführungsstatus.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</schema>

1892
test/xsd/ebics_orders_H004.xsd Executable file

File diff suppressed because it is too large Load Diff

355
test/xsd/ebics_request_H004.xsd Executable file
View File

@@ -0,0 +1,355 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Mit XMLSpy v2008 rel. 2 (http://www.altova.com) von Sabine Wenzel (SIZ Bonn) bearbeitet -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ebics="urn:org:ebics:H004" targetNamespace="urn:org:ebics:H004" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<annotation>
<documentation xml:lang="de">ebics_request_H004.xsd ist das EBICS-Protokollschema für Anfragen.</documentation>
<documentation xml:lang="en">ebics_request_H004.xsd is the appropriate EBICS protocol schema for standard requests.</documentation>
</annotation>
<include schemaLocation="ebics_types_H004.xsd"/>
<include schemaLocation="ebics_orders_H004.xsd"/>
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
<element name="ebicsRequest">
<annotation>
<documentation xml:lang="de">Electronic Banking Internet Communication Standard of the EBICS SCRL: Multibankfähige Schnittstelle zur internetbasierten Kommunikation.</documentation>
<documentation xml:lang="en">Electronic Banking Internet Communication Standard der EBICS SCRL: multi-bank capable interface for internet-based communication.</documentation>
</annotation>
<complexType>
<sequence>
<element name="header">
<annotation>
<documentation xml:lang="de">enthält die technischen Transaktionsdaten.</documentation>
<documentation xml:lang="en">contains the transaction-driven data.</documentation>
</annotation>
<complexType>
<sequence>
<element name="static" type="ebics:StaticHeaderType">
<annotation>
<documentation xml:lang="de">enhält alle festen Headereinträge.</documentation>
<documentation xml:lang="en">contains the static header entries.</documentation>
</annotation>
</element>
<element name="mutable" type="ebics:MutableHeaderType">
<annotation>
<documentation xml:lang="de">enthält alle variablen Headereinträge.</documentation>
<documentation xml:lang="en">contains the mutable header entries.</documentation>
</annotation>
</element>
</sequence>
<attributeGroup ref="ebics:AuthenticationMarker"/>
</complexType>
</element>
<element ref="ebics:AuthSignature"/>
<element name="body">
<annotation>
<documentation xml:lang="de">enthält die Auftragsdaten, EU(s) und weitere Nutzdaten.</documentation>
<documentation xml:lang="en">contains order data, order signature(s) and further data referring to the current order.</documentation>
</annotation>
<complexType>
<sequence>
<annotation>
<documentation xml:lang="de"/>
</annotation>
<element ref="ds:X509Data" minOccurs="0" maxOccurs="0">
<annotation>
<documentation xml:lang="de">X.509-Daten des Teilnehmers.</documentation>
<documentation xml:lang="en">X.509 data of the user.</documentation>
</annotation>
</element>
<choice>
<annotation>
<documentation xml:lang="de">Welche Transaktionsphase?</documentation>
<documentation xml:lang="en">Which transaction phase?</documentation>
</annotation>
<sequence>
<annotation>
<documentation xml:lang="de">Initialisierungs- und Transferphase.</documentation>
<documentation xml:lang="en">Initialisation or transfer phase.</documentation>
</annotation>
<element name="PreValidation" minOccurs="0">
<annotation>
<documentation xml:lang="de">Daten zur Vorabprüfung; nur anzugeben in der Initialisierungsphase bei Uploads mit Auftragsattribut OZH (EUs + Auftragsdaten).</documentation>
<documentation xml:lang="en">Data sent for pre-validation; mandatory for initialisation phase during uploads using order attribute OZH (order signature(s) + order data).</documentation>
</annotation>
<complexType>
<complexContent>
<extension base="ebics:PreValidationRequestType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</complexContent>
</complexType>
</element>
<element name="DataTransfer" type="ebics:DataTransferRequestType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Transfer von Signatur- bzw. Auftragsdaten; nur bei Upload anzugeben.</documentation>
<documentation xml:lang="en">Transfer of signature or order data; mandatory for uploads only.</documentation>
</annotation>
</element>
</sequence>
<sequence>
<annotation>
<documentation xml:lang="de">Quittierungsphase nach Download.</documentation>
<documentation xml:lang="en">Receipt phase after download.</documentation>
</annotation>
<element name="TransferReceipt">
<annotation>
<documentation xml:lang="de">Quittierung des Transfers.</documentation>
<documentation xml:lang="en">Receipt of transfer.</documentation>
</annotation>
<complexType>
<complexContent>
<extension base="ebics:TransferReceiptRequestType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</complexContent>
</complexType>
</element>
</sequence>
</choice>
</sequence>
</complexType>
</element>
</sequence>
<attributeGroup ref="ebics:VersionAttrGroup"/>
<anyAttribute namespace="##targetNamespace" processContents="strict"/>
</complexType>
</element>
<complexType name="StaticHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den statischen EBICS-Header.</documentation>
<documentation xml:lang="en">Data type for the static EBICS header.</documentation>
</annotation>
<sequence>
<element name="HostID" type="ebics:HostIDType">
<annotation>
<documentation xml:lang="de">Hostname des Banksystems.</documentation>
</annotation>
</element>
<choice>
<annotation>
<documentation xml:lang="de">Transaktionsphase?</documentation>
<documentation xml:lang="en">Transaction phase?</documentation>
</annotation>
<sequence>
<annotation>
<documentation xml:lang="de">Initialisierungsphase.</documentation>
<documentation xml:lang="en">Initialisation phase.</documentation>
</annotation>
<element name="Nonce" type="ebics:NonceType">
<annotation>
<documentation xml:lang="de">Zufallswert; damit wird die Initialisierungsnachricht des Clients einzigartig.</documentation>
<documentation xml:lang="en">Random value, ensures the uniqueness of the client's message during initialisation phase.</documentation>
</annotation>
</element>
<element name="Timestamp" type="ebics:TimestampType">
<annotation>
<documentation xml:lang="de">aktueller Zeitstempel zur Begrenzung der serverseitigen Nonce-Speicherung.</documentation>
<documentation xml:lang="en">current timestamp, used to limit storage space for nonces on the server.</documentation>
</annotation>
</element>
<element name="PartnerID" type="ebics:PartnerIDType">
<annotation>
<documentation xml:lang="de">Kunden-ID des serverseitig administrierten Kunden.</documentation>
<documentation xml:lang="en">ID of the partner = customer, administered on the server.</documentation>
</annotation>
</element>
<element name="UserID" type="ebics:UserIDType">
<annotation>
<documentation xml:lang="de">Teilnehmer-ID des serverseitig zu diesem Kunden administrierten Teilnehmers.</documentation>
<documentation xml:lang="en">ID of the user that is assigned to the given customer, administered on the server.</documentation>
</annotation>
</element>
<element name="SystemID" type="ebics:UserIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">technische User-ID für Multi-User-Systeme.</documentation>
<documentation xml:lang="en">ID of the system for multi-user systems.</documentation>
</annotation>
</element>
<element name="Product" nillable="true" minOccurs="0">
<annotation>
<documentation xml:lang="de">Kennung des Kundenprodukts bzw. Herstellerkennung oder Name.</documentation>
<documentation xml:lang="en">software ID / manufacturer ID / manufacturer's name of the customer's software package.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:ProductType">
<attribute name="Language" type="ebics:LanguageType" use="required">
<annotation>
<documentation xml:lang="de">Sprachkennzeichen der Kundenproduktversion (gemäß ISO 639).</documentation>
<documentation xml:lang="en">Language code of the customer's software package according to ISO 639.</documentation>
</annotation>
</attribute>
<attribute name="InstituteID" type="ebics:InstituteIDType" use="optional">
<annotation>
<documentation xml:lang="de">Kennung des Herausgebers des Kundenprodukts bzw. des betreuenden Kreditinstituts.</documentation>
<documentation xml:lang="en">ID of the manufacturer / financial institute providing support for the customer's software package.</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
<element name="OrderDetails" type="ebics:StaticHeaderOrderDetailsType">
<annotation>
<documentation xml:lang="de">Auftragsdetails.</documentation>
<documentation xml:lang="en">order details.</documentation>
</annotation>
</element>
<element name="BankPubKeyDigests">
<annotation>
<documentation xml:lang="de">Hashwerte der erwarteten öffentlichen Schlüssel (Verschlüsselung, Signatur, Authentifikation) des Kreditinstituts.</documentation>
<documentation xml:lang="en">Digest values of the expected public keys (authentication, encryption, signature) owned by the financial institute.</documentation>
</annotation>
<complexType>
<sequence>
<element name="Authentication">
<annotation>
<documentation xml:lang="de">Hashwert des Authentifikationsschlüssels.</documentation>
<documentation xml:lang="en">Digest value of the public authentication key.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:PubKeyDigestType">
<attribute name="Version" type="ebics:AuthenticationVersionType" use="required">
<annotation>
<documentation xml:lang="de">Version des Authentifikationsverfahrens.</documentation>
<documentation xml:lang="en">Version of the algorithm used for authentication.</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
<element name="Encryption">
<annotation>
<documentation xml:lang="de">Hashwert des Verschlüsselungsschlüssels.</documentation>
<documentation xml:lang="en">Digest value of the public encryption key.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:PubKeyDigestType">
<attribute name="Version" type="ebics:EncryptionVersionType" use="required">
<annotation>
<documentation xml:lang="de">Version des Verschlüsselungsverfahrens.</documentation>
<documentation xml:lang="en">Version of the algorithm used for encryption.</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
<element name="Signature" minOccurs="0" maxOccurs="0">
<annotation>
<documentation xml:lang="de">Hashwert des Signaturschlüssels.</documentation>
<documentation xml:lang="en">Digest value of the public signature key.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:PubKeyDigestType">
<attribute name="Version" type="ebics:SignatureVersionType" use="required">
<annotation>
<documentation xml:lang="de">Version des Signaturverfahrens.</documentation>
<documentation xml:lang="en">Version of the algorithm used for signature creation.</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>
</element>
<element name="SecurityMedium" type="ebics:SecurityMediumType">
<annotation>
<documentation xml:lang="de">Angabe des Sicherheitsmediums, das der Kunde verwendet.</documentation>
<documentation xml:lang="en">Classification of the security medium used by the customer.</documentation>
</annotation>
</element>
<element name="NumSegments" type="ebics:NumSegmentsType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Gesamtsegmentanzahl für diese Transaktion; nur bei Uploads anzugeben.</documentation>
<documentation xml:lang="en">Total number of segments for this transaction; mandatory for uploads only.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<sequence>
<annotation>
<documentation xml:lang="de">Transfer- und Quittierungsphase.</documentation>
<documentation xml:lang="en">Transfer or receipt phase.</documentation>
</annotation>
<element name="TransactionID" type="ebics:TransactionIDType">
<annotation>
<documentation xml:lang="de">eindeutige, technische Transaktions-ID; wird vom Server vergeben.</documentation>
<documentation xml:lang="en">unique transaction ID, provided by the server.</documentation>
</annotation>
</element>
</sequence>
</choice>
</sequence>
</complexType>
<complexType name="MutableHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den variablen EBICS-Header.</documentation>
<documentation xml:lang="en">Data type for the mutable EBICS header.</documentation>
</annotation>
<sequence>
<element name="TransactionPhase" type="ebics:TransactionPhaseType">
<annotation>
<documentation xml:lang="de">Phase, in der sich die Transaktion gerade befindet; wird bei jedem Transaktionsschritt vom Client gesetzt und vom Server übernommen.</documentation>
<documentation xml:lang="en">Current phase of the transaction; this information is provided by the client for each step of the transaction, and the server adopts the setting.</documentation>
</annotation>
</element>
<element name="SegmentNumber" nillable="true" minOccurs="0">
<annotation>
<documentation xml:lang="de">enthält die Nummer des aktuellen Segments, welches gerade übertragen oder angefordert wird; nur anzugeben bei TransactionPhase=Transfer.</documentation>
<documentation xml:lang="en">contains the number of the segment which is currently being transmitted or requested; mandatory for transaction phase 'Transfer' only.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:SegmentNumberType">
<attribute name="lastSegment" type="boolean" use="required">
<annotation>
<documentation xml:lang="de">Ist dies das letzte Segment der Übertragung?</documentation>
<documentation xml:lang="en">Is this segment meant to be the last one regarding this transmission?</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="StaticHeaderOrderDetailsType">
<annotation>
<documentation xml:lang="de">Datentyp für Auftragsdetails im statischen EBICS-Header.</documentation>
<documentation xml:lang="en">Data type for order details stored in the static EBICS header.</documentation>
</annotation>
<sequence>
<element name="OrderType">
<annotation>
<documentation xml:lang="de">Auftragsart.</documentation>
<documentation xml:lang="en">type code of the order.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:OrderTBaseType"/>
</simpleContent>
</complexType>
</element>
<element name="OrderID" type="ebics:OrderIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Auftragsnummer für Sendeaufträge gemäß DFÜ-Abkommen.</documentation>
<documentation xml:lang="en">ID of the (upload) order, formatted in accordance with the document "DFÜ-Abkommen".</documentation>
</annotation>
</element>
<element name="OrderAttribute" type="ebics:OrderAttributeType">
<annotation>
<documentation xml:lang="de">Auftragsattribut.</documentation>
<documentation xml:lang="en">attribute describing the order contents.</documentation>
</annotation>
</element>
<element ref="ebics:OrderParams"/>
</sequence>
</complexType>
</schema>

166
test/xsd/ebics_response_H004.xsd Executable file
View File

@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ebics="urn:org:ebics:H004" targetNamespace="urn:org:ebics:H004" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<annotation>
<documentation xml:lang="de">ebics_response_H004.xsd ist das EBICS-Protokollschema für Antwortnachrichten.</documentation>
<documentation xml:lang="en">ebics_response_H004.xsd is the appropriate EBICS protocol schema for standard responses.</documentation>
</annotation>
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd">
<annotation>
<documentation xml:lang="de">XML-Signature.</documentation>
</annotation>
</import>
<include schemaLocation="ebics_types_H004.xsd"/>
<include schemaLocation="ebics_orders_H004.xsd"/>
<element name="ebicsResponse">
<annotation>
<documentation xml:lang="de">Electronic Banking Internet Communication Standard des Zentralen Kreditausschusses (ZKA): Multibankfähige Schnittstelle zur internetbasierten Kommunikation.</documentation>
<documentation xml:lang="en">Electronic Banking Internet Communication Standard of the "Zentraler Kreditausschuss (ZKA)": multi-bank capable interface for internet-based communication.</documentation>
</annotation>
<complexType>
<sequence>
<element name="header">
<annotation>
<documentation xml:lang="de">enthält die technischen Transaktionsdaten.</documentation>
<documentation xml:lang="en">contains the transaction-driven data.</documentation>
</annotation>
<complexType>
<sequence>
<element name="static" type="ebics:ResponseStaticHeaderType">
<annotation>
<documentation xml:lang="de">enhält alle festen Headereinträge.</documentation>
<documentation xml:lang="en">contains the static header entries.</documentation>
</annotation>
</element>
<element name="mutable" type="ebics:ResponseMutableHeaderType">
<annotation>
<documentation xml:lang="de">enthält alle variablen Headereinträge.</documentation>
<documentation xml:lang="en">contains the mutable header entries.</documentation>
</annotation>
</element>
</sequence>
<attributeGroup ref="ebics:AuthenticationMarker"/>
</complexType>
</element>
<element ref="ebics:AuthSignature">
<annotation>
<documentation xml:lang="de">Authentifikationssignatur.</documentation>
<documentation xml:lang="en">Authentication signature.</documentation>
</annotation>
</element>
<element name="body">
<annotation>
<documentation xml:lang="de">enthält die Auftragsdaten, EU(s) und weitere Nutzdaten.</documentation>
<documentation xml:lang="en">contains order data, order signature(s) and further data referring to the current order.</documentation>
</annotation>
<complexType>
<sequence>
<element name="DataTransfer" type="ebics:DataTransferResponseType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Transfer von Auftragsdaten; nur bei Download anzugeben.</documentation>
<documentation xml:lang="en">Transfer of signature or order data; mandatory for downloads only.</documentation>
</annotation>
</element>
<element name="ReturnCode">
<annotation>
<documentation xml:lang="de">fachlicher Antwortcode für den vorangegangenen Request.</documentation>
<documentation xml:lang="en">order-related return code of the previous request.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:ReturnCodeType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</simpleContent>
</complexType>
</element>
<element name="TimestampBankParameter" minOccurs="0">
<annotation>
<documentation xml:lang="de">Zeitstempel der letzten Aktualisierung der Bankparameter; nur in der Initialisierungsphase anzugeben.</documentation>
<documentation xml:lang="en">timestamp indicating the latest update of the bank parameters; may be set during initialisation phase only.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:TimestampType">
<attributeGroup ref="ebics:AuthenticationMarker"/>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
<attributeGroup ref="ebics:VersionAttrGroup"/>
<anyAttribute namespace="##targetNamespace" processContents="strict"/>
</complexType>
</element>
<complexType name="ResponseStaticHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den statischen EBICS-Header.</documentation>
<documentation xml:lang="en">Data type for the static EBICS header.</documentation>
</annotation>
<sequence>
<element name="TransactionID" type="ebics:TransactionIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">eindeutige, technische Transaktions-ID; wird vom Server vergeben, falls OrderAttribute entweder gleich "OZHNN" oder gleich "DZHNN" ist und falls tatsächlich eine Transaktion erzeugt wurde.</documentation>
<documentation xml:lang="en">unique transaction ID, provided by the server if and only if the order attribute is set to either "OZHNN" or "DZHNN" and if a transaction has been established actually.</documentation>
</annotation>
</element>
<element name="NumSegments" type="ebics:SegmentNumberType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Gesamtsegmentanzahl für diese Transaktion; nur bei Downloads in der Initialisierungsphase anzugeben.</documentation>
<documentation xml:lang="en">Total number of segments for this transaction; mandatory for downloads in initialisation phase only.</documentation>
</annotation>
</element>
</sequence>
</complexType>
<complexType name="ResponseMutableHeaderType">
<annotation>
<documentation xml:lang="de">Datentyp für den variablen EBICS-Header.</documentation>
<documentation xml:lang="en">Data type for the mutable EBICS header.</documentation>
</annotation>
<sequence>
<element name="TransactionPhase" type="ebics:TransactionPhaseType">
<annotation>
<documentation xml:lang="de">Phase, in der sich die Transaktion gerade befindet; wird bei jedem Transaktionsschritt vom Client gesetzt und vom Server übernommen.</documentation>
<documentation xml:lang="en">Current phase of the transaction; this information is provided by the client for each step of the transaction, and the server adopts the setting.</documentation>
</annotation>
</element>
<element name="SegmentNumber" minOccurs="0">
<annotation>
<documentation xml:lang="de">enthält die Nummer des aktuellen Segments, welches gerade übertragen oder angefordert wird; nur anzugeben bei TransactionPhase=Transfer und (bei Download) TransactionPhase=Initialisation.</documentation>
<documentation xml:lang="en">contains the number of the segment which is currently being transmitted or requested; mandatory for transaction phases 'Transfer' and (for downloads) 'Initialisation' only.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="ebics:SegmentNumberType">
<attribute name="lastSegment" type="boolean" use="required">
<annotation>
<documentation xml:lang="de">Ist dies das letzte Segment der Übertragung?</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
<element name="OrderID" type="ebics:OrderIDType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Auftragsnummer von Sendeaufträgen gemäß DFÜ-Abkommen.</documentation>
</annotation>
</element>
<element name="ReturnCode" type="ebics:ReturnCodeType">
<annotation>
<documentation xml:lang="de">Rückmeldung des technischen Status mit einer eindeutigen Fehlernummer.</documentation>
<documentation xml:lang="en">Return code indicating the technical status.</documentation>
</annotation>
</element>
<element name="ReportText" type="ebics:ReportTextType">
<annotation>
<documentation xml:lang="de">Klartext der Rückmeldung des technischen Status.</documentation>
<documentation xml:lang="en">Textual interpretation of the returned technical status code.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</schema>

217
test/xsd/ebics_signature.xsd Executable file
View File

@@ -0,0 +1,217 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:esig="http://www.ebics.org/S001" targetNamespace="http://www.ebics.org/S001" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
<annotation>
<documentation xml:lang="de">ebics_signature enthält Typdefinitionen für elektronische Unterschriften der Versionen A004, A005, A006 und folgende.</documentation>
<documentation xml:lang="en">ebics_EU contains type definitions for electronic signatures: versions A005, A006 and et sqq.</documentation>
</annotation>
<!-- Elementdefinitionen für die EU. Die XML-Klartext-Struktur wird im EBICS-Signaturdatenkontext binär interpretiert.-->
<element name="EBICSSignatureData" abstract="true">
<annotation>
<documentation xml:lang="de">XML-Strukturen für bankfachliche Elektronische Unterschriften (EUs).</documentation>
<documentation xml:lang="en">contains the digital signatures.</documentation>
</annotation>
</element>
<element name="UserSignatureData" type="esig:UserSignatureDataSigBookType" substitutionGroup="esig:EBICSSignatureData">
<annotation>
<documentation xml:lang="de">enthält die EUs der Teilnehmer.</documentation>
<documentation xml:lang="en">contains the digital signatures.</documentation>
</annotation>
</element>
<complexType name="UserSignatureDataSigBookType">
<annotation>
<documentation xml:lang="de">Datentyp für Signaturdaten des Teilnehmers beim EU-Transfer.</documentation>
<documentation xml:lang="en">Data type for digital signature data transferred using EBICS.</documentation>
</annotation>
<sequence>
<choice maxOccurs="unbounded">
<element name="OrderSignature">
<annotation>
<documentation xml:lang="de">bankfachliche Elektronische Unterschrift oder Transportunterschrift (Binärformat).</documentation>
<documentation xml:lang="en">Digital signature (either autorising an order or applied for transportation), binary format.</documentation>
</annotation>
<complexType>
<simpleContent>
<extension base="esig:OrderSignatureType">
<attribute name="PartnerID" use="required">
<annotation>
<documentation xml:lang="de">Kunden-ID des Unterzeichners.</documentation>
<documentation xml:lang="en">Customer ID of the signer.</documentation>
</annotation>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
<element name="OrderSignatureData" type="esig:OrderSignatureDataType">
<annotation>
<documentation xml:lang="de">bankfachliche Elektronische Unterschrift oder Transportunterschrift (strukturiertes Format).</documentation>
<documentation xml:lang="en">Digital signature (either autorising an order or applied for transportation), structured format.</documentation>
</annotation>
</element>
</choice>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<simpleType name="OrderSignatureType">
<annotation>
<documentation xml:lang="de">Datentyp für kryptographische Unterschriften.</documentation>
</annotation>
<restriction base="base64Binary"/>
</simpleType>
<element name="OrderSignatureData" type="esig:OrderSignatureDataType">
<annotation>
<documentation xml:lang="de">bankfachliche Elektronische Unterschrift oder Transportunterschrift (strukturiertes Format).</documentation>
<documentation xml:lang="en">Digital signature (either autorising an order or applied for transportation), structured format.</documentation>
</annotation>
</element>
<complexType name="OrderSignatureDataType">
<annotation>
<documentation xml:lang="de">Datentyp für bankfachliche Elektronische Unterschrift oder Transportunterschrift (strukturiertes Format).</documentation>
<documentation xml:lang="en">Data type according for a digital signature (either autorising an order or applied for transportation), structured format.</documentation>
</annotation>
<sequence>
<element name="SignatureVersion" type="esig:SignatureVersionType">
<annotation>
<documentation xml:lang="de">Version des Signaturverfahrens.</documentation>
<documentation xml:lang="en">Version of the algorithm used for signature creation.</documentation>
</annotation>
</element>
<element name="SignatureValue" type="base64Binary">
<annotation>
<documentation xml:lang="de">Digitale Signatur.</documentation>
<documentation xml:lang="en">Digital signature.</documentation>
</annotation>
</element>
<element name="PartnerID" type="esig:PartnerIDType">
<annotation>
<documentation xml:lang="de">Kunden-ID des Unterzeichners.</documentation>
<documentation xml:lang="en">Customer ID of the signer.</documentation>
</annotation>
</element>
<element name="UserID" type="esig:UserIDType">
<annotation>
<documentation xml:lang="de">Teilnehmer-ID.</documentation>
<documentation xml:lang="en">User ID.</documentation>
</annotation>
</element>
<element ref="ds:X509Data" minOccurs="0">
<annotation>
<documentation xml:lang="de">Parameter zur X.509-Funktionalität</documentation>
<documentation xml:lang="en">Parameter for X509Data</documentation>
</annotation>
</element>
</sequence>
</complexType>
<simpleType name="PartnerIDType">
<annotation>
<documentation xml:lang="de">Datentyp für eine Kunden-ID.</documentation>
</annotation>
<restriction base="token">
<maxLength value="35"/>
</restriction>
</simpleType>
<simpleType name="UserIDType">
<annotation>
<documentation xml:lang="de">Datentyp für eine Teilnehmer-ID.</documentation>
</annotation>
<restriction base="token">
<maxLength value="35"/>
</restriction>
</simpleType>
<simpleType name="SignatureVersionType">
<annotation>
<documentation xml:lang="de">Datentyp für Versionsnummern zur Elektronischen Unterschrift (EU).</documentation>
</annotation>
<restriction base="token">
<length value="4"/>
<pattern value="A\d{3}"/>
</restriction>
</simpleType>
<!-- Definitionen für die Uebertragung von oeffentlichen Signierschlüsseln. z.B. ueber EBICS mit INI, PUB, HCS.-->
<element name="SignaturePubKeyOrderData" type="esig:SignaturePubKeyOrderDataType">
<annotation>
<documentation xml:lang="de">Element für Public Key Dateien unabhängig von der Auftragsart / Geschäftsvorfall.</documentation>
</annotation>
</element>
<complexType name="SignaturePubKeyOrderDataType">
<annotation>
<documentation xml:lang="de">Datentyp für Public Key Dateien unabhängig von der Auftragsart / Geschäftsvorfall.</documentation>
</annotation>
<sequence>
<element name="SignaturePubKeyInfo" type="esig:SignaturePubKeyInfoType">
<annotation>
<documentation xml:lang="de">öffentlicher Signaturschlüssel.</documentation>
</annotation>
</element>
<element name="PartnerID" type="esig:PartnerIDType">
<annotation>
<documentation xml:lang="de">Kunden-ID.</documentation>
</annotation>
</element>
<element name="UserID" type="esig:UserIDType">
<annotation>
<documentation xml:lang="de">Teilnehmer-ID.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<element name="SignaturePubKeyInfo" type="esig:SignaturePubKeyInfoType">
<annotation>
<documentation xml:lang="de">öffentlicher Signaturschlüssel.</documentation>
</annotation>
</element>
<complexType name="SignaturePubKeyInfoType">
<annotation>
<documentation xml:lang="de">Datentyp für öffentliche bankfachliche Schlüssel.</documentation>
</annotation>
<complexContent>
<extension base="esig:PubKeyInfoType">
<sequence>
<element name="SignatureVersion" type="esig:SignatureVersionType">
<annotation>
<documentation xml:lang="de">Version des EU-Signaturverfahrens.</documentation>
</annotation>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="PubKeyInfoType">
<annotation>
<documentation xml:lang="de">Datentyp für die Darstellung eines öffentlichen RSA-Schlüssels als Exponent-Modulus-Kombination oder als X509-Zertifikat.</documentation>
</annotation>
<sequence>
<sequence>
<element ref="ds:X509Data" minOccurs="0"/>
<element name="PubKeyValue" type="esig:PubKeyValueType">
<annotation>
<documentation xml:lang="de">Darstellung als Exponent-Modulus-Kombination.</documentation>
</annotation>
</element>
</sequence>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="PubKeyValueType">
<annotation>
<documentation xml:lang="de">Datentyp für die Exponent-Modulus-Darstellung eines öffentlichen RSA-Schlüssels.</documentation>
</annotation>
<sequence>
<element ref="ds:RSAKeyValue"/>
<element name="TimeStamp" type="esig:TimestampType" minOccurs="0">
<annotation>
<documentation xml:lang="de">Zeitpunkt der Generierung des Schlüssels.</documentation>
</annotation>
</element>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<simpleType name="TimestampType">
<annotation>
<documentation xml:lang="de">Datentyp für Zeitstempel.</documentation>
</annotation>
<restriction base="dateTime"/>
</simpleType>
</schema>

2426
test/xsd/ebics_types_H004.xsd Executable file

File diff suppressed because it is too large Load Diff

7
test/xsd/test.xsd Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ebics="urn:org:ebics:H004" targetNamespace="urn:org:ebics:H004" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
<annotation>
<documentation xml:lang="de">ebics_H004.xsd inkludiert alle Schemadateien des EBICS-Protokolls, um die Eindeutigkeit von Element- und Typnamen im EBCIS Namespace zu erzwingen.</documentation>
<documentation xml:lang="en">ebics_H004.xsd includes all schema files for the EBICS protocol in order to enforce unique element and type names in the EBICS namespace.</documentation>
</annotation>
</schema>

318
test/xsd/xmldsig-core-schema.xsd Executable file
View File

@@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE schema
PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
[
<!ATTLIST schema
xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#">
<!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'>
<!ENTITY % p ''>
<!ENTITY % s ''>
]>
<!-- Schema for XML Signatures
http://www.w3.org/2000/09/xmldsig#
$Revision: 1.1 $ on $Date: 2002/02/08 20:32:26 $ by $Author: reagle $
Copyright 2001 The Internet Society and W3C (Massachusetts Institute
of Technology, Institut National de Recherche en Informatique et en
Automatique, Keio University). All Rights Reserved.
http://www.w3.org/Consortium/Legal/
This document is governed by the W3C Software License [1] as described
in the FAQ [2].
[1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
[2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
targetNamespace="http://www.w3.org/2000/09/xmldsig#"
version="0.1" elementFormDefault="qualified">
<!-- Basic Types Defined for Signatures -->
<simpleType name="CryptoBinary">
<restriction base="base64Binary">
</restriction>
</simpleType>
<!-- Start Signature -->
<element name="Signature" type="ds:SignatureType"/>
<complexType name="SignatureType">
<sequence>
<element ref="ds:SignedInfo"/>
<element ref="ds:SignatureValue"/>
<element ref="ds:KeyInfo" minOccurs="0"/>
<element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="Id" type="ID" use="optional"/>
</complexType>
<element name="SignatureValue" type="ds:SignatureValueType"/>
<complexType name="SignatureValueType">
<simpleContent>
<extension base="base64Binary">
<attribute name="Id" type="ID" use="optional"/>
</extension>
</simpleContent>
</complexType>
<!-- Start SignedInfo -->
<element name="SignedInfo" type="ds:SignedInfoType"/>
<complexType name="SignedInfoType">
<sequence>
<element ref="ds:CanonicalizationMethod"/>
<element ref="ds:SignatureMethod"/>
<element ref="ds:Reference" maxOccurs="unbounded"/>
</sequence>
<attribute name="Id" type="ID" use="optional"/>
</complexType>
<element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/>
<complexType name="CanonicalizationMethodType" mixed="true">
<sequence>
<any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
<!-- (0,unbounded) elements from (1,1) namespace -->
</sequence>
<attribute name="Algorithm" type="anyURI" use="required"/>
</complexType>
<element name="SignatureMethod" type="ds:SignatureMethodType"/>
<complexType name="SignatureMethodType" mixed="true">
<sequence>
<element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/>
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
<!-- (0,unbounded) elements from (1,1) external namespace -->
</sequence>
<attribute name="Algorithm" type="anyURI" use="required"/>
</complexType>
<!-- Start Reference -->
<element name="Reference" type="ds:ReferenceType"/>
<complexType name="ReferenceType">
<sequence>
<element ref="ds:Transforms" minOccurs="0"/>
<element ref="ds:DigestMethod"/>
<element ref="ds:DigestValue"/>
</sequence>
<attribute name="Id" type="ID" use="optional"/>
<attribute name="URI" type="anyURI" use="optional"/>
<attribute name="Type" type="anyURI" use="optional"/>
</complexType>
<element name="Transforms" type="ds:TransformsType"/>
<complexType name="TransformsType">
<sequence>
<element ref="ds:Transform" maxOccurs="unbounded"/>
</sequence>
</complexType>
<element name="Transform" type="ds:TransformType"/>
<complexType name="TransformType" mixed="true">
<choice minOccurs="0" maxOccurs="unbounded">
<any namespace="##other" processContents="lax"/>
<!-- (1,1) elements from (0,unbounded) namespaces -->
<element name="XPath" type="string"/>
</choice>
<attribute name="Algorithm" type="anyURI" use="required"/>
</complexType>
<!-- End Reference -->
<element name="DigestMethod" type="ds:DigestMethodType"/>
<complexType name="DigestMethodType" mixed="true">
<sequence>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="Algorithm" type="anyURI" use="required"/>
</complexType>
<element name="DigestValue" type="ds:DigestValueType"/>
<simpleType name="DigestValueType">
<restriction base="base64Binary"/>
</simpleType>
<!-- End SignedInfo -->
<!-- Start KeyInfo -->
<element name="KeyInfo" type="ds:KeyInfoType"/>
<complexType name="KeyInfoType" mixed="true">
<choice maxOccurs="unbounded">
<element ref="ds:KeyName"/>
<element ref="ds:KeyValue"/>
<element ref="ds:RetrievalMethod"/>
<element ref="ds:X509Data"/>
<element ref="ds:PGPData"/>
<element ref="ds:SPKIData"/>
<element ref="ds:MgmtData"/>
<any processContents="lax" namespace="##other"/>
<!-- (1,1) elements from (0,unbounded) namespaces -->
</choice>
<attribute name="Id" type="ID" use="optional"/>
</complexType>
<element name="KeyName" type="string"/>
<element name="MgmtData" type="string"/>
<element name="KeyValue" type="ds:KeyValueType"/>
<complexType name="KeyValueType" mixed="true">
<choice>
<element ref="ds:DSAKeyValue"/>
<element ref="ds:RSAKeyValue"/>
<any namespace="##other" processContents="lax"/>
</choice>
</complexType>
<element name="RetrievalMethod" type="ds:RetrievalMethodType"/>
<complexType name="RetrievalMethodType">
<sequence>
<element ref="ds:Transforms" minOccurs="0"/>
</sequence>
<attribute name="URI" type="anyURI"/>
<attribute name="Type" type="anyURI" use="optional"/>
</complexType>
<!-- Start X509Data -->
<element name="X509Data" type="ds:X509DataType"/>
<complexType name="X509DataType">
<sequence maxOccurs="unbounded">
<choice>
<element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
<element name="X509SKI" type="base64Binary"/>
<element name="X509SubjectName" type="string"/>
<element name="X509Certificate" type="base64Binary"/>
<element name="X509CRL" type="base64Binary"/>
<any namespace="##other" processContents="lax"/>
</choice>
</sequence>
</complexType>
<complexType name="X509IssuerSerialType">
<sequence>
<element name="X509IssuerName" type="string"/>
<element name="X509SerialNumber" type="integer"/>
</sequence>
</complexType>
<!-- End X509Data -->
<!-- Begin PGPData -->
<element name="PGPData" type="ds:PGPDataType"/>
<complexType name="PGPDataType">
<choice>
<sequence>
<element name="PGPKeyID" type="base64Binary"/>
<element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/>
<any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</sequence>
<sequence>
<element name="PGPKeyPacket" type="base64Binary"/>
<any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded"/>
</sequence>
</choice>
</complexType>
<!-- End PGPData -->
<!-- Begin SPKIData -->
<element name="SPKIData" type="ds:SPKIDataType"/>
<complexType name="SPKIDataType">
<sequence maxOccurs="unbounded">
<element name="SPKISexp" type="base64Binary"/>
<any namespace="##other" processContents="lax" minOccurs="0"/>
</sequence>
</complexType>
<!-- End SPKIData -->
<!-- End KeyInfo -->
<!-- Start Object (Manifest, SignatureProperty) -->
<element name="Object" type="ds:ObjectType"/>
<complexType name="ObjectType" mixed="true">
<sequence minOccurs="0" maxOccurs="unbounded">
<any namespace="##any" processContents="lax"/>
</sequence>
<attribute name="Id" type="ID" use="optional"/>
<attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet -->
<attribute name="Encoding" type="anyURI" use="optional"/>
</complexType>
<element name="Manifest" type="ds:ManifestType"/>
<complexType name="ManifestType">
<sequence>
<element ref="ds:Reference" maxOccurs="unbounded"/>
</sequence>
<attribute name="Id" type="ID" use="optional"/>
</complexType>
<element name="SignatureProperties" type="ds:SignaturePropertiesType"/>
<complexType name="SignaturePropertiesType">
<sequence>
<element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
</sequence>
<attribute name="Id" type="ID" use="optional"/>
</complexType>
<element name="SignatureProperty" type="ds:SignaturePropertyType"/>
<complexType name="SignaturePropertyType" mixed="true">
<choice maxOccurs="unbounded">
<any namespace="##other" processContents="lax"/>
<!-- (1,1) elements from (1,unbounded) namespaces -->
</choice>
<attribute name="Target" type="anyURI" use="required"/>
<attribute name="Id" type="ID" use="optional"/>
</complexType>
<!-- End Object (Manifest, SignatureProperty) -->
<!-- Start Algorithm Parameters -->
<simpleType name="HMACOutputLengthType">
<restriction base="integer"/>
</simpleType>
<!-- Start KeyValue Element-types -->
<element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
<complexType name="DSAKeyValueType">
<sequence>
<sequence minOccurs="0">
<element name="P" type="ds:CryptoBinary"/>
<element name="Q" type="ds:CryptoBinary"/>
</sequence>
<element name="G" type="ds:CryptoBinary" minOccurs="0"/>
<element name="Y" type="ds:CryptoBinary"/>
<element name="J" type="ds:CryptoBinary" minOccurs="0"/>
<sequence minOccurs="0">
<element name="Seed" type="ds:CryptoBinary"/>
<element name="PgenCounter" type="ds:CryptoBinary"/>
</sequence>
</sequence>
</complexType>
<element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
<complexType name="RSAKeyValueType">
<sequence>
<element name="Modulus" type="ds:CryptoBinary"/>
<element name="Exponent" type="ds:CryptoBinary"/>
</sequence>
</complexType>
<!-- End KeyValue Element-types -->
<!-- End Signature -->
</schema>