bcb-0026
0.333
Challenge · difficulty 2/5
# BigCodeBench/26
Implement a file **`solution.py`** that completes the function below. Keep the given name and signature; define `task_func` at module level.
Allowed libraries: `base64`, `cryptography`.
```python
import base64
from cryptography.fernet import Fernet
def task_func(message, encryption_key):
"""
Encrypts a message with a symmetric encryption key using Fernet encryption, and then encode the
encrypted message using base64.
Parameters:
message (str): The message to be encrypted and encoded.
encryption_key (str): The key used for symmetric encryption. It should be a string, which will
be encoded to bytes, then URL-safe base64 encoded to conform to the requirements
for Fernet (32 bytes after encoding).
Returns:
str: The base64 encoded encrypted message. The message is first encrypted using Fernet encryption,
then the result is base64 encoded.
Requirements:
- base64
- cryptography.fernet
Example:
>>> encrypted_message = task_func('Hello, World!', '01234567890123456789012345678901')
>>> isinstance(encrypted_message, str)
True
"""
```
<!-- imported from BigCodeBench (BigCodeBench/26) -->
tests/test_bcb_0026.py
# Auto-generated from BigCodeBench BigCodeBench/26. Do not edit by hand.
import pathlib as _pathlib
exec(_pathlib.Path(__file__).with_name("solution.py").read_text(), globals())
import unittest
import base64
from cryptography.fernet import Fernet
class TestCases(unittest.TestCase):
def test_case_1(self):
# Test with a basic message and a valid encryption key.
result = task_func('Hello, World!', '01234567890123456789012345678901')
self.assertIsInstance(result, str)
self.assertNotEqual(result, 'Hello, World!')
def test_case_2(self):
# Test with an empty message and a valid encryption key.
result = task_func('', '01234567890123456789012345678901')
self.assertIsInstance(result, str)
self.assertNotEqual(result, '')
def test_case_3(self):
# Test with a numeric message and a valid encryption key.
result = task_func('1234567890', '01234567890123456789012345678901')
self.assertIsInstance(result, str)
self.assertNotEqual(result, '1234567890')
def test_case_4(self):
# Test with a long message and a valid encryption key.
long_message = 'A' * 500
result = task_func(long_message, '01234567890123456789012345678901')
self.assertIsInstance(result, str)
self.assertNotEqual(result, long_message)
def test_case_5(self):
# Test with a basic message and an incorrectly formatted encryption key.
with self.assertRaises(ValueError):
task_func('Hello, World!', '0123456789')
def test_case_6(self):
# Test with a non-base64 but correct length key.
with self.assertRaises(Exception):
task_func('Hello, World!', '01234567890123456789012345678901'*2) # Not base64-encoded
Proposed solution
```python
import base64
from cryptography.fernet import Fernet
def task_func(message, encryption_key):
key = encryption_key.encode()
fernet = Fernet(key)
encrypted_message = fernet.encrypt(message.encode())
return base64.b64encode(encrypted_message).decode()
```Test output (stdout)
self = <cryptography.fernet.Fernet object at 0x74d64247ed40>
key = b'\xd3]\xb7\xe3\x9e\xbb\xf3\xdd5\xdb~9\xeb\xbf=\xd3]\xb7\xe3\x9e\xbb\xf3\xdd5'
backend = None
def __init__(
self,
key: typing.Union[bytes, str],
backend: typing.Any = None,
):
try:
key = base64.urlsafe_b64decode(key)
except binascii.Error as exc:
raise ValueError(
"Fernet key must be 32 url-safe base64-encoded bytes."
) from exc
if len(key) != 32:
> raise ValueError(
"Fernet key must be 32 url-safe base64-encoded bytes."
)
E ValueError: Fernet key must be 32 url-safe base64-encoded bytes.
/home/psc/miniconda3/envs/peakstone-bcb/lib/python3.10/site-packages/cryptography/fernet.py:39: ValueError
____________________________ TestCases.test_case_3 _____________________________
self = <test_bcb_0026.TestCases testMethod=test_case_3>
def test_case_3(self):
# Test with a numeric message and a valid encryption key.
> result = task_func('1234567890', '01234567890123456789012345678901')
test_bcb_0026.py:21:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
<string>:6: in task_func
???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <cryptography.fernet.Fernet object at 0x74d643703c70>
key = b'\xd3]\xb7\xe3\x9e\xbb\xf3\xdd5\xdb~9\xeb\xbf=\xd3]\xb7\xe3\x9e\xbb\xf3\xdd5'
backend = None
def __init__(
self,
key: typing.Union[bytes, str],
backend: typing.Any = None,
):
try:
key = base64.urlsafe_b64decode(key)
except binascii.Error as exc:
raise ValueError(
"Fernet key must be 32 url-safe base64-encoded bytes."
) from exc
if len(key) != 32:
> raise ValueError(
"Fernet key must be 32 url-safe base64-encoded bytes."
)
E ValueError: Fernet key must be 32 url-safe base64-encoded bytes.
/home/psc/miniconda3/envs/peakstone-bcb/lib/python3.10/site-packages/cryptography/fernet.py:39: ValueError
____________________________ TestCases.test_case_4 _____________________________
self = <test_bcb_0026.TestCases testMethod=test_case_4>
def test_case_4(self):
# Test with a long message and a valid encryption key.
long_message = 'A' * 500
> result = task_func(long_message, '01234567890123456789012345678901')
test_bcb_0026.py:27:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
<string>:6: in task_func
???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <cryptography.fernet.Fernet object at 0x74d64247cb20>
key = b'\xd3]\xb7\xe3\x9e\xbb\xf3\xdd5\xdb~9\xeb\xbf=\xd3]\xb7\xe3\x9e\xbb\xf3\xdd5'
backend = None
def __init__(
self,
key: typing.Union[bytes, str],
backend: typing.Any = None,
):
try:
key = base64.urlsafe_b64decode(key)
except binascii.Error as exc:
raise ValueError(
"Fernet key must be 32 url-safe base64-encoded bytes."
) from exc
if len(key) != 32:
> raise ValueError(
"Fernet key must be 32 url-safe base64-encoded bytes."
)
E ValueError: Fernet key must be 32 url-safe base64-encoded bytes.
/home/psc/miniconda3/envs/peakstone-bcb/lib/python3.10/site-packages/cryptography/fernet.py:39: ValueError
=========================== short test summary info ============================
FAILED test_bcb_0026.py::TestCases::test_case_1 - ValueError: Fernet key must...
FAILED test_bcb_0026.py::TestCases::test_case_2 - ValueError: Fernet key must...
FAILED test_bcb_0026.py::TestCases::test_case_3 - ValueError: Fernet key must...
FAILED test_bcb_0026.py::TestCases::test_case_4 - ValueError: Fernet key must...
4 failed, 2 passed in 0.07s