// IncrementAndGetSerial returns the next-available serial number, incrementing // it in the database before returning. There must be an active transaction to // call this method. Callers should Begin the transaction, call this method, // perform any other work, and Commit at the end once the certificate is issued. func (cadb *CertificateAuthorityDatabaseImpl) IncrementAndGetSerial(tx *gorp.Transaction) (val int64, err error) { if tx == nil { err = fmt.Errorf("No transaction given") return } rowObj, err := tx.Get(SerialNumber{}, 1) if err != nil { return } row, ok := rowObj.(*SerialNumber) if !ok { err = fmt.Errorf("No serial number found. This is a serious issue") return } val = row.Number row.Number = val + 1 _, err = tx.Update(row) if err != nil { return } return }
func updateChallenges(authID string, challenges []core.Challenge, tx *gorp.Transaction) error { var challs []challModel _, err := tx.Select( &challs, getChallengesQuery, map[string]interface{}{"authID": authID}, ) if err != nil { return err } if len(challs) != len(challenges) { return fmt.Errorf("Invalid number of challenges provided") } for i, authChall := range challenges { chall, err := challengeToModel(&authChall, challs[i].AuthorizationID) if err != nil { return err } chall.ID = challs[i].ID _, err = tx.Update(chall) if err != nil { return err } } return nil }
func (updater *OCSPUpdater) processResponse(tx *gorp.Transaction, serial string) error { certObj, err := tx.Get(core.Certificate{}, serial) if err != nil { return err } statusObj, err := tx.Get(core.CertificateStatus{}, serial) if err != nil { return err } cert, ok := certObj.(*core.Certificate) if !ok { return fmt.Errorf("Cast failure") } status, ok := statusObj.(*core.CertificateStatus) if !ok { return fmt.Errorf("Cast failure") } _, err = x509.ParseCertificate(cert.DER) if err != nil { return err } signRequest := core.OCSPSigningRequest{ CertDER: cert.DER, Reason: status.RevokedReason, Status: string(status.Status), RevokedAt: status.RevokedDate, } ocspResponse, err := updater.cac.GenerateOCSP(signRequest) if err != nil { return err } timeStamp := time.Now() // Record the response. ocspResp := &core.OCSPResponse{Serial: serial, CreatedAt: timeStamp, Response: ocspResponse} err = tx.Insert(ocspResp) if err != nil { return err } // Reset the update clock status.OCSPLastUpdated = timeStamp _, err = tx.Update(status) if err != nil { return err } // Done return nil }