Skip to content

Commit

Permalink
Enable linting and fix formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
code28 committed Jun 28, 2024
1 parent 8acca09 commit 8385c87
Show file tree
Hide file tree
Showing 13 changed files with 84 additions and 70 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ tasks.withType<Test> {

spotless {
kotlin {
// ktlint()
ktlint()
}
kotlinGradle {
ktlint()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ import org.springframework.boot.runApplication
class WalletServerApplication

fun main(args: Array<String>) {
runApplication<WalletServerApplication>(*args)
runApplication<WalletServerApplication>(*args)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,19 @@ package software.tice.wallet.attestation.controllers

import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import software.tice.wallet.attestation.requests.ValidationRequest

@RestController
@RequestMapping("attestation")
class IssuerApi {

@PostMapping("/validation")
fun validateAttestation(@RequestBody request: ValidationRequest): ResponseEntity<Void> {
fun validateAttestation(
@RequestBody request: ValidationRequest,
): ResponseEntity<Void> {
return ResponseEntity.status(HttpStatus.OK).body(null)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package software.tice.wallet.attestation.controllers

import org.springframework.web.bind.annotation.*
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import software.tice.wallet.attestation.requests.AttestationRequest
import software.tice.wallet.attestation.requests.NonceRequest
import software.tice.wallet.attestation.responses.AttestationResponse
Expand All @@ -9,19 +13,19 @@ import software.tice.wallet.attestation.services.WalletApiService

@RestController
@RequestMapping("attestation")

class WalletApi(val walletApiService: WalletApiService) {

@PostMapping("/nonces")
fun requestNonces(@RequestBody request: NonceRequest): NonceResponse {
fun requestNonces(
@RequestBody request: NonceRequest,
): NonceResponse {
return walletApiService.requestNonces(request.walletInstanceId)
}

@PostMapping("/request/{id}")
fun requestAttestation(
@RequestBody request: AttestationRequest,
@PathVariable id: String
@PathVariable id: String,
): AttestationResponse {
return walletApiService.requestAttestation(request, id)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package software.tice.wallet.attestation.repositories

import jakarta.persistence.*

import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id

@Entity(name = "users")
data class UserEntity(
Expand All @@ -10,5 +12,5 @@ data class UserEntity(
var id: Long?,
var walletInstanceId: String,
var popNonce: String?,
var keyAttestationNonce: String?
)
var keyAttestationNonce: String?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,5 @@ package software.tice.wallet.attestation.repositories
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository


@Repository
interface UserRepository : JpaRepository<UserEntity, Long>

Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ data class AttestationRequest(
val attestationPublicKey: String,
val proofOfPossession: String,
val keyAttestation: String,
val appAttestation: String
)
val appAttestation: String,
)
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package software.tice.wallet.attestation.requests

data class NonceRequest(val walletInstanceId: String)
data class NonceRequest(val walletInstanceId: String)
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package software.tice.wallet.attestation.requests

data class ValidationRequest(val walletAttestation: String)
data class ValidationRequest(val walletAttestation: String)
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package software.tice.wallet.attestation.responses

data class AttestationResponse(val walletAttestation: String)
data class AttestationResponse(val walletAttestation: String)
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package software.tice.wallet.attestation.responses

data class NonceResponse(
val popNonce: String,
val keyAttestationNonce: String
)
val keyAttestationNonce: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -11,42 +11,49 @@ import software.tice.wallet.attestation.responses.AttestationResponse
import software.tice.wallet.attestation.responses.NonceResponse
import java.security.KeyFactory
import java.security.spec.PKCS8EncodedKeySpec
import java.util.*
import java.util.Base64
import java.util.UUID

@Service
class WalletApiService @Autowired constructor(
@Value("\${private.key}")
private val privateKey: String,
private val userRepository: UserRepository,

) {
fun requestNonces(walletInstanceId: String): NonceResponse {
val (popNonce, keyAttestationNonce) = List(2) { UUID.randomUUID().toString() }

val user = UserEntity(
walletInstanceId = walletInstanceId,
popNonce = popNonce,
keyAttestationNonce = keyAttestationNonce,
id = null
)

userRepository.save(user)
return NonceResponse(popNonce = popNonce, keyAttestationNonce = keyAttestationNonce )
class WalletApiService
@Autowired
constructor(
@Value("\${private.key}")
private val privateKey: String,
private val userRepository: UserRepository,
) {
fun requestNonces(walletInstanceId: String): NonceResponse {
val (popNonce, keyAttestationNonce) = List(2) { UUID.randomUUID().toString() }

val user =
UserEntity(
walletInstanceId = walletInstanceId,
popNonce = popNonce,
keyAttestationNonce = keyAttestationNonce,
id = null,
)

userRepository.save(user)
return NonceResponse(popNonce = popNonce, keyAttestationNonce = keyAttestationNonce)
}

fun requestAttestation(
requestAttestation: AttestationRequest,
id: String,
): AttestationResponse {
val privateKey = privateKey
val pem =
privateKey
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")

val decodedKey = Base64.getDecoder().decode(pem)

val keySpec = PKCS8EncodedKeySpec(decodedKey)
val keyFactory = KeyFactory.getInstance("EC")
val privateKeyReloaded = keyFactory.generatePrivate(keySpec)

val walletAttestation: String = Jwts.builder().subject("Joe").signWith(privateKeyReloaded).compact()
return AttestationResponse(walletAttestation)
}
}

fun requestAttestation(requestAttestation: AttestationRequest, id: String): AttestationResponse {
val privateKey = privateKey
val pem = privateKey
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")

val decodedKey = Base64.getDecoder().decode(pem)

val keySpec = PKCS8EncodedKeySpec(decodedKey)
val keyFactory = KeyFactory.getInstance("EC")
val privateKeyReloaded = keyFactory.generatePrivate(keySpec)

val walletAttestation: String = Jwts.builder().subject("Joe").signWith(privateKeyReloaded).compact()
return AttestationResponse(walletAttestation)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import io.jsonwebtoken.Jwts
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.*
import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Mockito.verify
import org.mockito.junit.jupiter.MockitoExtension
import org.springframework.boot.test.context.SpringBootTest
Expand All @@ -14,14 +15,13 @@ import software.tice.wallet.attestation.repositories.UserEntity
import software.tice.wallet.attestation.repositories.UserRepository
import software.tice.wallet.attestation.requests.AttestationRequest
import java.security.KeyPair
import java.util.*
import java.util.Base64
import kotlin.test.assertEquals

@SpringBootTest
@ExtendWith(MockitoExtension::class)
@ContextConfiguration(classes = [UserRepository::class])
class WalletApiServiceTests {

@MockBean
private lateinit var userRepository: UserRepository

Expand All @@ -32,7 +32,6 @@ class WalletApiServiceTests {

private val keyPair: KeyPair = Jwts.SIG.ES256.keyPair().build()


@BeforeEach
fun setup() {
val privateKey = Base64.getEncoder().encodeToString(keyPair.private.encoded)
Expand All @@ -52,17 +51,17 @@ class WalletApiServiceTests {
assertEquals(response.keyAttestationNonce, savedUser.keyAttestationNonce)
}


@Test
fun `should return correct wallet attestation`() {
val request = AttestationRequest("PUBLIC_KEY","POP","KEY_ATTESTATION", "APP_ATTESTATION")
val request = AttestationRequest("PUBLIC_KEY", "POP", "KEY_ATTESTATION", "APP_ATTESTATION")
val walletInstanceId = "f74813c9-3435-4028-8e0c-018dd34d3b60"

val response = walletApiService.requestAttestation(request, walletInstanceId)

val parser = Jwts.parser()
.verifyWith(keyPair.public)
.build()
val parser =
Jwts.parser()
.verifyWith(keyPair.public)
.build()
assertEquals(parser.parseSignedClaims(response.walletAttestation).payload.subject, "Joe")
}
}

0 comments on commit 8385c87

Please sign in to comment.