Skip to content

Commit 11fe632

Browse files
author
SkelSec
committed
adding better secrets loading
1 parent d22a2b0 commit 11fe632

File tree

3 files changed

+57
-18
lines changed

3 files changed

+57
-18
lines changed

minikerberos/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
__version__ = "0.3.1"
2+
__version__ = "0.3.2"
33
__banner__ = \
44
"""
55
# minikerberos %s

minikerberos/common/creds.py

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,21 @@
2424
from oscrypto.asymmetric import rsa_pkcs1v15_sign, load_private_key
2525
from oscrypto.keys import parse_pkcs12, parse_certificate, parse_private
2626

27-
27+
def get_encoded_data(data:bytes|str, encoding = 'file') -> bytes:
28+
if encoding == 'file':
29+
with open(data, 'rb') as kf:
30+
return kf.read()
31+
elif encoding == 'hex':
32+
return bytes.fromhex(data)
33+
elif encoding == 'b64' or encoding == 'base64':
34+
if isinstance(data, str):
35+
data = data.encode()
36+
return base64.b64decode(data)
37+
elif encoding == 'raw':
38+
if isinstance(data, str):
39+
data = data.encode()
40+
return data
41+
raise Exception('Unknown encoding "%s"!' % encoding)
2842

2943
class KerberosCredential:
3044
def __init__(self):
@@ -116,6 +130,9 @@ def get_key_for_enctype(self, etype:EncryptionType, salt:bytes = None) -> bytes:
116130
raise Exception('Unsupported encryption type: %s' % etype.name)
117131

118132
def get_supported_enctypes(self, as_int = True) -> List[EncryptionType]:
133+
"""
134+
Returns a list of all EncryptionTypes this credentials can use for authentication
135+
"""
119136
supp_enctypes = collections.OrderedDict()
120137
if self.kerberos_key_aes_256:
121138
supp_enctypes[EncryptionType.AES256_CTS_HMAC_SHA1_96] = 1
@@ -146,20 +163,50 @@ def get_supported_enctypes(self, as_int = True) -> List[EncryptionType]:
146163
if as_int == True:
147164
return [etype.value for etype in supp_enctypes]
148165
return [etype for etype in supp_enctypes]
149-
166+
150167
@staticmethod
151-
def from_krbcred(keytab_file_path: str, principal: str = None, realm: str = None) -> KerberosCredential:
152-
return KerberosCredential.from_kirbi(keytab_file_path, principal, realm)
168+
def from_keytab(keytab_file_path: str, principal: str, realm: str, encoding = 'file') -> KerberosCredential:
169+
"""Returns a kerberos credential object from Keytab file/data"""
170+
cred = KerberosCredential()
171+
cred.username = principal
172+
cred.domain = realm
173+
data = get_encoded_data(keytab_file_path, encoding=encoding)
174+
return KerberosCredential.from_keytab_string(data, principal, realm)
175+
176+
@staticmethod
177+
def from_ccache(data, principal: str = None, realm: str = None, encoding = 'file') -> KerberosCredential:
178+
"""Returns a kerberos credential object with CCACHE database"""
179+
data = get_encoded_data(data, encoding=encoding)
180+
k = KerberosCredential()
181+
k.username = principal
182+
k.domain = realm
183+
k.ccache = CCACHE.from_bytes(data)
184+
return k
153185

154186
@staticmethod
155-
def from_kirbi(keytab_file_path: str, principal: str = None, realm: str = None) -> KerberosCredential:
187+
def from_kirbi(keytab_file_path: str, principal: str = None, realm: str = None, encoding = 'file') -> KerberosCredential:
188+
"""Returns a kerberos credential object from .kirbi file"""
189+
data = get_encoded_data(keytab_file_path, encoding=encoding)
156190
cred = KerberosCredential()
157191
cred.username = principal
158192
cred.domain = realm
159-
cred.ccache = CCACHE.from_kirbifile(keytab_file_path)
193+
cred.ccache = CCACHE.from_kirbi(data)
160194
cred.ccache_spn_strict_check = False
161195
return cred
162-
196+
197+
@staticmethod
198+
def from_pfx(data:str, password:str, dhparams:DirtyDH = None, username:str = None, domain:str = None, encoding = 'file') -> KerberosCredential:
199+
"""
200+
Retruns a credential object from data found in the PFX file
201+
Username and domain will override the values found in the certificate
202+
"""
203+
data = get_encoded_data(data, encoding=encoding)
204+
return KerberosCredential.from_pfx_string(data, password, dhparams = dhparams, username = username, domain = domain)
205+
206+
@staticmethod
207+
def from_krbcred(keytab_file_path: str, principal: str = None, realm: str = None) -> KerberosCredential:
208+
return KerberosCredential.from_kirbi(keytab_file_path, principal, realm)
209+
163210
@staticmethod
164211
def from_keytab_string(self, keytabdata: str|bytes, principal: str, realm: str) -> KerberosCredential:
165212
cred = KerberosCredential()
@@ -195,17 +242,9 @@ def from_keytab_string(self, keytabdata: str|bytes, principal: str, realm: str)
195242

196243
return cred
197244

198-
@staticmethod
199-
def from_keytab(keytab_file_path: str, principal: str, realm: str) -> KerberosCredential:
200-
cred = KerberosCredential()
201-
cred.username = principal
202-
cred.domain = realm
203-
204-
with open(keytab_file_path, 'rb') as kf:
205-
return KerberosCredential.from_keytab_string(kf.read(), principal, realm)
206-
207245
@staticmethod
208246
def from_ccache_file(filepath, principal: str = None, realm: str = None) -> KerberosCredential:
247+
"""Depricated! Use from_ccache with proper encoding instead!"""
209248
k = KerberosCredential()
210249
k.username = principal
211250
k.domain = realm

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
install_requires=[
4747
'asn1crypto>=1.3.0',
4848
'oscrypto>=1.2.1',
49-
'asysocks>=0.2.0',
49+
'asysocks>=0.2.2',
5050
'unicrypto>=0.0.8',
5151
],
5252

0 commit comments

Comments
 (0)