Skip to content

Commit e722b29

Browse files
committed
Add PKINIT structures for AS-REP
1 parent aef0fb2 commit e722b29

4 files changed

Lines changed: 64 additions & 14 deletions

File tree

scapy/asn1/mib.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ def load_mib(filenames):
587587
# ansi-x942 #
588588

589589
x942KeyType_oids = {
590-
"1.2.840.10046.2.1": "szOID_ANSI_x942_DH", # RFC3770 sect 4.1.1
590+
"1.2.840.10046.2.1": "dhpublicnumber", # RFC3770 sect 4.1.1
591591
}
592592

593593
# elliptic curves #

scapy/layers/kerberos.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
import scapy.asn1.mib # noqa: F401
6161
from scapy.asn1.ber import BER_id_dec, BER_Decoding_Error
6262
from scapy.asn1.asn1 import (
63-
ASN1_OID,
6463
ASN1_BIT_STRING,
6564
ASN1_BOOLEAN,
6665
ASN1_Class,
@@ -71,21 +70,22 @@
7170
ASN1_Codecs,
7271
)
7372
from scapy.asn1fields import (
73+
ASN1F_BIT_STRING_ENCAPS,
7474
ASN1F_BOOLEAN,
7575
ASN1F_CHOICE,
76+
ASN1F_enum_INTEGER,
7677
ASN1F_FLAGS,
7778
ASN1F_GENERAL_STRING,
7879
ASN1F_GENERALIZED_TIME,
7980
ASN1F_INTEGER,
8081
ASN1F_OID,
82+
ASN1F_optional,
8183
ASN1F_PACKET,
82-
ASN1F_SEQUENCE,
8384
ASN1F_SEQUENCE_OF,
84-
ASN1F_STRING,
85+
ASN1F_SEQUENCE,
8586
ASN1F_STRING_ENCAPS,
8687
ASN1F_STRING_PacketField,
87-
ASN1F_enum_INTEGER,
88-
ASN1F_optional,
88+
ASN1F_STRING,
8989
)
9090
from scapy.asn1packet import ASN1_Packet
9191
from scapy.automaton import Automaton, ATMT
@@ -149,7 +149,7 @@
149149
_CMS_ENCAPSULATED,
150150
CMS_ContentInfo,
151151
CMS_IssuerAndSerialNumber,
152-
CMS_SignedData,
152+
DHPublicKey,
153153
X509_AlgorithmIdentifier,
154154
X509_DirectoryName,
155155
X509_SubjectPublicKeyInfo,
@@ -1238,10 +1238,7 @@ class PA_PK_AS_REQ(ASN1_Packet):
12381238
ASN1_root = ASN1F_SEQUENCE(
12391239
ASN1F_STRING_ENCAPS(
12401240
"signedAuthpack",
1241-
CMS_ContentInfo(
1242-
contentType=ASN1_OID("id-signedData"),
1243-
content=CMS_SignedData(),
1244-
),
1241+
CMS_ContentInfo(),
12451242
CMS_ContentInfo,
12461243
implicit_tag=0x80,
12471244
),
@@ -1357,7 +1354,12 @@ class AuthPack(ASN1_Packet):
13571354
class DHRepInfo(ASN1_Packet):
13581355
ASN1_codec = ASN1_Codecs.BER
13591356
ASN1_root = ASN1F_SEQUENCE(
1360-
ASN1F_STRING("dhSignedData", "", implicit_tag=0xA0),
1357+
ASN1F_STRING_ENCAPS(
1358+
"dhSignedData",
1359+
CMS_ContentInfo(),
1360+
CMS_ContentInfo,
1361+
implicit_tag=0x80,
1362+
),
13611363
ASN1F_optional(
13621364
ASN1F_STRING("serverDHNonce", "", explicit_tag=0xA1),
13631365
),
@@ -1385,6 +1387,22 @@ class PA_PK_AS_REP(ASN1_Packet):
13851387

13861388
_PADATA_CLASSES[17] = PA_PK_AS_REP
13871389

1390+
1391+
class KDCDHKeyInfo(ASN1_Packet):
1392+
ASN1_codec = ASN1_Codecs.BER
1393+
ASN1_root = ASN1F_SEQUENCE(
1394+
ASN1F_BIT_STRING_ENCAPS(
1395+
"subjectPublicKey", DHPublicKey(), DHPublicKey, explicit_tag=0xA0
1396+
),
1397+
UInt32("nonce", 0, explicit_tag=0xA1),
1398+
ASN1F_optional(
1399+
KerberosTime("dhKeyExpiration", None, explicit_tag=0xA2),
1400+
),
1401+
)
1402+
1403+
1404+
_CMS_ENCAPSULATED["1.3.6.1.5.2.3.2"] = KDCDHKeyInfo
1405+
13881406
# [MS-SFU]
13891407

13901408

scapy/layers/x509.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,8 @@ class RSAPrivateKey(ASN1_Packet):
118118
RSAOtherPrimeInfo)))
119119

120120
####################################
121-
# Old Diffie Hellman Packets #
121+
# Diffie Hellman Packets #
122122
####################################
123-
124123
# From X9.42 (or RFC3279)
125124

126125
class ValidationParms(ASN1_Packet):
@@ -144,6 +143,11 @@ class DomainParameters(ASN1_Packet):
144143
)
145144

146145

146+
class DHPublicKey(ASN1_Packet):
147+
ASN1_codec = ASN1_Codecs.BER
148+
ASN1_root = ASN1F_INTEGER("y", 0)
149+
150+
147151
####################################
148152
# ECDSA packets #
149153
####################################
@@ -868,6 +872,10 @@ def __init__(self, **kargs):
868872
ECDSAPublicKey(),
869873
ECDSAPublicKey),
870874
lambda pkt: "ecPublicKey" == pkt.signatureAlgorithm.algorithm.oidname), # noqa: E501
875+
(ASN1F_BIT_STRING_ENCAPS("subjectPublicKey",
876+
DHPublicKey(),
877+
DHPublicKey),
878+
lambda pkt: "dhpublicnumber" == pkt.signatureAlgorithm.algorithm.oidname), # noqa: E501
871879
(ASN1F_PACKET("subjectPublicKey",
872880
EdDSAPublicKey(),
873881
EdDSAPublicKey),

test/scapy/layers/kerberos.uts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,30 @@ assert authpack.pkAuthenticator.freshnessToken is None
214214
assert authpack.pkAuthenticator.paChecksum2.checksum.val.hex() == "5aeb03e889e99fcd6c205ef484b9dd7b462b9e94c3fe68b115a71cd287fcd775"
215215
assert authpack.pkAuthenticator.paChecksum2.algorithmIdentifier.algorithm.oidname == "sha256"
216216

217+
= PKINIT - Parse AS-REP with CMS structures (MIT Kerberos)
218+
219+
from scapy.layers.tls.cert import Cert
220+
221+
pkt = Kerberos(bytes.fromhex('6b82109730821093a003020105a10302010ba2820987308209833082097fa103020111a282097604820972a082096e3082096a808209663082096206092a864886f70d010702a08209533082094f020103310f300d060960864801650304020105003082012b06072b060105020302a082011e0482011a30820116a082010a03820106000282010100ffb1e474ea4bb6c9248cec29ddf54feac8bf6a3261fd25dfc32e258e0056fb2caf4fb76f90961d706b98c0b16fedadf049aa2c3dda6e5eb42933828b932b8dd10f2e00caa1eb2901df080805fbe8d00cae67e9e35e9c197c362416d09fbfa5ef10e556b7993c7501566156dd431e5ae35eb9d00b86ec529b1af887b7671de382ddf4ec2ce87d71fe1ab3fa6d0338bb9c9d2794feba33356b149bc3d1745f4f2feca0ae97f62aaf3314fa1464c844fc016dd82e3008e2cd3cc762d0cc264981497342820f8c8f4aef29147346aea727cc24c3e64f474a5a2448325123d8d217fb65eaabbb7aab36db0e905e5df46de3686bc94581580924f0226385d2db6c599ca10602044e744899a08206303082062c30820514a00302010202131b00000003b9cb9e577efbe605000000000003300d06092a864886f70d01010b0500304731153013060a0992268993f22c64011916054c4f43414c31163014060a0992268993f22c6401191606444f4d41494e311630140603550403130d444f4d41494e2d4443312d4341301e170d3235303932303232313232395a170d3236303932303232313232395a301b31193017060355040313104443312e444f4d41494e2e4c4f43414c30820122300d06092a864886f70d01010105000382010f003082010a0282010100e6832a3e3ca595057e9f70733d34ea5153e4769dc95eb98d56d7b28e8c0390cdd7bfecf01b5f12931afe8d0a1c2e69b83466b3f8ef88c4b31f2c0a49bcee9fb7b78a7e71c6c69c260e606b96d9d2ba534430c6b5cd3be7ef98110e92a0175b66b0b501d32a39dc17f30033fd0c8fa508e5c781c2d130bc8dfd7cb3a8982bd65c16a15f175e7205337dd17b6f4358644db4e6ad3a0f83a2c605275ef0cf4ca2cf974386283d141f4fb0b1f6d72720b83e4155bd0ac39f6ca7723ca317ae6340f746b4c82195addce715e31928ee0e67cb357d3200ee0b26ee422008c8c3de5c1a5acae88e10c89edff4ccd8543f6eaa551c15ed5d8e756567e39c5d56edb948fd0203010001a382033b30820337302f06092b060104018237140204221e200044006f006d00610069006e0043006f006e00740072006f006c006c00650072301d0603551d250416301406082b0601050507030206082b06010505070301300e0603551d0f0101ff0404030205a0307806092a864886f70d01090f046b3069300e06082a864886f70d030202020080300e06082a864886f70d030402020080300b060960864801650304012a300b060960864801650304012d300b0609608648016503040102300b0609608648016503040105300706052b0e030207300a06082a864886f70d0307301d0603551d0e041604148994b7358e085091a011cd226c9305cdcb6b82a2301f0603551d23041830168014ab14d5ae948281f079726970b3b8f97003aa760c3081c80603551d1f0481c03081bd3081baa081b7a081b48681b16c6461703a2f2f2f434e3d444f4d41494e2d4443312d43412c434e3d4443312c434e3d4344502c434e3d5075626c69632532304b657925323053657276696365732c434e3d53657276696365732c434e3d436f6e66696775726174696f6e2c44433d444f4d41494e2c44433d4c4f43414c3f63657274696669636174655265766f636174696f6e4c6973743f626173653f6f626a656374436c6173733d63524c446973747269627574696f6e506f696e743081c006082b060105050701010481b33081b03081ad06082b060105050730028681a06c6461703a2f2f2f434e3d444f4d41494e2d4443312d43412c434e3d4149412c434e3d5075626c69632532304b657925323053657276696365732c434e3d53657276696365732c434e3d436f6e66696775726174696f6e2c44433d444f4d41494e2c44433d4c4f43414c3f634143657274696669636174653f626173653f6f626a656374436c6173733d63657274696669636174696f6e417574686f72697479303c0603551d1104353033a01f06092b0601040182371901a01204101d9d5575a78e1740b7be50767138da8c82104443312e444f4d41494e2e4c4f43414c304f06092b060104018237190204423040a03e060a2b060104018237190201a030042e532d312d352d32312d313332323235373836362d343033353133333636322d313134303736393232322d31303030300d06092a864886f70d01010b05000382010100205571d8ddc2bbb8cfd56b0fbb8d8b6e38ce376c76135f51f25c3f3a98094d59fee193d678b1ff310effa092985394e84ff033094c1889309e29146d239178e2171e192a7c3ae0ce6c653790f9bef3f3281a238c264c5a944e13fa3e97b7ee21e0c22a74b8ab81f4d0d7dc9a592f55efad413ab5041b123f622537e13733eeda845541e5ff8c9973dc5b482701d579f53c67a5ac3fed6c37b1501154d17661f70a252211e9e320269ab7e468bf3d1f1d65f106818122d05d4e2d4db03f1670f66fd9e711970886c7dae937184256023782771d579795d1c331ecd737d0e9d7bb1b4ca24606302bc9c7c10d8aebcfc8a4a2d6beb3fbd3abf14c2680f665f04e35318201d4308201d0020101305e304731153013060a0992268993f22c64011916054c4f43414c31163014060a0992268993f22c6401191606444f4d41494e311630140603550403130d444f4d41494e2d4443312d434102131b00000003b9cb9e577efbe605000000000003300d06096086480165030402010500a049301606092a864886f70d010903310906072b060105020302302f06092a864886f70d010904312204200916c67ea99156a2738927fc51c6ebee43cdb65d715406d1fb6d40daf49c65ca300d06092a864886f70d0101010500048201007fa8498cf70e6f0f9763eaba1f050dda9ca79d343e93312319a457f157586ea849584da69ae8a3ffe26171a9a8cbd3a4b39fb7c8959ebadf42a69c4c626abcd59aac719042b2b9c90ea81bb7593618641d2b498cd6bd65322ed3dcde8895a68b0889c804ce8526cfee27d664a3cd0cc9f1a74531d029cafe4de15bb14bb4d36659fe276f126cccf421c91db7d5be02fb8185cd0de03bee08f424fc48cb4c3f4294f3225752c09abc33ca358b43b5cf3b7df109e37051f757e08a3caaad1d77d9f310a9bd8ea263a00431b57bf4b37c3b0f998a47209a406531c8fa3ff0fd4aec04e3574b2485bc6ac01d077064b67846a71600b65ff6d417441e034c7bd080eca30e1b0c444f4d41494e2e4c4f43414ca41a3018a003020101a111300f1b0d41646d696e6973747261746f72a58205806182057c30820578a003020105a10e1b0c444f4d41494e2e4c4f43414ca221301fa003020102a11830161b066b72627467741b0c646f6d61696e2e6c6f63616ca382053c30820538a003020112a103020102a282052a04820526690c97f510509c672dac4e1436da9aeb5ac4fde72b75b5c1fcfab03aef11139b30b9d32b62f9c4de8e97bc5148563c5bc5fb031e1b1869c69c2991778190d7f27eeeac2ba5e59b54b1b10af66e526fced04f1dd7edd81da93984962183a50e39f82d6f90c9cc9441fec556432ec776a4b595c459cdcfe45489d360f6c950185af170a24897a4eb1127f9c85772fe0417733b254604cd704a15993b77ac18fb1fd8fddb9e888f8c05ffd4c7a5e519593c9e7588c92345ca6ca2e04f0c83231bcc90adccb189e98c2afd53bdb8e665f91d5c3aafde51c60e9b42e88de76261060090483a8dc2d129b66cc3890524004295b5ba440c0a00b352ce91616df2c9a0153e5fd072a9a356dba5e44d79c032afc4d985a180d8fb1f9bba46be602a73ba7c4098683d6ffac4e456b0e51e9473f8ff40e50b437d370b087e1d41089d9f382a17e212d13244f95ad1fb629769c5d53b2ade80c6690fa845efb590a2c6e81851ea9ca1ba319c3a8f86bc62bbcbabf3ecc39d3f6988157a4c390ada2f42b7c577438bcfdb4136bbff92c3c32eb22213e14c51de330f4df4d493bcaa322a3eea01fe504bd03c18786ed385ca205af4396eb6c7b1cfa0e13bcf3e00452461b5c1f9761ef5edb35cfa79fdea04a5420b9762d6f2cf74d694b35c812ba62620c4e6e90ee6483768e38fa0011706d2c093a22202707c5c90cf3ea4c4f17c017f9d7e85a7cc555bf9c9bd4c1337282b5de0395d123ca25c2a9c9eca5cdc31dfd54db75f43eadadd7c7e3a3611a6c1a806c7ff5b0d0b102155978c745a9b4a022018009641ad9197492de70dee4248d159a2b2c5d6adbf253ac04dbe5713cf2878ef440aa68989b2655687a7b35f6a547a8c5a076004c58baa1b231bec7501f5f5bb9f1c66c8cc22d35641cd4442244f349d0351263bb2f1e11b4f4ec26044c87f93a1a963649f5be7a8d61306fe47a10427ac14ba6b9b09ec69950e5176e933cc1fdce258c62ccae4011e8eccab0a36b9ac1d21d36df38c32d65f438d25defa0eb5c577f5f2458304679a9934796be00d3335b7fee1f7616768f0547bd949b764ed2b4684951b35b57a7168fe79d8cd7580dfecddbc30afb8d47032f12cc5b2ee1c16a731dd977f2476989f465fdf6e08992ba566264d1e0a8f0f7274533293e2aa1c418397dc89f9f48d5d9dc3cd82548327be0ebc9b3edeb00f6cf0df8b339d10daae5bb02e9572881fbc5246d5db408fd9cf16209a4ef6b2fc6765d9d9092054b362494be360847b12927ea2fd73b89d345c22fe662f2096952edb69983f147eee5635f40c0bd7bca09b61f644a9df3ecccd0fd0d9c245b4fb224e415bfd58637d341214bc8b2e962df1e7845da642ee4b7a5343c8cee746f6da89cbe3c89f278c6d42f9a743d97ad2c767f1514458db99ca5f29175609e3a7a704b21de8c3cee0646eb60dfb5ddf6824008232dcbdf81b76b941c8af5c0788384bf61f694d80a00b9dc28ae8b0ff782d0b7fcefd60114518401534974c59b88ca89bb4f4a2a5e6e71d7f08342f830338981f534a1affc8ad28b9ec8c54b64321aaafb1d7f049719fda712def001492d6d404bf1da6043687f82378857453b0539a6cd7f452f4b789944a0ca6f238fd321687ac0685a81c9e77f113b7f5c1de3fba74b88f4e0c6cec90e230f16099f9fdb74c57879a98e4a1a85ad672021afc9199fba18c82a7e57c5655ee8d9e8e9cb6d31bc3920d7dbfe667c315b971f99ce2a3579cd1de9d7bd096dc443a1c0dc92e5f7e83657cf38020495585427720ecac4519162cced74d48c294fdb11086e97585d1a9bfaef4af44691f34341fb5e1f42113f82b597bc3e5f5e877116df8a682014a30820146a003020112a282013d048201396d08189c79793463088601b1497f77742a2980900f4c872aa340d07b36c4ff9f9b97740c6f18a15b2277c9c27f1ae7bad8a5899952ca36d3c2d0aa1e6c3137be54a8db29da9d4af03d72f7b9aea0b9f0a099a2421368e875b3cf6fc85454502e74635dd4683b061914c713cb2c551d8a46fdc47bd784c1d2925374cd0f48d4f917ca073563fe570f55f72d64f2de1776bc38e3aa79f0571ad7c64247d80d83fa3bef9f53dc3454634b78a5f207f01160fdd8a8ff4dbdfe2a2d46ccbf84eaf45299b9379b99a1eec016c143d3dc08dc3d9599e5aa62cdf5dc016fab8deba39d81c4d6c5eea684532bb6697ab61ab88d8ac43c5e36bcadd380b31d19dd8475ee68369ff5d8db5cf7733aafe82d96cc2ab68112216d37c44ddb37b336483d75f0566a713cd508a0c66ab7f13d70541e79e8d2038b42a415416d7d'))
222+
assert isinstance(pkt.root.padata[0].padataValue, PA_PK_AS_REP)
223+
224+
pk_preauth_resp = pkt.root.padata[0].padataValue
225+
assert isinstance(pk_preauth_resp.rep, DHRepInfo)
226+
227+
dhrep = pk_preauth_resp.rep
228+
assert dhrep.kdf is None
229+
assert dhrep.serverDHNonce is None
230+
231+
dhkeyinfo = dhrep.dhSignedData.content.encapContentInfo.eContent
232+
assert dhkeyinfo.subjectPublicKey.y.val == 32278489782659599666680674691617740192025480882925125716566496945858046289374524666228146919540757354337943084659625408278197912527087491522001624804516413386428300641892927787473470630419131055568103619174060490124485923206334065346522123445748745649691028061114330596909397680493778434408463632147264526545631660227144914565541288496092534758943967886391259750733078319727386349536272439561387290863606045665780539098807180454586714490639623651326318384483940150461818440884045020628878002871357420738487965588236164888287449564150835059541717449563619851058161535035543798732468578054040817729345202791857657764252
233+
assert dhkeyinfo.nonce == 0x4e744899
234+
235+
certificates = dhrep.dhSignedData.content.certificates
236+
assert len(certificates) == 1
237+
cert = Cert(certificates[0].certificate)
238+
assert cert.issuer_str == '/CN=DOMAIN-DC1-CA/dc=DOMAIN'
239+
assert cert.subject_str == '/CN=DC1.DOMAIN.LOCAL'
240+
217241
+ Advanced Kerberos tests
218242

219243
= Test Kerberos InnerToken wrapping (ancient RFC1964)

0 commit comments

Comments
 (0)