From 8841bfb503643bc0ff1eca9ce061a3b9592bc32c Mon Sep 17 00:00:00 2001 From: Gustavo Weber Denardin Date: Mon, 24 Mar 2025 08:54:30 -0300 Subject: [PATCH 1/5] Exaple of sunspec library with Security Modbus. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index cc9a1c8..298adaa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,4 +29,4 @@ tokio-modbus = { version = "0.16", optional = true } serde_json = "1.0.114" [workspace] -members = ["sunspec-gen", "examples/readme", "examples/model103"] +members = ["sunspec-gen", "examples/readme", "examples/model103", "examples/model701_tls"] From e7710da9e56a3c91c95e08062d69104062299237 Mon Sep 17 00:00:00 2001 From: Gustavo Weber Denardin Date: Mon, 24 Mar 2025 09:29:59 -0300 Subject: [PATCH 2/5] Add the example --- examples/model701_tls/.gitignore | 1 + examples/model701_tls/.vscode/launch.json | 45 + examples/model701_tls/Cargo.lock | 1240 +++++++++++++++++++++ examples/model701_tls/Cargo.toml | 20 + examples/model701_tls/pki/ca.key | 28 + examples/model701_tls/pki/ca.pem | 23 + examples/model701_tls/pki/cav3.key | 5 + examples/model701_tls/pki/cav3.pem | 11 + examples/model701_tls/pki/cav3.srl | 1 + examples/model701_tls/pki/clientv3.csr | 8 + examples/model701_tls/pki/clientv3.key | 5 + examples/model701_tls/pki/clientv3.pem | 11 + examples/model701_tls/pki/generate_ecc.sh | 15 + examples/model701_tls/pki/generate_rsa.sh | 12 + examples/model701_tls/pki/server.key | 28 + examples/model701_tls/pki/server.pem | 22 + examples/model701_tls/pki/serverv3.csr | 8 + examples/model701_tls/pki/serverv3.key | 5 + examples/model701_tls/pki/serverv3.pem | 11 + examples/model701_tls/pki/truststore.p12 | Bin 0 -> 774 bytes examples/model701_tls/pki/v3.ext | 5 + examples/model701_tls/src/main.rs | 178 +++ 22 files changed, 1682 insertions(+) create mode 100644 examples/model701_tls/.gitignore create mode 100644 examples/model701_tls/.vscode/launch.json create mode 100644 examples/model701_tls/Cargo.lock create mode 100644 examples/model701_tls/Cargo.toml create mode 100644 examples/model701_tls/pki/ca.key create mode 100644 examples/model701_tls/pki/ca.pem create mode 100644 examples/model701_tls/pki/cav3.key create mode 100644 examples/model701_tls/pki/cav3.pem create mode 100644 examples/model701_tls/pki/cav3.srl create mode 100644 examples/model701_tls/pki/clientv3.csr create mode 100644 examples/model701_tls/pki/clientv3.key create mode 100644 examples/model701_tls/pki/clientv3.pem create mode 100755 examples/model701_tls/pki/generate_ecc.sh create mode 100755 examples/model701_tls/pki/generate_rsa.sh create mode 100644 examples/model701_tls/pki/server.key create mode 100644 examples/model701_tls/pki/server.pem create mode 100644 examples/model701_tls/pki/serverv3.csr create mode 100644 examples/model701_tls/pki/serverv3.key create mode 100644 examples/model701_tls/pki/serverv3.pem create mode 100644 examples/model701_tls/pki/truststore.p12 create mode 100644 examples/model701_tls/pki/v3.ext create mode 100644 examples/model701_tls/src/main.rs diff --git a/examples/model701_tls/.gitignore b/examples/model701_tls/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/model701_tls/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/model701_tls/.vscode/launch.json b/examples/model701_tls/.vscode/launch.json new file mode 100644 index 0000000..925a4cb --- /dev/null +++ b/examples/model701_tls/.vscode/launch.json @@ -0,0 +1,45 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Debug executable 'sunspec-lib-test'", + "cargo": { + "args": [ + "build", + "--bin=sunspec-lib-test", + "--package=sunspec-lib-test" + ], + "filter": { + "name": "sunspec-lib-test", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in executable 'sunspec-lib-test'", + "cargo": { + "args": [ + "test", + "--no-run", + "--bin=sunspec-lib-test", + "--package=sunspec-lib-test" + ], + "filter": { + "name": "sunspec-lib-test", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/examples/model701_tls/Cargo.lock b/examples/model701_tls/Cargo.lock new file mode 100644 index 0000000..08bd136 --- /dev/null +++ b/examples/model701_tls/Cargo.lock @@ -0,0 +1,1240 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "aws-lc-rs" +version = "1.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dabb68eb3a7aa08b46fddfd59a3d55c978243557a90ab804769f7e20e67d2b01" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77926887776171ced7d662120a75998e444d3750c951abfe07f90da130514b1f" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", + "which", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64", + "serde", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes", + "cbc", + "der", + "pbkdf2", + "scrypt", + "sha2", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "pkcs5", + "rand_core", + "spki", +] + +[[package]] +name = "prettyplease" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" + +[[package]] +name = "rustls-webpki" +version = "0.103.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +dependencies = [ + "pbkdf2", + "salsa20", + "sha2", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "sunspec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f245c714ddf99fb540e93e8a3955f691f645260ef00051e8d2b85653e3697c9a" +dependencies = [ + "bitflags", + "strum", + "thiserror", + "tokio", + "tokio-modbus", +] + +[[package]] +name = "sunspec-lib-test" +version = "0.1.0" +dependencies = [ + "anyhow", + "base64", + "clap", + "itertools 0.14.0", + "pem", + "pkcs8", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "sunspec", + "tokio", + "tokio-modbus", + "tokio-rustls", + "webpki-roots", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio" +version = "1.44.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-modbus" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd5def942f13ebaebe636834026213ad9501e1cbd77687545cc08af4febd8a8" +dependencies = [ + "async-trait", + "byteorder", + "bytes", + "futures-core", + "futures-util", + "log", + "smallvec", + "thiserror", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "webpki-roots" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/examples/model701_tls/Cargo.toml b/examples/model701_tls/Cargo.toml new file mode 100644 index 0000000..c1b8a70 --- /dev/null +++ b/examples/model701_tls/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "model701_tls" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow = "1.0.44" +base64 = "0.22.1" +clap = { version = "4.4.7", features = ["derive"] } +itertools = "0.14.0" +pem = "3.0.5" +pkcs8 = { version = "0.10.2", features = ["encryption", "pem", "std"] } +pki-types = { package = "rustls-pki-types", version = "1" } +rustls = { version = "0.23.12", default-features = false, features = ["std"] } +rustls-pemfile = "2.2.0" +sunspec = { path = "../../" } +tokio = { version = "1.44.1", features = ["rt-multi-thread", "macros", "time"] } +tokio-modbus = { version = "0.16.1", features = ["tcp"] } +tokio-rustls = "0.26.2" +webpki-roots = "0.26.8" diff --git a/examples/model701_tls/pki/ca.key b/examples/model701_tls/pki/ca.key new file mode 100644 index 0000000..133435f --- /dev/null +++ b/examples/model701_tls/pki/ca.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCuPwscR0Twpih9 +Ht7STZLEnY5byvbvoqC1wa69CsgZzAfeduVdRKXnIGrm2c7Mm0AftKMQGu5IH8sP +cdBLBfCYtxQI7/2KRGk8cveKkJ9mJfohDKI6ifXY0iKK6EFhHA74qhsvRZbtpc5b +UiZX+w10cZmhLh40kxD2NQbskikpslseGnBh/jW+ozpd0NkQsHpvBm4CHaixim56 +5is8IzUFm8W88K6UAs9cQ4W5H87LPMihufTLKYWpJ7Dj0ug1D9xf+5mU7xZCJ3aF +Eou1WIti20xuZXACmM0SXvzKSPE2uLDQD8BfTS+os9v7p6G/NLyFmtU0pu0bpq6J +1k3GziE9AgMBAAECggEAAaeKbwr1Hgp0AAqYzd7FsLadfsR5s69T0Cmuly1OYGTx +0gduvsjZlLlrf1p8nnUcTPM6oZiOBQfVey0FqvAUJ3q/sJrN04Y6EqbTHFhbu7bo +rL5aFMDADeDJ1AWWm3xTS0v9klGuGq/wnQFw3xH8mJpo6eiG7FsaM2V+zl+ymOWg +Hbhy6xJBITGbxXygWEbZV4XoC956FzHPdDZg+M6EOEyTYQPr3E0OGONnv3rYYkAg +606jL0IpdElP8o9/nAE+5/fqLhGZMSwlGRszoMVwf5u2Dilmp8fYEI/y9s7H+chn +5qVQ+cSh2jAV9GMiyqzUybO7/DbLO78u/pnk/5n/sQKBgQDk0pG9Cqz6AwREWTTg +O5GJ1PSOtoxOO1sHcpea1MYK1gJwQQ0nxwQy5HUCD4lFo9cZdYr5P6eijpWnewCs +lh9mpraSUvWKg3n20zU1m8dPoT/DegSahi7Cceyj+aW7NW01M0+39RfTWnh6iigR +Zsr4JHdhJ9PgmafaF7KJlMuFlQKBgQDC8RAmxvjr9XuIJsgPkAFloj46Je5goBfw +bgnRBxHub2LoocGXAch5pirA8dQ8+W0lbabMLqBWhaVKw2HuOrJwUa/eC66w2Vvq +PQPhMew7Ls+GeahJYL116dgDuV8unvzo0S1d/5CL3UgHIwrX3SYnp6sO7kw+LNq/ +xlDugfLzCQKBgGWV0hux7J9FzZQmYmIWMAOX5kahZmKo2T3SMtoLEiznW8fIKXX6 +VbPeVs/mY9Pl6+2ikGMdTmfNk0T6R49XSnOBGdaWO+oVeoUIuTumf/KrLKq0teyA +G6w5dYxKnbgh/Oy8bezGQ6CSLqCAS0+Gah+F2PXp/5dbv/gDw0BvLXeNAoGAef3J +EbsqQt8YMxex0qtXdHaXYmQiTK1izb7OvdQi0Ic76kBvmUQwZJAr6RpsqsucFfQM +kXIMPJjd229xdVeeGtPDrry40Ur0Th1otCA9qLueepTfTywO5B82Yv46Jj6wHjHo +pg4sMpqDXJP9USC/o8k1Lt7JL496RNCiDN+dXaECgYEAswFI9GkWCozJpOrGIeim +bGXjdvcnnp804l4F3z5MrcyHDnwexfyi2S6KmI6WA2IWVolafnj0W21LU/vGGKFe +/VPN0RJuukYlC3jZPZfjjPsGCsVFfR1WGiszZvnaFoLB9buHdPCWPEpM+SiDFL7l +x3Q2gEGN0CuT3iaYqxq/zTY= +-----END PRIVATE KEY----- diff --git a/examples/model701_tls/pki/ca.pem b/examples/model701_tls/pki/ca.pem new file mode 100644 index 0000000..e9cc4a3 --- /dev/null +++ b/examples/model701_tls/pki/ca.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDvTCCAqWgAwIBAgIUdNBpVFizoYs/JlsnF1CLdC95yZkwDQYJKoZIhvcNAQEL +BQAwbTELMAkGA1UEBhMCQlIxDzANBgNVBAgMBlBhcmFuYTEUMBIGA1UEBwwLUGF0 +byBCcmFuY28xDjAMBgNVBAoMBVVURlBSMQswCQYDVQQLDAJQQjEaMBgGA1UEAwwR +VVRGUFItUEItUlNBLTIwNDgwHhcNMjUwMzIzMjAxNDQ3WhcNMzUwMzIxMjAxNDQ3 +WjBtMQswCQYDVQQGEwJCUjEPMA0GA1UECAwGUGFyYW5hMRQwEgYDVQQHDAtQYXRv +IEJyYW5jbzEOMAwGA1UECgwFVVRGUFIxCzAJBgNVBAsMAlBCMRowGAYDVQQDDBFV +VEZQUi1QQi1SU0EtMjA0ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AK4/CxxHRPCmKH0e3tJNksSdjlvK9u+ioLXBrr0KyBnMB9525V1EpecgaubZzsyb +QB+0oxAa7kgfyw9x0EsF8Ji3FAjv/YpEaTxy94qQn2Yl+iEMojqJ9djSIoroQWEc +DviqGy9Flu2lzltSJlf7DXRxmaEuHjSTEPY1BuySKSmyWx4acGH+Nb6jOl3Q2RCw +em8GbgIdqLGKbnrmKzwjNQWbxbzwrpQCz1xDhbkfzss8yKG59MsphaknsOPS6DUP +3F/7mZTvFkIndoUSi7VYi2LbTG5lcAKYzRJe/MpI8Ta4sNAPwF9NL6iz2/unob80 +vIWa1TSm7RumronWTcbOIT0CAwEAAaNVMFMwDwYDVR0TAQH/BAUwAwEB/zALBgNV +HQ8EBAMCBeAwFAYDVR0RBA0wC4IJbG9jYWxob3N0MB0GA1UdDgQWBBSMFp1vbFnv +MZvf6DaHVToI97lwlDANBgkqhkiG9w0BAQsFAAOCAQEAYdem2FihtJchaync9wi7 +ZmYvtvXIBI+73cHyCHyHyg8a1ay0w8P/ivZY2yDn93V97ORKM+ZVSUOk3Ce97QWc +ql6Uz0ej1eAzl815J2FBFHdNmHC7nZKpNTQGVWQ3Rg/j/zUJJOdkwK2sZVEjZpo+ +3KM4R4PFQ89X5Wcp6MBvZaxeepltatND4ygX0IceUDX+SBKw2qJ8Qo3gXSDkOYkn +gV7Siw3KMb4pqpSQhgkKt0TgH7ckzQ598QvC2fcekyiYqKPwJpA/nN0Xp2grTgfe +zcTxlCi2XYgRzqTvDnqceQoktN5/y9h9abQx1AfkcQQT+FaXQnpeYcSdA7ImdsLM +DQ== +-----END CERTIFICATE----- diff --git a/examples/model701_tls/pki/cav3.key b/examples/model701_tls/pki/cav3.key new file mode 100644 index 0000000..eabc1f2 --- /dev/null +++ b/examples/model701_tls/pki/cav3.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIAqPjejxXVSeUrLl9Zg+Lw4UuM8nID8QcDgD9/YWKuYqoAoGCCqGSM49 +AwEHoUQDQgAEYUXHFh6vaB6BAzKyMnGX9Qa9JYLKE+zziTmrqU1L/93N2O3sFamk +3mLTsY9L18JVhd33EcMQC+/JqpVctnR/Zg== +-----END EC PRIVATE KEY----- diff --git a/examples/model701_tls/pki/cav3.pem b/examples/model701_tls/pki/cav3.pem new file mode 100644 index 0000000..53c4a54 --- /dev/null +++ b/examples/model701_tls/pki/cav3.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBhDCCASugAwIBAgIUOOrKU6/sEaTg0muRA2QvoKQUWjAwCgYIKoZIzj0EAwIw +GDEWMBQGA1UEAwwNRUNDLXNlY3AyNTZyMTAeFw0yNTAzMjQxMDU3NTVaFw0zNTAz +MjIxMDU3NTVaMBgxFjAUBgNVBAMMDUVDQy1zZWNwMjU2cjEwWTATBgcqhkjOPQIB +BggqhkjOPQMBBwNCAARhRccWHq9oHoEDMrIycZf1Br0lgsoT7POJOaupTUv/3c3Y +7ewVqaTeYtOxj0vXwlWF3fcRwxAL78mqlVy2dH9mo1MwUTAdBgNVHQ4EFgQUbOLK +Iqi+fmUWh2xqiOoHmpp5TCYwHwYDVR0jBBgwFoAUbOLKIqi+fmUWh2xqiOoHmpp5 +TCYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiAq8+vMmZ+/Q4zl +vNxWNsq2AYOQNS7Dcw7w35jHbzVU1gIgd2gZrycYHAeteHVtRain5yTSKiO8ysHX +PuWgwaNkGQM= +-----END CERTIFICATE----- diff --git a/examples/model701_tls/pki/cav3.srl b/examples/model701_tls/pki/cav3.srl new file mode 100644 index 0000000..9d25175 --- /dev/null +++ b/examples/model701_tls/pki/cav3.srl @@ -0,0 +1 @@ +268F237553414289CC720A4D6EAF1263C431D11C diff --git a/examples/model701_tls/pki/clientv3.csr b/examples/model701_tls/pki/clientv3.csr new file mode 100644 index 0000000..51e97f4 --- /dev/null +++ b/examples/model701_tls/pki/clientv3.csr @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBAzCBqgIBADAhMR8wHQYDVQQDDBZjbGllbnQwMS1FQ0Mtc2VjcDI1NnIxMFkw +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEExSWWk8WZsDc3A/SJcNJAozPoON1BmIc +nEneZdqOMc45dNu784wRug87igVb6fZKZdFvA2VpsZHP5qL7Z4SGC6AnMCUGCSqG +SIb3DQEJDjEYMBYwFAYDVR0RBA0wC4IJbG9jYWxob3N0MAoGCCqGSM49BAMCA0gA +MEUCIFUscZ0SEklTqySFwoSlpfFYvmQSr1ZNsLO/SwTICesPAiEA8zIh8PFvirac +WdCE7N64Q7F42V1Yc7mVsha2rvVUmCI= +-----END CERTIFICATE REQUEST----- diff --git a/examples/model701_tls/pki/clientv3.key b/examples/model701_tls/pki/clientv3.key new file mode 100644 index 0000000..1f70ce4 --- /dev/null +++ b/examples/model701_tls/pki/clientv3.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIOs552SiUEzl69+8dpkQbv91uLTyuDxRJs2NQHbn40DFoAoGCCqGSM49 +AwEHoUQDQgAEExSWWk8WZsDc3A/SJcNJAozPoON1BmIcnEneZdqOMc45dNu784wR +ug87igVb6fZKZdFvA2VpsZHP5qL7Z4SGCw== +-----END EC PRIVATE KEY----- diff --git a/examples/model701_tls/pki/clientv3.pem b/examples/model701_tls/pki/clientv3.pem new file mode 100644 index 0000000..42093d0 --- /dev/null +++ b/examples/model701_tls/pki/clientv3.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBmTCCAT6gAwIBAgIBAjAKBggqhkjOPQQDAjAYMRYwFAYDVQQDDA1FQ0Mtc2Vj +cDI1NnIxMB4XDTI1MDMyNDEwNTc1N1oXDTM1MDMyMjEwNTc1N1owITEfMB0GA1UE +AwwWY2xpZW50MDEtRUNDLXNlY3AyNTZyMTBZMBMGByqGSM49AgEGCCqGSM49AwEH +A0IABBMUllpPFmbA3NwP0iXDSQKMz6DjdQZiHJxJ3mXajjHOOXTbu/OMEboPO4oF +W+n2SmXRbwNlabGRz+ai+2eEhgujcDBuMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXg +MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUhP24QFkiDNknYu2LtF0K +0qJXPJMwHwYDVR0jBBgwFoAUbOLKIqi+fmUWh2xqiOoHmpp5TCYwCgYIKoZIzj0E +AwIDSQAwRgIhAKrZA1csIcku9rXF4/ngCMXu9CUxYH4XYTphfAi0dqMoAiEAmoO4 +2I1j76xWakvEc3v+/ttvP1vJCUhwNqILc2rAATI= +-----END CERTIFICATE----- diff --git a/examples/model701_tls/pki/generate_ecc.sh b/examples/model701_tls/pki/generate_ecc.sh new file mode 100755 index 0000000..8459773 --- /dev/null +++ b/examples/model701_tls/pki/generate_ecc.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +openssl ecparam -genkey -name secp256r1 | openssl ec -out cav3.key +openssl req -new -subj "/CN=ECC-secp256r1" -x509 -days 3650 -extensions v3_ca -reqexts v3_req -config <(cat /etc/ssl/openssl.cnf <(printf "\n[v3_req]\nbasicConstraints=critical,CA:TRUE\nkeyUsage=nonRepudiation,digitalSignature,keyEncipherment\nsubjectAltName=DNS:localhost")) -key cav3.key -out cav3.pem +# Create Truststore adding a CA +keytool -keystore truststore.p12 -storepass password -alias CARoot -import -file cav3.pem + +openssl ecparam -genkey -name secp256r1 | openssl ec -out serverv3.key +openssl req -new -subj "/CN=server-ECC-secp256r1" -addext "subjectAltName = DNS:localhost" -key serverv3.key -out serverv3.csr +openssl x509 -req -days 3650 -extfile <(printf "\nbasicConstraints=CA:FALSE\nkeyUsage=nonRepudiation,digitalSignature,keyEncipherment\nsubjectAltName=DNS:localhost") -in serverv3.csr -CA cav3.pem -CAkey cav3.key -set_serial 01 -out serverv3.pem + +openssl ecparam -genkey -name secp256r1 | openssl ec -out clientv3.key +openssl req -new -subj "/CN=client01-ECC-secp256r1" -addext "subjectAltName = DNS:localhost" -key clientv3.key -out clientv3.csr +openssl x509 -req -days 3650 -extfile <(printf "\nbasicConstraints=CA:FALSE\nkeyUsage=nonRepudiation,digitalSignature,keyEncipherment\nsubjectAltName=DNS:localhost") -in clientv3.csr -CA cav3.pem -CAkey cav3.key -set_serial 02 -out clientv3.pem + diff --git a/examples/model701_tls/pki/generate_rsa.sh b/examples/model701_tls/pki/generate_rsa.sh new file mode 100755 index 0000000..4b86aa7 --- /dev/null +++ b/examples/model701_tls/pki/generate_rsa.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +openssl genrsa -out cav3.key 2048 +openssl req -new -subj "/CN=RSA-2048" -x509 -sha256 -days 3650 -extensions v3_req -config <(cat /etc/ssl/openssl.cnf <(printf "\n[v3_req]\nbasicConstraints=critical,CA:TRUE\nkeyUsage=nonRepudiation,digitalSignature,keyEncipherment\nsubjectAltName=DNS:localhost")) -key cav3.key -out cav3.pem + +openssl genrsa -out serverv3.key 2048 +openssl req -new -subj "/CN=server-RSA-2048" -key serverv3.key -out serverv3.csr +openssl x509 -req -in serverv3.csr -CA cav3.pem -CAkey cav3.key -CAcreateserial -out serverv3.pem -sha256 -days 3650 -extfile v3.ext + +openssl genrsa -out clientv3.key 2048 +openssl req -new -subj "/CN=client-RSA-2048" -key clientv3.key -out clientv3.csr +openssl x509 -req -in clientv3.csr -CA cav3.pem -CAkey cav3.key -CAcreateserial -out clientv3.pem -sha256 -days 3650 -extfile v3.ext diff --git a/examples/model701_tls/pki/server.key b/examples/model701_tls/pki/server.key new file mode 100644 index 0000000..89fb8d8 --- /dev/null +++ b/examples/model701_tls/pki/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDFbdDh807VZZho +hVdnmG8XWsPOBoU6IeR9okCvUgxg+4RVPPUorihYoaEutZaY+k8KjS7Yzu43FrzC +Cvy0VeiKOKGGFux61vOA9unlgAfqqNM6oXrIhL2Hncg/Myyr1qmPkenu+lD/uJas +pcOZXjY1et56XkaFaJC3C0SqAaKLfKDDJV1hhXUKlGASNpf+nvm1dEPLoowqjL3J +dXn0IA87CmbEjuk2S6Y7VDYpDvtw4GvUMjIs18gygTp4InZTGvaFSys0bY4eO2W5 ++R9qqb5qUD8zSrfdFhWFSkqNPDUxklSp0slpiYp4L0vMYCN62IB25o5UsZqR+tgD +Y/Q374zRAgMBAAECggEADUKLP/xpHrixxtCwhnsHeGhr3uozMoH/kwHobvNcyiVl +GvB61XOfrsGUTiB7b+TdQCvWqfsj/BE2i6B/SSwSmo35KJoLjKiOjD/ehRUsnZx0 +gMCYZYqndsn9yWOKLDRrs60s1WnR3OBXRls6dZI3+S7lGGTn6aKUmFFVGEdUf80N +2s6C2ySUtJpLo6+D5f3r5EPBjGWuyqJ+E/JHmyIBhM4rznErBralUmncXUcWqL4B +aX0RBM4Ik9haBE4IeCjztliX5QidiQhtbQD3BqPimaUUUZzcKnzAufvWAI/w/VeC +OrLUDX5hEZt21A6Bkv7PxNhl4OUcHKK1TKRB15s1fQKBgQDhKI41OT9UiP5OuS65 +S2QLHHBLARB0gVynq/grzGZncZFZeeB1OVyUdUl7vJmsM3AwzyZTNcQJHytA4h4f +tDyrZY5vvFCAC+bHwx5XMswA+XRRTS9c3rhEOPrCd11ktuOMOn3dpRyc5TFNHhcu +3fI6jC5dBtM2wmNxrRKQcPuWrwKBgQDgeOUIdgIWvnq865WcMakh2FVPOip1yKLB +Y7694CI6Q4KX4714R4OHqPiEik6AUTtzhbTubHq0rAdezdP7YEOOnFsbVpVzj76d +nBBYdUTJANK9/juWvgbvDW02mYwjIJByz8bU6UEZ2p0xDj+h9UKz5ckdIAUkrv5d +obMM+M/0fwKBgQC+9samHYe5CveljSozvd18DwKumph6N719+Dzj6Nhxo8DDQrs8 +sQn0YAWTDMLJalcdDpRSvqcllWn5/c3O1e8e72N/IRilgXKausJg8pRTvz8INY6W +Fc/zDOChTtvHL9aOeI2IDyHVcA4AeiTvew6W2Y35GHDLYNM29rNoDmtTwQKBgQCq +Lj3F2mHfCG5ZSGpWzrehdzfGJx0FyyTJZWu43HJWpdQef4Sn6d/oO8yd/5VgZzWh +cZ8om4mz7DBySa4LCIJvXk8cPNp1kGc9apJh3hZWJY+gh1x5/nuXRSClomfCQfAB +e1ENHgJDLaC7Dkhj62O0q+N7d0ku9JTYO71ZelF+1QKBgQDXxaco0oN5veqHAFZQ +Z+k1mIfdzD2Jsq2nZwoH3TnlWlXbDC3TFDWpJcnadTR3j0YBgTnf32/irpG5n9SY +8RODtfhlqAjIESu6kzV/DVAOgTX+3VnXtYGR7nH9MyqwVcxj1M9H+vv2PgtxzMrj +EpR3imXaH1RC9DssOD3SbqVGsg== +-----END PRIVATE KEY----- diff --git a/examples/model701_tls/pki/server.pem b/examples/model701_tls/pki/server.pem new file mode 100644 index 0000000..bb0b70f --- /dev/null +++ b/examples/model701_tls/pki/server.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDtDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQGEwJCUjEP +MA0GA1UECAwGUGFyYW5hMRQwEgYDVQQHDAtQYXRvIEJyYW5jbzEOMAwGA1UECgwF +VVRGUFIxCzAJBgNVBAsMAlBCMRowGAYDVQQDDBFVVEZQUi1QQi1SU0EtMjA0ODAe +Fw0yNTAzMjMyMDE0NTFaFw0zNTAzMjEyMDE0NTFaMHQxCzAJBgNVBAYTAkJSMQ8w +DQYDVQQIDAZQYXJhbmExFDASBgNVBAcMC1BhdG8gQnJhbmNvMQ4wDAYDVQQKDAVV +VEZQUjELMAkGA1UECwwCUEIxITAfBgNVBAMMGFVURlBSLVBCLXNlcnZlci1SU0Et +MjA0ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVt0OHzTtVlmGiF +V2eYbxdaw84GhToh5H2iQK9SDGD7hFU89SiuKFihoS61lpj6TwqNLtjO7jcWvMIK +/LRV6Io4oYYW7HrW84D26eWAB+qo0zqhesiEvYedyD8zLKvWqY+R6e76UP+4lqyl +w5leNjV63npeRoVokLcLRKoBoot8oMMlXWGFdQqUYBI2l/6e+bV0Q8uijCqMvcl1 +efQgDzsKZsSO6TZLpjtUNikO+3Dga9QyMizXyDKBOngidlMa9oVLKzRtjh47Zbn5 +H2qpvmpQPzNKt90WFYVKSo08NTGSVKnSyWmJingvS8xgI3rYgHbmjlSxmpH62ANj +9DfvjNECAwEAAaNYMFYwFAYDVR0RBA0wC4IJbG9jYWxob3N0MB0GA1UdDgQWBBQg +PMIP7x60gHB0jYf6cVzVabqtnTAfBgNVHSMEGDAWgBSMFp1vbFnvMZvf6DaHVToI +97lwlDANBgkqhkiG9w0BAQsFAAOCAQEApXxrQ5r2uSsCsO6uWBOXiLtE4wNVaDsO +hzuDaShvdi0cwTS57IdFEtkfsshtUM462/45S1MqWeRm22mqlkbKuXgNDc6sdkYQ +hBm8MH00qsZ1u6bSPnpPQjAf+Ku+3OjcQCZ0dD/zSSo7unNbltyK7+4m+u0krVts +fT26bPhC2D2SmkCLIy1uLZMQ4NmzTYl7d6ddOr2u2c6m+zFVf+27tc7P+ms8y5cg +ndGPvXdtvtfuAje4jrBKjWnDxNb+9yvh5GDNWqaN1GFqilYZkliRMxv3WpSEsTlu +gCRuKoiRpqUlSKUXsvCFTfATZX/STzcSoPXqITBMXy+w60YbZpsq9g== +-----END CERTIFICATE----- diff --git a/examples/model701_tls/pki/serverv3.csr b/examples/model701_tls/pki/serverv3.csr new file mode 100644 index 0000000..ef3761b --- /dev/null +++ b/examples/model701_tls/pki/serverv3.csr @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBAjCBqAIBADAfMR0wGwYDVQQDDBRzZXJ2ZXItRUNDLXNlY3AyNTZyMTBZMBMG +ByqGSM49AgEGCCqGSM49AwEHA0IABED8Lve2Kj/cdu3HnDilHgYVOM4ejQ1Kx1l0 +Y1wuVhlqBRKqpRCPEVWbWnB589ntol66VqaLaBuf4PNsRN0pCVegJzAlBgkqhkiG +9w0BCQ4xGDAWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAKBggqhkjOPQQDAgNJADBG +AiEApSRSjHPa+pcsnnVXPjwopUkxWrduJpvhzvVbC/+kMHQCIQD+nLA8ueRzrAmn +jAowKpTKf8oem4lIHsZ02JRY+HDkbg== +-----END CERTIFICATE REQUEST----- diff --git a/examples/model701_tls/pki/serverv3.key b/examples/model701_tls/pki/serverv3.key new file mode 100644 index 0000000..ab941e9 --- /dev/null +++ b/examples/model701_tls/pki/serverv3.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIHSlqP7Zsi7ee9iR1Tv7m3zvMJ2TqlVhK24cNeA3ZuGdoAoGCCqGSM49 +AwEHoUQDQgAEQPwu97YqP9x27cecOKUeBhU4zh6NDUrHWXRjXC5WGWoFEqqlEI8R +VZtacHnz2e2iXrpWpotoG5/g82xE3SkJVw== +-----END EC PRIVATE KEY----- diff --git a/examples/model701_tls/pki/serverv3.pem b/examples/model701_tls/pki/serverv3.pem new file mode 100644 index 0000000..556605f --- /dev/null +++ b/examples/model701_tls/pki/serverv3.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBljCCATygAwIBAgIBATAKBggqhkjOPQQDAjAYMRYwFAYDVQQDDA1FQ0Mtc2Vj +cDI1NnIxMB4XDTI1MDMyNDEwNTc1N1oXDTM1MDMyMjEwNTc1N1owHzEdMBsGA1UE +AwwUc2VydmVyLUVDQy1zZWNwMjU2cjEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC +AARA/C73tio/3Hbtx5w4pR4GFTjOHo0NSsdZdGNcLlYZagUSqqUQjxFVm1pwefPZ +7aJeulami2gbn+DzbETdKQlXo3AwbjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DAU +BgNVHREEDTALgglsb2NhbGhvc3QwHQYDVR0OBBYEFAq15Hg95sJLp9hq8peRKzMT +g853MB8GA1UdIwQYMBaAFGziyiKovn5lFodsaojqB5qaeUwmMAoGCCqGSM49BAMC +A0gAMEUCIQC6jITluRNRn4n/YELEfyqNU1RXp2jo+DAN4naDiBYYxgIgHMtNEH0D +rhcKz6SFoY0xQquSvJQaCUTk3ut7Xvor5t8= +-----END CERTIFICATE----- diff --git a/examples/model701_tls/pki/truststore.p12 b/examples/model701_tls/pki/truststore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..9ad1ba384a291c69ab7801d6be13b31445fc7a90 GIT binary patch literal 774 zcmXqLVrF7uWHxAGTEoVv)#lOmotKfFaX}N)T$U!LnLy#GKs*s4#RimW0t(eJF){$D za)b<{K^mOH%4-m5V1eNB7-+MIT==BdvHiuY+a6pgl2=4L!}lgfdNVPp3otP%81S%h zKrCnCWMwdrW#dd}^I%M6W?|G~5#Ze~wpmL4x4E3~h7-IC{I4}MF)=Wz6$HG$`tVEU z_cogoPTKuqOSZXGy-SK)@Nm+j7xO$qTGbeqSXA%$?hzEWE#7w{i{owY)rX%fvFv=c zT5;Cb`jxY#id%kN3qIc;t&pp1v)b`gD+`m^Gqe2l%3s%RS>>_Ecw?`GQIGUyAL(fY zSz3z~c`OY5SKNv!J-0 z+y5&-d6C71_-$)1ah|;P=W#~y;s2X^ZapfyRFcryo;QC&b!X)DXR}zpe2*0D>hhgc zA*oh8&4jt&+Khy))hr8^CP$VT?e;GHagM9{Q16bQ52u#DcF9XVX>}{>PveZxC530A z_k6tN;MTs3=U?l&(A)bnl$8DVg(~fdNsi?$R_S)>eim~tX~oRc6_s{cbDlqRzcf|h z#KRM(op;}Py}hpK<8S%h+Fzc}pM3q#chj8jAMgM5;g`N$Ya+eKNrv@9i-h;dSr%Qo z*WK#4t{w8*emG3Xz}LXgfES)jm>5|ZSQHdJ4#y`ZN;-Ko1iP?TPFtDDuB%+JXZ<6m ls&zu&o;dKZi1Zy~SE*PWUi)-S@zX}J?FV%4D=C7KAOKM3R^I>s literal 0 HcmV?d00001 diff --git a/examples/model701_tls/pki/v3.ext b/examples/model701_tls/pki/v3.ext new file mode 100644 index 0000000..4feabe4 --- /dev/null +++ b/examples/model701_tls/pki/v3.ext @@ -0,0 +1,5 @@ +authorityKeyIdentifier=keyid +basicConstraints=CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment +subjectAltName = DNS:localhost + diff --git a/examples/model701_tls/src/main.rs b/examples/model701_tls/src/main.rs new file mode 100644 index 0000000..f73bdaf --- /dev/null +++ b/examples/model701_tls/src/main.rs @@ -0,0 +1,178 @@ +use std::{ + error::Error, + fs::File, + io::{self, BufReader}, + net::SocketAddr, + path::Path, + sync::Arc, + time::Duration +}; + +use anyhow::Result; +use clap::Parser; +use itertools::Itertools; +use sunspec::models::model701::Model701; +use sunspec::DEFAULT_DISCOVERY_ADDRESSES; +use sunspec::{ + client::{AsyncClient, Config}, + models::model1::Model1, +}; +use tokio::time::sleep; +use tokio_modbus::client::{Context, tcp}; +use tokio::net::TcpStream; + +#[derive(Parser)] +struct Args { + addr: SocketAddr, + device_id: u8, + #[arg( + long, + short='d', + help = "Discovery addresses", + name = "ADDRESS", + default_values_t = DEFAULT_DISCOVERY_ADDRESSES + )] + discovery_addresses: Vec, + #[arg( + long, + short = 't', + help = "Read timeout in seconds", + name = "SECONDS", + default_value_t = 1.0 + )] + read_timeout: f32, +} + +use pkcs8::der::Decode; +use pki_types::{CertificateDer, PrivateKeyDer, ServerName}; +use rustls_pemfile::{certs, pkcs8_private_keys, ec_private_keys}; +use tokio_rustls::TlsConnector; + +fn load_certs(path: &Path) -> io::Result>> { + certs(&mut BufReader::new(File::open(path)?)).collect() +} + +fn load_keys(path: &Path, password: Option<&str>) -> io::Result> { + let expected_tag = match &password { + Some(_) => "ENCRYPTED PRIVATE KEY", + None => "PRIVATE KEY", + }; + + if expected_tag.eq("PRIVATE KEY") { + let content = std::fs::read(path)?; + if content.starts_with("-----BEGIN EC PRIVATE KEY".as_bytes()) { + ec_private_keys(&mut BufReader::new(File::open(path)?)) + .next() + .unwrap() + .map(Into::into) + }else{ + pkcs8_private_keys(&mut BufReader::new(File::open(path)?)) + .next() + .unwrap() + .map(Into::into) + } + } else { + let content = std::fs::read(path)?; + let mut iter = pem::parse_many(content) + .map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err.to_string()))? + .into_iter() + .filter(|x| x.tag() == expected_tag) + .map(|x| x.contents().to_vec()); + + match iter.next() { + Some(key) => match password { + Some(password) => { + let encrypted = + pkcs8::EncryptedPrivateKeyInfo::from_der(&key).map_err(|err| { + io::Error::new(io::ErrorKind::InvalidData, err.to_string()) + })?; + let decrypted = encrypted.decrypt(password).map_err(|err| { + io::Error::new(io::ErrorKind::InvalidData, err.to_string()) + })?; + let key = decrypted.as_bytes().to_vec(); + match rustls_pemfile::read_one_from_slice(&key).expect("cannot parse private key .pem file") { + Some((rustls_pemfile::Item::Pkcs1Key(key), _keys)) => io::Result::Ok(key.into()), + Some((rustls_pemfile::Item::Pkcs8Key(key), _keys)) => io::Result::Ok(key.into()), + Some((rustls_pemfile::Item::Sec1Key(key), _keys)) => io::Result::Ok(key.into()), + _ => io::Result::Err(io::Error::new(io::ErrorKind::InvalidInput, "invalid key")), + } + } + None => io::Result::Err(io::Error::new(io::ErrorKind::InvalidInput, "invalid key")), + }, + None => io::Result::Err(io::Error::new(io::ErrorKind::InvalidInput, "invalid key")), + } + } +} + +async fn connect_tls(socket_addr: SocketAddr) -> io::Result { + let mut root_cert_store = tokio_rustls::rustls::RootCertStore::empty(); + let ca_path = Path::new("./pki/cav3.pem"); + let mut pem = BufReader::new(File::open(ca_path)?); + let certs = rustls_pemfile::certs(&mut pem).collect::, _>>()?; + root_cert_store.add_parsable_certificates(certs); + + let domain = "localhost"; + let cert_path = Path::new("./pki/clientv3.pem"); + let key_path = Path::new("./pki/clientv3.key"); + let certs = load_certs(cert_path)?; + let key = load_keys(key_path, None)?; + + let config = tokio_rustls::rustls::ClientConfig::builder() + .with_root_certificates(root_cert_store) + .with_client_auth_cert(certs, key) + .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?; + let connector = TlsConnector::from(Arc::new(config)); + + let stream = TcpStream::connect(&socket_addr).await?; + stream.set_nodelay(true)?; + + let domain = ServerName::try_from(domain) + .map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "invalid dnsname"))?; + + let transport = connector.connect(domain, stream).await?; + + // Tokio modbus transport layer setup + let ctx = tcp::attach(transport); + Ok(ctx) +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + let args = Args::parse(); + + let client = AsyncClient::new( + connect_tls(args.addr).await?, + Config { + discovery_addresses: args.discovery_addresses, + read_timeout: (args.read_timeout != 0.0) + .then(|| Duration::from_secs_f32(args.read_timeout)), + ..Default::default() + }, + ); + + let device = client.device(args.device_id).await?; + let m1: Model1 = device.read_model().await?; + + println!("Manufacturer: {}", m1.mn); + println!("Model: {}", m1.md); + println!("Version: {}", m1.vr.as_deref().unwrap_or("(unspecified)")); + println!("Serial Number: {}", m1.sn); + + println!( + "Supported models: {}", + device + .models + .supported_model_ids() + .iter() + .map(|id| id.to_string()) + .join(", ") + ); + + loop { + let m701: Model701 = device.read_model().await?; + let w = m701.w.unwrap() as f32 * 10f32.powf(m701.w_sf.unwrap().into()); + let wh = m701.tot_wh_inj.unwrap() as f32 * 10f32.powf(m701.tot_wh_sf.unwrap().into()); + println!("{:12.3} kWh {:9.3} kW", wh / 1000.0, w / 1000.0,); + sleep(Duration::from_secs(1)).await; + } +} \ No newline at end of file From 4e95a0bee611d5a6e1db6000b7372b1a78857974 Mon Sep 17 00:00:00 2001 From: Gustavo Weber Denardin Date: Mon, 24 Mar 2025 09:30:22 -0300 Subject: [PATCH 3/5] Add the example --- examples/model701_tls/pki/ca.key | 28 ----------------------- examples/model701_tls/pki/ca.pem | 23 ------------------- examples/model701_tls/pki/cav3.key | 5 ---- examples/model701_tls/pki/cav3.pem | 11 --------- examples/model701_tls/pki/cav3.srl | 1 - examples/model701_tls/pki/clientv3.csr | 8 ------- examples/model701_tls/pki/clientv3.key | 5 ---- examples/model701_tls/pki/clientv3.pem | 11 --------- examples/model701_tls/pki/server.key | 28 ----------------------- examples/model701_tls/pki/server.pem | 22 ------------------ examples/model701_tls/pki/serverv3.csr | 8 ------- examples/model701_tls/pki/serverv3.key | 5 ---- examples/model701_tls/pki/serverv3.pem | 11 --------- examples/model701_tls/pki/truststore.p12 | Bin 774 -> 0 bytes 14 files changed, 166 deletions(-) delete mode 100644 examples/model701_tls/pki/ca.key delete mode 100644 examples/model701_tls/pki/ca.pem delete mode 100644 examples/model701_tls/pki/cav3.key delete mode 100644 examples/model701_tls/pki/cav3.pem delete mode 100644 examples/model701_tls/pki/cav3.srl delete mode 100644 examples/model701_tls/pki/clientv3.csr delete mode 100644 examples/model701_tls/pki/clientv3.key delete mode 100644 examples/model701_tls/pki/clientv3.pem delete mode 100644 examples/model701_tls/pki/server.key delete mode 100644 examples/model701_tls/pki/server.pem delete mode 100644 examples/model701_tls/pki/serverv3.csr delete mode 100644 examples/model701_tls/pki/serverv3.key delete mode 100644 examples/model701_tls/pki/serverv3.pem delete mode 100644 examples/model701_tls/pki/truststore.p12 diff --git a/examples/model701_tls/pki/ca.key b/examples/model701_tls/pki/ca.key deleted file mode 100644 index 133435f..0000000 --- a/examples/model701_tls/pki/ca.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCuPwscR0Twpih9 -Ht7STZLEnY5byvbvoqC1wa69CsgZzAfeduVdRKXnIGrm2c7Mm0AftKMQGu5IH8sP -cdBLBfCYtxQI7/2KRGk8cveKkJ9mJfohDKI6ifXY0iKK6EFhHA74qhsvRZbtpc5b -UiZX+w10cZmhLh40kxD2NQbskikpslseGnBh/jW+ozpd0NkQsHpvBm4CHaixim56 -5is8IzUFm8W88K6UAs9cQ4W5H87LPMihufTLKYWpJ7Dj0ug1D9xf+5mU7xZCJ3aF -Eou1WIti20xuZXACmM0SXvzKSPE2uLDQD8BfTS+os9v7p6G/NLyFmtU0pu0bpq6J -1k3GziE9AgMBAAECggEAAaeKbwr1Hgp0AAqYzd7FsLadfsR5s69T0Cmuly1OYGTx -0gduvsjZlLlrf1p8nnUcTPM6oZiOBQfVey0FqvAUJ3q/sJrN04Y6EqbTHFhbu7bo -rL5aFMDADeDJ1AWWm3xTS0v9klGuGq/wnQFw3xH8mJpo6eiG7FsaM2V+zl+ymOWg -Hbhy6xJBITGbxXygWEbZV4XoC956FzHPdDZg+M6EOEyTYQPr3E0OGONnv3rYYkAg -606jL0IpdElP8o9/nAE+5/fqLhGZMSwlGRszoMVwf5u2Dilmp8fYEI/y9s7H+chn -5qVQ+cSh2jAV9GMiyqzUybO7/DbLO78u/pnk/5n/sQKBgQDk0pG9Cqz6AwREWTTg -O5GJ1PSOtoxOO1sHcpea1MYK1gJwQQ0nxwQy5HUCD4lFo9cZdYr5P6eijpWnewCs -lh9mpraSUvWKg3n20zU1m8dPoT/DegSahi7Cceyj+aW7NW01M0+39RfTWnh6iigR -Zsr4JHdhJ9PgmafaF7KJlMuFlQKBgQDC8RAmxvjr9XuIJsgPkAFloj46Je5goBfw -bgnRBxHub2LoocGXAch5pirA8dQ8+W0lbabMLqBWhaVKw2HuOrJwUa/eC66w2Vvq -PQPhMew7Ls+GeahJYL116dgDuV8unvzo0S1d/5CL3UgHIwrX3SYnp6sO7kw+LNq/ -xlDugfLzCQKBgGWV0hux7J9FzZQmYmIWMAOX5kahZmKo2T3SMtoLEiznW8fIKXX6 -VbPeVs/mY9Pl6+2ikGMdTmfNk0T6R49XSnOBGdaWO+oVeoUIuTumf/KrLKq0teyA -G6w5dYxKnbgh/Oy8bezGQ6CSLqCAS0+Gah+F2PXp/5dbv/gDw0BvLXeNAoGAef3J -EbsqQt8YMxex0qtXdHaXYmQiTK1izb7OvdQi0Ic76kBvmUQwZJAr6RpsqsucFfQM -kXIMPJjd229xdVeeGtPDrry40Ur0Th1otCA9qLueepTfTywO5B82Yv46Jj6wHjHo -pg4sMpqDXJP9USC/o8k1Lt7JL496RNCiDN+dXaECgYEAswFI9GkWCozJpOrGIeim -bGXjdvcnnp804l4F3z5MrcyHDnwexfyi2S6KmI6WA2IWVolafnj0W21LU/vGGKFe -/VPN0RJuukYlC3jZPZfjjPsGCsVFfR1WGiszZvnaFoLB9buHdPCWPEpM+SiDFL7l -x3Q2gEGN0CuT3iaYqxq/zTY= ------END PRIVATE KEY----- diff --git a/examples/model701_tls/pki/ca.pem b/examples/model701_tls/pki/ca.pem deleted file mode 100644 index e9cc4a3..0000000 --- a/examples/model701_tls/pki/ca.pem +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDvTCCAqWgAwIBAgIUdNBpVFizoYs/JlsnF1CLdC95yZkwDQYJKoZIhvcNAQEL -BQAwbTELMAkGA1UEBhMCQlIxDzANBgNVBAgMBlBhcmFuYTEUMBIGA1UEBwwLUGF0 -byBCcmFuY28xDjAMBgNVBAoMBVVURlBSMQswCQYDVQQLDAJQQjEaMBgGA1UEAwwR -VVRGUFItUEItUlNBLTIwNDgwHhcNMjUwMzIzMjAxNDQ3WhcNMzUwMzIxMjAxNDQ3 -WjBtMQswCQYDVQQGEwJCUjEPMA0GA1UECAwGUGFyYW5hMRQwEgYDVQQHDAtQYXRv -IEJyYW5jbzEOMAwGA1UECgwFVVRGUFIxCzAJBgNVBAsMAlBCMRowGAYDVQQDDBFV -VEZQUi1QQi1SU0EtMjA0ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AK4/CxxHRPCmKH0e3tJNksSdjlvK9u+ioLXBrr0KyBnMB9525V1EpecgaubZzsyb -QB+0oxAa7kgfyw9x0EsF8Ji3FAjv/YpEaTxy94qQn2Yl+iEMojqJ9djSIoroQWEc -DviqGy9Flu2lzltSJlf7DXRxmaEuHjSTEPY1BuySKSmyWx4acGH+Nb6jOl3Q2RCw -em8GbgIdqLGKbnrmKzwjNQWbxbzwrpQCz1xDhbkfzss8yKG59MsphaknsOPS6DUP -3F/7mZTvFkIndoUSi7VYi2LbTG5lcAKYzRJe/MpI8Ta4sNAPwF9NL6iz2/unob80 -vIWa1TSm7RumronWTcbOIT0CAwEAAaNVMFMwDwYDVR0TAQH/BAUwAwEB/zALBgNV -HQ8EBAMCBeAwFAYDVR0RBA0wC4IJbG9jYWxob3N0MB0GA1UdDgQWBBSMFp1vbFnv -MZvf6DaHVToI97lwlDANBgkqhkiG9w0BAQsFAAOCAQEAYdem2FihtJchaync9wi7 -ZmYvtvXIBI+73cHyCHyHyg8a1ay0w8P/ivZY2yDn93V97ORKM+ZVSUOk3Ce97QWc -ql6Uz0ej1eAzl815J2FBFHdNmHC7nZKpNTQGVWQ3Rg/j/zUJJOdkwK2sZVEjZpo+ -3KM4R4PFQ89X5Wcp6MBvZaxeepltatND4ygX0IceUDX+SBKw2qJ8Qo3gXSDkOYkn -gV7Siw3KMb4pqpSQhgkKt0TgH7ckzQ598QvC2fcekyiYqKPwJpA/nN0Xp2grTgfe -zcTxlCi2XYgRzqTvDnqceQoktN5/y9h9abQx1AfkcQQT+FaXQnpeYcSdA7ImdsLM -DQ== ------END CERTIFICATE----- diff --git a/examples/model701_tls/pki/cav3.key b/examples/model701_tls/pki/cav3.key deleted file mode 100644 index eabc1f2..0000000 --- a/examples/model701_tls/pki/cav3.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEIAqPjejxXVSeUrLl9Zg+Lw4UuM8nID8QcDgD9/YWKuYqoAoGCCqGSM49 -AwEHoUQDQgAEYUXHFh6vaB6BAzKyMnGX9Qa9JYLKE+zziTmrqU1L/93N2O3sFamk -3mLTsY9L18JVhd33EcMQC+/JqpVctnR/Zg== ------END EC PRIVATE KEY----- diff --git a/examples/model701_tls/pki/cav3.pem b/examples/model701_tls/pki/cav3.pem deleted file mode 100644 index 53c4a54..0000000 --- a/examples/model701_tls/pki/cav3.pem +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBhDCCASugAwIBAgIUOOrKU6/sEaTg0muRA2QvoKQUWjAwCgYIKoZIzj0EAwIw -GDEWMBQGA1UEAwwNRUNDLXNlY3AyNTZyMTAeFw0yNTAzMjQxMDU3NTVaFw0zNTAz -MjIxMDU3NTVaMBgxFjAUBgNVBAMMDUVDQy1zZWNwMjU2cjEwWTATBgcqhkjOPQIB -BggqhkjOPQMBBwNCAARhRccWHq9oHoEDMrIycZf1Br0lgsoT7POJOaupTUv/3c3Y -7ewVqaTeYtOxj0vXwlWF3fcRwxAL78mqlVy2dH9mo1MwUTAdBgNVHQ4EFgQUbOLK -Iqi+fmUWh2xqiOoHmpp5TCYwHwYDVR0jBBgwFoAUbOLKIqi+fmUWh2xqiOoHmpp5 -TCYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiAq8+vMmZ+/Q4zl -vNxWNsq2AYOQNS7Dcw7w35jHbzVU1gIgd2gZrycYHAeteHVtRain5yTSKiO8ysHX -PuWgwaNkGQM= ------END CERTIFICATE----- diff --git a/examples/model701_tls/pki/cav3.srl b/examples/model701_tls/pki/cav3.srl deleted file mode 100644 index 9d25175..0000000 --- a/examples/model701_tls/pki/cav3.srl +++ /dev/null @@ -1 +0,0 @@ -268F237553414289CC720A4D6EAF1263C431D11C diff --git a/examples/model701_tls/pki/clientv3.csr b/examples/model701_tls/pki/clientv3.csr deleted file mode 100644 index 51e97f4..0000000 --- a/examples/model701_tls/pki/clientv3.csr +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBAzCBqgIBADAhMR8wHQYDVQQDDBZjbGllbnQwMS1FQ0Mtc2VjcDI1NnIxMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEExSWWk8WZsDc3A/SJcNJAozPoON1BmIc -nEneZdqOMc45dNu784wRug87igVb6fZKZdFvA2VpsZHP5qL7Z4SGC6AnMCUGCSqG -SIb3DQEJDjEYMBYwFAYDVR0RBA0wC4IJbG9jYWxob3N0MAoGCCqGSM49BAMCA0gA -MEUCIFUscZ0SEklTqySFwoSlpfFYvmQSr1ZNsLO/SwTICesPAiEA8zIh8PFvirac -WdCE7N64Q7F42V1Yc7mVsha2rvVUmCI= ------END CERTIFICATE REQUEST----- diff --git a/examples/model701_tls/pki/clientv3.key b/examples/model701_tls/pki/clientv3.key deleted file mode 100644 index 1f70ce4..0000000 --- a/examples/model701_tls/pki/clientv3.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEIOs552SiUEzl69+8dpkQbv91uLTyuDxRJs2NQHbn40DFoAoGCCqGSM49 -AwEHoUQDQgAEExSWWk8WZsDc3A/SJcNJAozPoON1BmIcnEneZdqOMc45dNu784wR -ug87igVb6fZKZdFvA2VpsZHP5qL7Z4SGCw== ------END EC PRIVATE KEY----- diff --git a/examples/model701_tls/pki/clientv3.pem b/examples/model701_tls/pki/clientv3.pem deleted file mode 100644 index 42093d0..0000000 --- a/examples/model701_tls/pki/clientv3.pem +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBmTCCAT6gAwIBAgIBAjAKBggqhkjOPQQDAjAYMRYwFAYDVQQDDA1FQ0Mtc2Vj -cDI1NnIxMB4XDTI1MDMyNDEwNTc1N1oXDTM1MDMyMjEwNTc1N1owITEfMB0GA1UE -AwwWY2xpZW50MDEtRUNDLXNlY3AyNTZyMTBZMBMGByqGSM49AgEGCCqGSM49AwEH -A0IABBMUllpPFmbA3NwP0iXDSQKMz6DjdQZiHJxJ3mXajjHOOXTbu/OMEboPO4oF -W+n2SmXRbwNlabGRz+ai+2eEhgujcDBuMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXg -MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUhP24QFkiDNknYu2LtF0K -0qJXPJMwHwYDVR0jBBgwFoAUbOLKIqi+fmUWh2xqiOoHmpp5TCYwCgYIKoZIzj0E -AwIDSQAwRgIhAKrZA1csIcku9rXF4/ngCMXu9CUxYH4XYTphfAi0dqMoAiEAmoO4 -2I1j76xWakvEc3v+/ttvP1vJCUhwNqILc2rAATI= ------END CERTIFICATE----- diff --git a/examples/model701_tls/pki/server.key b/examples/model701_tls/pki/server.key deleted file mode 100644 index 89fb8d8..0000000 --- a/examples/model701_tls/pki/server.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDFbdDh807VZZho -hVdnmG8XWsPOBoU6IeR9okCvUgxg+4RVPPUorihYoaEutZaY+k8KjS7Yzu43FrzC -Cvy0VeiKOKGGFux61vOA9unlgAfqqNM6oXrIhL2Hncg/Myyr1qmPkenu+lD/uJas -pcOZXjY1et56XkaFaJC3C0SqAaKLfKDDJV1hhXUKlGASNpf+nvm1dEPLoowqjL3J -dXn0IA87CmbEjuk2S6Y7VDYpDvtw4GvUMjIs18gygTp4InZTGvaFSys0bY4eO2W5 -+R9qqb5qUD8zSrfdFhWFSkqNPDUxklSp0slpiYp4L0vMYCN62IB25o5UsZqR+tgD -Y/Q374zRAgMBAAECggEADUKLP/xpHrixxtCwhnsHeGhr3uozMoH/kwHobvNcyiVl -GvB61XOfrsGUTiB7b+TdQCvWqfsj/BE2i6B/SSwSmo35KJoLjKiOjD/ehRUsnZx0 -gMCYZYqndsn9yWOKLDRrs60s1WnR3OBXRls6dZI3+S7lGGTn6aKUmFFVGEdUf80N -2s6C2ySUtJpLo6+D5f3r5EPBjGWuyqJ+E/JHmyIBhM4rznErBralUmncXUcWqL4B -aX0RBM4Ik9haBE4IeCjztliX5QidiQhtbQD3BqPimaUUUZzcKnzAufvWAI/w/VeC -OrLUDX5hEZt21A6Bkv7PxNhl4OUcHKK1TKRB15s1fQKBgQDhKI41OT9UiP5OuS65 -S2QLHHBLARB0gVynq/grzGZncZFZeeB1OVyUdUl7vJmsM3AwzyZTNcQJHytA4h4f -tDyrZY5vvFCAC+bHwx5XMswA+XRRTS9c3rhEOPrCd11ktuOMOn3dpRyc5TFNHhcu -3fI6jC5dBtM2wmNxrRKQcPuWrwKBgQDgeOUIdgIWvnq865WcMakh2FVPOip1yKLB -Y7694CI6Q4KX4714R4OHqPiEik6AUTtzhbTubHq0rAdezdP7YEOOnFsbVpVzj76d -nBBYdUTJANK9/juWvgbvDW02mYwjIJByz8bU6UEZ2p0xDj+h9UKz5ckdIAUkrv5d -obMM+M/0fwKBgQC+9samHYe5CveljSozvd18DwKumph6N719+Dzj6Nhxo8DDQrs8 -sQn0YAWTDMLJalcdDpRSvqcllWn5/c3O1e8e72N/IRilgXKausJg8pRTvz8INY6W -Fc/zDOChTtvHL9aOeI2IDyHVcA4AeiTvew6W2Y35GHDLYNM29rNoDmtTwQKBgQCq -Lj3F2mHfCG5ZSGpWzrehdzfGJx0FyyTJZWu43HJWpdQef4Sn6d/oO8yd/5VgZzWh -cZ8om4mz7DBySa4LCIJvXk8cPNp1kGc9apJh3hZWJY+gh1x5/nuXRSClomfCQfAB -e1ENHgJDLaC7Dkhj62O0q+N7d0ku9JTYO71ZelF+1QKBgQDXxaco0oN5veqHAFZQ -Z+k1mIfdzD2Jsq2nZwoH3TnlWlXbDC3TFDWpJcnadTR3j0YBgTnf32/irpG5n9SY -8RODtfhlqAjIESu6kzV/DVAOgTX+3VnXtYGR7nH9MyqwVcxj1M9H+vv2PgtxzMrj -EpR3imXaH1RC9DssOD3SbqVGsg== ------END PRIVATE KEY----- diff --git a/examples/model701_tls/pki/server.pem b/examples/model701_tls/pki/server.pem deleted file mode 100644 index bb0b70f..0000000 --- a/examples/model701_tls/pki/server.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDtDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQGEwJCUjEP -MA0GA1UECAwGUGFyYW5hMRQwEgYDVQQHDAtQYXRvIEJyYW5jbzEOMAwGA1UECgwF -VVRGUFIxCzAJBgNVBAsMAlBCMRowGAYDVQQDDBFVVEZQUi1QQi1SU0EtMjA0ODAe -Fw0yNTAzMjMyMDE0NTFaFw0zNTAzMjEyMDE0NTFaMHQxCzAJBgNVBAYTAkJSMQ8w -DQYDVQQIDAZQYXJhbmExFDASBgNVBAcMC1BhdG8gQnJhbmNvMQ4wDAYDVQQKDAVV -VEZQUjELMAkGA1UECwwCUEIxITAfBgNVBAMMGFVURlBSLVBCLXNlcnZlci1SU0Et -MjA0ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVt0OHzTtVlmGiF -V2eYbxdaw84GhToh5H2iQK9SDGD7hFU89SiuKFihoS61lpj6TwqNLtjO7jcWvMIK -/LRV6Io4oYYW7HrW84D26eWAB+qo0zqhesiEvYedyD8zLKvWqY+R6e76UP+4lqyl -w5leNjV63npeRoVokLcLRKoBoot8oMMlXWGFdQqUYBI2l/6e+bV0Q8uijCqMvcl1 -efQgDzsKZsSO6TZLpjtUNikO+3Dga9QyMizXyDKBOngidlMa9oVLKzRtjh47Zbn5 -H2qpvmpQPzNKt90WFYVKSo08NTGSVKnSyWmJingvS8xgI3rYgHbmjlSxmpH62ANj -9DfvjNECAwEAAaNYMFYwFAYDVR0RBA0wC4IJbG9jYWxob3N0MB0GA1UdDgQWBBQg -PMIP7x60gHB0jYf6cVzVabqtnTAfBgNVHSMEGDAWgBSMFp1vbFnvMZvf6DaHVToI -97lwlDANBgkqhkiG9w0BAQsFAAOCAQEApXxrQ5r2uSsCsO6uWBOXiLtE4wNVaDsO -hzuDaShvdi0cwTS57IdFEtkfsshtUM462/45S1MqWeRm22mqlkbKuXgNDc6sdkYQ -hBm8MH00qsZ1u6bSPnpPQjAf+Ku+3OjcQCZ0dD/zSSo7unNbltyK7+4m+u0krVts -fT26bPhC2D2SmkCLIy1uLZMQ4NmzTYl7d6ddOr2u2c6m+zFVf+27tc7P+ms8y5cg -ndGPvXdtvtfuAje4jrBKjWnDxNb+9yvh5GDNWqaN1GFqilYZkliRMxv3WpSEsTlu -gCRuKoiRpqUlSKUXsvCFTfATZX/STzcSoPXqITBMXy+w60YbZpsq9g== ------END CERTIFICATE----- diff --git a/examples/model701_tls/pki/serverv3.csr b/examples/model701_tls/pki/serverv3.csr deleted file mode 100644 index ef3761b..0000000 --- a/examples/model701_tls/pki/serverv3.csr +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBAjCBqAIBADAfMR0wGwYDVQQDDBRzZXJ2ZXItRUNDLXNlY3AyNTZyMTBZMBMG -ByqGSM49AgEGCCqGSM49AwEHA0IABED8Lve2Kj/cdu3HnDilHgYVOM4ejQ1Kx1l0 -Y1wuVhlqBRKqpRCPEVWbWnB589ntol66VqaLaBuf4PNsRN0pCVegJzAlBgkqhkiG -9w0BCQ4xGDAWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAKBggqhkjOPQQDAgNJADBG -AiEApSRSjHPa+pcsnnVXPjwopUkxWrduJpvhzvVbC/+kMHQCIQD+nLA8ueRzrAmn -jAowKpTKf8oem4lIHsZ02JRY+HDkbg== ------END CERTIFICATE REQUEST----- diff --git a/examples/model701_tls/pki/serverv3.key b/examples/model701_tls/pki/serverv3.key deleted file mode 100644 index ab941e9..0000000 --- a/examples/model701_tls/pki/serverv3.key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEIHSlqP7Zsi7ee9iR1Tv7m3zvMJ2TqlVhK24cNeA3ZuGdoAoGCCqGSM49 -AwEHoUQDQgAEQPwu97YqP9x27cecOKUeBhU4zh6NDUrHWXRjXC5WGWoFEqqlEI8R -VZtacHnz2e2iXrpWpotoG5/g82xE3SkJVw== ------END EC PRIVATE KEY----- diff --git a/examples/model701_tls/pki/serverv3.pem b/examples/model701_tls/pki/serverv3.pem deleted file mode 100644 index 556605f..0000000 --- a/examples/model701_tls/pki/serverv3.pem +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBljCCATygAwIBAgIBATAKBggqhkjOPQQDAjAYMRYwFAYDVQQDDA1FQ0Mtc2Vj -cDI1NnIxMB4XDTI1MDMyNDEwNTc1N1oXDTM1MDMyMjEwNTc1N1owHzEdMBsGA1UE -AwwUc2VydmVyLUVDQy1zZWNwMjU2cjEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC -AARA/C73tio/3Hbtx5w4pR4GFTjOHo0NSsdZdGNcLlYZagUSqqUQjxFVm1pwefPZ -7aJeulami2gbn+DzbETdKQlXo3AwbjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DAU -BgNVHREEDTALgglsb2NhbGhvc3QwHQYDVR0OBBYEFAq15Hg95sJLp9hq8peRKzMT -g853MB8GA1UdIwQYMBaAFGziyiKovn5lFodsaojqB5qaeUwmMAoGCCqGSM49BAMC -A0gAMEUCIQC6jITluRNRn4n/YELEfyqNU1RXp2jo+DAN4naDiBYYxgIgHMtNEH0D -rhcKz6SFoY0xQquSvJQaCUTk3ut7Xvor5t8= ------END CERTIFICATE----- diff --git a/examples/model701_tls/pki/truststore.p12 b/examples/model701_tls/pki/truststore.p12 deleted file mode 100644 index 9ad1ba384a291c69ab7801d6be13b31445fc7a90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmXqLVrF7uWHxAGTEoVv)#lOmotKfFaX}N)T$U!LnLy#GKs*s4#RimW0t(eJF){$D za)b<{K^mOH%4-m5V1eNB7-+MIT==BdvHiuY+a6pgl2=4L!}lgfdNVPp3otP%81S%h zKrCnCWMwdrW#dd}^I%M6W?|G~5#Ze~wpmL4x4E3~h7-IC{I4}MF)=Wz6$HG$`tVEU z_cogoPTKuqOSZXGy-SK)@Nm+j7xO$qTGbeqSXA%$?hzEWE#7w{i{owY)rX%fvFv=c zT5;Cb`jxY#id%kN3qIc;t&pp1v)b`gD+`m^Gqe2l%3s%RS>>_Ecw?`GQIGUyAL(fY zSz3z~c`OY5SKNv!J-0 z+y5&-d6C71_-$)1ah|;P=W#~y;s2X^ZapfyRFcryo;QC&b!X)DXR}zpe2*0D>hhgc zA*oh8&4jt&+Khy))hr8^CP$VT?e;GHagM9{Q16bQ52u#DcF9XVX>}{>PveZxC530A z_k6tN;MTs3=U?l&(A)bnl$8DVg(~fdNsi?$R_S)>eim~tX~oRc6_s{cbDlqRzcf|h z#KRM(op;}Py}hpK<8S%h+Fzc}pM3q#chj8jAMgM5;g`N$Ya+eKNrv@9i-h;dSr%Qo z*WK#4t{w8*emG3Xz}LXgfES)jm>5|ZSQHdJ4#y`ZN;-Ko1iP?TPFtDDuB%+JXZ<6m ls&zu&o;dKZi1Zy~SE*PWUi)-S@zX}J?FV%4D=C7KAOKM3R^I>s From 98aede980db279b92702cf44b557de408e4f0a98 Mon Sep 17 00:00:00 2001 From: Gustavo Weber Denardin Date: Tue, 25 Mar 2025 16:30:58 -0300 Subject: [PATCH 4/5] minor fix in the launcher session --- examples/model701_tls/.vscode/launch.json | 24 +++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/examples/model701_tls/.vscode/launch.json b/examples/model701_tls/.vscode/launch.json index 925a4cb..90036d9 100644 --- a/examples/model701_tls/.vscode/launch.json +++ b/examples/model701_tls/.vscode/launch.json @@ -7,38 +7,42 @@ { "type": "lldb", "request": "launch", - "name": "Debug executable 'sunspec-lib-test'", + "name": "Debug executable 'model701_tls'", "cargo": { "args": [ "build", - "--bin=sunspec-lib-test", - "--package=sunspec-lib-test" + "--bin=model701_tls", + "--package=model701_tls" ], "filter": { - "name": "sunspec-lib-test", + "name": "model701_tls", "kind": "bin" } }, - "args": [], + "args": [ + "127.0.0.1:8802", + "1" + ], "cwd": "${workspaceFolder}" }, { "type": "lldb", "request": "launch", - "name": "Debug unit tests in executable 'sunspec-lib-test'", + "name": "Debug unit tests in executable 'model701_tls'", "cargo": { "args": [ "test", "--no-run", - "--bin=sunspec-lib-test", - "--package=sunspec-lib-test" + "--bin=model701_tls", + "--package=model701_tls" ], "filter": { - "name": "sunspec-lib-test", + "name": "model701_tls", "kind": "bin" } }, - "args": [], + "args": [ + ], "cwd": "${workspaceFolder}" } ] From a3a7d1e87a3357f848f70da6592403b6fa1a2bb2 Mon Sep 17 00:00:00 2001 From: Gustavo Weber Denardin Date: Thu, 27 Mar 2025 09:16:47 -0300 Subject: [PATCH 5/5] define a specific cipher suite. Enable TLS session resumption. --- examples/model701_tls/src/main.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/examples/model701_tls/src/main.rs b/examples/model701_tls/src/main.rs index f73bdaf..20ee8ed 100644 --- a/examples/model701_tls/src/main.rs +++ b/examples/model701_tls/src/main.rs @@ -20,6 +20,7 @@ use sunspec::{ use tokio::time::sleep; use tokio_modbus::client::{Context, tcp}; use tokio::net::TcpStream; +use rustls::crypto::{CryptoProvider, aws_lc_rs as provider}; #[derive(Parser)] struct Args { @@ -117,10 +118,24 @@ async fn connect_tls(socket_addr: SocketAddr) -> io::Result { let certs = load_certs(cert_path)?; let key = load_keys(key_path, None)?; - let config = tokio_rustls::rustls::ClientConfig::builder() - .with_root_certificates(root_cert_store) - .with_client_auth_cert(certs, key) - .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?; + let mut config = tokio_rustls::rustls::ClientConfig::builder_with_provider( + CryptoProvider { + cipher_suites: + vec![provider::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256], + kx_groups: vec![provider::kx_group::SECP256R1], + ..provider::default_provider() + } + .into() + ) + .with_protocol_versions(&[&rustls::version::TLS12]) + .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))? + .with_root_certificates(root_cert_store) + .with_client_auth_cert(certs, key) + .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?; + + config.resumption = config.resumption + .tls12_resumption(rustls::client::Tls12Resumption::SessionIdOnly); + let connector = TlsConnector::from(Arc::new(config)); let stream = TcpStream::connect(&socket_addr).await?;