Skip to content

Commit 51a0a3a

Browse files
committed
support parsing multiple wv message types
1 parent b03adc3 commit 51a0a3a

1 file changed

Lines changed: 59 additions & 37 deletions

File tree

widevine.go

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,48 +17,45 @@ import (
1717
func decodeWidevine(b []byte) error {
1818
slog.Debug("trying to parse widevine protobuf")
1919

20-
indent := ""
21-
if prettyPrint {
22-
indent = " "
23-
}
24-
2520
signedMsg := &wvpb.SignedMessage{}
26-
if err := proto.Unmarshal(tryBase64(b), signedMsg); err != nil {
27-
slog.Debug("failed to unmarshal signed widevinelicense message", "err", err.Error())
21+
signedMessageString, err := parseProto(signedMsg, tryBase64(b), "Widevine Message")
22+
if err != nil {
23+
slog.Debug("failed to parse widevine signed message", "err", err)
2824
} else {
29-
out, err := protojson.MarshalOptions{
30-
EmitUnpopulated: false,
31-
UseEnumNumbers: false,
32-
Indent: indent,
33-
}.Marshal(signedMsg)
34-
if err != nil {
35-
slog.Debug("failed to marshal signed widevine license message as json", "err", err.Error())
36-
} else {
37-
fmt.Fprintln(os.Stderr, "Widevine License Response:")
38-
fmt.Fprintln(os.Stderr, "----------------")
39-
fmt.Fprintln(os.Stdout, string(out))
40-
fmt.Println()
41-
42-
licenseMsg := &wvpb.License{}
43-
if err = proto.Unmarshal(signedMsg.Msg, licenseMsg); err != nil {
44-
return fmt.Errorf("failed to unmarshal license message: %w", err)
25+
fmt.Fprintln(os.Stderr, "Widevine Signed Message:")
26+
fmt.Fprintln(os.Stderr, "----------------")
27+
fmt.Fprintln(os.Stdout, signedMessageString)
28+
fmt.Println()
29+
30+
switch *signedMsg.Type {
31+
case wvpb.SignedMessage_LICENSE_REQUEST:
32+
licenseRequest := &wvpb.LicenseRequest{}
33+
licenseRequestString, err := parseProto(licenseRequest, signedMsg.Msg, "Widevine License Request")
34+
if err != nil {
35+
slog.Debug("failed to parse widevine license request", "err", err)
36+
} else {
37+
fmt.Fprintln(os.Stderr, "Widevine License Request:")
38+
fmt.Fprintln(os.Stderr, "----------------")
39+
fmt.Fprintln(os.Stdout, licenseRequestString)
40+
fmt.Println()
41+
}
42+
case wvpb.SignedMessage_LICENSE:
43+
license := &wvpb.License{}
44+
licenseString, err := parseProto(license, signedMsg.Msg, "Widevine License")
45+
if err != nil {
46+
slog.Debug("failed to parse widevine license", "err", err)
4547
} else {
46-
out, err := protojson.MarshalOptions{
47-
EmitUnpopulated: false,
48-
UseEnumNumbers: false,
49-
Indent: indent,
50-
}.Marshal(licenseMsg)
51-
if err != nil {
52-
slog.Debug("failed to marshal license message as json", "err", err.Error())
53-
} else {
54-
fmt.Fprintln(os.Stderr, "Widevine License Message:")
55-
fmt.Fprintln(os.Stderr, "----------------")
56-
fmt.Fprintln(os.Stdout, string(out))
57-
58-
return nil
59-
}
48+
fmt.Fprintln(os.Stderr, "Widevine License:")
49+
fmt.Fprintln(os.Stderr, "----------------")
50+
fmt.Fprintln(os.Stdout, licenseString)
51+
fmt.Println()
6052
}
53+
default:
54+
fmt.Fprintln(os.Stderr, "No parser implemented for message type")
55+
fmt.Println()
6156
}
57+
return nil
58+
6259
}
6360

6461
slog.Debug("trying to parse widevine protobuf")
@@ -137,3 +134,28 @@ func protectionSchemeName(n float64) string {
137134
}
138135
return "unknown"
139136
}
137+
138+
func parseProto(p proto.Message, in []byte, desc string) (string, error) {
139+
indent := ""
140+
if prettyPrint {
141+
indent = " "
142+
}
143+
144+
if err := proto.Unmarshal(in, p); err != nil {
145+
return "", fmt.Errorf("failed to unmarshal as %T: %w", p, err)
146+
}
147+
148+
out, err := protojson.MarshalOptions{
149+
EmitUnpopulated: false,
150+
UseEnumNumbers: false,
151+
Indent: indent,
152+
}.Marshal(p)
153+
154+
if err != nil {
155+
slog.Debug("failed to marshal as json", "err", err.Error())
156+
return "", err
157+
}
158+
159+
return string(out), nil
160+
161+
}

0 commit comments

Comments
 (0)