@@ -21,6 +21,11 @@ struct __attribute__((__packed__)) CompressedCert {
21
21
#define SERIAL_NUMBER_LENGTH 16
22
22
#define AUTHORITY_KEY_IDENTIFIER_LENGTH 20
23
23
24
+ struct __attribute__ ((__packed__)) SerialNumberAndAuthorityKeyIdentifier {
25
+ byte serialNumber[SERIAL_NUMBER_LENGTH];
26
+ byte authorityKeyIdentifier[AUTHORITY_KEY_IDENTIFIER_LENGTH];
27
+ };
28
+
24
29
static String base64Encode (const byte in[], unsigned int length, const char * prefix, const char * suffix)
25
30
{
26
31
static const char * CODES = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;
@@ -73,8 +78,7 @@ static String base64Encode(const byte in[], unsigned int length, const char* pre
73
78
ECCX08CertClass::ECCX08CertClass () :
74
79
_keySlot(-1 ),
75
80
_compressedCertSlot(-1 ),
76
- _serialNumberSlot(-1 ),
77
- _authorityKeyIdentifierSlot(-1 ),
81
+ _serialNumberAndAuthorityKeyIdentifierSlot(-1 ),
78
82
_bytes(NULL ),
79
83
_length(0 )
80
84
{
@@ -186,25 +190,18 @@ String ECCX08CertClass::endCSR()
186
190
return base64Encode (csr, csrLen + csrHeaderLen, " -----BEGIN CERTIFICATE REQUEST-----\n " , " \n -----END CERTIFICATE REQUEST-----\n " );
187
191
}
188
192
189
- int ECCX08CertClass::beginStorage (int compressedCertSlot, int serialNumberSlot, int authorityKeyIdentifierSlot )
193
+ int ECCX08CertClass::beginStorage (int compressedCertSlot, int serialNumberAndAuthorityKeyIdentifierSlot )
190
194
{
191
195
if (compressedCertSlot < 8 || compressedCertSlot > 15 ) {
192
196
return 0 ;
193
197
}
194
198
195
- if (serialNumberSlot < 8 || serialNumberSlot > 15 ) {
199
+ if (serialNumberAndAuthorityKeyIdentifierSlot < 8 || serialNumberAndAuthorityKeyIdentifierSlot > 15 ) {
196
200
return 0 ;
197
201
}
198
202
199
- if (authorityKeyIdentifierSlot > -1 ) {
200
- if (authorityKeyIdentifierSlot < 8 || authorityKeyIdentifierSlot > 15 ) {
201
- return 0 ;
202
- }
203
- }
204
-
205
203
_compressedCertSlot = compressedCertSlot;
206
- _serialNumberSlot = serialNumberSlot;
207
- _authorityKeyIdentifierSlot = authorityKeyIdentifierSlot;
204
+ _serialNumberAndAuthorityKeyIdentifierSlot = serialNumberAndAuthorityKeyIdentifierSlot;
208
205
209
206
memset (_temp, 0x00 , sizeof (_temp));
210
207
@@ -280,18 +277,14 @@ int ECCX08CertClass::endStorage()
280
277
return 0 ;
281
278
}
282
279
283
- if (!ECCX08.writeSlot (_serialNumberSlot, &_temp[72 ], SERIAL_NUMBER_LENGTH)) {
284
- return 0 ;
285
- }
286
-
287
- if (!ECCX08.writeSlot (_authorityKeyIdentifierSlot, &_temp[88 ], AUTHORITY_KEY_IDENTIFIER_LENGTH)) {
280
+ if (!ECCX08.writeSlot (_serialNumberAndAuthorityKeyIdentifierSlot, &_temp[72 ], SERIAL_NUMBER_LENGTH + AUTHORITY_KEY_IDENTIFIER_LENGTH)) {
288
281
return 0 ;
289
282
}
290
283
291
284
return 1 ;
292
285
}
293
286
294
- int ECCX08CertClass::beginReconstruction (int keySlot, int compressedCertSlot, int serialNumberSlot, int authorityKeyIdentifierSlot )
287
+ int ECCX08CertClass::beginReconstruction (int keySlot, int compressedCertSlot, int serialNumberAndAuthorityKeyIdentifierSlot )
295
288
{
296
289
if (keySlot < 0 || keySlot > 8 ) {
297
290
return 0 ;
@@ -301,20 +294,13 @@ int ECCX08CertClass::beginReconstruction(int keySlot, int compressedCertSlot, in
301
294
return 0 ;
302
295
}
303
296
304
- if (serialNumberSlot < 8 || serialNumberSlot > 15 ) {
297
+ if (serialNumberAndAuthorityKeyIdentifierSlot < 8 || serialNumberAndAuthorityKeyIdentifierSlot > 15 ) {
305
298
return 0 ;
306
299
}
307
300
308
- if (authorityKeyIdentifierSlot > -1 ) {
309
- if (authorityKeyIdentifierSlot < 8 || authorityKeyIdentifierSlot > 15 ) {
310
- return 0 ;
311
- }
312
- }
313
-
314
301
_keySlot = keySlot;
315
302
_compressedCertSlot = compressedCertSlot;
316
- _serialNumberSlot = serialNumberSlot;
317
- _authorityKeyIdentifierSlot = authorityKeyIdentifierSlot;
303
+ _serialNumberAndAuthorityKeyIdentifierSlot = serialNumberAndAuthorityKeyIdentifierSlot;
318
304
319
305
return 1 ;
320
306
}
@@ -323,8 +309,7 @@ int ECCX08CertClass::endReconstruction()
323
309
{
324
310
byte publicKey[64 ];
325
311
struct CompressedCert compressedCert;
326
- byte serialNumber[SERIAL_NUMBER_LENGTH];
327
- byte authorityKeyIdentifier[AUTHORITY_KEY_IDENTIFIER_LENGTH];
312
+ struct SerialNumberAndAuthorityKeyIdentifier serialNumberAndAuthorityKeyIdentifier;
328
313
329
314
if (!ECCX08.generatePublicKey (_keySlot, publicKey)) {
330
315
return 0 ;
@@ -334,16 +319,11 @@ int ECCX08CertClass::endReconstruction()
334
319
return 0 ;
335
320
}
336
321
337
- if (!ECCX08.readSlot (_serialNumberSlot, serialNumber , sizeof (serialNumber ))) {
322
+ if (!ECCX08.readSlot (_serialNumberAndAuthorityKeyIdentifierSlot, (byte*)&serialNumberAndAuthorityKeyIdentifier , sizeof (serialNumberAndAuthorityKeyIdentifier ))) {
338
323
return 0 ;
339
324
}
340
325
341
- if (_authorityKeyIdentifierSlot > -1 &&
342
- !ECCX08.readSlot (_authorityKeyIdentifierSlot, authorityKeyIdentifier, sizeof (authorityKeyIdentifier))) {
343
- return 0 ;
344
- }
345
-
346
- int serialNumberLen = serialNumberLength (serialNumber);
326
+ int serialNumberLen = serialNumberLength (serialNumberAndAuthorityKeyIdentifier.serialNumber );
347
327
348
328
int issuerLen = issuerOrSubjectLength (_issuerCountryName,
349
329
_issuerStateProvinceName,
@@ -365,12 +345,8 @@ int ECCX08CertClass::endReconstruction()
365
345
366
346
int publicKeyLen = publicKeyLength ();
367
347
368
- int authorityKeyIdentifierLen = 0 ;
369
-
370
- if (_authorityKeyIdentifierSlot > -1 ) {
371
- authorityKeyIdentifierLen = authorityKeyIdentifierLength ();
372
- }
373
-
348
+ int authorityKeyIdentifierLen = authorityKeyIdentifierLength (serialNumberAndAuthorityKeyIdentifier.authorityKeyIdentifier );
349
+
374
350
int signatureLen = signatureLength (compressedCert.signature );
375
351
376
352
int certInfoLen = 5 + serialNumberLen + 12 + issuerHeaderLen + issuerLen + 32 +
@@ -411,7 +387,7 @@ int ECCX08CertClass::endReconstruction()
411
387
*out++ = 0x02 ;
412
388
413
389
// serial number
414
- appendSerialNumber (serialNumber, out);
390
+ appendSerialNumber (serialNumberAndAuthorityKeyIdentifier. serialNumber , out);
415
391
out += serialNumberLen;
416
392
417
393
// ecdsaWithSHA256
@@ -456,7 +432,7 @@ int ECCX08CertClass::endReconstruction()
456
432
out += publicKeyLen;
457
433
458
434
if (authorityKeyIdentifierLen) {
459
- appendAuthorityKeyIdentifier (authorityKeyIdentifier, out);
435
+ appendAuthorityKeyIdentifier (serialNumberAndAuthorityKeyIdentifier. authorityKeyIdentifier , out);
460
436
out += authorityKeyIdentifierLen;
461
437
} else {
462
438
// null sequence
@@ -595,9 +571,19 @@ int ECCX08CertClass::publicKeyLength()
595
571
return (2 + 2 + 9 + 10 + 4 + 64 );
596
572
}
597
573
598
- int ECCX08CertClass::authorityKeyIdentifierLength ()
574
+ int ECCX08CertClass::authorityKeyIdentifierLength (const byte authorityKeyIdentifier[] )
599
575
{
600
- return 37 ;
576
+ bool set = false ;
577
+
578
+ // check if the authority key identifier is non-zero
579
+ for (int i = 0 ; i < AUTHORITY_KEY_IDENTIFIER_LENGTH; i++) {
580
+ if (authorityKeyIdentifier[i] != 0 ) {
581
+ set = true ;
582
+ break ;
583
+ }
584
+ }
585
+
586
+ return (set ? 37 : 0 );
601
587
}
602
588
603
589
int ECCX08CertClass::signatureLength (const byte signature[])
0 commit comments