Skip to content

Commit

Permalink
chore: add support for --key-val in ipsw ota extract and ls cmds
Browse files Browse the repository at this point in the history
  • Loading branch information
blacktop committed Aug 2, 2024
1 parent fa87e95 commit 5d4f094
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 4 deletions.
4 changes: 3 additions & 1 deletion cmd/ipsw/cmd/ota/ota_extract.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ func init() {
otaExtractCmd.Flags().BoolP("kernel", "k", false, "Extract kernelcache")
otaExtractCmd.Flags().StringP("pattern", "p", "", "Regex pattern to match files")
otaExtractCmd.Flags().StringP("range", "r", "", "Regex pattern control the payloadv2 file range to search")
otaExtractCmd.Flags().StringP("key-val", "b", "", "Base64 encoded symmetric encryption key")
otaExtractCmd.Flags().BoolP("confirm", "y", false, "Confirm searching for pattern in payloadv2 files")
otaExtractCmd.Flags().BoolP("decomp", "x", false, "Decompress pbzx files")
otaExtractCmd.Flags().StringP("output", "o", "", "Output folder")
Expand All @@ -53,6 +54,7 @@ func init() {
viper.BindPFlag("ota.extract.kernel", otaExtractCmd.Flags().Lookup("kernel"))
viper.BindPFlag("ota.extract.pattern", otaExtractCmd.Flags().Lookup("pattern"))
viper.BindPFlag("ota.extract.range", otaExtractCmd.Flags().Lookup("range"))
viper.BindPFlag("ota.extract.key-val", otaExtractCmd.Flags().Lookup("key-val"))
viper.BindPFlag("ota.extract.confirm", otaExtractCmd.Flags().Lookup("confirm"))
viper.BindPFlag("ota.extract.decomp", otaExtractCmd.Flags().Lookup("decomp"))
viper.BindPFlag("ota.extract.output", otaExtractCmd.Flags().Lookup("output"))
Expand Down Expand Up @@ -85,7 +87,7 @@ var otaExtractCmd = &cobra.Command{
output = filepath.Clean(viper.GetString("ota.extract.output"))
}

o, err := ota.Open(filepath.Clean(args[0]))
o, err := ota.Open(filepath.Clean(args[0]), viper.GetString("ota.extract.key-val"))
if err != nil {
return fmt.Errorf("failed to open OTA file: %v", err)
}
Expand Down
4 changes: 3 additions & 1 deletion cmd/ipsw/cmd/ota/ota_ls.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,13 @@ func init() {
otaLsCmd.Flags().BoolP("payload", "p", false, "List the payloadv2 files")
otaLsCmd.Flags().StringP("pattern", "r", "", "Regex pattern to match payloadv2 files")
otaLsCmd.Flags().BoolP("bom", "b", false, "List the post.bom files")
otaLsCmd.Flags().StringP("key-val", "b", "", "Base64 encoded symmetric encryption key")
otaLsCmd.Flags().BoolP("json", "j", false, "Output in JSON format")
otaLsCmd.MarkFlagsMutuallyExclusive("payload", "bom")
viper.BindPFlag("ota.ls.pattern", otaLsCmd.Flags().Lookup("pattern"))
viper.BindPFlag("ota.ls.payload", otaLsCmd.Flags().Lookup("payload"))
viper.BindPFlag("ota.ls.bom", otaLsCmd.Flags().Lookup("bom"))
viper.BindPFlag("ota.ls.key-val", otaLsCmd.Flags().Lookup("key-val"))
viper.BindPFlag("ota.ls.json", otaLsCmd.Flags().Lookup("json"))
}

Expand All @@ -66,7 +68,7 @@ var otaLsCmd = &cobra.Command{
}
color.NoColor = viper.GetBool("no-color")

ota, err := ota.Open(filepath.Clean(args[0]))
ota, err := ota.Open(filepath.Clean(args[0]), viper.GetString("ota.ls.key-val"))
if err != nil {
return fmt.Errorf("failed to open OTA file: %v", err)
}
Expand Down
9 changes: 7 additions & 2 deletions pkg/ota/aa.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,16 @@ func NewOTA(r io.ReaderAt, size int64) (*AA, error) {
return f, nil
}

func Open(name string) (*AA, error) {
func Open(name string, symmetricKey ...string) (*AA, error) {
if isAEA, err := magic.IsAEA(name); err != nil {
return nil, err
} else if isAEA { // check if file is AEA encrypted
key, _ := getKeyFromName(name)
var key string
if len(symmetricKey) > 0 {
key = symmetricKey[0]
} else {
key, _ = getKeyFromName(name)
}
name, err = aea.Decrypt(&aea.DecryptConfig{
Input: name,
Output: os.TempDir(),
Expand Down

0 comments on commit 5d4f094

Please sign in to comment.