diff options
Diffstat (limited to 'reqres.go')
-rw-r--r-- | reqres.go | 30 |
1 files changed, 22 insertions, 8 deletions
@@ -158,23 +158,37 @@ func NewGetAnchorsResponse(anchors []*x509.Certificate) GetAnchorsResponse { // VerifyAddEntryRequest determines whether a well-formed AddEntryRequest should // be inserted into the log. If so, the serialized leaf value is returned. -func VerifyAddEntryRequest(a ctfe.CertValidationOpts, r AddEntryRequest) ([]byte, error) { - item, _ := StItemFromB64(r.Item) // r.Item is a well-formed ChecksumV1 - leaf, _ := tls.Marshal(item) // again, r.Item is well-formed +func VerifyAddEntryRequest(anchors ctfe.CertValidationOpts, r AddEntryRequest) ([]byte, error) { + item, err := StItemFromB64(r.Item) + if err != nil { + fmt.Errorf("failed decoding StItem: %v", err) + } - chainBytes, err := base64.StdEncoding.DecodeString(r.Certificate) + leaf, err := tls.Marshal(item) if err != nil { - return nil, fmt.Errorf("failed decoding certificate: %v", err) + return nil, fmt.Errorf("failed tls marshaling StItem: %v", err) } + certificate, err := base64.StdEncoding.DecodeString(r.Certificate) + if err != nil { + return nil, fmt.Errorf("failed decoding certificate: %v", err) + } chain := make([][]byte, 0, 1) - chain = append(chain, chainBytes) - _, err = ctfe.ValidateChain(chain, a) + chain = append(chain, certificate) + x509chain, err := ctfe.ValidateChain(chain, anchors) if err != nil { return nil, fmt.Errorf("chain verification failed: %v", err) } + c := x509chain[0] + + signature, err := base64.StdEncoding.DecodeString(r.Signature) + if err != nil { + return nil, fmt.Errorf("failed decoding signature: %v", err) + } + if err := c.CheckSignature(c.SignatureAlgorithm, leaf, signature); err != nil { + return nil, fmt.Errorf("invalid signature: %v", err) + } - // TODO: verify signature return leaf, nil } |