Skip to content

Commit 28b8f86

Browse files
X509_verify_cert: honor explicit depth 0, don't count anchor against depth
Fenrir 12740: X509_STORE_CTX_set_depth(ctx, 0) was treated as unset and silently got WOLFSSL_X509_STORE_DEFAULT_MAX_DEPTH. - set_depth() now always marks the depth as explicit (new depthSet bit), so 0 means no intermediate CAs are allowed. - An explicit negative depth rejects every chain with CERT_CHAIN_TOO_LONG before any path is built, instead of falling back to the default. - X509_STORE_CTX_init() resets the depth, so a reused context no longer keeps a previous limit. - A positive ctx->depth written directly to the struct (no setter) is still honored. The budget is clamped so INT_MAX cannot overflow it. A trust anchor from X509_STORE_CTX_trusted_stack() or store->certs is found by the same lookup as an untrusted intermediate and cost one extra pass, so explicit depth N only allowed N-1 intermediates there (and depth 0 rejected a leaf issued directly by the anchor). When the budget runs out on a caller-trusted anchor that would end the path (self-issued or PARTIAL_CHAIN), accept it instead of reporting CHAIN_TOO_LONG. An issuer cycle among the untrusted certs (A <- B <- A) was followed until the depth budget ran out, ~2^31 signature checks at INT_MAX. The untrusted-issuer lookup now skips certs already on the path, so the cycle ends the search with UNABLE_TO_GET_ISSUER_CERT_LOCALLY. Adds loop-a/loop-b/loop-leaf fixtures to untrusted_anchor/ for the test. Also fetch the verify callback once in X509_verify_cert() and pass it to X509StoreVerifyCert(), X509StoreCheckPathLen() and the host/IP checks, and factor the PARTIAL_CHAIN test into X509StoreCertIsPartialChain().
1 parent 01426d0 commit 28b8f86

11 files changed

Lines changed: 456 additions & 44 deletions

File tree

certs/intermediate/include.am

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,10 @@ EXTRA_DIST += \
6464
certs/intermediate/untrusted_anchor/leaf-cert.pem \
6565
certs/intermediate/untrusted_anchor/leaf-key.pem \
6666
certs/intermediate/untrusted_anchor/leaf-deep-cert.pem \
67-
certs/intermediate/untrusted_anchor/leaf-deep-key.pem
67+
certs/intermediate/untrusted_anchor/leaf-deep-key.pem \
68+
certs/intermediate/untrusted_anchor/loop-a-cert.pem \
69+
certs/intermediate/untrusted_anchor/loop-a-key.pem \
70+
certs/intermediate/untrusted_anchor/loop-b-cert.pem \
71+
certs/intermediate/untrusted_anchor/loop-b-key.pem \
72+
certs/intermediate/untrusted_anchor/loop-leaf-cert.pem \
73+
certs/intermediate/untrusted_anchor/loop-leaf-key.pem

certs/intermediate/untrusted_anchor/gen_certs.sh

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
# trust anchor)
2020
# int-ca-tampered int-ca with the final byte of its signatureValue
2121
# flipped (valid TBSCertificate, broken outer signature)
22+
# loop-a, loop-b two CAs that issued each other (an issuer cycle that
23+
# never reaches a root); loop-leaf is issued by loop-a
2224
#
2325
# The certificates intentionally omit subjectKeyIdentifier /
2426
# authorityKeyIdentifier; the test relies on this, so the script aborts at the
@@ -42,7 +44,7 @@ RSA_BITS=2048
4244

4345
CA_EXT=$(mktemp)
4446
LEAF_EXT=$(mktemp)
45-
trap 'rm -f "$CA_EXT" "$LEAF_EXT" *.csr *.srl' EXIT
47+
trap 'rm -f "$CA_EXT" "$LEAF_EXT" *.csr *.srl loop-*-seed.pem' EXIT
4648

4749
# No pathlen so the first intermediate can still issue the second one in the
4850
# two-intermediate positive control; no key identifiers (see header).
@@ -107,6 +109,27 @@ genkey leaf-deep-key.pem
107109
signcert leaf-deep.csr leaf-deep-cert.pem int-ca2-cert.pem int-ca2-key.pem \
108110
"$LEAF_EXT"
109111

112+
# Issuer cycle: loop-a is signed by loop-b's key and loop-b by loop-a's. Each
113+
# is signed through a throwaway self-signed seed carrying the other's name and
114+
# key, since neither final cert exists yet. -----------------------------------
115+
genkey loop-a-key.pem
116+
genkey loop-b-key.pem
117+
genroot loop-a-key.pem loop-a-seed.pem "wolfSSL Untrusted-Anchor Test Loop A"
118+
genroot loop-b-key.pem loop-b-seed.pem "wolfSSL Untrusted-Anchor Test Loop B"
119+
"$OPENSSL" req -new -key loop-a-key.pem -sha256 \
120+
-subj "/CN=wolfSSL Untrusted-Anchor Test Loop A" -out loop-a.csr
121+
"$OPENSSL" req -new -key loop-b-key.pem -sha256 \
122+
-subj "/CN=wolfSSL Untrusted-Anchor Test Loop B" -out loop-b.csr
123+
signcert loop-a.csr loop-a-cert.pem loop-b-seed.pem loop-b-key.pem "$CA_EXT"
124+
signcert loop-b.csr loop-b-cert.pem loop-a-seed.pem loop-a-key.pem "$CA_EXT"
125+
126+
# Leaf issued by loop-a -------------------------------------------------------
127+
genkey loop-leaf-key.pem
128+
"$OPENSSL" req -new -key loop-leaf-key.pem -sha256 \
129+
-subj "/CN=www.example.test" -out loop-leaf.csr
130+
signcert loop-leaf.csr loop-leaf-cert.pem loop-a-cert.pem loop-a-key.pem \
131+
"$LEAF_EXT"
132+
110133
# Tampered intermediate: flip the final byte of the DER (last byte of the
111134
# signatureValue) so the TBSCertificate stays valid but the outer signature no
112135
# longer verifies.
@@ -121,7 +144,8 @@ rm -f int-ca.der int-ca-tampered.der
121144

122145
# Guard: these test certificates must not carry key identifiers (see header).
123146
for c in root-ca-cert.pem alt-ca-cert.pem int-ca-cert.pem int-ca2-cert.pem \
124-
leaf-cert.pem leaf-deep-cert.pem; do
147+
leaf-cert.pem leaf-deep-cert.pem loop-a-cert.pem loop-b-cert.pem \
148+
loop-leaf-cert.pem; do
125149
if "$OPENSSL" x509 -in "$c" -noout -text \
126150
| grep -q "Key Identifier"; then
127151
echo "ERROR: $c carries a subject/authority key identifier." >&2
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDETCCAfmgAwIBAgIUDVfT0weC64i2DklltrgmNk+YkxYwDQYJKoZIhvcNAQEL
3+
BQAwLzEtMCsGA1UEAwwkd29sZlNTTCBVbnRydXN0ZWQtQW5jaG9yIFRlc3QgTG9v
4+
cCBCMCAXDTI2MDkxMTE5MzczNloYDzIwNTYwOTEwMTkzNzM2WjAvMS0wKwYDVQQD
5+
DCR3b2xmU1NMIFVudHJ1c3RlZC1BbmNob3IgVGVzdCBMb29wIEEwggEiMA0GCSqG
6+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCXgVGA2j4kzXRqPU31wxIUTVvx7NYislW5
7+
sKTrICcKdkuZ/YpJDgsETo2J2VW5W1Mbl4o8D5irLRpyNrKesk0/yTQRXylgyETK
8+
DyOP587IlsYnDPh+cyOG15SOZRNTrIhUugOOkO94C75b9J1iwKpjU4Q6b0zZTs2Y
9+
g1LpluRaFWC17/Tcuzx2RsDdudhTw0YStbsY+EDsxOkAPGS52oDAtrVdPN1fT4py
10+
NJi0tdh0QR6yibPctHG/PiW2LnYo7Hz9UzNgo91fb8spqhBq5CSavwENngVCaaJ+
11+
8l3kuK1RIthWJVw+1DfbtO99T/BYl4qQfsSISidUo5URzmEy4QwpAgMBAAGjIzAh
12+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUA
13+
A4IBAQBoBBA0QkL6M17lIYz4+wADI28vSVSg1obcZJOQR6eQV/cwN7Jj86uXOvd0
14+
UfanAImJ2RU8nOCCW2oPFQw2gsmvwqkzuDn9Z02743fOvvQNjKkufKievmySwhCH
15+
E9HTsB5UZq7u9TmGe6XXAf2Mfx77WkcytT0Ji1FOub66+qaUC1n5qYgRB1pX2Wc7
16+
dN6hPx9eMT+tucbpk4XZ8NHR/d5nuiFzYUj5KZ80U5WPOid38NLRKEnGMj8injWr
17+
xWSvurINodjGJfCM+YSjzYaXNqrD/pruyE+1IzSdfzwIXqfEW1C8Pr25aMZVf0Ci
18+
h72ck9bFykMMveb0aiug/1p9IVWX
19+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCXgVGA2j4kzXRq
3+
PU31wxIUTVvx7NYislW5sKTrICcKdkuZ/YpJDgsETo2J2VW5W1Mbl4o8D5irLRpy
4+
NrKesk0/yTQRXylgyETKDyOP587IlsYnDPh+cyOG15SOZRNTrIhUugOOkO94C75b
5+
9J1iwKpjU4Q6b0zZTs2Yg1LpluRaFWC17/Tcuzx2RsDdudhTw0YStbsY+EDsxOkA
6+
PGS52oDAtrVdPN1fT4pyNJi0tdh0QR6yibPctHG/PiW2LnYo7Hz9UzNgo91fb8sp
7+
qhBq5CSavwENngVCaaJ+8l3kuK1RIthWJVw+1DfbtO99T/BYl4qQfsSISidUo5UR
8+
zmEy4QwpAgMBAAECggEAOb/0Zk5KQ9MA3gIyNky+FnkKZCQn15/sp1Ra+LkPyKAg
9+
3zjSvlgZAPJEZ1gtofLasfjIm25CfnU50HFjErTaV0cFjt2cMyUDe5Xbs13j53f5
10+
XidGjUSsNRj1qnWCsXFhohIpiu1aKoMnc3vBhkP0btoF3BRS0b6FBe6A60M2FdPc
11+
HZ6knFCxPDyj1Uis1yduMflzT2d7/qpkE4QY9qp41b7k8T22D4lh6TI9yObT6foZ
12+
GoUZ7+KQryEctG8C0XAsuLR8vfk6QZqSwjKnkPAoMKVY4J77etX/+3VGw8WNIKRH
13+
z80jGO3r8nB3sj3ULQsvMyyCyTHMOfvlkbtmpgyDZQKBgQDGeYj+6KSDjDC4tpmS
14+
YpB76oBu5Daaz4CA60e1KmneuDFAW+zV/NvNCGDL3ebsoJVKAajLus32EsuZNb3r
15+
63gb8CBE66mgwxujSdMA32ei8wI8JXXBQKnmu9G3o8qcvpVjRL+3w43pLCLl5OiT
16+
Cb2bYSEhNNTDuOyK3snudIL6pwKBgQDDarmDu2e3F0zy83D2iKhuQtCpVud4KWWK
17+
Uhei1cF+PEvBRI1JevM1IeLlNPVsjSK0T9RzdiRqNurrylGergbRgHQk0RW9TdpY
18+
yhcM4nZQw9oP7mZOArJ0RNoE9pQ5MVZ+ZyFsjGYD6gzi9tJOXjgjxeNkfVXU83cu
19+
IcAKUwUsrwKBgC/a+hdMjO5TDSRckubi8SePwWv7htcJFVkAYgfitChJjUaRY6et
20+
Emp7jKtbU+TWS2jOwZ5t6l9c5M6KUMLjwdAqs/0qPXpP0QgsMr5RH7IAmhdaiOwR
21+
5WWG/+ghjCcDJQ4Mc5Whh0Qjqj54VUOu45LldpGFJZATtKU/Vr0yRqqdAoGAFwjE
22+
d0em0QkZE+YoIZc4K08K43sP67UNeAF3McV6elPHJi/ba5bnhhLJePUGHNaCCbkD
23+
NNzvK+nvRP3jIw4mVZmLly9iHZ9IpoCjuOwUwC5lzMzwGC/vMw9Ol5ktHZS4OkwT
24+
v4TJHZsAC9zGK2Clw2m3BQhVDrXoDXMC/PSOPpcCgYB4M0NMbNVmfpUagrt3RgWi
25+
BqLzRaJHk309LjnWBr2Y9tURB1H6iRqZn8mGvKMXKyk4zF2bfoj+9UdTuJYsds4F
26+
wIqeVWDvm4UGBF3UbiAq/EITZVnL6s5W+GkKTet0iNR1mG3nLbxCAnVbawvKdQSr
27+
0Mn+tXyYMBIsQIwIO+JNwA==
28+
-----END PRIVATE KEY-----
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDETCCAfmgAwIBAgIUDVfT0weC64i2DklltrgmNk+YkxcwDQYJKoZIhvcNAQEL
3+
BQAwLzEtMCsGA1UEAwwkd29sZlNTTCBVbnRydXN0ZWQtQW5jaG9yIFRlc3QgTG9v
4+
cCBBMCAXDTI2MDkxMTE5MzczNloYDzIwNTYwOTEwMTkzNzM2WjAvMS0wKwYDVQQD
5+
DCR3b2xmU1NMIFVudHJ1c3RlZC1BbmNob3IgVGVzdCBMb29wIEIwggEiMA0GCSqG
6+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYxM0fHDnG6cBxj5oOa8Ife+ltuSS5maX5
7+
RgS6cgjaaPhrCNxyuTB3ohOTwF5SwjfZaFKKFv1iQXx1yzk1xcyxdpooTLKD+9tY
8+
lnDHVQxMMnDSoHU4UqiEuk7MqbydldAkzKAMKoRgSg46IwRfPzNy23wcuhiqKQkC
9+
eXoGbwHZ0QS4xPAecljkIGsgpdE/PyjZKoXoi3XmBzxDgkr/2ofdI8bUbE01DaiO
10+
aUjK5pg9XbjLL/5FCq5nloONWQdgQ4pg5r8eit+/UZWl19WA4aqnWnCiipt+CF7a
11+
hJpKFCizC6OgNLrYmDH7NRJxZwhnZ5+CySCwadpcOIo7/W8+IdQBAgMBAAGjIzAh
12+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUA
13+
A4IBAQBvUyykt2mcG2S0ivkX8THJ8aqkJ2PbbXaHMYM3wEl7GT2PyL7EfJR3vDSZ
14+
UIUIvisRDuygrk2a+AIivbf2JrNX6X8e9CwQ6lRs9acs4Uy2PMJH8fAOW5rXEewe
15+
b4RALcn1UzhsO3XwC2eamEz89RcnNfKH752CExgo/cbqLEW87zwTq38K3bFjMtfr
16+
8LDyptakhZA8cps7boE/VeloDYtEITtwXROZ0+sbvmF1GNTlAI4JzQNw8CxoAHaY
17+
f40YZDGB+uow8SDHOww4yJrC42XnA+s95VvjewP5gjmn4sJTiV6KDjoXH/SxDG9/
18+
Nwetk5Az5eLlHPPU3eAy5/IEOAj5
19+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDYxM0fHDnG6cBx
3+
j5oOa8Ife+ltuSS5maX5RgS6cgjaaPhrCNxyuTB3ohOTwF5SwjfZaFKKFv1iQXx1
4+
yzk1xcyxdpooTLKD+9tYlnDHVQxMMnDSoHU4UqiEuk7MqbydldAkzKAMKoRgSg46
5+
IwRfPzNy23wcuhiqKQkCeXoGbwHZ0QS4xPAecljkIGsgpdE/PyjZKoXoi3XmBzxD
6+
gkr/2ofdI8bUbE01DaiOaUjK5pg9XbjLL/5FCq5nloONWQdgQ4pg5r8eit+/UZWl
7+
19WA4aqnWnCiipt+CF7ahJpKFCizC6OgNLrYmDH7NRJxZwhnZ5+CySCwadpcOIo7
8+
/W8+IdQBAgMBAAECggEAVaoks/w4GxNqkZZiF/ve6glSnSGTUWPWszXIDZSeSg48
9+
yjPkxtPHwyeCnBvkSsllP95Z7CecuDVQBc8ry0PhmmpYDsAMtlsUeqRtamECbKRs
10+
cNinqnwEC/wCwx/7Ib3AVaKmR1iQGut5RuFqy2dTIjt6B3JF6A0yec9e+WbqMNUO
11+
qJT8IfuUAbLweUuM6hy+sTHaoHENhPiX110yBTe0PJVCUi7mA05cjj0onZD+ysqC
12+
zj5w4hOeo3bQA3Lb8RnE4Fb6AGkhzokywzJ/Vi/p4Uwj/zWxF7U9fQ5tP+Q9iQwX
13+
4bYaxWVVF3CVMwGog8b1ZxxcF8XD3GeBxcEvbYBEBwKBgQD2q55WmNkZ5vuXyLDv
14+
29CfW5MHEzq5kC3pft+/oHwkOqCnYwkNfmiXiPgCaAZmDfbuE5WGrahJPysezhX5
15+
pwQQLp83e4Mo+cT0XXpmzCyHgzfWbDg6VGUHkD7xwzTL/JRfuk4+c31bNABaKtZ9
16+
46+OIcditvSFFina0dRUn8tQswKBgQDg96knt/ZY0aIoVPnnkISJYekA7ui+IlIV
17+
GFXZDflFy8jNtvOfc4vJ4e0EyVS9LmAg/EH55Y4HDE3OD/lTxkS9sNDFU4TeGZJA
18+
UrTVplGDGzgh75KXHg9nnbyKGD3tMxJhlnCqHXO77fX2cABStoejPye8TXyXgxRr
19+
3MUoDfC6ewKBgFW0zaBDHXPdiN91MN02YCdulwhnSwk8qmct2Spo5Zlk8XsXcwbI
20+
PCkiwyF66XY+NeUE0vhnkEha9W2Pp50Fxeilela5yJnNJvzNGgFrwbEYC6eqFGNX
21+
/X6CRQyViduymA8m2ZbjY9Pznoe1yK8XFGFrJS8MaKtxRvur2n3Iw8j3AoGBAI4W
22+
vocwoO6OUV4p9cF1PNDMv27wdp4IbVGXkjlKoyObR5PutscCIst638oDI3ttfBe5
23+
XC5q956p/cZlvnNUKfypXeMUEjp5ai8oTcEXkCo/md+NQkgiG1a1gOyzzQExHa33
24+
Z+d6PKv46z4glYOod9j6va0oP8Yua0qJIRlgXKhbAoGACqdIfpQYRP00ye2sThaT
25+
OQxwfRmb+0qt4RvJL+9Ssrqwa0S97VPpZNM5Yb1UM4PF5C2h8ttCEXCSI6TGat7k
26+
TcofugZJPpAqpVEynw7W4pgNPI06ukAFhFtgQE+UxVgP4M8XwGnD/Vbl6/9BEVlo
27+
EFaRPrTOloKpCpyKM9ndwPk=
28+
-----END PRIVATE KEY-----
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDLDCCAhSgAwIBAgIUDVfT0weC64i2DklltrgmNk+YkxgwDQYJKoZIhvcNAQEL
3+
BQAwLzEtMCsGA1UEAwwkd29sZlNTTCBVbnRydXN0ZWQtQW5jaG9yIFRlc3QgTG9v
4+
cCBBMCAXDTI2MDkxMTE5MzczNloYDzIwNTYwOTEwMTkzNzM2WjAbMRkwFwYDVQQD
5+
DBB3d3cuZXhhbXBsZS50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
6+
AQEAx2HjDeSayaotSJY7H6sVkNaIG5sIxTe0PYsyXjXhixjNYNnP4x4DFS5IYznS
7+
g36R1ZvczKHIwi1iczmhi3RXa3jKYEQPFNhYobWjOhenbvs+Zl7DA+YFem8IWDAo
8+
PfeFL7+r/P6EQiZSrZq9B0yaQKhbE96YDE3ulznNi3T/v4GZNl+9/4L49sVwShlu
9+
AYodLT9g4Tnlmq+DY3lLVtpH6xvjeKoigEuqD3WzVnMC+lCI6EGUStI8OL9aU1Hv
10+
mW26g6/s5O97ACweGDHOv8dqdgs960lo1hM7kL3f8vfAtCVWPScVp27VVsUP03ef
11+
FFE4Sdb8Z4MJDQgVNGEgxPdgXwIDAQABo1IwUDAMBgNVHRMBAf8EAjAAMA4GA1Ud
12+
DwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAbBgNVHREEFDASghB3d3cu
13+
ZXhhbXBsZS50ZXN0MA0GCSqGSIb3DQEBCwUAA4IBAQAGBfC2KnFbifzE7l9SEVbl
14+
UpaPxJaFwE+QKt035a1h+UU5Oxd6evmjw/EnmsyrruUo2N2wjymlz/7o496FcO9a
15+
Yd20VQvoHgLsD5yKFah+owzGIV936zTMLihey8IjCRM7ukV8CzMGPTpjKefrdExF
16+
BdiPqqnLdN7Ki/HdiecY11qyvtaeVNOJMIiQV45wu64JrxfrEFUOafIYrZGmwrSc
17+
2dHKfCVWgOU/bMgEA887q/yBD5kUXjAn6IcV0pxczyQrL+8ozGarVzJ96J8YJfPH
18+
zBc94el/U+vPNz7NcXu4lgcwYUopwK3HrKhSKAFuCf7+LovJB3JwE5D8EBF099cH
19+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDHYeMN5JrJqi1I
3+
ljsfqxWQ1ogbmwjFN7Q9izJeNeGLGM1g2c/jHgMVLkhjOdKDfpHVm9zMocjCLWJz
4+
OaGLdFdreMpgRA8U2FihtaM6F6du+z5mXsMD5gV6bwhYMCg994Uvv6v8/oRCJlKt
5+
mr0HTJpAqFsT3pgMTe6XOc2LdP+/gZk2X73/gvj2xXBKGW4Bih0tP2DhOeWar4Nj
6+
eUtW2kfrG+N4qiKAS6oPdbNWcwL6UIjoQZRK0jw4v1pTUe+ZbbqDr+zk73sALB4Y
7+
Mc6/x2p2Cz3rSWjWEzuQvd/y98C0JVY9JxWnbtVWxQ/Td58UUThJ1vxngwkNCBU0
8+
YSDE92BfAgMBAAECggEAM7peuR0FV6rSItHvNvEhIDm4iEj5xokENy9k+vJJuNfP
9+
eQApokgIDre6ShwXVMxCs8PDTkfvGQnDUBe0pMSjZZuqDb26l/LlU9cXKRw38WA3
10+
uUF+oQVNiI1EAfVEi4crQ88bpQC3eZ4Nt0K9Jiamon3LW2VV12NkslFp1XOeYqWc
11+
bNbIpeMmZNYQfMejZR29W9Px4gv1Os9Quq+vhqb+3zoTRwP08otDcd4IdqgZZqHH
12+
CiRYPd39ujfDd6dUxqn4TXuIN9Mdf8x/7yeCG2A2jeuc3oUVxMLWTjNvfjc1eKlk
13+
/YtY2ZuLlLRYKorNfTpZHV7hJbnWf7fGchsxmCs1wQKBgQD0f3YAM3TZ8XgzBs4e
14+
2pdygdz+Cs8FiDYiCN9Y8SKpUlNlHB5Cmp5lBnMdxmtEgfEByY3PxUxZnP0bi0Pi
15+
3A5Q/A04gC33Pfp/znWldoXpRNQySWqCxDJSCSYcu6bNbmeNmnEVn0BAcziAUzqp
16+
MYpOg3dQpKHyD4dxjlfNPbWLYQKBgQDQwxcg3yJlyO9E1qWg5VDpP9k+arVDfdTa
17+
exI+EIWI6Z7bD5sY0SbwT+rdpCMGYev2LOjR34pRW8M+Yjup2dUqwPyrdbv4GU8O
18+
oJZdyevKe9DY68/ttKRD1gJdZX96gkTnK6BrL/guStm9i113XlC3lPWfYD8ct+Dv
19+
n7ArDUpDvwKBgE4H7+0Yfw6fljES1u3Z7cPJ1nHtmSy20DAEjOOh8eIAOEVot++h
20+
0TOE33B9RvbSUcy0OuI4oaloBQ+pXr0kZh1KlB2YKxNhYHUxuzJXpV1RbjeuXqPl
21+
Yfn0mYlKCm498iarR7QS4zquizXJWkttWCq+onHGWTkb46pGN5d1Pl+BAoGAUxGu
22+
PFhNua7Q9tVqprFZFtdfPKT9Z9PERQO/6I5udGJx4b09/AwNsIY8cOGFRl7ko9qO
23+
8iQ/R8x5znMMRrP1TMPqRtfcaga4HJvt+XgFqVbHbem3nWDKFGwuGLfwl/EKNep4
24+
NO6rlNAYAIJaOMuA1uwhKMAFnQnWKcOjOB5btMUCgYBSx34LNg8e16gcjCc7V/91
25+
Ej/UoQinArqNZXQyLEAwqbnjHTGGCgM4gCyWkJTcZG2Ef4lnkIylRBZLpMGnxYcn
26+
0TEEoCOhlYqJxPHjsX/a0SwqSWvwsfDy+C/kSC+l9yZSWKoxTJDlwqZqJajedOsp
27+
7CS8Oc4f5XuI9rconiegCw==
28+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)