Skip to content

Commit 4fb4dad

Browse files
NFC-83 Use hashFunction from sign request when building sign result
1 parent 8490233 commit 4fb4dad

7 files changed

Lines changed: 35 additions & 56 deletions

File tree

app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModelTest.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -445,18 +445,20 @@ class WebEidViewModelTest {
445445
val signingCert = "mock-sign-cert"
446446
val signature = byteArrayOf(1, 2, 3)
447447
val responseUri = "https://example.com/response"
448+
val hashFunction = "SHA-384"
448449

449-
whenever(signService.buildSignPayload(signingCert, signature))
450+
whenever(signService.buildSignPayload(signingCert, signature, hashFunction))
450451
.thenReturn(JSONObject().put("signature", "mock-signature"))
451452

452453
val deferred =
453454
async {
454455
viewModel.relyingPartyResponseEvents.first()
455456
}
456457

458+
viewModel.handleSign(Uri.parse(createSignUri(signingCertBase64)))
457459
viewModel.handleWebEidSignResult(signingCert, signature, responseUri)
458460

459-
verify(signService).buildSignPayload(signingCert, signature)
461+
verify(signService).buildSignPayload(signingCert, signature, hashFunction)
460462
val emittedUri = deferred.await()
461463
assert(emittedUri.toString().startsWith("https://example.com/response#"))
462464
assert(emittedUri.fragment != null)
@@ -474,18 +476,19 @@ class WebEidViewModelTest {
474476
val signingCert = "mock-sign-cert"
475477
val signature = byteArrayOf(1, 2, 3)
476478
val responseUri = "https://example.com/response"
479+
val hashFunction = "SHA-384"
477480

478-
whenever(signService.buildSignPayload(signingCert, signature))
481+
whenever(signService.buildSignPayload(signingCert, signature, hashFunction))
479482
.thenThrow(RuntimeException("Test exception"))
480483

481484
val deferred =
482485
async {
483486
viewModel.relyingPartyResponseEvents.first()
484487
}
485-
488+
viewModel.handleSign(Uri.parse(createSignUri(signingCertBase64)))
486489
viewModel.handleWebEidSignResult(signingCert, signature, responseUri)
487490

488-
verify(signService).buildSignPayload(signingCert, signature)
491+
verify(signService).buildSignPayload(signingCert, signature, hashFunction)
489492
val emittedUri = deferred.await()
490493
assert(emittedUri.toString().startsWith("https://example.com/response#"))
491494
assert(emittedUri.fragment != null)
@@ -509,7 +512,7 @@ class WebEidViewModelTest {
509512
}
510513
sb.append("}")
511514
val encoded = Base64.getEncoder().encodeToString(sb.toString().toByteArray())
512-
return "web-eid://sign#$encoded"
515+
return "web-eid-mobile://sign#$encoded"
513516
}
514517

515518
private fun validSha384Base64(): String {

app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModel.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,16 @@ class WebEidViewModel
165165
responseUri: String,
166166
) {
167167
try {
168-
val payload = signService.buildSignPayload(signingCert, signature)
168+
val hashFunction =
169+
signRequest.value?.hashFunction
170+
?: throw IllegalStateException("Missing signRequest")
171+
172+
val payload =
173+
signService.buildSignPayload(
174+
signingCert,
175+
signature,
176+
hashFunction,
177+
)
169178
val response = WebEidResponseUtil.createResponseUri(responseUri, payload)
170179
_relyingPartyResponseEvents.emit(response)
171180
} catch (e: Exception) {

web-eid-lib/src/androidTest/java/ee/ria/DigiDoc/webEid/WebEidSignServiceTest.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ class WebEidSignServiceTest {
8686
@Test
8787
fun buildSignPayload_withValidInputs_returnsExpectedJson() {
8888
val signatureBytes = byteArrayOf(11, 22, 33, 44, 55)
89-
val result = service.buildSignPayload(signingCertBase64, signatureBytes)
89+
val hashFunction = "SHA-384"
90+
val result = service.buildSignPayload(signingCertBase64, signatureBytes, hashFunction)
9091

9192
assertEquals(
9293
setOf("signature", "signatureAlgorithm"),
@@ -107,8 +108,9 @@ class WebEidSignServiceTest {
107108
fun buildSignPayload_differentSignatures_produceDifferentJson() {
108109
val sig1 = byteArrayOf(1, 2, 3)
109110
val sig2 = byteArrayOf(4, 5, 6)
110-
val result1 = service.buildSignPayload(signingCertBase64, sig1)
111-
val result2 = service.buildSignPayload(signingCertBase64, sig2)
111+
val hashFunction = "SHA-384"
112+
val result1 = service.buildSignPayload(signingCertBase64, sig1, hashFunction)
113+
val result2 = service.buildSignPayload(signingCertBase64, sig2, hashFunction)
112114

113115
assertNotEquals(
114116
result1.getString("signature"),

web-eid-lib/src/androidTest/java/ee/ria/DigiDoc/webEid/utils/WebEidAlgorithmUtilTest.kt

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -115,40 +115,22 @@ class WebEidAlgorithmUtilTest {
115115
}
116116

117117
@Test
118-
fun buildSignatureAlgorithm_ec256_returnsCorrectAlgorithmObject() {
118+
fun buildSignatureAlgorithm_sha256_returnsCorrectAlgorithmObject() {
119119
val result =
120-
WebEidAlgorithmUtil.buildSignatureAlgorithm(ecPublicKey256)
120+
WebEidAlgorithmUtil.buildSignatureAlgorithm("SHA-256")
121121

122122
assertEquals("ECC", result.getString("cryptoAlgorithm"))
123123
assertEquals("SHA-256", result.getString("hashFunction"))
124124
assertEquals("NONE", result.getString("paddingScheme"))
125125
}
126126

127127
@Test
128-
fun buildSignatureAlgorithm_ec384_returnsCorrectAlgorithmObject() {
128+
fun buildSignatureAlgorithm_sha384_returnsCorrectAlgorithmObject() {
129129
val result =
130-
WebEidAlgorithmUtil.buildSignatureAlgorithm(ecPublicKey384)
130+
WebEidAlgorithmUtil.buildSignatureAlgorithm("SHA-384")
131131

132132
assertEquals("ECC", result.getString("cryptoAlgorithm"))
133133
assertEquals("SHA-384", result.getString("hashFunction"))
134134
assertEquals("NONE", result.getString("paddingScheme"))
135135
}
136-
137-
@Test
138-
fun buildSignatureAlgorithm_unsupportedKeyType_throwsException() {
139-
val rsaKey =
140-
KeyPairGenerator
141-
.getInstance("RSA")
142-
.apply {
143-
initialize(2048)
144-
}.generateKeyPair()
145-
.public
146-
147-
val exception =
148-
assertThrows(IllegalArgumentException::class.java) {
149-
WebEidAlgorithmUtil.buildSignatureAlgorithm(rsaKey)
150-
}
151-
152-
assertTrue(exception.message!!.contains("Unsupported key type"))
153-
}
154136
}

web-eid-lib/src/main/java/ee/ria/DigiDoc/webEid/WebEidSignService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ interface WebEidSignService {
2929
fun buildSignPayload(
3030
signingCert: String,
3131
signature: ByteArray,
32+
hashFunction: String,
3233
): JSONObject
3334
}

web-eid-lib/src/main/java/ee/ria/DigiDoc/webEid/WebEidSignServiceImpl.kt

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,10 @@ class WebEidSignServiceImpl
5151
override fun buildSignPayload(
5252
signingCert: String,
5353
signature: ByteArray,
54-
): JSONObject {
55-
val certBytes = Base64.getDecoder().decode(signingCert)
56-
val cert =
57-
CertificateFactory
58-
.getInstance("X.509")
59-
.generateCertificate(certBytes.inputStream()) as X509Certificate
60-
61-
val publicKey = cert.publicKey
62-
val signatureAlgorithm = buildSignatureAlgorithm(publicKey)
63-
64-
return JSONObject().apply {
54+
hashFunction: String,
55+
): JSONObject =
56+
JSONObject().apply {
6557
put("signature", Base64.getEncoder().encodeToString(signature))
66-
put("signatureAlgorithm", signatureAlgorithm)
58+
put("signatureAlgorithm", buildSignatureAlgorithm(hashFunction))
6759
}
68-
}
6960
}

web-eid-lib/src/main/java/ee/ria/DigiDoc/webEid/utils/WebEidAlgorithmUtil.kt

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,12 @@ object WebEidAlgorithmUtil {
6666
else -> throw IllegalArgumentException("Unsupported EC key length")
6767
}
6868

69-
fun buildSignatureAlgorithm(publicKey: PublicKey): JSONObject {
70-
val hashFunction =
71-
when (getEcKeySize(publicKey)) {
72-
256 -> "SHA-256"
73-
384 -> "SHA-384"
74-
521 -> "SHA-512"
75-
else -> throw IllegalArgumentException("Unsupported EC key length")
76-
}
77-
78-
return JSONObject().apply {
69+
fun buildSignatureAlgorithm(hashFunction: String): JSONObject =
70+
JSONObject().apply {
7971
put("cryptoAlgorithm", "ECC")
8072
put("hashFunction", hashFunction)
8173
put("paddingScheme", "NONE")
8274
}
83-
}
8475

8576
private fun getEcKeySize(publicKey: PublicKey): Int =
8677
when (publicKey) {

0 commit comments

Comments
 (0)