LibItsPki_Functions.ttcn 137 KB
Newer Older
Yann Garcia's avatar
Yann Garcia committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 *  @author   ETSI / STF544
 *  @version  $URL$
 *            $Id$
 *  @desc     Module containing functions for ITS PKI ATS
 *  @copyright   ETSI Copyright Notification
 *               No part may be reproduced except as authorized by written permission.
 *               The copyright and the foregoing restriction extend to reproduction in all media.
 *               All rights reserved.
 *
 */
module LibItsPki_Functions {
    
  // LibCommon
  import from LibCommon_Time all;
  import from LibCommon_VerdictControl all;
  import from LibCommon_Sync all;
  import from LibCommon_BasicTypesAndValues all;
  import from LibCommon_DataStrings all;
  
  // LibIts
  import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
  import from IEEE1609dot2 language "ASN.1:1997" all;
  import from EtsiTs102941BaseTypes language "ASN.1:1997" all;
  import from EtsiTs102941TypesEnrolment language "ASN.1:1997" all;
26
27
  import from EtsiTs102941TypesAuthorization language "ASN.1:1997" all;
  import from EtsiTs102941TypesAuthorizationValidation language "ASN.1:1997" all;
28
  import from EtsiTs102941MessagesCa language "ASN.1:1997" all;
Yann Garcia's avatar
Yann Garcia committed
29
30
31
32
33
  import from EtsiTs103097Module language "ASN.1:1997" all;
  import from ITS_Container language "ASN.1:1997" all;
  import from CAM_PDU_Descriptions language "ASN.1:1997" all;
  
  // LibItsCommon
garciay's avatar
garciay committed
34
  import from LibItsCommon_TypesAndValues all;
Yann Garcia's avatar
Yann Garcia committed
35
36
37
  import from LibItsCommon_Functions all;
  import from LibItsCommon_ASN1_NamedNumbers all;
  import from LibItsCommon_Pixits all;
garciay's avatar
garciay committed
38
  
39
40
41
  // LibItsGeoNetworking
  import from LibItsGeoNetworking_Pixits all;
  
Yann Garcia's avatar
Yann Garcia committed
42
43
44
45
  // LibItsSecurity
  import from LibItsSecurity_TypesAndValues all;
  import from LibItsSecurity_Templates all;
  import from LibItsSecurity_Functions all;
46
  import from LibItsSecurity_Pics all;
Yann Garcia's avatar
Yann Garcia committed
47
  import from LibItsSecurity_Pixits all;
48
  import from LibItsSecurity_TestSystem all;
garciay's avatar
garciay committed
49
  
Yann Garcia's avatar
Yann Garcia committed
50
51
  // LibItsHttp
  import from LibItsHttp_TypesAndValues all;
52
  import from LibItsHttp_Templates all;
Yann Garcia's avatar
Yann Garcia committed
53
54
  import from LibItsHttp_BinaryTemplates all;
  import from LibItsHttp_Functions all;
Yann Garcia's avatar
Yann Garcia committed
55
  import from LibItsHttp_TestSystem all;
garciay's avatar
garciay committed
56
  
Yann Garcia's avatar
Yann Garcia committed
57
  // LibItsPki
garciay's avatar
garciay committed
58
  import from LibItsPki_TypesAndValues all;
Yann Garcia's avatar
Yann Garcia committed
59
  import from LibItsPki_Templates all;
garciay's avatar
garciay committed
60
  import from LibItsPki_Pics all;
garciay's avatar
garciay committed
61
  import from LibItsPki_Pixits all;
Yann Garcia's avatar
Yann Garcia committed
62
  import from LibItsPki_TestSystem all;
garciay's avatar
garciay committed
63
64
  
  group pkiConfigurationFunctions {
Yann Garcia's avatar
Yann Garcia committed
65
     
Yann Garcia's avatar
Yann Garcia committed
66
     /**
67
     * @desc    Setups default configuration
Yann Garcia's avatar
Yann Garcia committed
68
     * @param   p_certificate_id The certificate identifier the TA shall use in case of secured IUT
Yann Garcia's avatar
Yann Garcia committed
69
70
     */
    function f_cfHttpUp(
garciay's avatar
garciay committed
71
                        in charstring p_ea_certificate_id := "CERT_TS_A_EA", // TODO Use a constant
72
                        in charstring p_aa_certificate_id := "CERT_TS_A_AA"
garciay's avatar
garciay committed
73
                        ) runs on ItsPkiHttp /* TITAN TODO: system ItsPkiHttpSystem */ {
Yann Garcia's avatar
Yann Garcia committed
74
75
76
77
78
79
80
81

      if (LibItsPki_Pics.PICS_MULTIPLE_END_POINT == false) {
        map(self:httpPort, system:httpPort);
      } else {
        map(self:httpEcPort, system:httpEcPort);
        map(self:httpAtVPort, system:httpAtVPort);
        map(self:httpAtPort, system:httpAtPort);
      }
Yann Garcia's avatar
Yann Garcia committed
82
      f_connect4SelfOrClientSync();
83

84
85
86
      f_initialiseSecuredMode(p_ea_certificate_id, p_aa_certificate_id); // TODO To be removed???

      // Setup EA certificate shared with PKI EA entity
garciay's avatar
garciay committed
87
      f_readCertificate(p_ea_certificate_id, vc_eaCertificate);
88
89
90
91
      //      f_readSigningKey(p_ea_certificate_id, vc_eaPrivateKey); // TODO To be removed
      //      f_readCertificate(p_aa_certificate_id, vc_ecCertificate); // TODO To be removed
      //      f_readSigningKey(p_aa_certificate_id, vc_ecPrivateKey); // TODO To be removed
      //      f_readEncryptingKey(p_ea_certificate_id, vc_eaPrivateEncKey); // TODO To be removed
garciay's avatar
garciay committed
92
      f_getCertificateDigest(p_ea_certificate_id, vc_eaHashedId8);
93
      f_getCertificateHash(p_ea_certificate_id, vc_eaWholeHash);
94
95
96
97
98
99
100
101
102
      
      // Setup AA certificate shared with PKI AA entity
      f_readCertificate(p_aa_certificate_id, vc_aaCertificate);
      f_getCertificateDigest(p_aa_certificate_id, vc_aaHashedId8);
      f_getCertificateHash(p_aa_certificate_id, vc_aaWholeHash);
      log("vc_aaHashedId8= ", vc_aaHashedId8);
      log("vc_aaWholeHash= ", vc_aaWholeHash);
      //      f_readCertificate(p_peerCertificateId, vc_peerEaCertificate); // TODO To be removed
      //      f_getCertificateHash(p_peerCertificateId, vc_eaPeerWholeHash); // TODO To be removed
Yann Garcia's avatar
Yann Garcia committed
103
104
105
106
107
108
109
110

      if (PICS_MULTIPLE_END_POINT == false) {
        activate(a_default_pki_http());
      } else {
        activate(a_default_pki_http_ec());
        activate(a_default_pki_http_atv());
        activate(a_default_pki_http_at());
      }
Yann Garcia's avatar
Yann Garcia committed
111
    } // End of function f_cfHttpUp
112
    
113
    function f_cfUp_itss(
Yann Garcia's avatar
Yann Garcia committed
114
                         in charstring p_certificate_id := "CERT_TS_A_EA" // TODO Use a constant
115
116
117
                         ) runs on ItsPkiItss /* TITAN TODO: system ItsPkiItssSystem */ {
      
      map(self:geoNetworkingPort, system:geoNetworkingPort);
118
      map(self:utPort, system:utPort);
Yann Garcia's avatar
Yann Garcia committed
119
      //map(self:acPort, system:acPort);
120
      
121
122
      f_initializeState();
      
Yann Garcia's avatar
Yann Garcia committed
123
      // activate(a_default_pki()); TOTO Defualt from geoNet
124
    } // End of function f_cfUp_itss
125

Yann Garcia's avatar
Yann Garcia committed
126
127
128
129
    /**
     * @desc    Deletes default configuration 
     */
    function f_cfHttpDown() runs on ItsPkiHttp /* TITAN TODO: system ItsPkiHttpSystem */ {
Yann Garcia's avatar
Yann Garcia committed
130
131
132
133
134
135
136
      if (PICS_MULTIPLE_END_POINT == false) {
        unmap(self:httpPort, system:httpPort);
      } else {
        unmap(self:httpEcPort, system:httpEcPort);
        unmap(self:httpAtVPort, system:httpAtVPort);
        unmap(self:httpAtPort, system:httpAtPort);
      }
Yann Garcia's avatar
Yann Garcia committed
137
      f_disconnect4SelfOrClientSync();
138
      f_uninitialiseSecuredMode();
Yann Garcia's avatar
Yann Garcia committed
139
140
    } // End of function f_cfHttpDown
    
141
142
143
144
145
    /**
     * @desc    Deletes default configuration 
     */
    function f_cfDown_itss() runs on ItsPkiItss /* TITAN TODO: system ItsPkiItssSystem */ {
      unmap(self:geoNetworkingPort, system:geoNetworkingPort);
146
      unmap(self:utPort, system:utPort);
Yann Garcia's avatar
Yann Garcia committed
147
      //unmap(self:acPort, system:acPort);
148
149
150
      
    } // End of function f_cfDown
    
Yann Garcia's avatar
Yann Garcia committed
151
152
153
    /**
     * @desc Initialise secure mode if required
     */
154
    function f_initialiseSecuredMode(
Yann Garcia's avatar
Yann Garcia committed
155
                                     in charstring p_certificate_id  := "CERT_TS_A_EA", // TODO Use a constant
156
157
                                     in charstring p_peerCertificateId := "CERT_IUT_A_EA"
                                     ) runs on ItsSecurityBaseComponent {
Yann Garcia's avatar
Yann Garcia committed
158
159
160
      // Local variables
      
      // Load certificates
161
      if(not(f_loadCertificates(PX_IUT_SEC_CONFIG_NAME))) {
Yann Garcia's avatar
Yann Garcia committed
162
        log("*** INFO: TEST CASE NOW STOPPING ITSELF! ***");
163
        setverdict(inconc);
Yann Garcia's avatar
Yann Garcia committed
164
165
166
        stop;
      }
      
Yann Garcia's avatar
Yann Garcia committed
167
      //      f_prepareCertificates(p_certificate_id, vc_aaCertificate, vc_atCertificate);
Yann Garcia's avatar
Yann Garcia committed
168
    } // End of function f_initialiseSecuredMode()
169
170
    
    function f_uninitialiseSecuredMode() runs on ItsSecurityBaseComponent {
Yann Garcia's avatar
Yann Garcia committed
171
172
      f_unloadCertificates();
    } // End of function f_uninitialiseSecuredMode()
173
174
175
176
177
178
179
180
181
182
183
184
    
    function f_initializeState() runs on ItsPkiItss {
      var Oct8 v_hashedId8ToBeUsed := f_setupIutCertificate(vc_hashedId8ToBeUsed);

      f_utInitializeIut(UtPkiInitialize: { v_hashedId8ToBeUsed } );

      f_sleep(PX_NEIGHBOUR_DISCOVERY_DELAY);
      
      //      f_acLoadScenario(p_scenario);
      //      f_acStartScenario();
    }
    
Yann Garcia's avatar
Yann Garcia committed
185
  } // End of pkiConfigurationFunctions
garciay's avatar
garciay committed
186

187
188
189
  group ut_port {

    function f_utInitializeIut(template (value) UtPkiInitialize p_init) runs on ItsPkiItss {
Yann Garcia's avatar
Yann Garcia committed
190
      timer tc_wait := PX_TAC;
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
      
      utPort.send(p_init);
      tc_wait.start;
      alt {
        [] utPort.receive(UtPkiResults: { utPkiInitializeResult := true }) {
          tc_wait.stop;
          log("*** f_utInitializeIut: INFO: IUT initialized ***");
        }
        [] utPort.receive {
          tc_wait.stop;
          log("*** f_utInitializeIut: INFO: IUT could not be initialized ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_wait.timeout {
          log("*** f_utInitializeIut: INFO: IUT could not be initialized in time ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      }
      
    } // End of function f_utInitializeIut
    
    function f_sendUtTriggerPrimitive(
213
                                      in octetstring p_canonical_id,
Yann Garcia's avatar
Yann Garcia committed
214
                                      in Oct1 p_enc_algorithm,
215
                                      in octetstring p_private_key,
Yann Garcia's avatar
Yann Garcia committed
216
217
                                      in octetstring p_public_key_compressed,
                                      in integer p_compressed_mode
218
219
220
221
                                      ) runs on ItsPkiItss {
      var TriggerEnrolmentRequest v_ut_trigger_enrolment_request;
      var octetstring v_compressed_public_key;

Yann Garcia's avatar
Yann Garcia committed
222
223
      if (p_compressed_mode == 2) { // TODO v_compressed_public_key := int2oct(p_compressed_mode, 1) & p_public_key_compressed?
        v_compressed_public_key := '02'O & p_public_key_compressed;
224
      } else {
Yann Garcia's avatar
Yann Garcia committed
225
        v_compressed_public_key := '03'O & p_public_key_compressed;
226
227
      }
      
Yann Garcia's avatar
Yann Garcia committed
228
      v_ut_trigger_enrolment_request := { p_canonical_id, p_enc_algorithm, p_private_key, v_compressed_public_key };
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
      utPort.send(UtPkiTrigger: { triggerEnrolmentRequest := v_ut_trigger_enrolment_request });
      tc_ac.start;
      alt {
        [] utPort.receive(UtPkiResults: { utPkiTriggerResult := true }) {
          tc_ac.stop;
        }
        [] utPort.receive(UtPkiResults: { utPkiTriggerResult := false }) {
          tc_ac.stop;
          log("*** f_sendUtTriggerPrimitive: ERROR: Received unexpected message ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_ac.timeout {
          log("*** f_sendAcPkiPrimitive: ERROR: Timeout while waiting for adapter control event result ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      } // End of 'alt' statement
    } // End of function f_sendUtTriggerPrimitive
    
  } // End of group ut_port

249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
  group helpers {

    function f_generate_key_pair(
                                 out octetstring p_private_key,
                                 out octetstring p_public_key_x,
                                 out octetstring p_public_key_y,
                                 out octetstring p_public_key_compressed,
                                 out integer p_compressed_mode
                                 ) return boolean {
      if (PX_EC_ALG == e_nist_p256) {
        f_generate_key_pair_nistp256(p_private_key, p_public_key_x, p_public_key_y, p_public_key_compressed, p_compressed_mode);
      } else if (PX_EC_ALG == e_brainpool_p256_r1) {
        f_generate_key_pair_brainpoolp256(p_private_key, p_public_key_x, p_public_key_y, p_public_key_compressed, p_compressed_mode);
      } else {
        // error
        return false;
      }

      return true;
    }

    function f_signWithEcdsa(
                             in octetstring p_toBeSignedSecuredMessage,
                             in octetstring p_certificateIssuer,
                             in octetstring p_privateKey
                             ) return octetstring {
      if (PX_VE_ALG == e_nist_p256) {
        return f_signWithEcdsaNistp256WithSha256(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
      } else if (PX_VE_ALG == e_brainpool_p256_r1) {
        return f_signWithEcdsaBrainpoolp256WithSha256(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
      } else if (PX_VE_ALG == e_brainpool_p384_r1) {
        return f_signWithEcdsaBrainpoolp384WithSha384(p_toBeSignedSecuredMessage, p_certificateIssuer, p_privateKey);
      }
      
      return ''O;
    }
    
  } // End of group helpers
  
Yann Garcia's avatar
Yann Garcia committed
288
  group http { // TODO Split into EnnerEc, Authorization & AuthorizationValidation
289

290
    function f_http_build_inner_ec_request( // TODO Cleanup parameters
garciay's avatar
garciay committed
291
                                           out octetstring p_private_key,
Yann Garcia's avatar
Yann Garcia committed
292
293
                                           out octetstring p_public_key_compressed,
                                           out integer p_compressed_mode,
294
295
296
297
298
                                           out Oct16 p_aes_sym_key,
                                           out Oct16 p_encrypted_sym_key,
                                           out Oct16 p_authentication_vector,
                                           out Oct12 p_nonce,
                                           out octetstring p_salt,
garciay's avatar
garciay committed
299
                                           out Ieee1609Dot2Data p_ieee1609dot2_signed_and_encrypted_data,
300
                                           out Oct32 p_request_hash
garciay's avatar
garciay committed
301
                                           ) runs on ItsPkiHttp {
302
303
      var InnerEcRequest v_inner_ec_request;
      var Ieee1609Dot2Data v_inner_ec_request_signed_for_pop;
garciay's avatar
garciay committed
304
305
306
      var octetstring v_public_enc_key;
      var integer v_compressed_enc_key_mode;
      var boolean v_ret_code;
Yann Garcia's avatar
Yann Garcia committed
307
308

      log(">>> f_http_build_inner_ec_request");
Yann Garcia's avatar
Yann Garcia committed
309
      if (f_generate_inner_ec_request(p_private_key, p_public_key_compressed, p_compressed_mode, v_inner_ec_request) == false) {
Yann Garcia's avatar
Yann Garcia committed
310
        log("*** f_http_build_inner_ec_request: ERROR: Failed to generate InnerEcRequest ***");
311
312
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
Yann Garcia's avatar
Yann Garcia committed
313
314
315
      log ("f_http_build_enrolment_request: EC verification private key: ", p_private_key);
      log ("f_http_build_enrolment_request: EC verification public compressed key: ", p_public_key_compressed);
      log ("f_http_build_enrolment_request: EC verification public compressed mode: ", p_compressed_mode);
316
317
      // Generate InnerEcRequestSignedForPoP
      if (f_generate_inner_ec_request_signed_for_pop(p_private_key, v_inner_ec_request, v_inner_ec_request_signed_for_pop) == false) {
Yann Garcia's avatar
Yann Garcia committed
318
        log("*** f_http_build_inner_ec_request: ERROR: Failed to generate InnerEcRequestSignedForPop ***");
319
320
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
321
322
      log("v_inner_ec_request_signed_for_pop= ", v_inner_ec_request_signed_for_pop);
      
323
      // Secure InnerEcRequestSignedForPoP message
garciay's avatar
garciay committed
324
325
326
327
      if (f_extract_enc_key(vc_eaCertificate, v_public_enc_key, v_compressed_enc_key_mode) == false) {
        log("*** f_http_build_inner_ec_request: ERROR: Non canonical EA certificate ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
328
329
330
331
      if (PICS_SEC_FIXED_KEYS) { // Debug mode: Use fixed values
        v_public_enc_key := 'DD4F6B0DF57C6E3BD0E32B565CACA1D858CEB08A5C2BBAB2C23E203C6DE697FF'O;
        v_compressed_enc_key_mode := 0;
      }
garciay's avatar
garciay committed
332
333
      log("*** f_http_build_inner_ec_request: Public encryption key: ", v_public_enc_key);
      log("*** f_http_build_inner_ec_request: Public encryption key comp: ", v_compressed_enc_key_mode);
334
      p_salt := vc_eaWholeHash;
335
      if (PICS_SECPKI_REENROLMENT == false) { // This is the first enrolment, we used Factory keys
336
        v_ret_code := f_build_pki_secured_request_message_signed_with_pop(PICS_ITS_S_SIGN_NITSP256_PRIVATE_KEY, valueof(m_signerIdentifier_self), vc_eaHashedId8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_inner_ec_request_signed_for_pop(v_inner_ec_request_signed_for_pop))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash);
garciay's avatar
garciay committed
337
      } else { // We use last valid EC certificate
Yann Garcia's avatar
Yann Garcia committed
338
339
        var Oct32 v_ec_private_key := PX_EC_PRIVATE_KEY;
        var HashedId8 v_ec_hashed_id8 := PX_EC_HASHED_ID8;
340
        // Retrieve EC certificate from the first enrolment
341
        v_ret_code := f_build_pki_secured_request_message_signed_with_pop(v_ec_private_key, valueof(m_signerIdentifier_digest(v_ec_hashed_id8)), v_ec_hashed_id8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_inner_ec_request_signed_for_pop(v_inner_ec_request_signed_for_pop))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash);
garciay's avatar
garciay committed
342
343
      }
      if (v_ret_code == false) {
Yann Garcia's avatar
Yann Garcia committed
344
        log("*** f_http_build_inner_ec_request: ERROR: Failed to generate InnerEcRequestSignedForPop ***");
345
346
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
Yann Garcia's avatar
Yann Garcia committed
347
348
      log("*** f_http_build_inner_ec_request: p_ieee1609dot2_signed_and_encrypted_data= ", p_ieee1609dot2_signed_and_encrypted_data);
      log("*** f_http_build_inner_ec_request: p_request_hash= ", p_request_hash);
Yann Garcia's avatar
Yann Garcia committed
349
    } // End of function f_http_build_inner_ec_request
350

351
352
    function f_http_build_invalid_enrolment_request(
                                                    out octetstring p_private_key,
Yann Garcia's avatar
Yann Garcia committed
353
354
                                                    out octetstring p_public_key_compressed,
                                                    out integer p_compressed_mode,
355
356
357
358
359
                                                    out Oct16 p_aes_sym_key,
                                                    out Oct16 p_encrypted_sym_key,
                                                    out Oct16 p_authentication_vector,
                                                    out Oct12 p_nonce,
                                                    out octetstring p_salt,
360
                                                    out Ieee1609Dot2Data p_ieee1609dot2_signed_and_encrypted_data,
361
                                                    out Oct32 p_request_hash
362
363
364
                                                    ) runs on ItsPkiHttp {
      var InnerEcRequest v_inner_ec_request;
      var Ieee1609Dot2Data v_inner_ec_request_signed_for_pop;
garciay's avatar
garciay committed
365
366
367
      var octetstring v_public_enc_key;
      var integer v_compressed_enc_key_mode;
      var boolean v_ret_code;
368
      
Yann Garcia's avatar
Yann Garcia committed
369
      if (f_generate_inner_ec_request(p_private_key, p_public_key_compressed, p_compressed_mode, v_inner_ec_request) == false) {
370
371
372
        log("*** f_http_build_invalid_enrolment_request: ERROR: Failed to generate InnerEcRequest ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
Yann Garcia's avatar
Yann Garcia committed
373
374
375
      log ("f_http_build_invalid_enrolment_request: EC verification private key: ", p_private_key);
      log ("f_http_build_invalid_enrolment_request: EC verification public compressed key: ", p_public_key_compressed);
      log ("f_http_build_invalid_enrolment_request: EC verification public compressed mode: ", p_compressed_mode);
376
377
378
379
380
      // Generate InnerEcRequestSignedForPoP
      if (f_generate_inner_ec_request_signed_for_pop(p_private_key, v_inner_ec_request, v_inner_ec_request_signed_for_pop) == false) {
        log("*** f_http_build_invalid_enrolment_request: ERROR: Failed to generate InnerEcRequestSignedForPop ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
Yann Garcia's avatar
Yann Garcia committed
381
      log("f_http_build_invalid_enrolment_request: v_inner_ec_request_signed_for_pop= ", v_inner_ec_request_signed_for_pop);
382
383
384
385
386
387
      // Modify signature to get an error
      if (ischosen(v_inner_ec_request_signed_for_pop.content.signedData.signature_.ecdsaNistP256Signature)) {
        v_inner_ec_request_signed_for_pop.content.signedData.signature_.ecdsaNistP256Signature.sSig[1] := bit2oct('10101010'B xor4b oct2bit(v_inner_ec_request_signed_for_pop.content.signedData.signature_.ecdsaNistP256Signature.sSig[1]));
      } else {
        v_inner_ec_request_signed_for_pop.content.signedData.signature_.ecdsaBrainpoolP256r1Signature.sSig[1] := bit2oct('10101010'B xor4b oct2bit(v_inner_ec_request_signed_for_pop.content.signedData.signature_.ecdsaBrainpoolP256r1Signature.sSig[1]));
      }
388
      
389
      // Secure InnerEcRequestSignedForPoP message
garciay's avatar
garciay committed
390
      if (f_extract_enc_key(vc_eaCertificate, v_public_enc_key, v_compressed_enc_key_mode) == false) {
Yann Garcia's avatar
Yann Garcia committed
391
        log("*** f_http_build_invalid_enrolment_request: ERROR: Non canonical EA certificate ***");
garciay's avatar
garciay committed
392
393
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
Yann Garcia's avatar
Yann Garcia committed
394
395
      log("*** f_http_build_invalid_enrolment_request: Public encryption key: ", v_public_enc_key);
      log("*** f_http_build_invalid_enrolment_request: Public encryption key comp: ", v_compressed_enc_key_mode);
396
      p_salt := vc_eaWholeHash;
397
      if (PICS_SECPKI_REENROLMENT == false) { // This is the first enrolment, we used Factory keys
398
        v_ret_code := f_build_pki_secured_request_message_signed_with_pop(PICS_ITS_S_SIGN_NITSP256_PRIVATE_KEY, valueof(m_signerIdentifier_self), vc_eaHashedId8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_inner_ec_request_signed_for_pop(v_inner_ec_request_signed_for_pop))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash);
garciay's avatar
garciay committed
399
      } else { // We use last valid EC certificate
400
401
402
403
        var Oct32 v_ec_private_key;
        var HashedId8 v_ec_hashed_id8;
        // Retrieve EC certificate from the first enrolment
        // TODO Set v_ec_private_key & v_ec_hashed_id8
404
        v_ret_code := f_build_pki_secured_request_message_signed_with_pop(v_ec_private_key, valueof(m_signerIdentifier_digest(v_ec_hashed_id8)), v_ec_hashed_id8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_inner_ec_request_signed_for_pop(v_inner_ec_request_signed_for_pop))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash);
garciay's avatar
garciay committed
405
406
      }
      if (v_ret_code == false) {
407
408
409
410
        log("*** f_http_build_invalid_enrolment_request: ERROR: Failed to generate InnerEcRequestSignedForPop ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
      log("*** f_http_build_invalid_enrolment_request: DEBUG: p_ieee1609dot2_signed_and_encrypted_data = ", p_ieee1609dot2_signed_and_encrypted_data);
411
    } // End of function f_http_build_invalid_enrolment_request
garciay's avatar
garciay committed
412

413
414
415
416
    function f_http_build_authorization_request(
                                                in Certificate p_ec_certificate, // Enrolment credentials certificate
                                                in octetstring p_ec_private_key,
                                                out octetstring p_private_key,
Yann Garcia's avatar
Yann Garcia committed
417
                                                out octetstring p_public_key_compressed,
Yann Garcia's avatar
Yann Garcia committed
418
                                                out integer p_compressed_key_mode,
419
                                                out octetstring p_private_enc_key,
Yann Garcia's avatar
Yann Garcia committed
420
                                                out octetstring p_public_compressed_enc_key,
Yann Garcia's avatar
Yann Garcia committed
421
                                                out integer p_compressed_enc_key_mode,
422
423
424
425
426
427
428
429
                                                out Oct16 p_aes_sym_key,
                                                out Oct16 p_encrypted_sym_key,
                                                out Oct16 p_authentication_vector,
                                                out Oct12 p_nonce,
                                                out octetstring p_salt,
                                                out Ieee1609Dot2Data p_ieee1609dot2_signed_and_encrypted_data,
                                                out Oct32 p_request_hash
                                                ) runs on ItsPkiHttp {
vagrant's avatar
vagrant committed
430
      // Local variables
431
432
433
434
      var octetstring v_public_key_x;
      var octetstring v_public_key_y;
      var octetstring v_public_enc_key_x;
      var octetstring v_public_enc_key_y;
vagrant's avatar
vagrant committed
435
436
      var octetstring v_public_enc_key;
      var integer v_compressed_enc_key_mode;
437
438
439
440
      var InnerAtRequest v_inner_at_request;
      var Ieee1609Dot2Data v_inner_at_request_data;
      var InnerAtRequest v_authorization_request;
      var bitstring v_authorization_request_msg;
Yann Garcia's avatar
Yann Garcia committed
441
442
443

      // Generate the InnerAtRequest
      if (f_generate_inner_at_request(vc_eaCertificate, vc_eaHashedId8, p_ec_certificate, p_ec_private_key, p_private_key, p_public_key_compressed, p_compressed_key_mode, p_private_enc_key, p_public_compressed_enc_key, p_compressed_enc_key_mode, v_inner_at_request) == false) {
vagrant's avatar
vagrant committed
444
445
        log("*** f_http_build_authorization_request: ERROR: Failed to generate AuthorizationValidationRequest ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
446
        return;
vagrant's avatar
vagrant committed
447
      }
Yann Garcia's avatar
Yann Garcia committed
448
      log("f_http_build_authorization_request: v_inner_at_request= ", v_inner_at_request);
449
450
451
      
      // Secure InnerAtRequest message
      if (f_extract_enc_key(vc_aaCertificate, v_public_enc_key, v_compressed_enc_key_mode) == false) {
Yann Garcia's avatar
Yann Garcia committed
452
        log("*** f_http_build_authorization_request: ERROR: Non canonical AA certificate ***");
vagrant's avatar
vagrant committed
453
454
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
455
456
457
458
      if (PICS_SEC_FIXED_KEYS) { // Debug mode: Use fixed values
        v_public_enc_key := 'DD4F6B0DF57C6E3BD0E32B565CACA1D858CEB08A5C2BBAB2C23E203C6DE697FF'O;
        v_compressed_enc_key_mode := 0;
      }
vagrant's avatar
vagrant committed
459
460
      log("*** f_http_build_authorization_request: Public encryption key: ", v_public_enc_key);
      log("*** f_http_build_authorization_request: Public encryption key comp: ", v_compressed_enc_key_mode);
461
462
      p_salt := vc_aaWholeHash;
      log("*** f_http_build_authorization_request: p_salt: ", p_salt);
463
464
465
466
467
468
469
470
471
472
473
      if (PX_AUTHORIZATION_REQUEST_WITH_POP) {
        if(f_build_pki_secured_request_message_signed_with_pop(PICS_ITS_S_SIGN_NITSP256_PRIVATE_KEY, valueof(m_signerIdentifier_self), vc_aaHashedId8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_authorization_request(v_inner_at_request))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash) == false) {
          log("*** f_http_build_authorization_request: ERROR: Failed to generate Authorization Request ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
      } else { // Only encryption of EtsiTs102941Data/InnerAtRequest
        log("*** f_http_build_authorization_request: POP signature not applied");
        if(f_build_pki_secured_request_message(vc_aaHashedId8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_authorization_request(v_inner_at_request))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash) == false) {
          log("*** f_http_build_authorization_request: ERROR: Failed to generate Authorization Request ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
474
475
476
477
      }
      log("*** f_http_build_authorization_request: DEBUG: p_ieee1609dot2_signed_and_encrypted_data= ", p_ieee1609dot2_signed_and_encrypted_data);
      log("*** f_http_build_authorization_request: DEBUG: p_request_hash= ", p_request_hash);
    } // End of function f_http_build_authorization_request
478
    
Yann Garcia's avatar
Yann Garcia committed
479
    function f_http_build_authorization_validation_request(
Yann Garcia's avatar
Yann Garcia committed
480
                                                           in InnerAtRequest p_inner_at_request,
garciay's avatar
garciay committed
481
                                                           out octetstring p_private_key,
Yann Garcia's avatar
Yann Garcia committed
482
                                                           out octetstring p_public_key_compressed,
Yann Garcia's avatar
Yann Garcia committed
483
484
485
486
487
488
489
490
491
492
493
                                                           out integer p_compressed_key_mode,
                                                           out octetstring p_private_enc_key,
                                                           out octetstring p_public_compressed_enc_key,
                                                           out integer p_compressed_enc_key_mode,
                                                           out Oct16 p_aes_sym_key,
                                                           out Oct16 p_encrypted_sym_key,
                                                           out Oct16 p_authentication_vector,
                                                           out Oct12 p_nonce,
                                                           out octetstring p_salt,
                                                           out Ieee1609Dot2Data p_ieee1609dot2_signed_and_encrypted_data,
                                                           out Oct32 p_request_hash
garciay's avatar
garciay committed
494
495
496
                                                           ) runs on ItsPkiHttp {
      // Local variables
      var AuthorizationValidationRequest v_authorization_validation_request;
497
      var bitstring v_authorization_validation_request_msg;
garciay's avatar
garciay committed
498
499
      var octetstring v_public_enc_key;
      var integer v_compressed_enc_key_mode;
Yann Garcia's avatar
Yann Garcia committed
500
501
502
503
504

      // Copy the sharedAtRequest component from the InnerAtRequest received in the AuthorizationRequestMessage
      v_authorization_validation_request.sharedAtRequest := p_inner_at_request.sharedAtRequest;
      // Copy the ecSignature component from the InnerAtRequest received in the AuthorizationRequestMessage or AuthorizationRequestMessageWithPop
      v_authorization_validation_request.ecSignature := p_inner_at_request.ecSignature;
garciay's avatar
garciay committed
505
506
      // Secure the Pki message
      if (f_extract_enc_key(vc_eaCertificate, v_public_enc_key, v_compressed_enc_key_mode) == false) {
Yann Garcia's avatar
Yann Garcia committed
507
        log("*** f_http_build_authorization_validation_request: ERROR: Non canonical EA certificate ***");
garciay's avatar
garciay committed
508
509
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
garciay's avatar
garciay committed
510
511
512
      log("*** f_http_build_authorization_validation_request: Public encryption key: ", v_public_enc_key);
      log("*** f_http_build_authorization_validation_request: Public encryption key comp: ", v_compressed_enc_key_mode);

Yann Garcia's avatar
Yann Garcia committed
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
      // Secure InnerAtRequest message
      if (f_extract_enc_key(vc_eaCertificate, v_public_enc_key, v_compressed_enc_key_mode) == false) {
        log("*** f_http_build_authorization_validation_request: ERROR: Non canonical EA certificate ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
      if (PICS_SEC_FIXED_KEYS) { // Debug mode: Use fixed values
        v_public_enc_key := 'DD4F6B0DF57C6E3BD0E32B565CACA1D858CEB08A5C2BBAB2C23E203C6DE697FF'O;
        v_compressed_enc_key_mode := 0;
      }
      log("*** f_http_build_authorization_validation_request: Public encryption key: ", v_public_enc_key);
      log("*** f_http_build_authorization_validation_request: Public encryption key comp: ", v_compressed_enc_key_mode);
      p_salt := vc_eaWholeHash;
      log("*** f_http_build_authorization_validation_request: p_salt: ", p_salt);
      if (PX_AUTHORIZATION_REQUEST_WITH_POP) {
        if(f_build_pki_secured_request_message_signed_with_pop(PICS_ITS_S_SIGN_NITSP256_PRIVATE_KEY, valueof(m_signerIdentifier_self), vc_eaHashedId8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_authorization_validation_request(v_authorization_validation_request))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash) == false) {
          log("*** f_http_build_authorization_validation_request: ERROR: Failed to generate Authorization Request ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
      } else { // Only encryption of EtsiTs102941Data/InnerAtRequest
        log("*** f_http_build_authorization_validation_request: POP signature not applied");
        if(f_build_pki_secured_request_message(vc_eaHashedId8/*recipientId*/, v_public_enc_key, v_compressed_enc_key_mode, p_salt, bit2oct(encvalue(m_etsiTs102941Data_authorization_validation_request(v_authorization_validation_request))), p_ieee1609dot2_signed_and_encrypted_data, p_aes_sym_key, p_encrypted_sym_key, p_authentication_vector, p_nonce, p_request_hash) == false) {
          log("*** f_http_build_authorization_validation_request: ERROR: Failed to generate Authorization Request ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
      }
      log("*** f_http_build_authorization_validation_request: DEBUG: p_ieee1609dot2_signed_and_encrypted_data= ", p_ieee1609dot2_signed_and_encrypted_data);
      log("*** f_http_build_authorization_validation_request: DEBUG: p_request_hash= ", p_request_hash);
garciay's avatar
garciay committed
540
    } // End of function f_http_build_authorization_validation_request
Yann Garcia's avatar
Yann Garcia committed
541
    
542
  } // End of group http
543
544
545
546

  group generate_certificates {

    function f_generate_ec_certificate(
Yann Garcia's avatar
Yann Garcia committed
547
                                       out octetstring p_private_key,
548
549
                                       out Certificate p_ec_certificate
                                       ) return boolean {
Yann Garcia's avatar
Yann Garcia committed
550
551
552
553
554
      var octetstring v_public_key_x;
      var octetstring v_public_key_y;
      var octetstring p_public_key_compressed;
      var integer p_compressed_mode;
      var EccP256CurvePoint v_ecc_p256_curve_point;
555
556
557
558
559
560
561
562
      var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
        valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
        valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
      };
      var template (value) EtsiTs103097Certificate v_cert;
      var bitstring v_tbs;
      var Oct32 v_sig;
      var bitstring v_enc_msg;
563
      var PublicVerificationKey v_public_verification_key;
564
      
Yann Garcia's avatar
Yann Garcia committed
565
566
567
      log(">>> f_generate_ec_certificate");
      
      // Generate verification keys for the certificate
568
      if (f_generate_key_pair(p_private_key, v_public_key_x, v_public_key_y, p_public_key_compressed, p_compressed_mode) == false) {
Yann Garcia's avatar
Yann Garcia committed
569
570
571
572
573
574
575
576
        log("f_generate_ec_certificate: Failed to generate verification key");
        return false;
      }
      if (p_compressed_mode == 0) {
        v_ecc_p256_curve_point := valueof(m_eccP256CurvePoint_compressed_y_0(p_public_key_compressed));
      } else {
        v_ecc_p256_curve_point := valueof(m_eccP256CurvePoint_compressed_y_1(p_public_key_compressed));
      }
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591

      if (PX_EC_ALG == e_nist_p256) {
        v_public_verification_key := valueof(
                                             m_publicVerificationKey_ecdsaNistP256(
                                                                                   v_ecc_p256_curve_point
                                                                                   ));
      } else if (PX_EC_ALG == e_brainpool_p256_r1) {
        v_public_verification_key := valueof(
                                             m_publicVerificationKey_ecdsaBrainpoolP256r1(
                                                                                          v_ecc_p256_curve_point
                                                                                          ));
      } else {
        log("f_generate_ec_certificate: Wrong encryption algorithm, check PX_EC_ALG");
        return false;
      }
592
593
594
595
596
      v_cert := m_etsiTs103097Certificate(
                                          m_issuerIdentifier_sha256AndDigest(f_HashedId8FromSha256(f_hashWithSha256('616263'O))),
                                          m_toBeSignedCertificate_at(
                                                                     v_appPermissions,
                                                                     m_verificationKeyIndicator_verificationKey(
597
598
                                                                                                                v_public_verification_key
                                                                                                                ),
599
                                                                     m_validityPeriod(
Yann Garcia's avatar
Yann Garcia committed
600
                                                                                      f_getCurrentTime() / 1000,
601
                                                                                      m_duration_years(1)
602
603
604
605
606
607
608
609
610
611
612
                                                                                      ),
                                                                     m_geographicRegion_identifiedRegion(
                                                                                                         {
                                                                                                           m_identifiedRegion_country_only(12), 
                                                                                                           m_identifiedRegion_country_only(34)
                                                                                                           }
                                                                                                         )
                                                                     )
                                          );
      // Encode it ==> Get octetstring
      v_tbs := encvalue(v_cert.toBeSigned);
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
      // Sign the certificate
      v_sig := f_signWithEcdsa(bit2oct(v_tbs), int2oct(11, 32), p_private_key);
      if ((PX_VE_ALG == e_nist_p256) or (PX_VE_ALG == e_brainpool_p256_r1)) {
        v_cert.signature_ := m_signature_ecdsaNistP256(
                                                       m_ecdsaP256Signature(
                                                                            m_eccP256CurvePoint_x_only(
                                                                                                       substr(v_sig, 0, 32)
                                                                                                       ),
                                                                            substr(v_sig, 32, 32)
                                                                            )
                                                       );
      } else if (PX_VE_ALG == e_brainpool_p384_r1) {
        v_cert.signature_ := m_signature_ecdsaBrainpoolP384r1(
                                                              m_ecdsaP384Signature(
                                                                                   m_eccP384CurvePoint_x_only(
                                                                                                              substr(v_sig, 0, 48)
                                                                                                              ),
                                                                                   substr(v_sig, 48, 48)
                                                                                   )
                                                              );
      }
Yann Garcia's avatar
Yann Garcia committed
634
      log("f_generate_ec_certificate: v_cert= ", v_cert);
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
      
      p_ec_certificate := valueof(v_cert);
      return true;
    } // End of function f_generate_ec_certificate
    
    function f_generate_at_certificate(
                                       in octetstring p_private_key,
                                       in InnerEcRequest p_inner_ec_request,
                                       out Certificate p_at_certificate
                                       ) return boolean {
      var SequenceOfPsidSsp v_appPermissions := { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
        valueof(m_appPermissions(36, { bitmapSsp := '830001'O })), 
        valueof(m_appPermissions(37, { bitmapSsp := '830001'O })) 
      };
      var template (value) EtsiTs103097Certificate v_cert;
      var bitstring v_tbs;
      var Oct32 v_sig;
      var bitstring v_enc_msg;
653
      var PublicVerificationKey v_public_verification_key;
654
      
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
      if (PX_EC_ALG == e_nist_p256) {
        v_public_verification_key := valueof(
                                             m_publicVerificationKey_ecdsaNistP256(
                                                                                   p_inner_ec_request.publicKeys.verificationKey.ecdsaNistP256
                                                                                   ));
      } else if (PX_EC_ALG == e_brainpool_p256_r1) {
        v_public_verification_key := valueof(
                                             m_publicVerificationKey_ecdsaBrainpoolP256r1(
                                                                                          p_inner_ec_request.publicKeys.verificationKey.ecdsaBrainpoolP256r1
                                                                                          ));
      } else {
        // Error
        log("f_generate_ec_certificate: Wrong encryption algorithm, check PX_EC_ALG");
        return false;
      }
670
671
672
673
674
      v_cert := m_etsiTs103097Certificate(
                                          m_issuerIdentifier_sha256AndDigest(f_HashedId8FromSha256(f_hashWithSha256('616263'O))),
                                          m_toBeSignedCertificate_at(
                                                                     v_appPermissions,
                                                                     m_verificationKeyIndicator_verificationKey(
675
676
                                                                                                                v_public_verification_key
                                                                                                                ),
677
                                                                     m_validityPeriod(
Yann Garcia's avatar
Yann Garcia committed
678
                                                                                      f_getCurrentTime() / 1000,
679
                                                                                      m_duration_years(1)
680
681
682
683
684
685
686
687
688
689
690
                                                                                      ),
                                                                     m_geographicRegion_identifiedRegion(
                                                                                                         {
                                                                                                           m_identifiedRegion_country_only(12), 
                                                                                                           m_identifiedRegion_country_only(34)
                                                                                                           }
                                                                                                         )
                                                                     )
                                          );
      // Encode it ==> Get octetstring
      v_tbs := encvalue(v_cert.toBeSigned);
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
      
      // Sign the certificate
      v_sig := f_signWithEcdsa(bit2oct(v_tbs), int2oct(11, 32), p_private_key);
      if ((PX_VE_ALG == e_nist_p256) or (PX_VE_ALG == e_brainpool_p256_r1)) {
        v_cert.signature_ := m_signature_ecdsaNistP256(
                                                       m_ecdsaP256Signature(
                                                                            m_eccP256CurvePoint_x_only(
                                                                                                       substr(v_sig, 0, 32)
                                                                                                       ),
                                                                            substr(v_sig, 32, 32)
                                                                            )
                                                       );
      } else if (PX_VE_ALG == e_brainpool_p384_r1) {
        v_cert.signature_ := m_signature_ecdsaBrainpoolP384r1(
                                                              m_ecdsaP384Signature(
                                                                                   m_eccP384CurvePoint_x_only(
                                                                                                              substr(v_sig, 0, 48)
                                                                                                              ),
                                                                                   substr(v_sig, 48, 48)
                                                                                   )
                                                              );
      }
713
714
715
716
717
718
719
      log("v_cert= ", v_cert);
      
      p_at_certificate := valueof(v_cert);
      return true;
    } // End of function f_generate_at_certificate
    
  } // End of group generate_certificates 
Yann Garcia's avatar
Yann Garcia committed
720
721
722
  
  group inner_ec_xxx {
    
garciay's avatar
garciay committed
723
    function f_generate_inner_ec_request(
724
                                         out octetstring p_private_key,
Yann Garcia's avatar
Yann Garcia committed
725
726
                                         out octetstring p_public_key_compressed,
                                         out integer p_compressed_mode,
garciay's avatar
garciay committed
727
728
                                         out InnerEcRequest p_inner_ec_request
                                         ) return boolean {
Yann Garcia's avatar
Yann Garcia committed
729
      // Local variables
Yann Garcia's avatar
Yann Garcia committed
730
731
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
732
733
734
      var EccP256CurvePoint v_eccP256_curve_point;

      log (">>> f_generate_inner_ec_request");
Yann Garcia's avatar
Yann Garcia committed
735
      // Generate keys for the certificate to be requested
736
      if (f_generate_key_pair(p_private_key, v_publicKeyX, v_publicKeyY, p_public_key_compressed, p_compressed_mode) == false) {
737
        log ("f_generate_inner_ec_request: failed to generate keys");
Yann Garcia's avatar
Yann Garcia committed
738
739
        return false;
      }
Yann Garcia's avatar
Yann Garcia committed
740
741
      if (p_compressed_mode == 0) {
        v_eccP256_curve_point := valueof(m_eccP256CurvePoint_compressed_y_0(p_public_key_compressed));
Yann Garcia's avatar
Yann Garcia committed
742
      } else {
Yann Garcia's avatar
Yann Garcia committed
743
        v_eccP256_curve_point := valueof(m_eccP256CurvePoint_compressed_y_1(p_public_key_compressed));
Yann Garcia's avatar
Yann Garcia committed
744
      }
garciay's avatar
garciay committed
745
      // Build the Proof of Possession InnerEcRequest
Yann Garcia's avatar
Yann Garcia committed
746
747
      p_inner_ec_request := valueof(
                                    m_innerEcRequest(
748
                                                     PICS_ITS_S_CANONICAL_ID,
Yann Garcia's avatar
Yann Garcia committed
749
                                                     m_publicKeys(
750
                                                                  m_publicVerificationKey_ecdsaNistP256(v_eccP256_curve_point)
Yann Garcia's avatar
Yann Garcia committed
751
752
753
                                                                  ),
                                                     m_certificateSubjectAttributes(
                                                                                    { // ETSI TS 102 965 Table A.1: ETSI ITS standardized ITS-AIDs
754
                                                                                      valueof(m_appPermissions(c_its_aid_SCR, { bitmapSsp := '00C0'O }))
Yann Garcia's avatar
Yann Garcia committed
755
756
                                                                                    },
                                                                                    m_validityPeriod(
Yann Garcia's avatar
Yann Garcia committed
757
                                                                                                     f_getCurrentTime() / 1000,
758
                                                                                                     m_duration_years(1) // TODO Use PIXIT
759
                                                                                                     ),
Yann Garcia's avatar
Yann Garcia committed
760
                                                                                    m_geographicRegion_identifiedRegion(
761
762
763
764
765
                                                                                                                        {
                                                                                                                          m_identifiedRegion_country_only(12), // TODO Use PIXIT
                                                                                                                          m_identifiedRegion_country_only(34) // TODO Use PIXIT
                                                                                                                          }
                                                                                                                        ),
garciay's avatar
garciay committed
766
                                                                                    'C0'O // TODO Use PIXIT
767
768
                                                                                    )
                                                     )
garciay's avatar
garciay committed
769
                                    );
770
      log ("f_generate_inner_ec_request: ", p_inner_ec_request);
Yann Garcia's avatar
Yann Garcia committed
771
772
      
      return true;
garciay's avatar
garciay committed
773
    } // End of function f_generate_inner_ec_request
Yann Garcia's avatar
Yann Garcia committed
774
    
garciay's avatar
garciay committed
775
    function f_generate_inner_ec_request_signed_for_pop(
776
                                                        in octetstring p_private_key,
garciay's avatar
garciay committed
777
778
                                                        in InnerEcRequest p_inner_ec_request,
                                                        out Ieee1609Dot2Data p_inner_ec_request_signed_for_pop
Yann Garcia's avatar
Yann Garcia committed
779
780
781
782
783
    ) return boolean {
      // Local variables
      var template (value) EccP256CurvePoint v_eccP256_curve_point;
      var octetstring v_encoded_inner_ec_request;
      var template (value) ToBeSignedData v_tbs;
784
      var octetstring v_tbs_signed;
785
      var Signature v_signature;
garciay's avatar
garciay committed
786
787
788
789
790
791
792
793
794
795
796
797
      
      // Encode it
      v_encoded_inner_ec_request := bit2oct(encvalue(p_inner_ec_request));
      // Signed the encoded InnerEcRequestSignedForPop
      v_tbs := m_toBeSignedData(
                                m_signedDataPayload(
                                                    m_etsiTs103097Data_unsecured(
                                                                                 v_encoded_inner_ec_request
                                                                                 )
                                                   ),
                                m_headerInfo_inner_ec_request(
                                                              c_its_aid_SCR,
798
799
                                                              f_getCurrentTimeUtc()
                                                              )
garciay's avatar
garciay committed
800
801
                               );
      // Signed the encoded InnerEcRequestSignedForPop
802
      v_tbs_signed := f_signWithEcdsa(bit2oct(encvalue(v_tbs)), int2oct(0, 32), p_private_key);
garciay's avatar
garciay committed
803
      // Finalyse signed InnerEcRequestSignedForPop
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
      if (PX_VE_ALG == e_nist_p256) {
        v_signature := valueof(
                               m_signature_ecdsaNistP256(
                                                         m_ecdsaP256Signature(
                                                                              m_eccP256CurvePoint_x_only(
                                                                                                         substr(v_tbs_signed, 0, 32)
                                                                                                         ),
                                                                              substr(v_tbs_signed, 32, 32)
                                                                              )
                                                         )
                               );
      } else if (PX_VE_ALG == e_brainpool_p256_r1) {
        v_signature := valueof(
                               m_signature_ecdsaBrainpoolP256r1(
                                                                m_ecdsaP256Signature(
                                                                                     m_eccP256CurvePoint_x_only(
                                                                                                                substr(v_tbs_signed, 0, 32)
                                                                                                                ),
                                                                                     substr(v_tbs_signed, 32, 32)
                                                                                     )
                                                                )
                               );
      } else if (PX_VE_ALG == e_brainpool_p384_r1) {
        v_signature := valueof(
                               m_signature_ecdsaBrainpoolP384r1(
                                                                m_ecdsaP384Signature(
                                                                                     m_eccP384CurvePoint_x_only(
                                                                                                                substr(v_tbs_signed, 0, 48)
                                                                                                                ),
                                                                                     substr(v_tbs_signed, 48, 48)
                                                                                     )
                                                                )
                               );
      }
      log("f_generate_inner_ec_request_signed_for_pop: v_signature= ", v_signature);
garciay's avatar
garciay committed
839
840
841
842
843
844
      p_inner_ec_request_signed_for_pop := valueof(
                                                   m_etsiTs103097Data_signed(
                                                                             m_signedData(
                                                                                          sha256,
                                                                                          v_tbs,
                                                                                          m_signerIdentifier_self,
845
                                                                                          v_signature
garciay's avatar
garciay committed
846
847
848
                                                                                          )
                                                                             )
                                                   );
849
850
      
      log("<<< f_generate_inner_ec_request_signed_for_pop: p_inner_ec_request_signed_for_pop= ", p_inner_ec_request_signed_for_pop);
garciay's avatar
garciay committed
851
852
853
      return true;
    } // End of function f_generate_inner_ec_request_signed_for_pop
    
854
    function f_generate_inner_ec_response(
855
                                          in octetstring p_inner_ec_request_hash,
856
857
858
859
860
861
862
863
                                          in EtsiTs103097Certificate p_certificate,
                                          out InnerEcResponse p_inner_ec_response
                                         ) return boolean {
      // Local variables
      
      // Build the Proof of Possession InnerEcResponse
      p_inner_ec_response := valueof(
                                     m_innerEcResponse_ok(
864
                                                          substr(p_inner_ec_request_hash, 0, 16),
865
866
867
868
869
870
871
                                                          p_certificate
                                                          )
                                     );
      
      return true;
    } // End of function f_generate_inner_ec_response
    
garciay's avatar
garciay committed
872
873
  } // End of group inner_ec_xxx

874
875
876
  group inner_at_xxx {

    function f_generate_inner_at_request(
877
878
                                         in Certificate p_ea_certificate,
                                         in Oct8 p_ea_hashed_id8,
879
                                         in Certificate p_ec_certificate,
880
                                         in octetstring p_ec_private_key,
Yann Garcia's avatar
Yann Garcia committed
881
882
883
884
885
886
                                         out octetstring p_private_key,
                                         out octetstring p_public_key_compressed,
                                         out integer p_compressed_key_mode,
                                         out octetstring p_private_enc_key,
                                         out octetstring p_public_compressed_enc_key,
                                         out integer p_compressed_enc_key_mode,
887
                                         out InnerAtRequest p_inner_at_request
888
889
                                         ) return boolean {
      // Local variables
Yann Garcia's avatar
Yann Garcia committed
890
891
892
893
      var octetstring v_public_key_x;
      var octetstring v_public_key_y;
      var octetstring v_public_enc_key_x;
      var octetstring v_public_enc_key_y;
894
895
896
      var bitstring v_enc_value;
      var octetstring v_ec_hash;
      var Oct8 v_ec_hashed_id8;
Yann Garcia's avatar
Yann Garcia committed
897
898
      var octetstring public_enc_key_x;
      var octetstring public_enc_key_y;
899
900
901
902
903
904
905
      var Oct32 v_hmac_key;
      var octetstring v_message_to_tag;
      var Oct16 v_key_tag;
      var octetstring v_hash_shared_at_request;
      var template (value) ToBeSignedData v_tbs;
      var octetstring v_tbs_signed;
      var Ieee1609Dot2Data v_signed_ec_signature;
906
907
908
      var template (value) EccP256CurvePoint v_eccP256_curve_point;
      var template (value) EccP256CurvePoint v_enc_eccP256_curve_point;
      var HashAlgorithm v_hashId;
909
      var Signature v_signature;
910

Yann Garcia's avatar
Yann Garcia committed
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
      // Generate verification keys for the certificate to be requested
      if (f_generate_key_pair(p_private_key, v_public_key_x, v_public_key_y, p_public_key_compressed, p_compressed_key_mode) == false) {
        log("f_generate_inner_at_request: Failed to generate verification key");
        return false;
      }
      log ("f_generate_inner_at_request: AT verification private key: ", p_private_key);
      log ("f_generate_inner_at_request: AT verification public compressed key: ", p_public_key_compressed);
      log ("f_generate_inner_at_request: AT verification public compressed mode: ", p_compressed_key_mode);
      // Generate encryption keys for the certificate to be requested
      if (PX_INCLUDE_ENCRYPTION_KEYS) {
        if (f_generate_key_pair(p_private_enc_key, v_public_enc_key_x, v_public_enc_key_y, p_public_compressed_enc_key, p_compressed_enc_key_mode) == false) {
          log("f_generate_inner_at_request: Failed to generate encryption key");
          return false;
        }
      } else {
        p_private_enc_key := ''O;
        p_public_compressed_enc_key := ''O;
        p_compressed_enc_key_mode := -1;
      }
      
931
932
933
934
935
      // Calculate the whole certificate SHA
      v_enc_value := encvalue(p_ec_certificate);
      if (ischosen(p_ec_certificate.issuer.sha256AndDigest)) {
        v_ec_hash := f_hashWithSha256(bit2oct(v_enc_value));
        v_ec_hashed_id8 := f_HashedId8FromSha256(v_ec_hash);
936
      } else {
937
938
        v_ec_hash := f_hashWithSha384(bit2oct(v_enc_value));
        v_ec_hashed_id8 := f_HashedId8FromSha384(v_ec_hash);
939
      }
940
      log("f_generate_inner_at_request: v_ec_hash= ", v_ec_hash);
941
942
      
      // Generate 32 octets length secret key
garciay's avatar
garciay committed
943
      v_hmac_key := f_hashWithSha256(int2oct(f_getCurrentTime(), 12));
944
      log("f_generate_inner_at_request: v_hmac_key= ", v_hmac_key);
945

946
      // Generate tag based on the concatenation of verification keys & encryption keys
Yann Garcia's avatar
Yann Garcia committed
947
      v_message_to_tag := v_public_key_x & v_public_key_y & v_public_enc_key_x & v_public_enc_key_y;
948
      log("f_generate_inner_at_request: v_message_to_tag= ", v_message_to_tag); // FIXME encryption keys could be optional
Yann Garcia's avatar
Yann Garcia committed
949
      v_key_tag := fx_hmac_sha256(v_hmac_key, v_message_to_tag); // TODO Rename and use a wrapper function
950
      log("f_generate_inner_at_request: v_key_tag= ", v_key_tag);
951
952

      // Build the SharedAtRequest
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
      p_inner_at_request.sharedAtRequest := valueof(
                                                    m_shared_at_request(
                                                                        p_ea_hashed_id8, // eaId identifies the EA certificate shared with EA entity
                                                                        substr(v_key_tag, 0, 16), // Calculated keyTag
                                                                        valueof(
                                                                                m_certificate_subject_attributes( // FIXME Review subjectPermissions
                                                                                                                 p_ec_certificate.toBeSigned.appPermissions,
                                                                                                                 { { subjectPermissions := { all_ := NULL }, minChainLength := 1, chainLengthRange   := 0, eeType := '00000000'B } },
                                                                                                                 p_ec_certificate.toBeSigned.id,
                                                                                                                 p_ec_certificate.toBeSigned.validityPeriod,
                                                                                                                 p_ec_certificate.toBeSigned.region,
                                                                                                                 p_ec_certificate.toBeSigned.assuranceLevel
                                                                                                                  ))) // Desired attributes
                                                    );
      // Calculate the hash of the SharedAtRequest
968
      v_hash_shared_at_request := f_hashWithSha256(bit2oct(encvalue(p_inner_at_request.sharedAtRequest)));
969
      log("f_generate_inner_at_request: v_hash_shared_at_request= ", v_hash_shared_at_request);
970
971
      
      // Build the ETsiTs103097Data-SignedExternalPayload
972
      v_tbs := m_toBeSignedData(
973
974
                                m_signedDataPayload_ext(v_hash_shared_at_request), // Payload containing extDataHash
                                m_headerInfo_inner_ec_request( // HeaderInfo
975
976
977
                                                              c_its_aid_SCR,
                                                              f_getCurrentTimeUtc())
                               );
978
      log("f_generate_inner_at_request: v_tbs= ", v_tbs);
979
980
981
982
      // Signed ToBeSigned payload using the private key of EC certificate obtained from Enrolment request
      // In case of ITS-S privacy, v_signed_ec_signature contained the data to be encrypted
      if (ischosen(p_ec_certificate.signature_.ecdsaBrainpoolP384r1Signature)) {
        v_hashId := sha384;
983
984
985
986
987
988
989
990
991
992
993
        v_tbs_signed := f_signWithEcdsaBrainpoolp384WithSha384(bit2oct(encvalue(v_tbs)), v_ec_hash, p_ec_private_key);
        v_signature := valueof(
                               m_signature_ecdsaBrainpoolP384r1(
                                                                m_ecdsaP384Signature(
                                                                                     m_eccP384CurvePoint_x_only(
                                                                                                                substr(v_tbs_signed, 0, 48)
                                                                                                                ),
                                                                                     substr(v_tbs_signed, 48, 48)
                                                                                     )
                                                                )
                                                        );
994
995
      } else {
        v_hashId := sha256;
996
997
998
999
1000
        if (ischosen(p_ec_certificate.signature_.ecdsaBrainpoolP256r1Signature)) {
          v_tbs_signed := f_signWithEcdsaBrainpoolp256WithSha256(bit2oct(encvalue(v_tbs)), v_ec_hash, p_ec_private_key);
          v_signature := valueof(
                                 m_signature_ecdsaBrainpoolP256r1(
                                                                  m_ecdsaP256Signature(
For faster browsing, not all history is shown. View entire blame