## For the benefit of the default keyreporter, we need the program na,e.
_base._ego(_argv[0])
+## How to fix a name back into the right identifier. Alas, the rules are not
+## consistent.
+def _fixname(name):
+
+ ## Hyphens consistently become underscores.
+ name = name.replace('-', '_')
+
+ ## But slashes might become underscores or just vanish.
+ if name.startswith('salsa20'): name = name.translate(None, '/')
+ else: name = name.replace('/', '_')
+
+ ## Done.
+ return name
+
## Initialize the module. Drag in the static methods of the various
## classes; create names for the various known crypto algorithms.
def _init():
setattr(c, j[plen:], classmethod(b[j]))
for i in [gcciphers, gchashes, gcmacs, gcprps]:
for c in i.itervalues():
- d[c.name.replace('-', '_').translate(None, '/')] = c
+ d[_fixname(c.name)] = c
for c in gccrands.itervalues():
- d[c.name.replace('-', '_').translate(None, '/') + 'rand'] = c
+ d[_fixname(c.name + 'rand')] = c
_init()
## A handy function for our work: add the methods of a named class to an
return x is None or x == msg
except ValueError:
return False
+ def __repr__(me):
+ return '%s(n = %r, e = %r)' % (_clsname(me), me.n, me.e)
+ def _repr_pretty_(me, pp, cyclep):
+ ind = _pp_bgroup_tyname(pp, me)
+ if cyclep:
+ pp.text('...')
+ else:
+ _pp_kv(pp, 'n', me.n); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'e', me.e)
+ pp.end_group(ind, ')')
_augment(RSAPub, _tmp)
class _tmp:
def decrypt(me, ct, enc): return enc.decode(me.privop(ct), me.n.nbits)
def sign(me, msg, enc): return me.privop(enc.encode(msg, me.n.nbits))
+ def __repr__(me):
+ return '%s(n = %r, e = %r, d = %s, ' \
+ 'p = %s, q = %s, dp = %s, dq = %s, q_inv = %s)' % \
+ (_clsname(me), me.n, me.e,
+ _repr_secret(me.d), _repr_secret(me.p), _repr_secret(me.q),
+ _repr_secret(me.dp), _repr_secret(me.dq), _repr_secret(me.q_inv))
+ def _repr_pretty_(me, pp, cyclep):
+ ind = _pp_bgroup_tyname(pp, me)
+ if cyclep:
+ pp.text('...')
+ else:
+ _pp_kv(pp, 'n', me.n); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'e', me.e); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'd', me.d, secretp = True); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'p', me.p, secretp = True); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'q', me.q, secretp = True); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'dp', me.dp, secretp = True); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'dq', me.dq, secretp = True); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'q_inv', me.q_inv, secretp = True)
+ pp.end_group(ind, ')')
_augment(RSAPriv, _tmp)
###--------------------------------------------------------------------------
-### Bernstein's elliptic curve crypto and related schemes.
+### DSA and related schemes.
-X25519_BASE = \
- bytes('0900000000000000000000000000000000000000000000000000000000000000')
+class _tmp:
+ def __repr__(me): return '%s(G = %r, p = %r)' % (_clsname(me), me.G, me.p)
+ def _repr_pretty_(me, pp, cyclep):
+ ind = _pp_bgroup_tyname(pp, me)
+ if cyclep:
+ pp.text('...')
+ else:
+ _pp_kv(pp, 'G', me.G); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'p', me.p)
+ pp.end_group(ind, ')')
+_augment(DSAPub, _tmp)
+_augment(KCDSAPub, _tmp)
+
+class _tmp:
+ def __repr__(me): return '%s(G = %r, u = %s, p = %r)' % \
+ (_clsname(me), me.G, _repr_secret(me.u), me.p)
+ def _repr_pretty_(me, pp, cyclep):
+ ind = _pp_bgroup_tyname(pp, me)
+ if cyclep:
+ pp.text('...')
+ else:
+ _pp_kv(pp, 'G', me.G); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'u', me.u, True); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'p', me.p)
+ pp.end_group(ind, ')')
+_augment(DSAPriv, _tmp)
+_augment(KCDSAPriv, _tmp)
+
+###--------------------------------------------------------------------------
+### Bernstein's elliptic curve crypto and related schemes.
-X448_BASE = \
- bytes('05000000000000000000000000000000000000000000000000000000'
- '00000000000000000000000000000000000000000000000000000000')
+X25519_BASE = MP(9).storel(32)
+X448_BASE = MP(5).storel(56)
Z128 = bytes('00000000000000000000000000000000')
class _BoxyPub (object):
- def __init__(me, pub, *kw, **kwargs):
+ def __init__(me, pub, *args, **kw):
if len(pub) != me._PUBSZ: raise ValueError, 'bad public key'
- super(_BoxyPub, me).__init__(*kw, **kwargs)
+ super(_BoxyPub, me).__init__(*args, **kw)
me.pub = pub
+ def __repr__(me): return '%s(pub = %r)' % (_clsname(me), me.pub)
+ def _repr_pretty_(me, pp, cyclep):
+ ind = _pp_bgroup_tyname(pp, me)
+ if cyclep:
+ pp.text('...')
+ else:
+ _pp_kv(pp, 'pub', me.pub)
+ pp.end_group(ind, ')')
class _BoxyPriv (_BoxyPub):
- def __init__(me, priv, pub = None, *kw, **kwargs):
+ def __init__(me, priv, pub = None, *args, **kw):
if len(priv) != me._KEYSZ: raise ValueError, 'bad private key'
if pub is None: pub = me._op(priv, me._BASE)
- super(_BoxyPriv, me).__init__(pub = pub, *kw, **kwargs)
+ super(_BoxyPriv, me).__init__(pub = pub, *args, **kw)
me.priv = priv
def agree(me, you): return me._op(me.priv, you.pub)
def boxkey(me, recip):
def box(me, recip, n, m):
return secret_box(me.boxkey(recip), n, m)
def unbox(me, recip, n, c):
- return secret_unbox(me.boxkey(recip, n, c))
+ return secret_unbox(me.boxkey(recip), n, c)
+ def __repr__(me): return '%s(priv = %s, pub = %r)' % \
+ (_clsname(me), _repr_secret(me.priv), me.pub)
+ def _repr_pretty_(me, pp, cyclep):
+ ind = _pp_bgroup_tyname(pp, me)
+ if cyclep:
+ pp.text('...')
+ else:
+ _pp_kv(pp, 'priv', me.priv, True); pp.text(','); pp.breakable()
+ _pp_kv(pp, 'pub', me.pub)
+ pp.end_group(ind, ')')
class X25519Pub (_BoxyPub):
_PUBSZ = X25519_PUBSZ