header.go 793 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package ber
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. )
  7. func readHeader(reader io.Reader) (identifier Identifier, length int, read int, err error) {
  8. var (
  9. c, l int
  10. i Identifier
  11. )
  12. if i, c, err = readIdentifier(reader); err != nil {
  13. return Identifier{}, 0, read, err
  14. }
  15. identifier = i
  16. read += c
  17. if l, c, err = readLength(reader); err != nil {
  18. return Identifier{}, 0, read, err
  19. }
  20. length = l
  21. read += c
  22. // Validate length type with identifier (x.600, 8.1.3.2.a)
  23. if length == LengthIndefinite && identifier.TagType == TypePrimitive {
  24. return Identifier{}, 0, read, errors.New("indefinite length used with primitive type")
  25. }
  26. if length < LengthIndefinite {
  27. err = fmt.Errorf("length cannot be less than %d", LengthIndefinite)
  28. return
  29. }
  30. return identifier, length, read, nil
  31. }