<?php

function startRKSV($aeskey,$kassenid,$belegnummer,$umsatz){
	
	$aes = new RKSVAES256CTR( $aeskey );	
	$umsatz_aes_encrypt = $aes->encryptAESUmsatz( $umsatz, $kassenid, $belegnummer );
	return  $umsatz_aes_encrypt;
}

class RKSVAES256CTR
{
	
	var $AESMethod = 'AES-256-CFB';
		
	function __construct( $key ) {
		$this->AESKey = $key;
	}
	
	function encryptAESUmsatz( $umsatz, $kassenid, $nr ) {
		$iv = $this->GenerateIV( $kassenid, $nr );
		$key_bin = base64_decode( $this->AESKey );

		$data = $this->encodeUmsatz( $umsatz );
		
		$encoded = openssl_encrypt($data, $this->AESMethod, $key_bin, OPENSSL_ZERO_PADDING, $iv);
		return $encoded;
	}
	
		
	function encodeUmsatz( $in ) {
		$umsatzBytes = $this->getBytes( $in );
	
		
		for( $i=count( $umsatzBytes ); $i<16 ; $i++ ) { //WICHTIG, ORIGINAL war 16, da Umsatzzähler nur 8 Byte groß sein soll, hier geändert auf 8!!
			if($in >= 0){
				$umsatzBytes[] =0;
			}else{
				$umsatzBytes[] =255;
			}
		}
		
		$ret = array_reverse( $umsatzBytes );

		$text = $this->getText2( $ret );		
		return $text;		
	}
	
	function GenerateIV( $kassenid, $belegnummer, $debug = false ) {
		$in = $kassenid . $belegnummer;		
		$hash = substr( hash('sha256', $in, true), 0, 16 );		
		return $hash;		
	}
	
	function getText2( $in ) {
		//bytes to text
		$ret = "";
		foreach( $in as $item ) $ret .= chr( $item );
		return $ret;
	}
	
	function getBytes( $in ) {
		//text / numeric to bytes
		if( is_numeric( $in ) ) {
			return unpack("C*", pack("L", $in ) );
		} else {
			for($i = 0; $i < strlen($in); $i++) {
			   $ret[] =  ord( substr( $in, $i, 1 )  );
			}
			return $ret;
		}
	}
}

?>


