Skip to content

Add signing example #19

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 4, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions examples/ECCX08Signing/ECCX08Signing.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
ECCX08 Signing
This sketch uses the ECC508 or ECC608 to sign some data
using the private key of a key slot, the signature
is printed to the Serial monitor. Then the signature is
verified using the public key of the slot.
NOTE: the input data must be 64 bytes in length!
Circuit:
- MKR board with ECC508 or ECC608 on board
created 5 November 2019
by Sandeep Mistry
*/

#include <ArduinoECCX08.h>

const byte input[64] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
};

const int slot = 0;

void setup() {
Serial.begin(9600);
while (!Serial);

Serial.println("ECCX08 Signing");
Serial.println();

if (!ECCX08.begin()) {
Serial.println("Failed to communicate with ECC508/ECC608!");
while (1);
}

if (!ECCX08.locked()) {
Serial.println("The ECC508/ECC608 is not locked!");
while (1);
}

// print the input
Serial.print("Input is: ");
printBufferHex(input, sizeof(input));

// retrieve the public key
byte publicKey[64];
ECCX08.generatePublicKey(slot, publicKey);

// print the public key
Serial.print("Public key of slot ");
Serial.print(slot);
Serial.print(" is: ");
printBufferHex(publicKey, sizeof(publicKey));

// calculate the signature, input MUST be 64-byte array
byte signature[64];
ECCX08.ecSign(slot, input, signature);

// print the signature
Serial.print("Signature using slot ");
Serial.print(slot);
Serial.print(" is: ");
printBufferHex(signature, sizeof(signature));

Serial.println();

// To make the signature verifcation fail, uncomment the next line:
// signature[0] = 0x00;

// validate the signature
if (ECCX08.ecdsaVerify(input, signature, publicKey)) {
Serial.println("Verified signature successfully :D");
} else {
Serial.println("oh no! failed to verify signature :(");
}
}

void loop() {
// do nothing
}

void printBufferHex(const byte input[], int inputLength) {
for (int i = 0; i < inputLength; i++) {
Serial.print(input[i] >> 4, HEX);
Serial.print(input[i] & 0x0f, HEX);
}
Serial.println();
}