Skip to content

Commit eceb55e

Browse files
authored
Merge pull request #9795 from LinuxJedi/static-fixes2
Static analysis fixes
2 parents 2971c70 + 7248ca3 commit eceb55e

21 files changed

Lines changed: 420 additions & 125 deletions

.github/workflows/wolfsm.yml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
name: wolfSM Tests
2+
3+
# START OF COMMON SECTION
4+
on:
5+
push:
6+
branches: [ 'master', 'main', 'release/**' ]
7+
pull_request:
8+
branches: [ '*' ]
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.ref }}
12+
cancel-in-progress: true
13+
# END OF COMMON SECTION
14+
15+
jobs:
16+
make_check:
17+
strategy:
18+
fail-fast: false
19+
matrix:
20+
config: [
21+
# Core SM TLS cipher suites
22+
'--enable-sm2 --enable-sm3 --enable-sm4-gcm --enable-sm4-ccm --enable-sha3',
23+
# All SM4 modes
24+
'--enable-sm2 --enable-sm3 --enable-sm4-ecb --enable-sm4-cbc --enable-sm4-ctr --enable-sm4-gcm --enable-sm4-ccm --enable-sha3',
25+
# SM + all features integration test
26+
'--enable-all --enable-sm2 --enable-sm3 --enable-sm4-ecb --enable-sm4-cbc --enable-sm4-ctr --enable-sm4-gcm --enable-sm4-ccm',
27+
]
28+
name: make check
29+
if: github.repository_owner == 'wolfssl'
30+
runs-on: ubuntu-24.04
31+
timeout-minutes: 10
32+
steps:
33+
- uses: actions/checkout@v4
34+
name: Checkout wolfSSL
35+
36+
- uses: actions/checkout@v4
37+
name: Checkout wolfsm
38+
with:
39+
repository: wolfssl/wolfsm
40+
path: wolfsm
41+
42+
- name: Install wolfsm
43+
working-directory: wolfsm
44+
run: ./install.sh $GITHUB_WORKSPACE
45+
46+
- name: Test wolfSSL with wolfSM
47+
run: |
48+
./autogen.sh
49+
./configure ${{ matrix.config }}
50+
make
51+
make check
52+
53+
- name: Print errors
54+
if: ${{ failure() }}
55+
run: |
56+
for file in scripts/*.log
57+
do
58+
if [ -f "$file" ]; then
59+
echo "${file}:"
60+
cat "$file"
61+
echo "========================================================================"
62+
fi
63+
done

certs/renewcerts.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,16 @@ run_renewcerts(){
768768
echo "End of section"
769769
echo "---------------------------------------------------------------------"
770770

771+
############################################################
772+
########## generate SM2 certificates #######################
773+
############################################################
774+
echo "Renewing SM2 certificates"
775+
cd sm2
776+
./gen-sm2-certs.sh
777+
cd ..
778+
echo "End of section"
779+
echo "---------------------------------------------------------------------"
780+
771781
############################################################
772782
########## update Raw Public Key certificates ##############
773783
############################################################

certs/sm2/ca-sm2.der

1 Byte
Binary file not shown.

certs/sm2/ca-sm2.pem

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ Certificate:
33
Version: 3 (0x2)
44
Serial Number: 1 (0x1)
55
Signature Algorithm: SM2-with-SM3
6-
Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_SM2, OU = Root-SM2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com
6+
Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_SM2, OU=Root-SM2, CN=www.wolfssl.com, emailAddress=info@wolfssl.com
77
Validity
8-
Not Before: Feb 15 06:23:07 2023 GMT
9-
Not After : Nov 11 06:23:07 2025 GMT
10-
Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = CA-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL
8+
Not Before: Feb 18 17:56:57 2026 GMT
9+
Not After : Nov 14 17:56:57 2028 GMT
10+
Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_sm2, OU=CA-sm2, CN=www.wolfssl.com, emailAddress=info@wolfssl.com, UID=wolfSSL
1111
Subject Public Key Info:
1212
Public Key Algorithm: sm2
1313
Public-Key: (256 bit)
@@ -29,23 +29,23 @@ Certificate:
2929
Digital Signature, Certificate Sign, CRL Sign
3030
Signature Algorithm: SM2-with-SM3
3131
Signature Value:
32-
30:45:02:20:47:4e:00:03:ab:34:a1:af:59:39:8f:60:36:bf:
33-
89:88:42:41:27:c1:dd:57:c9:79:cb:1f:56:5c:16:b5:28:bd:
34-
02:21:00:8b:2e:25:eb:21:9b:a9:2b:a6:6a:5b:db:a7:c7:2b:
35-
11:df:73:15:ad:e4:c5:c3:c2:f3:b4:b4:67:af:d7:51:1c
32+
30:46:02:21:00:b2:b9:5b:02:ad:78:f8:52:ba:67:cf:cb:25:
33+
9b:ba:d9:56:f5:a7:ff:af:25:26:d5:f6:f3:f3:a6:f5:9a:2f:
34+
9b:02:21:00:bc:96:f3:39:13:76:dc:02:35:39:0e:dc:0a:69:
35+
bf:02:18:b6:01:be:ff:05:d7:2e:f2:7b:67:eb:16:e9:8e:c5
3636
-----BEGIN CERTIFICATE-----
37-
MIICljCCAjygAwIBAgIBATAKBggqgRzPVQGDdTCBlTELMAkGA1UEBhMCVVMxEDAO
37+
MIIClzCCAjygAwIBAgIBATAKBggqgRzPVQGDdTCBlTELMAkGA1UEBhMCVVMxEDAO
3838
BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAoMC3dvbGZT
3939
U0xfU00yMREwDwYDVQQLDAhSb290LVNNMjEYMBYGA1UEAwwPd3d3LndvbGZzc2wu
40-
Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDIxNTA2
41-
MjMwN1oXDTI1MTExMTA2MjMwN1owgawxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdN
40+
Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTI2MDIxODE3
41+
NTY1N1oXDTI4MTExNDE3NTY1N1owgawxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdN
4242
b250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQKDAt3b2xmU1NMX3NtMjEP
4343
MA0GA1UECwwGQ0Etc20yMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq
4444
hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xm
4545
U1NMMFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABCGS98sk32RNuqtme4N1qSnn
4646
/2RjttVCgCC94uICEjuOtACVCYDLVu1Lyo1X5q4F03YnY3E5ibdp5kiArtGpSBKj
4747
YzBhMB0GA1UdDgQWBBRHCkh+uwKoWiZXKxmpe2GLf12ZbjAfBgNVHSMEGDAWgBQ0
4848
HXlEFXmhsWOZ4+1lfGSJgP+47DAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
49-
AwIBhjAKBggqgRzPVQGDdQNIADBFAiBHTgADqzShr1k5j2A2v4mIQkEnwd1XyXnL
50-
H1ZcFrUovQIhAIsuJeshm6krpmpb26fHKxHfcxWt5MXDwvO0tGev11Ec
49+
AwIBhjAKBggqgRzPVQGDdQNJADBGAiEAsrlbAq14+FK6Z8/LJZu62Vb1p/+vJSbV
50+
9vPzpvWaL5sCIQC8lvM5E3bcAjU5DtwKab8CGLYBvv8F1y7ye2frFumOxQ==
5151
-----END CERTIFICATE-----

certs/sm2/client-sm2.der

0 Bytes
Binary file not shown.

certs/sm2/client-sm2.pem

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ Certificate:
22
Data:
33
Version: 3 (0x2)
44
Serial Number:
5-
60:a0:4a:0b:36:eb:7d:e1:3f:74:29:a9:29:b4:05:6c:17:f7:a6:d4
5+
63:dd:75:63:8a:b0:51:4f:9c:4e:ff:6d:55:4e:cd:ee:8f:26:d3:80
66
Signature Algorithm: SM2-with-SM3
7-
Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = Client-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL
7+
Issuer: C=US, ST=Montana, L=Bozeman, O=wolfSSL_sm2, OU=Client-sm2, CN=www.wolfssl.com, emailAddress=info@wolfssl.com, UID=wolfSSL
88
Validity
9-
Not Before: Feb 15 06:23:07 2023 GMT
10-
Not After : Nov 11 06:23:07 2025 GMT
11-
Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = Client-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL
9+
Not Before: Feb 18 17:56:57 2026 GMT
10+
Not After : Nov 14 17:56:57 2028 GMT
11+
Subject: C=US, ST=Montana, L=Bozeman, O=wolfSSL_sm2, OU=Client-sm2, CN=www.wolfssl.com, emailAddress=info@wolfssl.com, UID=wolfSSL
1212
Subject Public Key Info:
1313
Public Key Algorithm: sm2
1414
Public-Key: (256 bit)
@@ -25,7 +25,7 @@ Certificate:
2525
X509v3 Authority Key Identifier:
2626
keyid:E4:21:B2:C5:E5:D4:9E:82:CA:F8:67:F2:28:99:F6:85:E8:F1:55:EF
2727
DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_sm2/OU=Client-sm2/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/UID=wolfSSL
28-
serial:60:A0:4A:0B:36:EB:7D:E1:3F:74:29:A9:29:B4:05:6C:17:F7:A6:D4
28+
serial:63:DD:75:63:8A:B0:51:4F:9C:4E:FF:6D:55:4E:CD:EE:8F:26:D3:80
2929
X509v3 Basic Constraints:
3030
CA:TRUE
3131
X509v3 Subject Alternative Name:
@@ -34,17 +34,17 @@ Certificate:
3434
TLS Web Server Authentication, TLS Web Client Authentication
3535
Signature Algorithm: SM2-with-SM3
3636
Signature Value:
37-
30:46:02:21:00:8f:b2:b5:95:8f:79:f6:5e:75:e5:c5:e9:9a:
38-
12:d2:0f:78:9f:c0:1d:8d:1c:be:6b:0c:f1:f5:57:60:db:91:
39-
4f:02:21:00:87:5e:7d:e4:d6:3a:bb:7b:98:27:85:de:7a:f0:
40-
21:e2:66:a1:9f:26:e0:dd:86:23:b4:c8:c0:46:5a:f2:49:8d
37+
30:46:02:21:00:dd:98:90:68:35:95:61:2f:11:90:a5:e9:30:
38+
8b:9a:aa:33:cc:73:8a:76:96:8b:97:8c:4c:c3:10:fc:14:56:
39+
9b:02:21:00:f8:de:db:67:54:59:ca:98:27:3d:3f:f6:6f:30:
40+
0c:65:e1:fb:a0:9f:11:ab:ea:76:30:31:c4:66:11:d7:b9:f2
4141
-----BEGIN CERTIFICATE-----
42-
MIIDyTCCA26gAwIBAgIUYKBKCzbrfeE/dCmpKbQFbBf3ptQwCgYIKoEcz1UBg3Uw
42+
MIIDyTCCA26gAwIBAgIUY911Y4qwUU+cTv9tVU7N7o8m04AwCgYIKoEcz1UBg3Uw
4343
gbAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl
4444
bWFuMRQwEgYDVQQKDAt3b2xmU1NMX3NtMjETMBEGA1UECwwKQ2xpZW50LXNtMjEY
4545
MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv
46-
bGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDAeFw0yMzAyMTUwNjIz
47-
MDdaFw0yNTExMTEwNjIzMDdaMIGwMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9u
46+
bGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDAeFw0yNjAyMTgxNzU2
47+
NTdaFw0yODExMTQxNzU2NTdaMIGwMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9u
4848
dGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECgwLd29sZlNTTF9zbTIxEzAR
4949
BgNVBAsMCkNsaWVudC1zbTIxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G
5050
CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEMB3dv
@@ -55,9 +55,9 @@ BIHoMIHlgBTkIbLF5dSegsr4Z/IomfaF6PFV76GBtqSBszCBsDELMAkGA1UEBhMC
5555
VVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAoM
5656
C3dvbGZTU0xfc20yMRMwEQYDVQQLDApDbGllbnQtc20yMRgwFgYDVQQDDA93d3cu
5757
d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAV
58-
BgoJkiaJk/IsZAEBDAd3b2xmU1NMghRgoEoLNut94T90KakptAVsF/em1DAMBgNV
58+
BgoJkiaJk/IsZAEBDAd3b2xmU1NMghRj3XVjirBRT5xO/21VTs3ujybTgDAMBgNV
5959
HRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUuY29thwR/AAABMB0GA1UdJQQW
60-
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAKBggqgRzPVQGDdQNJADBGAiEAj7K1lY95
61-
9l515cXpmhLSD3ifwB2NHL5rDPH1V2DbkU8CIQCHXn3k1jq7e5gnhd568CHiZqGf
62-
JuDdhiO0yMBGWvJJjQ==
60+
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAKBggqgRzPVQGDdQNJADBGAiEA3ZiQaDWV
61+
YS8RkKXpMIuaqjPMc4p2louXjEzDEPwUVpsCIQD43ttnVFnKmCc9P/ZvMAxl4fug
62+
nxGr6nYwMcRmEde58g==
6363
-----END CERTIFICATE-----

certs/sm2/fix_sm2_spki.py

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
#!/usr/bin/env python3
2+
"""Fix SM2 certificate SubjectPublicKeyInfo algorithm OID.
3+
4+
OpenSSL 3.x encodes SM2 keys using the generic id-ecPublicKey OID
5+
(1.2.840.10045.2.1) instead of the SM2-specific OID (1.2.156.10197.1.301).
6+
This script patches the SPKI algorithm OID back to SM2 and re-signs the
7+
certificate.
8+
9+
Usage: fix_sm2_spki.py <cert.pem> <signing-key.pem> <output.pem>
10+
"""
11+
12+
import base64
13+
import subprocess
14+
import sys
15+
import os
16+
import tempfile
17+
18+
EC_PUBKEY_OID = bytes([0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01])
19+
SM2_ALGO_OID = bytes([0x06, 0x08, 0x2a, 0x81, 0x1c, 0xcf, 0x55, 0x01, 0x82, 0x2d])
20+
SM2_WITH_SM3 = bytes([0x30, 0x0a, 0x06, 0x08,
21+
0x2a, 0x81, 0x1c, 0xcf, 0x55, 0x01, 0x83, 0x75])
22+
23+
24+
def read_der_length(data, offset):
25+
b = data[offset]
26+
if b < 0x80:
27+
return b, 1
28+
num_bytes = b & 0x7f
29+
length = 0
30+
for i in range(num_bytes):
31+
length = (length << 8) | data[offset + 1 + i]
32+
return length, 1 + num_bytes
33+
34+
35+
def encode_der_length(length):
36+
if length < 0x80:
37+
return bytes([length])
38+
elif length < 0x100:
39+
return bytes([0x81, length])
40+
elif length < 0x10000:
41+
return bytes([0x82, length >> 8, length & 0xff])
42+
else:
43+
raise ValueError("Length too large: %d" % length)
44+
45+
46+
def find_enclosing_sequences(data, target_pos):
47+
"""Find length-field offsets of all SEQUENCEs enclosing target_pos."""
48+
results = []
49+
50+
def scan(offset, end):
51+
while offset < end:
52+
tag = data[offset]
53+
offset += 1
54+
length, len_bytes = read_der_length(data, offset)
55+
len_offset = offset
56+
offset += len_bytes
57+
content_start = offset
58+
content_end = offset + length
59+
60+
if tag == 0x30 and content_start <= target_pos < content_end:
61+
results.append((len_offset, length, len_bytes))
62+
scan(content_start, content_end)
63+
return
64+
offset = content_end
65+
66+
scan(0, len(data))
67+
return results
68+
69+
70+
def patch_tbs_spki_oid(tbs_der):
71+
"""Replace id-ecPublicKey with SM2 OID in TBS SubjectPublicKeyInfo."""
72+
oid_pos = tbs_der.find(EC_PUBKEY_OID)
73+
if oid_pos == -1:
74+
return None # Already has SM2 OID or no EC key
75+
76+
enclosing = find_enclosing_sequences(tbs_der, oid_pos)
77+
size_diff = len(SM2_ALGO_OID) - len(EC_PUBKEY_OID)
78+
79+
result = bytearray(
80+
tbs_der[:oid_pos] + SM2_ALGO_OID + tbs_der[oid_pos + len(EC_PUBKEY_OID):]
81+
)
82+
83+
for len_offset, old_length, old_len_bytes in enclosing:
84+
new_length = old_length + size_diff
85+
new_len_encoded = encode_der_length(new_length)
86+
if len(new_len_encoded) == old_len_bytes:
87+
result[len_offset:len_offset + old_len_bytes] = new_len_encoded
88+
else:
89+
result[len_offset:len_offset + old_len_bytes] = new_len_encoded
90+
size_diff += len(new_len_encoded) - old_len_bytes
91+
92+
return bytes(result)
93+
94+
95+
def pem_to_der(pem_text):
96+
b64 = ''.join(
97+
line for line in pem_text.split('\n')
98+
if not line.startswith('-----') and line.strip()
99+
)
100+
return base64.b64decode(b64)
101+
102+
103+
def der_to_pem(der_data, label="CERTIFICATE"):
104+
b64 = base64.b64encode(der_data).decode()
105+
lines = [b64[i:i+64] for i in range(0, len(b64), 64)]
106+
return ('-----BEGIN %s-----\n' % label +
107+
'\n'.join(lines) +
108+
'\n-----END %s-----\n' % label)
109+
110+
111+
def extract_tbs(cert_der):
112+
assert cert_der[0] == 0x30
113+
outer_len, outer_len_bytes = read_der_length(cert_der, 1)
114+
tbs_offset = 1 + outer_len_bytes
115+
tbs_len, tbs_len_bytes = read_der_length(cert_der, tbs_offset + 1)
116+
tbs_total = 1 + tbs_len_bytes + tbs_len
117+
return cert_der[tbs_offset:tbs_offset + tbs_total]
118+
119+
120+
def sign_tbs(tbs_der, key_pem_path):
121+
"""Sign TBS with SM2-with-SM3 using openssl dgst."""
122+
with tempfile.NamedTemporaryFile(suffix='.der', delete=False) as tbs_f:
123+
tbs_f.write(tbs_der)
124+
tbs_path = tbs_f.name
125+
126+
sig_path = tbs_path + '.sig'
127+
try:
128+
result = subprocess.run(
129+
['openssl', 'dgst', '-sm3', '-sign', key_pem_path,
130+
'-out', sig_path, tbs_path],
131+
capture_output=True, text=True
132+
)
133+
if result.returncode != 0:
134+
raise RuntimeError("openssl dgst failed: " + result.stderr)
135+
136+
with open(sig_path, 'rb') as f:
137+
return f.read()
138+
finally:
139+
os.unlink(tbs_path)
140+
if os.path.exists(sig_path):
141+
os.unlink(sig_path)
142+
143+
144+
def build_cert(tbs_der, sig_der):
145+
bit_string = bytes([0x03, len(sig_der) + 1, 0x00]) + sig_der
146+
cert_body = tbs_der + SM2_WITH_SM3 + bit_string
147+
return bytes([0x30]) + encode_der_length(len(cert_body)) + cert_body
148+
149+
150+
def fix_sm2_cert(cert_pem_path, key_pem_path, output_pem_path):
151+
with open(cert_pem_path, 'r') as f:
152+
cert_pem = f.read()
153+
154+
cert_der = pem_to_der(cert_pem)
155+
tbs = extract_tbs(cert_der)
156+
157+
new_tbs = patch_tbs_spki_oid(tbs)
158+
if new_tbs is None:
159+
print(" Already has SM2 OID, no patching needed")
160+
if cert_pem_path != output_pem_path:
161+
with open(output_pem_path, 'w') as f:
162+
f.write(cert_pem)
163+
return
164+
165+
sig = sign_tbs(new_tbs, key_pem_path)
166+
new_cert_der = build_cert(new_tbs, sig)
167+
168+
with open(output_pem_path, 'w') as f:
169+
f.write(der_to_pem(new_cert_der))
170+
171+
print(" Patched SPKI algorithm OID to SM2")
172+
173+
174+
if __name__ == '__main__':
175+
if len(sys.argv) != 4:
176+
print("Usage: %s <cert.pem> <signing-key.pem> <output.pem>" % sys.argv[0])
177+
sys.exit(1)
178+
179+
fix_sm2_cert(sys.argv[1], sys.argv[2], sys.argv[3])

0 commit comments

Comments
 (0)