Commit 41e25ab6 authored by garciay's avatar garciay
Browse files

Validate signing process with latest version of Crypto libraries

parent c2ce8be6
Loading
Loading
Loading
Loading
+217 −44
Original line number Original line Diff line number Diff line
@@ -22,42 +22,46 @@ module LibItsSecurity_Functions {
        
        
        /**
        /**
         * @desc    Produces a 256-bit (32-byte) hash value
         * @desc    Produces a 256-bit (32-byte) hash value
         * @param   TODO
         * @param   p_toBeHashedData Data to be used to calculate the hash value
         * @return  TODO
         * @return  The hash value
         */
         */
        function f_hashWithSha256(in octetstring p_toBeHashedData) {
        function f_hashWithSha256(in octetstring p_toBeHashedData) return Oct32 {
            
            return fx_hashWithSha256(p_toBeHashedData);
        }
        } // End of function f_hashWithSha256
        
        
        /**
        /**
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signaturee
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signaturee
         * @param   TODO
         * @param   p_toBeSignedData    The data to be signed
         * @return  TODO
         * @return  The signature value
         */
         */
        function f_signWithEcdsaNistp256WithSha256() {
        function f_signWithEcdsaNistp256WithSha256(in Oct32 p_toBeSignedData) return octetstring {
            return fx_signWithEcdsaNistp256WithSha256(
            p_toBeSignedData,
                PX_PRIVATE_SIGNING_KEYS[PX_CERTIFICATE_CONFIG_IDX]
            );
            
            
        }
        } // End of function f_signWithEcdsaNistp256WithSha256
        
        
        /**
        /**
         * @desc    Verify the signature of the specified data
         * @desc    Verify the signature of the specified data
         * @param   TODO
         * @param   p_toBeVerifiedData          The data to be verified
         * @param   p_signature                 The signature
         * @param   p_ecdsaNistp256PublicKeyX   The public key (x coordinate)
         * @param   p_ecdsaNistp256PublicKeyY   The public key (y coordinate)
         * @return  true on success, false otherwise
         * @return  true on success, false otherwise
         */
         */
        function f_verifyWithEcdsaNistp256WithSha256(
        function f_verifyWithEcdsaNistp256WithSha256(
                                                     in octetstring p_toBeHashedData, 
                                                     in octetstring p_toBeVerifiedData, 
                                                     out Oct32 p_hashValue) return boolean {
                                                     in octetstring p_signature, 
            p_hashValue := fx_hashWithSha256(p_toBeHashedData);
                                                     in octetstring p_ecdsaNistp256PublicKeyX, 
            return true;
                                                     in octetstring p_ecdsaNistp256PublicKeyY
        }
        ) return boolean {
        
            return fx_verifyWithEcdsaNistp256WithSha256(
        /**
                p_toBeVerifiedData, 
         * @desc    Produce a new public/private key pair based on Elliptic Curve Digital Signature Algorithm (ECDSA) algorithm
                p_signature, 
         * @param   TODO
                p_ecdsaNistp256PublicKeyX, 
         * @return  true on success, false otherwise
                p_ecdsaNistp256PublicKeyY);
         */
        } // End of function f_verifyWithEcdsaNistp256WithSha256
        function f_generateKeyPair() return boolean {
            return false;
        }
        
        
        /**
        /**
         * @desc    Calculate digest over the certificate
         * @desc    Calculate digest over the certificate
@@ -81,7 +85,65 @@ module LibItsSecurity_Functions {
                                     in ThreeDLocation p_threeDLocation, 
                                     in ThreeDLocation p_threeDLocation, 
                                     out template (value) SecuredMessage p_securedMessage) 
                                     out template (value) SecuredMessage p_securedMessage) 
        return boolean {
        return boolean {
            return false; // TODO
            
            // Local variables
            var octetstring v_secPayload, v_signature;
            var Oct32 v_hash;
            var template (value) ToBeSignedData v_toBeSignedData;
             
            // Create SecuredMessage payload to be signed
            v_toBeSignedData := m_toBeSignedData_profileOther(
                { // Field HeaderFields
                    m_header_field_signer_info(
                        m_signerInfo_certificate(
                            PX_AT_CERTIFICATES[PX_CERTIFICATE_CONFIG_IDX]
                        ) // End of template m_signerInfo_certificate
                    ), // End of template m_header_field_signer_info
                    m_header_field_generation_time(f_getCurrentTime()),
                    m_header_field_generation_location(
                        p_threeDLocation
                    ),
                    m_header_field_message_type(c_messageType_CAM)
                }, // End of field HeaderFields
                {
                    m_payload_unsecured(
                        p_unsecuredPayload
                    )
                }, // End of field HeaderFields
                e_signature
            );
             
            v_secPayload := bit2oct(encvalue(v_toBeSignedData));
//            log("v_secPayload: ", v_secPayload);
            
            // Calculate the hash of the SecuredMessage payload to be signed
            v_hash := f_hashWithSha256(v_secPayload);
//            log("v_hash: ", v_hash);
            
            // Signed payload
            v_signature := f_signWithEcdsaNistp256WithSha256(
                v_hash
            );
//            log("v_signature: ", v_signature);
            
            p_securedMessage := m_securedMessage_profileOther( // See Clause 7.3   Generic security profile for other signed messages
                v_toBeSignedData.header_fields,
                v_toBeSignedData.payload_fields,
                {
                    m_trailer_field_signature(
                        m_signature(
                            m_ecdsaSignature(
                                m_eccPointecdsa_nistp256_with_sha256_y_coordinate_only(
                                    substr(v_signature, 2, 32)
                                ),
                                substr(v_signature, 34, 32)
                            )
                        )
                    )
                }
            ); // End of template m_securedMessageBeacon
            
            return true;
        }
        }
        
        
        /**
        /**
@@ -97,8 +159,66 @@ module LibItsSecurity_Functions {
                                      in ThreeDLocation p_threeDLocation, 
                                      in ThreeDLocation p_threeDLocation, 
                                      out template (value) SecuredMessage p_securedMessage) 
                                      out template (value) SecuredMessage p_securedMessage) 
        return boolean {
        return boolean {
            return false; // TODO
            
            // Local variables
            var octetstring v_secPayload, v_signature;
            var Oct32 v_hash;
            var template (value) ToBeSignedData v_toBeSignedData;
             
            // Create SecuredMessage payload to be signed
            v_toBeSignedData := m_toBeSignedData_profileOther(
                { // Field HeaderFields
                    m_header_field_signer_info(
                        m_signerInfo_certificate(
                            PX_AT_CERTIFICATES[PX_CERTIFICATE_CONFIG_IDX]
                        ) // End of template m_signerInfo_certificate
                    ), // End of template m_header_field_signer_info
                    m_header_field_generation_time(f_getCurrentTime()),
                    m_header_field_generation_location(
                        p_threeDLocation
                    ),
                    m_header_field_message_type(c_messageType_DENM)
                }, // End of field HeaderFields
                {
                    m_payload_unsecured(
                        p_unsecuredPayload
                    )
                }, // End of field HeaderFields
                e_signature
            );
             
            v_secPayload := bit2oct(encvalue(v_toBeSignedData));
//            log("v_secPayload: ", v_secPayload);
            
            // Calculate the hash of the SecuredMessage payload to be signed
            v_hash := f_hashWithSha256(v_secPayload);
//            log("v_hash: ", v_hash);
            
            // Signed payload
            v_signature := f_signWithEcdsaNistp256WithSha256(
                v_hash
            );
//            log("v_signature: ", v_signature);
            
            p_securedMessage := m_securedMessage_profileOther( // See Clause 7.3   Generic security profile for other signed messages
                v_toBeSignedData.header_fields,
                v_toBeSignedData.payload_fields,
                {
                    m_trailer_field_signature(
                        m_signature(
                            m_ecdsaSignature(
                                m_eccPointecdsa_nistp256_with_sha256_y_coordinate_only(
                                    substr(v_signature, 2, 32)
                                ),
                                substr(v_signature, 34, 32)
                            )
                        )
                    )
                }
                }
            ); // End of template m_securedMessageBeacon
            
            return true;
        } // End of function f_buildGnSecuredDenm
        
        
        /**
        /**
         * @desc This function build and sign the SecureMessage part covered by the signature process
         * @desc This function build and sign the SecureMessage part covered by the signature process
@@ -108,7 +228,7 @@ module LibItsSecurity_Functions {
         * @return true on success, false otherwise
         * @return true on success, false otherwise
         * @verdict Unchanged
         * @verdict Unchanged
         */
         */
        function f_buildGnSecuredBeacon(
        function f_buildGnSecuredOtherMessage(
                                              in octetstring p_unsecuredPayload, 
                                              in octetstring p_unsecuredPayload, 
                                              in ThreeDLocation p_threeDLocation, 
                                              in ThreeDLocation p_threeDLocation, 
                                              out template (value) SecuredMessage p_securedMessage) 
                                              out template (value) SecuredMessage p_securedMessage) 
@@ -141,21 +261,17 @@ module LibItsSecurity_Functions {
            );
            );
             
             
            v_secPayload := bit2oct(encvalue(v_toBeSignedData));
            v_secPayload := bit2oct(encvalue(v_toBeSignedData));
            log("v_secPayload length: ", lengthof(v_secPayload));
//            log("f_buildGnSecuredOtherMessage: v_secPayload: ", v_secPayload);
            log("v_secPayload: ", v_secPayload);
            
            
            // Calculate the hash of the SecuredMessage payload to be signed
            // Calculate the hash of the SecuredMessage payload to be signed
            v_hash := fx_hashWithSha256(v_secPayload);
            v_hash := f_hashWithSha256(v_secPayload);
            log("v_hash length: ", lengthof(v_hash));
//            log("f_buildGnSecuredOtherMessage: v_hash: ", v_hash);
            log("v_hash: ", v_hash);
            
            
            // Signed payload
            // Signed payload
            v_signature := fx_signWithEcdsaNistp256WithSha256(
            v_signature := f_signWithEcdsaNistp256WithSha256(
                v_hash,
                v_hash
                PC_PRIVATE_KEYS[PX_CERTIFICATE_CONFIG_IDX]
            );
            );
            log("v_signature length: ", lengthof(v_signature));
//            log("f_buildGnSecuredOtherMessage: v_signature: ", v_signature);
            log("v_signature: ", v_signature);
            
            
            p_securedMessage := m_securedMessage_profileOther( // See Clause 7.3   Generic security profile for other signed messages
            p_securedMessage := m_securedMessage_profileOther( // See Clause 7.3   Generic security profile for other signed messages
                v_toBeSignedData.header_fields,
                v_toBeSignedData.header_fields,
@@ -175,7 +291,63 @@ module LibItsSecurity_Functions {
            ); // End of template m_securedMessageBeacon
            ); // End of template m_securedMessageBeacon
            
            
            return true;
            return true;
        } // End of function f_buildGnSecuredBeacon
        } // End of function f_buildGnSecuredOtherMessage
        
        /**
         * 
         * @desc Verify the signature of the prvided secured message
         * @param p_securedMessage
         * @return true on success, false otherwise
         * @verdict 
         */
        function f_verifyGnSecuredOtherMessage(
                                               in template (value) SecuredMessage p_securedMessage) 
        return boolean {
            
            // Local variables
            var octetstring v_secPayload;
            var octetstring v_signedData;
            var Oct32 v_hash;
            var integer v_counter;
            var boolean v_result := false;
            var template (value) ToBeSignedData v_toBeSignedData;
            
            // Create SecuredMessage payload to be signed
            v_toBeSignedData := m_toBeSignedData_profileOther(
                p_securedMessage.header_fields, 
                p_securedMessage.payload_fields, 
                e_signature
            );
             
            v_secPayload := bit2oct(encvalue(v_toBeSignedData));
//            log("f_verifyGnSecuredOtherMessage: v_secPayload: ", v_secPayload);
            
            // Calculate the hash of the SecuredMessage payload to be signed
            v_hash := fx_hashWithSha256(v_secPayload);
//            log("f_verifyGnSecuredOtherMessage: v_hash: ", v_hash);
            
            // Verify payload
            for (v_counter := 0; v_counter < lengthof(p_securedMessage.trailer_fields); v_counter := v_counter + 1) {
                if (
                    (p_securedMessage.trailer_fields[v_counter].type_ == e_signature) and 
                    (p_securedMessage.trailer_fields[v_counter].trailerField.signature_.algorithm == e_ecdsa_nistp256_with_sha256)
                ) {
                    v_signedData := 
                        '0000'O & 
                        p_securedMessage.trailer_fields[v_counter].trailerField.signature_.signature_.ecdsa_signature.r.x & 
                        p_securedMessage.trailer_fields[v_counter].trailerField.signature_.signature_.ecdsa_signature.s;
//                    log("f_verifyGnSecuredOtherMessage: v_signedData: ", v_signedData);
                    v_result := f_verifyWithEcdsaNistp256WithSha256(
                        v_hash,
                        v_signedData,
                        PX_AT_CERTIFICATES[PX_CERTIFICATE_CONFIG_IDX].subject_attributes[0].attribute.key.public_key.eccPoint.x,
                        PX_AT_CERTIFICATES[PX_CERTIFICATE_CONFIG_IDX].subject_attributes[0].attribute.key.public_key.eccPoint.y.y
                    );
                }
            } // End of 'for' statement
            
            return v_result;
        } // End of function f_verifyGnSecuredOtherMessage
        
        
        group messageGetters {
        group messageGetters {
            
            
@@ -256,7 +428,7 @@ module LibItsSecurity_Functions {
         * @param   p_toBeHashedData Data to be used to calculate the hash value
         * @param   p_toBeHashedData Data to be used to calculate the hash value
         * @return  The hash value
         * @return  The hash value
         */
         */
        external function fx_hashWithSha256(in octetstring p_toBeHashedData) return octetstring;
        external function fx_hashWithSha256(in octetstring p_toBeHashedData) return Oct32;
        
        
        /**
        /**
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signaturee
         * @desc    Produces a Elliptic Curve Digital Signature Algorithm (ECDSA) signaturee
@@ -277,7 +449,8 @@ module LibItsSecurity_Functions {
        external function fx_verifyWithEcdsaNistp256WithSha256(in octetstring p_toBeVerifiedData, in octetstring p_signature, in octetstring p_ecdsaNistp256PublicKeyX, in octetstring p_ecdsaNistp256PublicKeyY) return boolean;
        external function fx_verifyWithEcdsaNistp256WithSha256(in octetstring p_toBeVerifiedData, in octetstring p_signature, in octetstring p_ecdsaNistp256PublicKeyX, in octetstring p_ecdsaNistp256PublicKeyY) return boolean;
        
        
        /**
        /**
         * @desc    Produce a new public/private key pair based on Elliptic Curve Digital Signature Algorithm (ECDSA) algorithm
         * @desc    Produce a new public/private key pair based on Elliptic Curve Digital Signature Algorithm (ECDSA) algorithm.
         *          This function should not be used by the ATS
         * @param   p_privateKey    The new private key value
         * @param   p_privateKey    The new private key value
         * @param   p_publicKeyX    The new public key value (x coordinate)
         * @param   p_publicKeyX    The new public key value (x coordinate)
         * @param   p_publicKeyX    The new public key value (y coordinate)
         * @param   p_publicKeyX    The new public key value (y coordinate)
+22 −185

File changed.

Preview size limit exceeded, changes collapsed.