github.com/jcmturner/gokrb5/v8@v8.4.4/messages/KRBSafe.go (about)

     1  package messages
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/jcmturner/gofork/encoding/asn1"
     8  	"github.com/jcmturner/gokrb5/v8/iana/asnAppTag"
     9  	"github.com/jcmturner/gokrb5/v8/iana/msgtype"
    10  	"github.com/jcmturner/gokrb5/v8/krberror"
    11  	"github.com/jcmturner/gokrb5/v8/types"
    12  )
    13  
    14  // KRBSafe implements RFC 4120 KRB_SAFE: https://tools.ietf.org/html/rfc4120#section-5.6.1.
    15  type KRBSafe struct {
    16  	PVNO     int            `asn1:"explicit,tag:0"`
    17  	MsgType  int            `asn1:"explicit,tag:1"`
    18  	SafeBody KRBSafeBody    `asn1:"explicit,tag:2"`
    19  	Cksum    types.Checksum `asn1:"explicit,tag:3"`
    20  }
    21  
    22  // KRBSafeBody implements the KRB_SAFE_BODY of KRB_SAFE.
    23  type KRBSafeBody struct {
    24  	UserData       []byte            `asn1:"explicit,tag:0"`
    25  	Timestamp      time.Time         `asn1:"generalized,optional,explicit,tag:1"`
    26  	Usec           int               `asn1:"optional,explicit,tag:2"`
    27  	SequenceNumber int64             `asn1:"optional,explicit,tag:3"`
    28  	SAddress       types.HostAddress `asn1:"explicit,tag:4"`
    29  	RAddress       types.HostAddress `asn1:"optional,explicit,tag:5"`
    30  }
    31  
    32  // Unmarshal bytes b into the KRBSafe struct.
    33  func (s *KRBSafe) Unmarshal(b []byte) error {
    34  	_, err := asn1.UnmarshalWithParams(b, s, fmt.Sprintf("application,explicit,tag:%v", asnAppTag.KRBSafe))
    35  	if err != nil {
    36  		return processUnmarshalReplyError(b, err)
    37  	}
    38  	expectedMsgType := msgtype.KRB_SAFE
    39  	if s.MsgType != expectedMsgType {
    40  		return krberror.NewErrorf(krberror.KRBMsgError, "message ID does not indicate a KRB_SAFE. Expected: %v; Actual: %v", expectedMsgType, s.MsgType)
    41  	}
    42  	return nil
    43  }