100% found this document useful (3 votes)
15 views

Where can buy Distributed Applications and Interoperable Systems 20th IFIP WG 6 1 International Conference DAIS 2020 Held as Part of the 15th International Federated Conference on Distributed Computing Techniques DisCoTec 2020 Valletta Malta June 15 19 2020 Pr Anne Remke ebook with cheap price

Valletta

Uploaded by

griepguaredj
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (3 votes)
15 views

Where can buy Distributed Applications and Interoperable Systems 20th IFIP WG 6 1 International Conference DAIS 2020 Held as Part of the 15th International Federated Conference on Distributed Computing Techniques DisCoTec 2020 Valletta Malta June 15 19 2020 Pr Anne Remke ebook with cheap price

Valletta

Uploaded by

griepguaredj
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 52

Download the Full Version of textbook for Fast Typing at textbookfull.

com

Distributed Applications and Interoperable Systems


20th IFIP WG 6 1 International Conference DAIS
2020 Held as Part of the 15th International
Federated Conference on Distributed Computing
Techniques DisCoTec 2020 Valletta Malta June 15 19
https://textbookfull.com/product/distributed-applications-
2020 Pr Anne Remke
and-interoperable-systems-20th-ifip-wg-6-1-international-
conference-dais-2020-held-as-part-of-the-15th-international-
federated-conference-on-distributed-computing-techniques-d/

OR CLICK BUTTON

DOWNLOAD NOW

Download More textbook Instantly Today - Get Yours Now at textbookfull.com


Anne Remke
Valerio Schiavoni (Eds.)
LNCS 12135

Distributed Applications
and Interoperable Systems
20th IFIP WG 6.1 International Conference, DAIS 2020
Held as Part of the 15th International Federated Conference
on Distributed Computing Techniques, DisCoTec 2020
Valletta, Malta, June 15–19, 2020, Proceedings
Lecture Notes in Computer Science 12135

Founding Editors
Gerhard Goos
Karlsruhe Institute of Technology, Karlsruhe, Germany
Juris Hartmanis
Cornell University, Ithaca, NY, USA

Editorial Board Members


Elisa Bertino
Purdue University, West Lafayette, IN, USA
Wen Gao
Peking University, Beijing, China
Bernhard Steffen
TU Dortmund University, Dortmund, Germany
Gerhard Woeginger
RWTH Aachen, Aachen, Germany
Moti Yung
Columbia University, New York, NY, USA
More information about this series at http://www.springer.com/series/7411
Anne Remke Valerio Schiavoni (Eds.)

Distributed Applications
and Interoperable Systems
20th IFIP WG 6.1 International Conference, DAIS 2020
Held as Part of the 15th International Federated Conference
on Distributed Computing Techniques, DisCoTec 2020
Valletta, Malta, June 15–19, 2020
Proceedings

123
Editors
Anne Remke Valerio Schiavoni
University of Münster University of Neuchâtel
Münster, Germany Neuchâtel, Switzerland

ISSN 0302-9743 ISSN 1611-3349 (electronic)


Lecture Notes in Computer Science
ISBN 978-3-030-50322-2 ISBN 978-3-030-50323-9 (eBook)
https://doi.org/10.1007/978-3-030-50323-9
LNCS Sublibrary: SL5 – Computer Communication Networks and Telecommunications

© IFIP International Federation for Information Processing 2020


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this publication
does not imply, even in the absence of a specific statement, that such names are exempt from the relevant
protective laws and regulations and therefore free for general use.
The publisher, the authors and the editors are safe to assume that the advice and information in this book are
believed to be true and accurate at the date of publication. Neither the publisher nor the authors or the editors
give a warranty, expressed or implied, with respect to the material contained herein or for any errors or
omissions that may have been made. The publisher remains neutral with regard to jurisdictional claims in
published maps and institutional affiliations.

This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
Foreword

The 15th International Federated Conference on Distributed Computing Techniques


(DisCoTec 2020) took place during June 15–19, 2020. It was organized by the
Department of Computer Science at the University of Malta, but was held online due to
the abnormal circumstances worldwide affecting physical travel.
The DisCoTec series is one of the major events sponsored by the International
Federation for Information Processing (IFIP). It comprises three conferences:
• The IFIP WG6.1 22nd International Conference on Coordination Models and
Languages (COORDINATION 2020)
• The IFIP WG6.1 19th International Conference on Distributed Applications and
Interoperable Systems (DAIS 2020)
• The IFIP WG6.1 40th International Conference on Formal Techniques for Dis-
tributed Objects, Components and Systems (FORTE 2020)
Together, these conferences cover a broad spectrum of distributed computing sub-
jects, ranging from theoretical foundations and formal description techniques to sys-
tems research issues. As is customary, the event also included several plenary sessions
in addition to the individual sessions of each conference, that gathered attendants from
the three conferences. These included joint invited speaker sessions and a joint session
for the best papers from the respective three conferences.
Associated with the federated event, two satellite events took place:
• The 13th International Workshop on Interaction and Concurrency Experience
(ICE 2020)
• The First International Workshop on Foundations of Consensus and Distributed
Ledgers (FOCODILE 2020)
I would like to thank the Program Committee chairs of the different events for their
help and cooperation during the preparation of the conference, and the Steering
Committee and Advisory Boards of DisCoTec and their conferences for their guidance
and support. The organization of DisCoTec 2020 was only possible thanks to the
dedicated work of the Organizing Committee, including Davide Basile and Francisco
“Kiko” Fernández Reyes (publicity chairs), Antonis Achilleos, Duncan Paul Attard,
and Ornela Dardha (workshop chairs), Lucienne Bugeja (logistics and finances), as
well as all the students and colleagues who volunteered their time to help. Finally, I
would like to thank IFIP WG6.1 for sponsoring this event, Springer’s Lecture Notes in
Computer Science team for their support and sponsorship, EasyChair for providing the
reviewing framework, and the University of Malta for providing the support and
infrastructure to host the event.

June 2020 Adrian Francalanza


Preface

This volume contains the papers presented at the 20th IFIP International Conference on
Distributed Applications and Interoperable Systems (DAIS 2020), sponsored by the
IFIP (International Federation for Information Processing) and organized by the IFIP
WG6.1. The DAIS conference series addresses all practical and conceptual aspects of
distributed applications, including their design, modeling, implementation, and oper-
ation, the supporting middleware, appropriate software engineering methodologies and
tools, as well as experimental studies and applications.
DAIS 2020 was meant to be held during June 15–19, 2020, in Valletta, Malta, as
part of DisCoTec, the 15th International Federated Conference on Distributed Com-
puting Techniques. However, due to the COVID-19 pandemic, the organizers decided
to turn the conference into a virtual event to be held completely online.
There were 30 initial abstract registrations for DAIS, which were then followed by
17 full papers. Each submission was reviewed by up to three Program Committee
(PC) members. The review process included an in-depth discussion phase, during
which the merits of all papers were discussed by the PC. The committee decided to
accept ten full papers, one short paper, and one invited paper.
Accepted papers address challenges in multiple application areas, including system
support for machine learning, security and privacy issues, experimental reproducibility
and fault-tolerance, as well novel networking approaches for future network genera-
tions. Researchers continue the trend of focusing on trusted execution environments,
for instance in the case of database systems. Instead, we notice fewer research efforts
devoted to blockchain topics.
The virtual conference, especially during these last months full of unpredictable
events, was made possible by the work and cooperation of many people working in
several committees and organizations, all of which are listed in these proceedings. In
particular, we are grateful to the Program Committee members for their commitment
and thorough reviews and for their active participation in the discussion phase, and all
the external reviewers for their help in evaluating submissions. Finally, we also
thankful to the DisCoTec general chair, Adriano Francalanza, and the DAIS Steering
Committee chair, Rui Oliveira, for their constant availability, support, and guidance.

June 2020 Anne Remke


Valerio Schiavoni
Organization

General Chair
Adrian Francalanza University of Malta, Malta

Program Committee Chairs


Anne Remke University of Münster, Germany
Valerio Schiavoni University of Neuchâtel, Switzerland

Steering Committee
Rocco De Nicola IMT Lucca, Italy
Pascal Felber University of Neuchâtel, Switzerland
Kurt Geihs University of Kasel, Germany
Alberto Lluch Lafuente DTU, Denmark
Kostas Magoutis ICS-FORTH, Greece
Elie Najm (Chair) Télécom ParisTech, France
Manuel Núñez Universidad Complutense de Madrid, Spain
Rui Oliveira University of Minho, Portugal
Jean-Bernard Stefani Inria Grenoble, France
Gianluigi Zavattaro University of Bologna, Italy

Program Committee
Pierre-Louis Aublin Keio University, Japan
Sonia Ben Mokhtar LIRIS-CNRS, France
Sara Bouchenak INSA, France
Antoine Boutet INSA, France
Silvia Bonomi Università degli Studi di Roma La Sapienza, Italy
Damiano Di University of Cambridge, UK
Francesco Maesa
Davide Frey Inria, France
Paula Herber University of Münster, Germany
Mark Jelasity University of Szeged, Hungary
Evangelia Kalyvianaki University of Cambridge, UK
Vana Kalogeraki Athens University of Economics and Business, Greece
Rüdiger Kapitza Technical University of Braunschweig, Germany
João Leitão Universidade Nova de Lisboa, Portugal
Daniel Lucani Aarhus University, Denmark
Miguel Matos INESC-ID, University of Lisboa, Portugal
Kostas Magoutis University of Ioannina, Greece
x Organization

Claudio Antares Mezzina University of Urbino, Italy


Alberto Montresor University of Trento, Italy
Daniel OKeeffe Royal Holloway University of London, UK
Emanuel Onica Alexandru Ioan Cuza University of Iasi, Romania
Marta Patino Universidad Politecnica de Madrid, Spain
José Orlando Pereira Universidade do Minho, INESC-TEC, Portugal
Hans P. Reiser University of Passau, Germany
Etienne Riviére École Polytechnique de Louvain, Belgium
Romain Rouvoy University of Lille 1, France
Pierre Sutra Télécom SudParis, France
Spyros Voulgaris Athens University of Economics and Business, Greece

Additional Reviewers
Isabelly Rocha University of Neuchâtel, Switzerland
Philipp Eichhammer University of Passau, Germany
Christian Berger University of Passau, Germany
Vania Marangozova-Martin IMAG, France

DisCoTec Organizing Committee


Adrian Francalanza University of Malta, Malta
(General Chair)
Davide Basile ISTI-CNR, Italy
(Publicity Chair)
Kiko Fernández-Reyes Uppsala University, Sweden
(Publicity Chair)
Antonis Achilleos Reykjavik University, Iceland
(Workshops Chair)
Duncan Attard University of Malta, Malta
(Workshops Chair)
Ornela Dardha University of Glasgow, UK
(Workshops Chair)
Lucienne Bugeja (Logistics) University of Malta, Malta
Contents

Privacy and Security

On the Trade-Offs of Combining Multiple Secure Processing Primitives


for Data Analytics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Hugo Carvalho, Daniel Cruz, Rogério Pontes, João Paulo,
and Rui Oliveira

Capturing Privacy-Preserving User Contexts with INDOORHASH . . . . . . . . . . . 21


Lakhdar Meftah, Romain Rouvoy, and Isabelle Chrisment

Cloud and Systems

Towards Hypervisor Support for Enhancing the Performance


of Virtual Machine Introspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Benjamin Taubmann and Hans P. Reiser

Fed-DIC: Diagonally Interleaved Coding in a Federated


Cloud Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Giannis Tzouros and Vana Kalogeraki

TailX: Scheduling Heterogeneous Multiget Queries to Improve


Tail Latencies in Key-Value Stores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Vikas Jaiman, Sonia Ben Mokhtar, and Etienne Rivière

Fault-Tolerance and Reproducibility

Building a Polyglot Data Access Layer for a Low-Code Application


Development Platform (Experience Report) . . . . . . . . . . . . . . . . . . . . . . . . 95
Ana Nunes Alonso, João Abreu, David Nunes, André Vieira,
Luiz Santos, Tércio Soares, and José Pereira

A Comparison of Message Exchange Patterns in BFT Protocols


(Experience Report). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Fábio Silva, Ana Alonso, José Pereira, and Rui Oliveira

Kollaps/Thunderstorm: Reproducible Evaluation of Distributed Systems:


Tutorial Paper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Miguel Matos
xii Contents

Machine Learning for Systems

Self-tunable DBMS Replication with Reinforcement Learning . . . . . . . . . . . 131


Luís Ferreira, Fábio Coelho, and José Pereira

DroidAutoML: A Microservice Architecture to Automate the Evaluation


of Android Machine Learning Detection Systems . . . . . . . . . . . . . . . . . . . . 148
Yérom-David Bromberg and Louison Gitzinger

Distributed Algorithms

A Resource Usage Efficient Distributed Allocation Algorithm for 5G


Service Function Chains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Guillaume Fraysse, Jonathan Lejeune, Julien Sopena, and Pierre Sens

A Self-stabilizing One-To-Many Node Disjoint Paths Routing Algorithm


in Star Networks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Rachid Hadid and Vincent Villain

Author Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205


Privacy and Security
On the Trade-Offs of Combining Multiple
Secure Processing Primitives for Data
Analytics

Hugo Carvalho(B) , Daniel Cruz, Rogério Pontes, João Paulo, and Rui Oliveira

INESC TEC and Universidade do Minho, Braga, Portugal


{hugo.a.carvalho,daniel.c.cruz,rogerio.a.pontes,
joao.t.paulo,rui.oliveira}@inesctec.pt

Abstract. Cloud Computing services for data analytics are increasingly


being sought by companies to extract value from large quantities of infor-
mation. However, processing data from individuals and companies in
third-party infrastructures raises several privacy concerns. To this end,
different secure analytics techniques and systems have recently emerged.
These initial proposals leverage specific cryptographic primitives lack-
ing generality and thus having their application restricted to particular
application scenarios. In this work, we contribute to this thriving body
of knowledge by combining two complementary approaches to process
sensitive data.
We present SafeSpark, a secure data analytics framework that enables
the combination of different cryptographic processing techniques with
hardware-based protected environments for privacy-preserving data stor-
age and processing. SafeSpark is modular and extensible therefore adapt-
ing to data analytics applications with different performance, security
and functionality requirements.
We have implemented a SafeSpark’s prototype based on Spark SQL
and Intel SGX hardware. It has been evaluated with the TPC-DS Bench-
mark under three scenarios using different cryptographic primitives and
secure hardware configurations. These scenarios provide a particular set
of security guarantees and yield distinct performance impact, with over-
heads ranging from as low as 10% to an acceptable 300% when compared
to an insecure vanilla deployment of Apache Spark.

Keywords: Data analytics · Privacy · Trusted hardware

1 Introduction
Data analytics plays a key role in generating high-quality information that
enables companies to optimize the quality of their business while presenting
several advantages such as making faster business decisions, predicting users

c IFIP International Federation for Information Processing 2020


Published by Springer Nature Switzerland AG 2020
A. Remke and V. Schiavoni (Eds.): DAIS 2020, LNCS 12135, pp. 3–20, 2020.
https://doi.org/10.1007/978-3-030-50323-9_1
4 H. Carvalho et al.

behaviours, elaborating better marketing plans, and improving relationships


with customers. As the amount of data to be analysed grows, companies tend
to resort to cloud services due to their high levels of reliability, flexibility, and
efficiency, as well as competitive costs. However, using cloud services to store
and process data increases the risk of unauthorized access to it, thus present-
ing serious issues to the users, given that some data may contain private or
sensitive information, such as personal e-mails, and medical or financial records.
The problem can arise internally, for instance when a system administrator man-
ages confidential data inappropriately [1], or externally through, for instance, the
exploitation of bugs in the cloud infrastructure [4,6,7]. Also, the existence of reg-
ulations such as the European General Data Protection Regulation (GDPR) [3]
stresses the need for a new set of security measures for sensitive data being stored
and processed at third-party services.
Current secure data analytics solutions aiming at overcoming the previous
challenges can be broadly divided into two groups. Applications in the first
one operate over encrypted data or protected data to be more generic. These
are based on cryptographic techniques such as deterministic [8,30] or homomor-
phic [24] encryption that allow doing different types of computations (e.g., equal-
ity, order, and arithmetic operations) over encrypted data. The second group of
solutions uses hardware-based protected environments or trusted hardware as it
is commonly known, such as Intel SGX [15] or Arm TrustZone [9], to process
data analysis with privacy and integrity guarantees. As expected, each approach
has its advantages and limitations as we will elaborate on below in Sect. 2.
With SafeSpark we combine, in a modular and extensible manner, both
approaches in a secure data analytics framework. To the best of our knowledge, it
is the first tool to do so. The contribution of this paper is threefold. We present a
modular and extensible framework capable of combining a growing set of crypto-
graphic data processing techniques with trusted hardware processing devices. We
have implemented a prototype that extends the Apache Spark framework with
secure operations using standard encryption, deterministic encryption, order-
preserving encryption techniques, and the Intel SGX technology while remaining
full Spark SQL compliant. And we thoroughly evaluate the prototype with the
TPC-DS Benchmark under three scenarios using different cryptographic primi-
tives and secure hardware configurations.
The remainder of the paper is organized as follows. Section 2 presents rele-
vant background and Sect. 3 reviews the state of the art for secure data analyt-
ics. Section 4 describes SafeSpark’s architecture and Sect. 5 details its prototype
implementation. Section 6 presents the experimental evaluation. Section 7 con-
cludes the paper.

2 Background

This section describes the cryptographic techniques we use and their security
guarantees as well as the Intel SGX technology.
On the Trade-Offs of Combining Multiple Secure Processing 5

2.1 Cryptographic Schemes

Current privacy-preserving solutions use different encryption techniques to


ensure data privacy [22,29].
STD is a symmetric encryption scheme that provides Indistinguishability
under Chosen-Plaintext Attack (IND-CPA) security which ensures that no infor-
mation is disclosed from ciphertexts [20]. This scheme has a strong security def-
inition but does not support any kind of computation over encrypted data. As
such, SafeSpark’s prototype uses STD to protect data that does not need to be
processed at the untrusted premises.
The DET scheme ensures that multiple encryption operations over the same
plaintext, and with the same encryption key, will result in the same ciphertext.
Therefore, this scheme leaks encrypted values that correspond to the same value
in plaintext, thus providing Indistinguishability under Distinct Chosen-Plaintext
Attacks (IND-DCPA) [30] security. Also, the DET scheme allows performing
equality comparisons over ciphertexts, for instance, it can be used to support
SQL queries such as GROUP BY, COUNT, or DISTINCT.
The OPE scheme allows comparing the order of two ciphertexts, which is
preserved from the original plaintexts [12]. With this scheme, range queries like
MAX, MIN, COUNT, ORDER BY and GROUP BY can be applied directly over
encrypted data. Since the OPE scheme preserves more properties from the orig-
inal plaintext data it also has weaker security guarantees - Indistinguishability
under Ordered Chosen-Plaintext Attack (IND-OCPA).
Other schemes, such as Paillier Encryption [24] or Secure Multi-Party Com-
putation [18] can also be used for building secure data processing systems. How-
ever, their performance impact is high thus affecting the practicality of the result-
ing solution [34]. Nevertheless, SafeSpark has a modular and extensible design
capable of supporting additional schemes such as these in the future.

2.2 Intel SGX

Intel SGX [15] is a trusted hardware solution contemplating protected execution


environments - called Enclaves - whose security relies on the processors’ instruc-
tions and a set of keys only accessible to the hardware. Enclaves have isolated
memory addresses with the assurance that no malicious external environment,
such as the operating system or hypervisor can compromise their security.
SGX splits an application into a trusted and an untrusted environment. When
a user wants to compute data using SGX, she starts by creating an Enclave,
which is placed in a trusted memory region. Then, when the user’s application
calls a trusted function (i.e., a function that runs within SGX Enclaves), the
execution of the application and the input data needed for that function, are
transferred to the enclave. Therefore, by exchanging encrypted data with the
enclave, and securely transmitting the corresponding encryption keys, applica-
tions can safely execute operations over the plaintext of sensitive data without
leaking information to the server where the operation is deployed [15].
6 H. Carvalho et al.

Enclaves also provide sealing capabilities that allow encrypting and authenti-
cating the data inside an enclave so that it can be written to persistent memory
without any other process having access to its contents. Also, SGX relies on
software attestation, which ensures that critical code is running within a trusted
enclave. One of the main advantages of SGX against its predecessors is its lower
Trusted Computing Base (TCB). This factor defines the set of components, such
as hardware, firmware, or software components that are considered critical to
system security. With SGX, TCB only includes the code that users decide to run
inside their enclave. Thus, SGX provides security guarantees for attacks from
malicious software running on the same computer.

2.3 Threat Model

SafeSpark considers a trusted and untrusted site. The Spark client resides on the
trusted site (e.g.: private infrastructure) and the Spark cluster is deployed on the
untrusted one (e.g.: public cloud). We assume a semi-honest, adaptive adversary
(internal attacker) with control over the untrusted site, with the exception of
the trusted hardware. The adversary observers every query, its access patterns
and can also replay queries. However, our model assumes that the adversary is
honest-but-curious and thus does not have the capability of modifying queries
nor their execution. The parameters and results of queries are encrypted with a
secret key only available to the client and enclaves.

3 Related Work
Current secure data analytics platforms fall into two broad approaches. One, like
the Monomi [33] system, resort to cryptographic schemes such as DET and OPE
to query sensitive data on untrusted domains. The other, relies on hardware-
based protected environments.
Monomi, in particular, splits the execution of complex queries between the
database server and the client. The untrusted server executes part of the query,
and when the remaining parts cannot be computed on the server or can be more
efficiently computed on the client-side, the encrypted data is sent to the client,
which decrypts it and performs the remaining parts of the query. Seabed [25] has
a similar approach with an architecture based on splitting the query execution
between the client and the server. This platform proposes two new cryptographic
schemes, ASHE and SPLASHE which allow executing arithmetic and aggrega-
tion operations directly over the cryptograms.
Contrarily, VC3 [31] and Opaque [35] follow a trusted hardware approach.
Namely, they use Intel SGX [16] to create secure enclaves where sensitive data
can be queried in plaintext without revealing private information. VC3 uses SGX
to perform secure MapReduce operations in the cloud, protecting code and sen-
sitive data from malicious attackers. Opaque is based on Apache Spark and adds
new operators that, in addition to ensuring the confidentiality and integrity of
the data, ensure that analytical processing is protected against inference attacks.
On the Trade-Offs of Combining Multiple Secure Processing 7

These additional security guarantees lead however to a high impact on perfor-


mance, with Opaque being up to 62 times slower than the original Spark.
Segarra et al. in [32] propose a secure processing system build on top of
Spark Streaming that uses Intel SGX to compute stream analytics over pub-
lic untrusted clouds. This solution offers security guarantees similar to those
proposed in Opaque without requiring changes to applications code.
Unlike previous work, this paper aims at exploring the combination of both
cryptographic and trusted hardware primitives for the Spark SQL engine. To the
best of our knowledge, this approach is still unexplored in the literature and, as
shown in the paper, provides novel trade-offs in terms of performance, security,
and functionality that better suit a wider range of data analytics applications.

4 Architecture

SafeSpark’s architecture is based on the Apache Spark platform [10], which cur-
rently does not support big data analytics with confidentiality guarantees. In this
section, we describe a novel modular and extensible architecture that supports
the simultaneous integration of cryptographic and trusted hardware primitives.

4.1 Apache Spark

Apache Spark is an open-source data analytics engine for large-scale distributed


and parallel data processing. Spark uses in-memory processing, which makes
it way faster than its predecessors, such as Apache Hadoop [19]. Our work is
based on Spark SQL, which is an upper-level library for structured data process-
ing. Spark SQL provides a programming abstraction, called DataFrames, which
presents a data table with rows and named columns, similar to a database table,
and on which one can perform traditional SQL queries [10].
Spark’s architecture, depicted by the white boxes in Fig. 1, consists of three
main components. The Driver Program is responsible for managing and schedul-
ing the queries submitted to the Spark cluster, while the Cluster Manager allo-
cates resources (e.g., CPU, RAM) to each query, dividing it into smaller tasks to
be processed by the Spark Workers. Spark proposes a distributed architecture
that scales horizontally. Namely, by launching Spark Workers on new servers,
the queries being processed by the Spark cluster can leverage the additional
computational resources of such servers.
Spark considers a Data Storage phase where information is uploaded to a
given data source (e.g., Apache HDFS). Stored data is then loaded into tabular
representation (in-memory DataFrames) that can be efficiently queried.
During the Data Processing phase, clients start by creating a SparkContext
object, that connects the program being executed (Driver Program) to the Spark
environment. Then, each client submits queries to the system through the Spark
SQL component, which generates an execution plan that is sent to the Cluster
Manager. The latter divides the execution plan into multiple tasks and assigns
each task to a subset of Spark Workers with available resources (e.g., CPU,
8 H. Carvalho et al.

RAM). When all the tasks are completed, the result is sent from the Spark
Workers to the Driver Program, which returns the output to the clients.

4.2 SafeSpark
SafeSpark extends Spark’s architecture [10] by integrating multiple secure pro-
cessing primitives that can be combined to offer different performance, secu-
rity and functionality trade-offs to data analytics applications. Figure 1 shows
the proposed architecture which contemplates four new components: SafeSpark
Worker, Handler, CryptoBox and SafeMapper.

Fig. 1. SafeSpark’s architecture

During the Data Storage phase, sensitive data is encrypted on the trusted
site before being uploaded to the untrusted Spark data source. For this, the
user must first specify in a configuration file how the data will be represented
in a tabular form. Then, for each data column, the user will specify the type of
cryptographic scheme (e.g. STD, DET, OPE) or trusted hardware technology
(e.g. Intel SGX) to be employed.
The SafeMapper module is responsible for parsing the information contained
in the configuration file and forwarding it to the SafeSpark Worker. The latter
will intercept the plaintext data being uploaded to the untrusted data source and
will encrypt each data column with the specified secure technique. The conver-
sion of plaintext to encrypted data is actually done by the Handler component,
which provides encode() and decode() methods for encrypting and decrypting
information, respectively. Moreover, the Handler uses modular entities, called
CryptoBoxes, each one corresponding to a different cryptographic technique or
On the Trade-Offs of Combining Multiple Secure Processing 9

trusted hardware technology. Each CryptoBox contains an API with methods


that allow generating a key, as well as methods to encrypt and decrypt data
using the respective CryptoBox key.
The SafeSpark Worker is present on both sites and has the goal of abstract-
ing the integration of cryptographic techniques and trusted hardware into the
system. In addition to the encode() and decode() methods, it also implements a
process() method that is used on the untrusted side to execute secure operations,
during the Data Processing phase. This method is essential to enable the exe-
cution of secure operations, such as sums or averages, at the trusted hardware
enclaves deployed on the untrusted premises.
The proposed architecture allows exploring different trade-offs between per-
formance, privacy, and functionalities through the combination of different secure
processing and storage primitives. Also, SafeSpark’s modular design aims at
easing the integration of new cryptographic algorithms and trusted hardware
technologies, such as ORE [13], into the platform.

4.3 Flow of Operations

To exemplify the flow of operations in our platform let us consider the use-case
of a company that wishes to store and query their employees’ information in a
third-party cloud service. The company’s database will have an Employees table
holding the Salary, Age, and Category of each employee (database columns).
These columns contain sensitive information so the company’s database admin-
istrators define a secure schema using SGX for the Salary, OPE for the Age and
DET for the Category.
Firstly, the database’s information must be uploaded to the corresponding
cloud service (➀). Given the sensitive nature of this data, the upload request is
intercepted by the SafeSpark Worker (➁) that initializes the SGX, OPE, and
DET CryptoBoxes specified in the configuration schema (➂), while using them
to encrypt the corresponding data columns (➃). The resulting encrypted data
columns (➄) are then uploaded into the untrusted data storage source (➅).
Note that for encrypting data with the SGX technology, we consider a sym-
metric cipher similar to the STD scheme. During SafeSpark’s bootstrap phase,
the client application, running on the trusted premises must generate this key
and exchange it with the enclave, through a secure channel, so that encrypted
data can be decrypted inside the secure enclave and the desired operations can
be done privately over plaintext data. This paper tackles the architectural chal-
lenges of integrating Intel SGX and other cryptographic primitives in Spark.
Thus, we do not focus on the protocols of secure channel establishment or
key exchange between clients and remote enclaves. Such challenges have been
addressed in [11,27], which SafeSpark can rely upon in a real-world instantiation
and that would not require any code changes at Spark’s core codebase.
After completing the database’s loading phase, clients can then query the
corresponding information. Let us consider a SQL query that averages employees’
salaries who are between 25 and 30 years and then groups the results by category.
10 H. Carvalho et al.

SELECT Category, avg(Salary)


FROM Employees
WHERE Age BETWEEN 25 AND 30
GROUP BY Category

By sending the query through the Spark Context (➊), the request is inter-
cepted by the SafeSpark Worker, which verifies the user-defined configuration
file (➋), checking whether it is necessary to change the query, in order to invoke
secure operators from CryptoBoxes (➌). Since stored values for the column Age
are encrypted with OPE, the SafeSpark Worker encrypts the values “25”and
“30” by resorting to the same OPE CryptoBox and key. Moreover, as the
Salary column is encrypted using SGX, the operation avg needs to be performed
within secure SGX enclaves. Therefore, SafeSpark provides a new operator that
allows computing the average within SGX enclaves, while the SafeSpark Worker
replaces the common operator avg by this new operator (AVG SGX ).
Then, after protecting sensitive query arguments at the trusted premises,
the request is sent to the untrusted premises, namely to the Cluster Manager,
which dispatches the tasks to Spark Workers (➎). Since the GROUP BY and
BETWEEN operators internally perform equality and order comparison opera-
tions, and considering that Category and Age columns are encrypted with DET
and OPE schemes, Spark is able to execute the operation directly over cipher-
texts. However, the operation avg needs to be executed by the SafeSpark Workers
using the process() method of the CryptoBox SGX (➏). At the SGX enclave,
this method receives the input data to calculate avg and decrypts it with the
previously agreed key. Then it does the avg calculation in plaintext and encrypts
the result before sending it back to the untrusted Spark engine.
The query’s encrypted result is sent to the Spark Client (➐) and intercepted
by SparkWorker that, based on the SafeMapper component (➑), decrypts it
using the appropriate CryptoBox (➒). Lastly, the plaintext result is sent back
to the client (➓).

5 Implementation

SafeSpark’s prototype leverages the SafeMapper and CryptoBox components


used by SafeNoSQL [22]. Thereby, the STD and DET schemes were implemented
with an AES 128-bit key in CBC mode with and without a random initialization
vector, respectively, and by using the OpenSSL cryptographic library [5]. For the
OPE scheme, we follow the implementation proposed by Boldyreva et al., using
the OpenSSL and MPFR (Multiple-Precision Floating-Point) libraries [5,17].
On the other hand, since the SafeNoSQL platform does not consider the use of
SGX technology, we extended the library of CryptoBox components, in order to
support arithmetic and relational operations using SGX. Next, we describe the
implementation of the other SafeSpark components.
On the Trade-Offs of Combining Multiple Secure Processing 11

5.1 Data Storage


The conversion of plaintext data to encrypted one, during the data storage phase
(Fig. 1), is done by using Parquet files [26] as these provide the standard format
for Spark environments [14]. Parquet is a column-oriented data storage format
that provides optimizations that make it very efficient, particularly for analytical
processing scenarios. Our converter was implemented using the JAVA program-
ming language, and it provides encode and decode (i.e., encrypt and decrypt)
methods that allow protecting sensitive data based on a secure database con-
figuration schema. Thus, each column at the Parquet file is encrypted with the
chosen encryption methods before being uploaded to the untrusted premises.

5.2 Data Processing


For the data processing phase the SafeSpark Worker, deployed at the untrusted
site, is able to natively perform equality and order operations over columns
protected with DET and OPE. However, when the SGX technology is being
used, operations must be redesigned to execute within secure enclaves. For this
reason, we resorted to Spark Used-Defined Functions (UDF) and User-Defined
Aggregate Functions (UDAF’s) since these allow us to change Spark’s behaviour
without directly changing its source code. The Scala programming language was
used to implement these UDF/UDAFs. However, since SGX technology does
not support the Scala programming language, we used the Java Native Interface
(JNI) to call functions, developed in the C language, that are able to perform
arithmetic and comparison operations using the SGX technology.
Considering this new set of functionalities, the SQL query presented at
Sect. 4.3 is translated by the SafeSpark Worker, by invoking the corresponding
SafeSpark operators, in the following way:
SELECT Category, AVG_SGX(Salary)
FROM Employees
WHERE Age BETWEEN 0FC6AC2E AND 0FC6D497
GROUP BY Category
Note that the avg operator is replaced by AVG SGX, which is a new operator
provided by SafeSpark that computes the salary average within secure SGX
Enclaves. Moreover, the values “25” and “30” are replaced by “0FC6AC2E”
and “0FC6D497”, respectively, which is the hexadecimal representation for the
output produced by the OPE encryption operation.
As a drawback of the current implementation, the Spark’s framework does
not yet provide a stable API for enabling a developer to define their own User-
Defined Types (UDT). Therefore, if a specific data column was protected with
SGX and that column is included in a GROUP BY or ORDER BY clause, its
execution is not attainable since it is not possible to specify a UDF or UDAF for
these two clauses. To solve this problem, we adopt a column duplication strategy.
Thereby, when a data column is encrypted using SGX and one needs to perform
GROUP BY or ORDER BY operations over it, that column is duplicated and
12 H. Carvalho et al.

protected with a DET or OPE primitive, respectively. However, this approach


is not suitable for nested arithmetic and order operations, for instance, a SUM
operation followed by an ORDER BY operation applied to the same column.
Furthermore, as proposed by SafeNoSQL [22], this column duplication strategy
is also used to improve the performance impact of decrypting data protected
with the OPE scheme. Since this is a time-consuming operation, a duplicate
column with the STD scheme is introduced so that, whenever a value encrypted
with OPE needs to be retrieved in plaintext to the client (e.g., the age of an
employee) a faster decryption method is applied. The performance and storage
space overhead trade-offs of these optimizations are further analysed in Sect. 6.
Finally, Spark SQL’s DataFrames API was extended by creating a new oper-
ator, called collectDecrypt, that is responsible for decrypting the result of a query
before presenting it to the user.

6 Experimental Evaluation

SafeSpark’s prototype was evaluated to understand the impact of combining dif-


ferent privacy-preserving techniques. Namely, we compared Spark Vanilla against
three different secure settings, on which we alternate the cryptographic and
trusted hardware primitives being used and the data these are applied to.

6.1 Experimental Setup and Methodology

The experiments consider a distributed cluster composed of five nodes, config-


ured with Cloudera Manager v.6.1.1. We used version 2.4 of Apache Spark and
version 3.0.0 of HDFS for data storage. For the Client node, which is responsible
for executing the queries and managing the cluster, we used a node equipped
with an Intel Core i3-4170 CPU 3.70 GHz, 15.9GiB (DDR3) of RAM, a SATA3
119GiB SSD and with a Gigabit network interface. The nodes with data process-
ing function (Workers) are equipped with an Intel Core i3-7100 CPU 3.9 GHz
(with Intel SGX support), 7.8GiB (DDR3) of RAM, a SATA3 119GiB SSD and
with a Gigabit network interface. During the data storage phase, we used a sep-
arate server to encrypt the data. This is equipped with an Intel (R) Xeon (R)
CPU E5-2698 v4 @ 2.20 GHz, 31.3GiB (DDR3), and a Gigabit network interface.
We used the TPC-DS [23] benchmark, which models the decision support
functions of a retail product supplier, considering essential components of any
decision support system: data loading, multiple types of queries, and data main-
tenance. To explore different user behaviors for a decision support system, the
TPC-DS benchmark provides four classes of SQL queries, each one representing
a different database user activity in this type of system: Iterative, Data Mining,
Reporting, and Ad-Hoc queries. For the experiments, we selected two queries
from each group based on previous work [21,28]. Namely, we chose queries 24
and 31 from the Iterative OLAP class, queries 27 and 73 from the Reporting
class, queries 37 and 82 from the Ad-Hoc class, and queries 40 and 46 from the
On the Trade-Offs of Combining Multiple Secure Processing 13

Data Mining class. TPC-DS was configured with a 10× scale factor, correspond-
ing to a total of 12 GB of data to be loaded into Spark’s storage source.
We performed ten runs of each TPC-DS query for Spark Vanilla, which com-
putes over plaintext data, and for the different SafeSpark setups, which run on
top of encrypted data. For each query, we analyzed the mean and standard devia-
tion of the execution time. Also, the dstat framework [2] was used at each cluster
node to measure the CPU and memory consumption, as well as the impact on
disk read/write operations and on the network traffic. Moreover, we analyzed
the data storage times and the impact of encrypted data on storage space.

6.2 SafeSpark Setups

The evaluation considers three SafeSpark setups with specific combinations of


secure primitives for protecting TPC-DS’s database schema, namely:

SafeSpark-SGX. This setup aims at maximizing the usage of SGX for doing
queries over sensitive information at the TPC-DS database schema. Thus,
the data columns which are used within arithmetic operations or filters of
equality and order were encrypted using SGX. The OPE scheme was used
for all the columns contemplating ORDER BY operations since this type of
operation is not supported by the SGX operator, as explained in Sect. 5.2.
For the remaining columns contemplating equality operations as GROUP
BY or ROLL OUT, we used the DET scheme.
SafeSpark-OPE. This scenario aims at maximizing the use of cryptographic
schemes, starting by using OPE and followed by the DET scheme. Therefore,
in this case, SGX was only used for operations that are not supported by
DET and OPE, namely arithmetic operations, sums or averages. Thus, OPE
was used for all the operations containing order and equality comparisons,
as ORDER BY, GROUP BY or BETWEEN clauses. For the remaining
columns, that only require equality operations, the DET scheme was used.
SafeSpark-DET. As in the previous scenario, this one also maximizes the use
of cryptographic schemes. However, it prioritizes the DET primitive instead
of the OPE one, thus reducing the number of OPE columns that were being
used in GROUP BY and ROLL UP operations in the previous scenario.
Thus, SGX was only used for operations not supported by OPE or DET
primitives. For columns that need to preserve equality, we used DET. For
columns requiring order comparisons, we used the OPE scheme. In some
cases, it was necessary to duplicate some columns already protected with
the DET scheme. For example, when a column is targeted simultaneously
by a GROUP BY (equality) and ORDER BY (order) operation.

Finally, we used the STD scheme to protect all columns on which no


server-side data processing is performed. The secure setups used are fur-
ther detailed at https://hugocarvalho9.github.io/safespark/testing-setups.html
where it is shown the different secure primitives used for the TPC-DS schema.
14 H. Carvalho et al.

6.3 Results
This section presents the results obtained from the experimental evaluation.

6.3.1 Loading and Storage


Table 1 shows that Spark Vanilla took 4.7 min for the storage phase. For the
SafeSpark configurations, we considered not only the loading time but also
the time used to encrypt the data. The SafeSpark-SGX setup took 697.1 min
to encrypt and load the data, and the stored data size increased by 4.73×.
The SafeSpark-OPE loading time was 735.1 min, and the data size increased by
6.23×. Lastly, the loading time for SafeSpark-DET was 776.3 min, and the data
size increased by 6.39×.

Table 1. Loading time and data size.

Setup Vanilla SafeSpark-SGX SafeSpark-OPE SafeSpark-DET


Loading time 4.7 min 637.1 min 735.1 min 776.4 min
Data size 4.1 GB 19.4 GB 25.54 GB 26.2 GB

The impact shown throughout the storage phase can be explained by the use
of the OPE scheme to encrypt data since it has a longer encoding time comparing
with the other schemes, especially when the plaintext size is larger [22]. Also, the
cryptograms produced by this scheme are significantly larger than the original
plaintext, which can sustain the observed increase for the stored data size. In
some situations, the cryptogram’s size increases up to 4× when compared to the
size of the original plaintext. It is important to note that all setups resort to
the OPE primitive. However, SafeSpark-SGX is the setup that uses least this
primitive and so has the fastest loading time. On the other hand, SafeSpark-DET
has a higher loading time because it duplicates some columns to incorporate both
DET and OPE primitives, as explained in Sect. 6.2.

6.3.2 Latency
Figure 2 presents the query latency results for the three SafeSpark configurations
and Vanilla Spark. The values reflect each query execution time, as well as the
time used to encrypt the query’s parameters and to decrypt the query results
when these are sent back to the client.
As expected, SafeSpark has worse performance than Spark Vanilla due to the
secure primitives performance overhead. The SafeSpark-SGX scenario exhibits
the highest overhead, while its best result occurs for query 24 with a 1.54×
penalty and the worst for query 82 with a 4.1× penalty. These values can be
justified by two factors. First, this scenario maximizes the use of SGX to protect
data, leading to a wide number of data transfer and processing operations being
executed within the SGX enclaves. We noted that, for example, query 31 has
On the Trade-Offs of Combining Multiple Secure Processing 15

150
Spark Vanilla
SafeSpark-SGX
125 SafeSpark-OPE
SafeSpark-DET

100
Latency (s)

75

50

25

0
Q24 Q27 Q31 Q37 Q40 Q46 Q73 Q82

Queries

Fig. 2. Query execution times.

done approximately 4.5 million operations to SGX enclaves with an average


time of 2.2 µs for each operation. Second, we use Spark SQL UDFs to perform
operations on data protected with SGX. However, a limitation of Spark is that it
currently does not support query plan optimizations for UDFs. Thus, the same
query running on Spark Vanilla and SafeSpark may generate different execution
plans, which can compromise the performance values obtained.
The SafeSpark-OPE maximizes the use of cryptographic schemes, thereby
reducing the number of operations that are performed within SGX Enclaves.
As we can observe in the Fig. 2, this testing scenario is more efficient than the
previous one. This improvement is justified not only by the lower number of
operations within Enclaves but also by reducing the use of UDFs, which leads
Spark to generate optimized query execution plans. The best (1.15× penalty)
and worst (2.86× penalty) execution times are still visible at queries 24 and
82, respectively. Although SafeSpark-OPE improves the results presented by
SafeSpark-SGX, there are some queries where the execution time is significantly
penalized by the time to encrypt the query parameters and decrypt the query
results. For example, we noticed that query 31 took on average 14,226 s for
decrypting the results, while 13,112 s were spent on OPE’s decryption opera-
tion. In fact, the use of OPE to decrypt results shows a notable impact on the
execution time, considering that the process of decrypting data using OPE is
significantly slower than the analogous operations for the DET or STD ciphers,
especially when the size of the cryptogram is larger.
SafeSpark-DET has its best execution time also for query 24, with a penalty
of 1.13×. The worst result is for query 37, which is 2.4× slower than the same
query executed on Spark Vanilla. It is also worth highlighting that there are six
queries (24, 27, 31, 40, 46 and 73) where the execution time penalty is between
1.13× and 1.52×. Ad-Hoc queries (37 and 82) require a higher execution time
due to the usage of UDFs for arithmetic operations done within SGX enclaves.
16 H. Carvalho et al.

The results also show that SafeSpark-DET alleviates the penalty of decrypt-
ing data, by reducing the usage of the OPE scheme and maximizing the usage
of the DET scheme. Consequently, as the number of values decrypted with the
OPE scheme decreases, so it does the query execution time.

6.3.3 Resource Usage


Overall, resource usage results were similar for all SafeSpark setups. Due to space
constraints, Table 2 highlights the worst-case results obtained for each resource
(i.e., CPU, memory, disk and network I/O). The full results can be consulted at
https://hugocarvalho9.github.io/safespark/resource-usage.html.

Table 2. Resource consumption results

Resource Query Setup Master Worker #1 Worker #2 Worker #3 Worker #4


CPU (%) 40 Spark Vanilla 16 15.2 11 15.4 15.9
SafeSpark-DET 10.5 19.1 24.9 17.7 24.2
Memory (GB) 37 Spark Vanilla 14.8 6.6 5.6 5.8 5.9
SafeSpark-SGX 15.8 6.5 6.7 6.4 7
Disk read (KB/s) 46 Spark Vanilla 0.7 1.4 193.9 686.2 594.9
SafeSpark-SGX 0.9 516.3 909.5 656.2 975.9
Disk write (KB/s) 82 Spark Vanilla 84.1 2726.6 2783.4 2791 2149.2
SafeSpark-DET 83.7 11354.4 165.3 160.6 8961.2
Network recv (MB/s) 46 Spark Vanilla 304 1570.5 1939.4 3013 3083.1
SafeSpark-DET 301.5 4309 4501.5 4467.6 4853.2
Network send (MB/s) 46 Spark Vanilla 7.4 0.3 0.5 0.6 1
SafeSpark-DET 15.8 0.5 0.6 0.9 0.6

The CPU and memory consumption does not show notable changes, even
considering the process of decrypting the query results and the computational
power used by Intel SGX. The worst CPU consumption result occurred on
query 40 with SafeSpark-DET, presenting an overhead 31%, when compared
to Vanilla Spark. Regarding memory consumption, the worst overhead was 10%
for SafeSpark-SGX, also on query 37.
SafeSpark has an impact on disk and network I/O. Query 46 with SafeSpark-
SGX shows an overhead of 107% on disk reads, and query 82 with SafeSpark-
DET has a 97% overhead on disk writes, when compared with Spark Vanilla.
Finally, network traffic has the highest impact on query 46 with SafeSpark-DET
(approximately 87%). These overheads are justified by the fact that cryptograms
generated by SafeSpark, which will be sent through network channels and stored
persistently, are larger than plaintext data. This is even more relevant when using
the OPE scheme as it generates larger cryptograms.
On the Trade-Offs of Combining Multiple Secure Processing 17

6.4 Discussion

Based on the experimental results presented, we distilled a set of considerations


that are described next.
Applications that collect vast amounts of real-time data and focus on decreas-
ing the loading time and transferred/stored data size should avoid the usage
of OPE. As we have seen, this scheme generates larger cryptograms and its
encryption/decryption time introduces a significant impact on the loading time.
Thereby, reducing the usage of OPE leads to better results in the storage phase,
as well as on network and disk I/O traffic.
Concerning the queries execution time, we observed that performance can
be influenced by two main factors: i) The number of columns that need to be
decrypted with the OPE scheme when the result is sent back to the client; ii)
The number of operations performed within SGX enclaves.
The first could be improved by leveraging SafeSpark’s modular design to
integrate more efficient secure order-preserving primitives such as ORE [13].
Regarding the second challenge, a significant source of overhead comes from
our current implementation relying on Spark SQL’s UDF/UDAF mechanisms
for supporting SGX operations. These are not integrated with Spark’s query
planner component and thus, do not provide optimized query execution plans.
A potential approach to face this problem could be to develop our own Spark
operators and optimized execution plans, as done in Opaque [35]. Also, as future
work, we could devise batching strategies to enable multiple operations to be
executed in a single enclave call, which would reduce the number of calls to the
enclave and their inherent performance overhead.
Finally, the SafeSpark-DET setup, which only uses OPE for ORDER BY
operations and SGX for operations not supported by deterministic schemes,
is able to achieve the best performance results. In fact, this setup supports
six queries with overheads between 13% and 52%, when compared to Spark
Vanilla. Nevertheless, it is important to have in mind that, with this perfor-
mance increase, one is reducing the provided security guarantees. For instance,
SafeSpark-DET presents lower security guarantees than SafeSpark-SGX.
Comparing our platform with the existing state-of-the-art systems, SafeSpark
differs from the hardware-based approaches [31,32,35] since it enables the use
of deterministic schemes to compute equality and order operations. This func-
tionality makes it possible to achieve better performance results while relaxing
the security guarantees. On the other hand, SafeSpark distinguishes itself from
Monomi and Seabed platforms by using the SGX technology to perform arith-
metic operations instead of using Homomorphic Encryption schemes.

7 Conclusion

This paper presents SafeSpark, a modular and extensible secure data analytics
platform that combines multiple secure processing primitives to better handle the
performance, security, and functionality requirements of distinct data analytics
18 H. Carvalho et al.

applications. Distinctively, SafeSpark supports both cryptographic schemes and


the Intel SGX technology according to users’ demand.
SafeSpark’s experimental evaluation shows that it is possible to develop a
practical solution for protecting sensitive information being stored and processed
at third-party untrusted infrastructures with an acceptable impact on applica-
tion performance. Moreover, while supporting the entire Spark SQL API. When
comparing SafeSpark’s performance with Spark Vanilla, the prototype’s over-
head ranges from roughly 10% to 300%. Particularly, with the SafeSpark - DET
configuration, we show that for a majority of queries it is possible to maintain
the performance overhead below 50%.
Currently, we are working to extend SafeSpark with other secure processing
primitives with different security and performance trade-offs (e.g., ORE [13]).
Evaluation with even larger data sets and new types of queries is underway too.

Acknowledgements. We thank the anonymous reviewers and our shepherd Pierre-


Louis Aublin for their helpful suggestions. The research leading to these results has
received funding from the European Union’s Horizon 2020 - The EU Framework Pro-
gramme for Research and Innovation 2014–2020, under grant agreement No. 857237
and FCT - Fundação para a Ciência e a Tecnologia grant SFRH/BD/142704/2018.

References
1. The cambridge analytical files. https://www.theguardian.com/news/series/cambri-
dge-analytica-files. Accessed 2019
2. Dstat: versatile resource statistics tool. http://dag.wiee.rs/home-made/dstat/. Acc-
essed 2020
3. Eu general data protection regulation. https://eugdpr.org/. Accessed 2020
4. Isaac, M., Frenkel, S.: Facebook security breach exposes accounts of 50
million users. https://www.nytimes.com/2018/09/28/technology/facebook-hack-
data-breach.html. Accessed 2020
5. Openssl - cryptography and SSL/TLS toolkit. https://www.openssl.org/. Accessed
2020
6. Perlroth, N.: All 3 billion yahoo accounts were affected by 2013 attack. https://
www.nytimes.com/2017/10/03/technology/yahoo-hack-3-billion-users.html. Acc-
essed 2020
7. Roman, J.: Ebay breach: 145 million users notified. https://www.bankinfosecurity.
com/ebay-a-6858. Accessed 2020
8. Agrawal, R., Kiernan, J., Srikant, R., Xu, Y.: Order preserving encryption for
numeric data. In: Proceedings of the 2004 ACM SIGMOD International Conference
on Management of Data, pp. 563–574. ACM (2004)
9. ARM, A.: Security technology building a secure system using trustzone technology
(white paper). ARM Limited (2009)
10. Armbrust, M., et al.: Spark SQL: relational data processing in spark. In: Proceed-
ings of the 2015 ACM SIGMOD International Conference on Management of Data,
pp. 1383–1394. ACM (2015)
11. Bahmani, R., et al.: Secure multiparty computation from SGX. In: Kiayias, A.
(ed.) FC 2017. LNCS, vol. 10322, pp. 477–497. Springer, Cham (2017). https://
doi.org/10.1007/978-3-319-70972-7 27
On the Trade-Offs of Combining Multiple Secure Processing 19

12. Boldyreva, A., Chenette, N., Lee, Y., O’Neill, A.: Order-preserving symmetric
encryption. In: Joux, A. (ed.) EUROCRYPT 2009. LNCS, vol. 5479, pp. 224–241.
Springer, Heidelberg (2009). https://doi.org/10.1007/978-3-642-01001-9 13
13. Boneh, D., Lewi, K., Raykova, M., Sahai, A., Zhandry, M., Zimmerman, J.: Seman-
tically secure order-revealing encryption: multi-input functional encryption with-
out obfuscation. In: Oswald, E., Fischlin, M. (eds.) EUROCRYPT 2015. LNCS,
vol. 9057, pp. 563–594. Springer, Heidelberg (2015). https://doi.org/10.1007/978-
3-662-46803-6 19
14. Chambers, B., Zaharia, M.: Spark: The Definitive Guide: Big Data Processing
Made Simple. O’Reilly Media Inc, Sebastopol (2018)
15. Costan, V., Devadas, S.: Intel SGX explained. IACR Cryptology ePrint Archive
2016(086), 1–118 (2016)
16. Durak, F.B., DuBuisson, T.M., Cash, D.: What else is revealed by order-revealing
encryption? In: Proceedings of the 2016 ACM SIGSAC Conference on Computer
and Communications Security, pp. 1155–1166. ACM (2016)
17. Fousse, L., Hanrot, G., Lefèvre, V., Pélissier, P., Zimmermann, P.: MPFR: a
multiple-precision binary floating-point library with correct rounding. ACM Trans.
Math. Softw. (TOMS) 33(2), 13 (2007)
18. Goldreich, O.: Secure multi-party computation. Manuscript. Preliminary version
78 (1998)
19. Hadoop, A.: Apache hadoop. http://hadoop.apache.org. Accessed 2020
20. Katz, J., Lindell, Y.: Introduction to Modern Cryptography. CRC Press, Boca
Raton (2014)
21. Kocberber, O., Grot, B., Picorel, J., Falsafi, B., Lim, K., Ranganathan, P.: Meet the
walkers: accelerating index traversals for in-memory databases. In: Proceedings of
the 46th Annual IEEE/ACM International Symposium on Microarchitecture, pp.
468–479. ACM (2013)
22. Macedo, R., et al.: A practical framework for privacy-preserving NoSQL databases.
In: 2017 IEEE 36th Symposium on Reliable Distributed Systems (SRDS), pp. 11–
20. IEEE (2017)
23. Nambiar, R.O., Poess, M.: The making of TPC-DS. In: Proceedings of the 32nd
International Conference on Very Large Data Bases, pp. 1049–1058. VLDB Endow-
ment (2006)
24. Paillier, P.: Public-key cryptosystems based on composite degree residuosity
classes. In: Stern, J. (ed.) EUROCRYPT 1999. LNCS, vol. 1592, pp. 223–238.
Springer, Heidelberg (1999). https://doi.org/10.1007/3-540-48910-X 16
25. Papadimitriou, A., et al.: Big data analytics over encrypted datasets with seabed.
In: 12th {USENIX} Symposium on Operating Systems Design and Implementation
({OSDI} 16), pp. 587–602 (2016)
26. Parquet, A.: Apache parquet. Accessed 2020
27. Pass, R., Shi, E., Tramèr, F.: Formal abstractions for attested execution secure
processors. In: Coron, J.-S., Nielsen, J.B. (eds.) EUROCRYPT 2017. LNCS, vol.
10210, pp. 260–289. Springer, Cham (2017). https://doi.org/10.1007/978-3-319-
56620-7 10
28. Poess, M., Nambiar, R.O., Walrath, D.: Why you should run TPC-DS: a workload
analysis. In: Proceedings of the 33rd International Conference on Very Large Data
Bases, pp. 1138–1149. VLDB Endowment (2007)
29. Popa, R.A., Redfield, C., Zeldovich, N., Balakrishnan, H.: CryptDB: protecting
confidentiality with encrypted query processing. In: Proceedings of the Twenty-
Third ACM Symposium on Operating Systems Principles, pp. 85–100. ACM (2011)
Another Random Scribd Document
with Unrelated Content
Hän teki vähäisen, torjuvan eleen. »Tunkeutuuko helvetti —
paratiisiin, mon ami?» virkkoi hän lempeän leikillisesti.
»Kaksikymmentä vuotta on sinulla ollut taivas maan päällä, sinä
onnellinen pahus, kuten minä saatan todistaa. Pitääkö sinun vielä
muistella? Jos hän kerran voi unohtaa, miksi et sitten sinä?»

Sheikki heilautti kättänsä epäävästi. »Jos sinä olisit menetellyt


samoin kuin minä menettelin, olisitko sinä unohtanut?» huudahti hän
entistä katkerammin. »Mutta sinä — bon Dieu, sinä et olisi ikinä
alentunut niin kunnottomaksi.»

Saint Hubertin kasvoille tuli omituinen ilme, ja hän käänsi


väsyneesti päätänsä pieluksella.

»Kukapa tietää?» sanoi hän hitaasti. »Saavuttaakseni sen, mitä


sinä saavutit, olisin saattanut tehdä senkin, mitä sinä teit. Jos olisin
joutunut samaan kiusaukseen.» Hänen riutunut äänensä särkyä, ja
melkein huomaamattaan hän siirsi katseensa sisemmän huoneen
verhoihin. »Tout comprendre, c'est tout pardonner», jupisi hän. »Hän
ymmärsi, ja koska hän rakasti sinua, kykeni hän antamaan anteeksi
ja unohtamaan. Jos sinä senjälkeen olisit pettänyt hänen
luottamuksensa tai jos et olisi pystynyt säilyttämään hänen
rakkauttansa, saattaisi sinulla olla täysi syy katkeruuteesi. Mutta sinä
olet tehnyt hänet onnelliseksi kaikiksi näiksi vuosiksi. Eikö se
merkitse mitään, mon cher?»

»Vain se on tehnyt elämäni elämisen arvoiseksi», vastasi sheikki


hiljaa. »Jumala yksin tietää, mitä minusta olisi tullut ilman hänen
rakkauttansa ja sinun ystävyyttäsi.» Ja häpeillen äkillistä
mielenliikutusta, joka pani hänen tiukat huulensa vavahtelemaan,
hän nousi jyrkästi pystyyn ja meni pöydän ääreen silmäilemään Carl
Röstin ruumiin taskuista löydettyjä papereita, jotka sittemmin
osoittautuivat arvaamattoman arvokkaiksi hallitukselle maan
ohjaamiseen nähden, kun maailmansodan myrskypilvi vain
muutamia kuukausia myöhemmin yllätti Ranskan.

Ja tarkkaillessansa häntä, kun hän otsa rypyssä tutki tiheästi


kirjoitettuja asiakirjoja, joita hän selaili kädessään, Saint Hubert kiitti
Jumalaa, kuten hän viimeisten kahdenkymmenen vuoden aikana oli
monta kertaa kiittänyt, siitä, että hän oli jaksanut säilyttää tuon
miehen ystävyyden. Ei edes häntä hivuttava rakkaus ollut sitä
pilannut, vaan moitteetonta kumppanuutta oli katkeamatta kestänyt
loppuun asti.

Loppuun asti! Heikko hymy kareili hänen huulillaan. Hän saattoi


ajatella sitä tyynesti, hän, jolla ei ollut mitään menetettävää, jonka ei
tarvinnut mistään moittia itseänsä. Hänen rakastamansa nainen oli
onnellinen, ja jos hän vain jaksaisi torjua kuolemaa siihen saakka,
kunnes tyttö palaisi — tyttö kyllä palaisi, siitä hän oli varma — hän
voisi kuolla pahoittelematta mitään. Mutta kuoleminen sitä tietämättä
— Dieu, se olisi kovaa!

Äkkiä häntä vihloi kamala tuska, hän puristi peitteellä lepäävän


kätensä nyrkkiin ja virui muutamia minuutteja silmät ummessa,
ponnistellen kuolemanheikkoutta vastaan, samalla kun tuskanhikeä
valui hänen kasvoilleen.

Se oli varoitus, jota hänen ei sopinut syrjäyttää. Jos hänen oli mieli
tietää se, mitä hän tahtoi tietää, ei sitä saanut siirtää enää
tuonnemmaksi.

Kuultuansa hänen heikon kutsunsa ehätti sheikki takaisin hänen


luoksensa parilla hätäisellä askelella.
»Maurilainen», huohotti hän. »Minun täytyy nähdä hänet nyt, jos
lainkaan mielin häntä nähdä. Ja minä tahdon saada varman tiedon
— ennenkuin poistun.»

Ja katsahtaessaan sairaan pingoittuneihin, harmaihin kasvoihin,


jotka olivat muuttuneet jopa muutamien viime minuuttien aikana,
sheikki käsitti hänen puhuneen silkkaa totta. Mutta sittenkin hän
empi.

»Jumalan tähden, säästä itseäsi siltä», kehoitti hän. »Salli minun


yksin puhutella häntä…»

Mutta Saint Hubertin voimaton ote tiukkautui hänen ranteensa


ympärille.

»Sillä ei voi olla paljoakaan väliä mon cher, ja minä tahdon itse
nähdä hänet — kuulla totuuden hänen huuliltansa, ennenkuin
kuolen», intti hän entistä lujemmin. »Lähetä noutamaan häntä,
Ahmed! Se tekee poistumiseni helpommaksi.»

Hiukan nyökäten, sillä hän ei sillä hetkellä kyennyt puhumaan,


sheikki meni avoimelle ovelle, taputti hiljaa käsiänsä ja antoi
määräyksen äänen kantamissa odottavalle palvelijalle.

Hänen palatessansa oli huolestunut ystävä jälleen muuttunut


päälliköksi, ja hänen piirteensä olivat kovat ja tiukat, hänen tummat
kulmakarvansa painuneet peloittaviin ryppyihinsä, kun hän veti
tuolinsa vähän loitommaksi leposohvasta ja istuutui ääneti
vartoamaan vangin tuloa.

Ja tuntien voimiensa olevan hyvin vähissä pysyi Saint Hubertkin


vaiti levätessänsä huohottaen, silmien kiiluessa kuumeisesta
odotuksesta.

Hiljaa liikkuva palvelija tuli meluttomasti sytyttämään uudelleen


lamput, jotka oli sammutettu, jotta huoneen ilma viilenisi. Ja hänen
jälkeensä hiipi sisälle sihteeri, jonka oli kirjoitettava maurilaisen
lausunto muistiin, kumarsi nöyrän kunnioittavasti ja kyykistyi
istumaan matolle sheikin viereen, levittäen kirjoitusvehkeensä
polvilleen.

Sitten saapuivat Jusef ja pari alempaa päällikköä, jotka sijoittuivat


esimiehensä taakse. Ja lyhyen väliajan kuluttua, joka Saint
Hubertista kuitenkin tuntui vuosisadalta, saapui vihdoin maurilainen
vartijainsa välissä siteihin kiedottu pää pystyssä, veriviiruisilla
kasvoilla tiikerimäisen äkäinen ilme.

Hän loi yhden ainoan vilkaisun mieheen, jota oli ampunut, yhden
ainoan väijyvän, nopean silmäyksen avaraan, ylellisesti sisustettuun
huoneeseen ja kääntyi sitten uhmailevasti tuolilla istuvaan
äänettömään mieheen päin.

Ja muutamiin minuutteihin sheikki ei hievahtanut eikä hiiskunut


mitään.

Sitten hän hyvin hitaasti nosti katseensa vankiin.

»Kaikesta ja kaikista tulee loppu. Ja koska sinun tähtesi eräitä


minun palvelijoitani kohtasi pikainen loppu, vaatii sydämeni, oi mies,
että sinunkin loppusi tulee, mutta se ei ehkä ole niin nopea. Eikö ole
kirjoitettu: 'Jokainen sielu on annettu pantiksi siitä, mitä se tekee?'
Pian sinut kutsutaan lunastamaan sitä panttia. Mutta ennen Allahin
tuomiota tuomitsevat ihmiset. Pieni osa sinun tekemästäsi pahasta
on minun tiedossani. Mutta enemmän — jos sinä olet se mies, jota
etsin — haluan tietää. Kerro senvuoksi kaikki, mitä tahdon tietää, jos
haluat kuolla helposti.» Sanat lausuttiin tyynesti, melkein
välinpitämättömästi, ja matalasointuinen ääni tuskin kantoi vangin
takana puoliympyrässä seisovien aseistettujen miesten toiselle
puolelle. Mutta rauhallisesta, tasaisesta äänensävystä huolimatta oli
loppu-uhkauksessa ja maurilaiseen suunnatussa kylmässä,
värähtämättömässä tuijotuksessa jotakin, mikä sai hänen omituiset
silmänsä säpsähtämään ja hänen köytetyt kätensä äkkiä
vavahtamaan.

»Tuleeko kuolema joka tapauksessa?» mutisi hän jurosti. Ja kun


hän näki toisen pään vähäisen kallistumisen, joka vei häneltä
viimeisen toivon, nykäisi hän itsensä suoraksi.

»Koska kerran kuolen, kuolen ääneti», ärähti hän, »sillä mitä


hyötyä on puhumisesta?»

Sheikki kohautti olkapäitänsä, ja hänen katseensa muuttui


uhkaavaksi.

»Mitäkö hyötyä?» kertasi hän, huulillansa vähäinen, hirvittävä


hymy. »Oletko unohtanut, että on monta tietä, jotka vievät paratiisiin
— tai helvettiin? Kuuntele, ja kun minä olen sinulle puhunut —
valitse sitten se tie, jota myöten tahdot mennä!»

Ja samalla hiljaisella, kiihkottomalla äänellä kuin ennenkin hän


lausui sanoja, jotka puristivat Saint Hubertilta tukahdutetun
vastalauseen, samalla kun ne puistattivat sen miehen kookasta
ruhoa, joka oli tehnyt yhtä paljon ja enemmänkin runnellaksensa
hänen pahanilkisten aikeittensa tielle joutuneita kovaosaisia, mutta
jota ei miellyttänyt se ajatus, että hän itse saisi kokea samaa, mitä oli
pakottanut toisia kestämään. Hänen villiä ylpeyttänsä kuohutti
kiduttava pelko, joka pyrki tyyten lamauttamaan hänen sisunsa, ja
hän pinnisti epätoivoisesti tahtoaan säilyttääksensä omaksumansa
rohkean ulkonäön. Mutta hänen raskas hengityksensä paljasti pelon,
jota hän koetti salata, ja isoja hikikarpaloita kihosi sakeasti hänen
otsalleen, kun hän tuijotti tuomarinsa tunteettomiin kasvoihin ja sitten
häntä ympäröiviin yhtä järkkymättömiin miehiin. Heissä hän näki
loppunsa ja kaikkien suunnitelmiensa ja toiveittensa lopun, ja hän
puri hammasta voimattoman raivon puuskassa. Huoneessa
syntyneen jännittyneen hiljaisuuden katkaisi Saint Hubert.

»Ahmed, taivaan tähden», kuiskasi hän englanninkielisen


vastalauseen, »ei siten — ei edes saadaksemme ne tiedot, joita
haluan.»

Sheikki katsahti häneen olkansa ylitse, hymyillen huvitettuna,


mutta tuikeasti. »Ole huoletta», kehoitti hän tyynesti.

»Meidän ei tarvitse turvautua äärimmäisiin keinoihin. Hän hikoilee


jo.
Hän valitsee helpomman tien. Ja mitä tulee taivutteluuni, ei se ole
sen kummempaa kuin mitä hän lupasi Pojulle, joka oli hänen
vallassaan.
Pitäisikö minun tarjota hänelle vähemmän kuin hän tarjosi
pojalleni?»
Mutta hymy oli poissa, kun hän taaskin kääntyi maurilaiseen päin.

»Pitääkö minun odottaa koko yö, koira? Valitse!»

Uudelleen miehen pitkät, petolinnun kynsiä muistuttavat sormet


hypistelivät hänen likaisen burnusinsa laskoksia, ja vaahtoa kihosi
hänen huulillensa, joita hän nuoleskeli hermostuneesti.
Vielä hetkisen hän seisoi kahdella päällä ylpeyden ja pelon
taistellessa hänen mielessänsä, samalla kun hän nopeasti vilkuili
puolelta toiselle, ikäänkuin vielä koettaen keksiä jotakin
pelastuskeinoa. Kasvojensa vääntyessä raivon virnistykseen hän
sitten ärähti. »Koska teidän ylhäisyytenne on niin kovin armollinen,
mitä on minulla valittavana?» Mutta hänen puhuessansa muuttui
hänen käytöksensä, ja hänen sävynsä hieno ivallisuus väistyi
mielittelevän avomielisyyden tieltä, samalla kun häneltä lähti sanoja
vuolaana tulvana.

»Mitä herrani haluaa tietää?» laversi hän. »Sen roumin


salaisuudetko, joka minun oli eilen pakko tappaa? Niitä en tiedä. Olin
roumin opas enkä hänen salaisuuksiensa säilyttäjä. Ja mitäpä minä
välitin hänen salaisuuksistansa tai hänestä itsestään, joka oli pelkkä
välikappale? Hänen salaisuutensa olivat niissä papereissa, joita hän
säilytti piilossa povellaan. Viime yönä näin, että ne otettiin hänen
ruumiinsa taskuista. Epäilemättä ne ovat herrani hallussa, ja hän voi
ne lukea — jos niin haluaa. Minä en tiedä mitään niistä enkä
siitäkään, minkä tähden hän oli lähtenyt omasta maastansa. Mutta
mitä minuun tulee, oi herra, onko miehen selitettävä, minkä tähden
hän pyrkii kostamaan kunniansa loukkausta, minkä tähden hän etsii
tytärtä, joka on häneltä ryöstetty…»

Sheikki keskeytti hänen puheensa, liikahtaen kärsimättömästi.

»Kaikki tuo tiedetään», sanoi hän tuimasti, »ja se on ajan


tuhlausta. Se, mitä haluamme tietää, ei koske nykyisyyttä, vaan
entisyyttä…» Hän pysähtyi hetkiseksi terävästi silmäilemään tummia,
hien kostuttamia kasvoja, jotka alkoivat muuttua täplikkään
harmaiksi. »Niin, entisyyttä», toisti hän sitten tarkoituksellisesti.
»Sinun olisi ollut paras muistaa sitä, paras lumota käärmeitä koko
ikäsi, sinä hupsu, kuin jälleen antautua entiseen ammattiisi. Mies
tunnetaan teoistansa. Viime yönä surmasit isäntäsi — entä toinen
murhaamasi isäntä, sinä marokkolainen Ghabah?»

Tukahdutetusti parahtaen maurilainen horjahti takanansa olevia


miehiä vasten. »En minä häntä tappanut», ähkyi hän vaivaloisesti.
»Hän kuoli — mutta profeetan pään kautta vannon, etten minä häntä
surmannut.»

»Mutta profeetan pään kautta eräs toinen mies vannoi nähneensä


sinun tappavan hänet ja lisäksi kaksitoista muuta miestä, jotka
aseettomina istuivat leirinuotion hiipuvien kekäleiden ympärillä.»

»Hän valehteli — sillä ketään ei jäänyt näkemään…» Liian


myöhään maurilainen oivalsi erehtyneensä ja koetti tukahduttaa
kiivastuksissa lausuttuja sanojaan, jotka sisälsivät syytöksen häntä
itseänsä vastaan.

Vuosikausia hän oli arvellut, että etsinnästä oli luovuttu, luullut


olevansa turvassa. Mutta katkerasti kiroten sitä typeryyttä, että oli
tullut takaisin siihen maahan, jossa oli tehnyt rikoksensa, hän nyt
käsitti, ettei etsinnästä oltukaan luovuttu, että verikostaja oli hänen
tietämättään koko ajan väijynyt hänen kintereillänsä, hellittämättä
vainunnut häntä.

Mutta kuka?

Äkkiä hänen päähänsä välähti mielijohde, hän muljautti verestäviä


silmiänsä Saint Hubertiin päin, purskahti mielipuolisesti nauramaan
ja syöksyi eteenpäin.
Sheikki hypähti häntä estämään. Mutta vahdit olivat jo hänen
ympärillänsä, kiskoen hänet takaisin ja rimpuilevien miesten keskeltä
kajahti hänen äänensä hurjasti, riemuisasti.

»Totta on, että tapoin hänet, hupakon — mutta kysyykö herrani,


miksi sen tein? Voitonhimosta, niinkö luulet? Kautta Allahin, hän oli
yhtä köyhä kuin minäkin. Mutta hänellä oli yksi, jota kaipasin, yksi,
jota ikävöin omakseni, kunnes haluni polttava liekki pakotti minut
surmantyöhön voidakseni ottaa sen, mitä sieluni janosi. Rakastitko
sinäkin sitä naista, oi roumi? Senkö tähden, että häntä rakastit, olet
vainonnut minua kuolemaani saakka? Tiedä sitten, että minä —
minäkin — otin hänet huvikseni ja tein hänet omakseni. Kolme
vuotta, oi roumi, pitelivät nämä käsivarret häntä; kolme vuotta nämä
minun silmäni katselivat hänen ihmeellistä kauneuttansa. Hän oli
minun orjani, minun omani, minun — kunnes tapoin hänet, koska
hänen kylmyytensä oli muuttanut rakkauteni vihaksi. Kerronko
sinulle, miten hän sai maksaa sen kylmyytensä ennen
kuolemaansa? Kerronko sinulle, mitä tein, ennenkuin surmasin…»

Sheikin nyrkki tärähti hänen julkealle, irvistelevälle suullensa,


iskien sen äänettömäksi.

»Se riittää, että hän kuoli, sinä katala peto», jyräytti hän. »Entä
hänen lapsensa?»

Maurilainen huojui, ja hänen intohimon vääntämät kasvonsa


nytkähtelivät kamalasti.

»Lapsen pidin itselläni», vastasi hän käheästi, »jotta muistaisin


vihani, jotta hänkin muistaisi, ettei se äiti, joka oli hänet synnyttänyt,
synnyttänyt minulle lasta — muutoin olisin saattanut säästää häntä.»
Kiihtyneesti tuijottaen häneen sheikki lausui viimeisen
kysymyksensä.

»Onko hän se tyttö — Jasmin?»

Ja vastaus, joka merkitsi niin paljon, tuli maurilaiselta kerkeästi.

»Kyllä, se tyttö, jota nimitetään Jasminiksi.» Hänen rikkinäiset


huulensa kaartuivat pahanilkisesti. »Jasmin, ylpeän ranskalaisen
sidin tytär. Jasmin, jonka herrani poika suvaitsi ryöstää
leikkilelukseen. Vieläkö hän haluaa tyttöä, luuletko, kun saksalainen
on saanut hänestä kyllikseen?»

Pilkallinen ääni koveni äkkiä kiljunnaksi, ja toisen hurjan,


mielipuolisen naurunpurskahduksen kajahtaessa maurilainen kaatui
kiemurrellen ja vääntelehtien vartijoittensa käsiin veren vuotaessa
nenästänsä ja suustansa.

Ja kauan sen jälkeen kun hänet oli kannettu pois, tunkeutuivat


hänen raivoisat huutonsa hiljaiseen huoneeseen, jossa Ahmed oli
polvillansa leposohvan vieressä, koettaen hellästi kuin nainen
lohduttaa kuolevaa, joka virui kasvot pieluksiin kätkettyinä, vapisten
hänet tyyten murtaneen kauhun vallassa. »Hyvä Jumala, hyvä
Jumala, mitä hänen on täytynyt kärsiä!» valitti hän. »Oi, jospa olisin
hänet löytänyt, säästänyt häneltä edes osan siitä tuskasta! Kolme
vuotta, Ahmed — ajattelehan sitä! Oliko se minun syyni, olisinko
voinut tehdä enemmän? Jumala tietää, että minä etsin. Jumala
tietää, että yritin parhaani…»

Sheikki ehätti jupisemaan vastalauseen ja tarttui sairaan


tutisevaan käteen, joka voimattomasti repi peitettä. »Raoul, Raoul»,
huudahti hän rukoilevasti, »minun tähteni, meidän kaikkien tähden
ajattele vähän itseäsi, sitä pyydän sinulta. Hänen puolestansa kiitä
Jumalaa siitä, että sitä kesti ainoastaan kolme vuotta! Aika olisi
saattanut olla pitempi. Unohda se, mon ami! Mitä hyötyä olisi
muistelemisesta? Se oli hänen kohtalonsa, ihmis-paran — ja mitäpä
me mahtaisimme kohtalolle? Eikä sinun tarvitse mistään moittia
itseäsi. Sinä teit voitavasi; kukaan ei olisi saattanut tehdä sen
enempää. Maurilainen peitti jälkensä liian taitavasti, se ovela pahus.
Hänen täytyi silloin olla hullu, hullu hän on varmasti nytkin — enkä
voi ampua hullua, niin kiihkeästi kuin haluaisinkin.»

Syntyi hiljaisuus, ja vähitellen suonenvedontapaisen puistatuksen


toistuvat puuskat harvenivat, kunnes Saint Hubert vihdoin lepäsi
hiljaa.

Ja aamusarastuksen kylmä, harmaa valo oli alkanut hiipiä


huoneeseen, ennenkuin hän puhkesi uudelleen puhumaan.
Tuskallisesti liikahtaen hän käänsi päätänsä pieluksella ja tuijotti
puoleensa kallistuneihin väsyneihin kasvoihin.

»Tyttö, Ahmed», supatti hän heikosti, »kun Poju tuo hänet


takaisin…» Hänen kysyvässä katseessansa oli rukoileva ilme, ja
äkkiä sheikin silmät sumentuivat kyynelistä.

»Mon ami, tarvitseeko sinun kysyä?» virkkoi hän epävarmasti.


»Me, Diana ja minä, huolehdimme tytöstä, jos Poju tuo hänet
takaisin.»

Hieman hymyillen väsyneesti Saint Hubert sulki silmänsä. »Hän


tuo — tiedän sen», mutisi hän unisesti. »Heidän saavuttuansa salli
minun nähdä heidät — ja Caryll. Mutta jos poistun — sitä ennen —
kerro heille lämmin tervehdykseni, Ahmed, ja Caryllin itsensä tähden
— kerro hänelle — mitä hänen pitäisi — tietää.» Syntyi lyhyt
äänettömyys; sitten hänen kätensä ojentui hapuilevasti, ja hänen
äänensä oli hitaampi ja unisempi: »Neljäkymmentä vuotta, Ahmed,
eikä koskaan — ole sattunut — mitään ikävää — välillämme. Se on
pitkä aika — pitkä aika — mon vieux Ahmed…»

*****

Caryll ei eläissänsä unohtanut sen yön hurjaa ratsastusta. Kun


tiedettiin, ettei valoisaa aikaa enää olisi jälellä kuin tunti tai pari, oli
lähdetty vinhasti kuin myrskytuuli. Ja vaikka hän olikin mainio
ratsastaja, oli hänen vähän aikaa pakko keskittää koko huomionsa
virmaan ratsuunsa, jonka kuntoa hän nyt ensi kerran sai täysin
määrin koetella.

Hän oli poikavuosiltansa alkaen ratsastellut metsästysretkillä


koirien jälessä, ollut mukana monilla voimiakysyvillä
murtomaaretkillä, mutta milloinkaan hän ei ollut nähnyt tällaista
pyörremyrskyä muistuttavaa kiitämistä — kiitämistä hengen edestä,
mielessä julma, hirveä tarkoitus. Ilman elvyttävää, tulistuttava
suhina, takaa kuuluva nelistäväin hevosten kavioiden töminä ja
lähellä olevan taistelun ajattelu herättivät hänessä voimakkaamman
kiihtymyksen kuin hän koskaan ennen oli tuntenut.

Englanti ja hänen siellä viettämänsä rauhallinen, proosallinen


elämä tuntuivat hänestä tänä iltana hyvin etäisiltä. Ja sielullinen
myllerrys, joka oli järkyttänyt hänen tyyntä ja järjestyksellistä
mieltänsä perustuksia myöten, oudot näyt ja maisemat, jotka olivat
saattaneet hänet kosketuksiin hänen omasta hyvin järjestetystä
elämästään suuresti eroavien olojen kanssa, saivat sopivan
huippukohdan tästä huimasta ratsastuksesta, joka pani hänen
sydämensä jyskyttämään ja koko hänen ruumiinsa värähtelemään
rajusta, kiihkeästä nautinnosta.
Vain muutamia minuutteja sitten hän oli joutunut läheltä näkemään
murhaa ja äkillistä kuolemaa, nähnyt parhaan ystävänsä
kuolemaisillaan keskellä tunnottoman teurastuksen ja väkivallan
näyttämöä. Koko hänen entinen minuutensa oli kadonnut ikäänkuin
yhdellä pyyhkäisyllä, ja hän oli antautunut perittyjen vaistojen ja
menneiden tunteiden johdettavaksi, joiden olemassaolosta hänellä ei
ollut siihen saakka ollut aavistustakaan. Sovinnaisuus oli mennyt
tuulen vietäväksi, hän ei tänä iltana enää ollut vihamielinen ja
ennakkoluuloinen, vaan ainoastaan isänsä poika, jonka mieli ja
pyrkimys olivat samat kuin näiden jurojen, päättäväisten kostajien
huiman joukkueen. Ja äkkiä hän tunsi koko päivän lähestyneensä
tätä myötätunnon ja sukulaisuuden tunnetta, tätä tähän saakka
vieromainsa sukulaisuussuhteiden omaksumista. Tämä päivä oli
ollut kokonaan toisenlainen kuin hän oli otaksunut, ja Ras-Djebeliin
tehdystä retkestä oli koitunut seurauksia, joita hän ei ollut odottanut.

Harmissaan isänsä käskevästä sanomasta, joka Gastonin


hienotunteisesta ja kohteliaasta esiintymisestä huolimatta oli
kuitenkin tuntunut hyvin jyrkältä, ehdottomalta määräykseltä, hän oli
lähtenyt, tuskin salaten vastahakoisuuttaan ja näöltänsä kovin
synkkänä ja suuttuneena, mikä ei juuri näyttänyt sovinnolliselta.

Mutta hilliten omaa harmiansa oli sheikki päättävästi koettanut


voittaa poikansa luottamuksen, esiintynyt harvinaisen taipuvaisesti,
puhunut myötätuntoisesti niistä asioista, joiden tähden Caryll oli tullut
Englannista, ja vähitellen saanut Caryllin syventymään keskusteluun,
joka oli suuresti edistänyt heidän väliensä keskinäisen
ymmärtämyksen pohjan syntymistä. Paljoa ennen kuin he saapuivat
Ras-Djebeliin oli Caryll itsekin alkanut puhella, ja kun jää kerran oli
murtunut, oli jatkaminen ollut hänestä omituisen helppoa. Arkailu oli
karissut hänestä, kun hän intomielisesti kävi käsiksi asiaan, jonka
hän tunsi pienimpiä yksityiskohtia myöten, ja unohtipa hän senkin,
kuka hänen kuulijansa oli, kaunopuheisesti haastellessaan koroista
ja vuokrista, torpista ja tiloista, tukkimetsistä ja metsästyspuistoista,
kantakirjaeläimistä ja parannetuista maanviljelystavoista.

Oli huojentavaa saada vihdoinkin puhua niistä; huojentavaa oli,


että häntä kuunneltiin, jos kohta ei vilpittömän, niin ainakin
teeskennellyn tarkkaavasti. Eikä hänen Ras-Djebelissä suinkaan
tarvinnut teeskennellä mielenkiintoa. Se oli suurin hänen siihen
saakka näkemänsä keidas, sheikin hevoshoidon tärkeimpiä
keskuksia, ja siellä vietetyt tunnit olivat kuluneet nopeasti ja
hauskasti, eikä niiden aikana ollut sattunut mitään harmillista
kohtausta pilaamaan hänen nautintoansa. Vaikka hän olikin
arvosteleva, ei hän ollut huomannut mitään arvosteltavaa mainioissa
hevosissa, joista heimo oli kuuluisa, ja lausuttuansa aluksi verrattain
ujosti kehuvia sanoja hän oli pian tuonut julki vilpittömän ihailunsa.

Ja sen päivän kuluessa alkanut parempi ymmärtämys ei ollut


vähentynyt heidän ratsastaessansa kotiin.

Caiyllin mieli oli ollut rauhallisempi kuin se oli ollut hänen


lähdettyänsä Englannista, ja olipa hän alkanut heikosti huomata
pitävänsä arvossa ympäristöään, nähdä sellaista kauneutta, jollaista
hän ei koskaan ennen ollut nähnyt, ympärillään leviävissä kultaisissa
lakeuksissa, tuntea ja ihailla niiden omituista rauhaa ja
lumousvoimaa. Mutta heidän saavuttuansa leiriin hän oli saanut
kouraantuntuvan muistutuksen siitä, että vaaroja väijyi aavikon
hymyilevän tyyneyden takana, saanut eloisan näytteen sikäläisestä
vaihtelevasta elämästä, jota hän ei vielä käsittänyt. Ennenkuin he
ennättivät leiriin, olivat sieltä kantautuvat hurjan metelin äänet
kertoneet heille, että jotakin tavatonta oli tapahtunut, ja sheikki oli
kannustanut ratsunsa huimaan neliseen.

Ja heidän perille saavuttuansa oli leiri ollut kuohuksissa; laajalla,


tavallisesti niin rauhallisella aukeamalla oli parveillut tiheään
sulloutuneita ihmisiä, siellä oli vallinnut sekava hälinä ja liike,
puolittain satuloituja hevosia oli yleisen kiihtymyksen
vimmastuttamina syöksynyt kaikkiin suuntiin, samalla kun kirkuvia
naisia ja lapsia sysittiin sinne tänne heidän tungeksiessaan kiljuvien
ja viittoilevien soturien ympärillä, jotka järjestäytyivät Jusefin ja
kasvoiltansa tuhkanharmaan, melkein tuntemattomaksi muuttuneen
Pojun johdolla.

Tapahtumat olivat kehittyneet niin nopeasti, ettei Caryllille ollut


jäänyt ajattelemisen aikaa.

Hän oli nähnyt sheikin, jonka kasvot myöskin olivat kalmankalpeat,


hetkiseksi kumartuvan pyörtymäisillään olevan sanantuojan puoleen,
jolta Gaston koetti udella tietoja, oli konemaisesti ottanut ja sitonut
vyölleen panosvyön ja revolverin, jotka oudon kalpea, mutta hillityn
näköinen Williams oli työntänyt hänen käsiinsä, noussut levänneen
hevosen selkään, joka oli ilmestynyt hänen vierellensä kuin
loitsittuna, ja ennenkuin hän oikein tajusi, mitä oli tekeillä ja kuinka
vakava tilanne oli, hän oli huomannut laskettavansa täyttä laukkaa
etelää kohti ja ratsastavansa vinhemmin kuin milloinkaan ennen.

Vasta heidän saavuttuansa El-Hassiin hän täydelleen käsitti,


millaisessa vaarassa hänen äitinsä oli ollut ja millainen kohtalo oli
yllättänyt Jasminin. Ja se tyrmistyttävä tieto oli karistanut hänen
mielestänsä mieskohtaiset vaikuttimet, pakottanut hänet äkkiä oikein
ymmärtämään itseänsä — ja niinpä hän oli kyennyt tunnustamaan
oikeutetuiksi toisen vaatimukset, jotka olivat suuremmat kuin hänen
omansa, karkoittamaan sydämestänsä vihan ja kateuden ja
kohoamaan itsekkyyden yläpuolelle.

Hän oli kääntänyt lehden elämänsä historiassa esittäessään


vapaaehtoisen tarjouksen, joka oli lausuttu avoimesti ja vilpittömästi
ja yhtä avoimesti ja vilpittömästi hyväksytty.

Ja nyt ratsastaessaan veljensä vierellä, jota hän ei enää vihannut,


hän tunsi muutamien viime päivien aikaisen kummallisen
rauhattomuuden haihtuneen kuten painajaisen ja vihdoinkin
pystyvänsä ajattelemaan tyynesti, jos kohta ei ihan kiihkottomasti
sitä lyhytaikaista hulluutta — sillä hänestä tuntui, ettei se saattanut
olla muuta kuin hulluutta — joka oli nostattanut hänessä sellaisia
intohimoja, että niiden pelkkä muisteleminenkin herätti nyt hänessä
kummastusta ja inhoa.

Eipä silti, että hän olisi lakannut rakastamasta. Hän rakasti tyttöä
vieläkin ja tiesi, että saattoi kulua kauan, ennenkuin hänen
ensimmäisen rakkautensa muisto haalistuisi. Mutta halun raju liekki
oli palanut sammuksiin nopeasti, kuten se oli leimahtanutkin, ja
jälelle jäänyt rakkaus oli samaa säälivää hellyyttä, jota hän oli
aikaisemmin tyttöä kohtaan tuntenut.

Hän mietti sitä ihmetellen.

Oliko hänen luonteessansa joku vajavaisuus? Eikö hän ehkä


osannut kiintyä syvästi ja pysyvästi? Vähemmän kuin milloinkaan
ennen hän nyt uskoi tuntevansa itseään. Mutta yhdestä seikasta hän
oli varma.

Katsahtaessaan vierellään oleviin riutuneisiin, nuorekkaihin


kasvoihin hän oivalsi, ettei hänelle rakkaus ollut koskaan merkinnyt
eikä ikinä merkitsisi samaa kuin tälle kiihkeäluontoiselle,
myrskymieliselle veljelle.

Ja kun tytön kohtalo vihloi hänen sydäntänsä kuin puukonpisto,


niin miltä täytyi tuntua tuosta miehestä! Olihan veli ollut tyttöä
Iikempänä kuin hän itse konsanaan, pidellyt sylissänsä tuota hentoa,
suloista olentoa, joka tällä hetkellä saattoi olla poissa hänen ja
kaikkien muidenkin halun ulottuvilta.

Hänen ajatuksensa lensivät eteenpäin, ja hänen mieleensä


tunkeutui hirvittäviä aavistuksia. Mitä he löytäisivät, kun tämä synkkä
riento päättyisi — ja kuinka kauan sitä vielä kestäisi?

Hevosten kiitäminen alkoi hänestä äkkiä tuntua matelemiselta, hän


menetti tuokioksi malttinsa ja painoi terävät kannuksensa ratsunsa
kylkiin. Mutta sitä seurannut huima hypähdys, joka oli vähällä singota
hänet satulasta, katkaisi hänen mietteensä jyrkästi ja pakotti hänet
uudelleen keskittämään huomionsa vimmastuneeseen eläimeen,
joka ponnisti voimiansa närkästyneenä tarpeettomasta kiihotuksesta.

Äkeissänsä ja häpeissänsä järjettömästä julmuuden osoituksesta,


joka oli kokonaan vastoin hänen luontoansa, Caryll alkoi tyynnytellä
kavahtelevaa orittaan ja koetti pitää omia ajatuksiansa aisoissa.

Aaltomaiset hiekkaharjut olivat muuttuneet melkein tasaiseksi


maaksi, ja sileänä ja rajattomana, katkeamattoman yksitoikkoisena
aavikko levisi heidän edessään heidän kiitäessänsä edelleen.
Ainoastaan korvissa vinkuva tuuli, nelistävien hevosten kavioiden
pehmeä töminä ja silloin tällöin kuuluva varuksien kilahdus häiritsivät
syvää hiljaisuutta.

Kaksi tuntia he ratsastivat hidastamatta vauhtiansa.


Valon vähitellen häipyessä ja pimeän saartaessa heidät vauhti
sitten vähitellen tasaantui ja kävi yhä verkkaisemmaksi, kunnes
edellä ratsastava vainuaja vihdoin nosti kättänsä, seisautti ratsunsa
ja murahtaen solahti satulasta maahan.

Caryllin valtasi lamaannus, kun hän vilkaisi tummenevalle


taivaalle, jossa tuikki vain muutamia kalpeita tähtiä, ja hänen
sydämensä muuttui alakuloiseksi, kun hän ajatteli, että kuluisi vielä
tuntikausia, ennenkuin kuu nousisi.

Mutta se ajatus ehti tuskin kiteytyä, kun lyhyt pysähdys jo päättyi.


Pitäen sytytettyä lyhtyä lähellä maata lähti vainuaja jälleen taipaleelle
jalkaisin, rientäen eteenpäin nopeata hölkkäjuoksua väsymättä,
näennäisesti ponnistelematta.

Yhä eteenpäin, kunnes heidät verhosi täydellinen pimeys, kunnes


Caryll pikemminkin aavisti kuin näki vierellänsä ratsastavan
varjomaisen olennon ääriviivat.

Miesten rivit olivat menneet jonkun verran sekaisin, ja kerran


törmäsi hevonen hänen ratsuansa vasten. Kääntäessänsä potkivaa
orittansa irti toisesta kuuli hän pimeästä jupistut sanat: »Suokaa
anteeksi, mylord!» Ne panivat hänet äkkiä aprikoimaan, mitähän
Williams — joka ei ollut suostunut jäämään leiriin — mietti ja oliko
hänen nuorekas innostuksensa saanut vihdoin kylliksensä
»todellisesta elämästä», kun se nyt pukeutui sellaiseen muotoon,
josta hän ei ollut uneksinutkaan.

Ja Williamsin ajatteleminen toi muassaan kiusallisia mietteitä.


Oliko hän tehnyt oikein myöntyessään, kun kamaripalvelija oli
melkein vesissä silmin pyrkinyt mukaan tälle retkelle, joka kenties
saattoi päättyä tuhoisasti heille kaikille. Sellaista mahdollisuutta ei
oltu etukäteen otettu huomioon, eikä sitä olisi millään tavoin voitu
pitää miehen palvelustehtäviin kuuluvana. Jos hän, Caryll, saisi
surmansa, olisi se yksinomaan hänen mieskohtainen asiansa —
mutta Williamsilla oli leskiäiti, joka oli hänestä riippuvainen. Mutta jos
pahin mahdollisuus toteutuisi, olisi äidillä turvanaan tilan
eläkerahasto — eikä Williamsia uhannut sen pahempi vaara kuin
heitä muitakaan. Koska hän itse tahtoi tulla mukaan, oli hänen
antauduttava sille alttiiksi, kuten toisetkin antautuivat, ja elettävä tai
kuoltava, miten kohtalo säätäisi.

Kohtalo? Hyvä Jumala! Caryllin huulet kaareutuivat äänettömään


ihmettelyn vihellykseen.

Olipa hän joutunut pitkälle, mietti hän, jos hän saattoi järkeillä
kohtalosta yhtä rauhallisesti kuin kuka syntyperäinen arabialainen
hyvänsä! Arabialainen — ei. Mutta olihan sittenkin tämä maa hänen
synnyinmaansa, ja tänä iltana hän oli ensi kerran kuullut sen maan
kutsun. Tänä iltana hän ensi kerran tunsi sen oudon kauneuden
hienon lumousvoiman kiehtovan aistejansa. Enää hänen ei
kannattanut inttää sitä vastaan. Se kiehtoi, se lumosi. Ja äkkiä hän
taukosi rimpuilemasta vastaan. Perityt vaistot olivat vihdoin
heränneet ja murtaneet hänen koko vastustusvoimansa. Aavikko oli
vaatinut hänet omaksensa. Ja tyytyväisesti alistuen hän salli
aatoksiensa ajelehtia, antautuen ihailemaan itämaista taikayötä ja
uutta elämänlatua, joka hänelle avautui.

Irtautuneena hetken vaatimuksista hän oli melkein unohtanut Saint


Hubertin ja keskiöisen ratsastusmatkan synkän tarkoituksen, kun
hevosten äkillinen pysähtyminen jyrkästi palautti hänet nykyisyyteen.
Hän katsahti ympärillensä hieman ymmällä.
Aika oli kulunut hänen huomaamattansa, eikä hän ollut pannut
merkille kuun nousua, mutta sen pehmeässä valossa hän nyt näki
Pojun seisovan puhelemassa vainuajan kanssa ja kaikkialla
ympärillänsä miesten laskeutuvan ratsailta ja hellittävän
korkeanuppisten satuloittensa vöitä.

Solahdettuansa maahan hän kietoi Williamsin ojentaman vaipan


yllensä ja polki maata verryttääksensä puutuneita jalkojaan.

»Onko teillä aavistustakaan ajasta?» kysäisi hän


kamaripalvelijalta, joka yhäti hyöri lähistöllä, arvostelevasti silmäillen
isäntänsä ratsua hierovaa arabialaista.

Williams raapaisi tulta ja vilkaisi rannekelloansa »Kaksi minuuttia


vaille kaksitoista, mylord», vastasi hän ja veti puhuessansa tyynesti
kellonsa. Sitten hän naurahti omituisen kiihtyneesti. »Totisesti nämä
miehet osaavat ratsastaa, mylord. Luulin hieman tuntevani
ratsastusta itsekin, mutta en ikänäni ole kiitänyt niin kauheata
vauhtia — kuin ennen pimeän tuloa. Ihmettelin, milloin he antaisivat
hevosten hengähtää. Teidän ylhäisyytenne vaipan taskussa on
pullo», lisäsi hän perin epäjohdonmukaisesti.

Lausuttuansa rauhallisesti: »Kiitos, Williams; te ajattelette


kaikkea», mitkä sanat nostattivat mielihyvän punan miehen kasvoille,
Caryll lähti veljensä luokse.

Taempana istuivat miehet ryhmissä, pakisten hiljaa keskenänsä tai


loikoen pitkänänsä ja vihdoinkin täysin siemauksin nauttien heille
suodusta levosta. Ja sivuuttaessansa vainuajan Caryll näki hänen
burnusiinsa kietoutuneena jo nukkuvan sikeästi. Mutta Poju ei
suinkaan ollut lepäävän miehen asennossa, hän seisoi syrjässä
muista, tuijottaen kuutamoisen aavikon ylitse pohjoista kohti
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like