diff --git a/MiniKms/src/main/java/ftn/security/minikms/controller/KeyManagementController.java b/MiniKms/src/main/java/ftn/security/minikms/controller/KeyManagementController.java new file mode 100644 index 0000000..e5f1f2d --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/controller/KeyManagementController.java @@ -0,0 +1,35 @@ +package ftn.security.minikms.controller; + +import ftn.security.minikms.dto.KeyDTO; +import ftn.security.minikms.service.KeyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.security.NoSuchAlgorithmException; + +@RestController +@RequestMapping(value = "/api/v1/keys") +public class KeyManagementController { + @Autowired + private KeyService keyService; + + @PostMapping("/create") + public ResponseEntity createKey(@RequestBody KeyDTO dto) throws NoSuchAlgorithmException { + String id = keyService.createKey(dto.getKeyType()); + dto.setId(id); + return new ResponseEntity<>(dto, HttpStatus.CREATED); + } + @PostMapping("/rotate") + public ResponseEntity rotateKey(@RequestBody KeyDTO dto){ + keyService.rotateKey(dto.getKeyType(), dto.getId()); + return new ResponseEntity<>(dto, HttpStatus.CREATED); + } + @PutMapping("/delete/{id}") + public ResponseEntity deleteKey(@PathVariable String id){ + keyService.deleteKey(id); + return new ResponseEntity<>(id, HttpStatus.OK); + } + +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/dto/KeyDTO.java b/MiniKms/src/main/java/ftn/security/minikms/dto/KeyDTO.java new file mode 100644 index 0000000..3624f34 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/dto/KeyDTO.java @@ -0,0 +1,16 @@ +package ftn.security.minikms.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class KeyDTO { + private String id; + private String alias; + private String keyType; +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/service/AES.java b/MiniKms/src/main/java/ftn/security/minikms/service/AES.java new file mode 100644 index 0000000..f36c1a1 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/service/AES.java @@ -0,0 +1,21 @@ +package ftn.security.minikms.service; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.NoSuchAlgorithmException; + +public class AES { + public static String createKey() throws NoSuchAlgorithmException { + SecretKey key = generateKey(); + //save key + return "keyId"; + } + private static SecretKey generateKey() throws NoSuchAlgorithmException { + KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); + keyGenerator.init(256); + return keyGenerator.generateKey(); + } + public static void rotateKey(String Id){ + //rotate + } +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/service/HMAC.java b/MiniKms/src/main/java/ftn/security/minikms/service/HMAC.java new file mode 100644 index 0000000..16bd809 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/service/HMAC.java @@ -0,0 +1,22 @@ +package ftn.security.minikms.service; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class HMAC { + public static String createKey() throws NoSuchAlgorithmException { + SecretKey key = generateKey(); + //save key + return "keyId"; + } + private static SecretKey generateKey() throws NoSuchAlgorithmException { + KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA512"); + keyGenerator.init(256, SecureRandom.getInstanceStrong()); + return keyGenerator.generateKey(); + } + public static void rotateKey(String Id){ + //rotate + } +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/service/KeyService.java b/MiniKms/src/main/java/ftn/security/minikms/service/KeyService.java new file mode 100644 index 0000000..8415f34 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/service/KeyService.java @@ -0,0 +1,29 @@ +package ftn.security.minikms.service; + +import org.springframework.stereotype.Service; + +import java.security.InvalidParameterException; +import java.security.NoSuchAlgorithmException; + +@Service +public class KeyService { + public String createKey(String keyType) throws NoSuchAlgorithmException, InvalidParameterException { + return switch (keyType) { + case "symmetric" -> AES.createKey(); + case "asymmetric" -> RSA.createKey(); + case "hmac" -> HMAC.createKey(); + default -> throw new InvalidParameterException(); + }; + } + public void deleteKey(String Id){ + //delete from database + } + public void rotateKey(String keyType, String keyId) throws InvalidParameterException { + switch(keyType){ + case "symmetric" -> AES.rotateKey(keyId); + case "asymmetric" -> RSA.rotateKey(keyId); + case "hmac" -> HMAC.rotateKey(keyId); + default -> throw new InvalidParameterException(); + } + } +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/service/RSA.java b/MiniKms/src/main/java/ftn/security/minikms/service/RSA.java new file mode 100644 index 0000000..ab8fe75 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/service/RSA.java @@ -0,0 +1,21 @@ +package ftn.security.minikms.service; + +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; + +public class RSA { + public static String createKey() throws NoSuchAlgorithmException { + KeyPair key = generateKey(); + //save key + return "keyId"; + } + private static KeyPair generateKey() throws NoSuchAlgorithmException { + KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); + generator.initialize(2048); + return generator.generateKeyPair(); + } + public static void rotateKey(String Id){ + //rotate + } +}