gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-kotlin] branch master updated (f25a15c -> 504e4e9)


From: gnunet
Subject: [taler-wallet-kotlin] branch master updated (f25a15c -> 504e4e9)
Date: Mon, 08 Jun 2020 14:54:02 +0200

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a change to branch master
in repository wallet-kotlin.

    from f25a15c  Implement RSA blinding (only JVM)
     new 01b745f  Implement RSA unblinding and blind signature verification 
(JVM only)
     new 504e4e9  Implement setupRefreshPlanchet

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .idea/dictionaries/user.xml                        |  1 +
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |  8 ++
 .../net/taler/wallet/kotlin/crypto/RsaBlinding.kt  | 17 ++++
 .../taler/wallet/kotlin/crypto/RsaBlindingTest.kt  | 95 +++++++++++++++++++---
 .../net/taler/wallet/kotlin/crypto/Crypto.kt       |  4 +
 .../net/taler/wallet/kotlin/crypto/CryptoImpl.kt   | 19 +++++
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |  8 ++
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |  8 ++
 8 files changed, 147 insertions(+), 13 deletions(-)

diff --git a/.idea/dictionaries/user.xml b/.idea/dictionaries/user.xml
index 5f88694..a7b3027 100644
--- a/.idea/dictionaries/user.xml
+++ b/.idea/dictionaries/user.xml
@@ -5,6 +5,7 @@
       <w>eddsa</w>
       <w>hmac</w>
       <w>nacl</w>
+      <w>planchet</w>
     </words>
   </dictionary>
 </component>
\ No newline at end of file
diff --git 
a/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
index 721024b..cf754f2 100644
--- a/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
+++ b/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
@@ -76,4 +76,12 @@ internal object CryptoJvmImpl : CryptoImpl() {
         return RsaBlinding.rsaBlind(hm, bks, rsaPubEnc)
     }
 
+    override fun rsaUnblind(sig: ByteArray, rsaPubEnc: ByteArray, bks: 
ByteArray): ByteArray {
+        return RsaBlinding.rsaUnblind(sig, rsaPubEnc, bks)
+    }
+
+    override fun rsaVerify(hm: ByteArray, rsaSig: ByteArray, rsaPubEnc: 
ByteArray): Boolean {
+        return RsaBlinding.rsaVerify(hm, rsaSig, rsaPubEnc)
+    }
+
 }
diff --git 
a/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt 
b/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
index 6877df8..6158c52 100644
--- a/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
+++ b/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
@@ -16,6 +16,23 @@ internal object RsaBlinding {
         return bm.toByteArrayWithoutSign()
     }
 
+    fun rsaUnblind(sig: ByteArray, rsaPubEnc: ByteArray, bks: ByteArray): 
ByteArray {
+        val rsaPub = rsaPubDecode(rsaPubEnc)
+        val blindedSig = BigInteger(1, sig)
+        val r = rsaBlindingKeyDerive(rsaPub, bks)
+        val rInv = r.modInverse(rsaPub.n)
+        val s = blindedSig.multiply(rInv).mod(rsaPub.n)
+        return s.toByteArrayWithoutSign()
+    }
+
+    fun rsaVerify(hm: ByteArray, rsaSig: ByteArray, rsaPubEnc: ByteArray): 
Boolean {
+        val rsaPub = rsaPubDecode(rsaPubEnc)
+        val d = rsaFullDomainHash(hm, rsaPub)
+        val sig = BigInteger(1, rsaSig)
+        val sigE = sig.modPow(rsaPub.e, rsaPub.n)
+        return sigE == d
+    }
+
     private fun rsaBlindingKeyDerive(rsaPub: RsaPublicKey, bks: ByteArray): 
BigInteger {
         val salt = "Blinding KDF extrator HMAC key".encodeToByteArray()
         val info = "Blinding KDF".encodeToByteArray()
diff --git 
a/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt 
b/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
index 2c96797..7f5cb4e 100644
--- a/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
+++ b/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
@@ -3,27 +3,96 @@ package net.taler.wallet.kotlin.crypto
 import net.taler.wallet.kotlin.Base32Crockford
 import kotlin.test.Test
 import kotlin.test.assertEquals
+import kotlin.test.assertTrue
 
 // TODO move to commonTest once RsaBlinding is implemented everywhere
 class RsaBlindingTest {
 
     private val crypto = CryptoFactory.getCrypto()
 
+    private val vectors = listOf(
+        TestVector(
+            
"TT1R28D79EJEJ9PC35AQS35CCG85DSXSZ508MV2HS2FN4ME6AHESZX5WP485R8A75KG53FN6F1YNW95008663TKAPWB81420VG17BY8",
+            
"040000Y62RSDDKZXTE7GDVA302ZZR0DY224RSDT6WDWR1XGT8E3YG80XV6TMT3ZCNP8XC84W0N6MSZ0EF8S3YB1JJ2AXY9JQZW3MCA0CG38ER4YE2RY4Q2666DEZSNKT29V6CKZVCDHXSAKY8W6RPEKEQ5YSBYQK23MRK3CQTNNJXQFDKEMRHEC5Y6RDHAC5RJCV8JJ8BF18VPKZ2Q7BB14YN1HJ22H8EZGW0RDGG9YPEWA9183BHEQ651PP81J514TJ9K8DH23AJ50SZFNS429HQ390VRP5E4MQ7RK7ZJXXTSZAQSRTC0QF28P23PD37C17QFQB0BBC54MB8MDH7RW104STG6VN0J22P39JP4EXPVGK5D9AX5W869MDQ6SRD42ZYK5H20227Q8CCWSQ6C3132WP0F0H04002",
+            "7QD31RPJH0W306RJWBRG646Z2FTA1F89BKSXPDAG7YM0N5Z0B610",
+            
"GA8PC6YH9VF5MW6P2DKTV0W0ZTQ24DZ9EAN5QH3SQXRH7SCZHFMM21ZY05F0BS7MFW8TSEP4SEB280BYP5ACHNQWGE10PCXDDMK7ECXJDPHJ224JBCV4KYNWG6NBR3SC9HK8FXVFX55GFBJFNQHNZGEB8DB0KN9MSVYFDXN45KPMSNY03FVX0JZ0R3YG9XQ8XVGB5SYZCF0QSHWH61MT0Q10CZD2V114BT64D3GD86EJ5S9WBMYG51SDN5CSKEJ734YAJ4HCEWW0RDN8GXA9ZMA18SKVW8T3TTBCPJRF2Y77JGQ08GF35SYGA2HWFV1HGVS8RCTER6GB9SZHRG4T7919H9C1KFAP50G2KSV6X42D6KNJANNSGKQH649TJ00YJQXPHPNFBSS198RY2C243D4B4W",
+            
"5VW0MS5PRBA3W8TPATSTDA2YRFQM1Z7F2DWKQ8ATMZYYY768Q3STZ3HGNVYQ6JB5NKP80G5HGE58616FPA70SX9PTW7EN8EJ23E26FASBWZBP8E2RWQQ5E0F72B2PWRP5ZCA2J3AB3F6P86XK4PZYT64RF94MDGHY0GSDSSBH5YSFB3VM0KVXA52H2Y2G9S85AVCSD3BTMHQRF5BJJ8JE00T4GK70PSTVCGMRKRNA7DGW7GD2F35W55AXF7R2YJC8PAGNSJYWKC3PC75A5N8H69K299AK5PM3CDDHNS4BMRNGF7K49CR4ZBFRXDAWMB3X6T05Q4NKSG0F1KP5JA0XBMF2YJK7KEPRD1EWCHJE44T9YXBTK4W9CV77X7Z9P407ZC6YB3M2ARANZXHJKSM3XC33M",
+            
"PFT6WQJGCM9DE6264DJS6RMG4XDMCDBJKZGSXAF3BEXWZ979Q13NETKK05S1YV91CX3Y034FSS86SSHZTTE8097RRESQP52EKFGTWJXKHZJEQJ49YHMBNQDHW4CFBJECNJSV2PMHWVGXV7HB84R6P0S3ES559HWQX01Q9MYDEGRNHKW87QR2BNSG951D5NQGAKEJ2SSJBE18S6WYAC24FAP8TT8ANECH5371J0DJY0YR0VWAFWVJDV8XQSFXWMJ80N3A80SPSHPYJY3WZZXW63WQ46WHYY56ZSNE5G1RZ5CR0XYV2ECKPM8R0FS58EV16WTRAM1ABBFVNAT3CAEFAZCWP3XHPVBQY5NZVTD5QS2Q8SKJQ2XB30E11CWDN9KTV5CBK4DN72EVG73F3W3BATAKHG"
+        ),
+        TestVector(
+            
"0FDX7T3AXJ3AGTGMVSE8ZCDJGKH9DDBB0NHVF42S8D1Z4E2T1KAYF03DP6AA0GA6YS7Y64JR0YHFNWDGFSVH2VCTX57F71P92F6PCB0",
+            
"040000YE5QYTJTCYF7YDWN2ECYAMBNENHQT7YT740XNC88V5F1K4YC2QD94WABBVHZY597B2BTGBD2NJJV028JKJTD1KBPKXF4D87B7ZJYZVQSA4ZB5H1FVPE7X7YQVG668YZ2YY229X29NM4B6QR0G3TH821QBT1J5EDPKS0RP8E6X4654DTAAYBEN14H96E8D1JFVE40773FVVPXXMX7ZXT7TCVC2EZFMZR1HQ2DDXD8KJZ9AEGS1YH4D629Y08T9X2533MS6R4X58VVKHN1YQVKJT2044A0S8B4AKCW2GJHMQM10XC3K7C3D1C841A6R96GRXPC02QVBQSA1D5VY5VG2T4HVC6NKVK5WAXDEYZNKYVPD9AV4MNCYGK23AZWGHX5E16BQTNG47C9DEETP2D87XFC9D04002",
+            "GJTG5KGE8XTSMVCMZBQGPFVBQ6RYX8RR2ST8JKNJKZ3KJN1SKJPG",
+            
"2VN8NCT3JFWKDYJTR048YCKWHZ2DHKRSFA0Q42R8FB33YH2GMNH9M89AHRWSKCVYJ0000PE1PRWVT0DM95VQ7R883JZ2DEFQ38TVGMTKMSRBM6JK56A40S89HA6E3ZV40VZ9RCXGNY095DBB13SV68SYNGJ0MCDKW7PRA04YE8TRJYJV527Y1XJ4B5Y0FF8TSEE5YCNM4MW1M3P1AP6V8W6KKCAJ213N3P01K9WTKP45PGEJ0RWC0K5789V4BHMZAM2EFHPNEX24KWC7G59M160XF60ZNYCP9V0GV0V80K4XKD7CAXTS5YNZBPXQSTK90DEF750SHMVKATGS3GW1TGESAQ24AA4ZG5E9F58KWHBMD1WKP0VDBVTGPECQVE5F79DFD2WBB86M3NQ04RE7YGRWQ4",
+            
"JFHDDJXQPAT0F1JF0GPVGC1CEQVQ9PXMY88KWKS16MEGPYBAMD5HAR2JHX8DAE8ER30ZYX1GBBYYKYN2M7Z0F29G6YHDF9SHZ7RK2XJW4J4HZPTS1ZV4TERC37Q3B1380XXP1SNM5DFZ0FW9W2PKSWEA0NHFYMCF8FR514WJ795W8ER9EKNGY51YSAF70ZG2DE3H0PPH69BWHJ4188R4AN7JT0T7WVVK0AQP9NAB36TAGMSRNKWEDAPMS0GP4M3BCY6WRXF8JQ52QSVWWMT03WZKRVGRRN03AY57X6TZD29AQB7QNKB4CGGPEW95Z2W2K7K3CV8EG1Z8Q3S7Y0M9VZ8D29CQQV4D75NQXRDFHMVZJ9X8EBPF1XHPM0FTK5GB7CDPRZ0SX5NF1HQKMHZMP35KSG",
+            
"J99Q5G54YP6Y29HCR0X4385TQASSZDPMM0H3KZPD1744KRHJ895K4B41N4W03M9AN4RN5WR54NDRV6GAQ2R83K605NZCECD5BMV62Q7TWS4XVAK6ZG7MTHBNW9Y8Z5EJRR4BAJQ6QPKEPD3N0CXSHGPJM1KGEZQSYS4ZZWG7Z5YEYRAZ1S4VP03KEBJ1GR2PDRE61XBPCKEXXWWSWKWDP65WZKYYQNWVCRNZ4AQGR1N2H4EN3STBQC8126AFYCM73K9VHCB7P171E8AP0QZSKP5SEK8XCA3F16KYBZ0MD7EMY1NB0KFF3K51C227Z2WMCW8DWSJM39CDP7B5E7ZZATVQ17W4FN2HT00B26QH4HPCJ0Q66JNF8T3086ZEAKKTK835RN7SMGZATD8NN2G7QGW344"
+        ),
+        TestVector(
+            
"E1ECK6HSEYXRDPGC9ESVVBFR5516FWGEXW0K3K7PDGPHFE32RB6F5G0EM5VHBVGW4TJPTMM314M2YTZQ1RJDNJGBTC2QP8TQTB04AYR",
+            
"040000ZVQC32P71MYD6A4FTT4P2DABQ100S7AEQ2BB4CW1YY8RMXK24SE7RG15VQT88KY0JP8JGTDTEA2ZE8MBHNGR9TQJXHAAZQ67D54826S5ZVNBNR4ZTC6DKF2KTQEGFBV80ZNXWA97SV2G8DXVSER8J1ANWADDMCE2C3QKX7VJVP042V48DKHV36XCS2W5Y579CKY7E4MXPK7CCP1B3FPXE86JRZ3FBVHW0WBXSJ45HQYFNTFA8GEWNN81JDVX9D36XCX70C5CCFDMY53J6ZYYM6MSVTXFM4X33TMCX21EZARHCS6Q9SJV201SPQPXZ876EJ0CPYHC9PYRZTWJDHECJYMS97CFHEWCVR7C3G47VZPHJS50YXS2CP8RT8CSPG63GNAFBMM7Y67BMTED0HND0BDX4Q04002",
+            "XN5QNPBBPD69EM597VT7W1RCJT8N1DC4PS65CTV3V9KQW6K27VB0",
+            
"7YC9YVSJAPJ5SMQ68W761K61BZM1J6NMQ5VW57SJCVRQ7G1KPCZ39F79BTY96AP134SES5QM3AQSMNA7FR9C65B1NA2BD7EKM12SNNSG25FRQRD902692Z535N2ZC6R7BQHHQJVGSXDA19CH2C7YWSWGVR04DBA3RPAB2FWRV8D022Q2W4RMFKV8ZETWF1QZ74Q1YJFJW7SBGFAM40FRW881WFQGX1N0HT63FJHH5B9PSGQARXXSRHJDHKAM1QW1PA2M5DCGP0875HE1ZG90RPMVXC33BP7251SP3XJRX6RNFGVTFEXP2GDKP223NHCKQ09E0P4KT5C2TJZ0TAVRDKDJFERBVDQJWSQWNXHMHJK210N2ERZAAMAFSDBGEMAR07T2Y9YJY1DX9QKWXHSTG8AGVG",
+            
"RK6Q1F01FGNFY1EA6M3T9879HD8E84CP30G8PQQBED4VWF3AZMK0GFZR7A2Y2VGSSVJP4TCB6FVSV9E810NN2Z5SP72MYY9EHEGEQGRD9840R81A3HD3Y4BSJD94J20S18TNDFVDXRQMMJ8KJGWZRRWPCRHSYPFYDJT6MW4DAMMNQ1437BS1YP6AFR9RDW8AFRV0M1E54EAB8BY3S9W7E80RJZT19W4XFBC777X3VKFPP8HNVTFM4970V8GYRFZBAWQNPD25V72H40GK9CZK818XHJWZNC0Q86XCNFZ05GEW1A4AQ8921A7MTKSBKKNQ8ZRH9PRJ7TZTZ5AF9RHGY1EXKC0KG4PS74ACXCRQV316K64WEXP00FF8455Y1WB5J8V4894Q93T1A8W8TT8KRKA6RG",
+            
"9AWAWCGCEN0PPGJ5NRPYVF4H1R845DGX5H26JQ8TAAJBYQNGPMWQR227M3T7RQJHTEXSSQZR95X5PDKNFQ57X72JJ39Z0WQ738ZJY1ZTVWNKBNW6S3CM9WMVWSEZD84W8EXVPD0A3TC6ACM7BNBV96N33F2SD6BC8C9QGW7Z5RDR2KXDZHSD16C5ZEX6P3F9Z0K6DVVAX247CZZ8Y5VVQQANGJ99TN0G7ZYMJBH3WQAFPGN40FGXC56ZBB8WZ0Q9Q1T1AK2VJ45VTJTEG78GPA2PVSK636MPY3F1W496BCVMVD6H4GHG0RWJR707EPTE72C6JJV7VT8NXH0G6K6KF6THNTEMK7HDZYR1S896S36H9SV3XWQ55NXQCE7NQYFV2WRA2MJ02V6KQ5D78ZJ2PJ5WSR"
+        ),
+        TestVector(
+            
"7953QJ86Z03P607D6PZH39569VYQ9TVZ2NNT7CQJGA5P15JVBSRDC633YSSE5M4W6XWG1X4MBFEPYN7S1T9BECBGEGE1ZZK6789JQ48",
+            
"040000Y7X1S35KW1MTPR19MD8F59QVY42WV37WB8YFVA9Z7SQ1RFEPF4HF3NN1XSSW1XMJS8DYJK57RH8KKQC5EHR7DS7PKWCJT6RJRZGAX0GN60990HB3XKM34PSKW4ZTAZDGS1KSND3Y9TS50A5G7HDF4K27SC8FXNV2VGGW9YQ6CC0F9E3K6D3BD1S39VC1WTPCYP62BVT2B5H9E5G49TVPDYXRTPDSK7FSFYGMTTYBVVJXQVSC2QKS3ZBY2HF1Z29AEV2247KVP8PP8DAB9J6G6WEN1HCXCCSNP5WK8QPJQAA9QWW1G4Z0P7Z7BGHFJFPJHY1AHQ5GGSSDPHET2SMP6GXJK2SZ42AV4CR85YEPHKVRMAHN8ATSK89BWAFNZKWBZ0P31NPY4CW9456MEDDZT1SDZB04002",
+            "KRVDHJ0V57V8JFYRG1YRDB5Z5A5YM10QA4ZG2SH68XNJ2V71PF10",
+            
"B62RQP191DY7BZEEWVPDPE5S5CQMNFH3PBBY927F70W6JF5S8SJ3NGM6JV612SPJWRX8XM8PSW691R69QFGSQ4W54KT828TG6AHG1XS3T74HB4S4XA1SVB7WB8W7TR7ANKRHZ3EWKC52FKYRS05SYRYB9QDZ072D5S4WHNG3YATSF9AD9YA0S5482S5VY0C0JFET733CVAMR0Q9SC4BWBPDJSNH8WK3ZDFYM4DZJNFPHRKM253TW3QF1WCHDQVJAPBDT3J8PHEQGAKVJWJS3WAPRFW2RY87WF0ME2YY75H91ZCP0Z0KYYWF1GQC7T5BP6E1FWJH73P6QNFA8H9AX86EBGK7WMVMM0T9PDPAVHW0TJB7FSX5JN37R5EW3FCR9DGYE3NY40ESDYP4NMTEAW2YR04",
+            
"79DRCP9VWHYMG4B110MNKZTC5EJM2HG5DRY1WVTZHRV0T2P9YW48ZX3HRSSW3CSC9HH3J8AN3XD06KTYWY29HFV61VFRC2CST20H8RGJ6QNWMTSYB6636C52PENV318QM9C2FQXVTGS8RFX9A3AG4DCRW3SZPPWPAG3GHV8VC3AJMT5ZA39E0B8QDRXSMAN1CA9ZF7NVRKZ7ZBY91XDYGSYGZXA3YFF94EGF62HPJWX2QBN6A8M542EDS011VF9ESQ2H4WEPXTQPBEGF00MRSV0T44YXR3R9QHY607EJKJF7VFDXP0TAZDD5Q3YK2J5GFR1CH6Z2QQ6RN8T2X8GP0PDF722PBYNNCS70J9VRK6VW2W1M0MX8VF28NMVWQ17F45HC4YDZSK0S444T505VMW2BPG",
+            
"EQZKF4GGRF7M2RAS80XPP2KEXQT0SC55NEQ16X5MYJT0QDM8ERGVAGNT8F5NARG944VTMJYDD5WQ3QPFPMFB25SJ8VQ41MS3X3C7SQJP060JHDCK2297XKPQ1YN4PXQG55XZCT2GQHBX6Z1A10H24ZNPACRB0YPAE1RTVDGST0SQ5C8KS1R6SHC2NR6YGPS41ZZYMP48FBQ5KP0N5ANGKTBTMXM1G6CH8J9ARS7283WF54Q04XK9Y79HYW58RRFJSTQNTGHSCSV0KHS245VASSVG752F2XYVK96KH4715G7F4PHAWVW2F85XTZM15FPNDR3R34NX15GYVW2ZT2SXNNAVA095H60BY1G5J977XE5TPTZ4M7T9MJZJG179Z53EPDSMH0VRHKTVK0T44T5BXF1H6M"
+        ),
+        TestVector(
+            
"8H0BJPDY2PFSKW9VQE4HQ8W5E62M4YK3169DE7JFNRC28P9G76HDFZMS16CMTWDKRNC4JVHXAH1J03992XDW77N4EGBR937AA5VCJ1R",
+            
"040000X1ETZJWD59MT15XTV37NB28BM76G9G5KCHWRE9ZAR1XJW1RBPCTGNB9TE36FAXQV8FJ82J390PHZPMR45X3SRC9CRC2CK7WQSPXW79826SDX8CASC5J2Z92D8ZNN38SEVK3F0PE130TDQ28B9K45FEXF7GEF0Q2BJFCAJ8B6QVGD5NEDGKVCH6DVP2K8PAXCHMSBHMGH9MPACAHZX502VPEHZ6E1ESBNS1RX5XRJ1GAVH5VD2TTFYGRBD6VGSR8G8B9147Y1YB6FJKGTFNVCACC29NFEW98EDBVRRNXEX35DXTAV1HV5NFSA4EN7M7AE8XMT07TEF0KHGA9S0H8NHHE90E0TCAPSYKFTBAMR5YES6KXNNSJXN3SPS9BDC9FTS8K5W3FDGPWVDN6PNS4VN4DYEK04002",
+            "DKQYT4AT58TD2WY6AF7X8TG30ZF0V6WZ4BZ92Q68ZJQBKVJ3JDEG",
+            
"HKSKCY5F1PSPCHMDWS41B7RF1ACS4ZJ882Z73GTC8TT7P2M8QP68CAC8SWJ972FN3XHH4JYZDTW565062Q48ZTR9ZG68RHWAMZ689RFZ9Z4N4P8XMWHXNZCCQCNNZBRZNYHS33GMFXV1JJJD1VB8PJSFYFQCTGDDMFM54JJCQZYM0E93VJMDNWR02EQTWMAGSNKERJDFBQ2HEE07TS6T8AW613J0RQBFB0XD0EWMP10CCQP26RD2Q9HKVZ9EWYV7DQ3N8S1VBPZNTKB8PQBNJRTMGA3P2EVZT6ZD45V6KX4DG86T0EZGX4JWDS3BW47VZC1N0P6N72A4NKHT67DJEN0V8YPJNGRQG80DD92K4HPYK6JBX96YRJ65WKP3M1YQZ5WP325DF4FQS87R1AKYNKNR9R",
+            
"BD9TNRSSMEG2NTSN8E7G04VMXKNR4KZK6CJ31TX9QDWBC7T86FYJR3JSYWF1KPNDQSQWF896JV5TW4YY4Q32845KH39DXXTGXMFHBCDC32WEFR65YGPP45A2Q6SVM1WCNJF2RPSTQZR072YA4JR5NF8CQVGPNB459JMFJSGZ2ETBAYH1V65DJ20VBHRW8E8D6JBZQW6MD96C1D7RNHAYEDPGCRPS6RAR8HR0M08E2HXGSBD1PB2C6VYH2KQQBGDE6XRPX0NXD07E5PG46J7X5EMJ6RK8MVVR1XQVKSGWJ2T9RZTRT957295016DMW9G1814JENJ7BVG9954ND37GZ9H9DQXA9GY4QPB778Q2N66HGGSMEZYCHVTZX2FXC25PCCY2XNH3EXSA2742EXE5PJG0QC",
+            
"3WQ1XV9PZGKHSFJ1AQ47RZ3NE8M8ECQ1RA0ZNSG6WJJYVV9F2SENEDXWN5M3DZR3F5WEGAB6VVT5V7EBW42H5A48D29AKZQF6SX2ZEJNQE1DCRBTCC6EPJGBJFXRN8AK4PT8JDTP2VRAMRFN62P2VMHZS4Q5EH431E7DYCPPC5YC5CKJT26R22Q1GZMW972RQ5WEYDMC7YW7M5WQ22G2KACR3MYEJ1BYRPD981ZPFKEB4M8TJZ1N2H7NM3S52PMXZ5HDSEMA8Y2MWW3KG3YJF8P0K8ZWG409S60MWVA7VEC1P1PREKT27S8CCPDQRFR5W9S6R71FK1KARJRCW5GPZCESFQNZT3A6DT2MNTWHG7KBPYAEZG8ZDS5CBFVRK7BQ7ZHVQDB7TTT2M64RF52DX7BNW4"
+        ),
+        TestVector(
+            
"JZB0QJS6FC7K18RTF3T2T4XVHNR98BVGP811NE25T1333P7XQQKAKAMSCQMH25D0H0JM8ZW5QBX6H1SX6SZMY7VYAY2HEKRX9JPV86G",
+            
"040000XVGVWCHVQVTQ06Q5V0XRAVQKPPZQZ68GYVXSC5RAG37VDCG0CEQHS4876BX6DDABB2WFY7TRJ7MFKTMMDF7A7ZW9PKQ8S3RQ15TVTKWBFGGKBKYSP6CVHNG9AY738NCPC8AFWYGP8J2VJE9HRR7M1GQK19E2M7Q2Y54KCSZ583BTNX275DW6EYYE1KBV4FK009Z621EHF5R87S6VQDSBCKSK15JCH1JYC2VPRHHAEGRA2WYX1HD9KFET0C9G1CZJB1MHZ5Z7Y803YZJH441P3PJJTRB9WCTA03H6M43CJ9MB33BEJ3KR22R8CS0D6QC2E7ZQS5MGBWCF51FK97SHCJW93SAT7VHB3YX5VVDNTW9N3SDW56HNWT11D306H9VN7BTP84T404VF482Y09K4SHEF5704002",
+            "RF9NJTZVPAFGRZ062MQBV1136KZQDGVQANQTRD44Y6QTX3Q47BN0",
+            
"DVW867P5XYQAX2B4V9P1N0F6W24MB1E5F62XQS8FBXT3RQBKJYMXSY6P48SEBNMQC3WPXK4PR1QDEYT24B4TVGRN9E4RYWAAE1VNHTBME20HTK6YZBH9EX91WW3Q3XNCARN5M01YKPV3EKRJM4N7DCN47H75WK6QJRQHARC00GSE1640H5BJV9X1DBY73307JT36G08E46RZ48E6HNYPRDVW0KMGJDJN3YZ93ZBRX5B4S5YE89ZSW6VCRXH0X0H9ZM1G67ZXD12CXAWFV1M3Z8WYMY94Z351T3WBFTFPB11XWE1H1H7F8QTBJRZNGBGKHA4X0X8BW7QSB1FP9F1HQBPN2TPW9VN167GEX98MD8C1CSNE9G0GGY60MV74Y12JCTCKWGPMTWG95KZQY5VYVPATXW",
+            
"64DS6GCWVDHC1032251MY50QZ1XVVZHQTH318Z51B3A3PDASXNNWA1MX52GS9V82K53WDGHTSDAJKPTQPC1VDT6VFGFP6JAANJXVDXJAFB3D30ZMRQGEN459B876Q7C8072NA8T3JVMNBH12NHE03GT9RQPESCKR79GAYDVYKW56VJ6Y7R6A4VG9YGFWZWH6CQ4E5DE49FWYMQ815DQHKN0AR3FMK006VAN1PRTNS0SRX67H3BQKSQ3K0HKYJSM96PZZFP8H5WNCF4WFMQP5JDVWH0WZGFEMFJE4BPNXJ0GPPJ0AQA5V8YRT0QY7DK5AVFE7DK0W6VVYAPMNVQDP2ER4ZD56HZVP6AQWCCMHCMJF39FTY7JT2CY14TPYP75RJB9SACVVMP7XDXXBEEJDTBWQ38",
+            
"BCDNEWHSBMDGGEBN1GD85C7T7MCPG3AVB7V8EYSQQ6Q5JNWR95VXMBSQ1QQBAEZ9B0H9VPCZW3G1JDR68P56ZFDDZ4CVWEAK9AWMR5B2T2VF8PD7TP1ZG0YN02GJN3J20NJ5TV06FSZX6JF8MFWZRP646452VE1PY18KCH6CDEHA9YMJREFXV5HMV8KNCHFC0RFZ0CE0HQKF6PZ5VRWMY7ZD3ZC9SGNMWDRS4CB32W9WHX83ETD8ZMSPQENHKG833QY9EPZZFX520D6GKEBNRHBBJS0AGXWKM0DC6V2CE7Z4PR6PT8YT41JP2RQ8JJABSTTFWEE7TR17YE9GG0FSMHAXY7CC3ZEMJRZYKKYQ5SZNC2GHFS5XN1D18TQRASJSWRKSEJBSQ79QDA0GHFKG3D6XT8"
+        )
+    )
+
     @Test
     fun testBlinding() {
-        val messageHash =
-            
"TT1R28D79EJEJ9PC35AQS35CCG85DSXSZ508MV2HS2FN4ME6AHESZX5WP485R8A75KG53FN6F1YNW95008663TKAPWB81420VG17BY8"
-        val rsaPublicKey =
-            
"040000Y62RSDDKZXTE7GDVA302ZZR0DY224RSDT6WDWR1XGT8E3YG80XV6TMT3ZCNP8XC84W0N6MSZ0EF8S3YB1JJ2AXY9JQZW3MCA0CG38ER4YE2RY4Q2666DEZSNKT29V6CKZVCDHXSAKY8W6RPEKEQ5YSBYQK23MRK3CQTNNJXQFDKEMRHEC5Y6RDHAC5RJCV8JJ8BF18VPKZ2Q7BB14YN1HJ22H8EZGW0RDGG9YPEWA9183BHEQ651PP81J514TJ9K8DH23AJ50SZFNS429HQ390VRP5E4MQ7RK7ZJXXTSZAQSRTC0QF28P23PD37C17QFQB0BBC54MB8MDH7RW104STG6VN0J22P39JP4EXPVGK5D9AX5W869MDQ6SRD42ZYK5H20227Q8CCWSQ6C3132WP0F0H04002"
-        val bks = "7QD31RPJH0W306RJWBRG646Z2FTA1F89BKSXPDAG7YM0N5Z0B610"
-        val expectedBm =
-            
"GA8PC6YH9VF5MW6P2DKTV0W0ZTQ24DZ9EAN5QH3SQXRH7SCZHFMM21ZY05F0BS7MFW8TSEP4SEB280BYP5ACHNQWGE10PCXDDMK7ECXJDPHJ224JBCV4KYNWG6NBR3SC9HK8FXVFX55GFBJFNQHNZGEB8DB0KN9MSVYFDXN45KPMSNY03FVX0JZ0R3YG9XQ8XVGB5SYZCF0QSHWH61MT0Q10CZD2V114BT64D3GD86EJ5S9WBMYG51SDN5CSKEJ734YAJ4HCEWW0RDN8GXA9ZMA18SKVW8T3TTBCPJRF2Y77JGQ08GF35SYGA2HWFV1HGVS8RCTER6GB9SZHRG4T7919H9C1KFAP50G2KSV6X42D6KNJANNSGKQH649TJ00YJQXPHPNFBSS198RY2C243D4B4W"
-        val bm = crypto.rsaBlind(
-            Base32Crockford.decode(messageHash),
-            Base32Crockford.decode(bks),
-            Base32Crockford.decode(rsaPublicKey)
-        )
-        assertEquals(expectedBm, Base32Crockford.encode(bm))
+        for (v in vectors) {
+            val bm = crypto.rsaBlind(
+                Base32Crockford.decode(v.messageHash),
+                Base32Crockford.decode(v.bks),
+                Base32Crockford.decode(v.rsaPublicKey)
+            )
+            assertEquals(v.bm, Base32Crockford.encode(bm))
+            val sig = crypto.rsaUnblind(
+                Base32Crockford.decode(v.bs),
+                Base32Crockford.decode(v.rsaPublicKey),
+                Base32Crockford.decode(v.bks)
+            )
+            assertEquals(v.sig, Base32Crockford.encode(sig))
+            assertTrue(
+                crypto.rsaVerify(
+                    Base32Crockford.decode(v.messageHash),
+                    Base32Crockford.decode(v.sig),
+                    Base32Crockford.decode(v.rsaPublicKey)
+                )
+            )
+        }
     }
 
+    private class TestVector(
+        val messageHash: String,
+        val rsaPublicKey: String,
+        val bks: String,
+        val bm: String,
+        val bs: String,
+        val sig: String
+    )
+
 }
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt 
b/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
index d2a77cc..ba43c18 100644
--- a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
+++ b/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
@@ -13,10 +13,14 @@ internal interface Crypto {
     fun keyExchangeEcdheEddsa(ecdhePrivateKey: ByteArray, eddsaPublicKey: 
ByteArray): ByteArray
     fun kdf(outputLength: Int, ikm: ByteArray, salt: ByteArray, info: 
ByteArray): ByteArray
     fun rsaBlind(hm: ByteArray, bks: ByteArray, rsaPubEnc: ByteArray): 
ByteArray
+    fun rsaUnblind(sig: ByteArray, rsaPubEnc: ByteArray, bks: ByteArray): 
ByteArray
+    fun rsaVerify(hm: ByteArray, rsaSig: ByteArray, rsaPubEnc: ByteArray): 
Boolean
+    fun setupRefreshPlanchet(secretSeed: ByteArray, coinNumber: Int): FreshCoin
 }
 
 class EddsaKeyPair(val privateKey: ByteArray, val publicKey: ByteArray)
 class EcdheKeyPair(val privateKey: ByteArray, val publicKey: ByteArray)
+class FreshCoin(val coinPublicKey: ByteArray, coinPrivateKey: ByteArray, bks: 
ByteArray)
 
 internal expect object CryptoFactory {
     internal fun getCrypto(): Crypto
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt 
b/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
index ae333eb..a21c156 100644
--- a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
+++ b/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
@@ -6,4 +6,23 @@ abstract class CryptoImpl : Crypto {
         return Kdf.kdf(outputLength, ikm, salt, info, { sha256(it) }, { 
sha512(it) })
     }
 
+    override fun setupRefreshPlanchet(secretSeed: ByteArray, coinNumber: Int): 
FreshCoin {
+        val info = "taler-coin-derivation".encodeToByteArray()
+        val salt = coinNumber.toByteArray()
+        val out = kdf(64, secretSeed, salt, info)
+        val coinPriv = out.copyOfRange(0, 32)
+        val bks = out.copyOfRange(32, 64)
+        return FreshCoin(bks, coinPriv, eddsaGetPublic(coinPriv))
+    }
+
+    // TODO check if this is the correct coinNumber to ByteArray conversion
+    private fun Int.toByteArray(): ByteArray {
+        val bytes = ByteArray(4)
+        bytes[3] = (this and 0xFFFF).toByte()
+        bytes[2] = ((this ushr 8) and 0xFFFF).toByte()
+        bytes[1] = ((this ushr 16) and 0xFFFF).toByte()
+        bytes[0] = ((this ushr 24) and 0xFFFF).toByte()
+        return bytes
+    }
+
 }
diff --git a/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
index db502df..2602244 100644
--- a/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
+++ b/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
@@ -65,6 +65,14 @@ internal object CryptoJsImpl : CryptoImpl() {
         TODO("Not yet implemented")
     }
 
+    override fun rsaUnblind(sig: ByteArray, rsaPubEnc: ByteArray, bks: 
ByteArray): ByteArray {
+        TODO("Not yet implemented")
+    }
+
+    override fun rsaVerify(hm: ByteArray, rsaSig: ByteArray, rsaPubEnc: 
ByteArray): Boolean {
+        TODO("Not yet implemented")
+    }
+
     private fun Uint8Array.toByteArray(): ByteArray {
         val result = ByteArray(this.length)
         for (i in 0 until this.length) result[i] = this[i]
diff --git 
a/src/linuxMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/src/linuxMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
index 152e55f..40a11ce 100644
--- a/src/linuxMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
+++ b/src/linuxMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
@@ -103,6 +103,14 @@ internal object CryptoNativeImpl : CryptoImpl() {
         TODO("Not yet implemented")
     }
 
+    override fun rsaUnblind(sig: ByteArray, rsaPubEnc: ByteArray, bks: 
ByteArray): ByteArray {
+        TODO("Not yet implemented")
+    }
+
+    override fun rsaVerify(hm: ByteArray, rsaSig: ByteArray, rsaPubEnc: 
ByteArray): Boolean {
+        TODO("Not yet implemented")
+    }
+
     private fun ByteArray.toCValuesRef(): CValuesRef<UByteVar> {
         @Suppress("UNCHECKED_CAST")
         return this.refTo(0) as CValuesRef<UByteVar>

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]