0x7BB9E153, 0x63B6A19E, 0x4BA76160, 0x53A821AD, 0x1B854835, 0x038A08F8, 0x2B9BC806, 0x339488CB,
0xBBC11A9F, 0xA3CE5A52, 0x8BDF9AAC, 0x93D0DA61, 0xDBFDB3F9, 0xC3F2F334, 0xEBE333CA, 0xF3EC7307,
0xA492D5C4, 0xBC9D9509, 0x948C55F7, 0x8C83153A, 0xC4AE7CA2, 0xDCA13C6F, 0xF4B0FC91, 0xECBFBC5C,
0x64EA2E08, 0x7CE56EC5, 0x54F4AE3B, 0x4CFBEEF6, 0x04D6876E, 0x1CD9C7A3, 0x34C8075D, 0x2CC74790,
0x8D628AF5, 0x956DCA38, 0xBD7C0AC6, 0xA5734A0B, 0xED5E2393, 0xF551635E, 0xDD40A3A0, 0xC54FE36D,
0x4D1A7139, 0x551531F4, 0x7D04F10A, 0x650BB1C7, 0x2D26D85F, 0x35299892, 0x1D38586C, 0x053718A1,
0xF6DB6BA6, 0xEED42B6B, 0xC6C5EB95, 0xDECAAB58, 0x96E7C2C0, 0x8EE8820D, 0xA6F942F3, 0xBEF6023E,
0x36A3906A, 0x2EACD0A7, 0x06BD1059, 0x1EB25094, 0x569F390C, 0x4E9079C1, 0x6681B93F, 0x7E8EF9F2,
0xDF2B3497, 0xC724745A, 0xEF35B4A4, 0xF73AF469, 0xBF179DF1, 0xA718DD3C, 0x8F091DC2, 0x97065D0F,
0x1F53CF5B, 0x075C8F96, 0x2F4D4F68, 0x37420FA5, 0x7F6F663D, 0x676026F0, 0x4F71E60E, 0x577EA6C3,
0xE18D0321, 0xF98243EC, 0xD1938312, 0xC99CC3DF, 0x81B1AA47, 0x99BEEA8A, 0xB1AF2A74, 0xA9A06AB9,
0x21F5F8ED, 0x39FAB820, 0x11EB78DE, 0x09E43813, 0x41C9518B, 0x59C61146, 0x71D7D1B8, 0x69D89175,
0xC87D5C10, 0xD0721CDD, 0xF863DC23, 0xE06C9CEE, 0xA841F576, 0xB04EB5BB, 0x985F7545, 0x80503588,
0x0805A7DC, 0x100AE711, 0x381B27EF, 0x20146722, 0x68390EBA, 0x70364E77, 0x58278E89, 0x4028CE44,
0xB3C4BD43, 0xABCBFD8E, 0x83DA3D70, 0x9BD57DBD, 0xD3F81425, 0xCBF754E8, 0xE3E69416, 0xFBE9D4DB,
0x73BC468F, 0x6BB30642, 0x43A2C6BC, 0x5BAD8671, 0x1380EFE9, 0x0B8FAF24, 0x239E6FDA, 0x3B912F17,
0x9A34E272, 0x823BA2BF, 0xAA2A6241, 0xB225228C, 0xFA084B14, 0xE2070BD9, 0xCA16CB27, 0xD2198BEA,
0x5A4C19BE, 0x42435973, 0x6A52998D, 0x725DD940, 0x3A70B0D8, 0x227FF015, 0x0A6E30EB, 0x12617026,
0x451FD6E5, 0x5D109628, 0x750156D6, 0x6D0E161B, 0x25237F83, 0x3D2C3F4E, 0x153DFFB0, 0x0D32BF7D,
0x85672D29, 0x9D686DE4, 0xB579AD1A, 0xAD76EDD7, 0xE55B844F, 0xFD54C482, 0xD545047C, 0xCD4A44B1,
0x6CEF89D4, 0x74E0C919, 0x5CF109E7, 0x44FE492A, 0x0CD320B2, 0x14DC607F, 0x3CCDA081, 0x24C2E04C,
0xAC977218, 0xB49832D5, 0x9C89F22B, 0x8486B2E6, 0xCCABDB7E, 0xD4A49BB3, 0xFCB55B4D, 0xE4BA1B80,
0x17566887, 0x0F59284A, 0x2748E8B4, 0x3F47A879, 0x776AC1E1, 0x6F65812C, 0x477441D2, 0x5F7B011F,
0xD72E934B, 0xCF21D386, 0xE7301378, 0xFF3F53B5, 0xB7123A2D, 0xAF1D7AE0, 0x870CBA1E, 0x9F03FAD3,
0x3EA637B6, 0x26A9777B, 0x0EB8B785, 0x16B7F748, 0x5E9A9ED0, 0x4695DE1D, 0x6E841EE3, 0x768B5E2E,
0xFEDECC7A, 0xE6D18CB7, 0xCEC04C49, 0xD6CF0C84, 0x9EE2651C, 0x86ED25D1, 0xAEFCE52F, 0xB6F3A5E2
static unsigned int automaton_step(sosemanuk_state *state)
unsigned int *r = state-&gt;r;
unsigned int *s = state-&gt;s;
unsigned int r0_prev = r[0];
unsigned char t = state-&gt;t;
r[0] = r[1] + ((r0_prev &amp; 1u) ? s[(t+1)%10] ^ s[(t+8)%10] : s[(t+1)%10]);
r[1] = rotl(r0_prev * 0x54655307, 7);
return (s[(t+9)%10] + r[0]) ^ r[1];
static unsigned int lfsr_step(sosemanuk_state *state)
unsigned int *s = state-&gt;s;
unsigned char t = state-&gt;t;
unsigned int st0 = s[t];
unsigned int st3 = s[(t+3)%10];
s[t] = s[(t+9)%10] ^ (st3 » 8) ^ div_a[st3 &amp; 0xff] ^ (st0 « 8) ^ mul_a[st0 » 24];
state-&gt;t = (t+1) % 10;
return st0;
static inline void sbox_apply(unsigned char sbox_idx, unsigned int *in, unsigned int *out)
register unsigned int t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15;
switch(sbox_idx)
case 0: sb0(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
case 1: sb1(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
case 2: sb2(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
case 3: sb3(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
case 4: sb4(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
case 5: sb5(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
case 6: sb6(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
case 7: sb7(in[0], in[1], in[2], in[3], out[0], out[1], out[2], out[3]); break;
void sosemanuk_init_key(sosemanuk_master_state *state, const unsigned char *key, size_t bitlength)
unsigned int w[108];
unsigned int i;
int fullwords = bitlength / 32;
for(i = 0; i &lt; fullwords; ++i)
w[i] = *((unsigned int*)(key + (i*4)));
int partial = bitlength % 32;
if(partial)
unsigned int tmp = 0;
int j;
int fullbytes = partial / 8;
for(j = 0; j &lt; fullbytes; ++j)
tmp |= (unsigned int)key[i*4 + j] « (j*8);
int bitpartial = partial % 8;
if(bitpartial)
unsigned char extra_bit = 1u « bitpartial;
tmp |= (unsigned int)((key[i*4 + j] &amp; (extra_bit - 1)) | extra_bit) « (j*8);
} else {
tmp |= 1u « partial;
w[i++] = tmp;
else if(bitlength &lt; 256)
w[i++] = 1u;
for(; i &lt; 8; ++i)
w[i] = 0;
for(; i &lt; 108; ++i)
w[i] = rotl(w[i - 8] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ 0x9e3779b9u ^ (i-8), 11);
for(i = 0; i &lt; 8; ++i)
unsigned char sbox_idx = 7 - (i+4) % 8;
int j;
for(j = i; j &lt; 25; j += 8)
sbox_apply(sbox_idx, &amp;w[8 + j*4], &amp;state-&gt;k[j*4]);
static void serpent_round(const sosemanuk_master_state *master, int idx, unsigned int *data)
int i;
unsigned int tmp[4];
for(i = 0; i &lt; 4; ++i)
tmp[i] = data[i] ^ master-&gt;k[idx*4 + i];
sbox_apply(idx % 8, tmp, data);
data[0] = rotl(data[0], 13);
data[2] = rotl(data[2], 3);
data[1] = data[1] ^ data[0] ^ data[2];
data[3] = data[3] ^ data[2] ^ (data[0] « 3);
data[1] = rotl(data[1], 1);
data[3] = rotl(data[3], 7);
data[0] = data[0] ^ data[1] ^ data[3];
data[2] = data[2] ^ data[3] ^ (data[1] « 7);
data[0] = rotl(data[0], 5);
data[2] = rotl(data[2], 22);
void sosemanuk_init_iv(sosemanuk_state *iv_state, const sosemanuk_master_state *master, const unsigned char *iv)
int i;
unsigned int *s = iv_state-&gt;s;
unsigned int *r = iv_state-&gt;r;
iv_state-&gt;t = 0;
unsigned int data[4];
for(i = 0; i &lt; 4; ++i)
data[i] = *((unsigned int*)(iv + (i * 4)));
for(i = 0; i &lt; 12; ++i)
serpent_round(master, i, data);
s[9] = data[0];
s[8] = data[1];
s[7] = data[2];
s[6] = data[3];
for(; i &lt; 18; ++i)
serpent_round(master, i, data);
r[0] = data[0];
r[1] = data[2];
s[5] = data[3];
s[4] = data[1];
for(; i &lt; 24; ++i)
serpent_round(master, i, data);
const unsigned int *sk = master-&gt;k;
s[3] = data[0] ^ sk[96];
s[2] = data[1] ^ sk[97];
s[1] = data[2] ^ sk[98];
s[0] = data[3] ^ sk[99];
void sosemanuk_extract(sosemanuk_state *state, unsigned char *stream)
unsigned int f[4];
unsigned int s[4];
for(int i = 0; i &lt; 4; ++i)
f[i] = automaton_step(state);
s[i] = lfsr_step(state);
unsigned int *stream32 = (unsigned int*)stream;
sbox_apply(2, f, stream32);
for(int i = 0; i &lt; 4; ++i)
*((unsigned int*)(stream + (i*4))) = stream32[i] ^ s[i];
ליברמור
ליברמור (באנגלית: Livermore, לשעבר: Livermores, Livermore Ranch ו-Nottingham) היא עיר במחוז אלמידה שבקליפורניה, ארצות הברית. העיר שוכנת בשוליים המזרחיים של אזור מפרץ סן פרנסיסקו (The San Francisco Bay Area).
ליברמור נוסדה על ידי ויליאם מנדנהול (Mendenhall) ונקראה על שמו של רוברט ליברמור, ידידו וחוואי שהתיישב באזור בשנות הארבעים של המאה ה-19. בעיר שוכנת המעבדה הלאומית לורנס ליברמור, על שמו של הפיזיקאי ארנסט לורנס. על שמה של המעבדה נקרא היסוד הכימי ליברמוריום, כך ששם העיר נכנס לטבלה המחזורית. בחלקה הדרומי של העיר משתרעים כרמי גפנים.
גאוגרפיה.
העמק בו שוכנת ליברמור משתרע במרחק של 48 ק"מ ממזרח ומעבר לרכס הרי החוף הראשון שמקיף את אזור מפרץ סן פרנסיסקו. עמק ליברמור משתרע בכיוון מזרח-מערב כשמעברי ההרים במזרח ובמערב מקשרים אותו לעמק המרכזי (Central Valley). מעברי ההרים משמשים את מסילות הרכבת ואת הכבישים המהירים שמחברים בין שני העמקים. אורכו של עמק ליברמור הוא כ-24 ק"מ ורוחבו הוא כ-16 ק"מ. האדמה המקומית היא אדמת חצץ עם ניקוז מעולה. קיימים כמה אתרי הפקת חצץ מחוץ לעיר. האדמה החצצית והאקלים הים-תיכוני מעצימים את ריכוז הטעם של הענבים הגדלים באזור.
אקלים.