@@ -17,48 +17,45 @@ import (
1717func 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