package sctp
import (
"encoding/binary"
"errors"
"fmt"
)
type hmacAlgorithm uint16
const (
hmacResv1 hmacAlgorithm = 0
hmacSHA128 hmacAlgorithm = 1
hmacResv2 hmacAlgorithm = 2
hmacSHA256 hmacAlgorithm = 3
)
var ErrInvalidAlgorithmType = errors .New ("invalid algorithm type" )
var ErrInvalidChunkLength = errors .New ("invalid chunk length" )
func (c hmacAlgorithm ) String () string {
switch c {
case hmacResv1 :
return "HMAC Reserved (0x00)"
case hmacSHA128 :
return "HMAC SHA-128"
case hmacResv2 :
return "HMAC Reserved (0x02)"
case hmacSHA256 :
return "HMAC SHA-256"
default :
return fmt .Sprintf ("Unknown HMAC Algorithm type: %d" , c )
}
}
type paramRequestedHMACAlgorithm struct {
paramHeader
availableAlgorithms []hmacAlgorithm
}
func (r *paramRequestedHMACAlgorithm ) marshal () ([]byte , error ) {
r .typ = reqHMACAlgo
r .raw = make ([]byte , len (r .availableAlgorithms )*2 )
i := 0
for _ , a := range r .availableAlgorithms {
binary .BigEndian .PutUint16 (r .raw [i :], uint16 (a ))
i += 2
}
return r .paramHeader .marshal ()
}
func (r *paramRequestedHMACAlgorithm ) unmarshal (raw []byte ) (param , error ) {
err := r .paramHeader .unmarshal (raw )
if err != nil {
return nil , err
}
if len (r .raw )%2 == 1 {
return nil , ErrInvalidChunkLength
}
i := 0
for i < len (r .raw ) {
a := hmacAlgorithm (binary .BigEndian .Uint16 (r .raw [i :]))
switch a {
case hmacSHA128 :
fallthrough
case hmacSHA256 :
r .availableAlgorithms = append (r .availableAlgorithms , a )
default :
return nil , fmt .Errorf ("%w: %v" , ErrInvalidAlgorithmType , a )
}
i += 2
}
return r , nil
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .