- Timestamp:
- 04/06/09 11:41:44 (3 years ago)
- Location:
- trunk/sandbox/jhb/oc2
- Files:
-
- 7 modified
-
documentation.py (modified) (1 diff)
-
messages.py (modified) (2 diffs)
-
mint.py (modified) (1 diff)
-
occrypto_rsa.py (modified) (1 diff)
-
protocols.py (modified) (3 diffs)
-
rsa.py (modified) (2 diffs)
-
testserver.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/sandbox/jhb/oc2/documentation.py
r261 r263 441 441 442 442 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 449 u'minted' 450 >>> blindsign = value[0][1] 451 >>> blank.signature = key.unblind(secret,blindsign) 452 >>> coin = blank 453 >>> key.verifyContainerSignature(coin) 454 True 455 456 ############################################################################### 443 457 3.5 Wallet gets token back 444 458 -
trunk/sandbox/jhb/oc2/messages.py
r261 r263 31 31 ] 32 32 33 class Transfer Token(Message):33 class TransferRequest(Message): 34 34 fields = Message.fields + [ 35 35 Field('transactionId'), … … 40 40 ] 41 41 42 class TransferAccept(Message): 43 fields = Message.fields + [ 44 Field('text'), 45 Field('signatures'), 46 ] 42 47 -
trunk/sandbox/jhb/oc2/mint.py
r258 r263 21 21 22 22 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] 27 31 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 43 43 def blind(self,data): 44 44 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']) 46 46 blinded = rsa.blind(data,blinder,self.key) 47 47 return secret, blinded -
trunk/sandbox/jhb/oc2/protocols.py
r262 r263 73 73 return answer 74 74 75 class 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 75 82 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() 76 99 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 111 class 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 77 128 78 129 class CoinsSpendSender(Protocol): … … 89 140 90 141 142 91 143 class CoinsSpendRecipient(Protocol): 92 144 … … 98 150 99 151 100 class TransferCoinsSender(Protocol):101 102 def __init__(self,target,blinds,coins):103 self.target = target104 self.blinds = blinds105 self.coins = coins106 152 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 23 23 # Get os.urandom PRNG 24 24 import 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' 25 def getRandomBytes(howMany): 26 bits = howMany * 8 27 number = random.getrandbits(bits) 28 return numberToBytes(number) 29 39 30 40 31 def log(x, base = 10): … … 171 162 172 163 def generate(bits): #needed 173 #return (dummypub,dummypriv)164 return (dummypub,dummypriv) 174 165 p = getRandomPrime(bits/2, False) 175 166 q = getRandomPrime(bits/2, False) -
trunk/sandbox/jhb/oc2/testserver.py
r259 r263 17 17 elif message.header == 'FetchMintKeys': 18 18 protocol = protocols.GiveMintKeys(self.issuer) 19 elif message.header == 'TransferRequest': 20 protocol = protocols.TransferHandle(self.mint) 19 21 answer = protocol.run(message) 20 22 self.send_response(200) … … 24 26 25 27 26 def run_once(port,issuer=None ):28 def run_once(port,issuer=None,mint=None): 27 29 Handler.issuer = issuer 30 Handler.mint = mint 28 31 httpd = BaseHTTPServer.HTTPServer(("", port), Handler) 29 32 import threading
