me.k = Crypto(c, h, m, me.ck, me.mk)
me.magic = me.k.decrypt(me.db['magic'])
+ @classmethod
+ def create(cls, file, c, h, m, tag):
+ """
+ Create and initialize a new, empty, database FILE.
+
+ We want a GCipher subclass C, a GHash subclass H, and a GMAC subclass M;
+ and a Pixie passphrase TAG.
+
+ This doesn't return a working object: it just creates the database file
+ and gets out of the way.
+ """
+
+ ## Set up the cryptography.
+ pp = _C.ppread(tag, _C.PMODE_VERIFY)
+ ppk = PPK(pp, c, h, m)
+ ck = _C.rand.block(c.keysz.default)
+ mk = _C.rand.block(c.keysz.default)
+ k = Crypto(c, h, m, ck, mk)
+
+ ## Set up and initialize the database.
+ db = _G.open(file, 'n', 0600)
+ db['tag'] = tag
+ db['salt'] = ppk.salt
+ db['cipher'] = c.name
+ db['hash'] = h.name
+ db['mac'] = m.name
+ db['key'] = ppk.encrypt(_wrapstr(ck) + _wrapstr(mk))
+ db['magic'] = k.encrypt(_C.rand.block(h.hashsz))
+
def keyxform(me, key):
"""
Transform the KEY (actually a password tag) into a GDBM record key.
else:
tag = 'pwsafe'
- ## Choose a passphrase, and generate master keys.
- pp = C.ppread(tag, C.PMODE_VERIFY)
- if not mac: mac = hash + '-hmac'
- c = C.gcciphers[cipher]
- h = C.gchashes[hash]
- m = C.gcmacs[mac]
- ppk = PW.PPK(pp, c, h, m)
- ck = C.rand.block(c.keysz.default)
- mk = C.rand.block(m.keysz.default)
- k = Crypto(c, h, m, ck, mk)
-
- ## Set up the database, storing the basic information we need.
- db = G.open(file, 'n', 0600)
- db['tag'] = tag
- db['salt'] = ppk.salt
- db['cipher'] = cipher
- db['hash'] = hash
- db['mac'] = mac
- db['key'] = ppk.encrypt(wrapstr(ck) + wrapstr(mk))
- db['magic'] = k.encrypt(C.rand.block(h.hashsz))
+ ## Set up the database.
+ if mac is None: mac = hash + '-hmac'
+ PW.create(file, C.gcciphers[cipher], C.gchashes[hash], C.gcmacs[mac], tag)
def cmd_changepp(av):
if len(av) != 0: