|  |  |  | @ -2,21 +2,24 @@ package chromium | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import ( | 
			
		
	
		
			
				
					|  |  |  |  | 	"crypto/sha1" | 
			
		
	
		
			
				
					|  |  |  |  | 	"os" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	"github.com/godbus/dbus/v5" | 
			
		
	
		
			
				
					|  |  |  |  | 	keyring "github.com/ppacher/go-dbus-keyring" | 
			
		
	
		
			
				
					|  |  |  |  | 	"golang.org/x/crypto/pbkdf2" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	"hack-browser-data/internal/item" | 
			
		
	
		
			
				
					|  |  |  |  | 	"hack-browser-data/internal/log" | 
			
		
	
		
			
				
					|  |  |  |  | ) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | func (c *chromium) GetMasterKey() ([]byte, error) { | 
			
		
	
		
			
				
					|  |  |  |  | 	// what is d-bus @https://dbus.freedesktop.org/
 | 
			
		
	
		
			
				
					|  |  |  |  | 	var chromeSecret []byte | 
			
		
	
		
			
				
					|  |  |  |  | 	var chromiumSecret []byte | 
			
		
	
		
			
				
					|  |  |  |  | 	conn, err := dbus.SessionBus() | 
			
		
	
		
			
				
					|  |  |  |  | 	if err != nil { | 
			
		
	
		
			
				
					|  |  |  |  | 		return nil, err | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	defer os.Remove(item.TempChromiumKey) | 
			
		
	
		
			
				
					|  |  |  |  | 	svc, err := keyring.GetSecretService(conn) | 
			
		
	
		
			
				
					|  |  |  |  | 	if err != nil { | 
			
		
	
		
			
				
					|  |  |  |  | 		return nil, err | 
			
		
	
	
		
			
				
					|  |  |  | @ -37,29 +40,29 @@ func (c *chromium) GetMasterKey() ([]byte, error) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if err != nil { | 
			
		
	
		
			
				
					|  |  |  |  | 			return nil, err | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		for _, item := range items { | 
			
		
	
		
			
				
					|  |  |  |  | 			label, err := item.GetLabel() | 
			
		
	
		
			
				
					|  |  |  |  | 		for _, i := range items { | 
			
		
	
		
			
				
					|  |  |  |  | 			label, err := i.GetLabel() | 
			
		
	
		
			
				
					|  |  |  |  | 			if err != nil { | 
			
		
	
		
			
				
					|  |  |  |  | 				log.Error(err) | 
			
		
	
		
			
				
					|  |  |  |  | 				continue | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			if label == c.storage { | 
			
		
	
		
			
				
					|  |  |  |  | 				se, err := item.GetSecret(session.Path()) | 
			
		
	
		
			
				
					|  |  |  |  | 				se, err := i.GetSecret(session.Path()) | 
			
		
	
		
			
				
					|  |  |  |  | 				if err != nil { | 
			
		
	
		
			
				
					|  |  |  |  | 					log.Error(err) | 
			
		
	
		
			
				
					|  |  |  |  | 					return nil, err | 
			
		
	
		
			
				
					|  |  |  |  | 				} | 
			
		
	
		
			
				
					|  |  |  |  | 				chromeSecret = se.Value | 
			
		
	
		
			
				
					|  |  |  |  | 				chromiumSecret = se.Value | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	// TODO: handle error if no secret found
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if chromeSecret == nil { | 
			
		
	
		
			
				
					|  |  |  |  | 		return nil, err | 
			
		
	
		
			
				
					|  |  |  |  | 	if chromiumSecret == nil { | 
			
		
	
		
			
				
					|  |  |  |  | 		// @https://source.chromium.org/chromium/chromium/src/+/main:components/os_crypt/os_crypt_linux.cc;l=100
 | 
			
		
	
		
			
				
					|  |  |  |  | 		chromiumSecret = []byte("peanuts") | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	var chromeSalt = []byte("saltysalt") | 
			
		
	
		
			
				
					|  |  |  |  | 	var chromiumSalt = []byte("saltysalt") | 
			
		
	
		
			
				
					|  |  |  |  | 	// @https://source.chromium.org/chromium/chromium/src/+/master:components/os_crypt/os_crypt_linux.cc
 | 
			
		
	
		
			
				
					|  |  |  |  | 	key := pbkdf2.Key(chromeSecret, chromeSalt, 1, 16, sha1.New) | 
			
		
	
		
			
				
					|  |  |  |  | 	key := pbkdf2.Key(chromiumSecret, chromiumSalt, 1, 16, sha1.New) | 
			
		
	
		
			
				
					|  |  |  |  | 	c.masterKey = key | 
			
		
	
		
			
				
					|  |  |  |  | 	return key, nil | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |