#name #package #family #applications #calculate #calculating #msix

no-std package-family-name

Library for calculating MSIX Package Family Name values

5 stable releases

2.0.1 Oct 30, 2024
2.0.0 Jul 29, 2024
1.2.1 Jul 29, 2024
1.1.0 Dec 13, 2023
1.0.0 Dec 5, 2023

#75 in No standard library

Download history 572/week @ 2024-07-27 156/week @ 2024-08-03 197/week @ 2024-08-10 201/week @ 2024-08-17 197/week @ 2024-08-24 115/week @ 2024-08-31 40/week @ 2024-09-07 76/week @ 2024-09-14 79/week @ 2024-09-21 155/week @ 2024-09-28 131/week @ 2024-10-05 87/week @ 2024-10-12 94/week @ 2024-10-19 224/week @ 2024-10-26 106/week @ 2024-11-02 116/week @ 2024-11-09

554 downloads per month
Used in komac

MIT/Apache

10KB
147 lines

Package Family Name

Test Status

A Rust library for calculating MSIX Package Family Name values.

This is a #![no_std] library.

Every MSIX application has a package family name value, which looks a bit like AppName_zj75k085cmj1a. This value can easily be found by running Get-AppxPackage <name> in PowerShell for an installed MSIX package and scrolling to PackageFullName.

However, we can work out a package family name value without needing to install the package at all. That's where this library comes into play.

Usage

Add this to your Cargo.toml:

[dependencies]
package-family-name = "2"
let package_family_name = PackageFamilyName::new("AppName", "Publisher Software"); // AppName_zj75k085cmj1a

How a package family name is calculated

In short, a package family name is made up of two parts:

  • Identity name (AppName)
  • Identity publisher (Publisher Software)

These steps are then taken:

  1. UTF-16 encode the identity publisher
  2. Calculate a SHA256 hash of the encoded publisher
  3. Take the first 8 bytes of the hash
  4. Encode the result with Douglas Crockford Base32
  5. Join the identity name and the encoded value with an underscore (AppName_zj75k085cmj1a)

Why would I need to calculate a package family name?

Whilst this is a niche library, there are use cases. For example, when submitting an MSIX package to winget-pkgs, a package family name value is a required as part of the manifest.

Acknowledgements

@marcinotorowski has produced a step by step explanation of how to calculate the hash part of the package family name. This post can be found here.

License

Licensed under either of:

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~1.5MB
~27K SLoC