maleo-foundation 0.1.76__py3-none-any.whl → 0.1.77__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,7 @@ from maleo_foundation.client.services.hash import (
14
14
  from maleo_foundation.client.services import (
15
15
  MaleoFoundationEncryptionServices,
16
16
  MaleoFoundationHashServices,
17
+ MaleoFoundationKeyClientService,
17
18
  MaleoFoundationSignatureClientService,
18
19
  MaleoFoundationTokenClientService,
19
20
  MaleoFoundationServices
@@ -35,6 +36,7 @@ class MaleoFoundationClientManager(ClientManager):
35
36
  aes=aes_encryption_service,
36
37
  rsa=rsa_encryption_service
37
38
  )
39
+ key_service = MaleoFoundationKeyClientService(logger=self._logger)
38
40
  bcrypt_hash_service = MaleoFoundationBcryptHashClientService(logger=self._logger)
39
41
  hmac_hash_service = MaleoFoundationHMACHashClientService(logger=self._logger)
40
42
  sha256_hash_service = MaleoFoundationSHA256HashClientService(logger=self._logger)
@@ -48,6 +50,7 @@ class MaleoFoundationClientManager(ClientManager):
48
50
  self._services = MaleoFoundationServices(
49
51
  encryption=encryption_services,
50
52
  hash=hash_services,
53
+ key=key_service,
51
54
  signature=signature_service,
52
55
  token=token_service
53
56
  )
@@ -3,11 +3,13 @@ from pydantic import Field
3
3
  from maleo_foundation.managers.client.base import ClientServices
4
4
  from maleo_foundation.client.services.encryption import MaleoFoundationEncryptionServices
5
5
  from maleo_foundation.client.services.hash import MaleoFoundationHashServices
6
+ from maleo_foundation.client.services.key import MaleoFoundationKeyClientService
6
7
  from maleo_foundation.client.services.signature import MaleoFoundationSignatureClientService
7
8
  from maleo_foundation.client.services.token import MaleoFoundationTokenClientService
8
9
 
9
10
  class MaleoFoundationServices(ClientServices):
10
11
  encryption:MaleoFoundationEncryptionServices = Field(..., description="Encryption's services")
11
12
  hash:MaleoFoundationHashServices = Field(..., description="Hash's services")
13
+ key:MaleoFoundationKeyClientService = Field(..., description="Key's service")
12
14
  signature:MaleoFoundationSignatureClientService = Field(..., description="Signature's service")
13
15
  token:MaleoFoundationTokenClientService = Field(..., description="Token's service")
@@ -0,0 +1,113 @@
1
+ from cryptography.hazmat.backends import default_backend
2
+ from cryptography.hazmat.primitives.asymmetric import rsa
3
+ from cryptography.hazmat.primitives import serialization
4
+ from maleo_foundation.expanded_types.key import BaseKeyResultsTypes
5
+ from maleo_foundation.managers.client.base import ClientService
6
+ from maleo_foundation.models.transfers.general.key import BaseKeyGeneralTransfers
7
+ from maleo_foundation.models.transfers.parameters.key import BaseKeyParametersTransfers
8
+ from maleo_foundation.models.transfers.results.key import BaseKeyResultsTransfers
9
+ from maleo_foundation.utils.exceptions import BaseExceptions
10
+
11
+ class MaleoFoundationKeyClientService(ClientService):
12
+ def create_private(self, parameters:BaseKeyParametersTransfers.CreatePrivateOrPair) -> BaseKeyResultsTypes.CreatePrivate:
13
+ """Create an RSA private key with X.509 encoding in .pem format."""
14
+ @BaseExceptions.service_exception_handler(
15
+ operation="creating private key",
16
+ logger=self._logger,
17
+ fail_result_class=BaseKeyResultsTransfers.Fail
18
+ )
19
+ def _impl():
20
+ #* Create private key
21
+ private_key = rsa.generate_private_key(
22
+ public_exponent=65537,
23
+ key_size=parameters.key_size,
24
+ backend=default_backend()
25
+ )
26
+
27
+ if parameters.password is None:
28
+ encryption_algorithm = serialization.NoEncryption()
29
+ else:
30
+ encryption_algorithm = serialization.BestAvailableEncryption(parameters.password.encode())
31
+
32
+ #* Serialize private key to PEM format
33
+ private_key_bytes = private_key.private_bytes(
34
+ encoding=serialization.Encoding.PEM,
35
+ format=serialization.PrivateFormat.PKCS8,
36
+ encryption_algorithm=encryption_algorithm
37
+ )
38
+
39
+ self._logger.info("Successfully created private key")
40
+ data = BaseKeyGeneralTransfers.PrivateKey(value=private_key_bytes.decode())
41
+ return BaseKeyResultsTransfers.CreatePrivate(data=data)
42
+ return _impl()
43
+
44
+ def create_public(self, parameters:BaseKeyParametersTransfers.CreatePublic) -> BaseKeyResultsTypes.CreatePublic:
45
+ """Create an RSA public key with X.509 encoding in .pem format."""
46
+ @BaseExceptions.service_exception_handler(
47
+ operation="creating public key",
48
+ logger=self._logger,
49
+ fail_result_class=BaseKeyResultsTransfers.Fail
50
+ )
51
+ def _impl():
52
+ #* Serialize private key
53
+ private_key_bytes = parameters.value.encode()
54
+ private_key = serialization.load_pem_private_key(
55
+ private_key_bytes,
56
+ password=parameters.password.encode() if parameters.password else None,
57
+ backend=default_backend()
58
+ )
59
+
60
+ public_key = private_key.public_key() #* Create public key
61
+
62
+ #* Serialize public key to PEM format
63
+ public_key_bytes = public_key.public_bytes(
64
+ encoding=serialization.Encoding.PEM,
65
+ format=serialization.PublicFormat.SubjectPublicKeyInfo
66
+ )
67
+
68
+ self._logger.info("Successfully created public key")
69
+ data = BaseKeyGeneralTransfers.PublicKey(value=public_key_bytes.decode())
70
+ return BaseKeyResultsTransfers.CreatePublic(data=data)
71
+ return _impl()
72
+
73
+ def create_pair(self, parameters:BaseKeyParametersTransfers.CreatePrivateOrPair) -> BaseKeyResultsTypes.CreatePair:
74
+ """Create an RSA key pair with X.509 encoding in .pem format."""
75
+ @BaseExceptions.service_exception_handler(
76
+ operation="creating key pair",
77
+ logger=self._logger,
78
+ fail_result_class=BaseKeyResultsTransfers.Fail
79
+ )
80
+ def _impl():
81
+ #* Create private key
82
+ private_key = rsa.generate_private_key(
83
+ public_exponent=65537,
84
+ key_size=parameters.key_size,
85
+ backend=default_backend()
86
+ )
87
+
88
+ if parameters.password is None:
89
+ encryption_algorithm = serialization.NoEncryption()
90
+ else:
91
+ encryption_algorithm = serialization.BestAvailableEncryption(parameters.password.encode())
92
+
93
+ #* Serialize private key to PEM format
94
+ private_key_bytes = private_key.private_bytes(
95
+ encoding=serialization.Encoding.PEM,
96
+ format=serialization.PrivateFormat.PKCS8,
97
+ encryption_algorithm=encryption_algorithm
98
+ )
99
+ private = BaseKeyGeneralTransfers.PrivateKey(value=private_key_bytes.decode())
100
+
101
+ public_key = private_key.public_key() #* Create public key
102
+
103
+ #* Serialize public key to PEM format
104
+ public_key_bytes = public_key.public_bytes(
105
+ encoding=serialization.Encoding.PEM,
106
+ format=serialization.PublicFormat.SubjectPublicKeyInfo
107
+ )
108
+ public = BaseKeyGeneralTransfers.PublicKey(value=public_key_bytes.decode())
109
+
110
+ self._logger.info("Successfully created key pair")
111
+ data = BaseKeyGeneralTransfers.KeyPair(private=private, public=public)
112
+ return BaseKeyResultsTransfers.CreatePair(data=data)
113
+ return _impl()
@@ -0,0 +1,18 @@
1
+ from typing import Union
2
+ from maleo_foundation.models.transfers.results.key import BaseKeyResultsTransfers
3
+
4
+ class BaseKeyResultsTypes:
5
+ CreatePrivate = Union[
6
+ BaseKeyResultsTransfers.Fail,
7
+ BaseKeyResultsTransfers.CreatePrivate
8
+ ]
9
+
10
+ CreatePublic = Union[
11
+ BaseKeyResultsTransfers.Fail,
12
+ BaseKeyResultsTransfers.CreatePublic
13
+ ]
14
+
15
+ CreatePair = Union[
16
+ BaseKeyResultsTransfers.Fail,
17
+ BaseKeyResultsTransfers.CreatePair
18
+ ]
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from pydantic import BaseModel, Field
3
+ from maleo_foundation.enums import BaseEnums
4
+ from maleo_foundation.types import BaseTypes
5
+
6
+ class BaseKeySchemas:
7
+ class KeySize(BaseModel):
8
+ key_size:int = Field(2048, ge=2048, le=16384, description="Key's size")
9
+
10
+ class Password(BaseModel):
11
+ password:BaseTypes.OptionalString = Field(None, min_length=32, max_length=1024, description="password")
12
+
13
+ class Key(BaseModel):
14
+ type:BaseEnums.KeyType = Field(..., description="Key's type")
15
+ value:str = Field(..., description="Key's value")
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+ from pydantic import BaseModel, Field
3
+ from maleo_foundation.enums import BaseEnums
4
+ from maleo_foundation.models.schemas.key import BaseKeySchemas
5
+
6
+ class BaseKeyGeneralTransfers:
7
+ class PrivateKey(BaseKeySchemas.Key):
8
+ type:BaseEnums.KeyType = Field(BaseEnums.KeyType.PRIVATE, description="Private key's type")
9
+
10
+ class PublicKey(BaseKeySchemas.Key):
11
+ type:BaseEnums.KeyType = Field(BaseEnums.KeyType.PUBLIC, description="Public key's type")
12
+
13
+ class KeyPair(BaseModel):
14
+ private:BaseKeyGeneralTransfers.PrivateKey = Field(..., description="Private key's data")
15
+ public:BaseKeyGeneralTransfers.PublicKey = Field(..., description="Public key's data")
@@ -0,0 +1,13 @@
1
+ from maleo_foundation.models.schemas.key import BaseKeySchemas
2
+ from maleo_foundation.models.transfers.general.key import BaseKeyGeneralTransfers
3
+
4
+ class BaseKeyParametersTransfers:
5
+ class CreatePrivateOrPair(
6
+ BaseKeySchemas.Password,
7
+ BaseKeySchemas.KeySize
8
+ ): pass
9
+
10
+ class CreatePublic(
11
+ BaseKeySchemas.Password,
12
+ BaseKeyGeneralTransfers.PrivateKey
13
+ ): pass
@@ -0,0 +1,16 @@
1
+ from __future__ import annotations
2
+ from pydantic import Field
3
+ from maleo_foundation.models.transfers.results.service.general import BaseServiceGeneralResultsTransfers
4
+ from maleo_foundation.models.transfers.general.key import BaseKeyGeneralTransfers
5
+
6
+ class BaseKeyResultsTransfers:
7
+ class Fail(BaseServiceGeneralResultsTransfers.Fail): pass
8
+
9
+ class CreatePrivate(BaseServiceGeneralResultsTransfers.SingleData):
10
+ data:BaseKeyGeneralTransfers.PrivateKey = Field(..., description="Private key data")
11
+
12
+ class CreatePublic(BaseServiceGeneralResultsTransfers.SingleData):
13
+ data:BaseKeyGeneralTransfers.PublicKey = Field(..., description="Private key data")
14
+
15
+ class CreatePair(BaseServiceGeneralResultsTransfers.SingleData):
16
+ data:BaseKeyGeneralTransfers.KeyPair = Field(..., description="Key pair data")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maleo_foundation
3
- Version: 0.1.76
3
+ Version: 0.1.77
4
4
  Summary: Foundation package for Maleo
5
5
  Author-email: Agra Bima Yuda <agra@nexmedis.com>
6
6
  License: MIT
@@ -5,8 +5,9 @@ maleo_foundation/enums.py,sha256=uvwl3dl2r6BoJMEbtSETiLoyJubHup9Lc7VOg7w7zQo,294
5
5
  maleo_foundation/extended_types.py,sha256=pIKt-_9tby4rmune3fmWcCW_mohaNRh_1lywBmdc-L4,301
6
6
  maleo_foundation/types.py,sha256=aKXnIgEhYGSfFqNMGLc4qIKGkINBRpkOo9R9cb2CbwI,2414
7
7
  maleo_foundation/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- maleo_foundation/client/manager.py,sha256=NYvy6jyrDGeAaSXafUHQailAeaQCkcCKMRIZ-uq8Bu8,2479
9
- maleo_foundation/client/services/__init__.py,sha256=IjTZw2T-1SCEtcxx1uMjD00HVeQoPDIXs9m7qdCQ5Vo,888
8
+ maleo_foundation/client/manager.py,sha256=pFWLFYW4eE9MLyFmFS05IgnMBdqqUHbdyTkSbnBtm5E,2620
9
+ maleo_foundation/client/services/__init__.py,sha256=uIBnAeQ9a2otQbUAbKBQfYrkEUugXjxXoV8W5QYHuic,1051
10
+ maleo_foundation/client/services/key.py,sha256=RtbLlbdafsl_LKgqbcZjkvj9Is37wTsll2s9oQdSBS8,5306
10
11
  maleo_foundation/client/services/signature.py,sha256=ePO0T9cJ8BIIYbFw2ZJSW4MUM96Sk-Vu-ha0X7XTSGw,4300
11
12
  maleo_foundation/client/services/token.py,sha256=p1cA60ofeFJeL2MVKnAjnggIFniVSp2Hbd7VTYE255E,3880
12
13
  maleo_foundation/client/services/encryption/__init__.py,sha256=qK9-RwivJ2xkMIwXI8XM8LmYboRTX6R3G9Nh3RxSdCM,594
@@ -20,6 +21,7 @@ maleo_foundation/expanded_types/__init__.py,sha256=lm_r7rxlLA0sgSTGQBMR9ZbZbVDpD
20
21
  maleo_foundation/expanded_types/client.py,sha256=To0kRXp3QTmuSu5rWKaCiTsMK9qkYiyYKYbHfw-y1fY,2396
21
22
  maleo_foundation/expanded_types/general.py,sha256=bjIBREYTS73tvS-Key7P7db82a2HHlSJ1XBAvKuYmT0,826
22
23
  maleo_foundation/expanded_types/hash.py,sha256=KERzp_Gl2Z7urcw8i0ab1MXxU_BIlCY9V5d8X4Edq5s,344
24
+ maleo_foundation/expanded_types/key.py,sha256=pn3HWvSBg63j_84UqHbkfRCf5vj10OyOrlzIDMuvjj4,479
23
25
  maleo_foundation/expanded_types/query.py,sha256=0yUG-JIVsanzB7KAkrRz_OsrhP6J0bRqD9Q3l3atQnk,2384
24
26
  maleo_foundation/expanded_types/service.py,sha256=q8jpKdbCbLWwH1UPQavKpVE14rC5rveduk2cFWzuhGw,2416
25
27
  maleo_foundation/expanded_types/signature.py,sha256=zNgXRrxVCfEIGXsRANIa1Ljj-ebHjC2pWOTtw_ABJlQ,379
@@ -48,17 +50,20 @@ maleo_foundation/models/schemas/__init__.py,sha256=Xj8Ahsqyra-fmEaVcGPok5GOOsPQl
48
50
  maleo_foundation/models/schemas/encryption.py,sha256=6fZU8uadQp-2pLAChuYAVoG7sAm7BuCea79QxuV-wYo,647
49
51
  maleo_foundation/models/schemas/general.py,sha256=KGPP67ciKeL8cvOS3kYrVwmRx3kD33OcS88UmMn1JPE,3822
50
52
  maleo_foundation/models/schemas/hash.py,sha256=ieRrAwp9ssYP74xQybv1_gT2gDyAcXLNMwqbYEcLwvg,430
53
+ maleo_foundation/models/schemas/key.py,sha256=7FZxVqTL5qRK48AXL1odrMNhAwhwtCwSkBUPsJwuBII,594
51
54
  maleo_foundation/models/schemas/parameter.py,sha256=K47z2NzmTEhUiOfRiRLyRPXoQurbWsKBL7ObXAxIWRY,2100
52
55
  maleo_foundation/models/schemas/result.py,sha256=V3dljS2AdtWW4Pf8YsnQuiCylN1bZtEY1AtYC7okWuI,1747
53
56
  maleo_foundation/models/schemas/signature.py,sha256=4DVcsBR9TnxD2R28oWk51jMtF1j5ylmorVM3jDNVlrU,609
54
57
  maleo_foundation/models/schemas/token.py,sha256=u71kPXJyCxqn_INK05MSNFhQr9MaLfQM-icYc536xik,551
55
58
  maleo_foundation/models/transfers/__init__.py,sha256=oJLJ3Geeme6vBw7R2Dhvdvg4ziVvzEYAGJaP-tm_90w,299
56
59
  maleo_foundation/models/transfers/general/__init__.py,sha256=0yW67vJvKgJmZ9htteOVatG7mb-YEpHF62dpwH2g_Bk,146
60
+ maleo_foundation/models/transfers/general/key.py,sha256=GLwNLvNoe7mtjJjfS-WdG1cH32z_4R0N_uFhBvoybis,718
57
61
  maleo_foundation/models/transfers/general/signature.py,sha256=EFcr-QC3QcDLZivkmL89ERVc5ZDGe_SYH5dMItll5Bs,264
58
62
  maleo_foundation/models/transfers/general/token.py,sha256=QZNGG5DdmQDTYIqNFMqBQDJoeahIHgzBzyXiMoTS-JA,2414
59
63
  maleo_foundation/models/transfers/parameters/__init__.py,sha256=oKW4RPIEISISRjsJzD8lsCGY1HhZRTzshPpWHcJu86k,353
60
64
  maleo_foundation/models/transfers/parameters/client.py,sha256=tn_Hwa-k-Utp5rODe7GylqZB8djIKKupgkUFscYCyLc,4059
61
65
  maleo_foundation/models/transfers/parameters/general.py,sha256=WoekZJCIoAllhXdRIJkNRdNq0QEIn0bteiHJLtzkCxU,579
66
+ maleo_foundation/models/transfers/parameters/key.py,sha256=smDAjgSOGXQ8elEUA9cChw2TaZb3k14xOS64Qms3s3M,399
62
67
  maleo_foundation/models/transfers/parameters/service.py,sha256=d7Xy_R-DtLBRozyD6r8YnTiuKlE3sb9HMDCCq9WmUbY,6757
63
68
  maleo_foundation/models/transfers/parameters/signature.py,sha256=Kn6gJrQUHyn2uG6LyYnhbUEMfXJVTLgMG6n3CXZ4hu8,395
64
69
  maleo_foundation/models/transfers/parameters/token.py,sha256=WTmCKoP-KJLqZjdwr__BeVnBrnRrsxzHSQ0IBaOKvqw,535
@@ -71,6 +76,7 @@ maleo_foundation/models/transfers/parameters/hash/hmac.py,sha256=vCEVQPh51wXrbOf
71
76
  maleo_foundation/models/transfers/parameters/hash/sha256.py,sha256=tc2j-BKJYeLYuwXS19kOsvwTsiMWyWDFORB0vIV0imM,245
72
77
  maleo_foundation/models/transfers/results/__init__.py,sha256=0_8uJ1IQW87RZ4nIxzWkQVi3Fxb7B8myZTngXfoxgNc,241
73
78
  maleo_foundation/models/transfers/results/hash.py,sha256=W8JMmL1YZsRxpnPsWJEM-RL2LypMgs4A_R3RAGHIolQ,605
79
+ maleo_foundation/models/transfers/results/key.py,sha256=evVH-KfaNRxQdX31lOJdrYiMLp46o1WVgNFgBM7nCSM,829
74
80
  maleo_foundation/models/transfers/results/signature.py,sha256=md3tBOfjJlg-35ICSt8h_EZZett_x7obdlx_GQ3lB00,619
75
81
  maleo_foundation/models/transfers/results/token.py,sha256=4zDgj8FWGK6Rcz_pprwnLcpRyyXKRBPbrCl3IOrRvVg,574
76
82
  maleo_foundation/models/transfers/results/client/__init__.py,sha256=xBRuY0NUIPpQEGQ2qoBnqLZGX4W1YSrQ0VnDf5OYJBo,290
@@ -99,7 +105,7 @@ maleo_foundation/utils/loaders/json.py,sha256=NsXLq3VZSgzmEf99tV1VtrmiudWdQ8Pzh_
99
105
  maleo_foundation/utils/loaders/yaml.py,sha256=jr8v3BlgmRCMTzdNgKhIYt1tnubaJXcDSSGkKVR8pbw,362
100
106
  maleo_foundation/utils/loaders/key/__init__.py,sha256=G03cA_Oxu02uDsg0WBPfPkIM2uUsxnjwOPgtBKe02kc,110
101
107
  maleo_foundation/utils/loaders/key/rsa.py,sha256=gDhyX6iTFtHiluuhFCozaZ3pOLKU2Y9TlrNMK_GVyGU,3796
102
- maleo_foundation-0.1.76.dist-info/METADATA,sha256=e0ynWXIw0cKzJZp7wjbqUfbgty_LUb2mL_uBaOU7DSM,3419
103
- maleo_foundation-0.1.76.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
104
- maleo_foundation-0.1.76.dist-info/top_level.txt,sha256=_iBos3F_bhEOdjOnzeiEYSrCucasc810xXtLBXI8cQc,17
105
- maleo_foundation-0.1.76.dist-info/RECORD,,
108
+ maleo_foundation-0.1.77.dist-info/METADATA,sha256=aghCWBHf3ZaF2o6gUDHlVeEnQIw-iZjT16rbEdluO-E,3419
109
+ maleo_foundation-0.1.77.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
110
+ maleo_foundation-0.1.77.dist-info/top_level.txt,sha256=_iBos3F_bhEOdjOnzeiEYSrCucasc810xXtLBXI8cQc,17
111
+ maleo_foundation-0.1.77.dist-info/RECORD,,