| 1367 | |
| 1368 | |
| 1369 | class KRB_PKAuthenticator(ASN1_Packet): |
| 1370 | ASN1_codec = ASN1_Codecs.BER |
| 1371 | ASN1_root = ASN1F_SEQUENCE( |
| 1372 | Microseconds("cusec", 0, explicit_tag=0xA0), |
| 1373 | KerberosTime("ctime", GeneralizedTime(), explicit_tag=0xA1), |
| 1374 | UInt32("nonce", 0, explicit_tag=0xA2), |
| 1375 | ASN1F_optional( |
| 1376 | ASN1F_STRING("paChecksum", "", explicit_tag=0xA3), |
| 1377 | ), |
| 1378 | # RFC8070 extension |
| 1379 | ASN1F_optional( |
| 1380 | ASN1F_STRING("freshnessToken", None, explicit_tag=0xA4), |
| 1381 | ), |
| 1382 | # [MS-PKCA] sect 2.2.3 |
| 1383 | ASN1F_optional( |
| 1384 | ASN1F_PACKET("paChecksum2", PAChecksum2(), PAChecksum2, explicit_tag=0xA5), |
| 1385 | ), |
| 1386 | ) |
| 1387 | |
| 1388 | def make_checksum(self, text, h="sha256"): |
| 1389 | """ |
| 1390 | Populate paChecksum and paChecksum2 |
| 1391 | """ |
| 1392 | # paChecksum (always sha-1) |
| 1393 | self.paChecksum = ASN1_STRING(Hash_SHA().digest(text)) |
| 1394 | |
| 1395 | # paChecksum2 |
| 1396 | self.paChecksum2 = PAChecksum2() |
| 1397 | self.paChecksum2.make(text, h=h) |
| 1398 | |
| 1399 | def verify_checksum(self, text): |
| 1400 | """ |
| 1401 | Verify paChecksum and paChecksum2 |
| 1402 | """ |
| 1403 | if self.paChecksum.val != Hash_SHA().digest(text): |
| 1404 | raise ValueError("Bad paChecksum checksum !") |
| 1405 | |
| 1406 | self.paChecksum2.verify(text) |
| 1407 | |
| 1408 | |
| 1409 | # RFC8636 sect 6 |
no test coverage detected
searching dependent graphs…