- espsecret_xform = xf;
-
- colon++;
- if(colon[0]=='0' && colon[1]=='x') {
- /* decode some hex! */
- colon+=2;
- len = strlen(colon) / 2;
- espsecret_key = (char *)malloc(len);
- if(espsecret_key == NULL) {
- fprintf(stderr, "%s: ran out of memory (%d) to allocate secret key\n",
- program_name, len);
- exit(2);
+
+ if (decode) {
+ char *colon, *p;
+ char espsecret_key[256];
+ int len;
+ size_t i;
+ const EVP_CIPHER *evp;
+ int authlen = 0;
+
+ /* skip any blank spaces */
+ while (isspace((unsigned char)*decode))
+ decode++;
+
+ colon = strchr(decode, ':');
+ if (colon == NULL) {
+ (*ndo->ndo_warning)(ndo, "failed to decode espsecret: %s\n", decode);
+ return;
+ }
+ *colon = '\0';
+
+ len = colon - decode;
+ if (strlen(decode) > strlen("-hmac96") &&
+ !strcmp(decode + strlen(decode) - strlen("-hmac96"),
+ "-hmac96")) {
+ p = strstr(decode, "-hmac96");
+ *p = '\0';
+ authlen = 12;
+ }
+ if (strlen(decode) > strlen("-cbc") &&
+ !strcmp(decode + strlen(decode) - strlen("-cbc"), "-cbc")) {
+ p = strstr(decode, "-cbc");
+ *p = '\0';
+ }
+ evp = EVP_get_cipherbyname(decode);
+ if (!evp) {
+ (*ndo->ndo_warning)(ndo, "failed to find cipher algo %s\n", decode);
+ sa1.evp = NULL;
+ sa1.authlen = 0;
+ sa1.ivlen = 0;
+ return;
+ }
+
+ sa1.evp = evp;
+ sa1.authlen = authlen;
+ sa1.ivlen = EVP_CIPHER_iv_length(evp);
+
+ colon++;
+ if (colon[0] == '0' && colon[1] == 'x') {
+ /* decode some hex! */
+ colon += 2;
+ len = strlen(colon) / 2;
+
+ if (len > 256) {
+ (*ndo->ndo_warning)(ndo, "secret is too big: %d\n", len);
+ return;
+ }
+
+ i = 0;
+ while (colon[0] != '\0' && colon[1]!='\0') {
+ espsecret_key[i] = hex2byte(ndo, colon);
+ colon += 2;
+ i++;
+ }
+
+ memcpy(sa1.secret, espsecret_key, i);
+ sa1.secretlen = i;
+ } else {
+ i = strlen(colon);
+
+ if (i < sizeof(sa1.secret)) {
+ memcpy(sa1.secret, colon, i);
+ sa1.secretlen = i;
+ } else {
+ memcpy(sa1.secret, colon, sizeof(sa1.secret));
+ sa1.secretlen = sizeof(sa1.secret);
+ }