Masters Project: Efficient Encryption On Limited Devices
Masters Project: Efficient Encryption On Limited Devices
Masters Project: Efficient Encryption On Limited Devices
Limited Devices
Roderic Campbell
Department of Computer Science
Rochester Institute of Technology
Rochester, NY, USA
rmc8917@cs.rit.edu
July 3, 2006
_______________________________________
Chair: Prof. Alan Kaminsky Date
________________________________________
Reader: Prof. Hans-Peter Bischof Date
________________________________________
Observer: Prof. Leonid Reznik Date
1
Abstract
2
Contents
1 Introduction 5
2 Algorithm Background 7
2.1 Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 XTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3 Functional Specification 16
4 Software Design 17
4.1.1 negate() . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1.3 divide() . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1.6 getRandomNBitsLong() . . . . . . . . . . . . . . . . . 22
4.2 EncryptionInterface . . . . . . . . . . . . . . . . . . . . . . . . 22
3
4.3 DH Implementation . . . . . . . . . . . . . . . . . . . . . . . . 23
5 Experimental Results 26
5.1 Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2 Recommendation . . . . . . . . . . . . . . . . . . . . . . . . . 32
6 Future Enhancements 33
7 Conclusion 34
A User’s Manual 34
4
1 Introduction
Over the past decade, there has been a notable increase in the widespread
use of personal digital assistants, mobile phones with advanced functionality
and consumer devices which contain limited, yet non-trivial processors. Such
devices have had, and will continue to have a significant effect on the flow of
social and business communication. At the same time, we have seen personal
computers handling more and more highly sensitive data such as bank and
business transactions. The next logical step is to see the limited devices
handling such transactions on the go in a secure fashion. Human nature
and the pace of business demands that all of these interactions take place
effectively and efficiently. Thus follows the need for an efficient, lightwieght
way of securely establishing a secret key for communication between two
parties.
Key exchange protocols have existed since men have kept secrets from other
men. Stories of Julius Caesar and his armies encrypting messages are leg-
endary to those who know the history of espianage. The appropriately named
Caesar Cipher is a simple algorithm which, given a simple key, maps out an
alternate alphabet by shifting the values of each letter in a message any num-
ber of letters to the left. If a key is 1, then any b in your message becomes
an a, any c becomes a b, any d becomes a c and so on. This will result in a
scrambled mess of a message resulting in an encrypted or ciphertext message.
The receiving party simply shifts each letter of the encrypted message to the
right 1 letter resulting in the decrypted or plaintext message. The key can
be any number between 1 and 26.
Ignoring the fact that there are only 26 possible keys, this simple encryption
algorithm depends on each party knowing the secret key. In the old days,
this would most likely be done by a trusted courier or a worst case scenario
of a personal conversation between to two communicating parties.
Modifications of this algorithm allowed for more complex keys which could
consist of words or larger numbers as keys. Given this technique, keys could
be a previously established word, such as a last name, or a country, or a
favorite food. This was still very easy to break and still requires a previous
agreement on a key establishing method.
5
Later advancements in encryption lead to more complex mathematical struc-
tures requiring hundreds or thousands or millions of calculations which re-
alistically, requires efficient computational machines such as computers. Al-
gorithms used today, such as RSA or Diffie-Hellman, depend on modular
exponentiation of very large numbers which would take an enormous amount
of time if done by hand. These algorithms can be used in such a way that
two parties can end up with the same data without revealing the data in an
open communication channel. These are called Public Key Crypto-Systems.
This computationally intensive process is the basis and starting point for
this paper. The implementation for my Masters Project consists of a full
implementation of a Arbitrary Length Precision Integer library, as well as
implementations of Diffie-Hellman(DH), Elliptic Curve Encryption (ECC)
and XTR which stands for Efficient and Compact Subgroup Trace Represen-
tation. Each of these encryption algorithms require very large numbers to
obtain ample security levels.
DH is a tried and true method developed over 20 years ago and relies on
the concept above of an one-way function called modular exponentiation
of large numbers. ECC relies on an algebra based on curves of the form
y 2 = x3 + ax + b. Similar levels of security can be obtained by using numbers
that are several times smaller than the numbers used in DH. This will be
explained in detail later in the paper. XTR claims to achieve similar security
levels to ECC using even smaller numbers.
6
of the algebras described in the paper. This can by done by running side
by side comparisons of each algebra running Diffie-Hellman and computing
a public key set. This is done on both a desktop platform as well as a small
device. At the end conclusion is drawn about the suitability of these three
methods for use on small devices.
This paper will describe each of the algorithms in depth, as well as describe
the results obtained from the tests that were run on the code. The rest of
this paper describes the implementation of my Master’s Project.
2 Algorithm Background
In this section, I will describe in a bit of detail, how each of the three algo-
rithms work.
2.1 Diffie-Hellman
1. Alice and Bob agree to use prime number p and a generator g from Zp∗ .
2. Alice chooses a secret integer a and computes g a (mod p) and sends this
over to Bob.
3. Bob chooses a secret integer b and computes g b (mod p) and sends this
over to Alice.
7
4. Alice computes (g a (mod p))b (mod p) and has the secret key.
5. Bob computes (g b (mod p))a (mod p) and has the secret key.
In this case Bob is a small device and is not suitable for the generation of the
initial primes. At the end of all calculations, Alice and Bob are able to use
a more efficient block cipher encryption algorithm to encrypt a conversation
key.
8
Figure 1: Elliptic curve Addition [3]
As a high level overview of Elliptic curves refer to the figure above. The
encryption technique is based off of an abstract concept of elliptic curve
addition. Suppose you have a curve E as shown in the figure. Given a point
P and a point Q, addition is rougly defined as drawing a straight line through
the two points and finding the reflection, a third point on the curve, called
−R. The inversion of this point, R, is the sum of P and Q.
Let E be the curve y 2 = x3 + 10x + 5 over the field GF (13). Then the points
on E are {O, (1, 4), (1, 9), (3, 6), (3, 7), (8, 5), (8, 8), (10, 0), (11, 4), (11, 9)}.
9
multiplication in the group Zp∗ as used in integer DH schemes.
The new DH with the ECC algebra looks something like this:
2. Alice chooses a secret integer a and computes c ∗ a and sends this new
point over to Bob.
3. Bob chooses a secret integer b and computes c ∗ b and sends this new
point over to Alice.
The analogy between the normal discrete logarithm problem and the elliptic
curve logarithm problem is focused around the basic operation of multiplica-
tion for normal discrete logarithm and addition of points for elliptic curves.
The main operation being exponentiation in discrete logarithm and scalar
10
multiplication in elliptic curves. This scalar multiplication is a result of cal-
culations which are not modular exponentiation. This is the main reason
that elliptic curve cryptography boasts such significant gains over normal
Diffie-Hellman.
2.3 XTR
[5] states that XTR key selection is much faster than DH and orders of
magnitude easier and faster than ECC. For these reasons, [5] insists that
XTR will find its home in small devices such as smart cards and wireless
devices. This complements the goals and direction of this implementation.
The overall concept of XTR is based on [1] what [5] calls the Optimal Normal
Basis Representation. The paper describes numbers as a tuple of numbers.
A number x in GF(p2 ) is represented as (x1,x2). In this paper, saying x
<=> (x1,x2) means the optimal normal basis representation of x is (x1,x2).
Likewise, the number t in GF(p) is represented as t <=> (p-t,p-t), which is
equivalent to (-t,-t) (mod p). For example, 3 <=> (p-3,p-3).
The algebra is defined as follows, where all calculations are done modulo p:
11
2. Multiplication. Let x <=> (x1,x2) and y <=> (y1,y2). First compute
t = x1 * y1
u = x2 * y2
v = (x1 + x2) * (y1 + y2)
w=t+u-v
Then x*y <=> (u+w,t+w).
With that being said, there are a few things that need to be noted. First is the
implementation of exponentiation to the power of p. Notice how it is simply
a value swap within the tuple and essentially is free. Second is the relatively
small number of calculations that are required to do most operations. For
instance, as stated before, squaring only takes 2 multiplications. This should
prove to be very effecient for the types of operations that will be used in the
encryption algorithms.
1. If n = 0, then:
cn−1 = cp ,
12
cn = 3,
cn+1 = c.
Done.
2. Else if n = 1, then:
cn−1 = 3,
cn = c,
cn+1 = c2 − cp − cp .
Done.
3. Else if n = 2, then:
cn−1 = c,
cn = c2 − cp − cp ,
cn+1 = c ∗ cn − cp ∗ c + 3 [Corollary 2.3.5.ii] [Use xz − yz p formula]
Done.
6. m = (m − 1)/2.
[Comment: mr is always 1; that is, r is the index of the leftmost 1 bit of m.]
13
[Begin loop body]
13. Done.
Additionally we need to define how to find T r(g). This is quite simple and
is explained in [5] as algorithm 3.2.2.
1. Pick c ∈ GF (p2 )\GF (p) at random and compute cp+1 using the above
algorithm.
2. If cp+1 ∈ GF (p) then return to Step 1.
3. Compute c(p2 −p+1)/q using the above algorithm.
4. If c(p2 −p+1)/q = 3, then return to Step 1.
14
5. Let T r(g) = c(p2 −p+1)/q .
Using this new found algebra as an encryption technique is very similar to the
ECC technique. We simply take the discrete logarithm problem embedded
within XTR to exploit the key exchange protocol of DH.
Suppose that Alice and Bob who both have access to the XTR public key
data p, q, T r(g) want to agree on a shared secret key K. This can be done
using the following XTR version of the Diffie-Hellman protocol:
3. Alice receives T r(g b ) from Bob, uses Algorithm 2.3.7 to compute Sa (T r(g)b ) =
(T r(g (a−1)b , T r(g ab ), T r(g (a+1)b )) ∈ GF (p2 )3 . and determines K based on
T r(g ab ) ∈ GF (p2 ).
4. Bob uses Algorithm 2.3.7 to compute Sb (T r(g)a ) = (T r(g a(b−1) ), T r(g ab ), T r(g a(b+1) )) ∈
GF (p2 )3 , and determines K based on T r(g ab ) ∈ GF (p2 ).
The results and findings of this implementation are described at a later point
in the paper.
In a full encryption scheme we would see the secret keys that are derived
from the previously mentioned algorithms used in a hash function to create
the actual secret key. This hashed secret key is then used as they secret key
in a a block cipher for traffic data. The implementation described in this
paper, however, did not implement or measure the performance of the traffic
encryption. This falls out of the scope of the project which was implementing
and measuring parameter generation and public key exchange protocols only.
15
3 Functional Specification
The limited device consists of a Samsung VGA 1000 Java enabled mobile
phone. Java 2 Platform, Micro Edition with the Connected Limited Device
Configuration(CLDC), and the Mobile Information Device Profile make up
the Java Platform which is used[4]. The device itself contains 1024KB of
memory for Java applications.
3. Implemented public key generation and key exchange for the above in
Java in a desktop computing environment.
16
4 Software Design
The Software Design can be clearly described using the following figure.
The individual packages are described in the following sections with methods
describing functionality that is specific to a given algorithm. Where needed
the desicion making process is explained as well.
17
4.1 Math Library
The Math library is all contained within the class called BigInt. The BigInt
is modeled after Java’s BigInteger in that it is an Arbitrary Length Precision
Integer. The underlying structure of the BigInt is an array of unsigned Java
primitive integers and will be refered to as the BigInt’s magnitude. The least
significant digit is the zeroeth element of the array. Each BigInt contains the
magnitude and a single integer to represent the sign. A 1 indicates that the
BigInt is positive, a 0 represents a BigInt with a value of 0, and a sign of −1
indicates a negative BigInt.
The following subsections will describe in detail how select methods were
implemented. This will ensure the reader has a solid understanding of exactly
how the BigInt was implemented as well as describe specific details about the
algorithms behind the code.
4.1.1 negate()
The method takes in no arguments and returns a copy of the BigInt for which
it was called on with the exception that its sign is multiplied by −1.
The addition method was the first method implemented due to its simple
nature. Addition takes in a BigInt object and adds it to this and returns
a new BigInt which represents the sum of the two. It is really nothing
more than elementary addition that one would learn in elementary school.
[6] describes these in great deatail. Given two arbitrarily long numbers,
an augend and an addend, we find the sum by breaking the number up into
individual digits and adding them together, starting with the least significant
digit. If the sum of this single precision addition is greater than the base of
18
the digits, we add 1 to a carry bit and move to the next least significant
digit. Doing this simple addition again, we note the carry bit, if it is set,
we add 1 more to the sum of the single precision digits. We do this until all
digits have been added to their counterpart. If the carry bit is set at the end
of this, we simply append a 1 to the front of the number which becomes the
new most significant digit.
In the actual implementation there are a few factors that need to be con-
sidered. In the beginning of the method, there is an error checking section
which takes into account the zero cases which could give the addition method
slower than necessary results. Also considered is the case where each, or ei-
ther of the BigInts passed in are negative. This of course is simply a call to
a negate method.
It was also stated earlier that the implementation was an array of Java prim-
itive ints. A contradiction arises when it was stated that an addition could
have a carry bit. The solution to this is that when we do addition, we actu-
ally take the int value that is in an element of the magnitude and we replace
it with the equivalent long value. Doing this for the augend and the addend
gives us ample magnitude to note the carry bit. If the sum of the numbers
is larger than 32 bits, we mask out the upper 32 bits and set the carry bit.
Both subtraction and addition are described in depth in section 14.2.2 of [6].
19
Multiplication takes in a BigInt as its only argument. It returns the product
of this and the BigInt being passed in.
4.1.3 divide()
The division algorithm used in this implementation can be found in [6]. This
implementation uses a technique which is intended to reduce the harsh costs
absorbed when using a division method. The gist of it is that the method
attempts to digit shift the numerator until it only goes into the denominator
1 time. It is not appropriate for me to get into the method in this paper, but
suffice it to say, division is still the worst of the basic arithmetic algorithms.
Division takes in a BigInt and returns the quotient of this and the BigInt
passed in with no remainder. A separate method called divideAndRemain-
der() also takes in a BigInt but returns an array of BigInts which includes
the quotient and the remainder. The algorithm for division is discussed in
more detail in section 14.2.5 of [6].
Many times in DH and ECC we need to find the inverse of a number modulo
another number. Doing this requires that we use the Euclidean Algorithm.
The Euclidean Algorithm in its normal form is not ideal for the number of
times we are using this method, not to mention the magnitude of numbers
that we are dealing with in this project.
20
are returned as an array of BigInts. Binary Extended GCD Algorithm is
discussed in more detail in section 14.4.3 of [6].
Binary halving and doubling is very simple. Both take no arguments and
return double or half of this. The actual method in its simplist form is one
of the quickest calculations that a machine can execute. Doubling is simply
a left shift of bits, where division by 2 is simply a right shift of bits. Given
the nature of the methods I am using, I believe that this is the best use of
division in the BigInt class.
The method for half and doubling can be described simply as doubling, halv-
ing can be implied as the contrary. For each digit in the BigInt, we simply
need to bit shift the digit to the left and note the carry bit. On the next
digit, do the same bit shift operation and add 1 if the carry bit is set and
note the next carry bit. Repeat these steps to the last digit and add 1 to the
length of the number if the final digit has a carry bit set.
21
as simple as taking the least significant digit of our BigInt. Division of our
base is as easy as digit shifting to the right. This can be compared to base
10 division which is taught to elementary students learning math.
4.1.6 getRandomNBitsLong()
4.2 EncryptionInterface
The method keyGen() takes a random seed, size for prime p and a size for
generator g. This is the step which is done by the desktop machine as this
contains the most time consuming computations. In our situation, Alice is
the desktop machine.
The method keyGen1() takes a randomizer seed and a size for Bob’s mul-
tiplier b. In our situation, this is done by Bob who generates his secret
multiplier and performs g b (mod p).
22
The method keyGen2() is performed by both Bob and Alice and takes an
object which will be a BigInt, a Point on a curve or a number in Optimal Nor-
mal basis Form for normal DH, Elliptic Curve DH and XTR DH respectively.
The method also takes a string to decide if Alice or Bob are performing this
method. After both parties have completed this step, they will have g ab (mod
p) and thus have swapped enough information to have a common key without
sharing any sensitive information.
4.3 DH Implementation
The basic algorithm for DH is quite simple and easy to understand. The
math behind it deals with the understanding of the properties of modular
exponentiation.
The elliptic curve library will consist of the communication protocol to ex-
change the appropriate public information. When the public information is
established, each of the parties will utilize methods in the math library to
come up with random integers and calculations for the private key informa-
tion.
The next few subsections deal with the classes that make up the Elliptic
curve arithmetic.
23
4.4.1 Point, add(), multiply()
The point class is quite simple and can be described as simply a wrapper
class around a BigInt array representing a point in two-dimensional space
with a little more to accomodate Elliptic curves. Each point contains an X
and a Y coordinate as well as curve that is associated with it.
The most significant methods associated with this class deal with point mul-
tiplication and point addition. These methods are the reason that the point
needs to know what curve it belongs to. Addition of two points is described
in [2] section A.10.1. The subtraction of a point Q = (x, y) from a point
P = (a, b) is simply addition of the point -Q = (x, -y). Multiplication is
described in section A.10.3 of [2] .
The functionality of the class comes from its ability to generate a random
point. In depth description of the method can be found at [2] section A.11.1.
Given a point in 2d space, the elliptic curve class can determine if the point
is on the curve by simply filling out both sides of the non-supersingular curve
equation.
For the actual encryption of the data, ECC is using a modified version of
Diffie-Hellman. Alice in this case will initiate the transmission by creating
a public curve and a public starting point. She then will create a random
BigInt A and multiply the public point P by A. The resulting point P A is
sent over to Bob who is able to take that new point and multiply it by his
random BigInt B to get the result BP A. Alice takes Bob’s product BP and
multiply it by her BigInt A to get ABP . The end result is that each side has
a shared secret key but it was not shared in public.
24
4.5 XTR and ONBForm
The significant methods in the class ONBForm are as follows: add(), cor235iii(),
isInGFP(), multiply(), square(), and subtract(). Each of these methods de-
fine the functionality as described in Section 2.
The test bed is driven from the limited device and uses simple communication
protocols to send appropriate values to the limited device. As an example:
take a DH algorithm.
First a user must initiate the DH test from the Desktop. This will begin
calculating the public keys p, g. Since the desktop is powerful enough, it is
acceptable for it to calculate the values that Bob would calculate in order to
complete the calculations that are depended upon Bob. The values for p and
g are stored to a file and the desktop then completes Alice’s role
Getting the results to the limited device is a bit difficult. Due to some net-
work issues, the original plan of transferring the data to the phone would not
work out. The toolkits provided by Sprint and Java did not provide ample
technical support. Debugging network transmissions proved very difficult.
The original plan was to send the public parameters through a socket con-
nection exactly as key exchange would happen. Again, the SDK mixed with
the limitd functionality of Sprint’s network was not ample for figuring this
out.The end solution was to hard code the data into the classes and redeploy
25
the code.
Using the limited device, the user must select which iteration, algorithm, size
and number of iterations allowed by the build in user interface.
5 Experimental Results
The results of the tests run can be found in the next division of this section.
All times are given in milliseconds. The tests were divided into each algorithm
and then each bit length for each algorithm. Each algorithm has 2 bit lengths
that the tests were run in. Normal DH was run at 4096 and 2048 bits. ECC
was run at 783 and 585 bits. XTR was run at 683 and 341 bits. These
numbers have been determined to give 4096 and 2048 bit security levels
respectively (section 4.4 of [5]).
Initial observations show us that the key generation process for ECC takes
7 times longer than XTR and DH was approximately 105 times longer than
ECC. The fact that ECC is faster than DH and XTR is faster than ECC was
to be expected.
There is a java.math.BigInteger iteration that was run to see just how fast
Java could perform. It seems that BigInteger is in fact much faster than the
library that I have implemented. As you can see from figures, my library
took about 25 times longer than the BigInteger implementation. If we had
26
a J2ME port of BigInteger, this could be an ideal solution for the problem
that this paper is addressing.
Figure 3: Average Results for 2048 and 4096 bit security levels
The relative comparisons of the time trials, shown above, give us a great
understanding of how the algorithms compare to each other. We must also
look at isolated times and notice the trends. First let us take a look at DH.
We see that the 2048 bit DH took on average 149 minutes to complete the Key
Generation stage. This does not include any computation on the part of the
phone. This means that two parties would have to wait more than 2.5 hours
before any actual communications can occur. This is obviously unacceptable.
As we look at 4096 bit DH, we see that only 1 key generation iteration took
more than 5 hours to complete. This is not even close to acceptable. As a
result we have decided that this implementation is unacceptable at this time.
The further calculations were stopped and given DNF as ”Did Not Finish”.
27
5.1 Data
28
iteration KeyGen g a (mod p) g ab (mod p)
0 25953 406 390
1 95375 391 390
2 74703 391 390
3 35015 391 391
4 11703 406 406
5 36891 390 391
6 7219 406 390
7 136750 391 391
8 16000 390 407
9 20688 406 640
29
iteration KeyGen g a (mod p) g ab (mod p)
0 286921 43047 43078
1 19422 43469 43907
2 171813 46468 48485
3 10047 46359 43968
4 9266 43094 43485
5 622891 45234 42906
6 394750 43000 43359
7 687766 43281 43719
8 22657 43218 43485
9 377906 45219 43093
30
iteration KeyGen g a (mod p) g ab (mod p)
0 18703 4688 4688
1 331031 4609 4656
2 145593 4391 4437
3 99843 4532 4562
4 23828 4750 4828
5 89578 4453 4500
6 422297 4828 4546
7 37938 4687 4610
8 56531 4453 4563
9 127640 4641 4703
iteration g b (mod p)
0 8931633
1 8121933
2 9005609
3 9166692
4 9643583
5 7772234
6 8948961
7 7853797
8 8517770
9 8927536
31
iteration g b (mod p)
0 53182641
1 DNF
2 DNF
3 DNF
4 DNF
5 DNF
6 DNF
7 DNF
8 DNF
9 DNF
5.2 Recommendation
The purpose of this paper and project was to come up with a final recom-
mendation for what would be appropriate for small devices at this time.
32
complete. The largest delay was the distance factor I was working with.
In retrospect, I should have started the project much earlier so that I
would be able to have a good head start on the implementation by the
time the summer of 2004 started. This could have given me the mo-
mentum to finish implementation and leave the easy part of the paper
to do on my own remotely.
6 Future Enhancements
A more extreme approach to fixing the timing issues would be to not use Java
at all. As mentioned earlier, I suspect that most of the timing problems came
from the creation of objects in Java. Using C would not give the developer
this problem. The issues that arise with this solution is getting the code over
to the small device. The phone that I was using was Java enabled so I could
easily push Java programs onto it. If a developer were to use C, they would
have to come up with a way to get the programs on to the phone. With the
phone used for this project, that would be very difficult. As phones become
more accessible, this may be an option.
Still another approach would be to use a PDA of some sort. PDA’s are a more
mature environment for running programs and are a bit more sofisticated
than cell phones. This may lead to faster processors which would make these
tasks much faster. Some future work which would not take much effort would
be to run the tests on such a device.
33
7 Conclusion
For information on what specifically was implemented, please see section 3.3.
It describes:
All of this was written in Java. BigInteger was used only as a test vehicle.
All of the above was new code.
A User’s Manual
The final project comes in the form of a zip file. Unzip the file to an
appropriate directory. To run the tests, go to the LimitedDeviceSecurity
34
folder. To compile the source, run javac -cp . tests/*.java. This will put
all of the appropriate class files in the classes directory. These tests are
used on the server side for timing purposes. To run these files, java -cp .
test/RunGenericDesktop. This will print the usage output for the main in
the RunTests class. The arguments that are passed in determine which tests
and how many tests are run. For instance, the argument string ”0 1234 2048
10” will run DH with a bit size of 2048 10 times with a random seed of 1234
and will output the results.
Installing the program on the phone is more of a problem than one would
have expected. Sprint phones do not have a way to get the programs onto
the phone directly from the computer. The protocol defined is called the
Over The Air Protocol(OTA). SprintPCS provides poor documentation on
getting programs to the phone. Getting this to work requires a web server.
SprintPCS did not mention this. You put the Java Archive file(JAR) as
well as a descriptor file (JAD) onto the server. You must then send a text
message to the phone with no subject and the URL of the JAD file as the
body of the message. The web server must be configured to define how to
handle both JAD and JAR files. This presented quite a problem for quite
some time since it was not described anywhere how to actually do this. The
actual lines of code that need to be put into the http.conf file for an apache
server are as follows:
35
of the file. The solution that I found for this issue was that I could send the
text message to the phone with ?r=N attached after the .jad where N is a
random number. This tricked the network into thinking the file was different
while not having any effect on the link location.
Using Netbeans 4.1 with the mobility pack installed will allow for very simple
creation of an appropriate jar file. When code is ready to be deployed, you
simply right-click on the project in the Project view of Netbeans and select
Properties. This will bring up an options panel. Under Deployment options
you must select a location for the jar file to be placed. When this is done,
hit ok. Then again right-click the Project which will be deployed and select
deploy from the popup menu.
The process that begins is the compile, build and move of the jar file which
will be pushed to the Limited Device. The .jad file is also created at this
point. The .jad file referes to the Java Archive Descriptor. This file tells a
browser where it can find the archive file and some stats regarding size of the
archive file.
The jar and jad files are now ready. Using the method described above can
now be used to get the jar file onto the Limited Device.
36
References
[1] Alan kaminsky, personal communication, may 5, 2005.
[2] Ieee std 1363-2000. ieee standard specifications for public-key cryptogra-
phy. January 30 2000.
[5] A. K. Lenstra and E. R. Verheul. The XTR public key system. CRYPTO
2000, Proceedings of the 20th Annual International Cryptology Confer-
ence, 1880:1–19, 2000.
37