Skip to content

Instantly share code, notes, and snippets.

@WitherOrNot
Last active October 19, 2025 14:45
Show Gist options
  • Save WitherOrNot/c34c4c7b893e89ab849ce04e007d89a9 to your computer and use it in GitHub Desktop.
Save WitherOrNot/c34c4c7b893e89ab849ce04e007d89a9 to your computer and use it in GitHub Desktop.

Revisions

  1. WitherOrNot revised this gist Apr 10, 2025. 1 changed file with 5 additions and 5 deletions.
    10 changes: 5 additions & 5 deletions tspkgen.py
    Original file line number Diff line number Diff line change
    @@ -131,13 +131,13 @@ def generate_spk(pid):

    return generate_tskey(pid, spkdata)

    def generate_lkp(pid, count, major_ver, minor_ver, product_id):
    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 = (product_id << 46) | (count << 32) | (2 << 18) | (144 << 10) | (version << 3)
    lkpinfo = (chid << 46) | (count << 32) | (2 << 18) | (144 << 10) | (version << 3)

    lkpdata = lkpinfo.to_bytes(7, "little")

    @@ -151,9 +151,9 @@ def generate_lkp(pid, count, major_ver, minor_ver, product_id):
    pid = argv[1]
    count = int(argv[2])
    ver_major, ver_minor = map(int, argv[3].split("."))
    product_id = int(argv[4])
    chid = int(argv[4])

    print(f"License Key Pack ID: {generate_lkp(pid, count, ver_major, ver_minor, product_id)}")
    print(f"License Key Pack ID: {generate_lkp(pid, count, ver_major, ver_minor, chid)}")
    else:
    print(f"Usage: {argv[0]} <pid> [<count> <version> <product_id>]")
    print(f"Usage: {argv[0]} <pid> [<count> <version> <chid>]")
    print(f"Example: {argv[0]} 00490-92005-99454-AT527 1234 10.3 32")
  2. WitherOrNot revised this gist Apr 10, 2025. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion tspkgen.py
    Original file line number Diff line number Diff line change
    @@ -46,7 +46,7 @@ def encode_pkey(n):
    out = KCHARS[n % 24] + out
    n //= 24

    out = "".join([out[i:i+5] for i in range(0, len(out), 5)])
    out = "-".join([out[i:i+5] for i in range(0, len(out), 5)])
    return out

    def decode_pkey(k):
  3. WitherOrNot revised this gist Apr 10, 2025. No changes.
  4. WitherOrNot renamed this gist Apr 10, 2025. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  5. WitherOrNot created this gist Apr 10, 2025.
    248 changes: 248 additions & 0 deletions tspk_table.xml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,248 @@
    <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>
    159 changes: 159 additions & 0 deletions tspkgen.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,159 @@
    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, product_id):
    version = 1

    if (major_ver == 5 and minor_ver > 0) or major_ver > 5:
    version = (major_ver << 3) | minor_ver

    lkpinfo = (product_id << 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("."))
    product_id = int(argv[4])

    print(f"License Key Pack ID: {generate_lkp(pid, count, ver_major, ver_minor, product_id)}")
    else:
    print(f"Usage: {argv[0]} <pid> [<count> <version> <product_id>]")
    print(f"Example: {argv[0]} 00490-92005-99454-AT527 1234 10.3 32")