// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT

package sctp

import (
	
	
	
)

type hmacAlgorithm uint16

const (
	hmacResv1  hmacAlgorithm = 0
	hmacSHA128 hmacAlgorithm = 1
	hmacResv2  hmacAlgorithm = 2
	hmacSHA256 hmacAlgorithm = 3
)

// ErrInvalidAlgorithmType is returned if unknown auth algorithm is specified.
var ErrInvalidAlgorithmType = errors.New("invalid algorithm type")

// ErrInvalidChunkLength is returned if the chunk length is invalid.
var ErrInvalidChunkLength = errors.New("invalid chunk length")

func ( hmacAlgorithm) () string {
	switch  {
	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", )
	}
}

type paramRequestedHMACAlgorithm struct {
	paramHeader
	availableAlgorithms []hmacAlgorithm
}

func ( *paramRequestedHMACAlgorithm) () ([]byte, error) {
	.typ = reqHMACAlgo
	.raw = make([]byte, len(.availableAlgorithms)*2)
	 := 0
	for ,  := range .availableAlgorithms {
		binary.BigEndian.PutUint16(.raw[:], uint16())
		 += 2
	}

	return .paramHeader.marshal()
}

func ( *paramRequestedHMACAlgorithm) ( []byte) (param, error) {
	 := .paramHeader.unmarshal()
	if  != nil {
		return nil, 
	}
	if len(.raw)%2 == 1 {
		return nil, ErrInvalidChunkLength
	}

	 := 0
	for  < len(.raw) {
		 := hmacAlgorithm(binary.BigEndian.Uint16(.raw[:]))
		switch  {
		case hmacSHA128:
			fallthrough
		case hmacSHA256:
			.availableAlgorithms = append(.availableAlgorithms, )
		default:
			return nil, fmt.Errorf("%w: %v", ErrInvalidAlgorithmType, )
		}

		 += 2
	}

	return , nil
}