| 13 | | content part: |
| 14 | | opencoin standard version http://opencoin.org/OpenCoinProtocol/1.0 (accidentally a URL of the Standard) |
| 15 | | currency identifier http://opencent.net/OpenCent (accidentally URL of this CDD) |
| 16 | | currency identifier (short) OC |
| 17 | | issuer service location opencoin://issuer.opencent.net:8002 |
| 18 | | denominations 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000 |
| 19 | | issuer public master key .... |
| 20 | | + |
| 21 | | signature over the content part, made with the issuers master secret key |
| 22 | | + |
| 23 | | [signature over the content part, made with somebody's secret key, ...] |
| | 13 | standard version = http://opencoin.org/OpenCoinProtocol/1.0 |
| | 14 | currency identifier = http://opencent.net/OpenCent |
| | 15 | short currency identifier = OC |
| | 16 | issuer service location = opencoin://issuer.opencent.net:8002 |
| | 17 | denominations = 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000 |
| | 18 | issuer cipher suite = HASH-ALG, SIGN-ALG, BLINDING-ALG |
| | 19 | issuer public master key = base64(pM) |
| | 20 | |
| | 21 | base64(sig(sM,hash(content part))) |
| 26 | | |
| 27 | | * mint (regularily) creates keypairs (p[i],s[i]) for all denominations i, |
| 28 | | sign(sM, (i, id(p[i])), p[i], coin_expires, key_not_before, key_not_after) |
| 29 | | |
| 30 | | (id() = hash()) (p herausnehmen???) |
| 31 | | |
| 32 | | * issuer fires up issuer service at <opencoin://issuer.opencent.net:8002> |
| | 24 | (question: is the "short currency identifier" needed?) |
| | 25 | (future: add additionial signatures, e.g. from wallet software vendors) |
| | 26 | |
| | 27 | * issuer publishes CDD at "currency identifier" URL |
| | 28 | |
| | 29 | * mint (regularily) creates keypairs (p,s) for all denominations and id(p). |
| | 30 | Master key holder generates keys certificate |
| | 31 | |
| | 32 | { |
| | 33 | key identifier = base64(id(p)) |
| | 34 | denomination = denomination |
| | 35 | not_before = TIME(...) |
| | 36 | key_not_after = TIME(...) |
| | 37 | coin_not_after = TIME(...) |
| | 38 | public key = base64(p) |
| | 39 | |
| | 40 | base64(sig(sM, hash(content part))) |
| | 41 | } |
| | 42 | |
| | 43 | |
| | 44 | Questions: |
| | 45 | * Time format: YYYYMMDDHHMMSS 20071211144111 or SecondsSinceEpoch? |
| | 46 | * id() = sha256()? |
| | 47 | * CDD? |
| | 48 | |
| | 49 | * issuer fires up issuer service (=IS) at <opencoin://issuer.opencent.net:8002> |
| 71 | | * Issuer: checks, if key_id is current, otherwise rejct with "current key is #ID" |
| 72 | | |
| 73 | | Decides if request will be minted (e.g., payment not yet received), otherwise rejects |
| 74 | | |
| 75 | | Issuer passes (maybe asynchronous) reuest to mint. |
| 76 | | |
| 77 | | Mint processes request (sings blind with key_id) |
| 78 | | |
| 79 | | Mint passes "signed blind"="blind coin" back to issuer |
| | 97 | * Issuer: if key_id is not current: |
| | 98 | |
| | 99 | REFUSE_MINTING #hex_string(number_of_rejected_blinds) |
| | 100 | #key_id(blind1) "Bad Key ID" |
| | 101 | #key_id(blind2) "Bad Key ID"[\r]\n |
| | 102 | |
| | 103 | Elif request will not be minted (e.g., payment not yet received): |
| | 104 | |
| | 105 | REFUSE_MINTING #hex_string(number_of_rejected_blinds) |
| | 106 | #key_id(blind1) "Some error message" |
| | 107 | #key_id(blind2) "Some error message"[\r]\n |
| | 108 | |
| | 109 | Else: IS passes (maybe asynchronous) request to mint and: |
| | 110 | ACKNOWLEDGE_MINTING #base64(request_id)[\r]\n |
| | 111 | |
| | 112 | Session is terminated. |
| | 113 | |
| | 114 | |
| | 115 | |
| | 116 | Mint processes request (signs blind with key_id) |
| | 117 | |
| | 118 | Mint passes "signed blind"="blind coin" back to IS |
| | 128 | |
| | 129 | FETCH_MINTED_FAILED #base64(request_id) "Reason" |
| | 130 | FETCH_MINDED_WAIT #base64(request_id) "Reason" |
| | 131 | |
| | 132 | Possible failures: "Request ID Unknown", "Request ID expired", "Request ID rejected" |
| | 133 | Possible waits: "Processing request" |
| | 134 | |
| | 135 | (question: what about key expiration while request is in mining queue) |
| | 136 | |
| | 137 | PASS_MINTED_BLINDS #base64(request_id) #hex_string(number_of_blinds) |
| | 138 | #base64(signature_of_blind1) |
| | 139 | #base64(signature_of_blind2)[\r]\n |
| | 140 | |
| | 141 | |
| 97 | | Wallet S - sends a coin |
| 98 | | Wallet R - receives the coin |
| 99 | | |
| 100 | | * (Wallet S locates Wallet R) |
| 101 | | (S knows how much to send) |
| 102 | | |
| 103 | | * S tells Wallet S what sum to send to Wallet R |
| 104 | | |
| 105 | | * Wallet S needs to compute a splitting of sum into coins (units) |
| 106 | | |
| 107 | | * Wallet S sends blanks of coins (without signature!) to Wallet R |
| 108 | | (Wallet S now needs to wait a while) |
| 109 | | |
| 110 | | * Wallet R validates the blanks |
| | 152 | Alice - sends a coin |
| | 153 | Bob - receives the coin |
| | 154 | |
| | 155 | * Prerequisites: |
| | 156 | * Wallet Alice locates Wallet Bob and sets up (secure) connection |
| | 157 | * Alice knows how much to send and tells her Wallet |
| | 158 | * Wallet Alice calculates a splitting of sum into coins (units) and |
| | 159 | creates a list of coins to send |
| | 160 | |
| | 161 | * Wallet Alice sends blanks of coins (without signature!) with the serial |
| | 162 | encrypted for the IS to Wallet Bob |
| | 163 | (Wallet Alice now needs to wait a while) |
| | 164 | |
| | 165 | SPEND_COIN #hex_string(number_of_coins) #base64(coin1) #base64(coin2)[\r]\n |
| | 166 | |
| | 167 | * Wallet Bob validates the blanks |
| 142 | | * Wallet R tells Wallet S accept or reject with reason (unknown, outdated, locked, spent) for each rejected blank |
| 143 | | (if one blank is rejected the whole transfer has to be rejected) |
| 144 | | |
| 145 | | * Wallet S sends coins to Wallet R (= blanks + signature) |
| 146 | | |
| 147 | | * Wallet R checks that the coins match the blanks and that signatures are valid |
| 148 | | |
| 149 | | * Wallet R accepts transaction or rejects with reason (unknown, invalid) for each rejected coin |
| 150 | | |
| 151 | | * Wallet R terminates session with Wallet S |
| 152 | | |
| 153 | | (in case of rejection Wallet S needs to do emergency meassures, quickly trying to exchange coins with IS |
| | 199 | * Wallet Bob tells Wallet Alice accept or reject with reason (unknown, outdated, locked, spent) for each rejected blank |
| | 200 | (if one blank is rejected the whole transfer has to be rejected) (future: bob signs receipt) |
| | 201 | |
| | 202 | * Wallet Alice sends coins to Wallet Bob (this time including their clear serial and signature) |
| | 203 | |
| | 204 | * Wallet Bob checks that the coins match the blanks and that signatures are valid |
| | 205 | |
| | 206 | * Wallet Bob accepts transaction or rejects with reason (unknown, invalid) for each rejected coin |
| | 207 | |
| | 208 | * Wallet Bob terminates session with Wallet Alice |
| | 209 | |
| | 210 | (in case of rejection Wallet Alice needs to do emergency meassures, quickly trying to exchange coins with IS |