#!/usr/bin/python3

"""
* This file is part of the cryptlib test package
* File: python3-test
* Version  : 1.1
* License  : BSD
*
*
* Copyright (c) 2017-2022
*	Ralf Senderek, Ireland.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
*    must display the following acknowledgement:
*	   This product includes software developed by Ralf Senderek.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
"""

Text = "Cryptlib: performing a basic hash test with SHA1 for PYTHON 3\n"
Text2 = "cryptlib"

import sys
from cryptlib_py import *
from base64 import *
from binascii import *

cryptInit()

# Calls to cryptlib routines

print (Text)
cryptUser = CRYPT_UNUSED
hashContext =  cryptCreateContext( cryptUser, CRYPT_ALGO_SHA1 )
Algo = bytearray(b'     ')
namesize = cryptGetAttributeString( int(hashContext), CRYPT_CTXINFO_NAME_ALGO, Algo )
print ( "Hash algo: ",Algo.decode() ) 

hashedData = bytearray( b"cryptlib" )
nullData = bytearray( b'' )
print ( "Data     : ", hashedData.decode() )

# hashedData must be modifiable Buffer
hashedBytes =  cryptEncrypt( int(hashContext), hashedData )
# end the operation with null bytes input
hashedBytes2 =  cryptEncrypt( int(hashContext) , nullData )

hash = bytearray(b'                    ')
num =  cryptGetAttributeString( int(hashContext) , CRYPT_CTXINFO_HASHVALUE, hash ) 
print ("Base64:", b64encode( hash ).decode())
print ("Hex   :", hexlify( hash ).decode())
if hexlify( hash ).decode() != "6dabb4f4a33f91cd45eb9c4c6f6bca08967615c7" :
     print ("ERROR: sha1 hash failed.")
     sys.exit( 2 )
else:
     print ( "SUCCESS: sha1 hash succeeded." )

cryptDestroyContext( int(hashContext) )
cryptEnd()
sys.exit( 0 )

