@@ -191,6 +191,7 @@ static const char *global_prefix;
191191static enum sign_mode signed_tag_mode = SIGN_VERBATIM ;
192192static enum sign_mode signed_commit_mode = SIGN_VERBATIM ;
193193static const char * signed_commit_keyid ;
194+ static const char * signed_tag_keyid ;
194195
195196/* Memory pools */
196197static struct mem_pool fi_mem_pool = {
@@ -2892,6 +2893,9 @@ static void handle_signature_if_invalid(struct strbuf *new_data,
28922893 ret = verify_commit_buffer (tmp_buf .buf , tmp_buf .len , & signature_check );
28932894
28942895 if (ret ) {
2896+ if (mode == SIGN_ABORT_IF_INVALID )
2897+ die (_ ("aborting due to invalid signature" ));
2898+
28952899 warn_invalid_signature (& signature_check , msg -> buf , mode );
28962900
28972901 if (mode == SIGN_SIGN_IF_INVALID ) {
@@ -2983,6 +2987,7 @@ static void parse_new_commit(const char *arg)
29832987 case SIGN_VERBATIM :
29842988 case SIGN_STRIP_IF_INVALID :
29852989 case SIGN_SIGN_IF_INVALID :
2990+ case SIGN_ABORT_IF_INVALID :
29862991 import_one_signature (& sig_sha1 , & sig_sha256 , v );
29872992 break ;
29882993
@@ -3068,7 +3073,8 @@ static void parse_new_commit(const char *arg)
30683073 encoding );
30693074
30703075 if ((signed_commit_mode == SIGN_STRIP_IF_INVALID ||
3071- signed_commit_mode == SIGN_SIGN_IF_INVALID ) &&
3076+ signed_commit_mode == SIGN_SIGN_IF_INVALID ||
3077+ signed_commit_mode == SIGN_ABORT_IF_INVALID ) &&
30723078 (sig_sha1 .hash_algo || sig_sha256 .hash_algo ))
30733079 handle_signature_if_invalid (& new_data , & sig_sha1 , & sig_sha256 ,
30743080 & msg , signed_commit_mode );
@@ -3084,7 +3090,50 @@ static void parse_new_commit(const char *arg)
30843090 b -> last_commit = object_count_by_type [OBJ_COMMIT ];
30853091}
30863092
3087- static void handle_tag_signature (struct strbuf * msg , const char * name )
3093+ static void handle_tag_signature_if_invalid (struct strbuf * buf ,
3094+ struct strbuf * msg ,
3095+ size_t sig_offset )
3096+ {
3097+ struct strbuf signature = STRBUF_INIT ;
3098+ struct strbuf payload = STRBUF_INIT ;
3099+ struct signature_check sigc = { 0 };
3100+
3101+ strbuf_addbuf (& payload , buf );
3102+ strbuf_addch (& payload , '\n' );
3103+ strbuf_add (& payload , msg -> buf , sig_offset );
3104+ strbuf_add (& signature , msg -> buf + sig_offset , msg -> len - sig_offset );
3105+
3106+ sigc .payload_type = SIGNATURE_PAYLOAD_TAG ;
3107+ sigc .payload = strbuf_detach (& payload , & sigc .payload_len );
3108+
3109+ if (!check_signature (& sigc , signature .buf , signature .len ))
3110+ goto out ;
3111+
3112+ if (signed_tag_mode == SIGN_ABORT_IF_INVALID )
3113+ die (_ ("aborting due to invalid signature" ));
3114+
3115+ strbuf_setlen (msg , sig_offset );
3116+
3117+ if (signed_tag_mode == SIGN_SIGN_IF_INVALID ) {
3118+ strbuf_attach (& payload , sigc .payload , sigc .payload_len ,
3119+ sigc .payload_len + 1 );
3120+ sigc .payload = NULL ;
3121+ strbuf_reset (& signature );
3122+
3123+ if (sign_buffer (& payload , & signature , signed_tag_keyid ,
3124+ SIGN_BUFFER_USE_DEFAULT_KEY ))
3125+ die (_ ("failed to sign tag object" ));
3126+
3127+ strbuf_addbuf (msg , & signature );
3128+ }
3129+
3130+ out :
3131+ signature_check_clear (& sigc );
3132+ strbuf_release (& signature );
3133+ strbuf_release (& payload );
3134+ }
3135+
3136+ static void handle_tag_signature (struct strbuf * buf , struct strbuf * msg , const char * name )
30883137{
30893138 size_t sig_offset = parse_signed_buffer (msg -> buf , msg -> len );
30903139
@@ -3110,17 +3159,16 @@ static void handle_tag_signature(struct strbuf *msg, const char *name)
31103159 /* Truncate the buffer to remove the signature */
31113160 strbuf_setlen (msg , sig_offset );
31123161 break ;
3162+ case SIGN_ABORT_IF_INVALID :
3163+ case SIGN_SIGN_IF_INVALID :
3164+ case SIGN_STRIP_IF_INVALID :
3165+ handle_tag_signature_if_invalid (buf , msg , sig_offset );
3166+ break ;
31133167
31143168 /* Third, aborting modes */
31153169 case SIGN_ABORT :
31163170 die (_ ("encountered signed tag; use "
31173171 "--signed-tags=<mode> to handle it" ));
3118- case SIGN_STRIP_IF_INVALID :
3119- die (_ ("'strip-if-invalid' is not a valid mode for "
3120- "git fast-import with --signed-tags=<mode>" ));
3121- case SIGN_SIGN_IF_INVALID :
3122- die (_ ("'sign-if-invalid' is not a valid mode for "
3123- "git fast-import with --signed-tags=<mode>" ));
31243172 default :
31253173 BUG ("invalid signed_tag_mode value %d from tag '%s'" ,
31263174 signed_tag_mode , name );
@@ -3190,8 +3238,6 @@ static void parse_new_tag(const char *arg)
31903238 /* tag payload/message */
31913239 parse_data (& msg , 0 , NULL );
31923240
3193- handle_tag_signature (& msg , t -> name );
3194-
31953241 /* build the tag object */
31963242 strbuf_reset (& new_data );
31973243
@@ -3203,6 +3249,9 @@ static void parse_new_tag(const char *arg)
32033249 if (tagger )
32043250 strbuf_addf (& new_data ,
32053251 "tagger %s\n" , tagger );
3252+
3253+ handle_tag_signature (& new_data , & msg , t -> name );
3254+
32063255 strbuf_addch (& new_data , '\n' );
32073256 strbuf_addbuf (& new_data , & msg );
32083257 free (tagger );
@@ -3713,7 +3762,7 @@ static int parse_one_option(const char *option)
37133762 if (parse_sign_mode (option , & signed_commit_mode , & signed_commit_keyid ))
37143763 usagef (_ ("unknown --signed-commits mode '%s'" ), option );
37153764 } else if (skip_prefix (option , "signed-tags=" , & option )) {
3716- if (parse_sign_mode (option , & signed_tag_mode , NULL ))
3765+ if (parse_sign_mode (option , & signed_tag_mode , & signed_tag_keyid ))
37173766 usagef (_ ("unknown --signed-tags mode '%s'" ), option );
37183767 } else if (!strcmp (option , "quiet" )) {
37193768 show_stats = 0 ;
0 commit comments