Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ jobs:

- name: Security check with Bandit
run: |
bandit -r akavesdk/ private/ sdk/ -ll -f json -o bandit-report.json
bandit -r akavesdk/ private/ sdk/ -ll
bandit -r akavesdk/ sdk/ -ll -f json -o bandit-report.json
bandit -r akavesdk/ sdk/ -ll

- name: Upload Bandit report
uses: actions/upload-artifact@v4
Expand Down
4 changes: 1 addition & 3 deletions akavesdk/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@
from sdk.sdk_ipc import IPC
from private.cids import verify_raw, verify, CIDError


# Make SDKError appear under akavesdk in tracebacks
SDKError.__module__ = "akavesdk"

# Define what gets imported with "from akavesdk import *"
__all__ = ["SDK", "SDKError", "SDKConfig", "IPC",
"BucketCreateResult", "Bucket", "verify_raw", "verify", "CIDError"]
__all__ = ["SDK", "SDKError", "SDKConfig", "IPC", "BucketCreateResult", "Bucket", "verify_raw", "verify", "CIDError"]
5 changes: 3 additions & 2 deletions akavesdk/akavesdk.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import sys
import os

# Add parent directory to path
current_dir = os.path.dirname(os.path.abspath(__file__))
if current_dir not in sys.path:
Expand All @@ -16,6 +17,6 @@
from sdk.sdk import SDK, BucketCreateResult, Bucket
from sdk.config import SDKError
from sdk.sdk_ipc import IPC

# Export all classes
__all__ = ["SDK", "SDKError", "IPC",
"BucketCreateResult", "Bucket"]
__all__ = ["SDK", "SDKError", "IPC", "BucketCreateResult", "Bucket"]
2 changes: 1 addition & 1 deletion private/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
Private module for Akave SDK internal components.
"""

__version__ = "1.0.0"
__version__ = "1.0.0"
2 changes: 0 additions & 2 deletions private/cids/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@

from .cids import verify_raw, verify, CIDError

__all__ = ["verify_raw", "verify", "CIDError"]

34 changes: 16 additions & 18 deletions private/cids/cids.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

try:
from multiformats import CID, multihash

MULTIFORMATS_AVAILABLE = True
except ImportError:
MULTIFORMATS_AVAILABLE = False
Expand All @@ -15,53 +16,50 @@ class CIDError(Exception):
def verify_raw(provided_cid: str, data: bytes) -> None:
if not MULTIFORMATS_AVAILABLE:
raise CIDError("multiformats library is not available")

try:
parsed_cid = CID.decode(provided_cid)
except Exception as e:
raise CIDError(f"failed to decode provided CID: {e}")

verify(parsed_cid, data)


def verify(c: 'CID', data: bytes) -> None:
def verify(c: "CID", data: bytes) -> None:
if not MULTIFORMATS_AVAILABLE:
raise CIDError("multiformats library is not available")

calculated_cid = _calculate_standard_cid(c, data)

if calculated_cid != c:
raise CIDError(
f"CID mismatch: provided {str(c)}, calculated {str(calculated_cid)}"
)
raise CIDError(f"CID mismatch: provided {str(c)}, calculated {str(calculated_cid)}")


def _calculate_standard_cid(c: "CID", data: bytes) -> "CID":

def _calculate_standard_cid(c: 'CID', data: bytes) -> 'CID':

if not MULTIFORMATS_AVAILABLE:
raise CIDError("multiformats library is not available")

version = c.version
codec = c.codec
if hasattr(c, 'hashfun'):

if hasattr(c, "hashfun"):
# hashfun is a multicodec object, convert to string
hash_code = str(c.hashfun).replace("multihash.get('", "").replace("')", "")
else:
hash_code = "sha2-256"

try:
digest = multihash.digest(data, hash_code)
except Exception as e:
raise CIDError(f"failed to create multihash: {e}")

if version == 0:
return CID("base58btc", 0, "dag-pb", digest)
elif version == 1:
base = "base32"
if hasattr(c, 'base'):
base = "base32"
if hasattr(c, "base"):
base = c.base
return CID(base, 1, codec, digest)
else:
raise CIDError(f"unsupported CID version: {version}")

54 changes: 27 additions & 27 deletions private/cids/cids_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

try:
from multiformats import CID, multihash

MULTIFORMATS_AVAILABLE = True
except ImportError:
MULTIFORMATS_AVAILABLE = False
Expand All @@ -22,115 +23,114 @@

def test_verify_raw_valid_cidv0_matches():
test_data = secrets.token_bytes(128)

v0hash = multihash.digest(test_data, "sha2-256")
cidv0 = CID("base58btc", 0, "dag-pb", v0hash)

verify_raw(str(cidv0), test_data)


def test_verify_raw_valid_cidv1_matches():
test_data = secrets.token_bytes(128)

hash_digest = multihash.digest(test_data, "sha2-256")
expected_cid = CID("base32", 1, "dag-pb", hash_digest)

verify_raw(str(expected_cid), test_data)


def test_verify_raw_cid_mismatch():
test_data = secrets.token_bytes(128)

hash_digest = multihash.digest(test_data, "sha2-256")
expected_cid = CID("base32", 1, "dag-pb", hash_digest)

wrong_data = b"different data"

with pytest.raises(CIDError) as exc_info:
verify_raw(str(expected_cid), wrong_data)

assert "CID mismatch" in str(exc_info.value)


def test_verify_raw_invalid_cid_format():
test_data = secrets.token_bytes(128)

with pytest.raises(CIDError) as exc_info:
verify_raw("invalid-cid", test_data)

assert "failed to decode provided CID" in str(exc_info.value)


def test_verify_raw_empty_data():
empty_data = b""

# Calculate CID for empty data
hash_digest = multihash.digest(empty_data, "sha2-256")
empty_cid = CID("base32", 1, "dag-pb", hash_digest)

verify_raw(str(empty_cid), empty_data)


def test_verify_valid_cidv1_matches():
test_data = secrets.token_bytes(127)

hash_digest = multihash.digest(test_data, "sha2-256")
expected_cid = CID("base32", 1, "dag-pb", hash_digest)

verify(expected_cid, test_data)


def test_verify_valid_cidv0_matches():
test_data = secrets.token_bytes(127)

hash_digest = multihash.digest(test_data, "sha2-256")
cidv0 = CID("base58btc", 0, "dag-pb", hash_digest)

verify(cidv0, test_data)


def test_verify_cid_mismatch():
test_data = secrets.token_bytes(127)

hash_digest = multihash.digest(test_data, "sha2-256")
expected_cid = CID("base32", 1, "dag-pb", hash_digest)

wrong_data = b"different data"

with pytest.raises(CIDError) as exc_info:
verify(expected_cid, wrong_data)

assert "CID mismatch" in str(exc_info.value)


def test_verify_different_hash_algorithms():
test_data = secrets.token_bytes(64)

hash_256 = multihash.digest(test_data, "sha2-256")
cid_256 = CID("base32", 1, "dag-pb", hash_256)
verify(cid_256, test_data)

hash_512 = multihash.digest(test_data, "sha2-512")
cid_512 = CID("base32", 1, "dag-pb", hash_512)
verify(cid_512, test_data)


def test_verify_different_codecs():
test_data = secrets.token_bytes(64)

hash_digest = multihash.digest(test_data, "sha2-256")
cid_dagpb = CID("base32", 1, "dag-pb", hash_digest)
verify(cid_dagpb, test_data)

cid_raw = CID("base32", 1, "raw", hash_digest)
verify(cid_raw, test_data)


def test_verify_large_data():
large_data = secrets.token_bytes(1024 * 1024)

hash_digest = multihash.digest(large_data, "sha2-256")
expected_cid = CID("base32", 1, "dag-pb", hash_digest)

verify(expected_cid, large_data)

verify(expected_cid, large_data)
2 changes: 0 additions & 2 deletions private/eip712/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@

from .eip712 import Domain, TypedData, sign, recover_signer_address

__all__ = ["Domain", "TypedData", "sign", "recover_signer_address"]

Loading
Loading