Skip to content

Commit 8d283ea

Browse files
authored
internal,fsthttp: fix broken API for DownstreamTLSClientCertVerifyRes… (#241)
* internal,fsthttp: fix broken API for DownstreamTLSClientCertVerifyResult() Previously this hostcall was marked as returning a bool, but it actually returns an enum. * internal,fsthttp: fix constant naming: Ca -> CA, Ok -> OK
1 parent 9154c96 commit 8d283ea

File tree

4 files changed

+72
-10
lines changed

4 files changed

+72
-10
lines changed

fsthttp/request.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,7 @@ func (req *Request) TLSClientCertificateInfo() (*TLSClientCertificateInfo, error
10811081
}
10821082

10831083
if cert.RawClientCertificate != nil {
1084-
cert.ClientCertIsVerified, err = req.downstream.req.DownstreamTLSClientCertVerifyResult()
1084+
cert.VerifyResult, err = req.downstream.req.DownstreamTLSClientCertVerifyResult()
10851085
if err != nil {
10861086
return nil, fmt.Errorf("get TLS client certificate verify: %w", err)
10871087
}
@@ -1092,12 +1092,41 @@ func (req *Request) TLSClientCertificateInfo() (*TLSClientCertificateInfo, error
10921092
return req.clientCertificate, nil
10931093
}
10941094

1095+
type ClientCertificateVerifyResult = fastly.ClientCertificateVerifyResult
1096+
1097+
const (
1098+
// ClientCertificateVerifyResultOK indicates that client certificate verified successfully.
1099+
ClientCertificateVerifyResultOK = fastly.ClientCertificateVerifyResultOK
1100+
1101+
// ClientCertificateVerifyResultBadCertificate means the certificate is corrupt
1102+
// (e.g., the certificate signatures do not verify correctly).
1103+
ClientCertificateVerifyResultBadCertificate = fastly.ClientCertificateVerifyResultBadCertificate
1104+
1105+
// ClientCertificateVerifyResultCertificateRevoked means the client certificate is revoked by its signer.
1106+
ClientCertificateVerifyResultCertificateRevoked = fastly.ClientCertificateVerifyResultCertificateRevoked
1107+
1108+
// ClientCertificateVerifyResultCertificateExpired means the client certificate has expired or is not currently valid.
1109+
ClientCertificateVerifyResultCertificateExpired = fastly.ClientCertificateVerifyResultCertificateExpired
1110+
1111+
// ClientCertificateVerifyResultUnknownCA means the valid certificate chain or partial chain was received, but the
1112+
// certificate was not accepted because the CA certificate could not be located or could not
1113+
// be matched with a known trust anchor.
1114+
ClientCertificateVerifyResultUnknownCA = fastly.ClientCertificateVerifyResultUnknownCA
1115+
1116+
// ClientCertificateVerifyResultCertificateMissing means the client did not provide a certificate during the handshake.
1117+
ClientCertificateVerifyResultCertificateMissing = fastly.ClientCertificateVerifyResultCertificateMissing
1118+
1119+
// ClientCertificateVerifyResultCertificateUnknown means the client certificate was received, but some other (unspecified) issue
1120+
// arose in processing the certificate, rendering it unacceptable.
1121+
ClientCertificateVerifyResultCertificateUnknown = fastly.ClientCertificateVerifyResultCertificateUnknown
1122+
)
1123+
10951124
type TLSClientCertificateInfo struct {
10961125
// RawClientCertificate contains the bytes of the raw client certificate, if one was provided.
10971126
RawClientCertificate []byte
10981127

1099-
// ClientCertIsVerified is true if the provided client certificate is valid.
1100-
ClientCertIsVerified bool
1128+
// VerifyResult the result of the client certificate verification
1129+
VerifyResult ClientCertificateVerifyResult
11011130
}
11021131

11031132
// FastlyMeta holds various Fastly-specific metadata for a request.

internal/abi/fastly/hostcalls_noguest.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ func (r *HTTPRequest) DownstreamTLSRawClientCertificate() ([]byte, error) {
131131
return nil, fmt.Errorf("not implemented")
132132
}
133133

134-
func (r *HTTPRequest) DownstreamTLSClientCertVerifyResult() (bool, error) {
135-
return false, fmt.Errorf("not implemented")
134+
func (r *HTTPRequest) DownstreamTLSClientCertVerifyResult() (ClientCertificateVerifyResult, error) {
135+
return 0, fmt.Errorf("not implemented")
136136
}
137137

138138
func (r *HTTPRequest) DownstreamTLSJA4() ([]byte, error) {

internal/abi/fastly/http_guest.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,19 +1684,19 @@ func (r *HTTPRequest) DownstreamTLSRawClientCertificate() ([]byte, error) {
16841684
//go:noescape
16851685
func fastlyHTTPDownstreamTLSClientCertVerifyResult(
16861686
req requestHandle,
1687-
result prim.Pointer[bool],
1687+
result prim.Pointer[prim.U32],
16881688
) FastlyStatus
16891689

1690-
func (r *HTTPRequest) DownstreamTLSClientCertVerifyResult() (bool, error) {
1691-
var result bool
1690+
func (r *HTTPRequest) DownstreamTLSClientCertVerifyResult() (ClientCertificateVerifyResult, error) {
1691+
var result prim.U32
16921692
if err := fastlyHTTPDownstreamTLSClientCertVerifyResult(
16931693
r.h,
16941694
prim.ToPointer(&result),
16951695
).toError(); err != nil {
1696-
return false, err
1696+
return 0, err
16971697
}
16981698

1699-
return result, nil
1699+
return ClientCertificateVerifyResult(result), nil
17001700
}
17011701

17021702
// witx:

internal/abi/fastly/types.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1629,6 +1629,39 @@ func tlsAlertString(id prim.U8) string {
16291629
}
16301630
}
16311631

1632+
type ClientCertificateVerifyResult prim.U32
1633+
1634+
const (
1635+
ClientCertificateVerifyResultOK ClientCertificateVerifyResult = 0
1636+
ClientCertificateVerifyResultBadCertificate ClientCertificateVerifyResult = 1
1637+
ClientCertificateVerifyResultCertificateRevoked ClientCertificateVerifyResult = 2
1638+
ClientCertificateVerifyResultCertificateExpired ClientCertificateVerifyResult = 3
1639+
ClientCertificateVerifyResultUnknownCA ClientCertificateVerifyResult = 4
1640+
ClientCertificateVerifyResultCertificateMissing ClientCertificateVerifyResult = 5
1641+
ClientCertificateVerifyResultCertificateUnknown ClientCertificateVerifyResult = 6
1642+
)
1643+
1644+
func (c ClientCertificateVerifyResult) String() string {
1645+
switch c {
1646+
case 0:
1647+
return "Ok"
1648+
case 1:
1649+
return "Bad Certificate"
1650+
case 2:
1651+
return "Certificate Revoked"
1652+
case 3:
1653+
return "Certificate Expired"
1654+
case 4:
1655+
return "Unknown CA"
1656+
case 5:
1657+
return "Certificate Missing"
1658+
case 6:
1659+
return "Certificate Unknown"
1660+
}
1661+
1662+
return "Unknown result"
1663+
}
1664+
16321665
type RateWindow struct {
16331666
value prim.U32
16341667
}

0 commit comments

Comments
 (0)