commit 6c71b131263955ca3fa3b497cf96cfd8cf00f0ec Author: Lukas Bachschwell Date: Mon Jul 8 09:29:59 2019 +0200 Initial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dfb8d5b --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.pio +.pioenvs +.piolibdeps +.vscode +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json diff --git a/Ideas b/Ideas new file mode 100644 index 0000000..ee2d92c --- /dev/null +++ b/Ideas @@ -0,0 +1,27 @@ +Ideas: + +Use it on raspberrypi with the cli + +Build a tool to quickly provision chips... + +run the toolkit on the nanopi neo + +push a button to trigger a banner on a nodejs server thingy + +Change chip to proove that the certificate is the LBS Ca one and not the Infineon CA one =D + + +Steps: + +script that provisions chips with certs +-> Provision 2 chips with different certificates! (Maybe get another one tomorrow? or make this a live demo of the personalisation!) + +NodeMCU uses chip cert to make json object with data and signature to send its status + +Nodejs server that verifies messages and signature with openssl via tcp +-> Shows Cert Authority and state with a corner icon of eiter Yes or No + + + + + diff --git a/asn.bin b/asn.bin new file mode 100644 index 0000000..3453c89 Binary files /dev/null and b/asn.bin differ diff --git a/asnfinal.bin b/asnfinal.bin new file mode 100644 index 0000000..dc3f8d7 Binary files /dev/null and b/asnfinal.bin differ diff --git a/convertCert.js b/convertCert.js new file mode 100644 index 0000000..f551dc8 --- /dev/null +++ b/convertCert.js @@ -0,0 +1,127 @@ +var fs = require('fs'); +//0x30,0x82,0x01,0xbc,0x30,0x82,0x01,0x62,0xa0, +// MyChip +let certdata = [ + 0x30,0x82,0x01,0xbc,0x30,0x82,0x01,0x62,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x47, +0x33,0xda,0x95,0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,0x02,0x30, +0x72,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x21, +0x30,0x1f,0x06,0x03,0x55,0x04,0x0a,0x0c,0x18,0x49,0x6e,0x66,0x69,0x6e,0x65,0x6f, +0x6e,0x20,0x54,0x65,0x63,0x68,0x6e,0x6f,0x6c,0x6f,0x67,0x69,0x65,0x73,0x20,0x41, +0x47,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0b,0x0c,0x0a,0x4f,0x50,0x54,0x49, +0x47,0x41,0x28,0x54,0x4d,0x29,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04,0x03,0x0c, +0x22,0x49,0x6e,0x66,0x69,0x6e,0x65,0x6f,0x6e,0x20,0x4f,0x50,0x54,0x49,0x47,0x41, +0x28,0x54,0x4d,0x29,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x58,0x20,0x43,0x41,0x20, +0x31,0x30,0x31,0x30,0x1e,0x17,0x0d,0x31,0x37,0x30,0x38,0x33,0x31,0x31,0x32,0x30, +0x39,0x33,0x31,0x5a,0x17,0x0d,0x33,0x37,0x30,0x38,0x33,0x31,0x31,0x32,0x30,0x39, +0x33,0x31,0x5a,0x30,0x00,0x30,0x59,0x30,0x13,0x06,0x07,0x2a,0x86,0x48,0xce,0x3d, +0x02,0x01,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x03,0x01,0x07,0x03,0x42,0x00,0x04, +0x07,0x02,0x94,0xd7,0xd6,0xd9,0xec,0xb2,0xff,0x68,0x53,0xe8,0xc4,0xdd,0xfd,0x96, +0x53,0x20,0x93,0x8f,0x73,0x33,0xdd,0xac,0x8c,0x2e,0x0e,0x4d,0x79,0x5c,0xa4,0x03, +0x4b,0x9b,0x24,0xf6,0xec,0x63,0xcd,0x2a,0xe7,0xa0,0x14,0xd3,0x4b,0xbc,0x32,0x22, +0x05,0xb9,0x4e,0x90,0x9f,0x8a,0x21,0x62,0xf2,0xce,0x15,0xcf,0xdf,0xa1,0x20,0x12, +0xa3,0x58,0x30,0x56,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04, +0x03,0x02,0x00,0x80,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02, +0x30,0x00,0x30,0x15,0x06,0x03,0x55,0x1d,0x20,0x04,0x0e,0x30,0x0c,0x30,0x0a,0x06, +0x08,0x2a,0x82,0x14,0x00,0x44,0x01,0x14,0x01,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23, +0x04,0x18,0x30,0x16,0x80,0x14,0xca,0x05,0x33,0xd7,0x4f,0xc4,0x7f,0x09,0x49,0xfb, +0xdb,0x12,0x25,0xdf,0xd7,0x97,0x9d,0x41,0x1e,0x15,0x30,0x0a,0x06,0x08,0x2a,0x86, +0x48,0xce,0x3d,0x04,0x03,0x02,0x03,0x48,0x00,0x30,0x45,0x02,0x20,0x27,0xd0,0xf5, +0x36,0xa3,0xc2,0xc9,0xc5,0xb7,0x48,0xa7,0x4f,0x3c,0x23,0x7b,0x9d,0xad,0x1d,0x9e, +0xc7,0x7f,0xe0,0xbb,0xe3,0x43,0x03,0x1a,0x3f,0x33,0x6d,0x73,0xa7,0x02,0x21,0x00, +0x92,0x86,0x58,0x10,0x18,0xe1,0xdb,0x8c,0xb6,0x52,0xf4,0xc7,0xca,0x82,0xce,0xa5, +0x0e,0x28,0xb5,0x71,0x9d,0x71,0x15,0x85,0xdd,0x56,0x85,0x00,0xd4,0xc1,0xda,0xd9]; + +// Rezas chip + +certdata = [0x30,0x82,0x01,0xbc,0x30,0x82,0x01,0x62,0xa0,0x03,0x02,0x01,0x02,0x02,0x04,0x3b, +0x71,0xec,0xb2,0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,0x02,0x30, +0x72,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x21, +0x30,0x1f,0x06,0x03,0x55,0x04,0x0a,0x0c,0x18,0x49,0x6e,0x66,0x69,0x6e,0x65,0x6f, +0x6e,0x20,0x54,0x65,0x63,0x68,0x6e,0x6f,0x6c,0x6f,0x67,0x69,0x65,0x73,0x20,0x41, +0x47,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0b,0x0c,0x0a,0x4f,0x50,0x54,0x49, +0x47,0x41,0x28,0x54,0x4d,0x29,0x31,0x2b,0x30,0x29,0x06,0x03,0x55,0x04,0x03,0x0c, +0x22,0x49,0x6e,0x66,0x69,0x6e,0x65,0x6f,0x6e,0x20,0x4f,0x50,0x54,0x49,0x47,0x41, +0x28,0x54,0x4d,0x29,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x58,0x20,0x43,0x41,0x20, +0x31,0x30,0x31,0x30,0x1e,0x17,0x0d,0x31,0x37,0x30,0x38,0x33,0x31,0x31,0x32,0x30, +0x39,0x33,0x31,0x5a,0x17,0x0d,0x33,0x37,0x30,0x38,0x33,0x31,0x31,0x32,0x30,0x39, +0x33,0x31,0x5a,0x30,0x00,0x30,0x59,0x30,0x13,0x06,0x07,0x2a,0x86,0x48,0xce,0x3d, +0x02,0x01,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x03,0x01,0x07,0x03,0x42,0x00,0x04, +0xd5,0xf9,0x1c,0xd4,0x2b,0x20,0x10,0x9c,0x05,0x65,0x8b,0xb0,0x29,0xe7,0xfb,0x16, +0x62,0xe7,0x00,0xd0,0x6e,0xb1,0x37,0xfa,0x23,0x29,0x2d,0x46,0xb7,0x0e,0xf4,0x1f, +0x3d,0xb5,0x37,0x04,0x63,0xa9,0x64,0xd4,0xe5,0x9f,0x8c,0x1d,0x91,0x8d,0x14,0x6a, +0xa6,0x42,0xe8,0xc9,0x15,0x90,0x41,0xff,0x04,0xb9,0x47,0x6a,0x36,0x65,0xf6,0x89, +0xa3,0x58,0x30,0x56,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04, +0x03,0x02,0x00,0x80,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02, +0x30,0x00,0x30,0x15,0x06,0x03,0x55,0x1d,0x20,0x04,0x0e,0x30,0x0c,0x30,0x0a,0x06, +0x08,0x2a,0x82,0x14,0x00,0x44,0x01,0x14,0x01,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23, +0x04,0x18,0x30,0x16,0x80,0x14,0xca,0x05,0x33,0xd7,0x4f,0xc4,0x7f,0x09,0x49,0xfb, +0xdb,0x12,0x25,0xdf,0xd7,0x97,0x9d,0x41,0x1e,0x15,0x30,0x0a,0x06,0x08,0x2a,0x86, +0x48,0xce,0x3d,0x04,0x03,0x02,0x03,0x48,0x00,0x30,0x45,0x02,0x21,0x00,0xc3,0xbb, +0x21,0xa6,0x07,0xbc,0xb0,0x8a,0x75,0xf4,0x15,0x9d,0x76,0xd1,0xfd,0x72,0x3a,0xef, +0xca,0x5a,0x88,0x2a,0xe8,0x03,0xa8,0x01,0xc0,0x02,0xd4,0x56,0x63,0x85,0x02,0x20, +0x22,0x64,0x7e,0x20,0x4c,0x33,0x63,0xa1,0x98,0x3e,0xdf,0xc8,0x65,0x74,0x97,0xcc, +0x19,0xa2,0xf6,0x49,0xae,0x8b,0x2c,0xe4,0x52,0x97,0xf3,0x34,0xda,0x9c,0x53,0x34 ]; +// 452 +/* +let sigdata = [ +0x02,0x20,0x62,0x3a,0xd5,0xe2,0x22,0xe5,0x99,0x3f,0x0f,0xc7,0x22,0x28,0x00,0x51, +0x29,0xc0,0xac,0x6a,0xcb,0xa4,0xec,0x63,0x60,0x30,0x09,0xb1,0xb8,0x61,0x65,0x00, +0xca,0xae,0x02,0x21,0x00,0xf6,0xab,0xd8,0x35,0x2a,0x75,0xc2,0x51,0xd3,0x79,0xc1, +0xf0,0x2f,0x3a,0x1d,0x5d,0xe9,0xff,0xce,0xcc,0x8f,0x9c,0xdd,0x79,0xc0,0x24,0x19, +0x8b,0x2e,0x5a,0x76,0x54 +]; + +let sigdata = [0x30,0x45,0x02,0x20,0x02,0x20,0x6b,0x32,0x55,0x46,0x4a,0xe3,0xed,0x50,0x67,0x04, +0x29,0x4c,0x49,0xe5,0xc4,0x4d,0xfc,0x36,0x5d,0x3b,0x90,0xb1,0x74,0xf6,0xc2,0xb5, +0x83,0x9d,0xf2,0x4c,0x02,0x21,0x00,0x4e,0x35,0x02,0x21,0x00,0xc0,0xdc,0x7f,0xd1, +0x89,0xaa,0x4f,0x7e,0xe2,0xdd,0xad,0x0b,0x82,0xde,0x59,0x1d,0x98,0xba,0xd2,0xe3, +0xab,0xf6,0xd2,0x4e,0x41,0x49,0x25]; +*/ + + +/* +Signature: +0x02,0x20,0x6e,0x4d,0x4c,0x82,0xa7,0xdd,0xb5,0x9c,0x19,0x6b,0x84,0xf5,0xc3,0x69, +0x14,0xc9,0x7e,0xd6,0x20,0xb7,0xed,0xc1,0xee,0x94,0x3f,0x92,0xc7,0x71,0xd8,0x23, +0x6b,0xe4,0x02,0x20,0x7e,0x35,0x9e,0xa4,0xca,0xfb,0x29,0xe5,0x1f,0x5a,0xec,0x57, +0x41,0x73,0xf4,0xc7,0x9e,0x9a,0x30,0x39,0x37,0xab,0x41,0xb3,0xab,0x16,0xd6,0xb4, +0x95,0x71,0x73,0x14]; +Format Signature ... OK +Signature Formated Length: 71 +Signature Formated: +let sigdata = [ +0x30,0x45,0x02,0x20,0x02,0x20,0x6e,0x4d,0x4c,0x82,0xa7,0xdd,0xb5,0x9c,0x19,0x6b, +0x84,0xf5,0xc3,0x69,0x14,0xc9,0x7e,0xd6,0x20,0xb7,0xed,0xc1,0xee,0x94,0x3f,0x92, +0xc7,0x71,0xd8,0x23,0x02,0x21,0x00,0x6b,0xe4,0x02,0x20,0x7e,0x35,0x9e,0xa4,0xca, +0xfb,0x29,0xe5,0x1f,0x5a,0xec,0x57,0x41,0x73,0xf4,0xc7,0x9e,0x9a,0x30,0x39,0x37, +0xab,0x41,0xb3,0xab,0x16,0xd6,0xb4]; +Verify Signature ... OK + +// Press sig no end +let sigdata = [ +0x30,0x44,0x02,0x20,0x02,0x21,0x00,0xd4,0x4c,0x73,0x6e,0x85,0x71,0x17,0xc9,0x02, +0xe3,0x11,0xca,0x24,0x72,0xfd,0xbf,0xe1,0x81,0xc2,0x4d,0x3d,0xde,0xca,0x46,0xcd, +0x42,0xd3,0x82,0xa3,0x02,0x20,0x37,0x4e,0x09,0x02,0x20,0x07,0x92,0x75,0xa4,0xd1, +0x76,0x2d,0xc9,0x5f,0x4b,0x00,0x7a,0xd7,0x7d,0xe6,0x41,0x92,0x4d,0xaa,0x25,0x4f, +0x1e,0x65,0x94,0xc5,0x48,0x29 +]; +*/ + +let sigdata = [ + 0x02,0x20,0x03,0xff,0xc2,0x29,0x7c,0x2e,0xb7,0xad,0xf3,0x2f,0x88,0x42,0x59,0x09, + 0x70,0xe2,0x62,0x4e,0x5c,0xa2,0x67,0x2c,0x0d,0xe9,0xa8,0x7b,0xaf,0xe1,0xd7,0xed, + 0xcb,0x37,0x02,0x20,0x76,0x00,0xcd,0x77,0x24,0x2f,0xa4,0xd6,0x5b,0x44,0x47,0xc6, + 0x08,0x14,0x08,0xaa,0x31,0xf4,0x1b,0x0f,0x02,0x30,0xe4,0x16,0x20,0x7d,0xfb,0x67 + ]; + +//let sigdata = [ 5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; +var b = new Buffer.from(certdata); +console.log(certdata.length); + +fs.writeFile("pubreza.bin", b, "binary",function(err) { + if(err) { + console.log(err); + } else { + console.log("The file was saved!"); + } +}); \ No newline at end of file diff --git a/hash.bin b/hash.bin new file mode 100644 index 0000000..bf73d3a Binary files /dev/null and b/hash.bin differ diff --git a/hello.dat b/hello.dat new file mode 100644 index 0000000..7901fe1 Binary files /dev/null and b/hello.dat differ diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/key64.pem b/key64.pem new file mode 100644 index 0000000..83ace40 --- /dev/null +++ b/key64.pem @@ -0,0 +1,3 @@ +-----BEGIN PUBLIC KEY----- +BAcClNfW2eyy/2hT6MTd/ZZTIJOPczPdrIwuDk15XKQDS5sk9uxjzSrnoBTTS7wyIgW5TpCfiiFi8s4Vz9+hIBI= +-----END PUBLIC KEY----- \ No newline at end of file diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/localtry/LBs Sign Key.crt b/localtry/LBs Sign Key.crt new file mode 100644 index 0000000..d6fe3f1 --- /dev/null +++ b/localtry/LBs Sign Key.crt @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFdjCCA14CCQCH0F2k0CH8dTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJO +TDEVMBMGA1UECAwMWnVpZCBIb2xsYW5kMRIwEAYDVQQHDAlSb3R0ZXJkYW0xGjAY +BgNVBAoMEVNwYXJrbGluZyBOZXR3b3JrMRAwDgYDVQQLDAdJVCBEZXB0MRUwEwYD +VQQDDAxMQnMgU2lnbiBLZXkwHhcNMTkwNjI4MDk1NTE5WhcNMjAwNjI3MDk1NTE5 +WjB9MQswCQYDVQQGEwJOTDEVMBMGA1UECAwMWnVpZCBIb2xsYW5kMRIwEAYDVQQH +DAlSb3R0ZXJkYW0xGjAYBgNVBAoMEVNwYXJrbGluZyBOZXR3b3JrMRAwDgYDVQQL +DAdJVCBEZXB0MRUwEwYDVQQDDAxMQnMgU2lnbiBLZXkwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDpUHMM+5VAkYHQ/fuQ6+j9sbB1B9gJ3r6FBzz/0E7e +KgKU967fa8NHUy14PE7t0EBJWIhPWRLgAZCHPdt4eCRVbjXpYo0F99tM5L5v77Pv +aZBYeMg1UWWHFD4v9IE7LEQEKPIllNlAjz5dM9nzSG9WDx5XtQhcBZ8+zIOcbcVQ +Mb39ZawVInvz/MnCESqoldqNxiILkb3Mf/PCW5eh9LrOh/jyBg27Brc8M+RnBj4d +fCDaNT/xbZFhgmZpEsNlkIKD9/wSiG//0Aa/XOOabBDuk3nYPCT5jr4OuNK5M8cO +Q5tGffkYCztNTR2hhrz+oqjaTmjVGcnriQzekIL390cW9Q0V5WwX95KNF0+eS+Qd +JRLDLS4vWIzKzo++74iiGSmrJoB170EY/yDnBgA4Kg7Kjvt3oqjladLFWwk/cgGe +mVV3tSz3ctINT4j8/IUNWCySJmSa65JEzYkXze5Z+xSBtB9bU5H12w2xdESPbgF7 +mGEXoilbo9Mibgdxwr+ZjqmArdSMB/YeR1PaaPUjf/EsgN1XoPrVivEwqH5dNo2m +xlMNu0nI9Utn4ot1X34MqulcZU3nW86ajRvZ8U0VVcP+/vRrdH3pBFIGZXTMLjjj +H9zDWCZ4DK+9f7mSuwD4q+0INk4t+nj1ww/+3YaBIafRbmOyvXaaCAgKoA/aKb/a +4QIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQBzCjsc7Nf5obQmg5snmhsL9nrjAcRV +L6xYF5AJ+8P+kmOiXwhvm0wZ0jqYhDcuWN7/oZt3i39f7Ei84cYSFAQlMu/FMhZg +hzoERnIOMu9sMlKBzgcmKUHuNhFoiZTyhFD+smCrcoEj+1bi4qz4t7GIAPM6Rzm0 +IJeJb8hL1I2tpuHC6bVjaCwYwS/6VtgoU1xcqvb8B5YRMpvDUCjgM6WN1cGdySTJ +byA0u9MqEHQAsb7imW7D2X06Xi8yxH9+jh+BppSvn6EmAAywBwy32B7y7tLMnqZy +HY2rks89aHM0fFF07P6pa81RDe+NO6ncNLG09R/1PaCVBVuVCvR0OwUf3jKxYVVM +lp9/BlkU+duoRRRhaN4qo30HpEeXDpywETf0zJDstUp6ofDq1FTa6zpuPu0jcDHm +a+szEVNRd00LdCsELVeUoVQSqwq1y2oqrpQCCkL5RQ5XfoIzOOXehk/NgDcOlYvr +9vB2RQCvsG6c6ur+taNWC6OBBSKLGjAS9oST+Xm1zcu8U4zREBBB5Drxus5DW9Zo +xlfL0aNWdV1lkRr6o2vvwA3018hIpsji1kkZd8ZOorBHkXrjVRDqpjey+XpCXJ2k +cfugwb18jJ7HuGjeydm1BvnksfuXYYbsoSOoe2A/lGTmL6yf0YUAgUV/yBFLoh2j +YsXtCUTRC2HVvg== +-----END CERTIFICATE----- diff --git a/localtry/LBs Sign Key.key b/localtry/LBs Sign Key.key new file mode 100644 index 0000000..d96e53a --- /dev/null +++ b/localtry/LBs Sign Key.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +SykFgO0hP10e9Mw7Duf1u0UWfC0unA== +-----END PRIVATE KEY----- diff --git a/localtry/sign.txt b/localtry/sign.txt new file mode 100644 index 0000000..3fa0d4b --- /dev/null +++ b/localtry/sign.txt @@ -0,0 +1 @@ +Hello, World diff --git a/localtry/sign.txt.sha256 b/localtry/sign.txt.sha256 new file mode 100644 index 0000000..a081326 Binary files /dev/null and b/localtry/sign.txt.sha256 differ diff --git a/message.txt b/message.txt new file mode 100644 index 0000000..9ba7a0e --- /dev/null +++ b/message.txt @@ -0,0 +1 @@ +press diff --git a/osslkey.pem b/osslkey.pem new file mode 100644 index 0000000..ff3c889 --- /dev/null +++ b/osslkey.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBwKU19bZ7LL/aFPoxN39llMgk49z +M92sjC4OTXlcpANLmyT27GPNKuegFNNLvDIiBblOkJ+KIWLyzhXP36EgEg== +-----END PUBLIC KEY----- diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..2147e44 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,18 @@ +;PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:m5stack-core-esp32] +framework = arduino +platform = espressif32 +board = m5stack-core-esp32 + +build_flags = -fpermissive +lib_deps = + OPTIGA Trust X@1.0.5 \ No newline at end of file diff --git a/press.txt b/press.txt new file mode 100644 index 0000000..9ba7a0e --- /dev/null +++ b/press.txt @@ -0,0 +1 @@ +press diff --git a/pub.crt b/pub.crt new file mode 100644 index 0000000..1f5df18 Binary files /dev/null and b/pub.crt differ diff --git a/pubkey.der b/pubkey.der new file mode 100644 index 0000000..4ac904e --- /dev/null +++ b/pubkey.der @@ -0,0 +1 @@ +hSS s3ݬ.My\K$c*K2"N!bߡ  \ No newline at end of file diff --git a/pubreza.bin b/pubreza.bin new file mode 100644 index 0000000..cbbbca1 Binary files /dev/null and b/pubreza.bin differ diff --git a/reza.pem b/reza.pem new file mode 100644 index 0000000..4fd75bc --- /dev/null +++ b/reza.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1fkc1CsgEJwFZYuwKef7FmLnANBu +sTf6IyktRrcO9B89tTcEY6lk1OWfjB2RjRRqpkLoyRWQQf8EuUdqNmX2iQ== +-----END PUBLIC KEY----- diff --git a/sigasn.bin b/sigasn.bin new file mode 100644 index 0000000..cf265fc Binary files /dev/null and b/sigasn.bin differ diff --git a/sigdata64.sig b/sigdata64.sig new file mode 100644 index 0000000..b4e619b --- /dev/null +++ b/sigdata64.sig @@ -0,0 +1 @@ +MEUCIAIgazJVRkrj7VBnBClMSeXETfw2XTuQsXT2wrWDnfJMAiEATjUCIQDA3H/RiapPfuLdrQuC3lkdmLrS46v20k5BSSU= \ No newline at end of file diff --git a/signormal.bin b/signormal.bin new file mode 100644 index 0000000..f79394c Binary files /dev/null and b/signormal.bin differ diff --git a/src/fprint.h b/src/fprint.h new file mode 100644 index 0000000..46250a0 --- /dev/null +++ b/src/fprint.h @@ -0,0 +1,156 @@ +#ifndef FPRINT_H +#define FPRINT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "Arduino.h" + +#ifndef SUPPRESSCOLLORS +#define ANSI_COLOR_RED "\x1b[31m" +#define ANSI_COLOR_GREEN "\x1b[32m" +#define ANSI_COLOR_YELLOW "\x1b[33m" +#define ANSI_COLOR_BLUE "\x1b[34m" +#define ANSI_COLOR_MAGENTA "\x1b[35m" +#define ANSI_COLOR_CYAN "\x1b[36m" +#define ANSI_COLOR_RESET "\x1b[0m" +#else +#define ANSI_COLOR_RED "" +#define ANSI_COLOR_GREEN "" +#define ANSI_COLOR_YELLOW "" +#define ANSI_COLOR_BLUE "" +#define ANSI_COLOR_MAGENTA "" +#define ANSI_COLOR_CYAN "" +#define ANSI_COLOR_RESET "" +#endif + +#define MAXCMD_LEN 255 +#define HEXDUMP_COLS 16 + +#ifndef SUPPRESSHEXDUMP +#define SUPPRESSHEXDUMP 0 +#endif +#define HEXDUMP(a, b) (SUPPRESSHEXDUMP == 0) ? __hexdump__(a, b) : (void)0; +/** + * + * This function prints a given input in green + * color with a \r\n signs at the end + * + * @retval None + */ +inline void printlnGreen(const char c[]) { + char tmp[100]; + sprintf(tmp, "%s%s%s", ANSI_COLOR_GREEN, c, ANSI_COLOR_RESET); + Serial.println(tmp); +} + +/** + * + * This function prints a given input in red + * color with a \r\n signs at the end + * + * @retval None + */ +inline void printlnRed(const char c[]) { + char tmp[100]; + sprintf(tmp, "%s%s%s", ANSI_COLOR_RED, c, ANSI_COLOR_RESET); + Serial.println(tmp); +} + +/** + * + * This function prints a given input in magenta + * color with a \r\n signs at the end + * + * @retval None + */ +inline void printlnMagenta(const char c[]) { + char tmp[100]; + sprintf(tmp, "%s%s%s", ANSI_COLOR_MAGENTA, c, ANSI_COLOR_RESET); + Serial.println(tmp); +} + +/** + * + * This function prints a given input in magenta + * color without a \r\n signs at the end + * + * @retval None + */ +inline void printMagenta(const char c[]) { + char tmp[100]; + sprintf(tmp, "%s%s%s", ANSI_COLOR_MAGENTA, c, ANSI_COLOR_RESET); + Serial.print(tmp); +} + +/** + * + * This function prints a given input in green + * color without a \r\n signs at the end + * + * @retval None + */ +inline void printGreen(const char c[]) { + char tmp[100]; + sprintf(tmp, "%s%s%s", ANSI_COLOR_GREEN, c, ANSI_COLOR_RESET); + Serial.print(tmp); +} + +/** + * + * Printout data in a standard hex view + * + * @param[in] p_buf Pointer to data which should be printed out. + * @param[in] l_len Length of a data + * + * @retval None + * @example + 0x000000: 2e 2f 68 65 78 64 75 6d ./hexdum + 0x000008: 70 00 53 53 48 5f 41 47 p.SSH_AG + 0x000010: 45 4e 54 5f ENT_ + */ +inline void __hexdump__(const void *p_buf, uint32_t l_len) { + unsigned int i, j; + char str[MAXCMD_LEN]; + for (i = 0; i < l_len + ((l_len % HEXDUMP_COLS) ? (HEXDUMP_COLS - l_len % HEXDUMP_COLS) : 0); i++) { + /* print offset */ + if (i % HEXDUMP_COLS == 0) { + sprintf(str, "0x%06x: ", i); + Serial.print(str); + } + + /* print hex data */ + if (i < l_len) { + sprintf(str, "%02x ", 0xFF & ((char *)p_buf)[i]); + Serial.print(str); + } else /* end of block, just aligning for ASCII dump */ + { + sprintf(str, " "); + Serial.print(str); + } + + /* print ASCII dump */ + if (i % HEXDUMP_COLS == (HEXDUMP_COLS - 1)) { + for (j = i - (HEXDUMP_COLS - 1); j <= i; j++) { + if (j >= l_len) /* end of block, not really printing */ + { + Serial.print(' '); + } else if (isprint((int)((char *)p_buf)[j])) /* printable char */ + { + Serial.print(((char *)p_buf)[j]); + } else /* other char */ + { + Serial.print('.'); + } + } + Serial.print('\r'); + Serial.print('\n'); + } + } +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..a1d7cc6 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,267 @@ +/** + * MIT License + * + * Copyright (c) 2018 Infineon Technologies AG + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE + * + * Demonstrates use of the + * Infineon Technologies AG OPTIGA™ Trust X Arduino library + */ + +#include "OPTIGATrustX.h" + +#define MAXCMD_LEN 255 +#define CERT_LENGTH 512 +#define RND_LENGTH 64 +#define HASH_LENGTH 32 +#define SIGN_LENGTH 80 +#define PUBKEY_LENGTH 70 +#define UID_LENGTH 27 + +#define SUPPRESSCOLLORS +#include "fprint.h" +#include + +bool oldButton = true; +#define button 18 + + +const char* ssid = "LBsPhone"; +const char* password = "simple"; + +const char* host = "192.168.0.111"; +const int port = 8234; + +#define ASSERT(err) if (ret) { printlnRed("Failed"); while (true); } + +/* + * Allocating buffers for further use in loop() + */ +uint8_t *cert = new uint8_t[CERT_LENGTH]; +uint16_t certLen = CERT_LENGTH; +uint8_t *rnd = new uint8_t[RND_LENGTH]; +uint16_t rndLen = RND_LENGTH; +uint8_t *hash = new uint8_t[HASH_LENGTH]; +uint16_t hashLen = HASH_LENGTH; +uint8_t *rawSign = new uint8_t[SIGN_LENGTH]; +uint8_t *formSign = new uint8_t[SIGN_LENGTH]; +uint16_t signLen = SIGN_LENGTH; +uint8_t *format = new uint8_t[SIGN_LENGTH]; +uint16_t formatLen = SIGN_LENGTH; +uint8_t *pubKey = new uint8_t[PUBKEY_LENGTH]; +uint16_t pubKeyLen = PUBKEY_LENGTH; +uint8_t *uid = new uint8_t[UID_LENGTH]; + + + + +static void output_result(char* tag, uint8_t* in, uint16_t in_len) +{ + printlnGreen("OK"); + printMagenta(tag); + printMagenta(" Length: "); + Serial.println(in_len); + printMagenta(tag); + printlnMagenta(":"); + HEXDUMP(in, in_len); +} + +void loop() +{ + uint32_t ret = 0; + uint8_t cntr = 10; + uint8_t ifxPublicKey[68]; + + /* + * Getting co-processor Unique ID + */ + printGreen("Get co-processor UID ... "); + uint16_t uidLength = UID_LENGTH; + ret = trustX.getUniqueID(uid, uidLength); + ASSERT(ret); + output_result("Co-processor UID", uid, uidLength); + + /* + * Getting primary certificate + */ + printGreen("Reading cert ... "); + ret = trustX.getCertificate(cert, certLen); + ASSERT(ret); + output_result("Certificate", cert, certLen); + + /* + * Generate a Keypair + */ + + /* + printGreen("Generate Key Pair ... "); + uint16_t ctx = 0; + ret = trustX.generateKeypair(pubKey, pubKeyLen, ctx); + ASSERT(ret); + output_result("Public key", pubKey, pubKeyLen); + */ + + /* + * Get random value of RND_LENGTH length + */ + /* + printGreen("Get random value ... "); + ret = trustX.getRandom(RND_LENGTH, rnd); + ASSERT(ret); + output_result("Random", rnd, RND_LENGTH); + */ + + /* + * Calculate SHA256 value + */ + + char cmd[6] = "press\n"; + + output_result("PRESS", cmd, 6); + + + printGreen("Calculate Hash ... "); + ret = trustX.sha256(cmd, 6, hash); + hashLen = 32; + ASSERT(ret); + output_result("SHA256", hash, hashLen); + + + /* + * Generate a signature NIST-P256 + */ + printGreen("Generate Signature ... "); + ret = trustX.calculateSignature(hash, hashLen, eFIRST_DEVICE_PRIKEY_1, formSign, signLen); + Serial.printf("Code: %u\n", ret); + ASSERT(ret); + output_result("Signature", formSign, signLen); + + printGreen("Format Signature ... "); + ret = trustX.formatSignature(formSign, signLen, format, formatLen); + ASSERT(ret); + output_result("Signature Formated", format, formatLen); + + /* + * Verify just geberated signature + */ + trustX.getPublicKey(ifxPublicKey); + + printGreen("Verify Signature ... "); + ret = trustX.verifySignature(hash, hashLen, formSign, signLen); + ASSERT(ret); + printlnGreen("OK"); + +// init wifi +// connect to server and send + + /* + * Count down 10 seconds and restart the application + */ + while(cntr) { + Serial.print(cntr); + Serial.println(" seconds untill restart."); + delay(1000); + cntr--; + } +} + +void initWifi(){ + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(""); + Serial.println("WiFi connected with IP address: "); + Serial.println(WiFi.localIP()); +} + +void sendData(uint8_t* data, uint16_t len) { + Serial.print("connecting to "); + Serial.println(host); + // Use WiFiClient class to create TCP connections + WiFiClient client; + + if (!client.connect(host, port)) { + Serial.println("connection failed"); + return; + } + // This will send the data to the server + client.print("hello world"); + client.stop(); +} + +void setup() +{ + uint32_t ret = 0; + + /* + * Initialise serial output + */ + Serial.begin(38400); + Serial.println("Initializing ... "); + + /* + * Initialise OPTIGA™ Trust X + */ + printGreen("Begin Trust ... "); + ret = trustX.begin(); + ASSERT(ret); + printlnGreen("OK"); + + /* + * Speed up the chip (min is 6ma, maximum is 15ma) + */ + printGreen("Setting Current Limit... "); + ret = trustX.setCurrentLimit(15); + ASSERT(ret); + printlnGreen("OK"); + + /* + * Check the return value which we just set + */ + printGreen("Checking Power Limit... "); + uint8_t current_lim = 0; + ret = trustX.getCurrentLimit(current_lim); + ASSERT(ret); + if (current_lim == 15) { + printlnGreen("OK"); + } else { + printlnRed("Failed"); + while(1); + } +} + + +void checkButton(){ +if(digitalRead(button) != oldButton){ +delay(5); +if(digitalRead(button) != oldButton){ + if (oldButton == HIGH) { + // Presed down + } else { + // pressed up + } + oldButton = digitalRead(button); +} +} +} \ No newline at end of file diff --git a/staticdata.sig b/staticdata.sig new file mode 100644 index 0000000..d114ba3 Binary files /dev/null and b/staticdata.sig differ diff --git a/staticdata2.bin b/staticdata2.bin new file mode 100644 index 0000000..ea76a8f --- /dev/null +++ b/staticdata2.bin @@ -0,0 +1 @@ + nMLݵki~ ?q#k ~5)ZWAsǞ097Aִqs \ No newline at end of file diff --git a/test/README b/test/README new file mode 100644 index 0000000..df5066e --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html