ITS
decodeSecurity.cpp
Go to the documentation of this file.
1 #include <decodeSecurity.h>
2 
3 #include <api.h>
4 
16 
19 
20 int nbX(uchar v, quint64 *ret)
21 {
22  int n = 1;
23 
24  while((v & 0x80) && n < 8)
25  {
26  v <<= 1;
27  n++;
28  }
29 
30  *ret = v >> (n - 1);
31 
32  return n;
33 }
34 
35 quint64 extractINTX(uchar *field, int *n)
36 {
37  int i;
38  quint64 ret = 0;
39 
40  *n = nbX(*field, &ret);
41 
42  for(i = 1 ; i < *n ; i++)
43  {
44  ret <<= 8;
45  ret += field[i];
46  }
47 
48  return ret;
49 }
50 
51 /* Print */
52 
53 quint64 decode_Time64(uchar *field, Time64_t *time)
54 {
55  time->size = 8;
56  time->buf = (uint8_t*)calloc(time->size, sizeof *time->buf);
57 
58  for(int i = 0 ; i < time->size ; i++)
59  time->buf[i] = *(field + i);
60 
61  return 8;
62 }
63 
64 quint64 decode_Time32(uchar *field, Time32_t *time)
65 {
66  *time = 0;
67 
68  for(int i = 0 ; i < 4 ; i++)
69  {
70  *time <<= 8;
71  *time += *(field + i);
72 
73  }
74 
75  return 4;
76 }
77 
78 quint64 decode_INT32(uchar *field, INT32_t *int32)
79 {
80  quint64 tmp = 0;
81 
82  for(int i = 0 ; i < 4 ; i++)
83  {
84  tmp <<= 8;
85  tmp += *(field + i);
86  }
87  *int32 = (long long int)tmp;
88 
89  return 4;
90 }
91 
92 quint64 decode_UINT16(uchar *field, UINT16_t *uint16)
93 {
94  *uint16 = 0;
95  for(int i = 0 ; i < 2 ; i++)
96  *uint16 += *(field + i);
97 
98  return 2;
99 }
100 
101 quint64 decode_Duration(uchar *field, Duration_t *duration)
102 {
103  return decode_UINT16(field, duration);
104 }
105 
106 quint64 decode_HashedId(uchar *field, OCTET_STRING_t *hash, int length)
107 {
108  hash->size = length;
109  hash->buf = (uint8_t*)calloc(hash->size, sizeof *hash->buf);
110 
111  for(int i = 0 ; i < length ; i++)
112  hash->buf[i] = *(field + i);
113 
114  return length;
115 }
116 
117 quint64 decode_HashedId8(uchar *field, HashedId8_t *hash)
118 {
119  return decode_HashedId(field, hash, 8);
120 }
121 
122 quint64 decode_HashedId3(uchar *field, HashedId3_t *hash)
123 {
124  return decode_HashedId(field, hash, 3);
125 }
126 
127 quint64 decode_Opaque(uchar *field, Opaque_t *opaque, int length)
128 {
129  int offset = 0;
130 
131  if(!length)
132  length = extractINTX(field, &offset);
133 
134  opaque->length = length;
135  opaque->value.size = length;
136  opaque->value.buf = (uint8_t*)calloc(length, sizeof *opaque->value.buf);
137 
138  for(int i = 0 ; i < length ; i++)
139  opaque->value.buf[i] = *(field + i + offset);
140 
141  return offset + length;
142 }
143 
144 quint64 decode_EccPoint(uchar *field, EccPoint_t *point)
145 {
146  quint64 offset = 0;
147 
148  point->type = *(field + offset++);
149  offset += decode_Opaque(field + offset, &point->x, 32);
150  switch (point->type)
151  {
154  break;
157  break;
160  break;
163  offset += decode_Opaque(field + offset, &point->ecc_point.choice.uncompressed.y, 32);
164  break;
165  default:
167  offset += decode_Opaque(field + offset, &point->ecc_point.choice.unknown_ecc_point.data);
168  break;
169  }
170 
171  return offset;
172 }
173 
174 quint64 decode_EciesEncryptedKey(uchar *field, EciesEncryptedKey_t *ecies)
175 {
176  quint64 offset = 0;
177 
178  offset += decode_EccPoint(field + offset, &ecies->v);
179  offset += decode_Opaque(field + offset, &ecies->c, 16);
180  offset += decode_Opaque(field + offset, &ecies->t, 16);
181 
182  return offset;
183 }
184 
186 {
187  quint64 offset = 0;
188 
189  offset += decode_Time64(field + offset, &time->time);
190  time->log_std_dev = *(field + offset++);
191 
192  return offset;
193 }
194 
195 quint64 decode_ThreeDLocation(uchar *field, ThreeDLocation_t *location)
196 {
197  quint64 offset = 0;
198 
199  offset += decode_INT32(field + offset, &location->latitude);
200  offset += decode_INT32(field + offset, &location->longitude);
201  offset += decode_Opaque(field + offset, &location->elevation, 2);
202 
203  return offset;
204 }
205 
206 quint64 decode_SubjectInfo(uchar *field, SubjectInfo_t *info)
207 {
208  quint64 offset = 0;
209 
210  info->subject_type = *(field + offset++);
211  offset += decode_Opaque(field + offset, &info->subject_name);
212 
213  return offset;
214 }
215 
216 quint64 decode_ItsAidSsp(uchar *field, ItsAidSsp_t *ssp)
217 {
218  quint64 offset = 0;
219  int nbOctets;
220 
221  ssp->its_aid_ssp = extractINTX(field + offset, &nbOctets);
222  offset += nbOctets;
223  offset += decode_Opaque(field + offset, &ssp->service_specific_permissions);
224 
225  return offset;
226 }
227 
228 quint64 decode_PublicKey(uchar *field, PublicKey_t *key)
229 {
230  quint64 offset = 0;
231 
232  key->algorithm = *(field + offset++);
233  switch (key->algorithm)
234  {
238  break;
242  offset += decode_EccPoint(field + offset, &key->public_key.choice.ecies_nistp256_public_key.public_key);
243  break;
244  default:
246  offset += decode_Opaque(field + offset, &key->public_key.choice.unknown_public_key.other_key);
247  break;
248  }
249  return offset;
250 }
251 
252 quint64 decode_SubjectAssurance(uchar *field, SubjectAssurance_t *subject)
253 {
254  quint64 offset = 0;
255 
256  offset += decode_Opaque(field + offset, subject, 1);
257 
258  return offset;
259 }
260 
261 quint64 decode_SubjectAttribute(uchar *field, SubjectAttribute_t *subject)
262 {
263  quint64 offset = 0, currentOffset;
264 
265  /* Its Aid */
266  int nbOctetsIntX;
267  quint64 nbIntX, currentOffsetIntX;
268 
269  /* Its Aid SSP */
270  int nbOctetsSsp;
271  quint64 nbSsp, currentOffsetSsp;
272 
273  subject->type = *(field + offset++);
274  switch (subject->type)
275  {
278  offset += decode_PublicKey(field + offset, &subject->subject_attribute.choice.verification_key.key);
279  break;
282  offset += decode_PublicKey(field + offset, &subject->subject_attribute.choice.encryption_key.key);
283  break;
286  offset += decode_EccPoint(field + offset, &subject->subject_attribute.choice.recontruction_value.rv);
287  break;
290  offset += decode_SubjectAssurance(field + offset, &subject->subject_attribute.choice.assurance_level.assurance);
291  break;
293  nbIntX = extractINTX(field + offset, &nbOctetsIntX);
294 
295  offset += nbOctetsIntX;
296 
298  subject->subject_attribute.choice.its_aid_list.its_aid.list.array =
299  (IntX_t**)calloc(1, sizeof *subject->subject_attribute.choice.its_aid_list.its_aid.list.array);
300  subject->subject_attribute.choice.its_aid_list.its_aid.list.count = 0;
301  subject->subject_attribute.choice.its_aid_list.its_aid.list.free = 0;
302  subject->subject_attribute.choice.its_aid_list.its_aid.list.size = 0;
303 
304  for(currentOffsetIntX = 0 ; currentOffsetIntX < nbIntX ; cptIntX++, offset += currentOffset, currentOffsetIntX += currentOffset)
305  {
306  intx[cptIntX] = extractINTX(field + offset, (int*)&currentOffset);
307  subject->subject_attribute.choice.its_aid_list.its_aid.list.array[cptIntX] =
308  (IntX_t*)calloc(1, sizeof *subject->subject_attribute.choice.its_aid_list.its_aid.list.array[cptIntX]);
310  }
311  break;
313  nbSsp = extractINTX(field + offset, &nbOctetsSsp);
314 
315  offset += nbOctetsSsp;
316 
319  (ItsAidSsp_t**)calloc(1, sizeof *subject->subject_attribute.choice.its_aid_ssp_list.its_aid_ssp.list.array);
320  subject->subject_attribute.choice.its_aid_ssp_list.its_aid_ssp.list.count = 0;
321  subject->subject_attribute.choice.its_aid_ssp_list.its_aid_ssp.list.free = 0;
322  subject->subject_attribute.choice.its_aid_ssp_list.its_aid_ssp.list.size = 0;
323 
324  for(currentOffsetSsp = 0 ; currentOffsetSsp < nbSsp ; cptSsp++, offset += currentOffset, currentOffsetSsp += currentOffset)
325  {
326  currentOffset = decode_ItsAidSsp(field + offset, &ssp[cptSsp]);
328  (ItsAidSsp_t*)calloc(1, sizeof *subject->subject_attribute.choice.its_aid_ssp_list.its_aid_ssp.list.array[cptSsp]);
330  }
331  break;
332  default:
335  break;
336  }
337 
338  return offset;
339 }
340 
341 quint64 decode_TwoDLocation(uchar *field, TwoDLocation_t *location)
342 {
343  quint64 offset = 0;
344 
345  offset += decode_INT32(field + offset, &location->latitude);
346  offset += decode_INT32(field + offset, &location->longitude);
347 
348  return offset;
349 }
350 
351 quint64 decode_CircularRegion(uchar *field, CircularRegion_t *region)
352 {
353  quint64 offset = 0;
354 
355  offset += decode_TwoDLocation(field + offset, &region->center);
356  offset += decode_UINT16(field + offset, &region->radius);
357 
358  return offset;
359 }
360 
361 quint64 decode_RectangularRegion(uchar *field, RectangularRegion_t *region)
362 {
363  quint64 offset = 0;
364 
365  offset += decode_TwoDLocation(field + offset, &region->northwest);
366  offset += decode_TwoDLocation(field + offset, &region->southeast);
367 
368  return offset;
369 }
370 
371 quint64 decode_PolygonalRegion(uchar *field, PolygonalRegion_t *polygon)
372 {
373  quint64 offset = 0;
374 
375  int nbOctetsTwoDLocation;
376  quint64 nbTwoDLocation = extractINTX(field + offset, &nbOctetsTwoDLocation), currentOffset, currentOffsetLocation;
377 
378  offset += nbOctetsTwoDLocation;
379 
380  polygon->list.array = (TwoDLocation_t**)calloc(1, sizeof *polygon->list.array);
381  polygon->list.count = 0;
382  polygon->list.free = 0;
383  polygon->list.size = 0;
384 
385  for(currentOffsetLocation = 0 ; currentOffsetLocation < nbTwoDLocation ; cptTwoDLocation++, offset += currentOffset, currentOffsetLocation += currentOffset)
386  {
387  currentOffset = decode_TwoDLocation(field + offset, &twoDLocation[cptTwoDLocation]);
388  polygon->list.array[cptTwoDLocation] = (TwoDLocation_t*)calloc(1, sizeof *polygon->list.array[cptTwoDLocation]);
390  }
391 
392  return offset;
393 }
394 
396 {
397  quint64 offset = 0;
398  int nbOctets;
399 
400  id->region_dictionary = *(field + offset++);
401  offset += decode_UINT16(field + offset, &id->region_identifier);
402  id->local_region = extractINTX(field + offset, &nbOctets);
403  offset += nbOctets;
404 
405  return offset;
406 }
407 
408 quint64 decode_GeographicRegion(uchar *field, GeographicRegion_t *region)
409 {
410  quint64 offset = 0, currentOffset;
411 
412  /* Rectangle */
413  int nbOctetsRectangularRegion;
414  quint64 nbRectangularRegion, currentOffsetRect;
415 
416  region->region_type = *(field + offset++);
417  switch (region->region_type)
418  {
419  case RegionType_circle:
421  offset += decode_CircularRegion(field + offset, &region->geographic_region.choice.circle.circular_region);
422  break;
424  nbRectangularRegion = extractINTX(field + offset, &nbOctetsRectangularRegion);
425 
426  offset += nbOctetsRectangularRegion;
427 
430  (RectangularRegion_t**)calloc(1, sizeof *region->geographic_region.choice.rectangle.rectangular_region.list.array);
431  region->geographic_region.choice.rectangle.rectangular_region.list.count = 0;
434 
435  for(currentOffsetRect = 0 ; currentOffsetRect < nbRectangularRegion ; cptRectangularRegion++, offset += currentOffset, currentOffsetRect += currentOffset)
436  {
437  currentOffset = decode_RectangularRegion(field + offset, &rectangularRegion[cptRectangularRegion]);
441  }
442  break;
443  case RegionType_polygon:
445  offset += decode_PolygonalRegion(field + offset, &region->geographic_region.choice.polygon.polygonal_region);
446  break;
447  case RegionType_id:
449  offset += decode_IdentifiedRegion(field + offset, &region->geographic_region.choice.id.id_region);
450  break;
451  case RegionType_none:
453  break;
454  default:
457  break;
458  }
459 
460  return offset;
461 }
462 
464 {
465  quint64 offset = 0;
466 
467  validityRestriction->type = *(field + offset++);
468  switch (validityRestriction->type)
469  {
473  break;
478  break;
483  break;
487  break;
488  default:
491  break;
492  }
493 
494  return offset;
495 }
496 
497 quint64 decode_EcdsaSignature(uchar *field, EcdsaSignature_t *ecdsa)
498 {
499  quint64 offset = 0;
500 
501  offset += decode_EccPoint(field + offset, &ecdsa->r);
502  offset += decode_Opaque(field + offset, &ecdsa->s, 32);
503 
504  return offset;
505 }
506 
507 quint64 decode_Signature(uchar *field, Signature_t *signature)
508 {
509  quint64 offset = 0;
510 
511  signature->algorithm = *(field + offset++);
512  switch (signature->algorithm)
513  {
517  break;
518  default:
520  offset += decode_Opaque(field + offset, &signature->sign.choice.unknown_signature.signature);
521  break;
522  }
523 
524  return offset;
525 }
526 
528 {
529  quint64 offset = 0, currentOffsetCertificate, currentOffset, currentOffsetRestriction;
530 
531  certificate->version = *(field + offset++);
533  offset += decode_SignerInfo(field + offset, certificate->signer_info_certificate);
534  offset += decode_SubjectInfo(field + offset, &certificate->subject_info);
535 
536  int nbOctetSubjectAttr;
537  quint64 nbSubjectAttr = extractINTX(field + offset, &nbOctetSubjectAttr);
538 
539  offset += nbOctetSubjectAttr;
540 
541  certificate->subject_attributes.list.array = (SubjectAttribute_t**)calloc(1, sizeof *certificate->subject_attributes.list.array);
542  certificate->subject_attributes.list.count = 0;
543  certificate->subject_attributes.list.free = 0;
544  certificate->subject_attributes.list.size = 0;
545  for(currentOffsetCertificate = 0 ; currentOffsetCertificate < nbSubjectAttr ; cptSubjectAttr++, offset += currentOffset, currentOffsetCertificate += currentOffset)
546  {
547  currentOffset = decode_SubjectAttribute(field + offset, &subjAttr[cptSubjectAttr]);
549  (SubjectAttribute_t*)calloc(1, sizeof *certificate->subject_attributes.list.array[cptSubjectAttr]);
551  }
552 
553  int nbOctetValidityRestriction;
554  quint64 nbValidityRestriction = extractINTX(field + offset, &nbOctetValidityRestriction);
555 
556  offset += nbOctetValidityRestriction;
557 
558  certificate->validity_restrictions.list.array =
559  (ValidityRestriction_t**)calloc(1, sizeof *certificate->validity_restrictions.list.array);
560  certificate->validity_restrictions.list.count = 0;
561  certificate->validity_restrictions.list.free = 0;
562  certificate->validity_restrictions.list.size = 0;
563  for(currentOffsetRestriction = 0 ; currentOffsetRestriction < nbValidityRestriction ; cptValidityRestriction++, offset += currentOffset, currentOffsetRestriction += currentOffset)
564  {
565  currentOffset = decode_ValidityRestriction(field + offset, &validityRestriction[cptValidityRestriction]);
569  }
570 
571  offset += decode_Signature(field + offset, &certificate->signature_certificate);
572 
573  return offset;
574 }
575 
576 quint64 decode_SignerInfo(uchar *field, SignerInfo_t *signerInfo)
577 {
578  quint64 offset = 0, currentOffset;
579 
580  /* Certificate chain */
581  int nbOctetsCertificate;
582  quint64 nbCertificate, currentOffsetCertificate;
583 
584  signerInfo->type = *(field + offset++);
585  switch (signerInfo->type)
586  {
587  case SignerInfoType_self:
589  break;
592  offset += decode_HashedId8(field + offset, &signerInfo->signer_info.choice.certificate_digest_with_sha256.digest);
593  break;
596  signerInfo->signer_info.choice.certificate.certif = (Certificate_t*)calloc(1, sizeof *signerInfo->signer_info.choice.certificate.certif);
597  offset += decode_Certificate(field + offset, signerInfo->signer_info.choice.certificate.certif);
598  break;
600  nbCertificate = extractINTX(field + offset, &nbOctetsCertificate);
601 
602  offset += nbOctetsCertificate;
603 
605  signerInfo->signer_info.choice.certificate_chain.certificates.list.array =
606  (Certificate_t**)calloc(1, sizeof *signerInfo->signer_info.choice.certificate_chain.certificates.list.array);
607  signerInfo->signer_info.choice.certificate_chain.certificates.list.count = 0;
608  signerInfo->signer_info.choice.certificate_chain.certificates.list.free = 0;
609  signerInfo->signer_info.choice.certificate_chain.certificates.list.size = 0;
610 
611  for(currentOffsetCertificate = 0 ; currentOffsetCertificate < nbCertificate ; cptCertificate++, offset += currentOffset, currentOffsetCertificate += currentOffset)
612  {
613  currentOffset = decode_Certificate(field + offset, &certificate[cptCertificate]);
615  (Certificate_t*)calloc(1, sizeof *signerInfo->signer_info.choice.certificate_chain.certificates.list.array[cptCertificate]);
617  }
618  break;
621  signerInfo->signer_info.choice.certificate_digest_with_other_algorithm.algorithm = *(field + offset++);
622  offset += decode_HashedId8(field + offset, &signerInfo->signer_info.choice.certificate_digest_with_other_algorithm.digest);
623  break;
624  default:
626  offset += decode_Opaque(field + offset, &signerInfo->signer_info.choice.unknown_signer_info.info);
627  break;
628  }
629  return offset;
630 }
631 
632 quint64 decode_EncryptionParameters(uchar *field, EncryptionParameters_t *encParams)
633 {
634  quint64 offset = 0;
635 
636  encParams->symm_algorithm = (*field + offset++);
637  switch (encParams->symm_algorithm)
638  {
641  offset += decode_Opaque(field + offset, &encParams->encryption_parameters.choice.aes_128_ccm.nonce);
642  break;
643  default:
645  offset += decode_Opaque(field + offset, &encParams->encryption_parameters.choice.unknown_encryption_parameters.params);
646  break;
647  }
648 
649  return offset;
650 }
651 
653 {
654  quint64 offset = 0;
655 
656  offset += decode_HashedId8(field, &recipient->cert_id);
657  recipient->pk_encryption = *(field + offset++);
658  switch (recipient->pk_encryption)
659  {
663  break;
664  default:
667  break;
668  }
669 
670  return offset;
671 }
672 
674 {
675  int n;
676  quint64 headerLength = extractINTX(field + 1, &n), currentOffset, offset = 0;
677  uchar *payload = field;
678  SecuredHeader_t SecuredHeader_values;
679  SecuredHeader_values.secured_header_length = headerLength;
680 
681  /* Request unrecognized certificate */
682  int nbOctetsRequest;
683  quint64 nbRequest, currentOffsetRequest;
684 
685  /* Recipient info */
686  int nbOctetsRecipient;
687  quint64 nbRecipients, currentOffsetRecipients;
688 
689  SecuredHeader_values.header_fields.list.array = (HeaderField_t**)calloc(1, sizeof *SecuredHeader_values.header_fields.list.array);
690  SecuredHeader_values.header_fields.list.count = 0;
691  SecuredHeader_values.header_fields.list.free = 0;
692  SecuredHeader_values.header_fields.list.size = 0;
693 
694  SecuredHeader_values.protocol_version = *field;
695  n++;
696 
697  for( ; offset < headerLength ; cptHeaderField++)
698  {
699  headerField[cptHeaderField].type = *(field + offset + n);
700  offset++;
701 
702  switch (headerField[cptHeaderField].type) {
705  offset += decode_Time64(payload + offset + n, &headerField[cptHeaderField].header_field.choice.generation_time.generation_time_value);
706  break;
709  offset += decode_Time64WithStandardDeviation(payload + offset + n,
710  &headerField[cptHeaderField].header_field.choice.generation_time_with_standard_deviation.generation_time_with_standard_deviation_value);
711  break;
714  offset += decode_Time32(payload + offset + n, &headerField[cptHeaderField].header_field.choice.expiration.expiry_time);
715  break;
718  offset += decode_ThreeDLocation(payload + offset + n, &headerField[cptHeaderField].header_field.choice.generation_location.generation_location_value);
719  break;
721  nbRequest = extractINTX(payload + offset + n, &nbOctetsRequest);
722 
723  offset += nbOctetsRequest;
724 
727  (HashedId3_t**)calloc(1, sizeof *headerField[cptHeaderField].header_field.choice.request_unrecognized_certificate.digests.list.array);
731 
732  for(currentOffsetRequest = 0 ; currentOffsetRequest < nbRequest ; cptRequest++, offset += currentOffset, currentOffsetRequest += currentOffset)
733  {
734  currentOffset = decode_HashedId3(payload + offset + n, &hashedID3[cptRequest]);
736  (HashedId3_t*)calloc(1, sizeof *headerField[cptHeaderField].header_field.choice.request_unrecognized_certificate.digests.list.array[cptRequest]);
737  ASN_SEQUENCE_ADD(&headerField[cptHeaderField].header_field.choice.request_unrecognized_certificate, &hashedID3[cptRequest]);
738  }
739  break;
742  int nbOctetItsAid;
744  offset += nbOctetItsAid;
745  break;
748  offset += decode_SignerInfo(payload + offset + n, &headerField[cptHeaderField].header_field.choice.signer_info_header_field.signer);
749  break;
752  offset += decode_EncryptionParameters(payload + offset + n, &headerField[cptHeaderField].header_field.choice.encryption_parameters_header_field.enc_params);
753  break;
755  nbRecipients = extractINTX(payload + offset + n, &nbOctetsRecipient);
756 
757  offset += nbOctetsRecipient;
758 
761  (RecipientInfo_t**)calloc(1, sizeof *headerField[cptHeaderField].header_field.choice.recipient_info_header_field.recipients.list.array);
765 
766  for(currentOffsetRecipients = 0 ; currentOffsetRecipients < nbRecipients ; cptRecipients++, currentOffsetRecipients += currentOffset, offset += currentOffset)
767  {
768  currentOffset = decode_RecipientInfo(payload + offset + n, &recipient[cptRecipients]);
770  (RecipientInfo_t*)calloc(1, sizeof *headerField[cptHeaderField].header_field.choice.recipient_info_header_field.recipients.list.array[cptRecipients]);
771  ASN_SEQUENCE_ADD(&headerField[cptHeaderField].header_field.choice.recipient_info_header_field, &recipient[cptRecipients]);
772  }
773  break;
774  default:
776  offset += decode_Opaque(payload + offset + n, &headerField[cptHeaderField].header_field.choice.unknown_header_field.other_header);
777  break;
778  }
779  SecuredHeader_values.header_fields.list.array[cptHeaderField] = (HeaderField_t*)calloc(1, sizeof *SecuredHeader_values.header_fields.list.array[cptHeaderField]);
780  ASN_SEQUENCE_ADD(&SecuredHeader_values.header_fields, &headerField[cptHeaderField]);
781  }
782 
783  SecuredHeader_values.type = *(payload + offset + n);
784 
785  return SecuredHeader_values;
786 }
787 
789 {
790  SecureTrailer_t SecureTrailer_values;
791  int n;
792  quint64 trailerLength = extractINTX(field, &n);
793 
794  SecureTrailer_values.trailer_fields.list.array = (TrailerField_t**)calloc(1, sizeof *SecureTrailer_values.trailer_fields.list.array);
795  SecureTrailer_values.trailer_fields.list.count = 0;
796  SecureTrailer_values.trailer_fields.list.free = 0;
797  SecureTrailer_values.trailer_fields.list.size = 0;
798  SecureTrailer_values.secured_trailer_length = trailerLength;
799 
800  for(quint64 offset = 0 ; offset < trailerLength ; cptTrailerField++)
801  {
802  trailerField[cptTrailerField].type = *(field + offset + n);
803  offset++;
805  {
808  offset += decode_Signature(field + offset + n, &trailerField[cptTrailerField].trailer_field.choice.signature_trailer_field.sign);
809  break;
810  default:
812  offset += decode_Opaque(field + offset + n, &trailerField[cptTrailerField].trailer_field.choice.unknown_trailer_field.security_field);
813  break;
814  }
815  SecureTrailer_values.trailer_fields.list.array[cptTrailerField] = (TrailerField_t*)calloc(1, sizeof *SecureTrailer_values.trailer_fields.list.array[cptTrailerField]);
817  }
818 
819  return SecureTrailer_values;
820 }
struct ValidityRestriction::validity_restriction::ValidityRestriction__validity_restriction_u::time_start_and_duration time_start_and_duration
#define ASN_SEQUENCE_ADD(headptr, ptr)
quint64 decode_GeographicRegion(uchar *field, GeographicRegion_t *region)
decode_GeographicRegion Decode a GeographicRegion.
struct HeaderField::header_field::HeaderField__header_field_u::request_unrecognized_certificate::digests digests
quint64 decode_ItsAidSsp(uchar *field, ItsAidSsp_t *ssp)
decode_ItsAidSsp Decode an ItsAidSsp.
quint64 extractINTX(uchar *field, int *n)
extractINTX Decode an IntX.
RegionType_t region_type
union HeaderField::header_field::HeaderField__header_field_u choice
quint64 decode_TwoDLocation(uchar *field, TwoDLocation_t *location)
decode_TwoDLocation Decode a TwoDLocation.
long IntX_t
Definition: IntX.h:21
static IntX_t intx[NSECURE_FIELDS]
quint64 decode_RectangularRegion(uchar *field, RectangularRegion_t *region)
decode_RectangularRegion Decode a RectangularRegion.
#define NSECURE_FIELDS
IntX_t secured_trailer_length
Definition: SecureTrailer.h:28
HeaderFieldType_t type
Definition: HeaderField.h:53
static int cptRequest
quint64 decode_Signature(uchar *field, Signature_t *signature)
decode_Signature Decode a Signature.
struct SignerInfo * signer_info_certificate
Definition: Certificate.h:33
Usefull functions and declarations.
union EncryptionParameters::encryption_parameters::EncryptionParameters__encryption_parameters_u choice
quint64 decode_SubjectInfo(uchar *field, SubjectInfo_t *info)
decode_SubjectInfo Decode a SubjectInfo.
quint64 decode_UINT16(uchar *field, UINT16_t *uint16)
decode_UINT16 Decode an UINT16.
quint64 decode_INT32(uchar *field, INT32_t *int32)
decode_INT32 Decode an Int32.
static int cptRecipients
Security layer decoder.
static TrailerField_t trailerField[NSECURE_FIELDS]
PublicKeyAlgorithm_t pk_encryption
Definition: RecipientInfo.h:35
sign_PR present
Definition: Signature.h:35
union SignerInfo::signer_info::SignerInfo__signer_info_u choice
static Certificate_t certificate[NSECURE_FIELDS]
SignerInfoType_t type
Definition: SignerInfo.h:43
signer_info_PR present
Definition: SignerInfo.h:45
struct EccPoint::ecc_point::EccPoint__ecc_point_u::uncompressed uncompressed
quint64 decode_ValidityRestriction(uchar *field, ValidityRestriction_t *validityRestriction)
decode_ValidityRestriction Decode a ValidityRestriction.
static int cptSsp
struct SignerInfo::signer_info::SignerInfo__signer_info_u::certificate_chain certificate_chain
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::its_aid_ssp_list its_aid_ssp_list
UINT32_t Time32_t
Definition: Time32.h:21
quint64 decode_HashedId(uchar *field, OCTET_STRING_t *hash, int length)
decode_HashedId Decode an HashedId.
quint64 decode_RecipientInfo(uchar *field, RecipientInfo_t *recipient)
decode_RecipientInfo Decode a RecipientInfo.
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::recontruction_value recontruction_value
struct EccPoint::ecc_point::EccPoint__ecc_point_u::unknown_ecc_point unknown_ecc_point
static int cptValidityRestriction
static RectangularRegion_t rectangularRegion[NSECURE_FIELDS]
struct HeaderField::header_field::HeaderField__header_field_u::request_unrecognized_certificate request_unrecognized_certificate
quint64 decode_Time32(uchar *field, Time32_t *time)
decode_Time32 Decode a Time32.
quint64 decode_IdentifiedRegion(uchar *field, IdentifiedRegion_t *id)
decode_IdentifiedRegion Decode a IdentifiedRegion.
struct PublicKey::public_key::PublicKey__public_key_u::ecdsa_nistp256_with_sha256_public_key ecdsa_nistp256_with_sha256_public_key
struct GeographicRegion::geographic_region::GeographicRegion__geographic_region_u::circle circle
quint64 decode_Certificate(uchar *field, Certificate_t *certificate)
decode_Certificate Decode a Certificate.
Opaque_t service_specific_permissions
Definition: ItsAidSsp.h:25
IntX_t its_aid_ssp
Definition: ItsAidSsp.h:24
long UINT16_t
Definition: UINT16.h:21
TrailerFieldType_t type
Definition: TrailerField.h:33
int nbX(uchar v, quint64 *ret)
nbX Count the number of bytes used by the IntX.
UINT8_t version
Definition: Certificate.h:32
union SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u choice
static int cptRectangularRegion
static RecipientInfo_t recipient[NSECURE_FIELDS]
quint64 decode_Duration(uchar *field, Duration_t *duration)
decode_Duration Decode a Duration.
union GeographicRegion::geographic_region::GeographicRegion__geographic_region_u choice
INT32_t latitude
Definition: TwoDLocation.h:23
struct GeographicRegion::geographic_region geographic_region
struct SubjectAttribute::subject_attribute subject_attribute
ValidityRestrictionType_t type
EccPointType_t type
Definition: EccPoint.h:35
Definition: Opaque.h:23
quint64 decode_Opaque(uchar *field, Opaque_t *opaque, int length)
decode_Opaque Decode an Opaque.
struct TrailerField::trailer_field trailer_field
struct Certificate::validity_restrictions validity_restrictions
quint64 decode_ThreeDLocation(uchar *field, ThreeDLocation_t *location)
decode_ThreeDLocation Decode a ThreeDLocation.
struct SignerInfo::signer_info::SignerInfo__signer_info_u::unknown_signer_info unknown_signer_info
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::verification_key verification_key
struct ValidityRestriction::validity_restriction::ValidityRestriction__validity_restriction_u::unknown_validity_restriction unknown_validity_restriction
struct Certificate::subject_attributes subject_attributes
struct HeaderField::header_field::HeaderField__header_field_u::recipient_info_header_field::recipients recipients
TwoDLocation_t center
static int cptIntX
struct RecipientInfo::recipient_info::RecipientInfo__recipient_info_u::unknown_recipient_info unknown_recipient_info
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::its_aid_list::its_aid its_aid
IntX_t length
Definition: Opaque.h:24
union PublicKey::public_key::PublicKey__public_key_u choice
struct ValidityRestriction::validity_restriction validity_restriction
struct SignerInfo::signer_info::SignerInfo__signer_info_u::certificate certificate
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::its_aid_ssp_list::its_aid_ssp its_aid_ssp
quint64 decode_EncryptionParameters(uchar *field, EncryptionParameters_t *encParams)
decode_EncryptionParameters Decode an EncryptionParameters.
struct EncryptionParameters::encryption_parameters::EncryptionParameters__encryption_parameters_u::aes_128_ccm aes_128_ccm
union ValidityRestriction::validity_restriction::ValidityRestriction__validity_restriction_u choice
SubjectAttributeType_t type
quint64 decode_HashedId3(uchar *field, HashedId3_t *hash)
decode_HashedId3 Decode an HashedId3.
UINT16_t region_identifier
struct Signature::sign::Signature__sign_u::unknown_signature unknown_signature
static int cptSubjectAttr
struct SignerInfo::signer_info::SignerInfo__signer_info_u::certificate_chain::certificates certificates
long INT32_t
Definition: INT32.h:21
static int cptTwoDLocation
static HeaderField_t headerField[NSECURE_FIELDS]
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::its_aid_list its_aid_list
struct GeographicRegion::geographic_region::GeographicRegion__geographic_region_u::rectangle::rectangular_region rectangular_region
SubjectType_t subject_type
Definition: SubjectInfo.h:24
quint64 decode_Time64WithStandardDeviation(uchar *field, Time64WithStandardDeviation_t *time)
decode_Time64WithStandardDeviation Decode a Time64WithStandardDeviation.
quint64 decode_SubjectAttribute(uchar *field, SubjectAttribute_t *subject)
decode_SubjectAttribute Decode a SubjectAttribute.
struct SecuredHeader::header_fields header_fields
quint64 decode_SignerInfo(uchar *field, SignerInfo_t *signerInfo)
decode_SignerInfo Decode a SignerInfo.
struct ValidityRestriction::validity_restriction::ValidityRestriction__validity_restriction_u::time_end time_end
quint64 decode_PublicKey(uchar *field, PublicKey_t *key)
decode_PublicKey Decode a PublicKey.
quint64 decode_EcdsaSignature(uchar *field, EcdsaSignature_t *ecdsa)
decode_EcdsaSignature Decode a EcdsaSignature.
IntX_t secured_header_length
Definition: SecuredHeader.h:31
INT32_t longitude
Definition: TwoDLocation.h:24
static SubjectAttribute_t subjAttr[NSECURE_FIELDS]
quint64 decode_EciesEncryptedKey(uchar *field, EciesEncryptedKey_t *ecies)
decode_EciesEncryptedKey Decode an EciesEncryptedKey.
quint64 decode_HashedId8(uchar *field, HashedId8_t *hash)
decode_HashedId8 Decode an HashedId8.
struct PublicKey::public_key public_key
struct Signature::sign sign
quint64 decode_SubjectAssurance(uchar *field, SubjectAssurance_t *subject)
decode_SubjectAssurance Decode a SubjectAssurance.
struct SignerInfo::signer_info signer_info
Opaque_t x
Definition: EccPoint.h:36
union RecipientInfo::recipient_info::RecipientInfo__recipient_info_u choice
struct PublicKey::public_key::PublicKey__public_key_u::unknown_public_key unknown_public_key
Opaque_t elevation
struct SignerInfo::signer_info::SignerInfo__signer_info_u::certificate_digest_with_sha256 certificate_digest_with_sha256
SecuredHeader_t decode_SecuredHeader(uchar *field)
decode_SecuredHeader Decode a SecuredHeader.
struct GeographicRegion::geographic_region::GeographicRegion__geographic_region_u::id id
Signature_t signature_certificate
Definition: Certificate.h:47
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::assurance_level assurance_level
PublicKeyAlgorithm_t algorithm
Definition: PublicKey.h:35
SecureTrailer_t decode_SecureTrailer(uchar *field)
decode_SecureTrailer Decode a SecureTrailer.
struct RecipientInfo::recipient_info::RecipientInfo__recipient_info_u::ecies_nistp256_recipient_info ecies_nistp256_recipient_info
TwoDLocation_t southeast
static int cptTrailerField
public_key_PR present
Definition: PublicKey.h:37
struct Signature::sign::Signature__sign_u::ecdsa_nistp256_with_sha256_signature ecdsa_nistp256_with_sha256_signature
struct SignerInfo::signer_info::SignerInfo__signer_info_u::certificate_digest_with_other_algorithm certificate_digest_with_other_algorithm
static int cptHeaderField
struct GeographicRegion::geographic_region::GeographicRegion__geographic_region_u::polygon polygon
struct ValidityRestriction::validity_restriction::ValidityRestriction__validity_restriction_u::region region
struct GeographicRegion::geographic_region::GeographicRegion__geographic_region_u::rectangle rectangle
Opaque_t subject_name
Definition: SubjectInfo.h:25
OCTET_STRING_t value
Definition: Opaque.h:25
PublicKeyAlgorithm_t algorithm
Definition: Signature.h:33
uint8_t * buf
Definition: OCTET_STRING.h:15
quint64 decode_EccPoint(uchar *field, EccPoint_t *point)
decode_EccPoint Decode an EccPoint.
static ValidityRestriction_t validityRestriction[NSECURE_FIELDS]
quint64 decode_PolygonalRegion(uchar *field, PolygonalRegion_t *polygon)
decode_PolygonalRegion Decode a PolygonalRegion.
struct EccPoint::ecc_point ecc_point
union Signature::sign::Signature__sign_u choice
static int cptCertificate
static ItsAidSsp_t ssp[NSECURE_FIELDS]
SubjectInfo_t subject_info
Definition: Certificate.h:34
struct GeographicRegion::geographic_region::GeographicRegion__geographic_region_u::unknown_geographic_region unknown_geographic_region
quint64 decode_CircularRegion(uchar *field, CircularRegion_t *region)
decode_CircularRegion Decode a CircularRegion.
union EccPoint::ecc_point::EccPoint__ecc_point_u choice
struct HeaderField::header_field::HeaderField__header_field_u::its_aid_header_field its_aid_header_field
quint64 decode_Time64(uchar *field, Time64_t *time)
decode_Time64 Decode a Time64.
struct EncryptionParameters::encryption_parameters::EncryptionParameters__encryption_parameters_u::unknown_encryption_parameters unknown_encryption_parameters
SymmetricAlgorithm_t symm_algorithm
struct PublicKey::public_key::PublicKey__public_key_u::ecies_nistp256_public_key ecies_nistp256_public_key
static HashedId3_t hashedID3[NSECURE_FIELDS]
UINT16_t Duration_t
Definition: Duration.h:21
struct HeaderField::header_field header_field
EccPoint_t r
struct HeaderField::header_field::HeaderField__header_field_u::recipient_info_header_field recipient_info_header_field
HashedId8_t cert_id
Definition: RecipientInfo.h:34
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::unknown_subject_attribute unknown_subject_attribute
header_field_PR present
Definition: HeaderField.h:55
struct EncryptionParameters::encryption_parameters encryption_parameters
struct RecipientInfo::recipient_info recipient_info
PayloadType_t type
Definition: SecuredHeader.h:38
struct ValidityRestriction::validity_restriction::ValidityRestriction__validity_restriction_u::time_start_and_end time_start_and_end
struct SubjectAttribute::subject_attribute::SubjectAttribute__subject_attribute_u::encryption_key encryption_key
ecc_point_PR present
Definition: EccPoint.h:38
struct SecureTrailer::trailer_fields trailer_fields
static TwoDLocation_t twoDLocation[NSECURE_FIELDS]
trailer_field_PR present
Definition: TrailerField.h:35
TwoDLocation_t northwest
UINT8_t protocol_version
Definition: SecuredHeader.h:30