Merge branch 'dev' of https://github.com/zk-passport/openpassport into feat/register-disclose

This commit is contained in:
turnoffthiscomputer
2025-01-17 16:53:24 +01:00
167 changed files with 4800 additions and 102964 deletions

View File

@@ -1602,4 +1602,242 @@ cIlCXtLAlhwxvkvq6fXlDHODihiBrcmRBxz08o+IXvjgBYlfHWP5iDS4RO0lzId4
JYSWvyeHGutMDlIMuw5KEE1kVxR2XXcZypc9dWHGaI6MrYwpmmvTB6oZg11FEZzm
S8w23130L6pAB1EjCC8lUQubEkgDZ0bfy4UxpkOiqctzYdakvgo+zOwpORhN/Wxp
Vnmv
-----END CERTIFICATE-----`;
-----END CERTIFICATE-----`;
export const mock_dsc_key_sha256_rsa_3_4096 = `-----BEGIN PRIVATE KEY-----
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
/oJPpjQ+6ZN4gCl9P8dlm+A4GnqoNw==
-----END PRIVATE KEY-----
`;
export const mock_dsc_sha256_rsa_3_4096 = `-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIUWTN21jdpu7PcJMCb2xNtfQz1gAMwDQYJKoZIhvcNAQEL
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTYwNDE4WhcN
MzAwMTA5MTYwNDE4WjBWMQswCQYDVQQGEwJKUDERMA8GA1UECgwITW9jayBEU0Mx
EjAQBgNVBAsMCU1vY2sgVW5pdDEgMB4GA1UEAwwXTW9jayBEU0MgU0hBNTEyIFJT
QTIwNDgwggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQC06VTApDmKkLio
0T3v64StMcZRFHkR741UaxX2D6sa9PnCDekA4EU+6z+53oKQrjztLiWqnfN555Bn
s/dW9IP4V9NMv2SBUELyL+tLs+mVYmYnJBoVBABcKOWCkedE6KuJZe2leHp/9zLQ
uC8rrgcelstkWxVW913LhvWRewjpKRw3ukax12bciYUaHPKlht9/ManmOKC9OJv3
LG4XS73BUFoNS9k4r+k+47ONqqdamy+y+d4OWR+DtybGIddfQoDk/QerOmuz2Vpa
o6lh9qMkTd6d659/X+FiZwJXleUUbNFvWi3ifVezHhwruNGdxT2sLV1SZGMojciT
O6OPJnFjKOu/6Da5ALgO2Q/G7F7f0SexpttmWr8QKbP4IFyxB6HHVeJQkrmdTuc2
VVVT+koryZhLeu4BBFdUjdTHQtg2O5/9apyIacO0+OboyZakLv6v8vzzEhbqDcva
nAey/8lZFaejjR4kqgkB/PWXGpifT0JZy+oB0JrxLIlkb95n2QxCgBeY3l7jj7g0
d1vkNpetlEBSh7y6WV19S4DN6Fut+M6r6+NskEHkJD6s6aI1619JWsj9vmNaLITR
c/2CxmhCJgDfgDj0k+zGXLX7x5Pns3dUsWFrd0WAYvgpofb8CUL6bFOwqD5JGvlF
+dk+3gzUZiVVoYlrGjgit3LCZ3WzjwIBA6N6MHgwDAYDVR0TAQH/BAIwADAOBgNV
HQ8BAf8EBAMCB4AwGAYDVR0lAQH/BA4wDAYKKwYBBAGCNwoDDDAdBgNVHQ4EFgQU
jz/7QvwEGkKSkTkzP03lFhjMs1YwHwYDVR0jBBgwFoAU9DAZDj4vOjUN05u3nBGx
7qTQkYowDQYJKoZIhvcNAQELBQADggIBAK1eEsZzIUyNsnm6BSwgc0FHB4TBimK2
frZ1QTVqggDjzOS0Nk/WuNZxcpxdmjp4sNkjF65AVSR5OSgCtk5STytneqvfbjXY
xq3Rl6XWPMv4vY4jEQudduOM0HFkKPMafW4x7etaJLeCZ4rlfjYMZj00iM6G/o3v
jVMq+7VickJ2LMK8I/3Jyqwg/hwZ1oKhPS2Lpej7rA9VwBMTGLyGoyaVIp599hwj
HyanFyDGLe068aF7G/LJuJ0+FRUcsL1sScYKOs9bobQZrJugBVmHKGCbZGHhwwCz
iyI42U9cLL8taYlRK8JgqoDhkQRJPZ1ju95jVsxB95a7H5MWBasw1o8WsBIwuQvl
ANX6mLlssIp4ZtK9TPhIfUhl+/QDiC0QPhND9qHM8xTEZR3mkObmkcFf2yY3oXdl
fuJCNqgLe180lihktlx83CZ8NsOWynQIBEtBDo2Okloc6F7ra34EKMECl5WIl5bK
UECsc0jCN6axcmFy5jRI66pkkHwMkC9Cfgw8TXaSA/iBRUEH75ft2yYx5JDpvx0U
qgjmXHPgHwanzAC0FdFj5d7yICoHOiBEj6mmDYRoB9inGnoyjj3g+ge/aJvQmNn2
SLV08wwczovgh3fdFBf9FQcfT77ggcJd4vJXiDfNBbQghzkh5EAugC6nlG3zcVqP
ZPOzG68rtudy
-----END CERTIFICATE-----
`;
export const mock_dsc_key_sha512_rsa_65537_4096 = `-----BEGIN PRIVATE KEY-----
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
5oD/m9q2ACiOw9Hmu/folOkgH1oP
-----END PRIVATE KEY-----
`;
export const mock_dsc_sha512_rsa_65537_4096 = `-----BEGIN CERTIFICATE-----
MIIFpzCCA4+gAwIBAgIUbF0yyV/2z6BHATd9xXIi1a30aTEwDQYJKoZIhvcNAQEN
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTU1ODIxWhcN
MzAwMTA5MTU1ODIxWjBWMQswCQYDVQQGEwJKUDERMA8GA1UECgwITW9jayBEU0Mx
EjAQBgNVBAsMCU1vY2sgVW5pdDEgMB4GA1UEAwwXTW9jayBEU0MgU0hBNTEyIFJT
QTIwNDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDYE46jsM/etoGW
VivGf6TE2TF+NXMpMn1uCP80BbeHqsCN0+axX/guEkcR7KyFf7x4cQtLGzvT4UeD
uMMhRbU6EdDdwT5vMG1k+F0LkKg+U1j3uXYwtV8pBe9eTxsTNc3KM4VmyppTpmhW
H0e10iuc7LPi7wveiY+McjFhneYdF6nQe0kbRnSOt+soRdRsTkEnQJc5exM1iCVT
dKpCpWIA5ZLphhgdkNSk9Mz36W27iVm8UUFcaWT1q8w02NJ/XNjqQCPVjjijW6wU
kW8phmT6NGPS6bCjOXFaUETBL7Ztm2JIayKQnipEwcXXFGBnyltENIvvOD4aQNdh
tx0sGkCktY12vTBCaSqk2ak62xsGaf2d7yz0OoT2V5Nq4r15SgC2cMAiFTCewh7Q
q4iwRlrjYEOYEVGdwSiAjrdR3e48h9Ku7ea5LS4LZ/gpVQ8czGAWfI4/BT5ht06j
WXsFPC8pU2paiF5Vsbp9SpBnMhdKKCE3XQ6giRQFJCjrrSpzAdGxoyjjMmeeOd1k
rb+P0g7gBuyHamx3jFHaVnRjFlV2jhlahYp+d2x1NoHRiukU3iaHCdIT7NbCBVbV
07PtRaaSRrjEsKIt2X9KOLqOj+lWbf4panGpjCgsg6tTPQwblB1f09YBF/kYeMZA
c8qZjD91HWjCLwqKuNMneG1UQLdBzwIDAQABo3oweDAMBgNVHRMBAf8EAjAAMA4G
A1UdDwEB/wQEAwIHgDAYBgNVHSUBAf8EDjAMBgorBgEEAYI3CgMMMB0GA1UdDgQW
BBS12uQmqML59he3UH/FrAhV5viq5DAfBgNVHSMEGDAWgBTeRYNk3lWFO5usuf46
MPYdPe0jcjANBgkqhkiG9w0BAQ0FAAOCAgEAae+/U4d20YD8WKynj6ZZ2ycmtjLa
J/tcYbuLQ4Sm0yWuH4PZuWHvNMLAt86CbFYxUx2m2YACOeFx+8Uy9kulW+i/prGK
ptNyKQe7qCHQyT51ZBFQ8KGdSKJqT37RWpPDCbSw4p4vsW4fuLzRPoz1XAklJNz7
2KR/yBe9cY+TQfiVqsbUGrZ7HedoUAuvlomE4lh2+ub+GiW5WClAKUaSy3WGYrIj
G+VSrs0cx8YBZ8/Rwjb4oeqmat0gBm3bXeChyT8snQwHjvMNhGq1Gm9mVxnhMwH9
a+L0WJv8dg1IutivcURli97CJKW5CwXj6TkeyPsTLBwZLgkPxVOnGAVYC+KZIcNm
xs/tGXj9267wVGyjxIN0ir/stXGRa1fecZUbQOhivQBuasWgLW+fT9tbf9mW6H5U
7lWN5udDXdZMSxR6j2FLSJM61vpBDzNSdLp303g6ZPZ7KcapABJ0Rc26w8uLA7SR
3CoFYVwv8fvePtcpnmNJJBBCcYPoYQImK/egrRP/2itQ0rKrQ5bfjf93lPBCw44X
RguFdjhoHMVLuwUE8cDSa++8SJYaEt+hz4maeFJSPNcmjLtMj6sh6fN18a6tn8ot
TyD3WNptht093KKhpBzjSnsQfHyZy0kZv1ExLrHOHAZeLiD+0EYWATPhEBaE47Eg
j9Sia6tiYeI4rSQ=
-----END CERTIFICATE-----
`;
export const mock_dsc_key_sha512_rsa_65537_2048 = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDSvKqw2u9u4+Qz
uhrJ2+o41eonPWAD1SodMORJVecATSjRb+HpYYBrcV7AB8AmmTKwYfkbugEUspnJ
/5yl0IldEEoZ+FJm5S+3tmN20DuickdDYKkXPOkXZelWFU3sE4jpYTEzXu/nTH4L
pNwqXYjHXH+/INUS7xJ0gYYPZ2DThVgobYbXETmFdyuJpH8vFdAV1Fxxp0C2Rwkt
jSwkhF+h8Hs2vi4ojGcghYUFLmDTF4UP/uPPuJonzQJRL7EQHiHTC7eZ+EtMS1PS
6X0VeC/uAAtT8b7+zBGMz8+x+aAAwXIut/yY2LnoSBVxUu+4g8Ii5Zt5rzPGm6GQ
P6IfCwARAgMBAAECggEAHGoE59C1TPHcUJ8swn/s7lnldwH/ArVItuPjPAIhofhF
YyvfPY0AeDwyhtjkry+j1oV3RaZIRAaq1sIo2HCsPMiX/TVuwuHvE6m7coc0KzyW
YD7VvcTgNt/uXMWFmqmtoa4RqLgJx9mX+zDw4KN48EyICvi90g47IktejJAnTY2j
1MlAZ/00qXwWifaNhc7+VuA46mlstX2UxOHoqu8neYgE2vhC8/A6oHmVePMQASjS
akUEYzGhF1t69A1EFxbh1LI/Z07F2J9Jt7u+a1SlDIjevKq5ExkioPfcm1Wvn1Zy
8Kys5JYtORTGQj8EyJQRxIFE+xuwoj1eMqxTZq2BowKBgQD70PYrAFCA2g/fnygf
rwjhYroyEp9tUbI9jTOIW5iFFvrgvJ9z5w/DofE9X2EKWOr6ZriyXIN3J4OU8Ttm
0a85DDMYmxQvLLnCLlHkMXIpC6k72mwYRTyrlHirkRHxfvBujp2OoY+yMsaPyi2C
EFHEKv/sb39OJ8E7fh1Y2uvKTwKBgQDWPPwNvcMmiRwAOniuAB1/2MqWwuluk8Bu
rL6WPt3KgItqGKFNC3c0ainI8XGWullmk1SwP7YqBuPcfb6LkAe3wYcb5sSOZsZb
tpk+f/TsU8bCkTE87cnPrmv7wIoxvm+ItqOeWp+7B8wkEHnOBn/TkUggcwb7tnbX
sWKr6VDXnwKBgBJzczYfZcarM7KM9OGtb5ckJsR4fNoDvG2qJPZ+z6Qg1O0WpRBX
A96vxP9cN74MWdtTH4FiKffXG1sUeefEwXQKosvQwR/bxRinUDTKMrUzN4k9LeJx
YEqqLFVV4dyyEmfnZ0AGMoM6GTZ79+2pyHP5OptWaBuP6iazzO6vy8sdAoGBAKxR
JwdCb7oKJCyG21RRIWkYjXKP2cQoMWqTpUQh0rEzjW9L2kmnBD1zeqJ2mT98KbZY
oJCW3kWVfyd1OJL2yU5i6fJmPgiv37Ia/82GjBCeHcuXjvwL4vwZth8rMbxrCTj0
dkxDZiDAV9FWMzKkhaI9Q79d5esGSzaYJd5SbsTPAoGAWD5FANbg1QbxOE1giyyi
hvAVZ2dT/HZj7wbAFATO/C69r7sbG5SF2TrxBHGI+fhLwI1wXSURE/oCYpfkUmsS
dIDFa1lQSaf44x11efTrWhjvU3gB6z7Y/lutrvFdihebWOJDRmxUkDJ7fxNDKssJ
robTDzXXBGlHrGJRKHwKxow=
-----END PRIVATE KEY-----
`;
export const mock_dsc_sha512_rsa_65537_2048 = `-----BEGIN CERTIFICATE-----
MIIEpzCCAo+gAwIBAgIUUD90GVlb8r8b3X9dBiU3w+hDICYwDQYJKoZIhvcNAQEN
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTU1NDQzWhcN
MzAwMTA5MTU1NDQzWjBWMQswCQYDVQQGEwJKUDERMA8GA1UECgwITW9jayBEU0Mx
EjAQBgNVBAsMCU1vY2sgVW5pdDEgMB4GA1UEAwwXTW9jayBEU0MgU0hBNTEyIFJT
QTIwNDgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSvKqw2u9u4+Qz
uhrJ2+o41eonPWAD1SodMORJVecATSjRb+HpYYBrcV7AB8AmmTKwYfkbugEUspnJ
/5yl0IldEEoZ+FJm5S+3tmN20DuickdDYKkXPOkXZelWFU3sE4jpYTEzXu/nTH4L
pNwqXYjHXH+/INUS7xJ0gYYPZ2DThVgobYbXETmFdyuJpH8vFdAV1Fxxp0C2Rwkt
jSwkhF+h8Hs2vi4ojGcghYUFLmDTF4UP/uPPuJonzQJRL7EQHiHTC7eZ+EtMS1PS
6X0VeC/uAAtT8b7+zBGMz8+x+aAAwXIut/yY2LnoSBVxUu+4g8Ii5Zt5rzPGm6GQ
P6IfCwARAgMBAAGjejB4MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBgG
A1UdJQEB/wQOMAwGCisGAQQBgjcKAwwwHQYDVR0OBBYEFO3kqWll+f8YY9uDfBJX
eaKngTVuMB8GA1UdIwQYMBaAFNGLaWDO8CTAQRwgxawm4FxsWINfMA0GCSqGSIb3
DQEBDQUAA4ICAQCKG3TGrnzI9wI2wrIg6bBfPH84HaxkRfhWPgy6Kl9JC31ngmSU
dc1e+Bkdg9DjOgEAfSQJ/0s8xkOFZI8gOBBj8XjWsSGZfNY1EAo3By1eVceZ/9bq
f2YcoNI0UFQaiqZMCGqfFduZEZ6O3BvO+kV8fGQR22ClfmNV6bVbejWH+gu69blt
N/paiO/66tnMhnIQtGMCqXDaHKRPhIm9+TZKurPANlYHBHXUm2/GmoglLBqt2i2K
S99TWc4aefkE4PIo9Y4tjzg8dtzKIZ8bIb2ZaZ0eMOcaIBoHDrT4CIM6qBpCybY9
2eyjAtqEB273FewqaaUwqwBLBYq5eELzvY2RXec79iWCdA57+JM8gvLaOLp4oRrv
T1VhweZqJl+f1DGP7GtSS9kwdHc2bGy/c+Q0sNcsbi1fDKR0Ua6UD7VI/OQAd7qI
BnCMQlb6OmGJ7NwHqc5LqXQfl9TIXoCM2SbCILSMftQgF/1VNRjuLJ8zjR+0aRop
ZxnwjCKuBSKSWE3MlFZ4KYpt0Tu4NjfgQwcpd9jNGh2ju4cW2y94+aZHYjY1S/61
fCwuoiDeII65pXx8lO2nk51Cidz6utia9gHit8U8xxjoeQhlb9SScPzuAK5vn63r
ZywzAe8hoV47K1/m1GnJL/1T4qOOeomQngQGtn+ydO/+m0NHwYwRFW5DLg==
-----END CERTIFICATE-----
`;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFYjCCA0qgAwIBAgIUcSYaVdE8mTsZrQajF99bbFChQ9IwDQYJKoZIhvcNAQEL
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTYwMDI0WhcN
MzUwMTA4MTYwMDI0WjBJMQswCQYDVQQGEwJKUDESMBAGA1UECgwJTW9jayBDU0NB
MRIwEAYDVQQLDAlNb2NrIFVuaXQxEjAQBgNVBAMMCU1vY2sgQ1NDQTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMD90FV0LPizEgd/S31PucIP5HKLZlyq
dC6wxKaEdom4ZshQpm977Rd5Fx6HCoCZ0aMDyUfLmnKe1lB5y1url1pq8n+Z2TTL
R3OEK1GMq+iC37KyUvau7pTfw1kf9EHOJsK6SP9E40mY2XuKAEZ6X+lFG29N3MO6
98qlULDHlE/2NIhg2vmrXRXMoBYkfqeDL3YiZz+i2p9bC5nJSMG8D0UARsy0SWae
xw6+FqaeGtrU9MgEf+1qnFq2BboIzJHVzZLL6CTOGQs1sX2c054hsIbsekGdt57H
kJBt5mxddeSZnRcy/z6CK04C2lHovKlccl92aEVPpRrfI7W+DMMgViQo8GL38MiP
knVSFbIjLkM9Ye6vfGimGZ4nsX1CFAjV1kRlyVZ0lxqpcSprmYDvGvetMs+/TBYK
lE3U0tonY2hFISW6IaIXq5jy69BUliFSW8YFkhLKsv3CRzE2yeMO7kgGxIvFppId
yKKn5RsWuSBM3R4CNLdQIxPWrOEPm8qj6rjtF1mMaP43GUtibWmHkOkFcnm2diHU
lZJZ+SIuxm1N2oXjE3Pn3vWgNJqoVP2KJHOj5oF3+e1ebUyaogqo+Vj6XRmqJavy
BMSslkKaK4EUikCw5M4LN+tWmKlgxHY5nGPOEpYJNXioyVC5pJMUJJbcMSAuKW3j
LKVqFs8cFjV9AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBT0MBkOPi86NQ3Tm7ecEbHupNCRijANBgkqhkiG9w0BAQsF
AAOCAgEANnjCxyexXPaQVPFGUGBTjwhtoWBNy6BKuByegJxxX9Y9WuwW9BDOKJN8
VrC/y1tdqVlwcyomve1eHfin1u7oo+iwg6aKcIHfLG4dKBZpZANiDydrZNZaDiAG
tjIBiZZqpVWQqDa6Nb1kElOcecZ5r2OIoMv6yv7rN3FBHXIsORtwbFDrD4PcgoUD
sgGgGIagSyA2NGdQ0SPW67KFFCVToV9N+qVMAN8b/mQg3aAcp6SeIGTrdP1JaMS0
47j5H1JthjSf2CvSsrk76blC9FZ/bCWa/+NwZ8GYVNNBzZVKC5oWcck172odGDhl
XfSk1modjqWXq1IYVhSBWfAvizQvQATfkkao7OT/ymF1OImdli214ggbn2Q4SyIZ
qGvB7y5KQ2Lhl85Qt4jamoQs/TOyINA2FSUAWvRJm/r1vEdET0uauY+92iUUouQx
RWcG8ILkRxzh9LmWv5kNFFI4K/eDWuzZeOvIVSSu8bIfaKA19BqpgiGPT26xFKj/
pygmZSs3Ag015zadzSvMv41XZlUiQXWNV5SONSkWhn6YA56v6L7SxDRFppH/sW+b
i2jWyDJziUD4fo3/zZVNOv6wkfsW4ZwHn2HYVHs0VaqMzRuLBxH6zuVAOxYL0o9i
cliGUVC/mROIxJg/9W3PD1LKorJj/j0VEiXioW0w4rqlsAy4Tto=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
GNYoCtc56XQ1ArIAzBynL0sfhxnX
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIUWTN21jdpu7PcJMCb2xNtfQz1gAMwDQYJKoZIhvcNAQEL
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTYwNDE4WhcN
MzAwMTA5MTYwNDE4WjBWMQswCQYDVQQGEwJKUDERMA8GA1UECgwITW9jayBEU0Mx
EjAQBgNVBAsMCU1vY2sgVW5pdDEgMB4GA1UEAwwXTW9jayBEU0MgU0hBNTEyIFJT
QTIwNDgwggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQC06VTApDmKkLio
0T3v64StMcZRFHkR741UaxX2D6sa9PnCDekA4EU+6z+53oKQrjztLiWqnfN555Bn
s/dW9IP4V9NMv2SBUELyL+tLs+mVYmYnJBoVBABcKOWCkedE6KuJZe2leHp/9zLQ
uC8rrgcelstkWxVW913LhvWRewjpKRw3ukax12bciYUaHPKlht9/ManmOKC9OJv3
LG4XS73BUFoNS9k4r+k+47ONqqdamy+y+d4OWR+DtybGIddfQoDk/QerOmuz2Vpa
o6lh9qMkTd6d659/X+FiZwJXleUUbNFvWi3ifVezHhwruNGdxT2sLV1SZGMojciT
O6OPJnFjKOu/6Da5ALgO2Q/G7F7f0SexpttmWr8QKbP4IFyxB6HHVeJQkrmdTuc2
VVVT+koryZhLeu4BBFdUjdTHQtg2O5/9apyIacO0+OboyZakLv6v8vzzEhbqDcva
nAey/8lZFaejjR4kqgkB/PWXGpifT0JZy+oB0JrxLIlkb95n2QxCgBeY3l7jj7g0
d1vkNpetlEBSh7y6WV19S4DN6Fut+M6r6+NskEHkJD6s6aI1619JWsj9vmNaLITR
c/2CxmhCJgDfgDj0k+zGXLX7x5Pns3dUsWFrd0WAYvgpofb8CUL6bFOwqD5JGvlF
+dk+3gzUZiVVoYlrGjgit3LCZ3WzjwIBA6N6MHgwDAYDVR0TAQH/BAIwADAOBgNV
HQ8BAf8EBAMCB4AwGAYDVR0lAQH/BA4wDAYKKwYBBAGCNwoDDDAdBgNVHQ4EFgQU
jz/7QvwEGkKSkTkzP03lFhjMs1YwHwYDVR0jBBgwFoAU9DAZDj4vOjUN05u3nBGx
7qTQkYowDQYJKoZIhvcNAQELBQADggIBAK1eEsZzIUyNsnm6BSwgc0FHB4TBimK2
frZ1QTVqggDjzOS0Nk/WuNZxcpxdmjp4sNkjF65AVSR5OSgCtk5STytneqvfbjXY
xq3Rl6XWPMv4vY4jEQudduOM0HFkKPMafW4x7etaJLeCZ4rlfjYMZj00iM6G/o3v
jVMq+7VickJ2LMK8I/3Jyqwg/hwZ1oKhPS2Lpej7rA9VwBMTGLyGoyaVIp599hwj
HyanFyDGLe068aF7G/LJuJ0+FRUcsL1sScYKOs9bobQZrJugBVmHKGCbZGHhwwCz
iyI42U9cLL8taYlRK8JgqoDhkQRJPZ1ju95jVsxB95a7H5MWBasw1o8WsBIwuQvl
ANX6mLlssIp4ZtK9TPhIfUhl+/QDiC0QPhND9qHM8xTEZR3mkObmkcFf2yY3oXdl
fuJCNqgLe180lihktlx83CZ8NsOWynQIBEtBDo2Okloc6F7ra34EKMECl5WIl5bK
UECsc0jCN6axcmFy5jRI66pkkHwMkC9Cfgw8TXaSA/iBRUEH75ft2yYx5JDpvx0U
qgjmXHPgHwanzAC0FdFj5d7yICoHOiBEj6mmDYRoB9inGnoyjj3g+ge/aJvQmNn2
SLV08wwczovgh3fdFBf9FQcfT77ggcJd4vJXiDfNBbQghzkh5EAugC6nlG3zcVqP
ZPOzG68rtudy
-----END CERTIFICATE-----

View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
/oJPpjQ+6ZN4gCl9P8dlm+A4GnqoNw==
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFYjCCA0qgAwIBAgIULMIPi3+y2+k0eYWGpBnkRbELSXswDQYJKoZIhvcNAQEL
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTU1MjU1WhcN
MzUwMTA4MTU1MjU1WjBJMQswCQYDVQQGEwJKUDESMBAGA1UECgwJTW9jayBDU0NB
MRIwEAYDVQQLDAlNb2NrIFVuaXQxEjAQBgNVBAMMCU1vY2sgQ1NDQTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAIwHXIiYAzayuCxX9ltadZLkl5QqWdqH
+QF6Gh6BGN7wCW/ANtn06oLhxpuEiCTFmBb8LnduchNRjtTogDBLo9TEz6UYOolo
M+Ir4jZuM9oeXhwKhzCbgRY+qHJDT75RmYiSwSuxnjdnG8oIWNiVm5iGp5so+OWn
fB4oOObfsUUbG2MD84eFXjyp3m4HO7D4jX4pPcpwmDwGZIwLV5rXa7cXetTllN2R
KdlL7f0gcLW/hHnDKwrOOS5wVOD9GBBzgJkShbDoGQwfcW6edMVWhpBf9TRRryXe
P0p3oU76++Z5dEZj8szqfZqVTQ9PynxnsN4rad5cxsktvAnW9H5eE1UJQUTHLQRB
2WYTfrj1VPb6fLxZWNAf4e1JIR4dQxmi73RPmutbwS8KdomWkbbDEJS6AaEwBaVC
NMIWXvUNv8+y/ai5PG1eGUUwY4EVgN+5waSlVUsXH4rbqgUGaHNffg9kRXTd9m/C
JxBlW/Vgxm53lSAGwb5O3DOCpYnwrwuLlfylatdIbMj7PJhiqCEfOYcC4OhJLgZw
FMXbc5VtwxvP3fpau/I0S3u1nYatWfvhZrYx+TKAsI+gYtKXQKGpl8cmbYTWRulq
4PHMw/ONB1abhytEUhVcgry0IsHPf0uIoO9qIlhA1q0JZyrJHBzG/Wx0eOyp+gOx
RFIU/lQ/Rsc1AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTRi2lgzvAkwEEcIMWsJuBcbFiDXzANBgkqhkiG9w0BAQsF
AAOCAgEASPrCf5rOPsbdls9CwdHuujmpGjfyIGTqpeNBggfZ6IXOh+qfMZpWPoAv
j0/uIbeth5EJBjPnhKDHXqCwk7mvV/4VcUXRq4ICVscdz+G/LggkUrv07D3EUFWA
r2YaOCDS6iJVz3GOdia7n+8pI1t3t2KZ2Ua1wmusg4Te39Z/z2qXAg1nnk2M9w+2
z/Kf9F3zSEyRtAIw9+RylMrWDKXw8Uw8z+sK/SAJZgAIjxKaMnG7a91Wu93681eJ
XF84wyOmwkQ4ENi/Fc3vsWCR6kwDekbDvW8yDalqNFh6MaVMgSMBs6Vr6w7TGTXc
sE7a0e/abVOdi7zL7mhpVVCy75wgnMzcELU6guQfgzpDBWTQfl4PpyU5uom8nVBe
GSD8J3mp5+xhQ6gcZGkIMiLhxrbjvI7k5ihJ8h0AJpZv/Wihfn4cohqd+H/n2VwF
KMPi18u5p5INuqsxIPe1alFJCYaRkJ9PwZY5N78unXYM6J0djnGF3SIaRxZW+/3F
U3/z6XPV3nQ1FL0t+DtETmP3CaE8pwJRp+14XbE+1qti9Cp0janY0BcZWJTshUzk
lnEmQIKi2C/AH6T6SqxHdBgAJ4c4yYrbw8SIkN23a8Hy+5u98ZZMZWnGvc8i9Ka+
qRCd8V17gExokgmh9uvZyPVvrDycT4XYUVWrUFqTcnJdcjvbKmI=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
4xrHDL4L6oYeb/EQLVbBnzcXqZkEQA==
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,27 @@
-----BEGIN CERTIFICATE-----
MIIEpzCCAo+gAwIBAgIUUD90GVlb8r8b3X9dBiU3w+hDICYwDQYJKoZIhvcNAQEN
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTU1NDQzWhcN
MzAwMTA5MTU1NDQzWjBWMQswCQYDVQQGEwJKUDERMA8GA1UECgwITW9jayBEU0Mx
EjAQBgNVBAsMCU1vY2sgVW5pdDEgMB4GA1UEAwwXTW9jayBEU0MgU0hBNTEyIFJT
QTIwNDgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSvKqw2u9u4+Qz
uhrJ2+o41eonPWAD1SodMORJVecATSjRb+HpYYBrcV7AB8AmmTKwYfkbugEUspnJ
/5yl0IldEEoZ+FJm5S+3tmN20DuickdDYKkXPOkXZelWFU3sE4jpYTEzXu/nTH4L
pNwqXYjHXH+/INUS7xJ0gYYPZ2DThVgobYbXETmFdyuJpH8vFdAV1Fxxp0C2Rwkt
jSwkhF+h8Hs2vi4ojGcghYUFLmDTF4UP/uPPuJonzQJRL7EQHiHTC7eZ+EtMS1PS
6X0VeC/uAAtT8b7+zBGMz8+x+aAAwXIut/yY2LnoSBVxUu+4g8Ii5Zt5rzPGm6GQ
P6IfCwARAgMBAAGjejB4MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBgG
A1UdJQEB/wQOMAwGCisGAQQBgjcKAwwwHQYDVR0OBBYEFO3kqWll+f8YY9uDfBJX
eaKngTVuMB8GA1UdIwQYMBaAFNGLaWDO8CTAQRwgxawm4FxsWINfMA0GCSqGSIb3
DQEBDQUAA4ICAQCKG3TGrnzI9wI2wrIg6bBfPH84HaxkRfhWPgy6Kl9JC31ngmSU
dc1e+Bkdg9DjOgEAfSQJ/0s8xkOFZI8gOBBj8XjWsSGZfNY1EAo3By1eVceZ/9bq
f2YcoNI0UFQaiqZMCGqfFduZEZ6O3BvO+kV8fGQR22ClfmNV6bVbejWH+gu69blt
N/paiO/66tnMhnIQtGMCqXDaHKRPhIm9+TZKurPANlYHBHXUm2/GmoglLBqt2i2K
S99TWc4aefkE4PIo9Y4tjzg8dtzKIZ8bIb2ZaZ0eMOcaIBoHDrT4CIM6qBpCybY9
2eyjAtqEB273FewqaaUwqwBLBYq5eELzvY2RXec79iWCdA57+JM8gvLaOLp4oRrv
T1VhweZqJl+f1DGP7GtSS9kwdHc2bGy/c+Q0sNcsbi1fDKR0Ua6UD7VI/OQAd7qI
BnCMQlb6OmGJ7NwHqc5LqXQfl9TIXoCM2SbCILSMftQgF/1VNRjuLJ8zjR+0aRop
ZxnwjCKuBSKSWE3MlFZ4KYpt0Tu4NjfgQwcpd9jNGh2ju4cW2y94+aZHYjY1S/61
fCwuoiDeII65pXx8lO2nk51Cidz6utia9gHit8U8xxjoeQhlb9SScPzuAK5vn63r
ZywzAe8hoV47K1/m1GnJL/1T4qOOeomQngQGtn+ydO/+m0NHwYwRFW5DLg==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDSvKqw2u9u4+Qz
uhrJ2+o41eonPWAD1SodMORJVecATSjRb+HpYYBrcV7AB8AmmTKwYfkbugEUspnJ
/5yl0IldEEoZ+FJm5S+3tmN20DuickdDYKkXPOkXZelWFU3sE4jpYTEzXu/nTH4L
pNwqXYjHXH+/INUS7xJ0gYYPZ2DThVgobYbXETmFdyuJpH8vFdAV1Fxxp0C2Rwkt
jSwkhF+h8Hs2vi4ojGcghYUFLmDTF4UP/uPPuJonzQJRL7EQHiHTC7eZ+EtMS1PS
6X0VeC/uAAtT8b7+zBGMz8+x+aAAwXIut/yY2LnoSBVxUu+4g8Ii5Zt5rzPGm6GQ
P6IfCwARAgMBAAECggEAHGoE59C1TPHcUJ8swn/s7lnldwH/ArVItuPjPAIhofhF
YyvfPY0AeDwyhtjkry+j1oV3RaZIRAaq1sIo2HCsPMiX/TVuwuHvE6m7coc0KzyW
YD7VvcTgNt/uXMWFmqmtoa4RqLgJx9mX+zDw4KN48EyICvi90g47IktejJAnTY2j
1MlAZ/00qXwWifaNhc7+VuA46mlstX2UxOHoqu8neYgE2vhC8/A6oHmVePMQASjS
akUEYzGhF1t69A1EFxbh1LI/Z07F2J9Jt7u+a1SlDIjevKq5ExkioPfcm1Wvn1Zy
8Kys5JYtORTGQj8EyJQRxIFE+xuwoj1eMqxTZq2BowKBgQD70PYrAFCA2g/fnygf
rwjhYroyEp9tUbI9jTOIW5iFFvrgvJ9z5w/DofE9X2EKWOr6ZriyXIN3J4OU8Ttm
0a85DDMYmxQvLLnCLlHkMXIpC6k72mwYRTyrlHirkRHxfvBujp2OoY+yMsaPyi2C
EFHEKv/sb39OJ8E7fh1Y2uvKTwKBgQDWPPwNvcMmiRwAOniuAB1/2MqWwuluk8Bu
rL6WPt3KgItqGKFNC3c0ainI8XGWullmk1SwP7YqBuPcfb6LkAe3wYcb5sSOZsZb
tpk+f/TsU8bCkTE87cnPrmv7wIoxvm+ItqOeWp+7B8wkEHnOBn/TkUggcwb7tnbX
sWKr6VDXnwKBgBJzczYfZcarM7KM9OGtb5ckJsR4fNoDvG2qJPZ+z6Qg1O0WpRBX
A96vxP9cN74MWdtTH4FiKffXG1sUeefEwXQKosvQwR/bxRinUDTKMrUzN4k9LeJx
YEqqLFVV4dyyEmfnZ0AGMoM6GTZ79+2pyHP5OptWaBuP6iazzO6vy8sdAoGBAKxR
JwdCb7oKJCyG21RRIWkYjXKP2cQoMWqTpUQh0rEzjW9L2kmnBD1zeqJ2mT98KbZY
oJCW3kWVfyd1OJL2yU5i6fJmPgiv37Ia/82GjBCeHcuXjvwL4vwZth8rMbxrCTj0
dkxDZiDAV9FWMzKkhaI9Q79d5esGSzaYJd5SbsTPAoGAWD5FANbg1QbxOE1giyyi
hvAVZ2dT/HZj7wbAFATO/C69r7sbG5SF2TrxBHGI+fhLwI1wXSURE/oCYpfkUmsS
dIDFa1lQSaf44x11efTrWhjvU3gB6z7Y/lutrvFdihebWOJDRmxUkDJ7fxNDKssJ
robTDzXXBGlHrGJRKHwKxow=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFYjCCA0qgAwIBAgIUfewb4CsLar5a8flvszaOUg1wE74wDQYJKoZIhvcNAQEL
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTU1NjUwWhcN
MzUwMTA4MTU1NjUwWjBJMQswCQYDVQQGEwJKUDESMBAGA1UECgwJTW9jayBDU0NB
MRIwEAYDVQQLDAlNb2NrIFVuaXQxEjAQBgNVBAMMCU1vY2sgQ1NDQTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBALjv4pR/A7Thv5/IskuTooQxJ3jbaGc8
GvlBMsxyQVDSrsuXMqgzbRpbY/1Sa3Hla+6SaUoKdikR3NEtmtUXtsRttmGifQrN
cwT6aOQKTjH0i64f1WByaQJIYetgQuvjM2gcM4wRjKrcflXZXd4HqVtb8C1IoXf8
N3+XF076ug+bDi6VynCWeow68vLZ5xqpVuMW/RUcOvd5o1h/727UTpRZMrABgrKb
imWWYpyLcJ7/QEL/O4TDSXehd/XqI4pA+GxbEkx4imxFTbunV3oN22wRj/op0WQ6
ZXFHEPJ9N/giDszxPo7B+4D6BZGISjl/roiCOfx74We+slO9UNkT/VbG1Y4R5XUx
sw3AsK0rup6wZlH3hkyXMa8gkn0v2mIfLTwxsD7BMKwGZ0eWM6m3F8gI/MSzRk+c
r3YsYTYKBpsqnlmbiUmSzYKBDc7Kiq678V44dyCIz9l5Uf0W05UFaiV86XWKaR4Q
odIgpj4x+29SrOrQbvuDOzPgw55MV5ZT5jr4AGrAcnr0MCBH1HR8wRwX+K92PvY6
lhV3wIa7gLY3t1UBvYXI/dn1HWIaHGIgXJujQobceZVQ7CD6BYKxIKi68qFR3fny
tXeeWTI+00auQcaw0aNP70DVuLmdiICbvxlqvDvSEdGlK5vl50nmYGPrzvKWeK88
HlZvTAiUP5iTAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTeRYNk3lWFO5usuf46MPYdPe0jcjANBgkqhkiG9w0BAQsF
AAOCAgEAUOwzncM54WtaCn+WH5Ku1Qv8d5iSLKUuum9ujxt6gFc/qk5f5gvw12Uh
UYdwJrtR5F430yfhYLb1xLKCAbVYlXO+NwLplV2Rr7hazOc2tASAEUcjn8EohGjd
SILdsrctI1CzAXZrWQK2nratwRF1oZwpiB/jAHOxmnoYGAgFuRqDLbjV86TGpNz4
OWYaWHv7XWP/6jr6ndL9IgNGqrbaiMUX+ZhFMeww/FkLBxxrs0y7lrC1hJFcp+PD
GUR/JlBuhIXjjosLO02T/cAS+BdjHsZ4K/xYDnqS8GODeyhc08z1WOrr1GNAqi3F
17fADgAXLs/uvgVyR4eSjSRytr43MR8a4Ft7ZEkhHld3MTdqa3sN5TtEBNCMJaiH
KTpaTt47pz/f2QTb52BsBGH4FD0R6bxSKl1u22byb4mHZC61KsdbNWjOyBFgzM3N
6hTa0MXFq+m6a9CZYcRkmogAIxx0Ie6fjfuIJL7vjxUZ7gbD/QoxzLDqgkEdgKDV
6rT3Z/cKwMswkd9AC4Fkla8O641hnvjx68sMNW7Qj2On5BaFPn46wqSK4gY5WjNv
lJlJMvd+NXo9PElqm0i+XHaMT8CyRvvvKfpQraaJwEYU5MnPXOLLtt7tREiUU/DM
kEnvdIWnedrk8bym7DeNgj4IzNItnV9mqrWPwxbapBW5Hih/1RY=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
kx3ZHdN5uk9awxx825mnlb+c97Ia
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFpzCCA4+gAwIBAgIUbF0yyV/2z6BHATd9xXIi1a30aTEwDQYJKoZIhvcNAQEN
BQAwSTELMAkGA1UEBhMCSlAxEjAQBgNVBAoMCU1vY2sgQ1NDQTESMBAGA1UECwwJ
TW9jayBVbml0MRIwEAYDVQQDDAlNb2NrIENTQ0EwHhcNMjUwMTEwMTU1ODIxWhcN
MzAwMTA5MTU1ODIxWjBWMQswCQYDVQQGEwJKUDERMA8GA1UECgwITW9jayBEU0Mx
EjAQBgNVBAsMCU1vY2sgVW5pdDEgMB4GA1UEAwwXTW9jayBEU0MgU0hBNTEyIFJT
QTIwNDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDYE46jsM/etoGW
VivGf6TE2TF+NXMpMn1uCP80BbeHqsCN0+axX/guEkcR7KyFf7x4cQtLGzvT4UeD
uMMhRbU6EdDdwT5vMG1k+F0LkKg+U1j3uXYwtV8pBe9eTxsTNc3KM4VmyppTpmhW
H0e10iuc7LPi7wveiY+McjFhneYdF6nQe0kbRnSOt+soRdRsTkEnQJc5exM1iCVT
dKpCpWIA5ZLphhgdkNSk9Mz36W27iVm8UUFcaWT1q8w02NJ/XNjqQCPVjjijW6wU
kW8phmT6NGPS6bCjOXFaUETBL7Ztm2JIayKQnipEwcXXFGBnyltENIvvOD4aQNdh
tx0sGkCktY12vTBCaSqk2ak62xsGaf2d7yz0OoT2V5Nq4r15SgC2cMAiFTCewh7Q
q4iwRlrjYEOYEVGdwSiAjrdR3e48h9Ku7ea5LS4LZ/gpVQ8czGAWfI4/BT5ht06j
WXsFPC8pU2paiF5Vsbp9SpBnMhdKKCE3XQ6giRQFJCjrrSpzAdGxoyjjMmeeOd1k
rb+P0g7gBuyHamx3jFHaVnRjFlV2jhlahYp+d2x1NoHRiukU3iaHCdIT7NbCBVbV
07PtRaaSRrjEsKIt2X9KOLqOj+lWbf4panGpjCgsg6tTPQwblB1f09YBF/kYeMZA
c8qZjD91HWjCLwqKuNMneG1UQLdBzwIDAQABo3oweDAMBgNVHRMBAf8EAjAAMA4G
A1UdDwEB/wQEAwIHgDAYBgNVHSUBAf8EDjAMBgorBgEEAYI3CgMMMB0GA1UdDgQW
BBS12uQmqML59he3UH/FrAhV5viq5DAfBgNVHSMEGDAWgBTeRYNk3lWFO5usuf46
MPYdPe0jcjANBgkqhkiG9w0BAQ0FAAOCAgEAae+/U4d20YD8WKynj6ZZ2ycmtjLa
J/tcYbuLQ4Sm0yWuH4PZuWHvNMLAt86CbFYxUx2m2YACOeFx+8Uy9kulW+i/prGK
ptNyKQe7qCHQyT51ZBFQ8KGdSKJqT37RWpPDCbSw4p4vsW4fuLzRPoz1XAklJNz7
2KR/yBe9cY+TQfiVqsbUGrZ7HedoUAuvlomE4lh2+ub+GiW5WClAKUaSy3WGYrIj
G+VSrs0cx8YBZ8/Rwjb4oeqmat0gBm3bXeChyT8snQwHjvMNhGq1Gm9mVxnhMwH9
a+L0WJv8dg1IutivcURli97CJKW5CwXj6TkeyPsTLBwZLgkPxVOnGAVYC+KZIcNm
xs/tGXj9267wVGyjxIN0ir/stXGRa1fecZUbQOhivQBuasWgLW+fT9tbf9mW6H5U
7lWN5udDXdZMSxR6j2FLSJM61vpBDzNSdLp303g6ZPZ7KcapABJ0Rc26w8uLA7SR
3CoFYVwv8fvePtcpnmNJJBBCcYPoYQImK/egrRP/2itQ0rKrQ5bfjf93lPBCw44X
RguFdjhoHMVLuwUE8cDSa++8SJYaEt+hz4maeFJSPNcmjLtMj6sh6fN18a6tn8ot
TyD3WNptht093KKhpBzjSnsQfHyZy0kZv1ExLrHOHAZeLiD+0EYWATPhEBaE47Eg
j9Sia6tiYeI4rSQ=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
5oD/m9q2ACiOw9Hmu/folOkgH1oP
-----END PRIVATE KEY-----

View File

@@ -1,164 +1,182 @@
import { saltLengths } from "../constants/constants";
import { hashAlgos } from "../constants/constants";
import { CertificateData, PublicKeyDetailsECDSA, PublicKeyDetailsRSA } from "./certificate_parsing/dataStructure";
import { initElliptic } from "./certificate_parsing/elliptic";
import * as asn1js from "asn1js";
import * as forge from "node-forge";
import { getCurveForElliptic } from "./certificate_parsing/curves";
import { Certificate } from "pkijs";
import { hash } from "./utils";
import { saltLengths } from '../constants/constants';
import { hashAlgos } from '../constants/constants';
import {
CertificateData,
PublicKeyDetailsECDSA,
PublicKeyDetailsRSA,
} from './certificate_parsing/dataStructure';
import { initElliptic } from './certificate_parsing/elliptic';
import * as asn1js from 'asn1js';
import * as forge from 'node-forge';
import { getCurveForElliptic } from './certificate_parsing/curves';
import { Certificate } from 'pkijs';
import { hash } from './utils';
export function brutforceSignatureAlgorithmDsc(dsc: CertificateData, csca: CertificateData) {
if (csca.signatureAlgorithm === 'ecdsa') {
const hashAlgorithm = brutforceHashAlgorithmDsc(dsc, csca, 'ecdsa');
return {
signatureAlgorithm: 'ecdsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
if (csca.signatureAlgorithm === 'ecdsa') {
const hashAlgorithm = brutforceHashAlgorithmDsc(dsc, csca, 'ecdsa');
return {
signatureAlgorithm: 'ecdsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
} else if (csca.signatureAlgorithm === 'rsa') {
const hashAlgorithm = brutforceHashAlgorithmDsc(dsc, csca, 'rsa');
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
}
else if (csca.signatureAlgorithm === 'rsa') {
const hashAlgorithm = brutforceHashAlgorithmDsc(dsc, csca, 'rsa');
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
}
}
//it's important to not put 'else if' statement here, because a rsapss signature can use rsa key certificate.
for (const saltLength of saltLengths) {
const hashAlgorithm = brutforceHashAlgorithmDsc(dsc, csca, 'rsapss', saltLength);
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsapss',
hashAlgorithm: hashAlgorithm,
saltLength: saltLength,
};
}
//it's important to not put 'else if' statement here, because a rsapss signature can use rsa key certificate.
for (const saltLength of saltLengths) {
const hashAlgorithm = brutforceHashAlgorithmDsc(dsc, csca, 'rsapss', saltLength);
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsapss',
hashAlgorithm: hashAlgorithm,
saltLength: saltLength,
};
}
}
}
}
function brutforceHashAlgorithmDsc(dsc: CertificateData, csca: CertificateData, signatureAlgorithm: string, saltLength?: number): any {
for (const hashFunction of hashAlgos) {
// console.log(`\nTrying hash function: ${hashFunction}`);
if (verifySignature(dsc, csca, signatureAlgorithm, hashFunction, saltLength)) {
// console.log(`✓ Success with hash function: ${hashFunction}`);
return hashFunction;
}
// console.log(`✗ Failed with hash function: ${hashFunction}`);
function brutforceHashAlgorithmDsc(
dsc: CertificateData,
csca: CertificateData,
signatureAlgorithm: string,
saltLength?: number
): any {
for (const hashFunction of hashAlgos) {
// console.log(`\nTrying hash function: ${hashFunction}`);
if (verifySignature(dsc, csca, signatureAlgorithm, hashFunction, saltLength)) {
// console.log(`✓ Success with hash function: ${hashFunction}`);
return hashFunction;
}
return false;
// console.log(`✗ Failed with hash function: ${hashFunction}`);
}
return false;
}
function verifySignature(dsc: CertificateData, csca: CertificateData, signatureAlgorithm: string, hashAlgorithm: string, saltLength: number = 0): boolean {
switch (signatureAlgorithm) {
case 'ecdsa':
return verifyECDSA(dsc, csca, hashAlgorithm);
case 'rsa':
return verifyRSA(dsc, csca, hashAlgorithm);
case 'rsapss':
return verifyRSAPSS(dsc, csca, hashAlgorithm, saltLength);
}
function verifySignature(
dsc: CertificateData,
csca: CertificateData,
signatureAlgorithm: string,
hashAlgorithm: string,
saltLength: number = 0
): boolean {
switch (signatureAlgorithm) {
case 'ecdsa':
return verifyECDSA(dsc, csca, hashAlgorithm);
case 'rsa':
return verifyRSA(dsc, csca, hashAlgorithm);
case 'rsapss':
return verifyRSAPSS(dsc, csca, hashAlgorithm, saltLength);
}
}
function verifyECDSA(dsc: CertificateData, csca: CertificateData, hashAlgorithm: string): boolean {
const elliptic = initElliptic();
const certBuffer_csca = Buffer.from(
csca.rawPem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data_csca = asn1js.fromBER(certBuffer_csca);
const cert_csca = new Certificate({ schema: asn1Data_csca.result });
const publicKeyInfo_csca = cert_csca.subjectPublicKeyInfo;
const publicKeyBuffer_csca = publicKeyInfo_csca.subjectPublicKey.valueBlock.valueHexView;
const curveForElliptic_csca = getCurveForElliptic((csca.publicKeyDetails as PublicKeyDetailsECDSA).curve);
const ec_csca = new elliptic.ec(curveForElliptic_csca);
const key_csca = ec_csca.keyFromPublic(publicKeyBuffer_csca);
const elliptic = initElliptic();
const certBuffer_csca = Buffer.from(
csca.rawPem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data_csca = asn1js.fromBER(certBuffer_csca);
const cert_csca = new Certificate({ schema: asn1Data_csca.result });
const publicKeyInfo_csca = cert_csca.subjectPublicKeyInfo;
const publicKeyBuffer_csca = publicKeyInfo_csca.subjectPublicKey.valueBlock.valueHexView;
const curveForElliptic_csca = getCurveForElliptic(
(csca.publicKeyDetails as PublicKeyDetailsECDSA).curve
);
const ec_csca = new elliptic.ec(curveForElliptic_csca);
const key_csca = ec_csca.keyFromPublic(publicKeyBuffer_csca);
const tbsHash = getTBSHash(dsc.rawPem, hashAlgorithm, 'hex');
const certBuffer_dsc = Buffer.from(
dsc.rawPem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data_dsc = asn1js.fromBER(certBuffer_dsc);
const cert_dsc = new Certificate({ schema: asn1Data_dsc.result });
const signatureValue = cert_dsc.signatureValue.valueBlock.valueHexView;
const signature_crypto = Buffer.from(signatureValue).toString('hex');
return key_csca.verify(tbsHash, signature_crypto);
const tbsHash = getTBSHash(dsc.rawPem, hashAlgorithm, 'hex');
const certBuffer_dsc = Buffer.from(
dsc.rawPem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data_dsc = asn1js.fromBER(certBuffer_dsc);
const cert_dsc = new Certificate({ schema: asn1Data_dsc.result });
const signatureValue = cert_dsc.signatureValue.valueBlock.valueHexView;
const signature_crypto = Buffer.from(signatureValue).toString('hex');
return key_csca.verify(tbsHash, signature_crypto);
}
function verifyRSA(dsc: CertificateData, csca: CertificateData, hashAlgorithm: string): boolean {
try {
const dscCert = forge.pki.certificateFromPem(dsc.rawPem);
const cscaCert = forge.pki.certificateFromPem(csca.rawPem);
const tbsHash = getTBSHash(dsc.rawPem, hashAlgorithm);
if (!tbsHash) {
return false;
}
const publicKey = cscaCert.publicKey as forge.pki.rsa.PublicKey;
const signature = dscCert.signature;
try {
const verified = publicKey.verify(tbsHash, signature);
return verified;
} catch (verifyError) {
return false;
}
} catch (error) {
return false;
try {
const dscCert = forge.pki.certificateFromPem(dsc.rawPem);
const cscaCert = forge.pki.certificateFromPem(csca.rawPem);
const tbsHash = getTBSHash(dsc.rawPem, hashAlgorithm);
if (!tbsHash) {
return false;
}
const publicKey = cscaCert.publicKey as forge.pki.rsa.PublicKey;
const signature = dscCert.signature;
try {
const verified = publicKey.verify(tbsHash, signature);
return verified;
} catch (verifyError) {
return false;
}
} catch (error) {
return false;
}
}
function verifyRSAPSS(dsc: CertificateData, csca: CertificateData, hashAlgorithm: string, saltLength: number): boolean {
try {
const dscCert = forge.pki.certificateFromPem(dsc.rawPem);
const cscaCert = forge.pki.certificateFromPem(csca.rawPem);
const tbsHash = getTBSHash(dsc.rawPem, hashAlgorithm);
if (!tbsHash) {
return false;
}
const publicKey = cscaCert.publicKey as forge.pki.rsa.PublicKey;
const signature = dscCert.signature;
if (saltLength === 0) {
throw new Error('Salt length is required for RSA-PSS');
}
try {
const pss = forge.pss.create({
md: forge.md[hashAlgorithm].create(),
mgf: forge.mgf.mgf1.create(forge.md[hashAlgorithm].create()),
saltLength: saltLength,
});
return publicKey.verify(tbsHash, signature, pss);
} catch (verifyError) {
return false;
}
} catch (error) {
return false;
function verifyRSAPSS(
dsc: CertificateData,
csca: CertificateData,
hashAlgorithm: string,
saltLength: number
): boolean {
try {
const dscCert = forge.pki.certificateFromPem(dsc.rawPem);
const cscaCert = forge.pki.certificateFromPem(csca.rawPem);
const tbsHash = getTBSHash(dsc.rawPem, hashAlgorithm);
if (!tbsHash) {
return false;
}
const publicKey = cscaCert.publicKey as forge.pki.rsa.PublicKey;
const signature = dscCert.signature;
if (saltLength === 0) {
throw new Error('Salt length is required for RSA-PSS');
}
try {
const pss = forge.pss.create({
md: forge.md[hashAlgorithm].create(),
mgf: forge.mgf.mgf1.create(forge.md[hashAlgorithm].create()),
saltLength: saltLength,
});
return publicKey.verify(tbsHash, signature, pss);
} catch (verifyError) {
return false;
}
} catch (error) {
return false;
}
}
export function getTBSHash(
pem: string,
hashFunction: string,
format: 'hex' | 'data' = 'data',
pem: string,
hashFunction: string,
format: 'hex' | 'data' = 'data'
): string {
const certBuffer = Buffer.from(
pem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data_cert = asn1js.fromBER(certBuffer);
const cert = new Certificate({ schema: asn1Data_cert.result });
const tbsAsn1 = cert.encodeTBS();
const tbsDer = tbsAsn1.toBER(false);
const tbsBytes = Buffer.from(tbsDer);
const tbsBytesArray = Array.from(tbsBytes);
const msgHash = hash(hashFunction, tbsBytesArray, format === 'hex' ? 'hex' : 'binary');
return msgHash as string;
}
const certBuffer = Buffer.from(
pem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data_cert = asn1js.fromBER(certBuffer);
const cert = new Certificate({ schema: asn1Data_cert.result });
const tbsAsn1 = cert.encodeTBS();
const tbsDer = tbsAsn1.toBER(false);
const tbsBytes = Buffer.from(tbsDer);
const tbsBytesArray = Array.from(tbsBytes);
const msgHash = hash(hashFunction, tbsBytesArray, format === 'hex' ? 'hex' : 'binary');
return msgHash as string;
}

View File

@@ -1,8 +1,6 @@
import { PassportData } from './types';
import { parseCertificateSimple } from './certificate_parsing/parseCertificateSimple';
import {
PublicKeyDetailsECDSA,
} from './certificate_parsing/dataStructure';
import { PublicKeyDetailsECDSA } from './certificate_parsing/dataStructure';
import forge, { md } from 'node-forge';
import * as asn1js from 'asn1js';
import { initElliptic } from './certificate_parsing/elliptic';
@@ -11,117 +9,120 @@ import { Certificate } from 'pkijs';
import { hashAlgos, saltLengths } from '../constants/constants';
import { hash } from './utils';
export function brutforceSignatureAlgorithm(passportData: PassportData) {
const parsedDsc = parseCertificateSimple(passportData.dsc);
if (parsedDsc.signatureAlgorithm === 'ecdsa') {
const hashAlgorithm = brutforceHashAlgorithm(passportData, 'ecdsa');
return {
signatureAlgorithm: 'ecdsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
const parsedDsc = parseCertificateSimple(passportData.dsc);
if (parsedDsc.signatureAlgorithm === 'ecdsa') {
const hashAlgorithm = brutforceHashAlgorithm(passportData, 'ecdsa');
return {
signatureAlgorithm: 'ecdsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
} else if (parsedDsc.signatureAlgorithm === 'rsa') {
const hashAlgorithm = brutforceHashAlgorithm(passportData, 'rsa');
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
}
else if (parsedDsc.signatureAlgorithm === 'rsa') {
const hashAlgorithm = brutforceHashAlgorithm(passportData, 'rsa');
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsa',
hashAlgorithm: hashAlgorithm,
saltLength: 0,
};
}
}
// it's important to not put 'else if' statement here, because a rsapss signature can use rsa key certificate.
for (const saltLength of saltLengths) {
const hashAlgorithm = brutforceHashAlgorithm(passportData, 'rsapss', saltLength);
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsapss',
hashAlgorithm: hashAlgorithm,
saltLength: saltLength,
};
}
// it's important to not put 'else if' statement here, because a rsapss signature can use rsa key certificate.
for (const saltLength of saltLengths) {
const hashAlgorithm = brutforceHashAlgorithm(passportData, 'rsapss', saltLength);
if (hashAlgorithm) {
return {
signatureAlgorithm: 'rsapss',
hashAlgorithm: hashAlgorithm,
saltLength: saltLength,
};
}
}
}
}
function brutforceHashAlgorithm(passportData: PassportData, signatureAlgorithm: string, saltLength?: number): any {
for (const hashFunction of hashAlgos) {
if (verifySignature(passportData, signatureAlgorithm, hashFunction, saltLength)) {
return hashFunction;
}
function brutforceHashAlgorithm(
passportData: PassportData,
signatureAlgorithm: string,
saltLength?: number
): any {
for (const hashFunction of hashAlgos) {
if (verifySignature(passportData, signatureAlgorithm, hashFunction, saltLength)) {
return hashFunction;
}
return false;
}
return false;
}
export function verifySignature(passportData: PassportData, signatureAlgorithm: string, hashAlgorithm: string, saltLength: number = 0): boolean {
switch (signatureAlgorithm) {
case 'ecdsa':
return verifyECDSA(passportData, hashAlgorithm);
case 'rsa':
return verifyRSA(passportData, hashAlgorithm);
case 'rsapss':
return verifyRSAPSS(passportData, hashAlgorithm, saltLength);
}
export function verifySignature(
passportData: PassportData,
signatureAlgorithm: string,
hashAlgorithm: string,
saltLength: number = 0
): boolean {
switch (signatureAlgorithm) {
case 'ecdsa':
return verifyECDSA(passportData, hashAlgorithm);
case 'rsa':
return verifyRSA(passportData, hashAlgorithm);
case 'rsapss':
return verifyRSAPSS(passportData, hashAlgorithm, saltLength);
}
}
function verifyECDSA(passportData: PassportData, hashAlgorithm: string) {
const elliptic = initElliptic();
const { dsc, signedAttr, encryptedDigest } = passportData;
const { publicKeyDetails } = parseCertificateSimple(dsc);
const certBuffer = Buffer.from(
dsc.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data = asn1js.fromBER(certBuffer);
const cert = new Certificate({ schema: asn1Data.result });
const publicKeyInfo = cert.subjectPublicKeyInfo;
const publicKeyBuffer = publicKeyInfo.subjectPublicKey.valueBlock.valueHexView;
const curveForElliptic = getCurveForElliptic((publicKeyDetails as PublicKeyDetailsECDSA).curve);
const ec = new elliptic.ec(curveForElliptic);
const elliptic = initElliptic();
const { dsc, signedAttr, encryptedDigest } = passportData;
const { publicKeyDetails } = parseCertificateSimple(dsc);
const certBuffer = Buffer.from(
dsc.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''),
'base64'
);
const asn1Data = asn1js.fromBER(certBuffer);
const cert = new Certificate({ schema: asn1Data.result });
const publicKeyInfo = cert.subjectPublicKeyInfo;
const publicKeyBuffer = publicKeyInfo.subjectPublicKey.valueBlock.valueHexView;
const curveForElliptic = getCurveForElliptic((publicKeyDetails as PublicKeyDetailsECDSA).curve);
const ec = new elliptic.ec(curveForElliptic);
const key = ec.keyFromPublic(publicKeyBuffer);
const msgHash = hash(hashAlgorithm, signedAttr, 'hex');
const signature_crypto = Buffer.from(encryptedDigest).toString('hex');
const key = ec.keyFromPublic(publicKeyBuffer);
const msgHash = hash(hashAlgorithm, signedAttr, 'hex');
const signature_crypto = Buffer.from(encryptedDigest).toString('hex');
return key.verify(msgHash, signature_crypto);
return key.verify(msgHash, signature_crypto);
}
function verifyRSA(passportData: PassportData, hashAlgorithm: string) {
const { dsc, signedAttr, encryptedDigest } = passportData;
const cert = forge.pki.certificateFromPem(dsc);
const publicKey = cert.publicKey as forge.pki.rsa.PublicKey;
const msgHash = hash(hashAlgorithm, signedAttr, 'binary');
const signature = Buffer.from(encryptedDigest).toString('binary');
try {
return publicKey.verify(msgHash as string, signature);
} catch (error) {
return false;
}
const { dsc, signedAttr, encryptedDigest } = passportData;
const cert = forge.pki.certificateFromPem(dsc);
const publicKey = cert.publicKey as forge.pki.rsa.PublicKey;
const msgHash = hash(hashAlgorithm, signedAttr, 'binary');
const signature = Buffer.from(encryptedDigest).toString('binary');
try {
return publicKey.verify(msgHash as string, signature);
} catch (error) {
return false;
}
}
function verifyRSAPSS(passportData: PassportData, hashAlgorithm: string, saltLength: number) {
const { dsc, signedAttr, encryptedDigest } = passportData;
const cert = forge.pki.certificateFromPem(dsc);
const publicKey = cert.publicKey as forge.pki.rsa.PublicKey;
const msgHash = hash(hashAlgorithm, signedAttr, 'binary');
const { dsc, signedAttr, encryptedDigest } = passportData;
const cert = forge.pki.certificateFromPem(dsc);
const publicKey = cert.publicKey as forge.pki.rsa.PublicKey;
const msgHash = hash(hashAlgorithm, signedAttr, 'binary');
const signature = Buffer.from(encryptedDigest).toString('binary');
if (saltLength === 0) {
throw new Error('Salt length is required for RSA-PSS');
}
try {
const pss = forge.pss.create({
md: forge.md[hashAlgorithm].create(),
mgf: forge.mgf.mgf1.create(forge.md[hashAlgorithm].create()),
saltLength: saltLength,
});
return publicKey.verify(msgHash as string, signature, pss);
} catch (error) {
return false;
}
}
const signature = Buffer.from(encryptedDigest).toString('binary');
if (saltLength === 0) {
throw new Error('Salt length is required for RSA-PSS');
}
try {
const pss = forge.pss.create({
md: forge.md[hashAlgorithm].create(),
mgf: forge.mgf.mgf1.create(forge.md[hashAlgorithm].create()),
saltLength: saltLength,
});
return publicKey.verify(msgHash as string, signature, pss);
} catch (error) {
return false;
}
}

View File

@@ -2,10 +2,10 @@ import * as asn1js from 'asn1js';
import { Certificate, RSAPublicKey, RSASSAPSSParams } from 'pkijs';
import { getFriendlyName } from './oids';
import {
CertificateData,
PublicKeyDetailsECDSA,
PublicKeyDetailsRSA,
PublicKeyDetailsRSAPSS,
CertificateData,
PublicKeyDetailsECDSA,
PublicKeyDetailsRSA,
PublicKeyDetailsRSAPSS,
} from './dataStructure';
import { getCurveForElliptic, getECDSACurveBits, identifyCurve, StandardCurve } from './curves';
import { getIssuerCountryCode, getSubjectKeyIdentifier } from './utils';
@@ -14,318 +14,318 @@ import { Mode } from '../appType';
import { initElliptic } from './elliptic';
export function parseCertificateSimple(pem: string): CertificateData {
let certificateData: CertificateData = {
id: '',
issuer: '',
validity: {
notBefore: '',
notAfter: '',
},
subjectKeyIdentifier: '',
authorityKeyIdentifier: '',
signatureAlgorithm: '',
hashAlgorithm: '',
publicKeyDetails: undefined,
rawPem: '',
rawTxt: '',
};
try {
const pemFormatted = pem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n|\r)/g, '');
const binary = Buffer.from(pemFormatted, 'base64');
const arrayBuffer = new ArrayBuffer(binary.length);
const view = new Uint8Array(arrayBuffer);
for (let i = 0; i < binary.length; i++) {
view[i] = binary[i];
}
const asn1 = asn1js.fromBER(arrayBuffer);
if (asn1.offset === -1) {
throw new Error(`ASN.1 parsing error: ${asn1.result.error}`);
}
const cert = new Certificate({ schema: asn1.result });
const publicKeyAlgoOID = cert.subjectPublicKeyInfo.algorithm.algorithmId;
const publicKeyAlgoFN = getFriendlyName(publicKeyAlgoOID);
const signatureAlgoOID = cert.signatureAlgorithm.algorithmId;
const signatureAlgoFN = getFriendlyName(signatureAlgoOID);
certificateData.hashAlgorithm = getHashAlgorithm(signatureAlgoFN);
let params;
if (publicKeyAlgoFN === 'RSA') {
certificateData.signatureAlgorithm = 'rsa';
params = getParamsRSA(cert);
} else if (publicKeyAlgoFN === 'ECC') {
certificateData.signatureAlgorithm = 'ecdsa';
params = getParamsECDSA(cert);
} else if (publicKeyAlgoFN === 'RSASSA_PSS') {
certificateData.signatureAlgorithm = 'rsapss';
params = getParamsRSAPSS(cert);
} else {
console.log(publicKeyAlgoFN);
}
certificateData.publicKeyDetails = params;
certificateData.issuer = getIssuerCountryCode(cert);
certificateData.validity = {
notBefore: cert.notBefore.value.toString(),
notAfter: cert.notAfter.value.toString(),
};
const ski = getSubjectKeyIdentifier(cert);
certificateData.id = ski.slice(0, 12);
certificateData.subjectKeyIdentifier = ski;
certificateData.rawPem = pem;
const authorityKeyIdentifier = getAuthorityKeyIdentifier(cert);
certificateData.authorityKeyIdentifier = authorityKeyIdentifier;
// corner case for rsapss
if (certificateData.signatureAlgorithm === 'rsapss' && !certificateData.hashAlgorithm) {
certificateData.hashAlgorithm = (
certificateData.publicKeyDetails as PublicKeyDetailsRSAPSS
).hashAlgorithm;
}
return certificateData;
} catch (error) {
console.error(`Error processing certificate`, error);
throw error;
let certificateData: CertificateData = {
id: '',
issuer: '',
validity: {
notBefore: '',
notAfter: '',
},
subjectKeyIdentifier: '',
authorityKeyIdentifier: '',
signatureAlgorithm: '',
hashAlgorithm: '',
publicKeyDetails: undefined,
rawPem: '',
rawTxt: '',
};
try {
const pemFormatted = pem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n|\r)/g, '');
const binary = Buffer.from(pemFormatted, 'base64');
const arrayBuffer = new ArrayBuffer(binary.length);
const view = new Uint8Array(arrayBuffer);
for (let i = 0; i < binary.length; i++) {
view[i] = binary[i];
}
const asn1 = asn1js.fromBER(arrayBuffer);
if (asn1.offset === -1) {
throw new Error(`ASN.1 parsing error: ${asn1.result.error}`);
}
const cert = new Certificate({ schema: asn1.result });
const publicKeyAlgoOID = cert.subjectPublicKeyInfo.algorithm.algorithmId;
const publicKeyAlgoFN = getFriendlyName(publicKeyAlgoOID);
const signatureAlgoOID = cert.signatureAlgorithm.algorithmId;
const signatureAlgoFN = getFriendlyName(signatureAlgoOID);
certificateData.hashAlgorithm = getHashAlgorithm(signatureAlgoFN);
let params;
if (publicKeyAlgoFN === 'RSA') {
certificateData.signatureAlgorithm = 'rsa';
params = getParamsRSA(cert);
} else if (publicKeyAlgoFN === 'ECC') {
certificateData.signatureAlgorithm = 'ecdsa';
params = getParamsECDSA(cert);
} else if (publicKeyAlgoFN === 'RSASSA_PSS') {
certificateData.signatureAlgorithm = 'rsapss';
params = getParamsRSAPSS(cert);
} else {
console.log(publicKeyAlgoFN);
}
certificateData.publicKeyDetails = params;
certificateData.issuer = getIssuerCountryCode(cert);
certificateData.validity = {
notBefore: cert.notBefore.value.toString(),
notAfter: cert.notAfter.value.toString(),
};
const ski = getSubjectKeyIdentifier(cert);
certificateData.id = ski.slice(0, 12);
certificateData.subjectKeyIdentifier = ski;
certificateData.rawPem = pem;
const authorityKeyIdentifier = getAuthorityKeyIdentifier(cert);
certificateData.authorityKeyIdentifier = authorityKeyIdentifier;
// corner case for rsapss
if (certificateData.signatureAlgorithm === 'rsapss' && !certificateData.hashAlgorithm) {
certificateData.hashAlgorithm = (
certificateData.publicKeyDetails as PublicKeyDetailsRSAPSS
).hashAlgorithm;
}
return certificateData;
} catch (error) {
console.error(`Error processing certificate`, error);
throw error;
}
}
function getParamsRSA(cert: Certificate): PublicKeyDetailsRSA {
const publicKeyValue = cert.subjectPublicKeyInfo.parsedKey as RSAPublicKey;
const modulusBytes = publicKeyValue.modulus.valueBlock.valueHexView;
const modulusHex = Buffer.from(modulusBytes).toString('hex');
const exponentBigInt = publicKeyValue.publicExponent.toBigInt();
const exponentDecimal = exponentBigInt.toString();
const actualBits = modulusBytes.length * 8;
const publicKeyValue = cert.subjectPublicKeyInfo.parsedKey as RSAPublicKey;
const modulusBytes = publicKeyValue.modulus.valueBlock.valueHexView;
const modulusHex = Buffer.from(modulusBytes).toString('hex');
const exponentBigInt = publicKeyValue.publicExponent.toBigInt();
const exponentDecimal = exponentBigInt.toString();
const actualBits = modulusBytes.length * 8;
return {
modulus: modulusHex,
exponent: exponentDecimal,
bits: actualBits.toString(),
};
return {
modulus: modulusHex,
exponent: exponentDecimal,
bits: actualBits.toString(),
};
}
function getParamsRSAPSS(cert: Certificate): PublicKeyDetailsRSAPSS {
// Get the subjectPublicKey BitString
const spki = cert.subjectPublicKeyInfo;
const spkiValueHex = spki.subjectPublicKey.valueBlock.valueHexView;
// Get the subjectPublicKey BitString
const spki = cert.subjectPublicKeyInfo;
const spkiValueHex = spki.subjectPublicKey.valueBlock.valueHexView;
// Parse the public key ASN.1 structure
const asn1PublicKey = asn1js.fromBER(spkiValueHex);
if (asn1PublicKey.offset === -1) {
throw new Error('Error parsing public key ASN.1 structure');
}
// Parse the public key ASN.1 structure
const asn1PublicKey = asn1js.fromBER(spkiValueHex);
if (asn1PublicKey.offset === -1) {
throw new Error('Error parsing public key ASN.1 structure');
}
// The public key is an RSAPublicKey structure
const rsaPublicKey = new RSAPublicKey({ schema: asn1PublicKey.result });
const modulusBytes = rsaPublicKey.modulus.valueBlock.valueHexView;
const modulusHex = Buffer.from(modulusBytes).toString('hex');
const exponentBigInt = rsaPublicKey.publicExponent.toBigInt();
const exponentDecimal = exponentBigInt.toString();
const actualBits = modulusBytes.length * 8;
// The public key is an RSAPublicKey structure
const rsaPublicKey = new RSAPublicKey({ schema: asn1PublicKey.result });
const modulusBytes = rsaPublicKey.modulus.valueBlock.valueHexView;
const modulusHex = Buffer.from(modulusBytes).toString('hex');
const exponentBigInt = rsaPublicKey.publicExponent.toBigInt();
const exponentDecimal = exponentBigInt.toString();
const actualBits = modulusBytes.length * 8;
const sigAlgParams = cert.signatureAlgorithm.algorithmParams;
const pssParams = new RSASSAPSSParams({ schema: sigAlgParams });
const hashAlgorithm = getFriendlyName(pssParams.hashAlgorithm.algorithmId);
const mgf = getFriendlyName(pssParams.maskGenAlgorithm.algorithmId);
const sigAlgParams = cert.signatureAlgorithm.algorithmParams;
const pssParams = new RSASSAPSSParams({ schema: sigAlgParams });
const hashAlgorithm = getFriendlyName(pssParams.hashAlgorithm.algorithmId);
const mgf = getFriendlyName(pssParams.maskGenAlgorithm.algorithmId);
return {
modulus: modulusHex,
exponent: exponentDecimal,
bits: actualBits.toString(),
hashAlgorithm: hashAlgorithm,
mgf: mgf,
saltLength: pssParams.saltLength.toString(),
};
return {
modulus: modulusHex,
exponent: exponentDecimal,
bits: actualBits.toString(),
hashAlgorithm: hashAlgorithm,
mgf: mgf,
saltLength: pssParams.saltLength.toString(),
};
}
export function getParamsECDSA(cert: Certificate): PublicKeyDetailsECDSA {
try {
const algorithmParams = cert.subjectPublicKeyInfo.algorithm.algorithmParams;
try {
const algorithmParams = cert.subjectPublicKeyInfo.algorithm.algorithmParams;
if (!algorithmParams) {
console.error('No algorithm params found');
return {
curve: 'Unknown',
params: {} as StandardCurve,
bits: 'Unknown',
x: 'Unknown',
y: 'Unknown',
};
}
let curveName,
bits,
x,
y = 'Unknown';
let curveParams: StandardCurve = {} as StandardCurve;
// Try to get the curve name from the OID
if (algorithmParams instanceof asn1js.ObjectIdentifier) {
const curveOid = algorithmParams.valueBlock.toString();
curveName = getFriendlyName(curveOid) || 'Unknown';
bits = getECDSACurveBits(curveName);
}
// If the OID of the curve is not present, we try to get the curve parameters and identify the curve from them
else {
const params = asn1js.fromBER(algorithmParams.valueBeforeDecodeView).result;
const valueBlock: any = params.valueBlock;
if (valueBlock.value && valueBlock.value.length >= 5) {
const curveParams: StandardCurve = {} as StandardCurve;
// Field ID (index 1)
const fieldId = valueBlock.value[1];
if (fieldId && fieldId.valueBlock && fieldId.valueBlock.value) {
const fieldType = fieldId.valueBlock.value[0];
const prime = fieldId.valueBlock.value[1];
//curveParams.fieldType = fieldType.valueBlock.toString();
curveParams.p = Buffer.from(prime.valueBlock.valueHexView).toString('hex');
}
// Curve Coefficients (index 2)
const curveCoefficients = valueBlock.value[2];
if (
curveCoefficients &&
curveCoefficients.valueBlock &&
curveCoefficients.valueBlock.value
) {
const a = curveCoefficients.valueBlock.value[0];
const b = curveCoefficients.valueBlock.value[1];
curveParams.a = Buffer.from(a.valueBlock.valueHexView).toString('hex');
curveParams.b = Buffer.from(b.valueBlock.valueHexView).toString('hex');
}
// Base Point G (index 3)
const basePoint = valueBlock.value[3];
if (basePoint && basePoint.valueBlock) {
curveParams.G = Buffer.from(basePoint.valueBlock.valueHexView).toString('hex');
}
// Order n (index 4)
const order = valueBlock.value[4];
if (order && order.valueBlock) {
curveParams.n = Buffer.from(order.valueBlock.valueHexView).toString('hex');
}
if (valueBlock.value.length >= 6) {
// Cofactor h (index 5)
const cofactor = valueBlock.value[5];
if (cofactor && cofactor.valueBlock) {
curveParams.h = Buffer.from(cofactor.valueBlock.valueHexView).toString('hex');
}
} else {
curveParams.h = '01';
}
const identifiedCurve = identifyCurve(curveParams);
curveName = identifiedCurve;
bits = getECDSACurveBits(curveName);
} else {
if (valueBlock.value) {
console.log(valueBlock.value);
} else {
console.log('No value block found');
}
}
}
// Get the public key x and y parameters
const publicKeyBuffer = cert.subjectPublicKeyInfo.subjectPublicKey.valueBlock.valueHexView;
if (publicKeyBuffer && curveName !== 'Unknown') {
const elliptic = initElliptic();
const ec = new elliptic.ec(getCurveForElliptic(curveName));
const key = ec.keyFromPublic(publicKeyBuffer);
x = key.getPublic().getX().toString('hex');
y = key.getPublic().getY().toString('hex');
}
return { curve: curveName, params: curveParams, bits: bits, x: x, y: y };
} catch (error) {
console.error('Error parsing EC parameters:', error);
return {
curve: 'Error',
params: {} as StandardCurve,
bits: 'Unknown',
x: 'Unknown',
y: 'Unknown',
};
if (!algorithmParams) {
console.error('No algorithm params found');
return {
curve: 'Unknown',
params: {} as StandardCurve,
bits: 'Unknown',
x: 'Unknown',
y: 'Unknown',
};
}
let curveName,
bits,
x,
y = 'Unknown';
let curveParams: StandardCurve = {} as StandardCurve;
// Try to get the curve name from the OID
if (algorithmParams instanceof asn1js.ObjectIdentifier) {
const curveOid = algorithmParams.valueBlock.toString();
curveName = getFriendlyName(curveOid) || 'Unknown';
bits = getECDSACurveBits(curveName);
}
// If the OID of the curve is not present, we try to get the curve parameters and identify the curve from them
else {
const params = asn1js.fromBER(algorithmParams.valueBeforeDecodeView).result;
const valueBlock: any = params.valueBlock;
if (valueBlock.value && valueBlock.value.length >= 5) {
const curveParams: StandardCurve = {} as StandardCurve;
// Field ID (index 1)
const fieldId = valueBlock.value[1];
if (fieldId && fieldId.valueBlock && fieldId.valueBlock.value) {
const fieldType = fieldId.valueBlock.value[0];
const prime = fieldId.valueBlock.value[1];
//curveParams.fieldType = fieldType.valueBlock.toString();
curveParams.p = Buffer.from(prime.valueBlock.valueHexView).toString('hex');
}
// Curve Coefficients (index 2)
const curveCoefficients = valueBlock.value[2];
if (
curveCoefficients &&
curveCoefficients.valueBlock &&
curveCoefficients.valueBlock.value
) {
const a = curveCoefficients.valueBlock.value[0];
const b = curveCoefficients.valueBlock.value[1];
curveParams.a = Buffer.from(a.valueBlock.valueHexView).toString('hex');
curveParams.b = Buffer.from(b.valueBlock.valueHexView).toString('hex');
}
// Base Point G (index 3)
const basePoint = valueBlock.value[3];
if (basePoint && basePoint.valueBlock) {
curveParams.G = Buffer.from(basePoint.valueBlock.valueHexView).toString('hex');
}
// Order n (index 4)
const order = valueBlock.value[4];
if (order && order.valueBlock) {
curveParams.n = Buffer.from(order.valueBlock.valueHexView).toString('hex');
}
if (valueBlock.value.length >= 6) {
// Cofactor h (index 5)
const cofactor = valueBlock.value[5];
if (cofactor && cofactor.valueBlock) {
curveParams.h = Buffer.from(cofactor.valueBlock.valueHexView).toString('hex');
}
} else {
curveParams.h = '01';
}
const identifiedCurve = identifyCurve(curveParams);
curveName = identifiedCurve;
bits = getECDSACurveBits(curveName);
} else {
if (valueBlock.value) {
console.log(valueBlock.value);
} else {
console.log('No value block found');
}
}
}
// Get the public key x and y parameters
const publicKeyBuffer = cert.subjectPublicKeyInfo.subjectPublicKey.valueBlock.valueHexView;
if (publicKeyBuffer && curveName !== 'Unknown') {
const elliptic = initElliptic();
const ec = new elliptic.ec(getCurveForElliptic(curveName));
const key = ec.keyFromPublic(publicKeyBuffer);
x = key.getPublic().getX().toString('hex');
y = key.getPublic().getY().toString('hex');
}
return { curve: curveName, params: curveParams, bits: bits, x: x, y: y };
} catch (error) {
console.error('Error parsing EC parameters:', error);
return {
curve: 'Error',
params: {} as StandardCurve,
bits: 'Unknown',
x: 'Unknown',
y: 'Unknown',
};
}
}
export const getAuthorityKeyIdentifier = (cert: Certificate): string => {
const authorityKeyIdentifier = cert.extensions.find((ext) => ext.extnID === '2.5.29.35');
if (authorityKeyIdentifier) {
let akiValue = Buffer.from(authorityKeyIdentifier.extnValue.valueBlock.valueHexView).toString(
'hex'
);
akiValue = akiValue.replace(/^(?:3016)?(?:0414)?/, '');
// cur off the first 2 bytes
akiValue = akiValue.slice(4);
return akiValue;
}
return null;
const authorityKeyIdentifier = cert.extensions.find((ext) => ext.extnID === '2.5.29.35');
if (authorityKeyIdentifier) {
let akiValue = Buffer.from(authorityKeyIdentifier.extnValue.valueBlock.valueHexView).toString(
'hex'
);
akiValue = akiValue.replace(/^(?:3016)?(?:0414)?/, '');
// cur off the first 2 bytes
akiValue = akiValue.slice(4);
return akiValue;
}
return null;
};
export const getCircuitName = (
circuitMode: 'prove' | 'dsc' | 'vc_and_disclose',
signatureAlgorithm: string,
hashFunction: string,
domainParameter: string,
keyLength: string
circuitMode: 'prove' | 'dsc' | 'vc_and_disclose',
signatureAlgorithm: string,
hashFunction: string,
domainParameter: string,
keyLength: string
) => {
const circuit = circuitNameFromMode[circuitMode];
if (circuit == 'vc_and_disclose') {
return 'vc_and_disclose';
}
if (circuit == 'dsc') {
return (
circuit +
'_' +
signatureAlgorithm +
'_' +
hashFunction +
'_' +
domainParameter +
'_' +
keyLength
);
}
const circuit = circuitNameFromMode[circuitMode];
if (circuit == 'vc_and_disclose') {
return 'vc_and_disclose';
}
if (circuit == 'dsc') {
return (
circuit +
'_' +
signatureAlgorithm +
'_' +
hashFunction +
'_' +
domainParameter +
'_' +
keyLength
circuit +
'_' +
signatureAlgorithm +
'_' +
hashFunction +
'_' +
domainParameter +
'_' +
keyLength
);
}
return (
circuit +
'_' +
signatureAlgorithm +
'_' +
hashFunction +
'_' +
domainParameter +
'_' +
keyLength
);
};
export const getCircuitNameOld = (
circuitMode: Mode,
signatureAlgorithm: string,
hashFunction: string
circuitMode: Mode,
signatureAlgorithm: string,
hashFunction: string
) => {
const circuit = circuitNameFromMode[circuitMode];
if (circuit == 'vc_and_disclose') {
return 'vc_and_disclose';
} else if (signatureAlgorithm === 'ecdsa') {
return circuit + '_' + signatureAlgorithm + '_secp256r1_' + hashFunction;
} else {
return circuit + '_' + signatureAlgorithm + '_65537_' + hashFunction;
}
const circuit = circuitNameFromMode[circuitMode];
if (circuit == 'vc_and_disclose') {
return 'vc_and_disclose';
} else if (signatureAlgorithm === 'ecdsa') {
return circuit + '_' + signatureAlgorithm + '_secp256r1_' + hashFunction;
} else {
return circuit + '_' + signatureAlgorithm + '_65537_' + hashFunction;
}
};
export function getHashAlgorithm(rawSignatureAlgorithm: string) {
const input = rawSignatureAlgorithm.toLowerCase();
const patterns = [/sha-?1/i, /sha-?256/i, /sha-?384/i, /sha-?512/i];
const input = rawSignatureAlgorithm.toLowerCase();
const patterns = [/sha-?1/i, /sha-?256/i, /sha-?384/i, /sha-?512/i];
for (const pattern of patterns) {
const match = input.match(pattern);
if (match) {
// Remove any hyphens and return standardized format
return match[0].replace('-', '');
}
for (const pattern of patterns) {
const match = input.match(pattern);
if (match) {
// Remove any hyphens and return standardized format
return match[0].replace('-', '');
}
}
return 'unknown';
return 'unknown';
}

View File

@@ -36,8 +36,7 @@ export const getAuthorityKeyIdentifier = (cert: Certificate): string => {
}
}
}
}
else {
} else {
console.log('\x1b[31m%s\x1b[0m', 'no authority key identifier found');
}
return '';

View File

@@ -38,4 +38,4 @@ export function getCircuitNameFromPassportData(passportData: PassportData) {
} else {
throw new Error('Unsupported signature algorithm');
}
}
}

View File

@@ -58,6 +58,12 @@ import {
mock_dsc_sha512_brainpoolP512r1,
mock_dsc_key_sha224_braipoolP224r1,
mock_dsc_sha224_brainpoolP224r1,
mock_dsc_key_sha512_rsa_65537_4096,
mock_dsc_sha512_rsa_65537_4096,
mock_dsc_key_sha256_rsa_3_4096,
mock_dsc_sha256_rsa_3_4096,
mock_dsc_key_sha512_rsa_65537_2048,
mock_dsc_sha512_rsa_65537_2048,
} from '../constants/mockCertificates';
import { countryCodes } from '../constants/constants';
import { parseCertificateSimple } from './certificate_parsing/parseCertificateSimple';
@@ -145,6 +151,10 @@ export function genMockPassportData(
privateKeyPem = mock_dsc_key_sha1_rsa_4096;
dsc = mock_dsc_sha1_rsa_4096;
break;
case 'rsa_sha1_65537_4096':
privateKeyPem = mock_dsc_key_sha1_rsa_4096;
dsc = mock_dsc_sha1_rsa_4096;
break;
case 'rsa_sha256_65537_2048':
privateKeyPem = mock_dsc_key_sha256_rsa_4096;
dsc = mock_dsc_sha256_rsa_4096;
@@ -233,6 +243,22 @@ export function genMockPassportData(
privateKeyPem = mock_dsc_key_sha512_brainpoolP512r1;
dsc = mock_dsc_sha512_brainpoolP512r1;
break;
case 'rsa_sha256_65537_4096':
privateKeyPem = mock_dsc_key_sha256_rsa_4096;
dsc = mock_dsc_sha256_rsa_4096;
break;
case 'rsa_sha512_65537_4096':
privateKeyPem = mock_dsc_key_sha512_rsa_65537_4096;
dsc = mock_dsc_sha512_rsa_65537_4096;
break;
case 'rsa_sha512_65537_2048':
privateKeyPem = mock_dsc_key_sha512_rsa_65537_2048;
dsc = mock_dsc_sha512_rsa_65537_2048;
break;
case 'rsa_sha256_3_4096':
privateKeyPem = mock_dsc_key_sha256_rsa_3_4096;
dsc = mock_dsc_sha256_rsa_3_4096;
break;
}
// Generate MRZ hash first

View File

@@ -72,7 +72,7 @@ export function generateCircuitInputsDisclose(
const name_leaf = getNameLeaf(formattedMrz.slice(10, 49)); // [6-44] + 5 shift
const {
root: smt_root,
closestleaf: smt_leaf_value,
closestleaf: smt_leaf_key,
siblings: smt_siblings,
} = generateSMTProof(name_smt, name_leaf);
@@ -93,7 +93,7 @@ export function generateCircuitInputsDisclose(
majority: formatInput(majority_ascii),
user_identifier: formatInput(castFromUUID(user_identifier)),
smt_root: formatInput(smt_root),
smt_leaf_value: formatInput(smt_leaf_value),
smt_leaf_key: formatInput(smt_leaf_key),
smt_siblings: formatInput(smt_siblings),
selector_ofac: formatInput(selector_ofac),
forbidden_countries_list: formatInput(formatCountriesList(forbidden_countries_list)),
@@ -123,7 +123,7 @@ export function generateCircuitInputsOfac(
return {
dg1: formatInput(mrz_bytes),
smt_leaf_value: formatInput(closestleaf),
smt_leaf_key: formatInput(closestleaf),
smt_root: formatInput(root),
smt_siblings: formatInput(siblings),
};
@@ -141,7 +141,7 @@ export function generateCircuitInputsCountryVerifier(
return {
dg1: formatInput(mrz_bytes),
hostCountry: formatInput(usa_ascii),
smt_leaf_value: formatInput(closestleaf),
smt_leaf_key: formatInput(closestleaf),
smt_root: formatInput(root),
smt_siblings: formatInput(siblings),
};
@@ -168,7 +168,7 @@ export function findIndexInTree(tree: LeanIMT, commitment: bigint): number {
export function generateCircuitInputsRegister(
secret: number | string,
dsc_secret: number | string,
passportData: PassportData,
passportData: PassportData
) {
const { mrz, eContent, signedAttr, dg2Hash } = passportData;
const passportMetadata = parsePassportData(passportData);

View File

@@ -1,45 +1,48 @@
import { brutforceSignatureAlgorithmDsc } from "./brutForceDscSignature";
import { CertificateData } from "./certificate_parsing/dataStructure";
import { parseCertificateSimple } from "./certificate_parsing/parseCertificateSimple";
import { getCSCAFromSKI } from "./csca";
import { getCurveOrExponent } from "./parsePassportData";
import { brutforceSignatureAlgorithmDsc } from './brutForceDscSignature';
import { CertificateData } from './certificate_parsing/dataStructure';
import { parseCertificateSimple } from './certificate_parsing/parseCertificateSimple';
import { getCSCAFromSKI } from './csca';
import { getCurveOrExponent } from './parsePassportData';
export interface DscCertificateMetaData {
cscaFound: boolean;
cscaHashAlgorithm: string;
cscaSignatureAlgorithm: string;
cscaCurveOrExponent: string;
cscaSignatureAlgorithmBits: number;
cscaSaltLength: number;
cscaFound: boolean;
cscaHashAlgorithm: string;
cscaSignatureAlgorithm: string;
cscaCurveOrExponent: string;
cscaSignatureAlgorithmBits: number;
cscaSaltLength: number;
}
export function parseDscCertificateData(dscCert: CertificateData): any {
let csca, parsedCsca, cscaHashAlgorithm, cscaSignatureAlgorithm, cscaCurveOrExponent, cscaSignatureAlgorithmBits, cscaSaltLength;
let cscaFound = false;
if (dscCert.authorityKeyIdentifier) {
try {
csca = getCSCAFromSKI(dscCert.authorityKeyIdentifier, true);
if (csca) {
parsedCsca = parseCertificateSimple(csca);
const details = brutforceSignatureAlgorithmDsc(dscCert, parsedCsca);
cscaFound = true;
cscaHashAlgorithm = details.hashAlgorithm;
cscaSignatureAlgorithm = details.signatureAlgorithm;
cscaCurveOrExponent = getCurveOrExponent(parsedCsca);
cscaSignatureAlgorithmBits = parseInt(parsedCsca.publicKeyDetails.bits);
cscaSaltLength = details.saltLength;
}
} catch (error) {
}
}
return {
cscaFound,
cscaHashAlgorithm,
cscaSignatureAlgorithm,
cscaCurveOrExponent,
cscaSignatureAlgorithmBits,
cscaSaltLength
}
}
let csca,
parsedCsca,
cscaHashAlgorithm,
cscaSignatureAlgorithm,
cscaCurveOrExponent,
cscaSignatureAlgorithmBits,
cscaSaltLength;
let cscaFound = false;
if (dscCert.authorityKeyIdentifier) {
try {
csca = getCSCAFromSKI(dscCert.authorityKeyIdentifier, true);
if (csca) {
parsedCsca = parseCertificateSimple(csca);
const details = brutforceSignatureAlgorithmDsc(dscCert, parsedCsca);
cscaFound = true;
cscaHashAlgorithm = details.hashAlgorithm;
cscaSignatureAlgorithm = details.signatureAlgorithm;
cscaCurveOrExponent = getCurveOrExponent(parsedCsca);
cscaSignatureAlgorithmBits = parseInt(parsedCsca.publicKeyDetails.bits);
cscaSaltLength = details.saltLength;
}
} catch (error) {}
}
return {
cscaFound,
cscaHashAlgorithm,
cscaSignatureAlgorithm,
cscaCurveOrExponent,
cscaSignatureAlgorithmBits,
cscaSaltLength,
};
}

View File

@@ -2,153 +2,147 @@ import { PassportData } from '../../../common/src/utils/types';
import { findSubarrayIndex, formatMrz, getHashLen, hash } from './utils';
import { parseCertificateSimple } from './certificate_parsing/parseCertificateSimple';
import {
CertificateData,
PublicKeyDetailsECDSA,
PublicKeyDetailsRSA,
PublicKeyDetailsRSAPSS,
CertificateData,
PublicKeyDetailsECDSA,
PublicKeyDetailsRSA,
PublicKeyDetailsRSAPSS,
} from './certificate_parsing/dataStructure';
import { hashAlgos } from '../constants/constants';
import { brutforceSignatureAlgorithm } from './brutForcePassportSignature';
import { DscCertificateMetaData, parseDscCertificateData } from './parseDscCertificateData';
export interface PassportMetadata {
dataGroups: string;
dg1HashFunction: string;
dg1HashOffset: number;
dgPaddingBytes: number;
eContentSize: number;
eContentHashFunction: string;
eContentHashOffset: number;
signedAttrSize: number;
signedAttrHashFunction: string;
signatureAlgorithm: string;
saltLength: number;
curveOrExponent: string;
signatureAlgorithmBits: number;
countryCode: string;
cscaFound: boolean;
cscaHashFunction: string;
cscaSignature: string;
cscaSaltLength: number;
cscaCurveOrExponent: string;
cscaSignatureAlgorithmBits: number;
dsc: string;
dataGroups: string;
dg1HashFunction: string;
dg1HashOffset: number;
dgPaddingBytes: number;
eContentSize: number;
eContentHashFunction: string;
eContentHashOffset: number;
signedAttrSize: number;
signedAttrHashFunction: string;
signatureAlgorithm: string;
saltLength: number;
curveOrExponent: string;
signatureAlgorithmBits: number;
countryCode: string;
cscaFound: boolean;
cscaHashFunction: string;
cscaSignature: string;
cscaSaltLength: number;
cscaCurveOrExponent: string;
cscaSignatureAlgorithmBits: number;
dsc: string;
}
function findHashSizeOfEContent(eContent: number[], signedAttr: number[]) {
for (const hashFunction of hashAlgos) {
const hashValue = hash(hashFunction, eContent);
const hashOffset = findSubarrayIndex(signedAttr, hashValue as number[]);
if (hashOffset !== -1) {
return { hashFunction, offset: hashOffset };
}
for (const hashFunction of hashAlgos) {
const hashValue = hash(hashFunction, eContent);
const hashOffset = findSubarrayIndex(signedAttr, hashValue as number[]);
if (hashOffset !== -1) {
return { hashFunction, offset: hashOffset };
}
return { hashFunction: 'unknown', offset: -1 };
}
return { hashFunction: 'unknown', offset: -1 };
}
function findDG1HashInEContent(
mrz: string,
eContent: number[]
mrz: string,
eContent: number[]
): { hash: number[]; hashFunction: string; offset: number } | null {
const formattedMrz = formatMrz(mrz);
const formattedMrz = formatMrz(mrz);
for (const hashFunction of hashAlgos) {
const hashValue = hash(hashFunction, formattedMrz);
const normalizedHash = (hashValue as number[]).map((byte) => (byte > 127 ? byte - 256 : byte));
const hashOffset = findSubarrayIndex(eContent, normalizedHash);
for (const hashFunction of hashAlgos) {
const hashValue = hash(hashFunction, formattedMrz);
const normalizedHash = (hashValue as number[]).map((byte) => (byte > 127 ? byte - 256 : byte));
const hashOffset = findSubarrayIndex(eContent, normalizedHash);
if (hashOffset !== -1) {
return { hash: hashValue as number[], hashFunction, offset: hashOffset };
}
if (hashOffset !== -1) {
return { hash: hashValue as number[], hashFunction, offset: hashOffset };
}
return null;
}
return null;
}
function getDgPaddingBytes(passportData: PassportData, dg1HashFunction: string): number {
const formattedMrz = formatMrz(passportData.mrz);
const hashValue = hash(dg1HashFunction, formattedMrz);
const normalizedHash = (hashValue as number[]).map((byte) => (byte > 127 ? byte - 256 : byte));
const dg1HashOffset = findSubarrayIndex(passportData.eContent, normalizedHash);
const dg2Hash = passportData.dg2Hash;
const normalizedDg2Hash = (dg2Hash as number[]).map((byte) => (byte > 127 ? byte - 256 : byte));
const dg2HashOffset = findSubarrayIndex(passportData.eContent, normalizedDg2Hash);
return dg2HashOffset - dg1HashOffset - getHashLen(dg1HashFunction);
const formattedMrz = formatMrz(passportData.mrz);
const hashValue = hash(dg1HashFunction, formattedMrz);
const normalizedHash = (hashValue as number[]).map((byte) => (byte > 127 ? byte - 256 : byte));
const dg1HashOffset = findSubarrayIndex(passportData.eContent, normalizedHash);
const dg2Hash = passportData.dg2Hash;
const normalizedDg2Hash = (dg2Hash as number[]).map((byte) => (byte > 127 ? byte - 256 : byte));
const dg2HashOffset = findSubarrayIndex(passportData.eContent, normalizedDg2Hash);
return dg2HashOffset - dg1HashOffset - getHashLen(dg1HashFunction);
}
export function getCountryCodeFromMrz(mrz: string): string {
return mrz.substring(2, 5);
return mrz.substring(2, 5);
}
export function getCurveOrExponent(certData: CertificateData): string {
if (certData.signatureAlgorithm === 'rsapss' || certData.signatureAlgorithm === 'rsa') {
return (certData.publicKeyDetails as PublicKeyDetailsRSA).exponent;
}
return (certData.publicKeyDetails as PublicKeyDetailsECDSA).curve;
if (certData.signatureAlgorithm === 'rsapss' || certData.signatureAlgorithm === 'rsa') {
return (certData.publicKeyDetails as PublicKeyDetailsRSA).exponent;
}
return (certData.publicKeyDetails as PublicKeyDetailsECDSA).curve;
}
export function parsePassportData(passportData: PassportData): PassportMetadata {
const dg1HashInfo = passportData.mrz
? findDG1HashInEContent(passportData.mrz, passportData.eContent)
: null;
const dg1HashInfo = passportData.mrz
? findDG1HashInEContent(passportData.mrz, passportData.eContent)
: null;
const dg1HashFunction = dg1HashInfo?.hashFunction || 'unknown';
const dg1HashOffset = dg1HashInfo?.offset || 0;
let dgPaddingBytes = -1;
try {
dgPaddingBytes = getDgPaddingBytes(passportData, dg1HashFunction);
} catch (error) {
console.error('Error getting DG padding bytes:', error);
}
const { hashFunction: eContentHashFunction, offset: eContentHashOffset } = findHashSizeOfEContent(
passportData.eContent,
passportData.signedAttr
);
const dg1HashFunction = dg1HashInfo?.hashFunction || 'unknown';
const dg1HashOffset = dg1HashInfo?.offset || 0;
let dgPaddingBytes = -1;
try {
dgPaddingBytes = getDgPaddingBytes(passportData, dg1HashFunction);
} catch (error) {
console.error('Error getting DG padding bytes:', error);
}
const { hashFunction: eContentHashFunction, offset: eContentHashOffset } = findHashSizeOfEContent(
passportData.eContent,
passportData.signedAttr
);
const brutForcedPublicKeyDetails = brutforceSignatureAlgorithm(passportData);
const brutForcedPublicKeyDetails = brutforceSignatureAlgorithm(passportData);
let parsedDsc = null;
let dscSignatureAlgorithmBits = 0;
let parsedDsc = null;
let dscSignatureAlgorithmBits = 0;
let brutForcedPublicKeyDetailsDsc: DscCertificateMetaData;
let brutForcedPublicKeyDetailsDsc: DscCertificateMetaData;
if (passportData.dsc) {
parsedDsc = parseCertificateSimple(passportData.dsc);
dscSignatureAlgorithmBits = parseInt(parsedDsc.publicKeyDetails?.bits || '0');
if (passportData.dsc) {
parsedDsc = parseCertificateSimple(passportData.dsc);
dscSignatureAlgorithmBits = parseInt(parsedDsc.publicKeyDetails?.bits || '0');
brutForcedPublicKeyDetailsDsc = parseDscCertificateData(parsedDsc)
brutForcedPublicKeyDetailsDsc = parseDscCertificateData(parsedDsc);
}
}
return {
dataGroups:
passportData.dgPresents
?.toString()
.split(',')
.map((item) => item.replace('DG', ''))
.join(',') || 'None',
dg1HashFunction,
dg1HashOffset,
dgPaddingBytes,
eContentSize: passportData.eContent?.length || 0,
eContentHashFunction,
eContentHashOffset,
signedAttrSize: passportData.signedAttr?.length || 0,
signedAttrHashFunction: brutForcedPublicKeyDetails.hashAlgorithm,
signatureAlgorithm: brutForcedPublicKeyDetails.signatureAlgorithm,
saltLength: brutForcedPublicKeyDetails.saltLength,
curveOrExponent: parsedDsc ? getCurveOrExponent(parsedDsc) : 'unknown',
signatureAlgorithmBits: dscSignatureAlgorithmBits,
countryCode: passportData.mrz ? getCountryCodeFromMrz(passportData.mrz) : 'unknown',
cscaFound: brutForcedPublicKeyDetailsDsc.cscaFound,
cscaHashFunction: brutForcedPublicKeyDetailsDsc.cscaHashAlgorithm,
cscaSignature: brutForcedPublicKeyDetailsDsc.cscaSignatureAlgorithm,
cscaSaltLength: brutForcedPublicKeyDetailsDsc.cscaSaltLength,
cscaCurveOrExponent: brutForcedPublicKeyDetailsDsc.cscaCurveOrExponent,
cscaSignatureAlgorithmBits: brutForcedPublicKeyDetailsDsc.cscaSignatureAlgorithmBits,
dsc: passportData.dsc,
};
}
return {
dataGroups:
passportData.dgPresents
?.toString()
.split(',')
.map((item) => item.replace('DG', ''))
.join(',') || 'None',
dg1HashFunction,
dg1HashOffset,
dgPaddingBytes,
eContentSize: passportData.eContent?.length || 0,
eContentHashFunction,
eContentHashOffset,
signedAttrSize: passportData.signedAttr?.length || 0,
signedAttrHashFunction: brutForcedPublicKeyDetails.hashAlgorithm,
signatureAlgorithm: brutForcedPublicKeyDetails.signatureAlgorithm,
saltLength: brutForcedPublicKeyDetails.saltLength,
curveOrExponent: parsedDsc ? getCurveOrExponent(parsedDsc) : 'unknown',
signatureAlgorithmBits: dscSignatureAlgorithmBits,
countryCode: passportData.mrz ? getCountryCodeFromMrz(passportData.mrz) : 'unknown',
cscaFound: brutForcedPublicKeyDetailsDsc.cscaFound,
cscaHashFunction: brutForcedPublicKeyDetailsDsc.cscaHashAlgorithm,
cscaSignature: brutForcedPublicKeyDetailsDsc.cscaSignatureAlgorithm,
cscaSaltLength: brutForcedPublicKeyDetailsDsc.cscaSaltLength,
cscaCurveOrExponent: brutForcedPublicKeyDetailsDsc.cscaCurveOrExponent,
cscaSignatureAlgorithmBits: brutForcedPublicKeyDetailsDsc.cscaSignatureAlgorithmBits,
dsc: passportData.dsc,
};
}

View File

@@ -20,25 +20,34 @@ export type SignatureAlgorithm =
| 'rsapss_sha256_3_3072'
| 'rsapss_sha384_65537_3072'
| 'rsapss_sha384_65537_4096'
| 'rsa_sha256_3_4096'
| 'rsa_sha512_65537_2048'
| 'rsa_sha1_65537_4096'
| 'ecdsa_sha256_secp256r1_256'
| 'ecdsa_sha1_secp256r1_256'
| 'ecdsa_sha384_secp384r1_384'
| 'ecdsa_sha256_secp384r1_384'
| 'ecdsa_sha384_brainpoolP256r1_256'
| 'ecdsa_sha512_brainpoolP256r1_256'
| 'ecdsa_sha256_brainpoolP256r1_256'
| 'rsa_sha256_3_2048'
| 'rsa_sha256_65537_3072'
| 'rsa_sha256_65537_4096'
| 'rsa_sha512_65537_4096'
| 'rsa_sha224_65537_2048'
| 'rsapss_sha256_65537_3072'
| 'rsapss_sha256_65537_4096'
| 'rsapss_sha256_3_2048'
| 'rsapss_sha512_3_4096'
| 'rsapss_sha512_3_2048'
| 'rsapss_sha384_3_4096'
| 'rsapss_sha384_3_3072'
| 'ecdsa_sha256_secp384r1_384'
| 'ecdsa_sha384_brainpoolP256r1_256'
| 'ecdsa_sha512_brainpoolP256r1_256'
| 'ecdsa_sha384_brainpoolP384r1_384'
| 'ecdsa_sha512_brainpoolP384r1_384'
| 'ecdsa_sha1_brainpoolP224r1_224'
| 'ecdsa_sha224_brainpoolP224r1_224'
| 'ecdsa_sha256_brainpoolP224r1_224'
| 'ecdsa_sha512_brainpoolP512r1_512'
| 'rsapss_sha256_65537_4096';
| 'ecdsa_sha512_brainpoolP512r1_512';
export type Proof = {
proof: {

View File

@@ -250,7 +250,11 @@ export function hexToDecimal(hex: string): string {
}
// hash logic here because the one in utils.ts only works with node
export function hash(hashFunction: string, bytesArray: number[], format: string = 'bytes'): string | number[] {
export function hash(
hashFunction: string,
bytesArray: number[],
format: string = 'bytes'
): string | number[] {
const unsignedBytesArray = bytesArray.map((byte) => byte & 0xff);
let hashResult: string;
@@ -527,9 +531,9 @@ function checkStringLength(str: string) {
function stringToBigInt(str: string): bigint {
return BigInt(
'1' +
Array.from(str)
.map((char) => char.charCodeAt(0).toString().padStart(3, '0'))
.join('')
Array.from(str)
.map((char) => char.charCodeAt(0).toString().padStart(3, '0'))
.join('')
);
}

View File

@@ -31,7 +31,12 @@ describe('Mock Passport Data Generator', function () {
});
});
function verify(passportData: PassportData, dgHashAlgo: string, eContentHashAlgo: string, sigAlg: string): boolean {
function verify(
passportData: PassportData,
dgHashAlgo: string,
eContentHashAlgo: string,
sigAlg: string
): boolean {
const passportMetaData = parsePassportData(passportData);
// console.log('passportMetaData', passportMetaData);