23.11.2013 Views

Obfuscation of Abstract Data-Types - Rowan

Obfuscation of Abstract Data-Types - Rowan

Obfuscation of Abstract Data-Types - Rowan

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CHAPTER 3. TECHNIQUES FOR OBFUSCATION 49<br />

So, for obfuscation we require an abstraction function af with type<br />

af :: O → D<br />

and a data-type invariant dti such that for elements x :: D and y :: O<br />

x ❀ y ⇔ x = af (y) ∧ dti(y) (3.1)<br />

The term x ❀ y is read as “x is data refined by y” (or in our case, “. . .is<br />

obfuscated by. . . ”) which expresses how data-types are related.<br />

For obfuscation the abstraction function acts as a “deobfuscation” and therefore<br />

it is important to keep this function secret from an attacker. In our situation,<br />

it turns out that af is a surjective function so that if we have an obfuscation<br />

function <strong>of</strong><br />

<strong>of</strong> :: D → O<br />

that satisfies<br />

then<br />

<strong>of</strong> (x) = y ⇒ x ❀ y<br />

af · <strong>of</strong> = id (3.2)<br />

Thus, <strong>of</strong> is a right-inverse for af . Note that it is not necessarily the case that<br />

<strong>of</strong> · af = id (3.3)<br />

since we could have another obfuscation function <strong>of</strong> ′ such that <strong>of</strong> ′ (x) = y ′ and<br />

x ❀ y ′ and so we have that<br />

<strong>of</strong> (af (y ′ )) = <strong>of</strong> (x) = y<br />

The abstraction function will have a left-inverse only if it is injective. In that<br />

case, each object <strong>of</strong> D will be refined by exactly one <strong>of</strong> O and we will call the<br />

inverse (which is both left and right) <strong>of</strong> af the conversion function (cf ) for the<br />

obfuscation.<br />

3.2.1 Homogeneous operations<br />

Suppose that the operation f with type<br />

f :: D → D<br />

is defined in D. Then to obfuscate f we want a operation f O with type<br />

f O :: O → O<br />

which preserves the correctness <strong>of</strong> f . In terms <strong>of</strong> data refinement, we say that<br />

f O is correct if it is satisfies:<br />

(∀x :: D;y :: O) • x ❀ y ⇒ f (x) ❀ f O (y) (3.4)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!