Skip to content

Commit 6cbcbbd

Browse files
committed
Add SHA256 support
1 parent 4e2f436 commit 6cbcbbd

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

keywords.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ generatePrivateKey KEYWORD2
2222
generatePublicKey KEYWORD2
2323
ecdsaVerify KEYWORD2
2424
ecSign KEYWORD2
25+
beginSHA256 KEYWORD2
26+
updateSHA256 KEYWORD2
27+
endSHA256 KEYWORD2
2528
readSlot KEYWORD2
2629
writeSlot KEYWORD2
2730
locked KEYWORD2

src/ECCX08.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,89 @@ int ECCX08Class::ecSign(int slot, const byte message[], byte signature[])
228228
return 1;
229229
}
230230

231+
int ECCX08Class::beginSHA256()
232+
{
233+
uint8_t status;
234+
235+
if (!wakeup()) {
236+
return 0;
237+
}
238+
239+
if (!sendCommand(0x47, 0x00, 0x0000)) {
240+
return 0;
241+
}
242+
243+
delay(9);
244+
245+
if (!receiveResponse(&status, sizeof(status))) {
246+
return 0;
247+
}
248+
249+
delay(1);
250+
idle();
251+
252+
if (status != 0) {
253+
return 0;
254+
}
255+
256+
return 1;
257+
}
258+
259+
int ECCX08Class::updateSHA256(const byte data[])
260+
{
261+
uint8_t status;
262+
263+
if (!wakeup()) {
264+
return 0;
265+
}
266+
267+
if (!sendCommand(0x47, 0x01, 64, data, 64)) {
268+
return 0;
269+
}
270+
271+
delay(9);
272+
273+
if (!receiveResponse(&status, sizeof(status))) {
274+
return 0;
275+
}
276+
277+
delay(1);
278+
idle();
279+
280+
if (status != 0) {
281+
return 0;
282+
}
283+
284+
return 1;
285+
}
286+
287+
int ECCX08Class::endSHA256(byte result[])
288+
{
289+
return endSHA256(NULL, 0, result);
290+
}
291+
292+
int ECCX08Class::endSHA256(const byte data[], int length, byte result[])
293+
{
294+
if (!wakeup()) {
295+
return 0;
296+
}
297+
298+
if (!sendCommand(0x47, 0x02, length, data, length)) {
299+
return 0;
300+
}
301+
302+
delay(9);
303+
304+
if (!receiveResponse(result, 32)) {
305+
return 0;
306+
}
307+
308+
delay(1);
309+
idle();
310+
311+
return 1;
312+
}
313+
231314
int ECCX08Class::readSlot(int slot, byte data[], int length)
232315
{
233316
if (slot < 0 || slot > 15) {

src/ECCX08.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ class ECCX08Class
4444
int ecdsaVerify(const byte message[], const byte signature[], const byte pubkey[]);
4545
int ecSign(int slot, const byte message[], byte signature[]);
4646

47+
int beginSHA256();
48+
int updateSHA256(const byte data[]); // 64 bytes
49+
int endSHA256(byte result[]);
50+
int endSHA256(const byte data[], int length, byte result[]);
51+
4752
int readSlot(int slot, byte data[], int length);
4853
int writeSlot(int slot, const byte data[], int length);
4954

0 commit comments

Comments
 (0)