Changeset 254 for trunk

Show
Ignore:
Timestamp:
03/30/09 20:09:33 (3 years ago)
Author:
ocjhb
Message:

some issuer and mint stuff working

Location:
trunk/sandbox/jhb/oc2
Files:
6 added
2 modified
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/sandbox/jhb/oc2/container.py

    r250 r254  
    1 import simplejson, datetime, binascii 
    2  
    3 ################################### Fields ################################## 
    4  
    5 class Field(object): 
    6     def __init__(self,name,signing=True,default=''): 
    7         self.name = name 
    8         self.signing = signing 
    9         self.default = default 
    10  
    11     def getencoded(self,object,allData=False): 
    12         value = getattr(object,self.name,self.default) 
    13         return value 
    14  
    15     def setdecoded(self,object,data): 
    16         setattr(object,self.name,data) 
    17  
    18 class DateField(Field): 
    19  
    20     format = '%d.%m.%Y %H:%M:%S' 
    21  
    22     def getencoded(self,object,allData=False): 
    23         value = getattr(object,self.name,self.default) 
    24         if not value: 
    25             value = datetime.datetime.now() 
    26         return value.strftime(self.format) 
    27  
    28     def setdecoded(self,object,data): 
    29         dt = datetime.datetime.strptime(data,self.format) 
    30         setattr(object,self.name,dt) 
    31  
    32          
    33  
    34 class BinaryField(Field): 
    35      
    36     def getencoded(self,object,allData=False): 
    37         value = getattr(object,self.name,self.default) 
    38         return binascii.b2a_base64(value).strip() 
    39  
    40     def setdecoded(self,object,data): 
    41         setattr(object,self.name,binascii.a2b_base64(data)) 
    42       
    43      
    44 class OneItemField(Field): 
    45      
    46     def __init__(self,name,signing=True,default='',klass=dict): 
    47         Field.__init__(self,name=name,signing=signing,default=default) 
    48         self.klass = klass 
    49  
    50  
    51     def getencoded(self,object,allData=False): 
    52         value = getattr(object,self.name) 
    53         if value: 
    54             value = value.getData(allData=allData) 
    55         else: 
    56             value = self.default 
    57         return  value 
    58          
    59     def setdecoded(self,object,data): 
    60         setattr(object,self.name,self.klass(data)) 
    61  
    62  
    63  
    64  
    65 class SubitemsField(Field): 
    66      
    67     def __init__(self,name,signing=True,default='',klass=dict): 
    68         Field.__init__(self,name=name,signing=signing,default=default) 
    69         self.klass = klass 
    70  
    71  
    72     def getencoded(self,object,allData=False): 
    73         out = [] 
    74         for item in getattr(object,self.name): 
    75             out.append(item.getData(allData=allData)) 
    76         return out        
    77          
    78     def setdecoded(self,object,data): 
    79         value = [] 
    80         for item in data: 
    81             value.append(self.klass(item)) 
    82         setattr(object,self.name,value)      
    83  
    84  
    85 ################################### Containers ################################## 
    86                
    87  
    88 class Container(object):    
    89      
    90     fields = [] 
    91  
    92     def __init__(self,data={}): 
    93         self.fromData(data) 
    94  
    95     def __xrepr__(self): 
    96         return "<%s(%s)>" % (self.__class__.__name__,self.getData(True)) 
    97  
    98     def __xstr__(self): 
    99         return self.toString() 
    100  
    101     def fromData(self,data): 
    102         if type(data) == type(''): 
    103             data = simplejson.loads(data) 
    104         if type(data) != type({}): 
    105             data = dict(data) 
    106         for field in self.fields: 
    107             if data.has_key(field.name): 
    108                 field.setdecoded(self,data[field.name]) 
    109             else:                
    110                 setattr(self,field.name,field.default) 
    111  
    112  
    113     def getData(self,allData=False): 
    114         certdata = [] 
    115         for field in self.fields: 
    116             if not (allData or field.signing): 
    117                 continue 
    118             certdata.append((field.name,field.getencoded(self,allData=allData))) 
    119         return certdata 
    120  
    121     def toString(self,allData=False): 
    122         return simplejson.dumps(self.getData(allData=allData)) 
    123  
     1from containerbase import * 
     2import occrypto 
    1243 
    1254class CDD (Container): 
     
    1276 
    1287    fields = [ 
    129         Field('standard_id'), 
    130         Field('currency_id'), 
    131         Field('short_currency_id'), 
    132         Field('issuer_service_location'), 
     8        Field('standardId'), 
     9        Field('currencyId'), 
     10        Field('shortCurrencyId'), 
     11        Field('issuerServiceLocation'), 
    13312        Field('denominations'), 
    134         Field('issuer_cipher_suite'), 
     13        Field('issuerCipherSuite'), 
    13514        Field('options'), 
    136         Field('issuer_public_master_key'), 
     15        OneItemField('masterPubKey',klass=occrypto.PubKey), 
    13716        Field('issuer'), 
     17        Field('version'), 
    13818        Field('signature',signing=False) 
    13919    ] 
     
    14828 
    14929 
    150 class MintKey(Container): 
    151     "A mintkey, contains key + metadata" 
     30class MKC(Container): 
     31    "Mint Key Certificate" 
    15232 
    15333    fields = [ 
    154         Field('key_id'), 
    155         Field('currency_id'), 
     34        Field('keyId'), 
     35        Field('currencyId'), 
    15636        Field('denomination'), 
    157         DateField('not_before'), 
    158         DateField('key_not_after'), 
    159         DateField('coin_not_after'), 
    160         OneItemField('public_key',klass=PublicKey), 
     37        DateField('notBefore'), 
     38        DateField('keyNotAfter'), 
     39        DateField('coinNotAfter'), 
     40        OneItemField('publicKey',klass=PublicKey), 
    16141        Field('issuer'), 
    16242        Field('signature',signing=False) 
  • trunk/sandbox/jhb/oc2/occrypto_rsa.py

    r251 r254  
    11"""This is a playground to develop the api for the pubkey and secret key. 
    22Don't take the crypto seriously""" 
    3 from container import Container,Field 
     3from containerbase import * 
    44import hashlib 
    55import rsa 
     
    1313        self.isPrivate = isPrivate 
    1414 
    15     
     15    def getencoded(self,object,allData=False): 
     16        value = getattr(object,self.name,self.default) 
     17        items = value.items() 
     18        items.sort() 
     19        return items 
     20 
     21    def setdecoded(self,object,data): 
     22        setattr(object,self.name,dict(data)) 
    1623 
    1724class PubKey(Container): 
     
    2936    def verifyContainerSignature(self,container): 
    3037        signature = container.signature 
    31         data = container.toString() 
     38        data = container.hash() 
    3239        return self.verifySignature(signature=signature,data=data) 
    3340 
     
    6168 
    6269    def signContainer(self,container): 
    63         signature =  self.sign(container.toString()) 
     70        signature =  self.sign(container.hash()) 
    6471        container.signature = signature 
    6572        return container 
    6673 
    6774def hash(data): 
    68     return hashlib.sha256(data).digest() 
     75    return hashlib.sha256(data).hexdigest() 
    6976 
     77def hashContainer(container,allData=False): 
     78    return hash(container.toString(allData=allData)) 
     79 
     80Container.hash = hashContainer 
    7081def KeyFactory(bitlen): 
    7182    pub,priv = rsa.gen_pubpriv_keys(bitlen) 
  • trunk/sandbox/jhb/oc2/test_playground.py

    r250 r254  
    11r""" 
     2>>> import testserver 
     3>>> testserver.run_once() 
     4>>> import urllib2 
     5>>> urllib2.urlopen('http://localhost:8000').read() 
     6'foo' 
    27>>> import occrypto as occrypto 
    38>>> (priv,pub) = occrypto.KeyFactory(1024) 
     
    813>>> pub.verifySignature(signature,text) 
    914True 
    10 >>> sig2 = priv.sign('foobar') 
    11 >>> pub.verifySignature(sig2,'foobar') 
     15>>> p1 = pub.toString() 
     16>>> p2 = occrypto.PubKey(p1).toString() 
     17>>> p1 == p2 
    1218True 
     19 
     20 
     21>>> from container import CDD 
     22>>> cdd = CDD() 
     23>>> cdd.issuer_public_master_key = pub 
     24>>> tmp = priv.signContainer(cdd) 
     25>>> pub.verifyContainerSignature(cdd) 
     26True 
     27 
     28 
    1329""" 
    1430""" 
  • trunk/sandbox/jhb/oc2/testserver.py

    r253 r254  
    1414 
    1515httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler) 
    16 print "serving at port", PORT 
    17 t = threading.Thread(target=httpd.handle_request) 
    18 t.start() 
     16import threading 
     17def run_once(): 
     18    t = threading.Thread(target=httpd.handle_request)      
     19    t.start() 
     20 
     21 
     22#print "serving at port", PORT 
     23#t = threading.Thread(target=httpd.handle_request) 
     24#t.start() 
    1925#import time 
    2026#for i in range(10): 
    2127#    time.sleep(3) 
    22 print 'foobar' 
     28#print 'foobar' 
    2329 
    2430#httpd.serve_forever()