utils.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2016 CNI authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package utils
  15. import (
  16. "crypto/sha512"
  17. "fmt"
  18. )
  19. const (
  20. maxChainLength = 28
  21. chainPrefix = "CNI-"
  22. )
  23. // FormatChainName generates a chain name to be used
  24. // with iptables. Ensures that the generated chain
  25. // name is exactly maxChainLength chars in length.
  26. func FormatChainName(name string, id string) string {
  27. return MustFormatChainNameWithPrefix(name, id, "")
  28. }
  29. // MustFormatChainNameWithPrefix generates a chain name similar
  30. // to FormatChainName, but adds a custom prefix between
  31. // chainPrefix and unique identifier. Ensures that the
  32. // generated chain name is exactly maxChainLength chars in length.
  33. // Panics if the given prefix is too long.
  34. func MustFormatChainNameWithPrefix(name string, id string, prefix string) string {
  35. return MustFormatHashWithPrefix(maxChainLength, chainPrefix+prefix, name+id)
  36. }
  37. // FormatComment returns a comment used for easier
  38. // rule identification within iptables.
  39. func FormatComment(name string, id string) string {
  40. return fmt.Sprintf("name: %q id: %q", name, id)
  41. }
  42. const MaxHashLen = sha512.Size * 2
  43. // MustFormatHashWithPrefix returns a string of given length that begins with the
  44. // given prefix. It is filled with entropy based on the given string toHash.
  45. func MustFormatHashWithPrefix(length int, prefix string, toHash string) string {
  46. if len(prefix) >= length || length > MaxHashLen {
  47. panic("invalid length")
  48. }
  49. output := sha512.Sum512([]byte(toHash))
  50. return fmt.Sprintf("%s%x", prefix, output)[:length]
  51. }