// Copyright 2024 Redpanda Data, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package kafka import ( "crypto/sha256" "crypto/sha512" "github.com/xdg-go/scram" ) // SHA256 generates the SHA256 hash. var SHA256 scram.HashGeneratorFcn = sha256.New // SHA512 generates the SHA512 hash. var SHA512 scram.HashGeneratorFcn = sha512.New // XDGSCRAMClient represents struct to XDG Scram client to initialize conversation. type XDGSCRAMClient struct { *scram.Client *scram.ClientConversation scram.HashGeneratorFcn } // Begin initializes new client and conversation to securely transmit the provided credentials to Kafka. func (x *XDGSCRAMClient) Begin(userName, password, authzID string) (err error) { x.Client, err = x.HashGeneratorFcn.NewClient(userName, password, authzID) if err != nil { return err } x.ClientConversation = x.Client.NewConversation() return nil } // Step takes a string provided from a server (or just an empty string for the very first conversation step) // and attempts to move the authentication conversation forward. func (x *XDGSCRAMClient) Step(challenge string) (response string, err error) { response, err = x.ClientConversation.Step(challenge) return } // Done returns true if the conversation is completed or has errored. func (x *XDGSCRAMClient) Done() bool { return x.ClientConversation.Done() }