diff --git a/MiniKms/logs/controller.log b/MiniKms/logs/controller.log deleted file mode 100644 index 8075324..0000000 --- a/MiniKms/logs/controller.log +++ /dev/null @@ -1,208 +0,0 @@ -2025-09-30 22:02:56 [http-nio-8080-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [f3738aa7-dd26-4730-ae55-a03e82dc5cf9] REQUEST POST /api/v1/test/add | Body={ - "name":"testname" -} -2025-09-30 22:02:56 [http-nio-8080-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [f3738aa7-dd26-4730-ae55-a03e82dc5cf9] RESPONSE POST /api/v1/test/add | Status=200 | Duration=196ms | Body={"id":1,"name":"testname"} -2025-09-30 22:04:21 [http-nio-8080-exec-5] INFO f.s.m.l.RequestResponseLoggingFilter - [1ae5c07a-e782-49cd-beee-beb87e96a6a2] REQUEST POST /api/v1/test/add | Body={ - "name":"testname" -} -2025-09-30 22:04:21 [http-nio-8080-exec-5] INFO f.s.m.l.RequestResponseLoggingFilter - [1ae5c07a-e782-49cd-beee-beb87e96a6a2] RESPONSE POST /api/v1/test/add | Status=200 | Duration=177ms | Body={"id":1,"name":"testname"} -2025-09-30 22:06:18 [http-nio-8080-exec-2] INFO f.s.m.l.RequestResponseLoggingFilter - [f90fb9c0-869b-4001-9054-5f3d7788c051] REQUEST POST /api/v1/test/add | Body={ - "name":"testname" -} -2025-09-30 22:06:18 [http-nio-8080-exec-2] INFO f.s.m.l.RequestResponseLoggingFilter - [f90fb9c0-869b-4001-9054-5f3d7788c051] RESPONSE POST /api/v1/test/add | Status=200 | Duration=191ms | Body={"id":1,"name":"testname"} -2025-09-30 22:08:15 [http-nio-8080-exec-1] INFO f.s.m.l.RequestResponseLoggingFilter - [717eb391-cb49-4bce-8232-7f3f6af1da74] REQUEST POST /api/v1/test/add | Body={ - "name":"testname" -} -2025-09-30 22:08:15 [http-nio-8080-exec-1] INFO f.s.m.l.RequestResponseLoggingFilter - [717eb391-cb49-4bce-8232-7f3f6af1da74] RESPONSE POST /api/v1/test/add | Status=200 | Duration=183ms | Body={"id":1,"name":"testname"} -2025-10-01 09:10:05 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [9ddbfebf-0170-4483-a22c-7cf2851c74fe] REQUEST POST /api/v1/test/add | Body={ - "name":"testname" -} -2025-10-01 09:10:05 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [9ddbfebf-0170-4483-a22c-7cf2851c74fe] RESPONSE POST /api/v1/test/add | Status=200 | Duration=388ms | Body={"id":1,"name":"testname"} -2025-10-01 09:10:10 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [a5ea9e10-5849-4b51-8f00-314520b739d8] REQUEST GET /api/v1/test/1 | Body= -2025-10-01 09:10:10 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [a5ea9e10-5849-4b51-8f00-314520b739d8] RESPONSE GET /api/v1/test/1 | Status=200 | Duration=79ms | Body={"id":1,"name":"testname"} -2025-10-01 17:50:12 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [16add79c-335f-4502-bae4-2aa6efe9b0f2] REQUEST POST /api/v1/auth | Body={"username":"manager","password":"manager"} -2025-10-01 17:50:12 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [16add79c-335f-4502-bae4-2aa6efe9b0f2] RESPONSE POST /api/v1/auth | Status=200 | Duration=1131ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzMzgxMiwiZXhwIjoxNzU5MzM3NDEyfQ.YpxoA1qSKsjSFhtCHa8gUUlYoRyotNYYW_yXRUCrncY"} -2025-10-01 17:50:32 [https-jsse-nio-8443-exec-2] INFO f.s.m.l.RequestResponseLoggingFilter - [a3d34076-de9b-43d6-b917-568ea70bcedc] REQUEST POST /api/v1/auth | Body={"username":"user","password":"user"} -2025-10-01 17:50:32 [https-jsse-nio-8443-exec-2] INFO f.s.m.l.RequestResponseLoggingFilter - [a3d34076-de9b-43d6-b917-568ea70bcedc] RESPONSE POST /api/v1/auth | Status=200 | Duration=460ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwidXNlcklkIjoyLCJyb2xlIjoiVVNFUiIsImlhdCI6MTc1OTMzMzgzMiwiZXhwIjoxNzU5MzM3NDMyfQ.zdMDUWItw49GLvtPG6fJcVUnsjqwH00kpcWETmttTYs"} -2025-10-01 17:50:37 [https-jsse-nio-8443-exec-5] INFO f.s.m.l.RequestResponseLoggingFilter - [3b634127-ff0d-46d4-8401-2543ffd13c04] REQUEST POST /api/v1/auth | Body={"username":"user","password":"user"} -2025-10-01 17:50:37 [https-jsse-nio-8443-exec-5] INFO f.s.m.l.RequestResponseLoggingFilter - [3b634127-ff0d-46d4-8401-2543ffd13c04] RESPONSE POST /api/v1/auth | Status=200 | Duration=454ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwidXNlcklkIjoyLCJyb2xlIjoiVVNFUiIsImlhdCI6MTc1OTMzMzgzNywiZXhwIjoxNzU5MzM3NDM3fQ.CG2G6Wl__BTQ6Hproij4NT3El884Rmxc-T12yx3vTLM"} -2025-10-01 18:34:06 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [3ff10568-bd2a-46c9-8314-3c35811855c0] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:34:06 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [3ff10568-bd2a-46c9-8314-3c35811855c0] RESPONSE POST /api/v1/auth | Status=200 | Duration=1329ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNjQ0NiwiZXhwIjoxNzU5MzQwMDQ2fQ.eZCaYzE8oRp6utcGRlDdUQaMLISfw6YquXIjSx6xHZ8"} -2025-10-01 18:34:20 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [c98a1a98-bc73-46ab-b73a-060cf1ed1720] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:34:20 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [c98a1a98-bc73-46ab-b73a-060cf1ed1720] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=1835ms | Body={"id":"7479700a-8aac-4be1-9062-e0e3bf929b65","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:34:18.517835700Z","rotatedAt":null} -2025-10-01 18:35:18 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [5fd85c08-8781-4ed5-a282-d2eec05c899d] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "7479700a-8aac-4be1-9062-e0e3bf929b65" -} -2025-10-01 18:35:18 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [5fd85c08-8781-4ed5-a282-d2eec05c899d] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=20085ms | Body={"id":"7479700a-8aac-4be1-9062-e0e3bf929b65","alias":"My new example key","primaryVersion":2,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:34:18.517836Z","rotatedAt":"2025-10-01T16:35:18.445002Z"} -2025-10-01 18:35:30 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [6af00888-e9bb-4f1c-9225-ead14f12037e] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "7479700a-8aac-4be1-9062-e0e3bf929b65" -} -2025-10-01 18:35:30 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [6af00888-e9bb-4f1c-9225-ead14f12037e] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=5529ms | Body={"id":"7479700a-8aac-4be1-9062-e0e3bf929b65","alias":"My new example key","primaryVersion":3,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:34:18.517836Z","rotatedAt":"2025-10-01T16:35:30.142766700Z"} -2025-10-01 18:35:42 [https-jsse-nio-8443-exec-1] INFO f.s.m.l.RequestResponseLoggingFilter - [38e588ab-bdb2-448f-bc0b-7ac16078a2b7] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "7479700a-8aac-4be1-9062-e0e3bf929b65" -} -2025-10-01 18:35:42 [https-jsse-nio-8443-exec-1] INFO f.s.m.l.RequestResponseLoggingFilter - [38e588ab-bdb2-448f-bc0b-7ac16078a2b7] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=2496ms | Body={"id":"7479700a-8aac-4be1-9062-e0e3bf929b65","alias":"My new example key","primaryVersion":4,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:34:18.517836Z","rotatedAt":"2025-10-01T16:35:42.139067200Z"} -2025-10-01 18:37:21 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [24a30412-9001-4270-8bbb-18ebbfad3305] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "7479700a-8aac-4be1-9062-e0e3bf929b65" -} -2025-10-01 18:37:21 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [24a30412-9001-4270-8bbb-18ebbfad3305] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=400 | Duration=27ms | Body=Key with given id and version does not exist -2025-10-01 18:37:34 [https-jsse-nio-8443-exec-4] INFO f.s.m.l.RequestResponseLoggingFilter - [7a890838-c39f-4818-bc11-f28e2fe17485] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "7479700a-8aac-4be1-9062-e0e3bf929b65" -} -2025-10-01 18:37:34 [https-jsse-nio-8443-exec-4] INFO f.s.m.l.RequestResponseLoggingFilter - [7a890838-c39f-4818-bc11-f28e2fe17485] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=400 | Duration=10ms | Body=Key with given id and version does not exist -2025-10-01 18:40:07 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [27432aff-e9d5-4d13-82be-5fba15828911] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:40:07 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [27432aff-e9d5-4d13-82be-5fba15828911] RESPONSE POST /api/v1/auth | Status=200 | Duration=1315ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNjgwNywiZXhwIjoxNzU5MzQwNDA3fQ.tMBSKBAiJs3YfsAx0scvncw_8vsDpJ3veDEnTklzhNY"} -2025-10-01 18:40:25 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [c3684eac-71dd-44aa-bff0-0a7c4c262c39] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:40:25 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [c3684eac-71dd-44aa-bff0-0a7c4c262c39] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=4506ms | Body={"id":"3ef0f6fe-3321-4281-ac92-7f494ca63851","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:40:20.905752200Z","rotatedAt":null} -2025-10-01 18:40:41 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [5703c94b-a853-4785-983e-d3d8551a71ab] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "3ef0f6fe-3321-4281-ac92-7f494ca63851" -} -2025-10-01 18:40:41 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [5703c94b-a853-4785-983e-d3d8551a71ab] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=4429ms | Body={"id":"3ef0f6fe-3321-4281-ac92-7f494ca63851","alias":"My new example key","primaryVersion":2,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:40:20.905752Z","rotatedAt":"2025-10-01T16:40:41.875044300Z"} -2025-10-01 18:40:49 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [5090d52e-c030-48de-96ad-6c76ca63296d] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "3ef0f6fe-3321-4281-ac92-7f494ca63851" -} -2025-10-01 18:40:49 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [5090d52e-c030-48de-96ad-6c76ca63296d] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=5295ms | Body={"id":"3ef0f6fe-3321-4281-ac92-7f494ca63851","alias":"My new example key","primaryVersion":3,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:40:20.905752Z","rotatedAt":"2025-10-01T16:40:49.255775800Z"} -2025-10-01 18:40:54 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [0c83a016-ee7d-4914-8cb5-5f1e4ac71cde] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "3ef0f6fe-3321-4281-ac92-7f494ca63851" -} -2025-10-01 18:40:54 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [0c83a016-ee7d-4914-8cb5-5f1e4ac71cde] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=3515ms | Body={"id":"3ef0f6fe-3321-4281-ac92-7f494ca63851","alias":"My new example key","primaryVersion":4,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:40:20.905752Z","rotatedAt":"2025-10-01T16:40:54.251256800Z"} -2025-10-01 18:41:58 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [157057aa-cd5e-4759-902d-65376b1cd32b] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:41:58 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [157057aa-cd5e-4759-902d-65376b1cd32b] RESPONSE POST /api/v1/auth | Status=200 | Duration=1147ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNjkxOCwiZXhwIjoxNzU5MzQwNTE4fQ.hCP8CuVeKvndKtZtkBEKkirSPheWXZYcJ9G5nD8ALqA"} -2025-10-01 18:42:55 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [ddff333f-607e-4498-ad03-d4dbdca3d947] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:42:55 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [ddff333f-607e-4498-ad03-d4dbdca3d947] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=45173ms | Body={"id":"be653188-079d-4483-a4ff-ff5c779bb585","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:42:10.488367200Z","rotatedAt":null} -2025-10-01 18:44:06 [https-jsse-nio-8443-exec-5] INFO f.s.m.l.RequestResponseLoggingFilter - [d75b6eca-967f-4648-989a-c74ad3c0e58d] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:44:06 [https-jsse-nio-8443-exec-5] INFO f.s.m.l.RequestResponseLoggingFilter - [d75b6eca-967f-4648-989a-c74ad3c0e58d] RESPONSE POST /api/v1/auth | Status=200 | Duration=1175ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNzA0NiwiZXhwIjoxNzU5MzQwNjQ2fQ.zvLWwqq9_5eHwPXu7JzQAyLU4yXx8hHmZifoN0Z8ADM"} -2025-10-01 18:44:26 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [a195406c-839d-4b27-86a7-cfdca8162b4a] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:44:26 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [a195406c-839d-4b27-86a7-cfdca8162b4a] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=10801ms | Body={"id":"fcdcd18f-aabd-41be-8157-8851113978d6","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:44:16.051864900Z","rotatedAt":null} -2025-10-01 18:46:10 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [992aee7e-01f8-41a0-b1b4-be3c40ffd860] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:46:10 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [992aee7e-01f8-41a0-b1b4-be3c40ffd860] RESPONSE POST /api/v1/auth | Status=200 | Duration=1247ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNzE2OSwiZXhwIjoxNzU5MzQwNzY5fQ.HYjw5pQrvq838CabPspHmmFJdqFYJSntH6FI45moJOw"} -2025-10-01 18:46:36 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [2fb423b8-df93-48ff-a061-46bf89ab1e7b] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:46:36 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [2fb423b8-df93-48ff-a061-46bf89ab1e7b] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=5448ms | Body={"id":"f57049dd-7171-4896-8674-7070e22f32fd","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:46:31.039753400Z","rotatedAt":null} -2025-10-01 18:47:08 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [337e770b-1572-45d2-be01-329f7ceada13] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "f57049dd-7171-4896-8674-7070e22f32fd" -} -2025-10-01 18:47:08 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [337e770b-1572-45d2-be01-329f7ceada13] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=7838ms | Body={"id":"f57049dd-7171-4896-8674-7070e22f32fd","alias":"My new example key","primaryVersion":2,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:46:31.039753Z","rotatedAt":"2025-10-01T16:47:00.873628300Z"} -2025-10-01 18:47:16 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [b729dae8-12dc-4dbd-8ce5-7bd20682123b] REQUEST POST /api/v1/keys/rotate | Body={ - "id": "f57049dd-7171-4896-8674-7070e22f32fd" -} -2025-10-01 18:47:16 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [b729dae8-12dc-4dbd-8ce5-7bd20682123b] RESPONSE POST /api/v1/keys/rotate | Status=201 | Duration=6358ms | Body={"id":"f57049dd-7171-4896-8674-7070e22f32fd","alias":"My new example key","primaryVersion":3,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:46:31.039753Z","rotatedAt":"2025-10-01T16:47:10.103226900Z"} -2025-10-01 18:47:25 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [93e21bfc-f6de-4e96-a986-e9c00177876a] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "f57049dd-7171-4896-8674-7070e22f32fd" -} -2025-10-01 18:47:25 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [93e21bfc-f6de-4e96-a986-e9c00177876a] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=200 | Duration=45ms | Body= -2025-10-01 18:50:25 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [17be1baf-c1ad-4421-b10f-c41f49c43457] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:50:25 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [17be1baf-c1ad-4421-b10f-c41f49c43457] RESPONSE POST /api/v1/auth | Status=200 | Duration=1231ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNzQyNSwiZXhwIjoxNzU5MzQxMDI1fQ.yTW8_ImIhKWIjTGVKXLNl_-DV6Doknx7YEPzPLvecUo"} -2025-10-01 18:50:41 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [34f1a40c-2e06-47fe-a453-29da2f9d2f45] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:50:41 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [34f1a40c-2e06-47fe-a453-29da2f9d2f45] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=5380ms | Body={"id":"39a8a3ef-f6ce-43b1-941b-b06a2c33a888","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:50:35.717332Z","rotatedAt":null} -2025-10-01 18:51:12 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [565615ab-7fad-42d9-b6e8-b2d2d24a6395] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "39a8a3ef-f6ce-43b1-941b-b06a2c33a888" -} -2025-10-01 18:51:12 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [565615ab-7fad-42d9-b6e8-b2d2d24a6395] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=200 | Duration=24378ms | Body= -2025-10-01 18:52:33 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [4ba38d0c-dd9e-4950-a59b-115bfa41a043] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:52:33 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [4ba38d0c-dd9e-4950-a59b-115bfa41a043] RESPONSE POST /api/v1/auth | Status=200 | Duration=1262ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNzU1MywiZXhwIjoxNzU5MzQxMTUzfQ.SrUDoxodefcl6ZAGXrlCIH8AjiUh21P-4U6XLRyFgzs"} -2025-10-01 18:52:49 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [1d561aae-dc08-4bf5-b3b2-a17cf4d1109e] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:52:49 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [1d561aae-dc08-4bf5-b3b2-a17cf4d1109e] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=6172ms | Body={"id":"ff63888b-12cb-47db-b117-6ef4bb7cef59","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:52:43.307024700Z","rotatedAt":null} -2025-10-01 18:55:09 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [4da354e2-5083-47da-a7c8-45cc5dc62532] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "ff63888b-12cb-47db-b117-6ef4bb7cef59" -} -2025-10-01 18:55:09 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [4da354e2-5083-47da-a7c8-45cc5dc62532] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=200 | Duration=131364ms | Body= -2025-10-01 18:55:31 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [d7f720c9-16ce-4539-a94a-b7700bd14d70] REQUEST POST /api/v1/auth | Body={ - "username": "manager", - "password": "manager" -} -2025-10-01 18:55:31 [https-jsse-nio-8443-exec-6] INFO f.s.m.l.RequestResponseLoggingFilter - [d7f720c9-16ce-4539-a94a-b7700bd14d70] RESPONSE POST /api/v1/auth | Status=200 | Duration=1397ms | Body={"token":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtYW5hZ2VyIiwidXNlcklkIjoxLCJyb2xlIjoiTUFOQUdFUiIsImlhdCI6MTc1OTMzNzczMCwiZXhwIjoxNzU5MzQxMzMwfQ.2PKMtFGm-UdVXpFcTXE0YzbJ-dxEaZiwFs5TF1E2-Mc"} -2025-10-01 18:55:46 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [11d24ed2-2a78-446f-adf1-3fa460bdfb8c] REQUEST POST /api/v1/keys/create | Body={ - "alias": "My new example key", - "keyType": "asymmetric", - "allowedOperations": ["sign"] -} -2025-10-01 18:55:46 [https-jsse-nio-8443-exec-7] INFO f.s.m.l.RequestResponseLoggingFilter - [11d24ed2-2a78-446f-adf1-3fa460bdfb8c] RESPONSE POST /api/v1/keys/create | Status=201 | Duration=5928ms | Body={"id":"d77e27b7-f211-4ed5-bd76-fd016130fa6b","alias":"My new example key","primaryVersion":1,"keyType":"ASYMMETRIC","allowedOperations":["SIGN"],"createdAt":"2025-10-01T16:55:40.831513100Z","rotatedAt":null} -2025-10-01 18:55:52 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [51ab6e4b-3add-4a1c-986b-b63ea6bb3fd7] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "d77e27b7-f211-4ed5-bd76-fd016130fa6b" -} -2025-10-01 18:55:52 [https-jsse-nio-8443-exec-8] INFO f.s.m.l.RequestResponseLoggingFilter - [51ab6e4b-3add-4a1c-986b-b63ea6bb3fd7] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=201 | Duration=57ms | Body=Hds8ayPC1qw/Ku6YS8gEJKlIZuFQuiwfemWWgpE9iH23mMMr/byX3dMK2eqg+UK/99OQ+Olfu1wDdBaFH4Xw9YIAd2HXB9BEn2DsliwXXUsvQNU/EHZEW4OOnj+XT8sFWDr4WFWHUFcVAOiQzmzZ3qmHAPp0l7qeQUKAJfqb5KNfi4K4Z/ABssT0QCtYcnrF5pWgNatG4qXEMEVuBAdooPu1+QmdiB4s4i3i9ldhip2os6UBl5Cxtc4pFecmW6buvN9+nJQfi0ZRT+nC6KVleEvqvW6kob2CAJUcm5mUb9lgJhAvtWeG0byNiaMD7aEiyl7C6fKd/292ypdZUk0ARhnpmIBSuqWE6V5NCHQiSQyDgAAqtdLpV+6hhxMsegI6HbLE9qpG7Ok6N0tIJTJOpZko22Hha5h1JN2RvefzjlXusPj6osfTNHn1v2XCCXMghI0s/7LdLmz1QKQYT49i3dXEzM/FJQd38exqmoUv5D7x033w9wKKO281AxO6DNL0 -2025-10-01 18:55:56 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [4c51ab3d-4345-42a6-be51-6a524e8d09a1] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "d77e27b7-f211-4ed5-bd76-fd016130fa6b" -} -2025-10-01 18:55:56 [https-jsse-nio-8443-exec-9] INFO f.s.m.l.RequestResponseLoggingFilter - [4c51ab3d-4345-42a6-be51-6a524e8d09a1] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=201 | Duration=31ms | Body=R1HlSSg3OG7Rgb7gw/20JPwv0wNOGcSKwM53GLiFup3JdyR3Eq34v1xE26C/A994+NZxiK/gTiB13epE1XArAQxYGfkrFPweke2+XFNM5m+2NkKFKcoy7JHviSi95hhhsWM0iYBWpMloGQzUPklP5NiHdy/Y7g1LBkthz7dX6Mf01nxrlDuPnaPbD7mRKRTjUa73IfQ+NieUX6oosdIyaB2vOIePGeZrEDqugJRfV/XgTe/g4TIYhnFPFygMWpixWpOWONbhxttV4gxojUVWmPDyHOJ/VsYdvqsr6K6nkLC3Ct36QP8EmHwwRnWxXTyTh0XcoAXP26uttBSWWplI0L4/AxZqOEUvSfTU8tF5qXZ5eV7BoAyPJYb9ZRle+HxY0CZzI9WxTVcO7sFWBLnoRZ9J/NZ4AmZf5j4JRM0WKk24YgKWZB4U0EwntarI2zpR49WsYfWvz7+V3kPQEmfCkyz7Xw9CCGGml3IxiY2JqqQAWAVtAffmnxbWmJ/ua6p6 -2025-10-01 18:55:57 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [1eaa3759-ee63-4a76-9189-bc9db0e8ed08] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "d77e27b7-f211-4ed5-bd76-fd016130fa6b" -} -2025-10-01 18:55:57 [https-jsse-nio-8443-exec-10] INFO f.s.m.l.RequestResponseLoggingFilter - [1eaa3759-ee63-4a76-9189-bc9db0e8ed08] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=201 | Duration=31ms | Body=ed2ZvAcXg35RaAy5vrDfYow2cdBTBJiqKEWe9Y/ytiDfx/Boi6s6yqAmNt43PmOwN/ODM5PC6JBBf17YQFMi6iCybyzdt/fDPFZWRGpdBGC2vMdIbd8A8Qzu82lLtJS1s1zkyS+gnAD1b/jJbs+gIg8vb9wn8Ule8EMo1LVw8tNmFVmrT+3n1SNCZ5dTnDt7wGF97c91Q/tSLLHc3wUnsHlmcsUHYhSUB4s+VhCmp2rBEUcZSNCaCyHLUUeUPLXihn0FjqXRVhffLxWuMdtMFZfbZlhBUwEkurHvXgNERfQHjMuRijgE8uWQuSX3fIWp1eFzxwc5Trf234MEGSPW++SewL3w6H96k+Nk7c8BrvAmt8PAudZoXf/X1+PFMffljgUdWvfY3UQ2j7wTfjTXOyHsaYzonUnld9hEpAw4xutxk7hTwd1HpTso4/LFYXiYMJ+4GP9TKL+1kOkD/9TYoC7sMk54f1S6WXScoGqD0UahbaHBLOHwE09lHqU9WdRy -2025-10-01 18:55:58 [https-jsse-nio-8443-exec-1] INFO f.s.m.l.RequestResponseLoggingFilter - [82058bf6-2c2c-4246-a21b-78d8fd85b2de] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "d77e27b7-f211-4ed5-bd76-fd016130fa6b" -} -2025-10-01 18:55:58 [https-jsse-nio-8443-exec-1] INFO f.s.m.l.RequestResponseLoggingFilter - [82058bf6-2c2c-4246-a21b-78d8fd85b2de] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=201 | Duration=31ms | Body=RY3Op4hgHGlgRwp62afC/CcAFULrtAJdUPjb6637Qc89IMeeqVZ0tm+fo6WlU/sNxtbBfjC+ESJFBDFX137Koqm8kTF8tAm8s5USK7VvWrHilbHi8QOSFFDrFsoR56mF4ycP+rejmkHiGV0PTAZx/LSV/zPbr2JVop9z6BvbjMErKUEHiaVpoEkNmb7eGchNl4E1w885zKrlmv+A1uu4VDOpgQ9pbI27wpqwAKotZLBqcyfYa44MUnUi8CD6sXDKvptBhVGGm+QEInUJXzFMOirPI/C55t71+LBX2LSBNFo7lQd6ntYqm8l7MaEQ7zK4iw3KKrPasrfqJcJv0P/mg5mfn1d53oNrizmuDgtmZOokXn0t2YYb/goFA83eq6G7ojW86qwzq/UsUynSVSxYM1rqSe/xPXia7+NiLAmUbs80z7zvxeka8cs+6sx0SAymBzohcwcpVkQvumh28OevU4TIYH7tjxYO/J2T5tLy4WbAd1oNZqFclf0GLGhzeaWN -2025-10-01 18:56:00 [https-jsse-nio-8443-exec-2] INFO f.s.m.l.RequestResponseLoggingFilter - [0d8193ca-98ac-4533-affe-96eb0b379df3] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "d77e27b7-f211-4ed5-bd76-fd016130fa6b" -} -2025-10-01 18:56:00 [https-jsse-nio-8443-exec-2] INFO f.s.m.l.RequestResponseLoggingFilter - [0d8193ca-98ac-4533-affe-96eb0b379df3] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=201 | Duration=32ms | Body=LXyKLSJ6g45ApA/dUNvr1FBpKxqSaK1vRLONmoacnZreBRfPD/TV5/Hec/OvOExUHVBtkjLj026y9bVcAU6NtIayNMM7YgOA+SmBRVFUTOHdt38e3JBZBAUlOEqD6r3/eA/wpsbbW9peU8s8asXrnu4NkWCywwSD0PcQWqgbBbp/4e+c1VXyojBr8pVPFpZSpU53dJarOR3Q7Imo5GYl8R/x2YchfOugLTkEZ7+7kSH3jeWCfEsRZ8rYAdst1J5xFKfSOz7ndAAHLl3x4ynblfy9HeU5NBIL4PQw4vxGugxIrjj4KLnbZeBRGXElv0A5G3ubHPhqDm6a5rZp3qH6wRmnh0tonwdCqC/FWP39H3616Vbq/ygxS2Xx/urSQcXxOBqzjVW7NwDGeMQalMBCvv3ObCIwrHXAn3A/BwMG3ePriv2+FoT/oXojOykz3V2z3oAulcU2N3CIoiRBHVMRMxudqwidhF0jzkKzWVLnDk6nSBYpb0ZNjTALp2ZHWtvb -2025-10-01 18:56:01 [https-jsse-nio-8443-exec-3] INFO f.s.m.l.RequestResponseLoggingFilter - [b99ee8ea-9d44-4745-b501-3bf09130c16f] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "d77e27b7-f211-4ed5-bd76-fd016130fa6b" -} -2025-10-01 18:56:01 [https-jsse-nio-8443-exec-3] INFO f.s.m.l.RequestResponseLoggingFilter - [b99ee8ea-9d44-4745-b501-3bf09130c16f] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=201 | Duration=26ms | Body=aW7fX+DJt1+dMn+yZvZjvodQPAMR2QjwDSD/sU1wzuPfRygvngHubsQyF0bwZqbUiblJkiKfpo7mWwba8gHreJAy8PS389J9UyyJzypgZWVGZkJWVyzzOCtK1RrNOuFNxMPPk8NdZMh1BAvt5YGQvGPkaT6VDAyUbpkEl7Rr2q/z4P8s5mkvPhLeC9/BjNNOx19BpUrlVKj4rPQueqhWrdAMuvTSKg2gGnTvxgn78HGcEbSJvDLWN1Hs/27AicoShzwNGHj748eh5OK9jQ4MNggOvrw2qFp47rrA2y84aYuRVCS9sreC397Ky/IqYruhryv2ywJfSDuYNvKSjT7iKvh4WuU3RTaJUd+Ve6+eNeY/4Af77ZV3D1urHBeCi07ko1nGpWXm6OpVIPHRwJzKnw1jLcVvuzOO+g/5ILXs2u/IbO+ADUSPoNJrfgGMiP4Zvg6uWjNu5GCxc0rtH6/FzzSgZhmjMdHWsHHkO4l8Qb+rAXykwfjfhBGyAfqqUYyX -2025-10-01 18:56:03 [https-jsse-nio-8443-exec-4] INFO f.s.m.l.RequestResponseLoggingFilter - [ffe3e0a2-e1a2-4bd9-95cd-37b2b6be80e0] REQUEST POST /api/v1/crypto/encrypt/asymmetric | Body={ - "message": "This is my message woohooo", - "keyId": "d77e27b7-f211-4ed5-bd76-fd016130fa6b" -} -2025-10-01 18:56:03 [https-jsse-nio-8443-exec-4] INFO f.s.m.l.RequestResponseLoggingFilter - [ffe3e0a2-e1a2-4bd9-95cd-37b2b6be80e0] RESPONSE POST /api/v1/crypto/encrypt/asymmetric | Status=201 | Duration=25ms | Body=VLsdLnsd9DpRkaFLBCqgp4WHHU3y1/AhPAT7nPXeCZn+9NsbSXIUIhCU3j1fqtip/WINJW0lwoYX59xNYoFY0RUsWw1wffLoCEmb6CDtReRRCrPUNQZQm8dAHx4a8zlrO/94SMEHSEP+tsYhnPZnyqxXIKA91f40ZuS7kyqWEutxZhWB4rFtvNuBA8CUBsMPfmAjSRlvAmPHoHGfu62ALrv4nOb38W91nAOF1ufpx8yTF8KMwf2DqyxW1ILu23/uKXt3xLYg9VV29lN10WSV3PN8f/UrdDaKFF02bGoB6IhRIGCv1YL3mLx3tNYnhRFXHpeHzlkRWf+nVZE53XOYXC0kag0KjIX33VdxeLKX1i393VRLh11FqZosl3IZJ5hW0T+3qXk2mXBXetRHcM+2poyklIH4Nw+vVNCQaNoLqXWc6c59GZ55av5grl90Zw2J+VuzlUEVlOYyRDiivAk/GAi2iDcsJ8Bm0ImtuOxA2ckll9/qsLNEklVEurswDoYd diff --git a/MiniKms/logs/entity.log b/MiniKms/logs/entity.log deleted file mode 100644 index ad0c060..0000000 --- a/MiniKms/logs/entity.log +++ /dev/null @@ -1,4 +0,0 @@ -2025-09-30 22:08:15 [http-nio-8080-exec-1] INFO f.s.minikms.logging.EntityLogger - Creating: TestEntity(id=null, name=testname) -2025-09-30 22:08:15 [http-nio-8080-exec-1] INFO f.s.minikms.logging.EntityLogger - Created: TestEntity(id=1, name=testname) -2025-10-01 09:10:05 [https-jsse-nio-8443-exec-6] INFO f.s.minikms.logging.EntityLogger - Creating: TestEntity(id=null, name=testname) -2025-10-01 09:10:05 [https-jsse-nio-8443-exec-6] INFO f.s.minikms.logging.EntityLogger - Created: TestEntity(id=1, name=testname) diff --git a/MiniKms/pom.xml b/MiniKms/pom.xml index 8e75f7c..3e9a17b 100644 --- a/MiniKms/pom.xml +++ b/MiniKms/pom.xml @@ -91,6 +91,12 @@ mapstruct 1.6.0 + + net.logstash.logback + logstash-logback-encoder + 8.1 + + diff --git a/MiniKms/src/main/java/ftn/security/minikms/config/SecurityConfig.java b/MiniKms/src/main/java/ftn/security/minikms/config/SecurityConfig.java index 10b1c4a..b5be098 100644 --- a/MiniKms/src/main/java/ftn/security/minikms/config/SecurityConfig.java +++ b/MiniKms/src/main/java/ftn/security/minikms/config/SecurityConfig.java @@ -54,6 +54,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() .requestMatchers("/api/v1/auth/**").permitAll() .requestMatchers("/api/v1/test/**").permitAll() + .requestMatchers("/api/v1/crypto/**").permitAll() + .requestMatchers("/api/v1/signatures/**").permitAll() .requestMatchers(HttpMethod.GET, "/api/v1/keys/**").authenticated() // Allow all roles to GET .requestMatchers("/api/v1/keys/**").hasRole("MANAGER") .anyRequest().authenticated() diff --git a/MiniKms/src/main/java/ftn/security/minikms/controller/SignatureController.java b/MiniKms/src/main/java/ftn/security/minikms/controller/SignatureController.java new file mode 100644 index 0000000..75f69f0 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/controller/SignatureController.java @@ -0,0 +1,53 @@ +package ftn.security.minikms.controller; + +import ftn.security.minikms.dto.SignRequestDTO; +import ftn.security.minikms.dto.VerifyRequestDTO; +import ftn.security.minikms.service.SignatureService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.security.GeneralSecurityException; +import java.security.Principal; +import java.util.Base64; +import java.util.UUID; + +@RestController +@RequestMapping("/api/v1/signatures") +public class SignatureController { + + @Autowired + private SignatureService signatureService; + + @PostMapping("/sign") + @Transactional(readOnly = true) + public ResponseEntity sign(@RequestParam UUID keyId, + @RequestBody SignRequestDTO request) { + try { + byte[] signature = signatureService.sign(keyId, request.getMessage(), request.getVersion()); + return ResponseEntity.ok(Base64.getEncoder().encodeToString(signature)); + } catch (GeneralSecurityException | IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); + } + } + + @PostMapping("/verify") + @Transactional(readOnly = true) + public ResponseEntity verify(@RequestParam UUID keyId, + @RequestParam(required = false) Integer version, + @RequestBody VerifyRequestDTO req) { + try { + boolean valid = signatureService.verify( + keyId, + req.getMessage(), + Base64.getDecoder().decode(req.getSignature()), + version + ); + return ResponseEntity.ok(valid ? "VALID" : "INVALID"); + } catch (GeneralSecurityException | IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); + } + } +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/dto/SignRequestDTO.java b/MiniKms/src/main/java/ftn/security/minikms/dto/SignRequestDTO.java new file mode 100644 index 0000000..81a2bda --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/dto/SignRequestDTO.java @@ -0,0 +1,9 @@ +package ftn.security.minikms.dto; + +import lombok.Data; + +@Data +public class SignRequestDTO { + private String message; + private Integer version; +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/dto/VerifyRequestDTO.java b/MiniKms/src/main/java/ftn/security/minikms/dto/VerifyRequestDTO.java new file mode 100644 index 0000000..90dd1b0 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/dto/VerifyRequestDTO.java @@ -0,0 +1,9 @@ +package ftn.security.minikms.dto; + +import lombok.Data; + +@Data +public class VerifyRequestDTO { + private String message; + private String signature; +} diff --git a/MiniKms/src/main/java/ftn/security/minikms/logging/EntityLogger.java b/MiniKms/src/main/java/ftn/security/minikms/logging/EntityLogger.java index fe8de94..13faf8a 100644 --- a/MiniKms/src/main/java/ftn/security/minikms/logging/EntityLogger.java +++ b/MiniKms/src/main/java/ftn/security/minikms/logging/EntityLogger.java @@ -2,37 +2,41 @@ import jakarta.persistence.*; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; + +import java.util.Map; @Slf4j public class EntityLogger { - @PrePersist - public void prePersist(Object entity) { - log.info("Creating: {}", entity); + @Value("${logging.entity.enabled:true}") + private boolean loggingEnabled; + + private void logEntity(String action, String phase, Object entity) { + if (!loggingEnabled) return; + + log.info("{}", Map.of( + "action", action, + "phase", phase, + "entity", entity.getClass().getSimpleName() + )); } + @PrePersist + public void prePersist(Object entity) { logEntity("create", "pre", entity); } + @PostPersist - public void postPersist(Object entity) { - log.info("Created: {}", entity); - } + public void postPersist(Object entity) { logEntity("create", "post", entity); } @PreUpdate - public void preUpdate(Object entity) { - log.info("Updating: {}", entity); - } + public void preUpdate(Object entity) { logEntity("update", "pre", entity); } @PostUpdate - public void postUpdate(Object entity) { - log.info("Updated: {}", entity); - } + public void postUpdate(Object entity) { logEntity("update", "post", entity); } @PreRemove - public void preRemove(Object entity) { - log.info("Deleting: {}", entity); - } + public void preRemove(Object entity) { logEntity("delete", "pre", entity); } @PostRemove - public void postRemove(Object entity) { - log.info("Deleted: {}", entity); - } + public void postRemove(Object entity) { logEntity("delete", "post", entity); } } diff --git a/MiniKms/src/main/java/ftn/security/minikms/logging/RequestResponseLoggingFilter.java b/MiniKms/src/main/java/ftn/security/minikms/logging/RequestResponseLoggingFilter.java index 8f75a82..ffc3db0 100644 --- a/MiniKms/src/main/java/ftn/security/minikms/logging/RequestResponseLoggingFilter.java +++ b/MiniKms/src/main/java/ftn/security/minikms/logging/RequestResponseLoggingFilter.java @@ -5,57 +5,56 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; -import org.springframework.web.util.ContentCachingRequestWrapper; -import org.springframework.web.util.ContentCachingResponseWrapper; import java.io.IOException; -import java.nio.charset.StandardCharsets; +import java.util.Map; import java.util.UUID; @Slf4j @Component public class RequestResponseLoggingFilter extends OncePerRequestFilter { + @Value("${logging.controller.enabled:true}") + private boolean loggingEnabled; + @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request); - ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); + if (!loggingEnabled) { + filterChain.doFilter(request, response); + return; + } String requestId = request.getHeader("X-Request-ID"); if (requestId == null || requestId.isBlank()) { requestId = UUID.randomUUID().toString(); } + response.setHeader("X-Request-ID", requestId); - responseWrapper.setHeader("X-Request-ID", requestId); + String username = request.getUserPrincipal() != null + ? request.getUserPrincipal().getName() + : "anonymous"; long start = System.currentTimeMillis(); try { - filterChain.doFilter(requestWrapper, responseWrapper); + filterChain.doFilter(request, response); } finally { long duration = System.currentTimeMillis() - start; - String requestBody = new String(requestWrapper.getContentAsByteArray(), StandardCharsets.UTF_8); - log.info("[{}] REQUEST {} {} | Body={}", - requestId, - request.getMethod(), - request.getRequestURI(), - requestBody); - - String responseBody = new String(responseWrapper.getContentAsByteArray(), StandardCharsets.UTF_8); - log.info("[{}] RESPONSE {} {} | Status={} | Duration={}ms | Body={}", - requestId, - request.getMethod(), - request.getRequestURI(), - responseWrapper.getStatus(), - duration, - responseBody); - - responseWrapper.copyBodyToResponse(); + log.info("{}", Map.of( + "message", "HTTP request completed", + "requestId", requestId, + "username", username, + "method", request.getMethod(), + "uri", request.getRequestURI(), + "status", response.getStatus(), + "durationMs", duration + )); } } } diff --git a/MiniKms/src/main/java/ftn/security/minikms/repository/KeyMetadataRepository.java b/MiniKms/src/main/java/ftn/security/minikms/repository/KeyMetadataRepository.java index 7966c5e..116575d 100644 --- a/MiniKms/src/main/java/ftn/security/minikms/repository/KeyMetadataRepository.java +++ b/MiniKms/src/main/java/ftn/security/minikms/repository/KeyMetadataRepository.java @@ -2,6 +2,8 @@ import ftn.security.minikms.entity.KeyMetadata; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.UUID; diff --git a/MiniKms/src/main/java/ftn/security/minikms/service/KeyComputeService.java b/MiniKms/src/main/java/ftn/security/minikms/service/KeyComputeService.java index a62e654..c597535 100644 --- a/MiniKms/src/main/java/ftn/security/minikms/service/KeyComputeService.java +++ b/MiniKms/src/main/java/ftn/security/minikms/service/KeyComputeService.java @@ -3,16 +3,14 @@ import ftn.security.minikms.entity.KeyMaterial; import ftn.security.minikms.repository.KeyMetadataRepository; import ftn.security.minikms.repository.WrappedKeyRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.InvalidParameterException; -import java.security.NoSuchAlgorithmException; +import java.security.*; import java.security.spec.InvalidKeySpecException; import java.util.UUID; @@ -25,6 +23,9 @@ public class KeyComputeService { private final RSAService rsaService; private final HMACService hmacService; + @Autowired + private RootKeyManager rootKeyManager; + public KeyComputeService(KeyMetadataRepository metadataRepository, WrappedKeyRepository keyRepository) { this.metadataRepository = metadataRepository; this.keyRepository = keyRepository; @@ -76,4 +77,32 @@ public KeyMaterial getKey(UUID keyId, Integer version) { return wrappedKey.getWrappedMaterial(); } + + public KeyMaterial getKeySig(UUID keyId, Integer version) { + var metadata = metadataRepository.findById(keyId) + .orElseThrow(() -> new InvalidParameterException("Key with given id does not exist")); + + if (version == null) version = metadata.getPrimaryVersion(); + var wrappedKey = keyRepository.findByMetadataIdAndVersion(keyId, version) + .orElseThrow(() -> new InvalidParameterException("Key with given id and version does not exist")); + + var wrappedMaterial = wrappedKey.getWrappedMaterial(); + + try { + // Unwrap the private key + byte[] unwrappedPrivate = rootKeyManager.unwrap( + wrappedMaterial.getKey(), keyId, version + ); + + // For asymmetric keys: also store public key + KeyMaterial material = new KeyMaterial(); + material.setKey(unwrappedPrivate); + material.setPublicKey(wrappedMaterial.getPublicKey()); + + return material; + } catch (GeneralSecurityException e) { + throw new RuntimeException("Failed to unwrap key material", e); + } + } + } diff --git a/MiniKms/src/main/java/ftn/security/minikms/service/SignatureService.java b/MiniKms/src/main/java/ftn/security/minikms/service/SignatureService.java new file mode 100644 index 0000000..34bb5c7 --- /dev/null +++ b/MiniKms/src/main/java/ftn/security/minikms/service/SignatureService.java @@ -0,0 +1,60 @@ +package ftn.security.minikms.service; + +import ftn.security.minikms.entity.KeyMaterial; +import ftn.security.minikms.entity.KeyMetadata; +import ftn.security.minikms.entity.WrappedKey; +import ftn.security.minikms.enumeration.KeyType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Arrays; +import java.util.UUID; + +@Service +public class SignatureService { + + @Autowired + private KeyComputeService keyComputeService; + + public SignatureService() { + } + + public byte[] sign(UUID keyId, String message, Integer version) throws GeneralSecurityException { + KeyMaterial keyMaterial = keyComputeService.getKeySig(keyId, version); + + if (keyMaterial.getPublicKey() == null) { + throw new IllegalArgumentException("Key is not asymmetric and cannot be used for signing"); + } + + + PrivateKey privateKey = KeyFactory.getInstance("RSA") + .generatePrivate(new PKCS8EncodedKeySpec(keyMaterial.getKey())); + + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(privateKey); + signature.update(message.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + + return signature.sign(); + } + + public boolean verify(UUID keyId, String message, byte[] signatureBytes, Integer version) throws GeneralSecurityException { + KeyMaterial keyMaterial = keyComputeService.getKeySig(keyId, version); + + if (keyMaterial.getPublicKey() == null) { + throw new IllegalArgumentException("Key is not asymmetric and cannot be used for verification"); + } + + PublicKey publicKey = KeyFactory.getInstance("RSA") + .generatePublic(new X509EncodedKeySpec(keyMaterial.getPublicKey())); + + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initVerify(publicKey); + signature.update(message.getBytes(StandardCharsets.UTF_8)); + + return signature.verify(signatureBytes); + } +} diff --git a/MiniKms/src/main/resources/application.properties b/MiniKms/src/main/resources/application.properties index 5dbf986..aba63c5 100644 --- a/MiniKms/src/main/resources/application.properties +++ b/MiniKms/src/main/resources/application.properties @@ -22,9 +22,13 @@ server.ssl.key-alias=minikms # Debugging #spring.jpa.show-sql=true -#logging.level.org.springframework.security=DEBUG -#logging.level.io.jsonwebtoken=DEBUG +logging.level.org.springframework.security=DEBUG +logging.level.io.jsonwebtoken=DEBUG # 1 hour jwt.expiration=3600000 -jwt.secret=Dubt4z4Lba9fc82KES/2uRcxOR9LcTTwxh7UuxE4f9Q= \ No newline at end of file +jwt.secret=Dubt4z4Lba9fc82KES/2uRcxOR9LcTTwxh7UuxE4f9Q= + +# Enable/disable logging +logging.controller.enabled=true +logging.entity.enabled=true \ No newline at end of file diff --git a/MiniKms/src/main/resources/logback-spring.xml b/MiniKms/src/main/resources/logback-spring.xml index 7fb8512..ba4d20f 100644 --- a/MiniKms/src/main/resources/logback-spring.xml +++ b/MiniKms/src/main/resources/logback-spring.xml @@ -1,39 +1,34 @@ - - logs/controller.log + logs/controller.json - logs/controller-%d{yyyy-MM-dd}.%i.log.gz + logs/controller-%d{yyyy-MM-dd}.%i.json.gz 10MB 14 500MB - - %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + - + + - logs/entity.log + logs/entity.json - logs/entity-%d{yyyy-MM-dd}.%i.log.gz + logs/entity-%d{yyyy-MM-dd}.%i.json.gz 10MB 14 500MB - - %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n - + - + diff --git a/MiniKms/src/test/java/ftn/security/minikms/MiniKmsApplicationTests.java b/MiniKms/src/test/java/ftn/security/minikms/MiniKmsApplicationTests.java index 6034234..6d05fd5 100644 --- a/MiniKms/src/test/java/ftn/security/minikms/MiniKmsApplicationTests.java +++ b/MiniKms/src/test/java/ftn/security/minikms/MiniKmsApplicationTests.java @@ -1,13 +1,17 @@ package ftn.security.minikms; +import ftn.security.minikms.service.RootKeyManager; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Arrays; +import java.util.UUID; + @SpringBootTest class MiniKmsApplicationTests { @Test - void contextLoads() { - } - + void contextLoads() { } }