Source code for strongdoc.api.document

from strongdoc import client
from strongdoc.proto import document_pb2, documentNoStore_pb2, strongdoc_pb2_grpc

BLOCK_SIZE = 10000


def _stream_upload_request_generator(doc_name, plaintext, block_size=BLOCK_SIZE):
    request = document_pb2.UploadDocStreamReq(docName=doc_name)

    yield request

    for i in range(0, len(plaintext), block_size):
        block = plaintext[i: i + block_size]
        request = document_pb2.UploadDocStreamReq(plaintext=block)

        yield request


def _stream_encrypt_request_generator(doc_name, plaintext, block_size=BLOCK_SIZE):
    request = documentNoStore_pb2.EncryptDocStreamReq(docName=doc_name)

    yield request

    for i in range(0, len(plaintext), block_size):
        block = plaintext[i: i + block_size]
        request = documentNoStore_pb2.EncryptDocStreamReq(plaintext=block)

        yield request


def _stream_decrypt_request_generator(docid, ciphertext, block_size=BLOCK_SIZE):
    request = documentNoStore_pb2.DecryptDocStreamReq(docID=docid)

    yield request

    for i in range(0, len(ciphertext), block_size):
        block = ciphertext[i: i + block_size]
        request = documentNoStore_pb2.DecryptDocStreamReq(ciphertext=block)

        yield request


# upload_document uploads a document to be stored by strongdoc
[docs]def upload_document(token, doc_name, plaintext): """ Uploads a document to the service for storage. :param token: The user JWT token. :type token: `string` :param doc_name: The name of the document. :type doc_name: `string` :param plaintext: The text of the document. :type plaintext: `byte array` :returns: The uploaded document ID. :rtype: `string` """ with client.connect_to_server_with_auth(token) as auth_conn: client_stub = strongdoc_pb2_grpc.StrongDocServiceStub(auth_conn) request_iterator = _stream_upload_request_generator(doc_name, plaintext) response = client_stub.UploadDocumentStream(request_iterator) return response.docID
# download_document downloads a document stored in strongdoc
[docs]def download_document(token, docid): """ Download a document from the service. :param token: The user JWT token. :type token: `string` :param docid: The ID of the document. :type docid: `string` :returns: The downloaded document. :rtype: `byte array` """ with client.connect_to_server_with_auth(token) as auth_conn: client_stub = strongdoc_pb2_grpc.StrongDocServiceStub(auth_conn) request = document_pb2.DownloadDocStreamReq(docID=docid) plaintext = b"" response_iterator = client_stub.DownloadDocumentStream(request) for res in response_iterator: plaintext += res.plaintext return plaintext
# encrypt_document encrypts a document with strongdoc, but does not store the actual document
[docs]def encrypt_document(token, doc_name, plaintext): """ Encrypts a document using the service, but do not store it. Instead return the encrypted ciphertext. :param token: The user JWT token. :type token: `string` :param doc_name: The name of the document. :type doc_name: `string` :param plaintext: The text of the document. :type plaintext: `byte array` Returns ------- docID: string The document ID for the uploaded document. This ID is needed to decrypt the document. ciphertext: byte array The encrypted ciphertext of the document. """ with client.connect_to_server_with_auth(token) as auth_conn: client_stub = strongdoc_pb2_grpc.StrongDocServiceStub(auth_conn) request_iterator = _stream_encrypt_request_generator(doc_name, plaintext) docid = None ciphertext = b"" response_iterator = client_stub.EncryptDocumentStream(request_iterator) for res in response_iterator: docid = res.docID ciphertext += res.ciphertext return docid, ciphertext
# decrypt_document encrypts a document with strongdoc. It requires original ciphertext, since the document is not stored
[docs]def decrypt_document(token, docid, ciphertext): """ Decrypt a document using the service. The user must provide the ciphertext returned during the encryptDocument API call. :param token: The user JWT token. :type token: `string` :param docid: The ID of the document. :type docid: `string` :param ciphertext: The document ciphertext to be decrypted. :type ciphertext: `bye array` :returns: The decrypted plaintext content of the document. :rtype: `byte array` """ with client.connect_to_server_with_auth(token) as auth_conn: client_stub = strongdoc_pb2_grpc.StrongDocServiceStub(auth_conn) request_iterator = _stream_decrypt_request_generator(docid, ciphertext) plaintext = b"" response_iterator = client_stub.DecryptDocumentStream(request_iterator) for res in response_iterator: plaintext += res.plaintext return plaintext
# remove_document deletes the document from strongdoc storage
[docs]def remove_document(token, docid): """ Remove a document from the service. :param token: The user JWT token. :type token: `string` :param docid: The ID of the document. :type docid: `string` :returns: Whether the removal was a success. :rtype: `bool` """ with client.connect_to_server_with_auth(token) as auth_conn: client_stub = strongdoc_pb2_grpc.StrongDocServiceStub(auth_conn) request = document_pb2.RemoveDocumentRequest(docID=docid) client_stub.RemoveDocument(request)