package ccm

import (
	
)

// CBC-MAC implementation
type mac struct {
	ci []byte
	p  int
	c  cipher.Block
}

func newMAC( cipher.Block) *mac {
	return &mac{
		c:  ,
		ci: make([]byte, .BlockSize()),
	}
}

func ( *mac) () {
	for  := range .ci {
		.ci[] = 0
	}
	.p = 0
}

func ( *mac) ( []byte) ( int,  error) {
	for ,  := range  {
		if .p >= len(.ci) {
			.c.Encrypt(.ci, .ci)
			.p = 0
		}
		.ci[.p] ^= 
		.p++
	}
	return len(), nil
}

// PadZero emulates zero byte padding.
func ( *mac) () {
	if .p != 0 {
		.c.Encrypt(.ci, .ci)
		.p = 0
	}
}

func ( *mac) ( []byte) []byte {
	return append(, .ci...)
}

func ( *mac) () int { return len(.ci) }

func ( *mac) () int { return 16 }