Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
9f158b57
Commit
9f158b57
authored
Jul 16, 2014
by
Lionel Gauthier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
git-svn-id:
http://svn.eurecom.fr/openair4G/trunk@5511
818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent
500518e6
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
369 additions
and
4 deletions
+369
-4
openair-cn/SECU/nas_stream_eea1.c
openair-cn/SECU/nas_stream_eea1.c
+361
-0
openair-cn/SECU/rijndael.c
openair-cn/SECU/rijndael.c
+3
-2
openair-cn/SECU/secu_defs.h
openair-cn/SECU/secu_defs.h
+4
-1
openair-cn/SECU/snow3g.h
openair-cn/SECU/snow3g.h
+1
-1
No files found.
openair-cn/SECU/nas_stream_eea1.c
0 → 100755
View file @
9f158b57
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <nettle/nettle-meta.h>
#include <nettle/aes.h>
#include <nettle/ctr.h>
#include "assertions.h"
#include "conversions.h"
#include "secu_defs.h"
#include "snow3g.h"
#include "test_util.h"
// #define SECU_DEBUG
void
small_test
()
{
/* Test Set 1
* input : Key and IV
* output : z1 and z2
*/
printf
(
"Set of tests for Snow3G
\n
"
);
uint32_t
k
[
4
];
/*Key */
uint32_t
IV
[
4
];
uint32_t
ks
[
2
];
uint32_t
zf1
;
/*output 1*/
uint32_t
zf2
;
/*output 2*/
int
success
=
0
;
int
fail
=
0
;
snow_3g_context_t
snow_3g_context
;
memset
(
&
snow_3g_context
,
0
,
sizeof
(
snow_3g_context
));
printf
(
"---------------------------------- TEST SET 1 ----------------------------------
\n
"
);
printf
(
"key = 2B D6 45 9F 82 C5 B3 00 95 2C 49 10 48 81 FF 48
\n
"
);
printf
(
"IV = EA 02 47 14 AD 5C 4D 84 DF 1F 9B 25 1C 0B F4 5F
\n
"
);
zf1
=
0xabee9704
;
zf2
=
0x7ac31373
;
k
[
0
]
=
0x2BD6459F
;
k
[
1
]
=
0x82C5B300
;
k
[
2
]
=
0x952C4910
;
k
[
3
]
=
0x4881FF48
;
IV
[
0
]
=
0xEA024714
;
IV
[
1
]
=
0xAD5C4D84
;
IV
[
2
]
=
0xDF1F9B25
;
IV
[
3
]
=
0x1C0BF45F
;
printf
(
"Initialisation Mode
\n
"
);
snow3g_initialize
(
k
,
IV
,
&
snow_3g_context
);
printf
(
"Keystream Mode
\n
"
);
snow3g_generate_key_stream
(
2
,(
uint32_t
*
)
ks
,
&
snow_3g_context
);
if
(
ks
[
0
]
==
zf1
&&
ks
[
1
]
==
zf2
){
printf
(
" z1 = 0x%x
\n
"
,
ks
[
0
]);
printf
(
" z2 = 0x%x
\n
"
,
ks
[
1
]);
printf
(
"TEST 1 OK !
\n
"
);
success
=
success
+
1
;
}
else
{
printf
(
"TEST 1 Failed !
\n
"
);
fail
=
fail
+
1
;
}
/*---------------------------TEST 2--------------------------------*/
memset
(
&
snow_3g_context
,
0
,
sizeof
(
snow_3g_context
));
printf
(
"---------------------------------- TEST SET 2 ----------------------------------
\n
"
);
printf
(
"key = 8C E3 3E 2C C3 C0 B5 FC 1F 3D E8 A6 DC 66 B1 F3
\n
"
);
printf
(
"IV = D3 C5 D5 92 32 7F B1 1C DE 55 19 88 CE B2 F9 B7
\n
"
);
zf1
=
0xeff8a342
;
zf2
=
0xf751480f
;
k
[
0
]
=
0x8CE33E2C
;
k
[
1
]
=
0xC3C0B5FC
;
k
[
2
]
=
0x1F3DE8A6
;
k
[
3
]
=
0xDC66B1F3
;
IV
[
0
]
=
0xD3C5D592
;
IV
[
1
]
=
0x327FB11C
;
IV
[
2
]
=
0xDE551988
;
IV
[
3
]
=
0xCEB2F9B7
;
printf
(
"Initialisation Mode
\n
"
);
snow3g_initialize
(
k
,
IV
,
&
snow_3g_context
);
printf
(
"Keystream Mode
\n
"
);
snow3g_generate_key_stream
(
2
,
ks
,
&
snow_3g_context
);
if
(
ks
[
0
]
==
zf1
&&
ks
[
1
]
==
zf2
){
printf
(
" z1 = 0x%x
\n
"
,
ks
[
0
]);
printf
(
" z2 = 0x%x
\n
"
,
ks
[
1
]);
printf
(
"TEST 2 OK !
\n
"
);
success
=
success
+
1
;
}
else
{
printf
(
"TEST 2 Failed !
\n
"
);
fail
=
fail
+
1
;
}
/*---------------------------TEST 3--------------------------------*/
printf
(
"---------------------------------- TEST SET 3 ----------------------------------
\n
"
);
printf
(
"key = 40 35 C6 68 0A F8 C6 D1 A8 FF 86 67 B1 71 40 13
\n
"
);
printf
(
"IV = 62 A5 40 98 1B A6 F9 B7 45 92 B0 E7 86 90 F7 1B
\n
"
);
zf1
=
0xa8c874a9
;
zf2
=
0x7ae7c4f8
;
k
[
0
]
=
0x4035C668
;
k
[
1
]
=
0x0AF8C6D1
;
k
[
2
]
=
0xA8FF8667
;
k
[
3
]
=
0xB1714013
;
IV
[
0
]
=
0x62A54098
;
IV
[
1
]
=
0x1BA6F9B7
;
IV
[
2
]
=
0x4592B0E7
;
IV
[
3
]
=
0x8690F71B
;
printf
(
"Initialisation Mode
\n
"
);
snow3g_initialize
(
k
,
IV
,
&
snow_3g_context
);
printf
(
"Keystream Mode
\n
"
);
snow3g_generate_key_stream
(
2
,
ks
,
&
snow_3g_context
);
if
(
ks
[
0
]
==
zf1
&&
ks
[
1
]
==
zf2
){
printf
(
" z1 = 0x%x
\n
"
,
ks
[
0
]);
printf
(
" z2 = 0x%x
\n
"
,
ks
[
1
]);
printf
(
"TEST 3 OK !
\n
"
);
success
=
success
+
1
;
}
else
{
printf
(
"TEST 3 Failed !
\n
"
);
fail
=
fail
+
1
;
}
/*---------------------------TEST 4--------------------------------*/
printf
(
"---------------------------------- TEST SET 4 ----------------------------------
\n
"
);
printf
(
"key = 0D ED 72 63 10 9C F9 2E 33 52 25 5A 14 0E 0F 76
\n
"
);
printf
(
"IV = 6B 68 07 9A 41 A7 C4 C9 1B EF D7 9F 7F DC C2 33
\n
"
);
zf1
=
0xd712c05c
;
zf2
=
0xa937c2a6
;
uint32_t
zf3
=
0xeb7eaae3
;
uint32_t
zf2500
=
0x9c0db3aa
;
uint32_t
ks2
[
2500
];
k
[
0
]
=
0x0DED7263
;
k
[
1
]
=
0x109CF92E
;
k
[
2
]
=
0x3352255A
;
k
[
3
]
=
0x140E0F76
;
IV
[
0
]
=
0x6B68079A
;
IV
[
1
]
=
0x41A7C4C9
;
IV
[
2
]
=
0x1BEFD79F
;
IV
[
3
]
=
0x7FDCC233
;
printf
(
"Initialisation Mode
\n
"
);
snow3g_initialize
(
k
,
IV
,
&
snow_3g_context
);
printf
(
"Keystream Mode
\n
"
);
snow3g_generate_key_stream
(
2500
,
ks2
,
&
snow_3g_context
);
if
(
ks2
[
0
]
==
zf1
&&
ks2
[
1
]
==
zf2
&&
ks2
[
2
]
==
zf3
&&
ks2
[
2499
]
==
zf2500
){
printf
(
" z1 = 0x%x
\n
"
,
ks2
[
0
]);
printf
(
" z2 = 0x%x
\n
"
,
ks2
[
1
]);
printf
(
" z3 = 0x%x
\n
"
,
ks2
[
2
]);
printf
(
" ...
\n
"
);
printf
(
" z2500 = 0x%x
\n
"
,
ks2
[
2499
]);
printf
(
"TEST 4 OK !
\n
"
);
success
=
success
+
1
;
}
else
{
printf
(
"TEST 4 Failed !
\n
"
);
fail
=
fail
+
1
;
}
printf
(
"
\n
"
);
printf
(
"
\n
"
);
printf
(
"4 tests run, %d succeded, %d failed.
\n
"
,
success
,
fail
);
}
int
nas_stream_encrypt_eea1
(
nas_stream_cipher_t
*
stream_cipher
,
uint8_t
**
out
)
{
snow_3g_context_t
snow_3g_context
;
int
n
;
int
i
=
0
;
uint32_t
zero_bit
=
0
;
uint32_t
byte_length
;
uint32_t
*
KS
;
uint32_t
K
[
4
],
IV
[
4
];
DevAssert
(
stream_cipher
!=
NULL
);
DevAssert
(
stream_cipher
->
key
!=
NULL
);
DevAssert
(
stream_cipher
->
key_length
==
16
);
DevAssert
(
out
!=
NULL
);
n
=
(
stream_cipher
->
blength
+
31
)
/
32
;
zero_bit
=
stream_cipher
->
blength
&
0x7
;
byte_length
=
stream_cipher
->
blength
>>
3
;
memset
(
&
snow_3g_context
,
0
,
sizeof
(
snow_3g_context
));
/*Initialisation*/
/* Load the confidentiality key for SNOW 3G initialization as in section
3.4. */
memcpy
(
K
+
3
,
stream_cipher
->
key
+
0
,
4
);
/*K[3] = key[0]; we assume
K[3]=key[0]||key[1]||...||key[31] , with key[0] the
* most important bit of key*/
memcpy
(
K
+
2
,
stream_cipher
->
key
+
4
,
4
);
/*K[2] = key[1];*/
memcpy
(
K
+
1
,
stream_cipher
->
key
+
8
,
4
);
/*K[1] = key[2];*/
memcpy
(
K
+
0
,
stream_cipher
->
key
+
12
,
4
);
/*K[0] = key[3]; we assume
K[0]=key[96]||key[97]||...||key[127] , with key[127] the
* least important bit of key*/
K
[
3
]
=
hton_int32
(
K
[
3
]);
K
[
2
]
=
hton_int32
(
K
[
2
]);
K
[
1
]
=
hton_int32
(
K
[
1
]);
K
[
0
]
=
hton_int32
(
K
[
0
]);
/* Prepare the initialization vector (IV) for SNOW 3G initialization as in
section 3.4. */
IV
[
3
]
=
stream_cipher
->
count
;
IV
[
2
]
=
((((
uint32_t
)
stream_cipher
->
bearer
)
<<
3
)
|
((((
uint32_t
)
stream_cipher
->
direction
)
&
0x1
)
<<
2
))
<<
24
;
IV
[
1
]
=
IV
[
3
];
IV
[
0
]
=
IV
[
2
];
printf
(
"K:
\n
"
);
hexprint
(
K
,
16
);
printf
(
"K[0]:%08X
\n
"
,
K
[
0
]);
printf
(
"K[1]:%08X
\n
"
,
K
[
1
]);
printf
(
"K[2]:%08X
\n
"
,
K
[
2
]);
printf
(
"K[3]:%08X
\n
"
,
K
[
3
]);
printf
(
"IV:
\n
"
);
hexprint
(
IV
,
16
);
printf
(
"IV[0]:%08X
\n
"
,
IV
[
0
]);
printf
(
"IV[1]:%08X
\n
"
,
IV
[
1
]);
printf
(
"IV[2]:%08X
\n
"
,
IV
[
2
]);
printf
(
"IV[3]:%08X
\n
"
,
IV
[
3
]);
/* Run SNOW 3G algorithm to generate sequence of key stream bits KS*/
snow3g_initialize
(
K
,
IV
,
&
snow_3g_context
);
KS
=
(
uint32_t
*
)
malloc
(
4
*
n
);
snow3g_generate_key_stream
(
n
,(
uint32_t
*
)
KS
,
&
snow_3g_context
);
if
(
zero_bit
>
0
)
{
printf
(
"changing KS[%u]: %08X to %08X remove %d bits
\n
"
,
n
-
1
,
KS
[
n
-
1
],
KS
[
n
-
1
]
&
(
uint32_t
)(
0xFFFFFFFF
<<
(
8
-
zero_bit
)),
8
-
zero_bit
);
KS
[
n
-
1
]
=
KS
[
n
-
1
]
&
(
uint32_t
)(
0xFFFFFFFF
<<
(
8
-
zero_bit
));
}
for
(
i
=
0
;
i
<
n
;
i
++
)
{
KS
[
i
]
=
hton_int32
(
KS
[
i
]);
}
printf
(
"KS:
\n
"
);
hexprint
(
KS
,
4
*
n
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
printf
(
"KS[%u]:%08X
\n
"
,
i
,
KS
[
i
]);
}
/* Exclusive-OR the input data with keystream to generate the output bit
stream */
for
(
i
=
0
;
i
<
n
*
4
;
i
++
)
{
stream_cipher
->
message
[
i
]
^=
*
(((
uint8_t
*
)
KS
)
+
i
);
}
if
(
zero_bit
>
0
)
{
int
ceil_index
=
(
stream_cipher
->
blength
+
7
)
>>
3
;
printf
(
"changing stream_cipher->message[%u]: %08X to %08X remove %d bits
\n
"
,
ceil_index
-
1
,
stream_cipher
->
message
[
ceil_index
-
1
],
stream_cipher
->
message
[
ceil_index
-
1
]
&
(
uint8_t
)(
0xFF
<<
(
8
-
zero_bit
)),
8
-
zero_bit
);
stream_cipher
->
message
[
ceil_index
-
1
]
=
stream_cipher
->
message
[
ceil_index
-
1
]
&
(
uint8_t
)(
0xFF
<<
(
8
-
zero_bit
));
}
free
(
KS
);
*
out
=
stream_cipher
->
message
;
/* uint32_t local_count;
uint32_t zero_bit = 0;
uint32_t m_length;
snow_3g_context_t snow_3g_context;
uint32_t k[4];
uint32_t IV[4];
uint32_t *z = NULL;
uint32_t *OBS = NULL;
uint64_t L;
uint8_t *KS8 = NULL;
int i;
DevAssert(stream_cipher != NULL);
DevAssert(stream_cipher->key != NULL);
DevAssert(stream_cipher->key_length == 16);
DevAssert(out != NULL);
memset(&snow_3g_context, 0, sizeof(snow_3g_context));
zero_bit = stream_cipher->blength & 0x7;
m_length = stream_cipher->blength >> 3;
if (zero_bit > 0)
m_length += 1;
local_count = hton_int32(stream_cipher->count);
#warning "endianess"
// SPEC says: K3 = CK[0] || CK[1] || CK[2] || ... || CK[31]
// SPEC says: K2 = CK[32] || CK[33] || CK[34] || ... || CK[63]
// SPEC says: K1 = CK[64] || CK[65] || CK[66] || ... || CK[95]
// SPEC says: K0 = CK[96] || CK[97] || CK[98] || ... || CK[127]
k[3] = ((uint32_t*)&stream_cipher->key[0])[0]; k[3] = hton_int32(k[3]);
k[2] = ((uint32_t*)&stream_cipher->key[4])[0]; k[2] = hton_int32(k[2]);
k[1] = ((uint32_t*)&stream_cipher->key[8])[0]; k[1] = hton_int32(k[1]);
k[0] = ((uint32_t*)&stream_cipher->key[12])[0];k[0] = hton_int32(k[0]);
// SPEC says: IV3 = COUNT-C[0] || COUNT-C[1] || COUNT-C[2] || ... || COUNT-C[31]
// SPEC says: IV2 = BEARER[0] || BEARER[1] || ... || BEARER[4] || DIRECTION[0] || 0 || ... || 0
// SPEC says: IV1 = COUNT-C[0] || COUNT-C[1] || COUNT-C[2] || ... || COUNT-C[31]
// SPEC says: IV0 = BEARER[0] || BEARER[1] || ... || BEARER[4] || DIRECTION[0] || 0 || ... || 0
IV[3] = stream_cipher->count;// local_count; // NOT SURE endianess
IV[2] = (((uint32_t)(stream_cipher->bearer & 0x1F)) << 27) | (((uint32_t)(stream_cipher->direction & 0x01)) << 26);
IV[3] = stream_cipher->count;// local_count; // NOT SURE endianess
IV[0] = (((uint32_t)(stream_cipher->bearer & 0x1F)) << 27) | (((uint32_t)(stream_cipher->direction & 0x01)) << 26);
// SPEC says: SNOW 3G is initialised as described in document [5].
snow3g_initialize(k, IV, &snow_3g_context);
// 3.5. Keystream Generation
//
// Set L = LENGTH / 32.
//
// SNOW 3G is run as described in document [5] to produce the keystream consisting of the 32-
// bit words z1 ... zL. The word produced first is z1, the next word z2 and so on.
//
// The sequence of keystream bits is KS[0] ... KS[LENGTH-1], where KS[0] is the most
// significant bit and KS[31] is the least significant bit of z1, KS[32] is the most significant bit of
// z2 and so on.
L = (stream_cipher->blength + 31)/32;
z = malloc(L*sizeof(*z));
OBS = z;
DevAssert(z != NULL);
snow3g_generate_key_stream(L, z, &snow_3g_context);
KS8 = (uint8_t*)z;
// 3.6.Encryption/Decryption
//
// Encryption/decryption operations are identical operations and are performed by the exclusive-
// OR of the input data (IBS) with the generated keystream (KS).
//
// For each integer i with 0 ≤ i ≤ LENGTH-1 we define:
//
// OBS[i] = IBS[i] ⊕ KS[i].
for (i = 0; i < m_length; i++) {
OBS[i] = OBS[i] ^ KS8[i];
}
*out = OBS;
*/
return
0
;
}
openair-cn/SECU/rijndael.c
View file @
9f158b57
#include <stdint.h>
/* Rijndael S-box SR */
u
8
SR
[
256
]
=
{
u
int8_t
SR
[
256
]
=
{
0x63
,
0x7C
,
0x77
,
0x7B
,
0xF2
,
0x6B
,
0x6F
,
0xC5
,
0x30
,
0x01
,
0x67
,
0x2B
,
0xFE
,
0xD7
,
0xAB
,
0x76
,
0xCA
,
0x82
,
0xC9
,
0x7D
,
0xFA
,
0x59
,
0x47
,
0xF0
,
0xAD
,
0xD4
,
0xA2
,
0xAF
,
0x9C
,
0xA4
,
0x72
,
0xC0
,
0xB7
,
0xFD
,
0x93
,
0x26
,
0x36
,
0x3F
,
0xF7
,
0xCC
,
0x34
,
0xA5
,
0xE5
,
0xF1
,
0x71
,
0xD8
,
0x31
,
0x15
,
...
...
@@ -21,7 +22,7 @@ u8 SR[256] = {
/* S-box SQ */
u
8
SQ
[
256
]
=
{
u
int8_t
SQ
[
256
]
=
{
0x25
,
0x24
,
0x73
,
0x67
,
0xD7
,
0xAE
,
0x5C
,
0x30
,
0xA4
,
0xEE
,
0x6E
,
0xCB
,
0x7D
,
0xB5
,
0x82
,
0xDB
,
0xE4
,
0x8E
,
0x48
,
0x49
,
0x4F
,
0x5D
,
0x6A
,
0x78
,
0x70
,
0x88
,
0xE8
,
0x5F
,
0x5E
,
0x84
,
0x65
,
0xE2
,
0xD8
,
0xE9
,
0xCC
,
0xED
,
0x40
,
0x2F
,
0x11
,
0x28
,
0x57
,
0xD2
,
0xAC
,
0xE3
,
0x4A
,
0x15
,
0x1B
,
0xB9
,
...
...
openair-cn/SECU/secu_defs.h
View file @
9f158b57
...
...
@@ -15,7 +15,6 @@
#define SECU_DIRECTION_UPLINK 0
#define SECU_DIRECTION_DOWNLINK 1
inline
void
kdf
(
const
uint8_t
*
s
,
const
uint32_t
s_length
,
const
uint8_t
*
key
,
const
uint32_t
key_length
,
uint8_t
**
out
,
uint32_t
out_length
);
...
...
@@ -56,6 +55,10 @@ typedef struct {
uint32_t
blength
;
}
nas_stream_cipher_t
;
int
nas_stream_encrypt_eea1
(
nas_stream_cipher_t
*
stream_cipher
,
uint8_t
**
out
);
int
nas_stream_encrypt_eia1
(
nas_stream_cipher_t
*
stream_cipher
,
uint8_t
out
[
4
]);
int
nas_stream_encrypt_eea2
(
nas_stream_cipher_t
*
stream_cipher
,
uint8_t
**
out
);
int
nas_stream_encrypt_eia2
(
nas_stream_cipher_t
*
stream_cipher
,
uint8_t
out
[
4
]);
...
...
openair-cn/SECU/snow3g.h
View file @
9f158b57
...
...
@@ -81,6 +81,6 @@ void snow3g_initialize(uint32_t k[4], uint32_t IV[4], snow_3g_context_t *snow_3g
* output: generated keystream which is filled in z
*/
void
snow3g_generate_keystream
(
uint32_t
n
,
uint32_t
*
z
,
snow_3g_context_t
*
snow_3g_context_pP
);
void
snow3g_generate_key
_
stream
(
uint32_t
n
,
uint32_t
*
z
,
snow_3g_context_t
*
snow_3g_context_pP
);
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment