Skip to content

Instantly share code, notes, and snippets.

@WitherOrNot
Last active July 4, 2026 22:16
Show Gist options
  • Select an option

  • Save WitherOrNot/c34c4c7b893e89ab849ce04e007d89a9 to your computer and use it in GitHub Desktop.

Select an option

Save WitherOrNot/c34c4c7b893e89ab849ce04e007d89a9 to your computer and use it in GitHub Desktop.
Terminal Services License Server ID + License Key Pack generator
from Crypto.Cipher import ARC4
from hashlib import sha1, md5
from random import randint
from ecutils.core import Point, EllipticCurve
from sys import argv
KCHARS = "BCDFGHJKMPQRTVWXY2346789"
SPK_ECKEY = {
"a": 1,
"b": 0,
"g": {
"x": 10692194187797070010417373067833672857716423048889432566885309624149667762706899929433420143814127803064297378514651,
"y": 14587399915883137990539191966406864676102477026583239850923355829082059124877792299572208431243410905713755917185109
},
"n": 629063109922370885449,
"p": 21782971228112002125810473336838725345308036616026120243639513697227789232461459408261967852943809534324870610618161,
"priv": 153862071918555979944,
"pub": {
"x": 3917395608307488535457389605368226854270150445881753750395461980792533894109091921400661704941484971683063487980768,
"y": 8858262671783403684463979458475735219807686373661776500155868309933327116988404547349319879900761946444470688332645
}
}
LKP_ECKEY = {
"a": 1,
"b": 0,
"g": {
"x": 18999816458520350299014628291870504329073391058325678653840191278128672378485029664052827205905352913351648904170809,
"y": 7233699725243644729688547165924232430035643592445942846958231777803539836627943189850381859836033366776176689124317
},
"n": 675048016158598417213,
"p": 28688293616765795404141427476803815352899912533728694325464374376776313457785622361119232589082131818578591461837297,
"priv": 100266970209474387075,
"pub": {
"x": 7147768390112741602848314103078506234267895391544114241891627778383312460777957307647946308927283757886117119137500,
"y": 20525272195909974311677173484301099561025532568381820845650748498800315498040161314197178524020516408371544778243934
}
}
def encode_pkey(n):
out = ""
while n > 0:
out = KCHARS[n % 24] + out
n //= 24
out = "-".join([out[i:i+5] for i in range(0, len(out), 5)])
return out
def decode_pkey(k):
k = k.replace("-", "")
out = 0
for c in k:
out *= 24
out += KCHARS.index(c)
return out
def int_to_bytes(n, l=None):
n = int(n)
if not l:
l = (n.bit_length() + 7) // 8
return n.to_bytes(l, byteorder="little")
def make_curve(curve_def):
G = Point(x=curve_def["g"]["x"], y=curve_def["g"]["y"])
K = Point(x=curve_def["pub"]["x"], y=curve_def["pub"]["y"])
E = EllipticCurve(p=curve_def["p"], a=curve_def["a"], b=curve_def["b"], G=G, n=curve_def["n"], h=1)
return E, G, K
def get_spkid(pid):
spkid_s = pid[10:16] + pid[18:23]
return int(spkid_s.split("-")[0])
def validate_tskey(pid, tskey, is_spk=True):
keydata = decode_pkey(tskey).to_bytes(21, "little")
rk = md5(pid.encode("utf-16-le")).digest()[:5] + b"\x00" * 11
c = ARC4.new(rk)
dc_kdata = c.decrypt(keydata)
keydata = dc_kdata[:7]
sigdata = int.from_bytes(dc_kdata[7:], "little")
h = sigdata & 0x7ffffffff
s = (sigdata >> 35) & 0x1fffffffffffffffff
params = SPK_ECKEY if is_spk else LKP_ECKEY
E, G, K = make_curve(params)
R = E.add_points(E.multiply_point(h, K), E.multiply_point(s, G))
md = sha1(keydata + int_to_bytes(R.x, 48) + int_to_bytes(R.y, 48)).digest()
ht = ((int.from_bytes(md[4:8], "little") >> 29) << 32) | (int.from_bytes(md[:4], "little"))
spkid = int.from_bytes(keydata, "little") & 0x1FFFFFFFFF
return h == ht and (not is_spk or spkid == get_spkid(pid))
def generate_tskey(pid, keydata, is_spk=True):
params = SPK_ECKEY if is_spk else LKP_ECKEY
priv = SPK_ECKEY["priv"] if is_spk else LKP_ECKEY["priv"]
E, G, K = make_curve(params)
s = 0
while True:
c = randint(1, E.n - 1)
R = E.multiply_point(c, G)
md = sha1(keydata + int_to_bytes(R.x, 48) + int_to_bytes(R.y, 48)).digest()
h = ((int.from_bytes(md[4:8], "little") >> 29) << 32) | (int.from_bytes(md[:4], "little"))
s = ((-priv * h + c) % E.n) & 0x1fffffffffffffffff
keyinf = int.from_bytes(keydata, "little")
pkdata = ((s << 91) | (h << 56) | keyinf).to_bytes(21, "little")
rk = md5(pid.encode("utf-16-le")).digest()[:5] + b"\x00" * 11
c = ARC4.new(rk)
pke = c.encrypt(pkdata)[:20]
pk = int.from_bytes(pke, "little")
pkstr = encode_pkey(pk)
if s < 0x1fffffffffffffff and validate_tskey(pid, pkstr, is_spk):
return pkstr
def generate_spk(pid):
spkid = get_spkid(pid)
spkdata = spkid.to_bytes(7, "little")
return generate_tskey(pid, spkdata)
def generate_lkp(pid, count, major_ver, minor_ver, chid):
version = 1
if (major_ver == 5 and minor_ver > 0) or major_ver > 5:
version = (major_ver << 3) | minor_ver
lkpinfo = (chid << 46) | (count << 32) | (2 << 18) | (144 << 10) | (version << 3)
lkpdata = lkpinfo.to_bytes(7, "little")
return generate_tskey(pid, lkpdata, False)
if __name__ == "__main__":
if len(argv) == 2:
pid = argv[1]
print(f"License Server ID: {generate_spk(pid)}")
elif len(argv) == 5:
pid = argv[1]
count = int(argv[2])
ver_major, ver_minor = map(int, argv[3].split("."))
chid = int(argv[4])
print(f"License Key Pack ID: {generate_lkp(pid, count, ver_major, ver_minor, chid)}")
else:
print(f"Usage: {argv[0]} <pid> [<count> <version> <chid>]")
print(f"Example: {argv[0]} 00490-92005-99454-AT527 1234 10.3 32")
<TlsBrandingVersions>
<!-- Array of OSVersionStr objects from lsdata.h -->
<OSVersions>
<OSVersion OSVersionID="0x50000" OSVerResourceID="40001" FeatureMask="0">WIN_2000_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_W2K</OSVersion>
<OSVersion OSVersionID="0x50002" OSVerResourceID="40002" FeatureMask="0">WIN_2003_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_W2K3</OSVersion>
<OSVersion OSVersionID="0x60000" OSVerResourceID="40003" FeatureMask="0">WIN_2008_OS_VERSION, IDS_LICBRAND_OS_VERSION_W2K8</OSVersion>
<OSVersion OSVersionID="0x60001" OSVerResourceID="40007" FeatureMask="0">WIN_2008_R2_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_W2K8R2</OSVersion>
<OSVersion OSVersionID="0x60002" OSVerResourceID="40008" FeatureMask="0">WIND8WS_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_WIN8</OSVersion>
<OSVersion OSVersionID="0x60003" OSVerResourceID="40009" FeatureMask="0">WIND8WS_R2_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_WIN8R2</OSVersion>
<OSVersion OSVersionID="0xA0000" OSVerResourceID="40010" FeatureMask="0">WIN_THRESHOLD_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_THRESHOLD</OSVersion>
<OSVersion OSVersionID="0xA0001" OSVerResourceID="40011" FeatureMask="15">WIN_2019_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_2019</OSVersion>
<OSVersion OSVersionID="0xA0002" OSVerResourceID="40012" FeatureMask="16">WIN_2022_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_2022</OSVersion>
<OSVersion OSVersionID="0xA0003" OSVerResourceID="40013" FeatureMask="16">WIN_2025_OS_VERSION, IDS_LICBRAND_CAL_OS_VERSION_2025</OSVersion>
</OSVersions>
<!-- Array of OSVersionToCalVersion objects from lsdata.h -->
<OSToCALVersions>
<OSToCALVersion OSVersionID="0x60001" CALVersionID="0x60000">CAL versions are same for both 2K8 and 2K8R2</OSToCALVersion>
<OSToCALVersion OSVersionID="0x60003" CALVersionID="0x60002">CAL versions are same for both 2K12 and 2K12R2</OSToCALVersion>
</OSToCALVersions>
<!-- Array of WMIProductVersion objects from lsdata.h -->
<WMIProductVersions>
<WMIProductVersion WMIVersionID="0" WMICALVersion="0x50000" WMICALVerResourceID="40001">WIN_2000_CAL_VERSION, IDS_LICBRAND_CAL_OS_VERSION_W2K</WMIProductVersion>
<WMIProductVersion WMIVersionID="1" WMICALVersion="0x50002" WMICALVerResourceID="40002">WIN_2003_CAL_VERSION, IDS_LICBRAND_CAL_OS_VERSION_W2K3</WMIProductVersion>
<WMIProductVersion WMIVersionID="2" WMICALVersion="0x60000" WMICALVerResourceID="40006">WIN_2008_AND_R2_CAL_VERSION, IDS_LICBRAND_CAL_VERSION_W2K8_W2K8R2</WMIProductVersion>
<WMIProductVersion WMIVersionID="4" WMICALVersion="0x60002" WMICALVerResourceID="40008">WIND8WS_CAL_VERSION, IDS_LICBRAND_CAL_OS_VERSION_WIN8</WMIProductVersion>
<WMIProductVersion WMIVersionID="5" WMICALVersion="0xA0000" WMICALVerResourceID="40010">WIN_THRESHOLD_CAL_VERSION, IDS_LICBRAND_CAL_OS_VERSION_THRESHOLD</WMIProductVersion>
<WMIProductVersion WMIVersionID="6" WMICALVersion="0xA0001" WMICALVerResourceID="40011">WIN_2019_CAL_VERSION, IDS_LICBRAND_CAL_OS_VERSION_2019</WMIProductVersion>
<WMIProductVersion WMIVersionID="7" WMICALVersion="0xA0002" WMICALVerResourceID="40012">WIN_2022_CAL_VERSION, IDS_LICBRAND_CAL_OS_VERSION_2022</WMIProductVersion>
<WMIProductVersion WMIVersionID="8" WMICALVersion="0xA0003" WMICALVerResourceID="40013">WIN_2025_CAL_VERSION, IDS_LICBRAND_CAL_OS_VERSION_2025</WMIProductVersion>
</WMIProductVersions>
<!-- Array of WMIProductType objects from lsdata.h -->
<WMIProductTypes>
<WMIProductType WMIProductID="0" CALModel="A02" CALType="S">PER_DEVICE_ENF_MODEL, TERMSERV_TS_TYPE</WMIProductType>
<WMIProductType WMIProductID="1" CALModel="C50" CALType="S">PER_USER_ENF_MODEL, TERMSERV_TS_TYPE</WMIProductType>
<WMIProductType WMIProductID="2" CALModel="B96" CALType="I">EXTERNAL_CONN_ENF_MODEL, TERMSERV_INTERNET_TYPE</WMIProductType>
<WMIProductType WMIProductID="3" CALModel="A02" CALType="EX">PER_DEVICE_ENF_MODEL, TERMSERV_FREE_TYPE</WMIProductType>
<WMIProductType WMIProductID="4" CALModel="A02" CALType="VDI">PER_DEVICE_ENF_MODEL, TERMSERV_VDI_TYPE</WMIProductType>
<WMIProductType WMIProductID="5" CALModel="A02" CALType="VDIP">PER_DEVICE_ENF_MODEL, TERMSERV_VDIP_TYPE</WMIProductType>
<WMIProductType WMIProductID="6" CALModel="A02" CALType="VDIS">PER_DEVICE_ENF_MODEL, TERMSERV_VDI_SUITE_TYPE</WMIProductType>
</WMIProductTypes>
<!-- Array of CALInstance objects from lsdata.h -->
<CALInstances>
<!-- WIN 2K CAL Instances -->
<CALInstance CHID="EX-001" CALVersion="0x50000" CALModel="A02" CALType="EX" CompanyNameResourceID="40005" PlatformID="2" CALStrShortResID="60000" CALStrLongResID="60100" CALVerStrResID="40001" CALInstaceDescResID="60200" CALImportDescResID="60200" MinSupportedLSVersion="0x50000" CALSupportFlags="4"/>
<CALInstance CHID="001" CALVersion="0x50000" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60001" CALStrLongResID="60101" CALVerStrResID="40001" CALInstaceDescResID="60201" CALImportDescResID="60201" MinSupportedLSVersion="0x50000" CALSupportFlags="4"/>
<CALInstance CHID="002" CALVersion="0x50000" CALModel="B96" CALType="I" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60002" CALStrLongResID="60102" CALVerStrResID="40001" CALInstaceDescResID="60202" CALImportDescResID="60202" MinSupportedLSVersion="0x50000" CALSupportFlags="4"/>
<!-- WIN 2K3 CAL Instances -->
<CALInstance CHID="003" CALVersion="0x50002" CALModel="C50" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60003" CALStrLongResID="60103" CALVerStrResID="40002" CALInstaceDescResID="60203" CALImportDescResID="60400" MinSupportedLSVersion="0x50002" CALSupportFlags="8"/>
<CALInstance CHID="004" CALVersion="0x50002" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60001" CALStrLongResID="60101" CALVerStrResID="40002" CALInstaceDescResID="60204" CALImportDescResID="60401" MinSupportedLSVersion="0x50002" CALSupportFlags="8"/>
<!-- WIN 2K8 and 2K8R2 CAL Instances -->
<CALInstance CHID="005" CALVersion="0x60000" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60004" CALStrLongResID="60104" CALVerStrResID="40006" CALInstaceDescResID="60205" CALImportDescResID="60402" MinSupportedLSVersion="0x60000" CALSupportFlags="32"/>
<CALInstance CHID="006" CALVersion="0x60000" CALModel="C50" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60005" CALStrLongResID="60105" CALVerStrResID="40006" CALInstaceDescResID="60206" CALImportDescResID="60403" MinSupportedLSVersion="0x60000" CALSupportFlags="32"/>
<CALInstance CHID="009" CALVersion="0x60000" CALModel="A02" CALType="VDI" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60006" CALStrLongResID="60106" CALVerStrResID="40007" CALInstaceDescResID="60207" CALImportDescResID="60404" MinSupportedLSVersion="0x60001" CALSupportFlags="256"/>
<CALInstance CHID="010" CALVersion="0x60000" CALModel="A02" CALType="VDIP" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60007" CALStrLongResID="60107" CALVerStrResID="40007" CALInstaceDescResID="60208" CALImportDescResID="60405" MinSupportedLSVersion="0x60001" CALSupportFlags="256"/>
<CALInstance CHID="016" CALVersion="0x60000" CALModel="A02" CALType="VDIS" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60010" CALStrLongResID="60110" CALVerStrResID="40007" CALInstaceDescResID="60207" CALImportDescResID="60404" MinSupportedLSVersion="0x60001" CALSupportFlags="0"/>
<!-- WIN 2K12 and 2K12R2 CAL Instances -->
<CALInstance CHID="011" CALVersion="0x60002" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60008" CALStrLongResID="60108" CALVerStrResID="40008" CALInstaceDescResID="60209" CALImportDescResID="60406" MinSupportedLSVersion="0x60002" CALSupportFlags="0"/>
<CALInstance CHID="012" CALVersion="0x60002" CALModel="C50" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60009" CALStrLongResID="60109" CALVerStrResID="40008" CALInstaceDescResID="60210" CALImportDescResID="60407" MinSupportedLSVersion="0x60002" CALSupportFlags="0"/>
<CALInstance CHID="015" CALVersion="0x60002" CALModel="A02" CALType="VDIS" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60010" CALStrLongResID="60110" CALVerStrResID="40008" CALInstaceDescResID="60211" CALImportDescResID="60408" MinSupportedLSVersion="0x60002" CALSupportFlags="0"/>
<!-- WIN 2K16 CAL Instances -->
<CALInstance CHID="020" CALVersion="0xA0000" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60008" CALStrLongResID="60108" CALVerStrResID="40010" CALInstaceDescResID="60215" CALImportDescResID="60415" MinSupportedLSVersion="0xA0000" CALSupportFlags="0"/>
<CALInstance CHID="021" CALVersion="0xA0000" CALModel="C50" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60009" CALStrLongResID="60109" CALVerStrResID="40010" CALInstaceDescResID="60216" CALImportDescResID="60416" MinSupportedLSVersion="0xA0000" CALSupportFlags="0"/>
<CALInstance CHID="022" CALVersion="0xA0000" CALModel="A02" CALType="VDIS" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60010" CALStrLongResID="60110" CALVerStrResID="40010" CALInstaceDescResID="60217" CALImportDescResID="60417" MinSupportedLSVersion="0xA0000" CALSupportFlags="0"/>
<!-- WIN 2K19 CAL Instances -->
<CALInstance CHID="026" CALVersion="0xA0001" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60008" CALStrLongResID="60108" CALVerStrResID="40011" CALInstaceDescResID="60220" CALImportDescResID="60420" MinSupportedLSVersion="0xA0001" CALSupportFlags="0"/>
<CALInstance CHID="027" CALVersion="0xA0001" CALModel="C50" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60009" CALStrLongResID="60109" CALVerStrResID="40011" CALInstaceDescResID="60221" CALImportDescResID="60421" MinSupportedLSVersion="0xA0001" CALSupportFlags="0"/>
<CALInstance CHID="028" CALVersion="0xA0001" CALModel="A02" CALType="VDIS" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60010" CALStrLongResID="60110" CALVerStrResID="40011" CALInstaceDescResID="60222" CALImportDescResID="60422" MinSupportedLSVersion="0xA0001" CALSupportFlags="0"/>
<!-- WIN 2K21 CAL Instances -->
<CALInstance CHID="029" CALVersion="0xA0002" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60008" CALStrLongResID="60108" CALVerStrResID="40012" CALInstaceDescResID="60223" CALImportDescResID="60423" MinSupportedLSVersion="0xA0002" CALSupportFlags="0"/>
<CALInstance CHID="030" CALVersion="0xA0002" CALModel="C50" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60009" CALStrLongResID="60109" CALVerStrResID="40012" CALInstaceDescResID="60224" CALImportDescResID="60424" MinSupportedLSVersion="0xA0002" CALSupportFlags="0"/>
<CALInstance CHID="031" CALVersion="0xA0002" CALModel="A02" CALType="VDIS" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60010" CALStrLongResID="60110" CALVerStrResID="40012" CALInstaceDescResID="60225" CALImportDescResID="60425" MinSupportedLSVersion="0xA0002" CALSupportFlags="0"/>
<!-- WIN 2K25 CAL Instances -->
<CALInstance CHID="032" CALVersion="0xA0003" CALModel="A02" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60008" CALStrLongResID="60108" CALVerStrResID="40013" CALInstaceDescResID="60226" CALImportDescResID="60426" MinSupportedLSVersion="0xA0003" CALSupportFlags="0"/>
<CALInstance CHID="033" CALVersion="0xA0003" CALModel="C50" CALType="S" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60009" CALStrLongResID="60109" CALVerStrResID="40013" CALInstaceDescResID="60227" CALImportDescResID="60427" MinSupportedLSVersion="0xA0003" CALSupportFlags="0"/>
<CALInstance CHID="034" CALVersion="0xA0003" CALModel="A02" CALType="VDIS" CompanyNameResourceID="40005" PlatformID="0xFF" CALStrShortResID="60010" CALStrLongResID="60110" CALVerStrResID="40013" CALInstaceDescResID="60228" CALImportDescResID="60428" MinSupportedLSVersion="0xA0003" CALSupportFlags="0"/>
</CALInstances>
<!-- Array of RetailCALGroupIDs objects from lsdata.h -->
<RetailCALGroups>
<RetailCALGroup CHID="012" NoOfCALs="1" GroupId="1759"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 1 User </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="1" GroupId="1760"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 1 Device </RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="1" GroupId="1761"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 1 User AE </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="1" GroupId="1762"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 1 Device AE </RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="5" GroupId="1763"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 5 User </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="5" GroupId="1764"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 5 Device </RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="5" GroupId="1765"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 5 User AE </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="5" GroupId="1766"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 5 Device AE </RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="20" GroupId="1767"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 20 User </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="20" GroupId="1768"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 20 Device </RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="20" GroupId="1769"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 20 User AE </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="20" GroupId="1770"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 20 Device AE </RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="10" GroupId="1771"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 10 User MAPS </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="10" GroupId="1772"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 10 Device MAPS</RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="25" GroupId="1773"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 25 User MPN </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="25" GroupId="1774"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 25 Device MPN</RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="50" GroupId="1775"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 50 User MPN </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="50" GroupId="1776"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 50 Device MPN</RetailCALGroup>
<RetailCALGroup CHID="012" NoOfCALs="50" GroupId="1902"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 50 User MSDN </RetailCALGroup>
<RetailCALGroup CHID="011" NoOfCALs="50" GroupId="1903"> Win Rmt Dsktp Svcs CAL 2012 RTM ServerStandard 50 Device MSDN</RetailCALGroup>
<!-- Server 2016 Per-User Retail CAL's -->
<RetailCALGroup CHID="021" NoOfCALs="1" GroupId="3809"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 1 User </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="1" GroupId="3810"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 1 User AE </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="5" GroupId="3811"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 5 User </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="5" GroupId="3812"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 5 User AE </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="20" GroupId="3813"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 20 User </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="20" GroupId="3814"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 20 User AE </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="10" GroupId="3815"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 10 User MAPS </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="25" GroupId="3816"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 25 User MPN </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="50" GroupId="3817"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 50 User MPN </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="50" GroupId="3818"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 50 User MSDN </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="10" GroupId="3819"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 10 User OEM </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="50" GroupId="3820"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 50 User OEM </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="100" GroupId="3821"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 100 User OEM </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="500" GroupId="3822"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 500 User CSP </RetailCALGroup>
<RetailCALGroup CHID="021" NoOfCALs="1000" GroupId="3823"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 1000 User IUO</RetailCALGroup>
<!-- Server 2016 Per-Device Retail CAL's -->
<RetailCALGroup CHID="020" NoOfCALs="1" GroupId="3824"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 1 Device </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="1" GroupId="3825"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 1 Device AE </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="5" GroupId="3826"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 5 Device </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="5" GroupId="3827"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 5 Device AE </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="20" GroupId="3828"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 20 Device </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="20" GroupId="3829"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 20 Device AE </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="10" GroupId="3830"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 10 Device MAPS </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="25" GroupId="3831"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 25 Device MPN </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="50" GroupId="3832"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 50 Device MPN </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="50" GroupId="3833"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 50 Device MSDN </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="10" GroupId="3834"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 10 Device OEM </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="50" GroupId="3835"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 50 Device OEM </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="100" GroupId="3836"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 100 Device OEM </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="500" GroupId="3837"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 500 Device CSP </RetailCALGroup>
<RetailCALGroup CHID="020" NoOfCALs="1000" GroupId="3838"> Win Rmt Dsktp Svcs CAL 2016 RTM ServerStandard 1000 Device IUO </RetailCALGroup>
<!-- Server 2019 Per-User Retail CAL's -->
<RetailCALGroup CHID="027" NoOfCALs="1" GroupId="4260"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 1 User </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="1" GroupId="4261"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 1 User AE </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="5" GroupId="4262"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 5 User </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="5" GroupId="4263"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 5 User AE </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="20" GroupId="4264"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 20 User </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="20" GroupId="4265"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 20 User AE </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="10" GroupId="4266"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 10 User MAPS </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="25" GroupId="4267"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 25 User MPN </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="50" GroupId="4268"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 50 User MPN </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="50" GroupId="4269"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 50 User MSDN </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="10" GroupId="4270"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 10 User OEM </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="50" GroupId="4271"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 50 User OEM </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="100" GroupId="4272"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 100 User OEM </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="500" GroupId="4273"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 500 User CSP </RetailCALGroup>
<RetailCALGroup CHID="027" NoOfCALs="1000" GroupId="4274"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 1000 User IUO</RetailCALGroup>
<!-- Server 2019 Per-Device Retail CAL's -->
<RetailCALGroup CHID="026" NoOfCALs="1" GroupId="4275"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 1 Device </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="1" GroupId="4276"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 1 Device AE </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="5" GroupId="4277"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 5 Device </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="5" GroupId="4278"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 5 Device AE </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="20" GroupId="4279"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 20 Device </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="20" GroupId="4280"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 20 Device AE </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="10" GroupId="4281"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 10 Device MAPS </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="25" GroupId="4282"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 25 Device MPN </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="50" GroupId="4283"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 50 Device MPN </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="50" GroupId="4284"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 50 Device MSDN </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="10" GroupId="4285"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 10 Device OEM </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="50" GroupId="4286"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 50 Device OEM </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="100" GroupId="4287"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 100 Device OEM </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="500" GroupId="4288"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 500 Device CSP </RetailCALGroup>
<RetailCALGroup CHID="026" NoOfCALs="1000" GroupId="4289"> Win Rmt Dsktp Svcs CAL 2019 RTM ServerStandard 1000 Device IUO </RetailCALGroup>
<!-- Server 2022 Per-User Retail CAL's -->
<RetailCALGroup CHID="030" NoOfCALs="1" GroupId="4486">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 1 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="1" GroupId="4487">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 1 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="1" GroupId="4488">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 1 User AE </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="5" GroupId="4489">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 5 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="5" GroupId="4490">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 5 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="5" GroupId="4491">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 5 User AE </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="20" GroupId="4492">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 20 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="20" GroupId="4493">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 20 User AE </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="10" GroupId="4494">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MAPS 10 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="25" GroupId="4495">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MPN 25 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="50" GroupId="4496">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MPN 50 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="50" GroupId="4497">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MSDN 50 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="10" GroupId="4498">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 10 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="10" GroupId="4499">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 10 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="50" GroupId="4500">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 50 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="50" GroupId="4501">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 50 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="100" GroupId="4502">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 100 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="100" GroupId="4503">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 100 User </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="500" GroupId="4504">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 500 User CSP </RetailCALGroup>
<RetailCALGroup CHID="030" NoOfCALs="1000" GroupId="4505">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail Internal Use Only 1000 User </RetailCALGroup>
<!-- Server 2022 Per-Device Retail CAL's -->
<RetailCALGroup CHID="029" NoOfCALs="1" GroupId="4506">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 1 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="1" GroupId="4507">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 1 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="1" GroupId="4508">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 1 Device AE </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="5" GroupId="4509">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 5 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="5" GroupId="4510">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 5 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="5" GroupId="4511">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 5 Device AE </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="20" GroupId="4512">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 20 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="20" GroupId="4513">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 20 Device AE </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="10" GroupId="4514">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MAPS 10 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="25" GroupId="4515">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MPN 25 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="50" GroupId="4516">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MPN 50 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="50" GroupId="4517">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail MSDN 50 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="10" GroupId="4518">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 10 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="10" GroupId="4519">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 10 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="50" GroupId="4520">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 50 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="50" GroupId="4521">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 50 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="100" GroupId="4522">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 100 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="100" GroupId="4523">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail OEM 100 Device </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="500" GroupId="4524">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail 500 Device CSP </RetailCALGroup>
<RetailCALGroup CHID="029" NoOfCALs="1000" GroupId="4525">Win Rmt Dsktp Svcs CAL 2022 RTM ServerStandard Retail Internal Use Only 1000 Device </RetailCALGroup>
<!-- Server 2025 Per-User Retail CAL's -->
<RetailCALGroup CHID="033" NoOfCALs="1" GroupId="4942">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 1 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="1" GroupId="4943">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 1 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="1" GroupId="4944">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 1 User AE </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="5" GroupId="4945">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 5 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="5" GroupId="4946">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 5 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="5" GroupId="4947">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 5 User AE </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="20" GroupId="4948">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 20 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="20" GroupId="4949">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 20 User AE </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="10" GroupId="4950">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MAPS 10 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="25" GroupId="4951">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MPN 25 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="50" GroupId="4952">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MPN 50 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="50" GroupId="4953">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MSDN 50 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="10" GroupId="4954">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 10 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="10" GroupId="4955">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 10 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="50" GroupId="4956">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 50 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="50" GroupId="4957">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 50 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="100" GroupId="4958">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 100 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="100" GroupId="4959">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 100 User </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="500" GroupId="4960">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 500 User CSP </RetailCALGroup>
<RetailCALGroup CHID="033" NoOfCALs="1000" GroupId="4961">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail Internal Use Only 1000 User </RetailCALGroup>
<!-- Server 2025 Per-Device Retail CAL's -->
<RetailCALGroup CHID="032" NoOfCALs="1" GroupId="4962">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 1 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="1" GroupId="4963">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 1 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="1" GroupId="4964">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 1 Device AE </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="5" GroupId="4965">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 5 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="5" GroupId="4966">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 5 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="5" GroupId="4967">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 5 Device AE </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="20" GroupId="4968">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 20 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="20" GroupId="4969">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 20 Device AE </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="10" GroupId="4970">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MAPS 10 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="25" GroupId="4971">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MPN 25 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="50" GroupId="4972">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MPN 50 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="50" GroupId="4973">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail MSDN 50 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="10" GroupId="4974">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 10 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="10" GroupId="4975">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 10 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="50" GroupId="4976">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 50 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="50" GroupId="4977">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 50 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="100" GroupId="4978">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 100 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="100" GroupId="4979">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail OEM 100 Device </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="500" GroupId="4980">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail 500 Device CSP </RetailCALGroup>
<RetailCALGroup CHID="032" NoOfCALs="1000" GroupId="4981">Win Rmt Dsktp Svcs CAL 2025 RTM ServerStandard Retail Internal Use Only 1000 Device </RetailCALGroup>
</RetailCALGroups>
</TlsBrandingVersions>
@WitherOrNot

WitherOrNot commented Apr 10, 2025

Copy link
Copy Markdown
Author

Dependencies:

pip install pycryptodome ecutils

Usage:

python tspkgen.py <pid> [<count> <version> <chid>]

With just pid argument, it will generate a License Server ID (SPK).

With all arguments, it will generate License Key Pack (LKP).

Notes:

chid argument is listed in XML table

Example: server 2012 (r2) per user -> CHID 12 -> product id 12

corresponding version is 0x60002 -> 6.2

so version and chid args are 6.2 12

@wongcc2012

Copy link
Copy Markdown

I am not getting the can you provide more example for 2019/2022/2025? and its product ID?

@barrettkuo

Copy link
Copy Markdown

This worked on my 2019 RDS server.
Thanks a lot.

@ipgl

ipgl commented Mar 17, 2026

Copy link
Copy Markdown

This works on my 2022 model; I took the opportunity to add a 'Tinker' graphical interface, which made it easier and saves the keys in a text file.

@boydfields

Copy link
Copy Markdown

This works on my 2022 model; I took the opportunity to add a 'Tinker' graphical interface, which made it easier and saves the keys in a text file.

Tinker?

@samuelh2005

Copy link
Copy Markdown

This works on my 2022 model; I took the opportunity to add a 'Tinker' graphical interface, which made it easier and saves the keys in a text file.

Tinker?

Tinker is probably a typo of Tkinter which is a GUI framework for Python.

@samuelh2005

Copy link
Copy Markdown

ecutils has had a breaking rewrite meaning this code no longer works.

I have rewritten this to work:

from Crypto.Cipher import ARC4
from hashlib import sha1, md5
from random import randint
from ecutils.core import Point, CurveParams
from sys import argv

KCHARS = "BCDFGHJKMPQRTVWXY2346789"

SPK_ECKEY = {
    "a": 1,
    "b": 0,
    "g": {
        "x": 10692194187797070010417373067833672857716423048889432566885309624149667762706899929433420143814127803064297378514651,
        "y": 14587399915883137990539191966406864676102477026583239850923355829082059124877792299572208431243410905713755917185109
    },
    "n": 629063109922370885449,
    "p": 21782971228112002125810473336838725345308036616026120243639513697227789232461459408261967852943809534324870610618161,
    "priv": 153862071918555979944,
    "pub": {
        "x": 3917395608307488535457389605368226854270150445881753750395461980792533894109091921400661704941484971683063487980768,
        "y": 8858262671783403684463979458475735219807686373661776500155868309933327116988404547349319879900761946444470688332645
    }
}

LKP_ECKEY = {
    "a": 1,
    "b": 0,
    "g": {
        "x": 18999816458520350299014628291870504329073391058325678653840191278128672378485029664052827205905352913351648904170809,
        "y": 7233699725243644729688547165924232430035643592445942846958231777803539836627943189850381859836033366776176689124317
    },
    "n": 675048016158598417213,
    "p": 28688293616765795404141427476803815352899912533728694325464374376776313457785622361119232589082131818578591461837297,
    "priv": 100266970209474387075,
    "pub": {
        "x": 7147768390112741602848314103078506234267895391544114241891627778383312460777957307647946308927283757886117119137500,
        "y": 20525272195909974311677173484301099561025532568381820845650748498800315498040161314197178524020516408371544778243934
    }
}


def encode_pkey(n):
    out = ""
    
    while n > 0:
        out = KCHARS[n % 24] + out
        n //= 24
    
    out = "-".join([out[i:i+5] for i in range(0, len(out), 5)])
    return out

def decode_pkey(k):
    k = k.replace("-", "")
    out = 0
    
    for c in k:
        out *= 24
        out += KCHARS.index(c)
    
    return out

def int_to_bytes(n, l=None):
    n = int(n)
    
    if not l:
        l = (n.bit_length() + 7) // 8
    
    return n.to_bytes(l, byteorder="little")

def make_curve(curve_def):
    # Create curve parameters (no G, no methods in v2)
    curve = CurveParams(
        p=curve_def["p"],
        a=curve_def["a"],
        b=curve_def["b"],
        n=curve_def["n"],
        h=1
    )
    # Points now carry curve info and validate on construction
    G = Point(x=curve_def["g"]["x"], y=curve_def["g"]["y"], curve=curve)
    K = Point(x=curve_def["pub"]["x"], y=curve_def["pub"]["y"], curve=curve)
    
    return curve, G, K

def get_spkid(pid):
    spkid_s = pid[10:16] + pid[18:23]
    return int(spkid_s.split("-")[0])

def validate_tskey(pid, tskey, is_spk=True):
    keydata = decode_pkey(tskey).to_bytes(21, "little")
    rk = md5(pid.encode("utf-16-le")).digest()[:5] + b"\x00" * 11
    c = ARC4.new(rk)
    dc_kdata = c.decrypt(keydata)
    keydata = dc_kdata[:7]
    
    sigdata = int.from_bytes(dc_kdata[7:], "little")
    h = sigdata & 0x7ffffffff
    s = (sigdata >> 35) & 0x1fffffffffffffffff

    params = SPK_ECKEY if is_spk else LKP_ECKEY
    curve, G, K = make_curve(params)
    # Use operator overloading: p1 + p2, k * p
    R = h * K + s * G
    md = sha1(keydata + int_to_bytes(R.x, 48) + int_to_bytes(R.y, 48)).digest()
    ht = ((int.from_bytes(md[4:8], "little") >> 29) << 32) | (int.from_bytes(md[:4], "little"))
    
    spkid = int.from_bytes(keydata, "little") & 0x1FFFFFFFFF
    
    return h == ht and (not is_spk or spkid == get_spkid(pid))

def generate_tskey(pid, keydata, is_spk=True):
    params = SPK_ECKEY if is_spk else LKP_ECKEY
    priv = SPK_ECKEY["priv"] if is_spk else LKP_ECKEY["priv"]
    
    curve, G, K = make_curve(params)
    s = 0
    
    while True:
        c = randint(1, curve.n - 1)
        R = c * G
         
        md = sha1(keydata + int_to_bytes(R.x, 48) + int_to_bytes(R.y, 48)).digest()
        h = ((int.from_bytes(md[4:8], "little") >> 29) << 32) | (int.from_bytes(md[:4], "little")) 
        s = ((-priv * h + c) % curve.n) & 0x1fffffffffffffffff
        
        keyinf = int.from_bytes(keydata, "little")
        pkdata = ((s << 91) | (h << 56) | keyinf).to_bytes(21, "little")
        rk = md5(pid.encode("utf-16-le")).digest()[:5] + b"\x00" * 11
        c = ARC4.new(rk)
        pke = c.encrypt(pkdata)[:20]
        pk = int.from_bytes(pke, "little")
        pkstr = encode_pkey(pk)
        
        if s < 0x1fffffffffffffff and validate_tskey(pid, pkstr, is_spk):
            return pkstr

def generate_spk(pid):
    spkid = get_spkid(pid)
    spkdata = spkid.to_bytes(7, "little")
    
    return generate_tskey(pid, spkdata)

def generate_lkp(pid, count, major_ver, minor_ver, chid):
    version = 1
    
    if (major_ver == 5 and minor_ver > 0) or major_ver > 5:
        version = (major_ver << 3) | minor_ver
    
    lkpinfo = (chid << 46) | (count << 32) | (2 << 18) | (144 << 10) | (version << 3)
    
    lkpdata = lkpinfo.to_bytes(7, "little")
    
    return generate_tskey(pid, lkpdata, False)

if __name__ == "__main__":
    if len(argv) == 2:
        pid = argv[1]
        print(f"License Server ID: {generate_spk(pid)}")
    elif len(argv) == 5:
        pid = argv[1]
        count = int(argv[2])
        ver_major, ver_minor = map(int, argv[3].split("."))
        chid = int(argv[4])
        
        print(f"License Key Pack ID: {generate_lkp(pid, count, ver_major, ver_minor, chid)}")
    else:
        print(f"Usage: {argv[0]} <pid> [<count> <version> <chid>]")
        print(f"Example: {argv[0]} 00490-92005-99454-AT527 1234 10.3 32")

@wongcc2012

Copy link
Copy Markdown

ecutils has had a breaking rewrite meaning this code no longer works.

I have rewritten this to work:

from Crypto.Cipher import ARC4
from hashlib import sha1, md5
from random import randint
from ecutils.core import Point, CurveParams
from sys import argv

KCHARS = "BCDFGHJKMPQRTVWXY2346789"

SPK_ECKEY = {
    "a": 1,
    "b": 0,
    "g": {
        "x": 10692194187797070010417373067833672857716423048889432566885309624149667762706899929433420143814127803064297378514651,
        "y": 14587399915883137990539191966406864676102477026583239850923355829082059124877792299572208431243410905713755917185109
    },
    "n": 629063109922370885449,
    "p": 21782971228112002125810473336838725345308036616026120243639513697227789232461459408261967852943809534324870610618161,
    "priv": 153862071918555979944,
    "pub": {
        "x": 3917395608307488535457389605368226854270150445881753750395461980792533894109091921400661704941484971683063487980768,
        "y": 8858262671783403684463979458475735219807686373661776500155868309933327116988404547349319879900761946444470688332645
    }
}

LKP_ECKEY = {
    "a": 1,
    "b": 0,
    "g": {
        "x": 18999816458520350299014628291870504329073391058325678653840191278128672378485029664052827205905352913351648904170809,
        "y": 7233699725243644729688547165924232430035643592445942846958231777803539836627943189850381859836033366776176689124317
    },
    "n": 675048016158598417213,
    "p": 28688293616765795404141427476803815352899912533728694325464374376776313457785622361119232589082131818578591461837297,
    "priv": 100266970209474387075,
    "pub": {
        "x": 7147768390112741602848314103078506234267895391544114241891627778383312460777957307647946308927283757886117119137500,
        "y": 20525272195909974311677173484301099561025532568381820845650748498800315498040161314197178524020516408371544778243934
    }
}


def encode_pkey(n):
    out = ""
    
    while n > 0:
        out = KCHARS[n % 24] + out
        n //= 24
    
    out = "-".join([out[i:i+5] for i in range(0, len(out), 5)])
    return out

def decode_pkey(k):
    k = k.replace("-", "")
    out = 0
    
    for c in k:
        out *= 24
        out += KCHARS.index(c)
    
    return out

def int_to_bytes(n, l=None):
    n = int(n)
    
    if not l:
        l = (n.bit_length() + 7) // 8
    
    return n.to_bytes(l, byteorder="little")

def make_curve(curve_def):
    # Create curve parameters (no G, no methods in v2)
    curve = CurveParams(
        p=curve_def["p"],
        a=curve_def["a"],
        b=curve_def["b"],
        n=curve_def["n"],
        h=1
    )
    # Points now carry curve info and validate on construction
    G = Point(x=curve_def["g"]["x"], y=curve_def["g"]["y"], curve=curve)
    K = Point(x=curve_def["pub"]["x"], y=curve_def["pub"]["y"], curve=curve)
    
    return curve, G, K

def get_spkid(pid):
    spkid_s = pid[10:16] + pid[18:23]
    return int(spkid_s.split("-")[0])

def validate_tskey(pid, tskey, is_spk=True):
    keydata = decode_pkey(tskey).to_bytes(21, "little")
    rk = md5(pid.encode("utf-16-le")).digest()[:5] + b"\x00" * 11
    c = ARC4.new(rk)
    dc_kdata = c.decrypt(keydata)
    keydata = dc_kdata[:7]
    
    sigdata = int.from_bytes(dc_kdata[7:], "little")
    h = sigdata & 0x7ffffffff
    s = (sigdata >> 35) & 0x1fffffffffffffffff

    params = SPK_ECKEY if is_spk else LKP_ECKEY
    curve, G, K = make_curve(params)
    # Use operator overloading: p1 + p2, k * p
    R = h * K + s * G
    md = sha1(keydata + int_to_bytes(R.x, 48) + int_to_bytes(R.y, 48)).digest()
    ht = ((int.from_bytes(md[4:8], "little") >> 29) << 32) | (int.from_bytes(md[:4], "little"))
    
    spkid = int.from_bytes(keydata, "little") & 0x1FFFFFFFFF
    
    return h == ht and (not is_spk or spkid == get_spkid(pid))

def generate_tskey(pid, keydata, is_spk=True):
    params = SPK_ECKEY if is_spk else LKP_ECKEY
    priv = SPK_ECKEY["priv"] if is_spk else LKP_ECKEY["priv"]
    
    curve, G, K = make_curve(params)
    s = 0
    
    while True:
        c = randint(1, curve.n - 1)
        R = c * G
         
        md = sha1(keydata + int_to_bytes(R.x, 48) + int_to_bytes(R.y, 48)).digest()
        h = ((int.from_bytes(md[4:8], "little") >> 29) << 32) | (int.from_bytes(md[:4], "little")) 
        s = ((-priv * h + c) % curve.n) & 0x1fffffffffffffffff
        
        keyinf = int.from_bytes(keydata, "little")
        pkdata = ((s << 91) | (h << 56) | keyinf).to_bytes(21, "little")
        rk = md5(pid.encode("utf-16-le")).digest()[:5] + b"\x00" * 11
        c = ARC4.new(rk)
        pke = c.encrypt(pkdata)[:20]
        pk = int.from_bytes(pke, "little")
        pkstr = encode_pkey(pk)
        
        if s < 0x1fffffffffffffff and validate_tskey(pid, pkstr, is_spk):
            return pkstr

def generate_spk(pid):
    spkid = get_spkid(pid)
    spkdata = spkid.to_bytes(7, "little")
    
    return generate_tskey(pid, spkdata)

def generate_lkp(pid, count, major_ver, minor_ver, chid):
    version = 1
    
    if (major_ver == 5 and minor_ver > 0) or major_ver > 5:
        version = (major_ver << 3) | minor_ver
    
    lkpinfo = (chid << 46) | (count << 32) | (2 << 18) | (144 << 10) | (version << 3)
    
    lkpdata = lkpinfo.to_bytes(7, "little")
    
    return generate_tskey(pid, lkpdata, False)

if __name__ == "__main__":
    if len(argv) == 2:
        pid = argv[1]
        print(f"License Server ID: {generate_spk(pid)}")
    elif len(argv) == 5:
        pid = argv[1]
        count = int(argv[2])
        ver_major, ver_minor = map(int, argv[3].split("."))
        chid = int(argv[4])
        
        print(f"License Key Pack ID: {generate_lkp(pid, count, ver_major, ver_minor, chid)}")
    else:
        print(f"Usage: {argv[0]} <pid> [<count> <version> <chid>]")
        print(f"Example: {argv[0]} 00490-92005-99454-AT527 1234 10.3 32")

PS C:\Users\USER01\Desktop> .\RDGen02.py
Traceback (most recent call last):
File "C:\Users\USER01\Desktop\RDGen02.py", line 4, in
from ecutils.core import Point, CurveParams
ImportError: cannot import name 'CurveParams' from 'ecutils.core' (C:\Program Files\Python313\Lib\site-packages\ecutils\core.py)
PS C:\Users\USER01\Desktop> pip install ecutils
Requirement already satisfied: ecutils in C:\Program Files\Python313\Lib\site-packages (1.1.4)
PS C:\Users\USER01\Desktop> pip install ecutils.core
ERROR: Could not find a version that satisfies the requirement ecutils.core (from versions: none)
ERROR: No matching distribution found for ecutils.core
PS C:\Users\USER01\Desktop>

I cannot run with the ecutils installed.

@samuelh2005

samuelh2005 commented Mar 28, 2026

Copy link
Copy Markdown

@wongcc2012

I cannot run with the ecutils installed.

You should be running with ecutils 2.0.0, you have 1.1.4!

@wongcc2012

Copy link
Copy Markdown

solved. thank you

@boydfields

Copy link
Copy Markdown

This works on my 2022 model; I took the opportunity to add a 'Tinker' graphical interface, which made it easier and saves the keys in a text file.

Tinker?

Tinker is probably a typo of Tkinter which is a GUI framework for Python.

Thanks ๐Ÿ‘

@ppc52776

ppc52776 commented Jun 5, 2026

Copy link
Copy Markdown

It works on my 2019 rds. Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment