Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| research:software:obsec [2017/04/25 19:51] – racruz | research:software:obsec [2017/05/18 03:54] (current) – racruz | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| ObSec is a simple object-oriented language that supports type-based declassification. ObSec was introduced in the paper | ObSec is a simple object-oriented language that supports type-based declassification. ObSec was introduced in the paper | ||
| - | {{bib> | + | {{bib> |
| This tutorial covers: | This tutorial covers: | ||
| - | * how to install a web interpreter (ObSec Pad) for the ObSec language | + | * how to install a web interpreter (ObSec Pad) for the ObSec language. |
| - | * a basic presentation of the language syntax | + | * a basic presentation of the language syntax, |
| - | * the type-based declassification examples that appears | + | * the type-based declassification examples that appear |
| Line 15: | Line 15: | ||
| - **Using the online ObSec Pad** at [[https:// | - **Using the online ObSec Pad** at [[https:// | ||
| - | - **With the virtual machine**, which can be downloaded [[https:// | + | - **With the virtual machine**, which can be downloaded [[https:// |
| - **Local execution of the ObSec Pad**, which can be downloaded [[https:// | - **Local execution of the ObSec Pad**, which can be downloaded [[https:// | ||
| Line 55: | Line 55: | ||
| </ | </ | ||
| - | ===== ObSec Pad: Funtionality===== | + | ===== ObSec Pad: Functionality===== |
| The following screenshot shows how the ObSec Pad looks like | The following screenshot shows how the ObSec Pad looks like | ||
| Line 65: | Line 65: | ||
| * Details of the language syntax. | * Details of the language syntax. | ||
| * Type checking. It gives you the type of the program or an error if the program is not well-typed or if it has a syntax error. | * Type checking. It gives you the type of the program or an error if the program is not well-typed or if it has a syntax error. | ||
| - | * Execution. If the program was well-typed (because | + | * Execution. If the program was well-typed (as the result |
| Line 101: | Line 101: | ||
| {{: | {{: | ||
| - | You can define and use object types in different ways. Below, we illustrate by creating an object type with a login method that takes two public strings and returns a public integer: | + | You can define and use object types in different ways. Below, we illustrate |
| * Inline structural type definition: the type is defined (anonymously) where it is used < | * Inline structural type definition: the type is defined (anonymously) where it is used < | ||
| [{login: String String -> Int}] | [{login: String String -> Int}] | ||
| Line 309: | Line 309: | ||
| Any method invocation over the '' | Any method invocation over the '' | ||
| + | |||
| + | |||
| + | |||
| + | === Simple Case of Study: Web App with Payment System === | ||
| + | The following program illustrates a more elaborated example where different declassification policies are used in an application that processes user payments. | ||
| + | The application has 4 modules: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | The types '' | ||
| + | |||
| + | The implementation of the method '' | ||
| + | |||
| + | < | ||
| + | let{ | ||
| + | type StringHashEq = [{hash : -> Int<[{== : Int -> Bool}]}] | ||
| + | type CCPolicy = [{last4Digits: | ||
| + | | ||
| + | type CreditCard = [{number: -> String} | ||
| + | | ||
| + | | ||
| + | |||
| + | type UserPolicy = [{name: -> | ||
| + | | ||
| + | | ||
| + | type User = [{name: -> | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | |||
| + | | ||
| + | type Controller = [{payInternet: | ||
| + | type View = [{show : String -> String}] | ||
| + | type PaymentGateWay = [{pay: String CreditCard< | ||
| + | | ||
| + | type UserManager = [{verifyCredentials: | ||
| + | {getUserCreditCard: | ||
| + | | ||
| + | val paymentGateWay = new {pg: | ||
| + | def pay user cc service | ||
| + | } | ||
| + | val userManager = let{ | ||
| + | type Backend = [{findUser: String -> User< | ||
| + | val backend = new {b:Backend => | ||
| + | def findUser login = | ||
| + | new {u:User => | ||
| + | def name = login | ||
| + | def password = " | ||
| + | def creditCard = | ||
| + | new {cc : CreditCard => | ||
| + | def number = " | ||
| + | def securityNumber = " | ||
| + | def last4Digits = " | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | } in | ||
| + | new {z: | ||
| + | def verifyCredentials login password = | ||
| + | let{ | ||
| + | val dbUser = backend.findUser(login) | ||
| + | } | ||
| + | in | ||
| + | if dbUser.password().hash().==(password.hash()) | ||
| + | then true | ||
| + | else false | ||
| + | | ||
| + | def getUserCreditCard login = backend.findUser(login).creditCard() | ||
| + | } | ||
| + | | ||
| + | val view = new {v:View => | ||
| + | def show s = s | ||
| + | } | ||
| + | val controller = new {z : Controller => | ||
| + | def payInternet loginFromWeb | ||
| + | if userManager.verifyCredentials(loginFromWeb, | ||
| + | then | ||
| + | let{ | ||
| + | val cc = userManager.getUserCreditCard(loginFromWeb) | ||
| + | } | ||
| + | in | ||
| + | if paymentGateWay.pay(loginFromWeb, | ||
| + | then | ||
| + | view.show(cc.last4Digits()) | ||
| + | else | ||
| + | view.show(" | ||
| + | else | ||
| + | view.show(" | ||
| + | } | ||
| + | } | ||
| + | in | ||
| + | controller.payInternet(" | ||
| + | </ | ||
| + | |||
| + | Variations to the above program that do not respect the policies and hence are not well-typed: | ||
| + | * change the expression '' | ||
| + | * remove the method '' | ||
| + | * change the signature of the method '' | ||

