Ejemplo n.º 1
0
def transaction(e, d):
    """
    """
    k = ecc.ecdsa()
    src, dst, dat, lat, mnt, ref = e[:8], e[8:16], e[16:20], e[20:28], e[28:32], e[32:40]
    msg, sig, now = e[:-96], e[-96:], ecc.datint()
    if src not in d.keys() or dst not in d.keys() or src == dst:         return b'Error database'
    dls, dld = d[src][4:], d[dst][4:]
    zx, zd = ecc.b2h(src), ecc.b2h(dst)
    if zx not in d.keys():                                               return b'Error public key'
    k.pt = k.uncompress(ecc.h2b(zx + d[zx]))
    if not k.verify(sig, msg):                                           return b'Error signature'    
    val, bals, bald = ecc.b2i(mnt), balance(src, d), balance(dst, d)
    if val <= 0 or bals - val < -MAXBAL or bald + val > MAXBAL:          return b'Error value'
    os, od = ecc.b2i(d[src][:4]), ecc.b2i(d[dst][:4])
    ns, nd = os + 1, od + 1
    nhs = ecc.z10 if os == 0 else d[src + ecc.i2b(os, 4)][-10:]
    nhd = ecc.z10 if od == 0 else d[dst + ecc.i2b(od, 4)][-10:]
    lst_tot, lst_wlt = ecc.b2i(d[ecc.v1][:8]), ecc.b2i(d[ecc.v1][8:])
    if ecc.b2i(dls) <= now or ecc.b2i(dld) <= now or ecc.b2i(dat) > now: return b'Error deadline'    
    if os > 0:
        dx = src + ecc.i2b(os, 4)
        if len(d[dx]) == NS: dx = d[dx][:12]
        if ecc.b2i(d[dx][8:12]) >= ecc.b2i(dat):                         return b'Wait a minute !'
    nws, nwd = ecc.s2b(bals - val, 4), ecc.s2b(bald + val, 4)
    sm, dm = dst + ecc.i2b(nd, 4) + nws, src + dat + lat + mnt + ref + sig + nwd
    # BEGIN WRITE SECTION
    d[src] = ecc.i2b(ns, 4)  + dls
    d[src  + ecc.i2b(ns, 4)] = sm + hashlib.sha1(src + sm + nhs).digest()[:10]
    d[dst] = ecc.i2b(nd, 4)  + dld
    d[dst  + ecc.i2b(nd, 4)] = dm + hashlib.sha1(dst + dm + nhd).digest()[:10]
    d[ecc.v1] = ecc.i2b(lst_tot + 1, 8) + ecc.i2b(lst_wlt + val, 8)
    # END WRITE SECTION
    return b'TRANSACTION from ' + zx + b' to ' + zd    
Ejemplo n.º 2
0
 def server(s):
     t, n, buf, sdest = socket.socket(socket.AF_INET, socket.SOCK_DGRAM), now(), {}, ecc.i2b(0, 4)
     t.bind((HOST, s.p))
     while (True):
         m = t.recvfrom(1024)[0]
         if now() - n <= 4: buf[m] = True
         else: n, buf = now(), {}
         z, dest, price = s.ear[m]+1 if m in s.ear else 0, m[-5:-1], ecc.b2i(m[-1:])
         if s.current: s.cts[s.current] = m
         print (len(s.cts), s.short(m), z, len(buf), s.short(s.current))
         if price > 0 and sdest != dest:
             print ('RECEIVE %d' % price)
             s.balance += price
             sdest = dest                
         with dbm.open('db%d/hear'%s.p, 'c') as b: # heard ids
             s.ear[m], b[m] = z, ecc.i2b(now(), 4) + ecc.i2b(z, 4) 
Ejemplo n.º 3
0
def object(db, ip):
    ""
    k, t = ecc.ecdsa(), socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print ('Intelligent Object (socket open)')
    with dbm.open(db, 'c') as d:
        if len(d.keys()) == 0:
            k.generate()
            sk, pk = ecc.i2b(k.privkey, 48), k.compress(k.pt)
            d[b'KEYS'] = pk + sk
    t.bind((ip, PORT2))
    while True:
        (data, addr) = t.recvfrom(1024)
        with open('server_pk') as f: pk = f.read()
        k.pt = k.uncompress(ecc.z85decode(pk.encode('UTF-8')))
        if len(data)>130:
            sig, msg = ecc.z85decode(data[:120]), data[120:]
            if k.verify(sig, msg):
                cod = random.randrange(10000)
                t.sendto(b'start counting (code:%04d)' % cod, addr)
                dat = time.time()
            else:
                t.sendto(b'error on signature', addr)
        elif len(data) == 4:
            with dbm.open(db, 'c') as d:
                print (' %d secondes' % int(time.time()-dat))
                pk, sk = d[b'KEYS'][:48], d[b'KEYS'][48:]
                k.pt, k.privkey = k.uncompress(pk), ecc.b2i(sk)
                msg = b'invoice for %d secondes' % int(time.time()-dat)
                cmd =  ecc.z85encode(k.sign(msg)) + msg
                t.sendto(cmd, addr)
        else:
            t.sendto(b'error', addr)
Ejemplo n.º 4
0
def server(db, ip):
    """ 
    """
    k = ecc.ecdsa()
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((ip, PORT1))
    print ('IO-server on %s' % ip)
    with dbm.open(db, 'c') as d:
        if len(d.keys()) == 0:
            k.generate()
            sk, pk = ecc.i2b(k.privkey, 48), k.compress(k.pt)
            d[b'SERVER'] = pk + sk
            d[ecc.v1] = ecc.z8 + ecc.z8
            with open('server_pk', 'w') as f: f.write(ecc.z85encode(pk).decode('UTF-8'))
        print ('Server Public ID: ' + server_id(d).decode('UTF-8'))
        if ecc.v1 in d.keys():
            print ('Wealth: %d [%d operations]' % (ecc.b2i(d[ecc.v1][8:]),ecc.b2i(d[ecc.v1][:8]) ))   
    while True:
        (data, addr), o = s.recvfrom(1024), b''
        with dbm.open(db, 'c') as d:
            if len(data) == 1:
                if   data == b'v': o = b'Error %02X' % verif(d)
                elif data == b'l': o = list_humans(d)
                elif data == b's': o = server_id(d)
            elif len(data) ==    8: o = proof      (data, d)
            elif len(data) ==   16: o = history    (data, d)
            elif len(data) ==   93: o = candidate  (data, d)
            elif len(data) ==  136: o = transaction(data, d)
            elif len(data) ==  142: o = certificate(data, d)
            elif len(data) >=  144 and len(data) <= 256: o = invoice(data, d)
            else: o = b'command not found!'
            s.sendto(o, addr)
Ejemplo n.º 5
0
 def regrp(s, m):
     x, h, g, pr, p, y, z = m[:5], m[5:7], b'_' + m[5:7], m[7:8], ecc.b2i(m[7:8]), 0, 0
     with dbm.open(s.n, 'c') as b:
         b[x+h] = pr
         if h not in b: b[h] = ecc.z6
         z = ecc.b2i(b[g]) if g in b else 0
         b[g] = ecc.i2b(z + p, 4)
Ejemplo n.º 6
0
def phone(db, ip, unik=False):
    """ 
    IO CLIENT:
    Simulate smart-phone with strong authentication 
    Commands:
    l       -> list index of all registered bodies
    r email -> register a new body with a new email
    <num>   -> select <num> as current body
    v       -> verify all the database
    s       -> return server public id
    o       -> return proof of balance at current time, to give to offline objects
    c <num> -> request certificate to <num> or generate certificate for <num>
    p <num> <val> -> pay <num> body <val> amount of leaf
    h       -> display history for current body
    m       -> list all client ids (usually one if flag unik is True)
    b       -> begin counting resource by object
    e       -> end counting resource by object
    """
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print ('IO Client (Phone)\nType ? for help')
    my = b''
    while True:
        if my == b'': my = get_my('1')
        cmd, req, bmy = input('%s >' % my.decode('UTF-8')), b'', ecc.h2b(my)
        if leaf.reg(re.match('(r|reg|register)\s*(\w{2,20}@\w{2,20}\.\w{2,3})\s*$', cmd)): # 48
            with dbm.open(db, 'c') as d:
                req = genkey(leaf.reg.v.group(2).encode('UTF-8'), unik, d)
        elif re.match('(v|verif|verification)\s*$', cmd): req = b'v'
        elif re.match('(l|ls|list)\s*$',            cmd): req = b'l'
        elif re.match('(s|server)\s*$',             cmd): req = b's'
        elif re.match('(h|hist|history)\s*$',       cmd): req = my
        elif re.match('(o|proof)\s*$',              cmd): req = bmy
        elif re.match('(\?|help)\s*$',              cmd): req = b''; print (__doc__, phone.__doc__)
        elif re.match('(b|begin|start)\s*$',        cmd): req = b''; start_access()
        elif re.match('(e|end|stop)\s*$',           cmd): req = b''; stop_access()
        elif leaf.reg(re.match('(my|)\s*(\d{1,2})\s*$', cmd)): my = get_my(leaf.reg.v.group(2))
        elif leaf.reg(re.match('(p|pay)\s*(\d{1,2})\s+(\d{1,3})\s*$', cmd)): # 136
            with dbm.open(db) as d:
                pld = ecc.i2b(int(leaf.reg.v.group(3)), 4)
                req = gene(bmy, ecc.h2b(get_my(leaf.reg.v.group(2))), pld, d)
        elif leaf.reg(re.match('(c|crt|cert)\s*(\d{1,2})\s*$', cmd)): # len:142
            with dbm.open(db) as d:
                req = gene(bmy, ecc.h2b(get_my(leaf.reg.v.group(2))), ecc.z10, d)
        elif re.match('(m|my)\s*$',                 cmd):
            with dbm.open(db) as d:
                for x in d.keys(): print (ecc.b2h(x).decode('UTF-8'))
            req = b''
        elif re.match('(q|quit)\s*$',               cmd):
            s.close()
            break
        if req:
            s.sendto(req, (ip, PORT1))
            data, addr = s.recvfrom(2048)
            if data:
                print (data.decode('UTF-8'))
                if   req == b'l':
                    with open('lpub',  'w') as f: f.write(data.decode('UTF-8'))
                elif req == bmy:
                    with open('proof', 'w') as f: f.write(data.decode('UTF-8'))
Ejemplo n.º 7
0
 def next(self):
     " Latlong may be used locally only and never shared "
     lt, lg = random.randint(100, 200), random.randint(100, 200)
     oldi = self.root if self.ids == [] else self.root + self.ids[-1][0]
     self.ids.append([
         PREFIX + ecc.hashlib.sha256(oldi).digest()[:12] + ecc.i2b(0, 3),
         [lt, lg, False]
     ])
Ejemplo n.º 8
0
 def readsync(s): 
     with dbm.open(s.n) as b:
         g0, g1, k = ecc.z2, ecc.i2b(1, 2), ecc.ecdsa()
         msg = b[g0] + ecc.z4
         if g1 in b: msg += b[g1] + b[b'_'+g1]
         k.privkey = s.getsk()
         sgn = k.sign(msg)
         return msg + sgn
Ejemplo n.º 9
0
def genkey(mel, unik, d):
    if len(d.keys()) > 0 and unik:
        print ('key already defined')
        return b''
    k = ecc.ecdsa()
    k.generate()
    sk, pk = ecc.i2b(k.privkey, 48), k.compress(k.pt)
    d[pk[:8]] = pk[8:] + sk
    return pk + b'%45s' % mel
Ejemplo n.º 10
0
 def sync(s, m):
     with dbm.open(s.n, 'c') as b:
         g0, g1, k = ecc.z2, ecc.i2b(1, 2), ecc.ecdsa()
         k.pt = k.uncompress(s.tid['PUB'] + s.tpk[s.tid['PUB']])       
         if k.verify(m[-96:], m[:-96]):
             if ecc.b2i(b[g0]) < ecc.b2i(m[:6]): b[g0] = m[:6]
             if len(m) == 116 and g1 in b:
                 if ecc.b2i(b[g1]) < ecc.b2i(m[10:16]):    b[g1]      = m[10:16]
                 if ecc.b2i(b[b'_'+g1]) < ecc.b2i(m[16:]): b[b'_'+g1] = m[16:20]
Ejemplo n.º 11
0
 def __init__(s):
     if not ecc.os.path.exists('backend'): ecc.os.makedirs('backend')        
     k = ecc.i2b(0, 16)
     if not ecc.os.path.exists('backend/keys'):
         with dbm.open('backend/keys', 'c') as b:
             for i in range(MINF):
                 k = ecc.hashlib.sha256(s.root + k).digest()[:16]
                 b[ecc.z56encode(k)] = b''
     print('Serving', URLB)
     socketserver.TCPServer((HOST, PORT), handler).serve_forever()
Ejemplo n.º 12
0
def contact(u1, u2, duration=1, proximity=1, price=0):
    " 1B:PREFIX + 12B:EphIds + 2B:Hash + 1B:Price -> 16B BLEid "
    if price > 0:  # Generalized transaction with ECOTAX: 20%
        u1.ids[-1][0] = u1.ids[-1][0][:-3] + u2.ids[-1][0][1:3] + ecc.i2b(
            price, 1)
        u2.bal, u1.bal = u2.bal + price * 4 // 5, u1.bal - price
        u1.note[u1.ids[-1][0]] = (u1.pk[:8], u1.k.sign(u1.ids[-1][0])
                                  )  # (public id, signature)
        u2.refe[u1.ids[-1][0]] = u2.pk[:8]  # or False
    u1.cts[u2.ids[-1][0]] = (len(u1.ids), duration, proximity)
    u2.cts[u1.ids[-1][0]] = (len(u1.ids), duration, proximity)
    u1.ids[-1][1][2] = u2.ids[-1][1][2] = True
Ejemplo n.º 13
0
 def bal(s, p): # cross(p) - tax(p) + sum_groups (contrib*rate(p))
     if s.rvs[p] == 'PUB' or len(s.tid) < 2: return 0
     t, l, q0, q1 = fractions.Fraction(0), len(s.tid)-1, ecc.z2, ecc.i2b(1, 2)
     with dbm.open(s.n) as b:
         #assert len(s.tid) == ecc.b2i(b[b'_'+q0]) + 1 
         for x in [y for y in b.keys() if len(y) == MEKL and len(b[y]) == MEVL]:
             if   p == x[:5]: t -= ecc.b2i(b[x][:3])
             elif p == x[5:]: t += ecc.b2i(b[x][:3])
             else: assert s.n == 'PUB'                
         t -= ecc.b2i(b[p]) if p in b else 0
         t += fractions.Fraction(ecc.b2i(b[q0]), l) 
         if q1 in b and b'_' + q1 in b:
             r = ecc.b2i(b[p+q1]) if p + q1 in b else 0
             t += fractions.Fraction(ecc.b2i(b[q1]) * r, ecc.b2i(b[b'_'+q1])) 
         return t
Ejemplo n.º 14
0
 def commit(s, r):
     t, k = socket.socket(socket.AF_INET, socket.SOCK_DGRAM), ecc.ecdsa()
     isn, val, rcp = (r.v.group(1) != 'PUB'), int(r.v.group(2)), r.v.group(3).upper()
     assert s.check(s.tid[s.n], val)
     assert rcp in s.tid and s.n != rcp and s.n != 'PUB'
     assert s.bal(s.tid['PUB']) == 0 and s.time(s.tid['PUB']) == 0
     msg = s.tid[s.n] + s.tid[rcp] + ecc.i2b(val, 3) + ecc.z1 + s.pos(s.tid[s.n] + s.tid[rcp]) 
     k.privkey = s.getsk()
     sgn = k.sign(msg)
     s.add(msg + sgn) # add src                  
     if rcp in s.tbl:
         if isn: t.sendto(msg + sgn, (HOST, s.tbl[rcp]))
         t.sendto(msg + sgn, (HOST, s.tbl['PUB']))
         s.sync(t.recvfrom(1024)[0])
     else:
         print ('iphone') # iphone case
         t.sendto(msg + sgn, (HOST, s.tbl['PUB']))
Ejemplo n.º 15
0
 def reset(s):
     with dbm.open(s.n, 'c') as b:
         for x in b.keys(): del b[x]
         k = ecc.ecdsa()
         k.generate()
         s.pk = k.compress(k.pt)          # My Public  key
         b[b'&'] = ecc.i2b(k.privkey, 48) # My Private key
         #if s.n == 'PUB':
         b[ecc.z2], b[b'_'+ecc.z2] = ecc.z6, ecc.z4
         b[s.pk[:5]] = ecc.z6
         # Types
         b[ecc.i2b(0)] = ecc.i2b(15, 3)                        # Type0=G0:15%
         b[ecc.i2b(1)] = ecc.i2b(13, 3) + ecc.i2b(0x100+80, 3) # Type1=G0:13%G1:80%
Ejemplo n.º 16
0
 def pay(s, dst, mt):
     s.com[dst.i] = dst
     b, ack, la = BloomFilter(100, 0.1), None, dat(now())
     assert len(b.dumps()) == BSIZ
     m0 = s.tn[-1] if s.tn else s.i + num(0) + ecc.i2b(0, 8) + mnt(0) + bal(
         s.b) + dat(0) + b.dumps() + hsh(b'')
     if m0[10:18] in s.com: ack = s.com[m0[10:18]].chresp(s.i + m0[8:10])
     if m0[8:18] == Z10: ack = s.root.chresp(s.i + m0[8:10])
     t = s.c + s.p + m0 + s.k.sign(m0)
     for x in [y for y in s.tp if s.tp[y] == True]:
         e, s.tp[x] = x[144:], False
         assert '%s' % e[:10] not in b
         b += '%s' % e[:10]
         t += x
     s.b -= mt
     m = s.i + num(getn(m0) + 1) + dst.i + mnt(mt) + bal(
         s.b) + la + b.dumps() + hsh(t)
     s.tn.append(m)
     return t + dst.i + mnt(mt) + la + ack + s.k.sign(m)
Ejemplo n.º 17
0
def certificate(e, d):
    """
    A(green) if first
    B->A if A(green)B(red)    then B(orange)
    A->B if A(green)B(orange) then B(green)
    """
    k = ecc.ecdsa()
    src, dst, dat, lat, pld, ref = e[:8], e[8:16], e[16:20], e[20:28], e[28:38], e[38:46]
    msg, sig, now = e[:-96], e[-96:], ecc.datint()
    if ecc.b2i(dat) > now:                                             return b'future date'
    if src not in d.keys() or dst not in d.keys() or src == dst:       return b'Error database'
    zx = ecc.b2h(src)
    if zx not in d.keys():                                             return b'Error public key'
    k.pt = k.uncompress(ecc.h2b(zx + d[zx]))
    if not k.verify(sig, msg):                                         return b'Error signature'
    green, orang, red = ecc.add1year(ecc.datencode()), ecc.datencode(), ecc.z4
    os, od = ecc.b2i(d[src][:4]), ecc.b2i(d[dst][:4])
    ns, nd = os + 1, od + 1
    nhs = ecc.z10 if os == 0 else d[src + ecc.i2b(os, 4)][-10:]
    if os > 0:
        dx = src + ecc.i2b(os, 4)
        if len(d[dx]) == NS: dx = d[dx][:12]
        if ecc.b2i(d[dx][8:12]) >= ecc.b2i(dat):                       return b'Wait a minute !'
    nws = ecc.s2b(balance(src, d), 4)
    sm = dst + dat + lat + pld + ref + sig + nws
    # START WRITING
    if ecc.b2i(d[dst][4:]) > ecc.datint() and d[src][4:] == red:
        d[src] = ecc.i2b(ns, 4) + orang
        d[src  + ecc.i2b(ns, 4)] = sm + hashlib.sha1(src + sm + nhs).digest()[:10]
        d[ecc.v1] = ecc.i2b(ecc.b2i(d[ecc.v1][:8]) + 1, 8) + d[ecc.v1][8:]
        return b'REQUEST by ' + zx
    if ecc.b2i(d[src][4:]) > ecc.datint() and d[dst][4:] != red:
        d[dst] = d[dst][:4] + green
        d[src] = ecc.i2b(ns, 4) + d[src][4:]       
        d[src  + ecc.i2b(ns, 4)] = sm + hashlib.sha1(src + sm + nhs).digest()[:10]
        d[ecc.v1] = ecc.i2b(ecc.b2i(d[ecc.v1][:8]) + 1, 8) + d[ecc.v1][8:16]
        return b'CERTIFICATION by ' + zx
    # STOP WRITING
    else:                                                               return b'Error request'
Ejemplo n.º 18
0
 def add(s, m): # 1 cross 2 tax 3 groups
     x, r, d, p, v = m[:10], m[:5], m[5:10], ecc.b2i(m[14:16]), ecc.b2i(m[10:13])
     g0, g1 = ecc.z2, ecc.i2b(1, 2)
     print ('%s pays %d to %s' % (s.rvs[r], v, s.rvs[d])) 
     with dbm.open(s.n, 'c') as b:
         t, u, w, y = v*TAX0//100, 0, 0, ecc.b2i(b[r]) if r in b else 0
         if (x in b and p == ecc.b2i(b[x][3:])): w = ecc.b2i(b[x][:3])
         else: assert x not in b and p == 0
         q0, q1 = ecc.b2i(b[g0]), ecc.b2i(b[g1]) if g1 in b else 0
         b[x]  = ecc.i2b(w + v - (t+u), 3) + ecc.i2b(1 + p, 2)
         b[g0] = ecc.i2b(q0 + t, 6)
         if r+g1 in b:
             u = v*TAX1//100
             b[g1] = ecc.i2b(q1 + u, 6)
         b[r]  = ecc.i2b(y + t + u, 6) # t+u
Ejemplo n.º 19
0
def history(e, d):
    ""
    x = ecc.h2b(e)
    n = ecc.b2i(d[x][:4])
    o = [e + b' nb: %04d balance: %6d' % (n, balance(x, d))]
    for i in range(n):
        dx = x + ecc.i2b(i+1, 4)
        h, zx, y = ecc.b2i(d[dx][-10:]), ecc.b2h(d[dx][:8]), d[dx]
        bal = ecc.b2s(y[-14:-10], 4)
        if len(y) == NS: dx = d[dx][:12]
        if len(y) == NC: val, sg, dat = 0, b' ', ecc.datdecode(d[dx][8:12])
        elif len(y) == ND:
            val = ecc.b2i(d[dx][20:24])
            dat = ecc.datdecode(d[dx][8:12])
            sg = b'+'
        elif len(y) == NS:
            val = ecc.b2i(d[dx][20:24])
            dat = ecc.datdecode(d[dx][8:12])
            sg = b'-'
        o.append(b'%03d %s%3d %8d H:%020X %s %s' % (i+1, sg, val, bal, h, zx, dat.encode('UTF-8')))
    o.append(b'Balance: %6d' % balance(x, d) )
    return b'\n'.join(o)
Ejemplo n.º 20
0
 def client(s):
     m, n, i = s.getid(s.p, ecc.i2b(0, 4)), now(), 0
     t = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     with dbm.open('db%d/say'%s.p, 'c') as b: # said ids
         while (True):
             if s.go and (now() - n >= TICK):
                 n, i = now(), i + 1
                 if s.price > 0: i = 0
                 if not i % EPOC:
                     dest = ecc.i2b(0, 4)
                     if s.current in s.cts: dest = s.cts[s.current][1:5]
                     m = s.getid(s.p, dest)
                     s.price = 0
                     s.dump(b)
                 z = s.say[m]+1 if m in s.say else 0
                 # lattitude/longitude if captured (data stay on the phone!)
                 lt, lo = ecc.i2b(random.randint(0, 100), 2), ecc.i2b(random.randint(0, 100), 2)
                 s.say[m], b[m] = z, ecc.i2b(n, 4) + ecc.i2b(z, 4) + lt + lo
                 s.current = m
                 for x in [y for y in range(MAXC) if s.p!=BASP+y]: t.sendto(m, (HOST, BASP+x))
Ejemplo n.º 21
0
def mnt(x):
    return ecc.i2b(x, 4)
Ejemplo n.º 22
0
def num(x):
    return ecc.i2b(x, 2)
Ejemplo n.º 23
0
def dat(d):
    return ecc.i2b(d, 4)
Ejemplo n.º 24
0
 def getid(s, phone, dest):
     if s.price>0:
         print ('PAYED %d to %s' % (s.price, dest))
         s.balance -= s.price
     return ecc.i2b(phone%256) + secrets.token_bytes(10) + dest + ecc.i2b(s.price)
Ejemplo n.º 25
0
 def savepks(s):
     with dbm.open(s.n, 'c') as b:
         for x in s.tpk: b[b'#'+x] = s.tpk[x] # Others Public keys
         if len(s.tpk) > 0: b[b'_'+ecc.z2] = ecc.i2b(len(s.tpk)-1, 4)
Ejemplo n.º 26
0
 def dump(s, b):
     f = open('db%d/dump'%s.p, 'bw') 
     for i in b.keys(): f.write(i) # contacts
     for c in s.cts: f.write(c[:-1] + ecc.i2b(ecc.b2i(c[-1:]) + 0x10)) # contacts-contacts
     f.close()
Ejemplo n.º 27
0
 def group(s, r):
     t, g, p = socket.socket(socket.AF_INET, socket.SOCK_DGRAM), int(r.v.group(2)), int(r.v.group(3))%0xFF
     msg = s.tid[s.n] + ecc.i2b(g, 2) + ecc.i2b(p, 1)
     s.regrp(msg)
     t.sendto(msg, (HOST, s.tbl['PUB']))
Ejemplo n.º 28
0
def verif(d):
    """
    check certification !
    """
    print ('run check!')
    k = ecc.ecdsa()
    if len(d.keys()) > 0 and ecc.v1 not in d:           return 0x01 # head does not exists 
    wc, wr, tc, tr, al = 0, 0, 0, 0, 0

    lo = []
    for i in [x for x in d.keys() if len(x) == 16]:
        x = ecc.h2b(i)
        if ecc.b2i(d[x][4:]) > ecc.datint(): lo.append(x)
    #print (lo)
    #find the root
    
    for x in d.keys():
        # Length
        lk, lv = len(x), len(d[x])
        if lk == 1: wr, tr = ecc.b2i(d[x][8:16]), ecc.b2i(d[x][:8])
        if lk == 1  and lv != 16:                       return 0x02 # bad length head
        if lk == 5  and lv != 96:                       return 0x03 # bad length server id
        if lk == 8  and lv !=  8:                       return 0x04 # bad length id head 
        if lk == 12 and lv not in (NS, ND, NC):         return 0x05 # bad length operation
        if lk == 16 and lv != 80:                       return 0x06 # bad length pub key
        # Public keys
        if lk == 12:
            if ecc.b2h(x[:8])    not in d:              return 0x07 # src id unknown
            if ecc.b2h(d[x][:8]) not in d:              return 0x08 # dst id unknown 
        if lk == 8:
            # Money supply
            al += balance(x, d)
            # Dates
            dat = ecc.z8
            for i in range(ecc.b2i(d[x][:4])):
                dx = x + ecc.i2b(i+1, 4)
                if len(d[dx]) in (ND, NC):
                    if    d[dx][8:12] <= dat:           return 0x09 # bad date increase
                    dat = d[dx][8:12]
                if len(d[dx]) == ND:
                    if dat > d[x][4:]:                  return 0x0A # invalid date/dead line
            # Signatures
            for i in range(ecc.b2i(d[x][:4])):
                dx = x + ecc.i2b(i+1, 4)
                if len(d[dx]) == NC: src, dst = x,         d[dx][:8]
                if len(d[dx]) == ND: src, dst = d[dx][:8], dx[:8]
                if len(d[dx]) in (NC, ND):
                    zx = ecc.b2h(src)
                    if zx not in d.keys():              return 0x0B # Error public key                    
                    msg, sig = src + dst + d[dx][8:-110], d[dx][-110:-14]
                    k = ecc.ecdsa()
                    k.pt = k.uncompress(ecc.h2b(zx + d[zx]))
                    if not k.verify(sig, msg):          return 0x0C # bad signature
            # Hash
            h = ecc.z10
            for i in range(ecc.b2i(d[x][:4])):
                dx = x + ecc.i2b(i+1, 4)
                h = hashlib.sha1(x + d[dx][:-10] + h).digest()[:10]
                if h != d[dx][-10:]:                    return 0x0D # bad hash
            # Wealth
            for i in range(ecc.b2i(d[x][:4])):
                dx = x + ecc.i2b(i+1, 4)
                if len(d[dx]) == ND: wc += ecc.b2i(d[dx][20:24])       
            # Operations counter
            for i in range(ecc.b2i(d[x][:4])):
                dx = x + ecc.i2b(i+1, 4)
                if len(d[dx]) in (ND, NC): tc += 1
            # Balances
            b = 0
            for i in range(ecc.b2i(d[x][:4])):
                dx = x + ecc.i2b(i+1, 4)
                if dx not in d:                         return 0x0E # missing transaction
                if len(d[dx])   == ND: b += ecc.b2i(d[x + ecc.i2b(i+1, 4)][20:24])
                elif len(d[dx]) == NS: b -= ecc.b2i(d[d[dx][:12]][20:24])
                if b != ecc.b2s(d[dx][-14:-10], 4):     return 0x0F # bad balance
                if b < -MAXBAL or b > MAXBAL:           return 0x10 # Out of bounds
    if wc != wr:                                        return 0x11 # bad wealth
    if tc != tr:                                        return 0x12 # bad counter
    if al != 0:                                         return 0x13 # bad money supply
    return 0 # Everythink ok !
Ejemplo n.º 29
0
def balance(x, d):
    ""
    n = ecc.b2i(d[x][:4])
    if n == 0: return 0
    return ecc.b2s(d[x + ecc.i2b(n, 4)][-14:-10], 4)  
Ejemplo n.º 30
0
def bal(x):
    return ecc.i2b(x, 4)