#!/usr/bin/python3

"""
* This file is part of the cryptlib test package
* File: python3-decrypt
* Version  : 1.1
* License  : BSD
*
*
* Copyright (c) 2016-2025
*	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  AES decryption for PYTHON 3"

import sys, os
from cryptlib_py import *
from binascii import *

cryptInit()

print( Text )
cryptUser = CRYPT_UNUSED

input = bytearray( b"" )
if os.path.isfile( "./outfile" ):
    F = open ( "./outfile", "rb" )
    input = bytearray( F.read() )
    F.close()
else:    
    print( "There is no file to decrypt." )
    sys.exit(1)

key = bytearray( b"rumpelstielskin" )
output = bytearray( b' '*500 )
Envelope = cryptCreateEnvelope( cryptUser, CRYPT_FORMAT_AUTO )

# input must be modifiable Buffer
bytescopied = 0
try:
    bytescopied = cryptPushData( int(Envelope), input )
except CryptException as e:
    # catch the advisory exception, that the key is still missing
    status, message = e.args
    if status != CRYPT_ENVELOPE_RESOURCE:
        print( "decryption error" )
        sys.exit(2)

cryptSetAttributeString( int(Envelope), CRYPT_ENVINFO_PASSWORD, key )
cryptFlushData( int(Envelope) )

# output must be modifiable Buffer
bytesout = cryptPopData( int(Envelope), output, 500 )
print( "processed ", bytesout, " bytes out ..." )

print( "Plain text :")
print( output.decode() )

cryptDestroyContext( int(Envelope) )

cryptEnd()
sys.exit( 0 )

