152 lines
5.3 KiB
Go
152 lines
5.3 KiB
Go
package modbus
|
|
|
|
import (
|
|
"crypto/x509"
|
|
"io/ioutil"
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
// random certs from /etc/ssl/certs
|
|
const validCerts = `-----BEGIN CERTIFICATE-----
|
|
MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
|
|
TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
|
|
dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
|
|
MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
|
|
TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
|
|
b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
|
|
M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
|
|
UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
|
|
Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
|
|
rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
|
|
pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
|
|
j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
|
|
KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
|
|
/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
|
|
cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
|
|
1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
|
|
px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
|
|
/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
|
|
MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
|
|
eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
|
|
2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
|
|
v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
|
|
wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
|
|
CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
|
|
vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
|
|
Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
|
|
Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
|
|
eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
|
|
FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
|
|
7uzXLg==
|
|
-----END CERTIFICATE-----
|
|
-----BEGIN CERTIFICATE-----
|
|
MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
|
|
MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
|
|
IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
|
|
IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
|
|
RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
|
|
U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
|
|
IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
|
|
ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
|
|
QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
|
|
rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
|
|
NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
|
|
QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
|
|
txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
|
|
BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
|
|
AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
|
|
tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
|
|
IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
|
|
6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
|
|
xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
|
|
Cm26OWMohpLzGITY+9HPBVZkVw==
|
|
-----END CERTIFICATE-----
|
|
`
|
|
|
|
func TestLoadCertPool(t *testing.T) {
|
|
var err error
|
|
var cp *x509.CertPool
|
|
var fd *os.File
|
|
var path string
|
|
|
|
// attemp to load a non-existent file: should fail
|
|
cp, err = LoadCertPool("non/existent/path/to/store")
|
|
if err == nil {
|
|
t.Errorf("LoadCertPool() should have failed")
|
|
}
|
|
|
|
// create an empty file and attempt to load it: should fail
|
|
fd, err = ioutil.TempFile("", "modbus_tls_utils_test")
|
|
if err != nil {
|
|
t.Errorf("failed to create temp file: %v", err)
|
|
return
|
|
}
|
|
path = fd.Name()
|
|
|
|
defer os.Remove(path)
|
|
err = fd.Close()
|
|
if err != nil {
|
|
t.Errorf("failed to close temp file: %v", err)
|
|
return
|
|
}
|
|
|
|
cp, err = LoadCertPool(path)
|
|
if err == nil {
|
|
t.Errorf("LoadCertPool() should have failed")
|
|
}
|
|
|
|
// put garbage into a file and attempt to load it: should fail
|
|
fd, err = ioutil.TempFile("", "modbus_tls_utils_test")
|
|
if err != nil {
|
|
t.Errorf("failed to create temp file: %v", err)
|
|
}
|
|
path = fd.Name()
|
|
|
|
defer os.Remove(path)
|
|
_, err = fd.Write([]byte("somejunk"))
|
|
if err != nil {
|
|
t.Errorf("failed to write to temp file: %v", err)
|
|
}
|
|
err = fd.Close()
|
|
if err != nil {
|
|
t.Errorf("failed to close temp file: %v", err)
|
|
return
|
|
}
|
|
|
|
cp, err = LoadCertPool(path)
|
|
if err == nil {
|
|
t.Errorf("LoadCertPool() should have failed")
|
|
}
|
|
|
|
// now write two certs to a file and try to load it: should succeed
|
|
fd, err = ioutil.TempFile("", "modbus_tls_utils_test")
|
|
if err != nil {
|
|
t.Errorf("failed to create temp file: %v", err)
|
|
}
|
|
path = fd.Name()
|
|
|
|
defer os.Remove(path)
|
|
_, err = fd.Write([]byte(validCerts))
|
|
if err != nil {
|
|
t.Errorf("failed to write to temp file: %v", err)
|
|
}
|
|
err = fd.Close()
|
|
if err != nil {
|
|
t.Errorf("failed to close temp file: %v", err)
|
|
return
|
|
}
|
|
|
|
cp, err = LoadCertPool(path)
|
|
if err != nil {
|
|
t.Errorf("LoadCertPool() should have succeeded, got: %v", err)
|
|
}
|
|
|
|
// expect two certs in the cert pool
|
|
if len(cp.Subjects()) != 2 {
|
|
t.Errorf("expected 2 certs in the pool, saw: %v", len(cp.Subjects()))
|
|
}
|
|
|
|
return
|
|
}
|