Rewrite cert generation and fix bad cert

This commit is contained in:
Xpl0itU 2024-04-20 17:44:14 +02:00
parent ba6ff5d548
commit f4eee481fe
4 changed files with 24 additions and 42 deletions

View file

@ -1,7 +1,7 @@
package wiiudownloader package wiiudownloader
import ( import (
"bytes" "encoding/binary"
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
@ -33,21 +33,28 @@ func getDefaultCert(progressReporter ProgressReporter, client *http.Client) ([]b
return nil, fmt.Errorf("failed to download OSv10 cetk, length: %d", len(cetkData)) return nil, fmt.Errorf("failed to download OSv10 cetk, length: %d", len(cetkData))
} }
func GenerateCert(tmd *TMD, progressReporter ProgressReporter, client *http.Client) (bytes.Buffer, error) { func GenerateCert(tmd *TMD, outputPath string, progressReporter ProgressReporter, client *http.Client) error {
cert := bytes.Buffer{} cert, err := os.Create(outputPath)
if err != nil {
return err
}
defer cert.Close()
if _, err := cert.Write(tmd.Certificate1); err != nil { if err := binary.Write(cert, binary.BigEndian, tmd.Certificate1); err != nil {
return bytes.Buffer{}, err return err
} }
if _, err := cert.Write(tmd.Certificate2); err != nil { if err := binary.Write(cert, binary.BigEndian, tmd.Certificate2); err != nil {
return bytes.Buffer{}, err return err
} }
defaultCert, err := getDefaultCert(progressReporter, client) defaultCert, err := getDefaultCert(progressReporter, client)
if err != nil { if err != nil {
return bytes.Buffer{}, err return err
} }
cert.Write(defaultCert)
return cert, nil if err := binary.Write(cert, binary.BigEndian, defaultCert); err != nil {
return err
}
return nil
} }

View file

@ -2,7 +2,6 @@ package main
import ( import (
"context" "context"
"encoding/binary"
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
@ -251,20 +250,9 @@ func (mw *MainWindow) ShowAll() {
wiiudownloader.GenerateTicket(filepath.Join(parentDir, "title.tik"), tmd.TitleID, titleKey, tmd.TitleVersion) wiiudownloader.GenerateTicket(filepath.Join(parentDir, "title.tik"), tmd.TitleID, titleKey, tmd.TitleVersion)
cert, err := wiiudownloader.GenerateCert(tmd, mw.progressWindow, http.DefaultClient) if err := wiiudownloader.GenerateCert(tmd, filepath.Join(parentDir, "title.cert"), mw.progressWindow, http.DefaultClient); err != nil {
if err != nil {
return return
} }
certPath := filepath.Join(parentDir, "title.cert")
certFile, err := os.Create(certPath)
if err != nil {
return
}
if err := binary.Write(certFile, binary.BigEndian, cert.Bytes()); err != nil {
return
}
defer certFile.Close()
}) })
toolsSubMenu.Append(generateFakeTicketCert) toolsSubMenu.Append(generateFakeTicketCert)

View file

@ -2,10 +2,8 @@ package wiiudownloader
import ( import (
"context" "context"
"encoding/binary"
"fmt" "fmt"
"io" "io"
"log"
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
@ -211,25 +209,13 @@ func DownloadTitle(titleID, outputDirectory string, doDecryption bool, progressR
progressReporter.SetDownloadSize(int64(titleSize)) progressReporter.SetDownloadSize(int64(titleSize))
cert, err := GenerateCert(tmd, progressReporter, client) if err := GenerateCert(tmd, filepath.Join(outputDir, "title.cert"), progressReporter, client); err != nil {
if err != nil {
if progressReporter.Cancelled() { if progressReporter.Cancelled() {
return nil return nil
} }
return err return err
} }
certPath := filepath.Join(outputDir, "title.cert")
certFile, err := os.Create(certPath)
if err != nil {
return err
}
if err := binary.Write(certFile, binary.BigEndian, cert.Bytes()); err != nil {
return err
}
certFile.Close()
log.Printf("Certificate saved to %v \n", certPath)
g, ctx := errgroup.WithContext(context.Background()) g, ctx := errgroup.WithContext(context.Background())
g.SetLimit(maxConcurrentDownloads) g.SetLimit(maxConcurrentDownloads)
sem := semaphore.NewWeighted(maxConcurrentDownloads) sem := semaphore.NewWeighted(maxConcurrentDownloads)

9
tmd.go
View file

@ -72,7 +72,7 @@ func ParseTMD(data []byte) (*TMD, error) {
return nil, err return nil, err
} }
tmd.Contents[i].Hash = make([]byte, 0x14) tmd.Contents[i].Hash = make([]byte, 0x20)
if err := binary.Read(reader, binary.BigEndian, &tmd.Contents[i].Hash); err != nil { if err := binary.Read(reader, binary.BigEndian, &tmd.Contents[i].Hash); err != nil {
return nil, err return nil, err
} }
@ -126,17 +126,18 @@ func ParseTMD(data []byte) (*TMD, error) {
} }
reader.Seek(0xB14+(0x30*int64(c)), io.SeekStart) reader.Seek(0xB14+(0x30*int64(c)), io.SeekStart)
tmd.Contents[c].Hash = make([]byte, 0x14) tmd.Contents[c].Hash = make([]byte, 0x20)
if err := binary.Read(reader, binary.BigEndian, &tmd.Contents[c].Hash); err != nil { if err := binary.Read(reader, binary.BigEndian, &tmd.Contents[c].Hash); err != nil {
return nil, err return nil, err
} }
} }
tmd.Certificate1 = make([]byte, 0x400) tmd.Certificate1 = make([]byte, 0x400)
if _, err := io.ReadFull(reader, tmd.Certificate1); err != nil { if err := binary.Read(reader, binary.BigEndian, &tmd.Certificate1); err != nil {
return nil, err return nil, err
} }
tmd.Certificate2 = make([]byte, 0x300) tmd.Certificate2 = make([]byte, 0x300)
if _, err := io.ReadFull(reader, tmd.Certificate2); err != nil { if err := binary.Read(reader, binary.BigEndian, &tmd.Certificate2); err != nil {
return nil, err return nil, err
} }
default: default: