import re
def _map_ikev2_vendor_capabilities(message_type, input_string):
    
    valid_message_types = ['IKE_SA_INIT', 'IKE_AUTH']
    
    
    if message_type not in valid_message_types:
        raise ValueError(f"Invalid message type: {message_type}. Must be one of {valid_message_types}")
    
    
    value_map = {
        
        'FRAG_SUP': 'IKE Fragmentation',  
        'REDIR_SUP': 'Redirection',  
        'HASH_ALG': 'Hash Algorithms',  
        'NATD_S_IP': 'NAT-T (Source IP)',  
        'NATD_D_IP': 'NAT-T (Destination IP)',  
        'SIGN_HASH_ALGS': 'Signature Hash Algorithms',  
        'NON_FIRST_FRAGMENTS': 'Non-First IKE Fragments',  
        'CHILDLESS_IKEV2_SUP': 'Childless IKEv2',  
        'INTERMEDIATE': 'Intermediate Exchange',  
        'COOKIE': 'Cookie-Based DoS Protection',  
        
        'ESP_TFC_PAD_N': 'ESPv3 TFC Padding Not Supported',  
        'MOBIKE_SUP': 'MOBIKE',  
        'MULT_AUTH': 'Multiple Auth',  
        'EAP_ONLY': 'EAP-Only Auth',  
        'MSG_ID_SYN_SUP': 'Message ID Sync',  
        'IPCOMP_SUPPORTED': 'IP Payload Compression Support',  
        'ADD_4_ADDR': 'Additional IPv4 Addresses',  
        'ADD_6_ADDR': 'Additional IPv6 Addresses',  
        'INIT_CONTACT': 'Initial Contact',  
        'HTTP_CERT_LOOKUP_SUP': 'HTTP Certificate Lookup',  
        'REKEY_SA': 'SA Rekeying'  
    }
    
    
    ike_sa_init_valid = {
        'FRAG_SUP', 'REDIR_SUP', 'HASH_ALG', 'NATD_S_IP', 'NATD_D_IP',
        'SIGN_HASH_ALGS', 'NON_FIRST_FRAGMENTS', 'CHILDLESS_IKEV2_SUP',
        'INTERMEDIATE', 'COOKIE'
    }
    ike_auth_valid = {
        'ESP_TFC_PAD_N', 'MOBIKE_SUP', 'MULT_AUTH', 'EAP_ONLY', 'MSG_ID_SYN_SUP',
        'IPCOMP_SUPPORTED', 'ADD_4_ADDR', 'ADD_6_ADDR', 'INIT_CONTACT',
        'HTTP_CERT_LOOKUP_SUP', 'REKEY_SA'
    }
    
    
    valid_notifications = ike_sa_init_valid if message_type == 'IKE_SA_INIT' else ike_auth_valid
    
    
    pattern = r'N\([^)]+\)'
    matches = re.findall(pattern, input_string)
    
    
    result = []
    for match in matches:
        key = match[2:-1]  
        if key in valid_notifications and key in value_map:
            result.append(value_map[key])
        else:
            
            print(f"Warning: Unrecognized or invalid notification for {message_type}: {key}")
    
    return ', '.join(result) if result else 'None'
ike_sa_init_string = '2025-07-18 20:16:22.839 15[ENC] <4> parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) N(SIGN_HASH_ALGS) N(NON_FIRST_FRAGMENTS) N(CHILDLESS_IKEV2_SUP) N(INTERMEDIATE) N(COOKIE) ]'
ike_auth_string = '2025-07-18 20:16:22.898 07[ENC] <4> parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr AUTH N(ESP_TFC_PAD_N) SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) N(IPCOMP_SUPPORTED) N(ADD_6_ADDR) N(HTTP_CERT_LOOKUP_SUP) N(REKEY_SA) ]'
print("IKE_SA_INIT Results:")
print(_map_ikev2_vendor_capabilities("IKE_SA_INIT", ike_sa_init_string))
print("\nIKE_AUTH Results:")
print(_map_ikev2_vendor_capabilities("IKE_AUTH", ike_auth_string))