ds.ov2.bignat
Class Vector

java.lang.Object
  extended by ds.ov2.util.Serializable_array
      extended by ds.ov2.bignat.Bignat_array
          extended by ds.ov2.bignat.Vector
All Implemented Interfaces:
APDU_Serializable

public class Vector
extends Bignat_array
implements APDU_Serializable

Bignat array with multi-exponent functionality. This class defines two methods for computing multi-exponents. The first one is a navtive Java implementation, using simultaneous squaring. The second one uses an RSA_exponent and multiplies the results with montgomery multiplication. The compatibility between the two methods is limited, because different precomputations are required. The biggest difference is that for the simultaneous squaring method the bases must be montgomerized.

Inherits the functionality for providing the illusion of a different array length from Bignat_array.

This is a card data type. For the protocol layer, an object of this class is compatible with

see is_compatible_with.

For a number of general topics see also the package description.

CPP Preprocessing
This class uses the following cpp defines: PACKAGE, PUBLIC, SQUARED_RSA_MULT ASSERT, ASSERT_TAG(condition, tag), JAVACARD_APPLET, HOST_TESTFRAME, BIGNAT_USE_BYTE , DOUBLE_DIGIT_TYPE, OPT_SPECIAL_SQUARE, JAVADOC
Execution Environment:
host, card
Author:
Hendrik Tews
Version:
$Revision: 1.30 $
Last Commit:
$Date: 2010-02-16 10:26:06 $ by $Author: tews $

Field Summary
private  byte[] buf
          Temporary digit array of type DIGIT_TYPE used inside the exponent_mod method.
static PrintWriter out
          Debug and diagnostics output channel.
private  Bignat[] temp
          References of temporaries used inside exponent_mod and mont_rsa_exponent_mod.
 
Fields inherited from class ds.ov2.bignat.Bignat_array
length
 
Constructor Summary
Vector(short length, boolean init_buf)
          Non-allocating constructor.
Vector(short bignat_size, short length, boolean init_buf, boolean in_ram)
          Allocating constructor.
 
Method Summary
 void exponent_mod(Vector exponent, Modulus modulus, short base_factor_size, Vector base_factors, Bignat mont_one, Bignat result, Bignat temp_arg)
          Montgomerized modular multi-exponent.
 boolean is_compatible_with(Object o)
          Compatibility check for the OV-chip protocol layer.
 void mont_rsa_exponent_mod(Vector exponent, Modulus modulus, RSA_exponent_interface rsa_exponent, Bignat rsa_vector_correction, Bignat result, Bignat temp_1, Bignat temp_2)
          Modular multi-exponent with Montgomery multiplication.
 void squared_rsa_exponent_mod(Vector exponent, Modulus modulus, Bignat result, RSA_exponent_interface rsa_exponent, RSA_exponent_interface square_exponent, Bignat temp_1, Bignat temp_2, Bignat temp_3)
          Modular multi-exponent with squared multiplication.
 
Methods inherited from class ds.ov2.bignat.Bignat_array
allocate, copy_digit, get_array, get_bignat_length, get_bignat_size, get_length, get, register_long_bignats, register_short_bignats, set_length, set, size
 
Methods inherited from class ds.ov2.util.Serializable_array
from_byte_array, to_byte_array
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface ds.ov2.util.APDU_Serializable
from_byte_array, size, to_byte_array
 

Field Detail

buf

private byte[] buf
Temporary digit array of type DIGIT_TYPE used inside the exponent_mod method. Only allocated if the init_buf constructor argument is true. If it is allocated its length will be the same as the length of the underlying Bignat array of this vector. If DIGIT_TYPE is byte, the array will be allocated as transient array.


temp

private Bignat[] temp
References of temporaries used inside exponent_mod and mont_rsa_exponent_mod. Only allocated if the init_buf constructor argument is true. If allocated the length of the array is 3. The method exponent_mod uses the first two elements, mont_rsa_exponent_mod uses all three.

Only the array and not the temporary bignat object themselves belong to this object. The temporary bignats are passed as arguments to the exponent_mod and mont_rsa_exponent_mod methods.

This array is not allocated in (transient) RAM, because I don't know how to downcast an object array to a Bignat array.


out

public static PrintWriter out
Debug and diagnostics output channel. Only available for the host test frame if HOST_TESTFRAME is defined. Must be set from the outside before use. Leave or set a null reference to disable diagnostics.

Constructor Detail

Vector

public Vector(short length,
              boolean init_buf)
Non-allocating constructor. Allocates only the underlying bignat array, but not the bignat themselves. If one of the methods exponent_mod or mont_rsa_exponent_mod will ever be used on this object then init_buf must be set to true. The constructor will then allocate the temporary data structures that these methods require (see fields buf and temp).

Parameters:
length - length of the underlying bignat array
init_buf - whether to initialize the temporary arrays needed for exponent_mod and mont_rsa_exponent_mod

Vector

public Vector(short bignat_size,
              short length,
              boolean init_buf,
              boolean in_ram)
Allocating constructor. Allocates the underlying bignat array of length length complete with all bignats, each of size bignat_size. The argument in_ram is passed through to the Bignat constructor, if true all the bignats are allocated in transient RAM.

If one of the methods exponent_mod or mont_rsa_exponent_mod will ever be used on this object then init_buf must be set to true. The constructor will then allocate the temporary data structures that these methods require (see fields buf and temp).

Parameters:
bignat_size - size of the Bignats in the array in bytes
length - length of the underlying bignat array
init_buf - whether to initialize the temporary arrays needed for exponent_mod and mont_rsa_exponent_mod
in_ram - allocate the bignats in transient RAM if true
Method Detail

exponent_mod

public void exponent_mod(Vector exponent,
                         Modulus modulus,
                         short base_factor_size,
                         Vector base_factors,
                         Bignat mont_one,
                         Bignat result,
                         Bignat temp_arg)
Montgomerized modular multi-exponent. Computes this.get(0)^exponent.get(0) * this.get(1)^exponent.get(1)... modulo modulus up to the length of this vector. The result will be stored in result. The bases in this object must be montgomerized, the exponents must not.

Asserts that the fields buf and temp are non-null, that is, the constructor for this object must have been called with init_buf == true.

The use of Montgomery multiplication implies other restrictions, namely that the first two digits of all bases and factors are zero (Montgomery digits) and that the modulus is odd, see Montgomery multiplication.

The argument base_factors must contain the precomputed factors of the first base_factor_size bases (ie. elements of this vector). See Host_vector.make_montgomerized_factors, for an easy way to compute these factors.

The vector base_factor_size must have size base_factor_size^2 -1, where the -1 comes in because the empty product of all bases is not needed. The argument base_factor_size can be zero, in this case base_factors can also be a null reference. The factors in base_factors must be montgomerized. The base factors must be stored in the following order

   base_factors.get(0) == this.get(0)
   base_factors.get(1) == this.get(1)
   base_factors.get(2) == this.get(1) * this.get(0)
   base_factors.get(3) == this.get(2)
   base_factors.get(4) == this.get(2) * this.get(0)                
   base_factors.get(5) == this.get(2) * this.get(1)                
   base_factors.get(6) == this.get(2) * this.get(1) * this.get(0)
   ...
 
(If you want to take these lines literally, then ``*'' must denote montgomery multiplication and ``=='' equality of Bignat's.)

The general rule is as follows. Take a base factors index i and look at the binary representation of i+1. The base factor i is the product of those bases whose index has a 1-bit in the binary representation of i+1. For instance, for index 5, look at the binary representation of 6 == 110, ie., it must be the product of base 1 with base 2.

base_factor_size can be shorter than the length of this vector, but it must not be longer. Best performance is obtained if base_factor_size equals the length of this vector. Then 2 multiplications per exponent bit are needed. Otherwise length - base_factor_size additional multiplications each with probability 0.5 are needed for each exponent bit.

Asserts that base_factor_size is at most 15. The argument mont_one is used to initialize the internal multiplication akkumulator, it must therefore be a montgomerized 1. Note that this is equal to the montgomery factor mont_fac, see Host_modulus.mont_fac.

The computation requires an additional temporary that is used together with result for intermediate results. Therefore result and temp_arg must be different from all other Bignat passed in as arguments.

The bases in this vector, the factors in base_factor_size, result and temp_arg must all have the same size, otherwise an exception in Bignat.montgomery_mult might be thrown. The size of the exponents is arbitrary, but all exponents must have the same size.

For an example on how to convert normal number into the format required by this method, see the source code of Convenience.vector_exponent_mod.

If OPT_SPECIAL_SQUARE is defined, squaring will be done with Bignat.montgomery_square, otherwise with Bignat.montgomery_mult.

Parameters:
exponent - exponents
modulus - modulus
base_factor_size - number of bases for which precomputed factors are available in base_factors
base_factors - Base factor array of size 2^base_factor_size -1, use Host_vector.make_montgomerized_factors to compute it
mont_one - a montgomerized one, equals the Montgomery factor mont_fac , see Host_modulus.mont_fac.
result - result
temp_arg - a temporary of the same size as result and the bases

mont_rsa_exponent_mod

public void mont_rsa_exponent_mod(Vector exponent,
                                  Modulus modulus,
                                  RSA_exponent_interface rsa_exponent,
                                  Bignat rsa_vector_correction,
                                  Bignat result,
                                  Bignat temp_1,
                                  Bignat temp_2)
Modular multi-exponent with Montgomery multiplication. Relies internally on RSA_exponent to compute single exponents. They are then multiplied with Montgomery multiplication. Computes this.get(0)^exponent.get(0) * this.get(1)^exponent.get(1)... modulo modulus up to the length of this vector. The result will be stored in result. The bases in this vector and the exponents must be in normal form, i.e., not montgomerized.

The argument rsa_vector_correction is multiplied to the product of all single exponents as a Montgomery correction factor. For two bases two multiplications are performed in total, so the rsa_vector_correction argument must be mont_fac^2 to obtain a normal result, where mont_fac is the Montgomery factor. For three bases it must be mont_fac^3, and so on. If the multi-exponent computed here is only an intermediate result, one can of course also use an higher exponent of the Montgomery factor to also adjust for multiplications done outside of this method.

Internally three temporaries are needed. The argument result is used as one of them, the two other temporaries must be passed explicitely. The three arguments result, temp_1 and temp_2 must be pairwise different references and they must also differ from the bases and the modulus.

The bases in this object must match the configured size of the rsa_exponent that is used to compute the single exponents. (This means that the size of the bases must be 2 bytes larger than the key size of the rsa_exponent.) The modulus must have been installed (with set_modulus) in the rsa_exponent prior to calling this method.

This method can only be used if the object has been constructed with init_buf == true.

This method has been written for use on the card with an RSA_exponent object for doing exponentiations on the crypto coprocessor. However, for testing purposes, it can also be used together with Fake_rsa_exponent.

Parameters:
exponent - vector with the exponents, must have the same length as this vector
modulus - modulus
rsa_exponent - RSA exponent object used for single exponentiations
rsa_vector_correction - Montgomery correction factor
result - result and 1st temporary
temp_1 - 2nd temporary
temp_2 - 3rd temporary

squared_rsa_exponent_mod

public void squared_rsa_exponent_mod(Vector exponent,
                                     Modulus modulus,
                                     Bignat result,
                                     RSA_exponent_interface rsa_exponent,
                                     RSA_exponent_interface square_exponent,
                                     Bignat temp_1,
                                     Bignat temp_2,
                                     Bignat temp_3)
Modular multi-exponent with squared multiplication. Relies internally on RSA_exponent to compute single exponents. They are then multiplied with squared multiplication (Bignat.squared_rsa_mult_2 or Bignat.squared_rsa_mult_4 depending on SQUARED_RSA_MULT). Computes this.get(0)^exponent.get(0) * this.get(1)^exponent.get(1)... modulo modulus up to the length of this vector. The result will be stored in result. The bases in this vector and the exponents must be in normal form, i.e., not montgomerized.

Internally four temporaries are needed. The argument result is used as one of them, the three other temporaries must be passed explicitely. The four arguments result, temp_1, temp_2 and temp_3 must be pairwise different references and they must also differ from the bases and the modulus.

Both RSA exponents rsa_exponent and square_exponent must be configured for the same size. square_exponent must have the modulus modulus and an exponent of 2 installed before entering this method. rsa_exponent must have the modulus modulus installed before calling this method.

The bases in this object, the temporaries and the result must have the same length, which must be identical to the configured size of both rsa_exponent and square_exponent.

This method can only be used if the object has been constructed with init_buf == true.

This method has been written for use on the card with an RSA_exponent object for doing exponentiations on the crypto coprocessor. However, for testing purposes, it can also be used together with Fake_rsa_exponent.

Parameters:
exponent - vector with the exponents, must have the same length as this vector
modulus - modulus
result - result and 1st temporary
rsa_exponent - RSA exponent object used for single exponentiations with arbitrary exponents
square_exponent - RSA exponents object used for squaring inside Bignat.squared_rsa_mult_2
temp_1 - 2nd temporary
temp_2 - 3rd temporary
temp_3 - 4th temporary

is_compatible_with

public boolean is_compatible_with(Object o)
Compatibility check for the OV-chip protocol layer. Vector is compatible with See the compatibility check explanations and also APDU_Serializable.is_compatible_with.

Specified by:
is_compatible_with in interface APDU_Serializable
Overrides:
is_compatible_with in class Serializable_array
Parameters:
o - actual argument or result
Returns:
true if this (the declared argument or result) is considered binary compatible with o.