WvStreams
wvoakley.cc
00001 /*
00002  * Worldvisions Weaver Software:
00003  * Copyright (C) 2003 Net Integration Technologies, Inc.
00004  *
00005  * Oakley authentication for IPSec
00006  */
00007 
00008 #include "wvoakley.h"
00009 
00010 /* Group 1 prime */
00011 static unsigned char group1_key[] =
00012 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 
00013   0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
00014   0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 
00015   0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
00016   0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
00017   0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
00018   0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 
00019   0xA6, 0x3A, 0x36, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
00020 };
00021 
00022 /* Group 2 prime */
00023 static unsigned char group2_key[] = 
00024 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 
00025   0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
00026   0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 
00027   0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
00028   0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 
00029   0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
00030   0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 
00031   0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
00032   0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 
00033   0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,
00034   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
00035 };
00036 
00037 WvOakleyAuth::WvOakleyAuth(int group)
00038 {
00039     switch (group)
00040     {
00041     case 1:
00042         dh = new WvDiffieHellman(group1_key, sizeof(group1_key), 
00043                                  DH_GENERATOR_2);
00044         break;
00045     case 2:
00046         dh = new WvDiffieHellman(group2_key, sizeof(group2_key), 
00047                                  DH_GENERATOR_2);
00048         break;
00049     case 3: case 4:
00050         /* We don't support any eliptic curve stuff. */
00051         break;
00052     }
00053     pub_len = dh->pub_key_len();
00054 }
00055 
00056 short WvOakleyAuth::public_len()
00057 {
00058     return pub_len;
00059 }
00060 
00061 short WvOakleyAuth::get_public_key(WvBuf &outbuf, short len)
00062 {
00063     return dh->get_public_value(outbuf, len);
00064 }
00065 
00066 void WvOakleyAuth::create_secret(WvBuf &_other_pub_key, short len)
00067 {
00068     other_pub_key.put(_other_pub_key.peek(0, len), len);
00069     other_len = len;
00070     dh->create_secret(_other_pub_key, len, dh_secret);
00071     return;
00072 }
00073 
00074 short WvOakleyAuth::other_pub_len()
00075 {
00076     return other_len;
00077 }
00078 
00079 short WvOakleyAuth::get_other_public_key(WvBuf &outbuf, short len)
00080 {
00081     if (len > other_len)
00082         len = other_len;
00083 
00084     outbuf.put(other_pub_key.peek(0, len), len);
00085     return len;
00086 }