Commit a68f9679 authored by Denis Filatov's avatar Denis Filatov
Browse files

(+) f_verifySignedMessageECDSA - check message signature function

parent f533a313
Loading
Loading
Loading
Loading
+68 −0
Original line number Diff line number Diff line
@@ -92,6 +92,74 @@ module LibItsSecurity_Functions {
        return ''O;
        } // End of function f_signWithEcdsa

        function f_verifySignedMessageECDSA(
                                        in Ieee1609Dot2Data p_msg,
                                        in template (omit) EtsiTs103097Certificate p_signer := omit,
                                        in template(omit) PublicVerificationKey p_verification_key := omit
                                      ) return boolean {
            var octetstring v_signer_hash;
            var PublicVerificationKey v_verification_key;

            if(ischosen(p_msg.content.signedData.signer.self_)){
                if(not ispresent(p_verification_key)){
                    return false; // unsupported yet
                }
                v_verification_key := valueof(p_verification_key);                
                select(f_getHashAlgorithmOfVerificationKey(v_verification_key)){
                    case (sha256){
                        v_signer_hash := f_hashWithSha256(''O);
                    }
                    case (sha384){
                        v_signer_hash := f_hashWithSha384(''O);
                    }
                    case else {
                        return false;
                    }
                }
            }else{
                var EtsiTs103097Certificate v_signer;
                if(ischosen(p_msg.content.signedData.signer.certificate)){
                    var integer v_length := lengthof(p_msg.content.signedData.signer.certificate);
                    if(v_length < 1) {
                        return false;
                    }
                    v_signer := p_msg.content.signedData.signer.certificate[v_length - 1];
                }else if(ischosen(p_msg.content.signedData.signer.digest)){
                    if(ispresent(p_signer)) {
                        v_signer := valueof(p_signer);
                    }else{
                        var charstring v_certificate_id;
                        if(not f_getCertificateFromDigest(p_msg.content.signedData.signer.digest, v_signer, v_certificate_id)){
                            return false;
                        }
                    }
                }else{
                    return false;
                }
                if(not ischosen(v_signer.toBeSigned.verifyKeyIndicator.verificationKey)){
                    return false; 
                }
                v_verification_key := v_signer.toBeSigned.verifyKeyIndicator.verificationKey;
                select(f_getHashAlgorithmOfVerificationKey(v_verification_key)){
                    case (sha256){
                        v_signer_hash := f_hashWithSha256(bit2oct(encvalue(v_signer)));
                    }
                    case (sha384){
                        v_signer_hash := f_hashWithSha384(bit2oct(encvalue(v_signer)));
                    }
                    case else {
                        return false;
                    }
                }
            }

            return f_verifyEcdsa(
                                 bit2oct(encvalue(p_msg.content.signedData.tbsData)),
                                 v_signer_hash,
                                 p_msg.content.signedData.signature_,
                                 v_verification_key);
        }

        function f_verifyEcdsa(
                               in octetstring p_tbs,
                               in octetstring p_issuer,