Java™ library designed to support 3GPP™ Milenage algorithm calculations according to 3GPP TS 35.206. Has written from scratch i.e. is not based on C sourse code from 3GPP™ TS 35.206 Annex 3.
-
OPccalculation based onOPandK -
All Authentication and Key Generation
fnfunctions includingf1*andf5* -
Algorithm customization with
RandCconstants -
Implementation customization:
There is a
MilenageBufferinterface supporting all operations Milenage uses under the hood, like bit shift, XOR etc. You can provide your own implementation, but library offers default implementation based onBigIntegerclass. For cryptography purposes library usesCipherobject fromjavax.cryptopackage so you can use any ciphering algorithm having the buffer size 128 bits as well as "default" Rijndael. -
You can choose method of invocation of Milenage functions:
-
call each function separetely
-
call a full set of functions at once, in this case a call of every function can be asynchronous.
It's configurable through
ExecutorServiceobject.
-
Java 1.7 or higher.
compile 'com.github.brake.threegpp:milenage:1.0.0'<dependency>
<groupId>com.github.brake.threegpp</groupId>
<artifactId>milenage</artifactId>
<version>1.0.0</version>
</dependency>// 1. Create instance of MilenageBufferFactory<BigIntegerBuffer> interface by
// instantiating BigIngegerBufferFactory object.
MilenageBufferFactory<BigIntegerBuffer> bufferFactory = BigIntegerBufferFactory.getInstance();
// 2. Create instance of javax.crypto.Cypher from a key
// using a helper class threegpp.milenage.cipher.Ciphers.
Cipher cipher = Ciphers.createRijndaelCipher(keyBytes);
// 3. Create OPc value from OP bytes and K, represented by the
// previously created Cipher object.
byte [] OPc = Milenage.calculateOPc(opBytes, cipher, bufferFactory);
// 4. Create the Milenage instance for `OPc` and Cipher instances with MilenageBufferFactory.
Milenage<BigIntegerBuffer> milenage = new Milenage<>(OPc, cipher, bufferFactory);
// 5. Use the Milenage instance with input data (RAND, SQN, AMF)
try {
Map<MilenageResult, byte []> result = melenage.calculateAll(rand, sqn, amf, Executors.newCachedThreadPull);
} catch(InterruptedException | ExecutionExceprtion e) {
// handle exception
}
// 6. Use the result
useMacA(result.get(MilenageResult.MAC_A));
useMacS(result.get(MilenateResult.MAC_S));
useResponse(result.get(MilenageResult.RES));
useConfinentialityKey(result.get(MilenageResult.CK));
useIntegrityKey(result.get(MilenageResult.IK));
useAnonimityKey(result.get(MilenageResult.AK));
useResynchAnonimityKey(result.get(MilenageResult.AK_R))
You can see working example in test code.
TBD
Copyright © 2015-2016 Constantin Roganov
Distributed under the MIT License.
- This project has a Milenage implementation (LGPL 2.1) Javadoc.