1919
2020#include " SE05X.h"
2121
22+ #define SE05X_EC_KEY_RAW_LENGTH 64
23+ #define SE05X_EC_KEY_HEADER_LENGTH 27
24+ #define SE05X_EC_KEY_DER_LENGTH SE05X_EC_KEY_HEADER_LENGTH + SE05X_EC_KEY_RAW_LENGTH
25+ #define SE05X_EC_SIGNATURE_RAW_LENGTH 64
26+ #define SE05X_EC_SIGNATURE_HEADER_LENGTH 6
27+ #define SE05X_EC_SIGNATURE_DER_LENGTH SE05X_EC_SIGNATURE_HEADER_LENGTH + SE05X_EC_SIGNATURE_RAW_LENGTH
28+ #define SE05X_SHA256_LENGTH 32
29+ #define SE05X_SN_LENGTH 18
30+ #define SE05X_DER_BUFFER_SIZE 256
31+ #define SE05X_TEMP_OBJECT 9999
32+
2233SE05XClass::SE05XClass ()
2334: _cipher_type {kSSS_CipherType_EC_NIST_P }
2435, _algorithm_type {kAlgorithm_SSS_ECDSA_SHA256 }
@@ -34,21 +45,21 @@ SE05XClass::~SE05XClass()
3445
3546static void getECKeyXyValuesFromDER (byte* derKey, size_t derLen, byte* rawKey)
3647{
37- memcpy (rawKey, &derKey[derLen- 64 ], 64 );
48+ memcpy (rawKey, &derKey[derLen - SE05X_EC_KEY_RAW_LENGTH ], SE05X_EC_KEY_RAW_LENGTH );
3849}
3950
4051static void setECKeyXyVauesInDER (const byte* rawKey, byte* derKey)
4152{
42- static const byte ecc_der_header_nist256[27 ] =
53+ static const byte ecc_der_header_nist256[SE05X_EC_KEY_HEADER_LENGTH ] =
4354 {
4455 0x30 , 0x59 , 0x30 , 0x13 , 0x06 , 0x07 , 0x2a , 0x86 ,
4556 0x48 , 0xce , 0x3d , 0x02 , 0x01 , 0x06 , 0x08 , 0x2a ,
4657 0x86 , 0x48 , 0xce , 0x3d , 0x03 , 0x01 , 0x07 , 0x03 ,
4758 0x42 , 0x00 , 0x04
4859 };
4960
50- memcpy (&derKey[0 ], &ecc_der_header_nist256[0 ], 27 );
51- memcpy (&derKey[27 ], &rawKey[0 ], 64 );
61+ memcpy (&derKey[0 ], &ecc_der_header_nist256[0 ], SE05X_EC_KEY_HEADER_LENGTH );
62+ memcpy (&derKey[SE05X_EC_KEY_HEADER_LENGTH ], &rawKey[0 ], SE05X_EC_KEY_RAW_LENGTH );
5263}
5364
5465static void getECSignatureRsValuesFromDER (byte* derSignature, size_t derLen, byte* rawSignature)
@@ -61,32 +72,32 @@ static void getECSignatureRsValuesFromDER(byte* derSignature, size_t derLen, byt
6172
6273 byte * out = rawSignature;
6374
64- if (rLen == 32 )
75+ if (rLen == (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) )
6576 {
66- memcpy (out, &derSignature[4 ], 32 );
77+ memcpy (out, &derSignature[4 ], (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) );
6778 }
68- else if ((rLen == 33 ) && (derSignature[4 ] == 0 ))
79+ else if ((rLen == ((SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) + 1 ) ) && (derSignature[4 ] == 0 ))
6980 {
70- memcpy (out, &derSignature[5 ], 32 );
81+ memcpy (out, &derSignature[5 ], (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) );
7182 }
7283
73- out += 32 ;
84+ out += (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) ;
7485
75- if (sLen == 32 )
86+ if (sLen == (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) )
7687 {
77- memcpy (out, &derSignature[3 + rLen + 3 ], 32 );
88+ memcpy (out, &derSignature[3 + rLen + 3 ], (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) );
7889 }
79- else if ((sLen == 33 ) && (derSignature[3 + rLen + 3 ] == 0 ))
90+ else if ((sLen == ((SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) + 1 ) ) && (derSignature[3 + rLen + 3 ] == 0 ))
8091 {
81- memcpy (out, &derSignature[3 + rLen + 4 ], 32 );
92+ memcpy (out, &derSignature[3 + rLen + 4 ], (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) );
8293 }
8394}
8495
8596static void setECSignatureRsValuesInDER (const byte* rawSignature, byte* signature)
8697{
87- byte rLen = 32 ;
88- byte sLen = 32 ;
89- byte rawSignatureLen = 64 ;
98+ byte rLen = (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) ;
99+ byte sLen = (SE05X_EC_SIGNATURE_RAW_LENGTH / 2 ) ;
100+ byte rawSignatureLen = SE05X_EC_SIGNATURE_RAW_LENGTH ;
90101
91102 signature[0 ] = 0x30 ;
92103 signature[1 ] = (uint8_t )(rawSignatureLen + 4 );
@@ -150,7 +161,7 @@ int SE05XClass::readConfiguration(byte data[])
150161String SE05XClass::serialNumber ()
151162{
152163 String result = (char *)NULL ;
153- byte UID[18 ];
164+ byte UID[SE05X_SN_LENGTH ];
154165 size_t uidLen = 18 ;
155166
156167 sss_session_prop_get_au8 (&_boot_ctx.session , kSSS_SessionProp_UID , UID, &uidLen);
@@ -240,7 +251,7 @@ int SE05XClass::generatePrivateKey(int keyId, byte pubKeyDer[], size_t pubKeyDer
240251
241252int SE05XClass::generatePrivateKey (int slot, byte publicKey[])
242253{
243- byte publicKeyDer[256 ];
254+ byte publicKeyDer[SE05X_DER_BUFFER_SIZE ];
244255 size_t publicKeyDerLen;
245256
246257 if ((_cipher_type != kSSS_CipherType_EC_NIST_P ) || (_algorithm_type != kAlgorithm_SSS_ECDSA_SHA256 )) {
@@ -279,7 +290,7 @@ int SE05XClass::generatePublicKey(int keyId, byte pubKeyDer[], size_t pubKeyDerM
279290
280291int SE05XClass::generatePublicKey (int slot, byte publicKey[])
281292{
282- byte publicKeyDer[256 ];
293+ byte publicKeyDer[SE05X_DER_BUFFER_SIZE ];
283294 size_t publicKeyDerLen;
284295
285296 if ((_cipher_type != kSSS_CipherType_EC_NIST_P ) || (_algorithm_type != kAlgorithm_SSS_ECDSA_SHA256 )) {
@@ -407,14 +418,14 @@ int SE05XClass::Sign(int keyId, const byte hash[], size_t hashLen, byte sig[], s
407418
408419int SE05XClass::ecSign (int slot, const byte message[], byte signature[])
409420{
410- byte signatureDer[256 ];
421+ byte signatureDer[SE05X_DER_BUFFER_SIZE ];
411422 size_t signatureDerLen;
412423
413424 if ((_cipher_type != kSSS_CipherType_EC_NIST_P ) || (_algorithm_type != kAlgorithm_SSS_ECDSA_SHA256 )) {
414425 return 0 ;
415426 }
416427
417- if (!Sign (slot, message, 32 , signatureDer, sizeof (signatureDer), &signatureDerLen)) {
428+ if (!Sign (slot, message, SE05X_SHA256_LENGTH , signatureDer, sizeof (signatureDer), &signatureDerLen)) {
418429 return 0 ;
419430 }
420431
@@ -454,24 +465,24 @@ int SE05XClass::Verify(int keyId, const byte hash[], size_t hashLen, const byte
454465
455466int SE05XClass::ecdsaVerify (const byte message[], const byte signature[], const byte pubkey[])
456467{
457- byte pubKeyDER[91 ];
458- byte signatureDER[70 ];
468+ byte pubKeyDER[SE05X_EC_KEY_DER_LENGTH ];
469+ byte signatureDER[SE05X_EC_SIGNATURE_DER_LENGTH ];
459470 int result;
460471
461472 if ((_cipher_type != kSSS_CipherType_EC_NIST_P ) || (_algorithm_type != kAlgorithm_SSS_ECDSA_SHA256 )) {
462473 return 0 ;
463474 }
464475
465476 setECKeyXyVauesInDER (pubkey, pubKeyDER);
466- if (!importPublicKey (0xA5A5 , pubKeyDER, sizeof (pubKeyDER))) {
477+ if (!importPublicKey (SE05X_TEMP_OBJECT , pubKeyDER, sizeof (pubKeyDER))) {
467478 return 0 ;
468479 }
469480
470481 setECSignatureRsValuesInDER (signature, signatureDER);
471482
472- result = Verify (0xA5A5 , message, 32 , signatureDER, 70 );
483+ result = Verify (SE05X_TEMP_OBJECT , message, SE05X_SHA256_LENGTH , signatureDER, SE05X_EC_SIGNATURE_DER_LENGTH );
473484
474- if (!deleteBinaryObject (0xA5A5 )) {
485+ if (!deleteBinaryObject (SE05X_TEMP_OBJECT )) {
475486 return 0 ;
476487 }
477488 return result;
0 commit comments