SHADebit Class Reference

Inherits com::dalsemi::onewire::application::sha::SHATransaction.

List of all members.


Detailed Description

This class implements an account debit application for SHA Transactions. Account data is stored on user iButtons after being digitally signed by a coprocessor iButton. Account data consists of the following:

A typical use case for this class might be as follows:

   OneWireContainer18 coprOWC18 = new OneWireContainer18(adapter,address);

   //COPR.0 is the filename for coprocessor service data
   SHAiButtonCopr copr = new SHAiButtonCopr(coprOWC18,"COPR.0");

   //Initial amount for new users is $100, and debit amount is 50 cents
   SHATransaction trans = new SHADebit(copr, 10000, 50);

   OneWireContainer18 owc18 = new OneWireContainer18(adapter, userAddress);

   //The following constructor erases all transaction data from the user and
   //installs the system authentication secret on the user iButton.
   SHAiButtonUser user = new SHAiButtonUser18(copr, owc18, true, authSecret);

   //creates account data on iButton
   if(trans.setupTransactionData(user))
      System.out.println("Account data installed successfully");
   else
      System.out.println("Account data installation failed");

   //... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

   //"challenges" user iButton
   if(trans.verifyUser(user))
   {
      System.out.println("User Verified Successfully");

      //checks data signature and account balance>0
      if(trans.verifyTransactionData(user))
      {
         System.out.println("Account Data Verified Successfully");

         //debits and writes new data to user iButton
         if(trans.executeTransaction(user))
         {
            System.out.println("Account debited.");
            System.out.println("New Balance: " +
               trans.getParameter(SHADebit.USER_BALANCE));
         }
      }
   }

   //... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

   if(trans.getLastError()!=0)
   {
      System.err.println("Error code: " + trans.getLastError());
   }
 

This class makes use of several performance enhancements for TINI. For instance, most methods are synchronized to access instance variable byte arrays rather than creating new byte arrays every time a transaction is performed. This could hurt performance in multi-threaded applications, but the usefulness of having several threads contending to talk to a single iButton is questionable since the methods in com.dalsemi.onewire.adapter.DSPortAdapter beginExclusive(boolean) and endExclusive() should be used.

See also:
SHATransaction

SHAiButtonCopr

SHAiButtonUser

Version:
1.00
Author:
SKH

Public Member Functions

 SHADebit (SHAiButtonCopr copr)
 SHADebit constructor.
 SHADebit (SHAiButtonCopr copr, int initialAmount, int debitAmount)
 SHADebit constructor.
boolean setupTransactionData (SHAiButtonUser user) throws OneWireException, OneWireIOException
synchronized boolean verifyUser (SHAiButtonUser user) throws OneWireException, OneWireIOException
synchronized boolean verifyTransactionData (SHAiButtonUser user) throws OneWireException, OneWireIOException
synchronized boolean executeTransaction (SHAiButtonUser user, boolean verifySuccess) throws OneWireException, OneWireIOException
synchronized int getParameter (int type)
synchronized boolean setParameter (int type, int param)
synchronized void resetParameters ()

Static Public Attributes

static final int DEBIT_AMOUNT = 0
 Update the amount this transaction will debit.
static final int INITIAL_AMOUNT = 1
 Update the amount for initial account balance.
static final int USER_BALANCE = 2
 Retrieve the amount for user's current balance.
static final int I_FILE_LENGTH = 0
 indices for fields in user account file

Protected Member Functions

 SHADebit ()
 User apps should never call this.

Constructor & Destructor Documentation

SHADebit ( SHAiButtonCopr  copr  ) 

SHADebit constructor.

copr is the SHAiButtonCopr that is used to perform this transaction. After saving a reference to the SHA coprocessor, this constructor resets all parameters for this type of transaction to their default values.

Parameters:
copr The coprocessor used for authentication and data signing in this transaction.

SHADebit ( SHAiButtonCopr  copr,
int  initialAmount,
int  debitAmount 
)

SHADebit constructor.

copr is the SHAiButtonCopr that is used to perform this transaction. After saving a reference to the SHA coprocessor, this constructor resets all parameters for this type of transaction to their default values.

Parameters:
copr The coprocessor used for authentication and data signing in this transaction.


Member Function Documentation

boolean setupTransactionData ( SHAiButtonUser  user  )  throws OneWireException, OneWireIOException [virtual]

Setup account data on a fresh user iButton. Prior to calling setup transaction data, the authentication secret for the iButton should already be setup and a directory entry (as well as at least an empty placeholder file) should exist for the account data. If you constructed the SHAiButtonUser using SHAiButtonUser(SHAiButtonCopr,OneWireContainer18,boolean,byte[]) the secret has been setup for you and you should know call this function. If you try to install the authentication secret after creating the account data, you will destroy all account data on the iButton.

You can set the value of the intial account balance by calling transaction.setParameter(SHADebit.INITIAL_AMOUNT,10000) where the value of the units is in cents (i.e. 10000 = $100).

Flow of action:

  • Generate generic account page
  • Insert the initial balance into account data
  • Create a signature using coprocessor
  • Insert the digital signature
  • Write account data page to iButton

Parameters:
user SHAiButtonUser upon which the transaction occurs.
Returns:
trueif and only if the signature is successfully created by the coprocessor AND the data is successfully written to the user iButton.
See also:
SHAiButtonCopr.createDataSignature(byte[],byte[],byte[],int)

SHAiButtonUser.writeAccountData(byte[],int)

getLastError()

Implements SHATransaction.

synchronized boolean verifyUser ( SHAiButtonUser  user  )  throws OneWireException, OneWireIOException [virtual]

Verifies user's authentication response. User is "authenticated" if and only if the digital signature generated the user iButton matches the digital signature generated by the coprocessor after the user's unique secret has been recreated on the coprocessor.

Flow of action:

  • Generate 3-byte "challenge" on coprocessor
  • Write challenge to scratchpad of user
  • Read account data page with signature
  • Attempt to match user's signature with the coprocessor

Parameters:
user SHAiButtonUser upon which the transaction occurs.
See also:
SHAiButtonCopr.generateChallenge(int,byte[],int)

SHAiButtonCopr.verifyAuthentication(byte[],byte[],byte[],byte[],byte)

SHAiButtonUser.readAccountData(byte[],int,byte[],int,byte[],int)

getLastError()

Implements SHATransaction.

synchronized boolean verifyTransactionData ( SHAiButtonUser  user  )  throws OneWireException, OneWireIOException [virtual]

Verifies user's account data. Account data is "verified" if and only if the account balance is greater than zero and the digital signature matches the signature recreated by the coprocessor.

Flow of action:

  • Read the account data from user
  • Extract account balance
  • Debit money from balance
  • Insert the new balance
  • Reset the digital signature
  • Use coprocessor to sign account data
  • Insert the new digital signature
  • Write the account data to the user

If previous steps have been executed, all "Read" commands on the user are reading from cached data.

Parameters:
user SHAiButtonUser upon which the transaction occurs.
Returns:
true if and only if the account balance is greater than zero and digital signature matches the signature recreated by the coprocessor.
See also:
SHAiButtonUser.readAccountData(byte[],int)

SHAiButtonCopr.verifySignature(byte[],byte[],byte[])

getLastError()

Implements SHATransaction.

synchronized boolean executeTransaction ( SHAiButtonUser  user,
boolean  verifySuccess 
) throws OneWireException, OneWireIOException [virtual]

Performs the signed debit, subtracting the debit amount from the user's balance and storing the new, signed account data on the user's iButton. The debit amount can be set using transaction.setParameter(SHADebit.DEBIT_AMOUNT, 50), where the value is in units of cents (i.e. for 1 dollar, use 100).

Flow of action:

  • Read the account data from user
  • Extract account balance
  • Assert balance greater than debit amount
  • Debit money from balance
  • Insert the new balance
  • Reset the digital signature
  • Use coprocessor to sign account data
  • Insert the new digital signature
  • Write the account data to the user

If previous steps have been executed, all "Read" commands on the user are reading from cached data.

Parameters:
user SHAiButtonUser upon which the transaction occurs.
Returns:
true if and only if the user has enough in the account balance to perform the requested debit AND a new digital signature is successfully created AND the account data has been written to the button.
See also:
SHAiButtonUser.readAccountData(byte[],int)

SHAiButtonUser.writeAccountData(byte[],int)

SHAiButtonCopr.createDataSignature(byte[],byte[],byte[],int)

getLastError()

Implements SHATransaction.

synchronized int getParameter ( int  type  )  [virtual]

Retrieves the value of a particular parameter for this debit transaction.

Valid Parameters

Note that the value of SHADebit.USER_BALANCE will be set after calling verifyTransactionData(SHAiButtonUser) and after calling executeTransaction(SHAiButtonUser).

Returns:
The value of the requested parameter.
Exceptions:
IllegalArgumentException if an invalid parameter type is requested.

Implements SHATransaction.

synchronized boolean setParameter ( int  type,
int  param 
) [virtual]

Sets the value of a particular parameter for this debit transaction.

Valid Parameters

Parameters:
type Specifies the parameter type (SHADebit.DEBIT_AMOUNT or SHADebit.INITIAL_AMOUNT)
Returns:
true if a valid parameter type was specified and the value of the parameter is positive.
Exceptions:
IllegalArgumentException if an invalid parameter type is requested.

Implements SHATransaction.

synchronized void resetParameters (  )  [virtual]

Resets all transaction parameters to default values

Implements SHATransaction.


The documentation for this class was generated from the following file:

Generated on Thu Aug 28 15:42:31 2008 for 1-Wire API for .NET by  doxygen 1.5.6