Changeset 263 for trunk

Show
Ignore:
Timestamp:
04/06/09 11:41:44 (3 years ago)
Author:
ocjhb
Message:

first oc2 coin minted

Location:
trunk/sandbox/jhb/oc2
Files:
7 modified

Legend:

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

    r261 r263  
    441441 
    442442 
     443############################################################################### 
     444 
     445>>> clientside = protocols.TransferRequest(transport,tid,'foo',[[mkc.keyId,blind]],[]) 
     446>>> testserver.run_once(port,issuer,mint) 
     447>>> text,value =  clientside.run() 
     448>>> text 
     449u'minted' 
     450>>> blindsign = value[0][1] 
     451>>> blank.signature = key.unblind(secret,blindsign) 
     452>>> coin = blank 
     453>>> key.verifyContainerSignature(coin) 
     454True 
     455 
     456############################################################################### 
    4434573.5 Wallet gets token back 
    444458 
  • trunk/sandbox/jhb/oc2/messages.py

    r261 r263  
    3131    ] 
    3232 
    33 class TransferToken(Message): 
     33class TransferRequest(Message): 
    3434     fields = Message.fields + [ 
    3535        Field('transactionId'), 
     
    4040    ] 
    4141 
     42class TransferAccept(Message): 
     43    fields = Message.fields + [ 
     44        Field('text'), 
     45        Field('signatures'), 
     46    ] 
    4247 
  • trunk/sandbox/jhb/oc2/mint.py

    r258 r263  
    2121 
    2222    def _addMintKey(self,priv,pub,denomination,version=-1): 
    23         keylist = self.storage.setdefault('keys',[]) 
    24         if version -1 > len(keylist) or len(keylist)==0: 
    25             keylist.append({}) 
    26         keylist[version][denomination] = (priv,pub) 
     23        keys = self.storage.setdefault('keys',[]) 
     24        keyids = self.storage.setdefault('keyids',{}) 
     25        if version -1 > len(keys) or len(keys)==0: 
     26            keys.append({}) 
     27        keys[version][denomination] = [priv,pub] 
     28        if version == -1: 
     29            version = len(keys) -1 
     30        keyids[pub.hash()] = [priv,pub,denomination,version] 
    2731 
    28     def getMintKey(self,denomination,version=-1): 
    29         keylist = self.storage['keys'] 
    30         return keylist[version][denomination][version]  
     32    def getMintKeyByDenomination(self,denomination,version=-1): 
     33        return self.storage['keys'][version][denomination] 
     34 
     35    def getMintKeyById(self,keyid): 
     36        return self.storage['keyids'][keyid] 
     37 
     38    def denominationToValue(self,denomination): 
     39        return int(denomination) 
     40 
     41    def validateTarget(self,target,amount): 
     42        return True 
     43 
     44    def mintBlinds(self,target,blinds): 
     45        amount = 0 
     46        currentversion = len(self.storage['keys']) - 1 
     47        errors = None 
     48        result = [] 
     49        mintkeys = [] 
     50 
     51        for keyid,blind in blinds: 
     52            error = None 
     53            priv,pub,denomination,version = self.getMintKeyById(keyid) 
     54            mintkeys.append(priv) 
     55            if version != currentversion: 
     56                error = 'Key not current' 
     57             
     58            if error: 
     59                errors = True 
     60                result.append(('error',error)) 
     61            else: 
     62                result.append(['ok','']) 
     63     
     64            amount += self.denominationToValue(denomination) 
     65         
     66        if errors: 
     67            return ('errors',result) 
     68 
     69        valid = self.validateTarget(target,amount) 
     70 
     71        if not valid: 
     72            return ('nonvalid','') 
     73 
     74        if valid and not errors: 
     75            i = 0 
     76            for keyid,blind in blinds: 
     77                signature = mintkeys[i].sign(blind) 
     78                result[i][1] = signature 
     79                i += 1 
     80                         
     81        return ('minted',result) 
     82 
     83 
  • trunk/sandbox/jhb/oc2/occrypto_rsa.py

    r259 r263  
    4343    def blind(self,data): 
    4444        secret = self.createBlindingSecret() 
    45         blinder =  rsa.powMod(rsa.invMod(secret, self.key['n']), self.key['e'], self.key['n']) 
     45        blinder =  pow(rsa.invMod(secret, self.key['n']), self.key['e'], self.key['n']) 
    4646        blinded = rsa.blind(data,blinder,self.key) 
    4747        return secret, blinded 
  • trunk/sandbox/jhb/oc2/protocols.py

    r262 r263  
    7373        return answer 
    7474 
     75class TransferRequest(Protocol): 
     76    def __init__(self,transport,transactionId,target=None,blinds=None,coins=None): 
     77        self.transport = transport 
     78        self.transactionId=transactionId 
     79        self.target = target 
     80        self.blinds = blinds 
     81        self.coins = coins 
    7582 
     83    def run(self,message=None): 
     84        if self.target and self.blinds: 
     85            type = 'mint' 
     86        elif self.target and self.coins: 
     87            type = 'redeem' 
     88        elif self.blinds and self.coins: 
     89            type = 'exchange' 
     90        else: 
     91            raise 'Not a valid combination of options' 
     92         
     93        message = messages.TransferRequest() 
     94        message.transactionId = self.transactionId 
     95        message.target = self.target 
     96        message.blinds = self.blinds 
     97        message.coins = self.coins 
     98        message.options = dict(type=type).items() 
    7699 
     100        response = self.transport(message) 
     101        header = response.header 
     102        if header == 'TransferReject': 
     103            return ('TRansferReject','') 
     104        elif header == 'TransferDelay': 
     105            return ('TransferDelay','') 
     106        elif header == 'TransferAccept': 
     107            return (response.text,response.signatures) 
     108        else: 
     109            raise 'unknown thing' 
     110 
     111class TransferHandle(Protocol): 
     112 
     113    def __init__(self,mint): 
     114        self.mint = mint 
     115 
     116    def run(self,message): 
     117        options = dict(message.options) 
     118        type = options['type'] 
     119        if type == 'mint': 
     120            text,value = self.mint.mintBlinds(message.target,message.blinds) 
     121            if text == 'minted': 
     122                answer = messages.TransferAccept() 
     123                answer.text = text 
     124                answer.signatures = value 
     125            else: 
     126                raise 'something went wrong' 
     127        return answer     
    77128 
    78129class CoinsSpendSender(Protocol): 
     
    89140 
    90141 
     142 
    91143class CoinsSpendRecipient(Protocol): 
    92144 
     
    98150 
    99151 
    100 class TransferCoinsSender(Protocol): 
    101      
    102     def __init__(self,target,blinds,coins): 
    103         self.target = target 
    104         self.blinds = blinds 
    105         self.coins = coins 
    106152 
    107  
    108  
    109     def transferCoins(self,message): 
    110         return '' 
    111  
    112  
    113 class TransferCoinRecipient(Protocol): 
    114      
    115     def receiveCoins(self,message): 
    116         return '' 
    117  
    118  
    119  
  • trunk/sandbox/jhb/oc2/rsa.py

    r262 r263  
    2323# Get os.urandom PRNG 
    2424import os 
    25 try: 
    26     raise Exception 
    27     os.urandom(1) 
    28     def getRandomBytes(howMany): 
    29         return stringToBytes(os.urandom(howMany)) 
    30     grbname = 'urandom'         
    31 except: 
    32  
    33     def getRandomBytes(howMany): 
    34         bits = howMany * 8 
    35         number = random.getrandbits(bits) 
    36         return numberToBytes(number) 
    37         pass 
    38     grbname = 'randint'         
     25def getRandomBytes(howMany): 
     26    bits = howMany * 8 
     27    number = random.getrandbits(bits) 
     28    return numberToBytes(number) 
     29   
    3930 
    4031def log(x, base = 10): 
     
    171162 
    172163def generate(bits):  #needed 
    173     #return (dummypub,dummypriv) 
     164    return (dummypub,dummypriv) 
    174165    p = getRandomPrime(bits/2, False) 
    175166    q = getRandomPrime(bits/2, False) 
  • trunk/sandbox/jhb/oc2/testserver.py

    r259 r263  
    1717        elif message.header == 'FetchMintKeys': 
    1818            protocol = protocols.GiveMintKeys(self.issuer) 
     19        elif message.header == 'TransferRequest': 
     20            protocol = protocols.TransferHandle(self.mint) 
    1921        answer = protocol.run(message) 
    2022        self.send_response(200) 
     
    2426 
    2527 
    26 def run_once(port,issuer=None): 
     28def run_once(port,issuer=None,mint=None): 
    2729    Handler.issuer = issuer 
     30    Handler.mint = mint 
    2831    httpd = BaseHTTPServer.HTTPServer(("", port), Handler) 
    2932    import threading