gnunet-svn
[Top][All Lists]
Advanced

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

[taler-wallet-kotlin] 01/02: Implement RSA unblinding and blind signatur


From: gnunet
Subject: [taler-wallet-kotlin] 01/02: Implement RSA unblinding and blind signature verification (JVM only)
Date: Mon, 08 Jun 2020 14:54:03 +0200

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

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

commit 01b745f6e2c077291641286407e5cfcf85e8a72e
Author: Torsten Grote <t@grobox.de>
AuthorDate: Mon Jun 8 09:19:45 2020 -0300

    Implement RSA unblinding and blind signature verification (JVM only)
---
 .../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       |  2 +
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |  8 ++
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |  8 ++
 6 files changed, 125 insertions(+), 13 deletions(-)

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..a55c91d 100644
--- a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
+++ b/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
@@ -13,6 +13,8 @@ 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
 }
 
 class EddsaKeyPair(val privateKey: ByteArray, val publicKey: ByteArray)
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]