#include <stdio.h>
#include <string.h>
#include <linux/xfrm.h>
#include <netinet/in.h>
int main(void){
    struct xfrm_usersa_info sa={0};
    sa.id.daddr.a6[0]=__builtin_bswap32(0xfe800000);
    sa.id.daddr.a6[3]=__builtin_bswap32(0x00000002);
    sa.id.spi=__builtin_bswap32(0xdeadbeef);
    sa.id.proto=IPPROTO_ESP;
    sa.saddr.a6[0]=__builtin_bswap32(0xfe800000);
    sa.saddr.a6[3]=__builtin_bswap32(0x00000001);
    sa.lft.soft_byte_limit=sa.lft.hard_byte_limit=~0ULL;
    sa.lft.soft_packet_limit=sa.lft.hard_packet_limit=~0ULL;
    sa.lft.soft_add_expires_seconds=sa.lft.hard_add_expires_seconds=~0ULL;
    sa.lft.soft_use_expires_seconds=sa.lft.hard_use_expires_seconds=~0ULL;
    sa.reqid=1; sa.family=AF_INET6; sa.mode=0; sa.replay_window=32;
    // AEAD attr
    struct xfrm_algo_aead aead; memset(&aead,0,sizeof(aead));
    strncpy(aead.alg_name,"rfc4106(gcm(aes))",64);
    aead.alg_key_len=160; aead.alg_icv_len=128;
    char key[20]={0};
    char out[512]; int p=0;
    memcpy(out+p,&sa,sizeof(sa)); p+=sizeof(sa);
    // nlattr header
    unsigned short nla_len=4+sizeof(aead)+20;
    unsigned short nla_type=9;
    memcpy(out+p,&nla_len,2); p+=2;
    memcpy(out+p,&nla_type,2); p+=2;
    memcpy(out+p,&aead,sizeof(aead)); p+=sizeof(aead);
    memcpy(out+p,key,20); p+=20;
    // Write to stdout as hex
    for(int i=0;i<p;i++) printf("%02x",((unsigned char*)out)[i]);
    printf("\n");
    return 0;
}
