|
1 | 1 | package password |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "bytes" |
5 | 4 | "database/sql" |
6 | 5 | "encoding/base64" |
7 | 6 | "log/slog" |
@@ -169,87 +168,42 @@ const ( |
169 | 168 | ) |
170 | 169 |
|
171 | 170 | func (f *FirefoxPassword) Parse(masterKey []byte) error { |
172 | | - globalSalt, metaBytes, nssA11, nssA102, err := getFirefoxDecryptKey(item.FirefoxKey4.TempFilename()) |
| 171 | + logins, err := getFirefoxLoginData() |
173 | 172 | if err != nil { |
174 | 173 | return err |
175 | 174 | } |
176 | | - metaPBE, err := crypto.NewASN1PBE(metaBytes) |
177 | | - if err != nil { |
178 | | - return err |
179 | | - } |
180 | | - |
181 | | - k, err := metaPBE.Decrypt(globalSalt, masterKey) |
182 | | - if err != nil { |
183 | | - return err |
184 | | - } |
185 | | - if bytes.Contains(k, []byte("password-check")) { |
186 | | - keyLin := []byte{248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} |
187 | | - if bytes.Equal(nssA102, keyLin) { |
188 | | - nssPBE, err := crypto.NewASN1PBE(nssA11) |
189 | | - if err != nil { |
190 | | - return err |
191 | | - } |
192 | | - finallyKey, err := nssPBE.Decrypt(globalSalt, masterKey) |
193 | | - if err != nil { |
194 | | - return err |
195 | | - } |
196 | | - |
197 | | - finallyKey = finallyKey[:24] |
198 | | - logins, err := getFirefoxLoginData() |
199 | | - if err != nil { |
200 | | - return err |
201 | | - } |
202 | 175 |
|
203 | | - for _, v := range logins { |
204 | | - userPBE, err := crypto.NewASN1PBE(v.encryptUser) |
205 | | - if err != nil { |
206 | | - return err |
207 | | - } |
208 | | - pwdPBE, err := crypto.NewASN1PBE(v.encryptPass) |
209 | | - if err != nil { |
210 | | - return err |
211 | | - } |
212 | | - user, err := userPBE.Decrypt(finallyKey, masterKey) |
213 | | - if err != nil { |
214 | | - return err |
215 | | - } |
216 | | - pwd, err := pwdPBE.Decrypt(finallyKey, masterKey) |
217 | | - if err != nil { |
218 | | - return err |
219 | | - } |
220 | | - *f = append(*f, loginData{ |
221 | | - LoginURL: v.LoginURL, |
222 | | - UserName: string(user), |
223 | | - Password: string(pwd), |
224 | | - CreateDate: v.CreateDate, |
225 | | - }) |
226 | | - } |
| 176 | + for _, v := range logins { |
| 177 | + userPBE, err := crypto.NewASN1PBE(v.encryptUser) |
| 178 | + if err != nil { |
| 179 | + return err |
| 180 | + } |
| 181 | + pwdPBE, err := crypto.NewASN1PBE(v.encryptPass) |
| 182 | + if err != nil { |
| 183 | + return err |
| 184 | + } |
| 185 | + user, err := userPBE.Decrypt(masterKey) |
| 186 | + if err != nil { |
| 187 | + return err |
| 188 | + } |
| 189 | + pwd, err := pwdPBE.Decrypt(masterKey) |
| 190 | + if err != nil { |
| 191 | + return err |
227 | 192 | } |
| 193 | + *f = append(*f, loginData{ |
| 194 | + LoginURL: v.LoginURL, |
| 195 | + UserName: string(user), |
| 196 | + Password: string(pwd), |
| 197 | + CreateDate: v.CreateDate, |
| 198 | + }) |
228 | 199 | } |
| 200 | + |
229 | 201 | sort.Slice(*f, func(i, j int) bool { |
230 | 202 | return (*f)[i].CreateDate.After((*f)[j].CreateDate) |
231 | 203 | }) |
232 | 204 | return nil |
233 | 205 | } |
234 | 206 |
|
235 | | -func getFirefoxDecryptKey(key4file string) (item1, item2, a11, a102 []byte, err error) { |
236 | | - keyDB, err := sql.Open("sqlite", key4file) |
237 | | - if err != nil { |
238 | | - return nil, nil, nil, nil, err |
239 | | - } |
240 | | - defer os.Remove(key4file) |
241 | | - defer keyDB.Close() |
242 | | - |
243 | | - if err = keyDB.QueryRow(queryMetaData).Scan(&item1, &item2); err != nil { |
244 | | - return nil, nil, nil, nil, err |
245 | | - } |
246 | | - |
247 | | - if err = keyDB.QueryRow(queryNssPrivate).Scan(&a11, &a102); err != nil { |
248 | | - return nil, nil, nil, nil, err |
249 | | - } |
250 | | - return item1, item2, a11, a102, nil |
251 | | -} |
252 | | - |
253 | 207 | func getFirefoxLoginData() ([]loginData, error) { |
254 | 208 | s, err := os.ReadFile(item.FirefoxPassword.TempFilename()) |
255 | 209 | if err != nil { |
|
0 commit comments