jdk
1/*
2* Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*
5* This code is free software; you can redistribute it and/or modify it
6* under the terms of the GNU General Public License version 2 only, as
7* published by the Free Software Foundation. Oracle designates this
8* particular file as subject to the "Classpath" exception as provided
9* by Oracle in the LICENSE file that accompanied this code.
10*
11* This code is distributed in the hope that it will be useful, but WITHOUT
12* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14* version 2 for more details (a copy is included in the LICENSE file that
15* accompanied this code).
16*
17* You should have received a copy of the GNU General Public License version
18* 2 along with this work; if not, write to the Free Software Foundation,
19* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*
21* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22* or visit www.oracle.com if you need additional information or have any
23* questions.
24*/
25
26#include <windows.h>27#include <wincrypt.h>28#include <jni.h>29#include "sun_security_provider_NativeSeedGenerator.h"30
31/*
32* Get a random seed from the MS CryptoAPI. Return true if successful, false
33* otherwise.
34*
35* Some early versions of Windows 95 do not support the required functions.
36* Use runtime linking to avoid problems.
37*
38*/
39JNIEXPORT jboolean JNICALL Java_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed40(JNIEnv *env, jclass clazz, jbyteArray randArray)41{
42HCRYPTPROV hCryptProv;43jboolean result = JNI_FALSE;44jsize numBytes;45jbyte* randBytes;46
47if (CryptAcquireContextA(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL, 0) == FALSE) {48/* If CSP context hasn't been created, create one. */49if (CryptAcquireContextA(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL,50CRYPT_NEWKEYSET) == FALSE) {51return result;52}53}54
55numBytes = (*env)->GetArrayLength(env, randArray);56randBytes = (*env)->GetByteArrayElements(env, randArray, NULL);57if (randBytes == NULL) {58goto cleanup;59}60
61if (CryptGenRandom(hCryptProv, numBytes, randBytes)) {62result = JNI_TRUE;63}64(*env)->ReleaseByteArrayElements(env, randArray, randBytes, 0);65
66cleanup:67CryptReleaseContext(hCryptProv, 0);68
69return result;70}
71