package executor import ( "fmt" "regexp" "strings" xxHash64 "github.com/pierrec/xxHash/xxHash64" "github.com/router-for-me/CLIProxyAPI/v7/internal/config" cliproxyauth "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/auth" "github.com/tidwall/gjson" "github.com/tidwall/sjson" ) const claudeCCHSeed uint64 = 0x6E52736AC806831E var claudeBillingHeaderCCHPattern = regexp.MustCompile(`\bcch=([0-9a-f]{5});`) func signAnthropicMessagesBody(body []byte) []byte { billingHeader := gjson.GetBytes(body, "system.0.text").String() if !strings.HasPrefix(billingHeader, "x-anthropic-billing-header:") { return body } if !claudeBillingHeaderCCHPattern.MatchString(billingHeader) { return body } unsignedBillingHeader := claudeBillingHeaderCCHPattern.ReplaceAllString(billingHeader, "cch=00000;") unsignedBody, err := sjson.SetBytes(body, "system.0.text", unsignedBillingHeader) if err != nil { return body } cch := fmt.Sprintf("%05x", xxHash64.Checksum(unsignedBody, claudeCCHSeed)&0xFFFFF) signedBillingHeader := claudeBillingHeaderCCHPattern.ReplaceAllString(unsignedBillingHeader, "cch="+cch+";") signedBody, err := sjson.SetBytes(unsignedBody, "system.0.text", signedBillingHeader) if err != nil { return unsignedBody } return signedBody } func resolveClaudeKeyConfig(cfg *config.Config, auth *cliproxyauth.Auth) *config.ClaudeKey { if cfg == nil || auth == nil { return nil } apiKey, baseURL := claudeCreds(auth) if apiKey == "" { return nil } for i := range cfg.ClaudeKey { entry := &cfg.ClaudeKey[i] cfgKey := strings.TrimSpace(entry.APIKey) cfgBase := strings.TrimSpace(entry.BaseURL) if !strings.EqualFold(cfgKey, apiKey) { continue } if baseURL != "" && cfgBase != "" && !strings.EqualFold(cfgBase, baseURL) { continue } return entry } return nil } // resolveClaudeKeyCloakConfig finds the matching ClaudeKey config and returns its CloakConfig. func resolveClaudeKeyCloakConfig(cfg *config.Config, auth *cliproxyauth.Auth) *config.CloakConfig { entry := resolveClaudeKeyConfig(cfg, auth) if entry == nil { return nil } return entry.Cloak } func experimentalCCHSigningEnabled(cfg *config.Config, auth *cliproxyauth.Auth) bool { entry := resolveClaudeKeyConfig(cfg, auth) return entry != nil && entry.ExperimentalCCHSigning }