import base64
from asn1crypto import core
from binascii import unhexlify
def encode_upn_to_der(upn,tag="A0",enc="0C"):
"""
tag = A0 -> ASN.1
tag = 0C -> UTF-8
...
enc = 0C -> UTF-8
...
"""
utf8_string = core.UTF8String(upn)
encoded_der = utf8_string.dump()
len_upn_hex = hex( len(upn) ).replace('0x','').upper()
if( len(len_upn_hex) < 2 ): len_upn_hex = "0" + len_upn_hex
len_upn_hex_2 = hex( len(upn)+len(enc) ).replace('0x','').upper()
if( len(len_upn_hex) < 2 ): len_upn_hex_2 = "0" + len_upn_hex_2
prfx = tag + len_upn_hex_2 + enc + len_upn_hex
prfx = unhexlify(prfx)
base64_der = base64.b64encode(prfx + encoded_der).decode('utf-8')
return base64_der
upn = "abcd$@ABCD.com"
base64_der = encode_upn_to_der(upn)
print("""
UPN : %s
base64_DER : %s
""" % (upn,base64_der)
)