Annotation of embedaddon/ntp/ports/winnt/libntp/randfile.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Make sure that there is a good source of random characters
        !             3:  * so that OpenSSL can work properly and securely.
        !             4:  */
        !             5: 
        !             6: #include <config.h>
        !             7: #include <wincrypt.h>
        !             8: 
        !             9: #include <stdio.h>
        !            10: 
        !            11: unsigned int   getrandom_chars(int desired, unsigned char *buf, int lenbuf);
        !            12: BOOL           create_random_file(char *filename);
        !            13: 
        !            14: BOOL
        !            15: init_randfile()
        !            16: {
        !            17:        FILE *rf;
        !            18:        char *randfile;
        !            19:        char *homedir;
        !            20:        char tmp[256];
        !            21:        /* See if the environmental variable RANDFILE is defined
        !            22:         * and the file exists
        !            23:         */
        !            24:        randfile = getenv("RANDFILE");
        !            25:        if (randfile != NULL) {
        !            26:                rf = fopen(randfile, "rb");
        !            27:                if (rf != NULL) {
        !            28:                        fclose(rf);
        !            29:                        return (TRUE);
        !            30:                }
        !            31:                else {
        !            32:                        /* The environmental variable exists but not the file */
        !            33:                        return (create_random_file(randfile));
        !            34:                }
        !            35:        }
        !            36:        /*
        !            37:         * If the RANDFILE environmental variable does not exist,
        !            38:         * see if the HOME enviromental variable exists and
        !            39:         * a .rnd file is in there.
        !            40:         */
        !            41:        homedir = getenv("HOME");
        !            42:        if (homedir != NULL &&
        !            43:            (strlen(homedir) + 5 /* \.rnd */) < sizeof(tmp)) {
        !            44:                strncpy(tmp, homedir, sizeof(tmp));
        !            45:                strcat(tmp, "\\.rnd");
        !            46:                rf = fopen(tmp, "rb");
        !            47:                if (rf != NULL) {
        !            48:                        fclose(rf);
        !            49:                        return (TRUE);
        !            50:                }
        !            51:                else {
        !            52:                        /* The HOME environmental variable exists but not the file */
        !            53:                        return (create_random_file(tmp));
        !            54:                }
        !            55:        }
        !            56:        /*
        !            57:         * Final try. Look for it on the C:\ directory
        !            58:         * NOTE: This is a really bad place for it security-wise
        !            59:         * However, OpenSSL looks for it there if it can't find it elsewhere
        !            60:         */
        !            61:        rf = fopen("C:\\.rnd", "rb");
        !            62:        if (rf != NULL) {
        !            63:                fclose(rf);
        !            64:                return (TRUE);
        !            65:        }
        !            66:        /* The file does not exist */
        !            67:        return (create_random_file("C:\\.rnd"));
        !            68: }
        !            69: /*
        !            70:  * Routine to create the random file with 1024 random characters
        !            71:  */
        !            72: BOOL
        !            73: create_random_file(char *filename) {
        !            74:        FILE *rf;
        !            75:        int nchars;
        !            76:        unsigned char buf[1025];
        !            77: 
        !            78:        nchars = getrandom_chars(1024, buf, sizeof(buf));
        !            79:        rf = fopen(filename, "wb");
        !            80:        if (rf == NULL)
        !            81:                return (FALSE);
        !            82:        fwrite(buf, sizeof(unsigned char), nchars, rf);
        !            83:        fclose(rf);
        !            84:        return (TRUE);
        !            85: }
        !            86: 
        !            87: unsigned int
        !            88: getrandom_chars(int desired, unsigned char *buf, int lenbuf) {
        !            89:        HCRYPTPROV hcryptprov;
        !            90:        BOOL err;
        !            91: 
        !            92:        if (buf == NULL || lenbuf <= 0 || desired > lenbuf)
        !            93:                return (0);
        !            94:        /*
        !            95:         * The first time we just try to acquire the context
        !            96:         */
        !            97:        err = CryptAcquireContext(&hcryptprov, NULL, NULL, PROV_RSA_FULL,
        !            98:                                  CRYPT_VERIFYCONTEXT);
        !            99:        if (!err){
        !           100:                return (0);
        !           101:        }
        !           102:        if (!CryptGenRandom(hcryptprov, desired, buf)) {
        !           103:                CryptReleaseContext(hcryptprov, 0);
        !           104:                return (0);
        !           105:        }
        !           106: 
        !           107:        CryptReleaseContext(hcryptprov, 0);
        !           108:        return (desired);
        !           109: }
        !           110: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>