[wpkg-users] user password in settings.xml for wpkg client
Grzegorz Marszałek
graf0 at post.pl
Thu Apr 24 19:03:48 CEST 2008
Wiadomość napisana w dniu 2008-04-24, o godz 17:45, przez Jason
Castonguay:
>>> OK, the problem is, that wpkg client scrambles it's password in
>>> settings.xml file. I'd like to have random passowrd for each
>>> server I manage. There is no problem to generate settings.xml
>>> file (and thus ease installation on wpkg client on workstation),
>>> but do you know what algorithm is used to scrable password? I'd
>>> like to recreate it my script.
>> Currently, there is no tool for creating the password (other than
>> wpkginst.exe).
>> But it would be a good idea to create one (command line), both for
>> Windows and UNIX.
>
> Its ugly, but quick.
>
>
>
> $ g++ xmlsettings.cc
>
> $ ./a.out asdf
> MYTmDw==
> :0?
>
> $ ./a.out MYTmDw==
> Ha7WBK5a4BA=
> asdf
>
>
> --
> Jason Castonguay
> Greenpeace USA
> System Administrator
> 702 H Street, NW
> Suite 300
> Washington, DC
> 20001
> // Copyright (C) 2001-2002 Open Source Telecom Corporation.
> //
> // This program is free software; you can redistribute it and/or
> modify
> // it under the terms of the GNU General Public License as published
> by
> // the Free Software Foundation; either version 2 of the License, or
> // (at your option) any later version.
> //
> // This program is distributed in the hope that it will be useful,
> // but WITHOUT ANY WARRANTY; without even the implied warranty of
> // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> // GNU General Public License for more details.
> //
> // You should have received a copy of the GNU General Public License
> // along with this program; if not, write to the Free Software
> // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
> 02111-1307, USA.
>
>
> #include <iostream>
> #include <string>
>
>
> using namespace std;
>
> class CXmlSettings
> {
> public:
> static std::string Crypt(std::string str);
> static std::string Decrypt(std::string str);
>
> CXmlSettings(void);
> virtual ~CXmlSettings(void);
>
> private:
>
> static size_t b64Encode(const unsigned char *src, size_t srcsize,
> char *dst, size_t dstsize);
>
>
> static size_t b64Decode(const char *src,
> unsigned char *dst, size_t dstsize);
>
>
> };
>
>
> static const unsigned char alphabet[65] =
> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
>
> size_t CXmlSettings::b64Encode(const unsigned char *src, size_t
> srcsize,
> char *dst, size_t dstsize)
> {
> if (!dstsize) return 0;
>
> char* pdst = dst;
> unsigned bits;
>
> while(srcsize >= 3 && dstsize > 4)
> {
> bits = (((unsigned)src[0])<<16) | (((unsigned)src[1])<<8)
> | ((unsigned)src[2]);
> src += 3;
> srcsize -= 3;
> *(pdst++) = alphabet[bits >> 18];
> *(pdst++) = alphabet[(bits >> 12) & 0x3f];
> *(pdst++) = alphabet[(bits >> 6) & 0x3f];
> *(pdst++) = alphabet[bits & 0x3f];
> dstsize -= 4;
> }
> if (srcsize && dstsize > 4)
> {
> bits = ((unsigned)src[0])<<16;
> *(pdst++) = alphabet[bits >> 18];
> if (srcsize == 1)
> {
> *(pdst++) = alphabet[(bits >> 12) & 0x3f];
> *(pdst++) = '=';
> }
> else
> {
> bits |= ((unsigned)src[1])<<8;
> *(pdst++) = alphabet[(bits >> 12) & 0x3f];
> *(pdst++) = alphabet[(bits >> 6) & 0x3f];
> }
> *(pdst++) = '=';
> }
> *pdst = 0;
> return pdst-dst;
> }
>
> size_t CXmlSettings::b64Decode(const char *src, unsigned char *dst,
> size_t dstsize)
> {
> char decoder[256];
> int i, bits, c;
>
> unsigned char *pdst = dst;
>
> for (i = 0; i < 256; ++i)
> decoder[i] = 64;
> for (i = 0; i < 64 ; ++i)
> decoder[alphabet[i]] = i;
>
> bits = 1;
>
> while(*src)
> {
> c = (unsigned char)(*(src++));
> if (c == '=')
> {
> if (bits & 0x40000)
> {
> if (dstsize < 2) break;
> *(pdst++) = (bits >> 10);
> *(pdst++) = (bits >> 2) & 0xff;
> break;
> }
> if (bits & 0x1000 && dstsize)
> *(pdst++) = (bits >> 4);
> break;
> }
> // skip invalid chars
> if (decoder[c] == 64)
> continue;
> bits = (bits << 6) + decoder[c];
> if (bits & 0x1000000)
> {
> if (dstsize < 3) break;
> *(pdst++) = (bits >> 16);
> *(pdst++) = (bits >> 8) & 0xff;
> *(pdst++) = (bits & 0xff);
> bits = 1;
> dstsize -= 3;
> }
> }
> return pdst-dst;
> }
>
>
>
>
> #define BUFFER_LENGTH 1024
> #define KEY_LENGTH 40
>
> static unsigned char key[] = {
> 0x50,
> 0xF7,
> 0x82,
> 0x69,
> 0xEA,
> 0x2D,
> 0xDD,
> 0x2D,
> 0x6A,
> 0xB4,
> 0x33,
> 0x8F,
> 0xD5,
> 0xC7,
> 0x90,
> 0x9C,
> 0x22,
> 0x95,
> 0x61,
> 0xE5,
> 0x65,
> 0xF6,
> 0xB0,
> 0x4B,
> 0x94,
> 0x47,
> 0xB0,
> 0xBD,
> 0x73,
> 0x58,
> 0x56,
> 0x87,
> 0x79,
> 0x7B,
> 0xE6,
> 0xB0,
> 0xD2,
> 0x20,
> 0x28,
> 0xE1
> };
>
> std::string CXmlSettings::Crypt(std::string str)
> {
> char* buffer = (char *) malloc(BUFFER_LENGTH);
> char destination[BUFFER_LENGTH];
> size_t destinationLength = BUFFER_LENGTH;
> int length = str.length();
> strcpy(buffer,str.c_str());
>
>
> int idx = 0;
>
> for (int i = 0; i < length; i++)
> {
> buffer[i] ^= key[idx];
> idx++;
> if (idx > KEY_LENGTH - 1)
> idx = 0;
> }
>
> CXmlSettings::b64Encode((const unsigned char
> *)buffer,length,destination,destinationLength);
>
> if(destinationLength<BUFFER_LENGTH)
> destination[destinationLength] = 0;
>
> //std::string strResult(destination);
> std::string strResult = destination;
> return strResult;
> }
>
> std::string CXmlSettings::Decrypt(std::string str)
> {
> char* buffer = (char *) malloc(BUFFER_LENGTH);
> char destination[BUFFER_LENGTH] = {0};
> size_t destinationLength;
> size_t length = str.length();
>
> strcpy(buffer,str.c_str());
> destinationLength = CXmlSettings::b64Decode((const char *)buffer,
> (unsigned char *) destination,length);
>
> int idx = 0;
>
> for (int i = 0; i < destinationLength; i++)
> {
> destination[i] ^= key[idx];
> idx++;
> if (idx > KEY_LENGTH - 1)
> idx = 0;
> }
>
> if(destinationLength<BUFFER_LENGTH)
> destination[destinationLength] = 0;
>
> std::string strResult = destination;
> return strResult;
> }
>
>
>
>
> CXmlSettings::CXmlSettings(void)
> {
>
> }
>
> CXmlSettings::~CXmlSettings(void)
> {
> }
>
>
> int main(int argc, char *argv[])
> {
> cout<<CXmlSettings::Crypt(argv[1])<<endl
> <<CXmlSettings::Decrypt(argv[1])<<endl;
>
> return 0;
> }
Thank you - that's great code :)
I'm really no programmer - but could we add this code to next relase
of wpkg-client?
Best regards
---
Grzegorz Marszałek
graf0 at post.pl
More information about the wpkg-users
mailing list