Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
ab4edfd8
Commit
ab4edfd8
authored
Dec 03, 2021
by
Hans Leidekker
Committed by
Alexandre Julliard
Dec 03, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bcrypt: Use CRT memory allocators.
Signed-off-by:
Hans Leidekker
<
hans@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
e6da4eed
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
44 additions
and
46 deletions
+44
-46
bcrypt_main.c
dlls/bcrypt/bcrypt_main.c
+44
-46
No files found.
dlls/bcrypt/bcrypt_main.c
View file @
ab4edfd8
...
...
@@ -18,6 +18,7 @@
*/
#include <stdarg.h>
#include <stdlib.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
...
...
@@ -28,10 +29,8 @@
#include "winternl.h"
#include "bcrypt.h"
#include "bcrypt_internal.h"
#include "wine/debug.h"
#include "
wine/heap
.h"
#include "
bcrypt_internal
.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
bcrypt
);
...
...
@@ -156,7 +155,7 @@ NTSTATUS WINAPI BCryptEnumAlgorithms( ULONG type, ULONG *ret_count, BCRYPT_ALGOR
if
(
match_operation_type
(
type
,
builtin_algorithms
[
i
].
class
))
count
++
;
}
if
(
!
(
list
=
heap_
alloc
(
count
*
sizeof
(
*
list
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
list
=
m
alloc
(
count
*
sizeof
(
*
list
)
)))
return
STATUS_NO_MEMORY
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
builtin_algorithms
);
i
++
)
{
...
...
@@ -248,7 +247,7 @@ NTSTATUS WINAPI BCryptOpenAlgorithmProvider( BCRYPT_ALG_HANDLE *handle, LPCWSTR
return
STATUS_NOT_IMPLEMENTED
;
}
if
(
!
(
alg
=
heap_
alloc
(
sizeof
(
*
alg
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
alg
=
m
alloc
(
sizeof
(
*
alg
)
)))
return
STATUS_NO_MEMORY
;
alg
->
hdr
.
magic
=
MAGIC_ALG
;
alg
->
id
=
alg_id
;
alg
->
mode
=
MODE_ID_CBC
;
...
...
@@ -266,7 +265,7 @@ NTSTATUS WINAPI BCryptCloseAlgorithmProvider( BCRYPT_ALG_HANDLE handle, DWORD fl
if
(
!
alg
||
alg
->
hdr
.
magic
!=
MAGIC_ALG
)
return
STATUS_INVALID_HANDLE
;
alg
->
hdr
.
magic
=
0
;
heap_
free
(
alg
);
free
(
alg
);
return
STATUS_SUCCESS
;
}
...
...
@@ -797,16 +796,16 @@ static NTSTATUS hash_create( const struct algorithm *alg, UCHAR *secret, ULONG s
struct
hash
*
hash
;
NTSTATUS
status
;
if
(
!
(
hash
=
heap_alloc_zero
(
sizeof
(
*
hash
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
hash
=
calloc
(
1
,
sizeof
(
*
hash
)
)))
return
STATUS_NO_MEMORY
;
hash
->
hdr
.
magic
=
MAGIC_HASH
;
hash
->
alg_id
=
alg
->
id
;
if
(
alg
->
flags
&
BCRYPT_ALG_HANDLE_HMAC_FLAG
)
hash
->
flags
=
HASH_FLAG_HMAC
;
if
((
alg
->
flags
&
BCRYPT_HASH_REUSABLE_FLAG
)
||
(
flags
&
BCRYPT_HASH_REUSABLE_FLAG
))
hash
->
flags
|=
HASH_FLAG_REUSABLE
;
if
(
secret_len
&&
!
(
hash
->
secret
=
heap_
alloc
(
secret_len
)))
if
(
secret_len
&&
!
(
hash
->
secret
=
m
alloc
(
secret_len
)))
{
heap_
free
(
hash
);
free
(
hash
);
return
STATUS_NO_MEMORY
;
}
memcpy
(
hash
->
secret
,
secret
,
secret_len
);
...
...
@@ -814,8 +813,8 @@ static NTSTATUS hash_create( const struct algorithm *alg, UCHAR *secret, ULONG s
if
((
status
=
hash_prepare
(
hash
)))
{
heap_
free
(
hash
->
secret
);
heap_
free
(
hash
);
free
(
hash
->
secret
);
free
(
hash
);
return
status
;
}
...
...
@@ -858,13 +857,12 @@ NTSTATUS WINAPI BCryptDuplicateHash( BCRYPT_HASH_HANDLE handle, BCRYPT_HASH_HAND
if
(
!
handle_copy
)
return
STATUS_INVALID_PARAMETER
;
if
(
object
)
FIXME
(
"ignoring object buffer
\n
"
);
if
(
!
(
hash_copy
=
heap_alloc
(
sizeof
(
*
hash_copy
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
hash_copy
=
malloc
(
sizeof
(
*
hash_copy
)
)))
return
STATUS_NO_MEMORY
;
memcpy
(
hash_copy
,
hash_orig
,
sizeof
(
*
hash_orig
)
);
if
(
hash_orig
->
secret
&&
!
(
hash_copy
->
secret
=
heap_
alloc
(
hash_orig
->
secret_len
)))
if
(
hash_orig
->
secret
&&
!
(
hash_copy
->
secret
=
m
alloc
(
hash_orig
->
secret_len
)))
{
heap_
free
(
hash_copy
);
free
(
hash_copy
);
return
STATUS_NO_MEMORY
;
}
memcpy
(
hash_copy
->
secret
,
hash_orig
->
secret
,
hash_orig
->
secret_len
);
...
...
@@ -877,8 +875,8 @@ static void hash_destroy( struct hash *hash )
{
if
(
!
hash
)
return
;
hash
->
hdr
.
magic
=
0
;
heap_
free
(
hash
->
secret
);
heap_
free
(
hash
);
free
(
hash
->
secret
);
free
(
hash
);
}
NTSTATUS
WINAPI
BCryptDestroyHash
(
BCRYPT_HASH_HANDLE
handle
)
...
...
@@ -971,15 +969,15 @@ static NTSTATUS key_asymmetric_create( struct key **ret_key, struct algorithm *a
return
STATUS_NOT_IMPLEMENTED
;
}
if
(
!
(
key
=
heap_alloc_zero
(
sizeof
(
*
key
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
key
=
calloc
(
1
,
sizeof
(
*
key
)
)))
return
STATUS_NO_MEMORY
;
key
->
hdr
.
magic
=
MAGIC_KEY
;
key
->
alg_id
=
alg
->
id
;
key
->
u
.
a
.
bitlen
=
bitlen
;
key
->
u
.
a
.
pubkey_len
=
pubkey_len
;
if
(
!
(
key
->
u
.
a
.
pubkey
=
heap_
alloc
(
pubkey_len
)))
if
(
!
(
key
->
u
.
a
.
pubkey
=
m
alloc
(
pubkey_len
)))
{
heap_
free
(
key
);
free
(
key
);
return
STATUS_NO_MEMORY
;
}
if
(
pubkey
)
memcpy
(
key
->
u
.
a
.
pubkey
,
pubkey
,
pubkey_len
);
...
...
@@ -1013,12 +1011,12 @@ static NTSTATUS key_symmetric_set_vector( struct key *key, UCHAR *vector, ULONG
BOOL
needs_reset
=
(
!
is_zero_vector
(
vector
,
vector_len
)
||
!
is_equal_vector
(
key
->
u
.
s
.
vector
,
key
->
u
.
s
.
vector_len
,
vector
,
vector_len
));
heap_
free
(
key
->
u
.
s
.
vector
);
free
(
key
->
u
.
s
.
vector
);
key
->
u
.
s
.
vector
=
NULL
;
key
->
u
.
s
.
vector_len
=
0
;
if
(
vector
)
{
if
(
!
(
key
->
u
.
s
.
vector
=
heap_
alloc
(
vector_len
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
key
->
u
.
s
.
vector
=
m
alloc
(
vector_len
)))
return
STATUS_NO_MEMORY
;
memcpy
(
key
->
u
.
s
.
vector
,
vector
,
vector_len
);
key
->
u
.
s
.
vector_len
=
vector_len
;
}
...
...
@@ -1208,12 +1206,12 @@ static NTSTATUS key_symmetric_encrypt( struct key *key, UCHAR *input, ULONG inp
if
(
flags
&
BCRYPT_BLOCK_PADDING
)
{
if
(
!
(
buf
=
heap_
alloc
(
key
->
u
.
s
.
block_size
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
buf
=
m
alloc
(
key
->
u
.
s
.
block_size
)))
return
STATUS_NO_MEMORY
;
memcpy
(
buf
,
encrypt_params
.
input
,
bytes_left
);
memset
(
buf
+
bytes_left
,
key
->
u
.
s
.
block_size
-
bytes_left
,
key
->
u
.
s
.
block_size
-
bytes_left
);
encrypt_params
.
input
=
buf
;
status
=
UNIX_CALL
(
key_symmetric_encrypt
,
&
encrypt_params
);
heap_
free
(
buf
);
free
(
buf
);
}
return
status
;
...
...
@@ -1300,7 +1298,7 @@ static NTSTATUS key_symmetric_decrypt( struct key *key, UCHAR *input, ULONG inpu
if
(
flags
&
BCRYPT_BLOCK_PADDING
)
{
UCHAR
*
buf
,
*
dst
=
decrypt_params
.
output
;
if
(
!
(
buf
=
heap_
alloc
(
key
->
u
.
s
.
block_size
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
buf
=
m
alloc
(
key
->
u
.
s
.
block_size
)))
return
STATUS_NO_MEMORY
;
decrypt_params
.
output
=
buf
;
status
=
UNIX_CALL
(
key_symmetric_decrypt
,
&
decrypt_params
);
if
(
!
status
&&
buf
[
key
->
u
.
s
.
block_size
-
1
]
<=
key
->
u
.
s
.
block_size
)
...
...
@@ -1310,7 +1308,7 @@ static NTSTATUS key_symmetric_decrypt( struct key *key, UCHAR *input, ULONG inpu
else
memcpy
(
dst
,
buf
,
key
->
u
.
s
.
block_size
-
buf
[
key
->
u
.
s
.
block_size
-
1
]
);
}
else
status
=
STATUS_UNSUCCESSFUL
;
/* FIXME: invalid padding */
heap_
free
(
buf
);
free
(
buf
);
}
return
status
;
...
...
@@ -1567,16 +1565,16 @@ NTSTATUS WINAPI BCryptGenerateSymmetricKey( BCRYPT_ALG_HANDLE algorithm, BCRYPT_
}
}
if
(
!
(
key
=
heap_alloc_zero
(
sizeof
(
*
key
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
key
=
calloc
(
1
,
sizeof
(
*
key
)
)))
return
STATUS_NO_MEMORY
;
InitializeCriticalSection
(
&
key
->
u
.
s
.
cs
);
key
->
hdr
.
magic
=
MAGIC_KEY
;
key
->
alg_id
=
alg
->
id
;
key
->
u
.
s
.
mode
=
alg
->
mode
;
key
->
u
.
s
.
block_size
=
block_size
;
if
(
!
(
key
->
u
.
s
.
secret
=
heap_
alloc
(
secret_len
)))
if
(
!
(
key
->
u
.
s
.
secret
=
m
alloc
(
secret_len
)))
{
heap_
free
(
key
);
free
(
key
);
return
STATUS_NO_MEMORY
;
}
memcpy
(
key
->
u
.
s
.
secret
,
secret
,
secret_len
);
...
...
@@ -1685,7 +1683,7 @@ static NTSTATUS key_duplicate( struct key *key_orig, struct key *key_copy )
if
(
key_is_symmetric
(
key_orig
))
{
if
(
!
(
buffer
=
heap_
alloc
(
key_orig
->
u
.
s
.
secret_len
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
buffer
=
m
alloc
(
key_orig
->
u
.
s
.
secret_len
)))
return
STATUS_NO_MEMORY
;
memcpy
(
buffer
,
key_orig
->
u
.
s
.
secret
,
key_orig
->
u
.
s
.
secret_len
);
key_copy
->
u
.
s
.
mode
=
key_orig
->
u
.
s
.
mode
;
...
...
@@ -1698,7 +1696,7 @@ static NTSTATUS key_duplicate( struct key *key_orig, struct key *key_copy )
{
struct
key_asymmetric_duplicate_params
params
;
if
(
!
(
buffer
=
heap_
alloc
(
key_orig
->
u
.
a
.
pubkey_len
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
buffer
=
m
alloc
(
key_orig
->
u
.
a
.
pubkey_len
)))
return
STATUS_NO_MEMORY
;
memcpy
(
buffer
,
key_orig
->
u
.
a
.
pubkey
,
key_orig
->
u
.
a
.
pubkey_len
);
key_copy
->
u
.
a
.
bitlen
=
key_orig
->
u
.
a
.
bitlen
;
...
...
@@ -1720,17 +1718,17 @@ static void key_destroy( struct key *key )
if
(
key_is_symmetric
(
key
))
{
UNIX_CALL
(
key_symmetric_destroy
,
key
);
heap_
free
(
key
->
u
.
s
.
vector
);
heap_
free
(
key
->
u
.
s
.
secret
);
free
(
key
->
u
.
s
.
vector
);
free
(
key
->
u
.
s
.
secret
);
DeleteCriticalSection
(
&
key
->
u
.
s
.
cs
);
}
else
{
UNIX_CALL
(
key_asymmetric_destroy
,
key
);
heap_
free
(
key
->
u
.
a
.
pubkey
);
free
(
key
->
u
.
a
.
pubkey
);
}
key
->
hdr
.
magic
=
0
;
heap_
free
(
key
);
free
(
key
);
}
NTSTATUS
WINAPI
BCryptDuplicateKey
(
BCRYPT_KEY_HANDLE
handle
,
BCRYPT_KEY_HANDLE
*
handle_copy
,
...
...
@@ -1745,7 +1743,7 @@ NTSTATUS WINAPI BCryptDuplicateKey( BCRYPT_KEY_HANDLE handle, BCRYPT_KEY_HANDLE
if
(
!
key_orig
||
key_orig
->
hdr
.
magic
!=
MAGIC_KEY
)
return
STATUS_INVALID_HANDLE
;
if
(
!
handle_copy
)
return
STATUS_INVALID_PARAMETER
;
if
(
!
(
key_copy
=
heap_
alloc
(
sizeof
(
*
key_copy
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
key_copy
=
m
alloc
(
sizeof
(
*
key_copy
)
)))
return
STATUS_NO_MEMORY
;
if
((
status
=
key_duplicate
(
key_orig
,
key_copy
)))
{
...
...
@@ -1978,7 +1976,7 @@ static NTSTATUS pbkdf2( struct hash *hash, UCHAR *pwd, ULONG pwd_len, UCHAR *sal
UCHAR
bytes
[
4
],
*
buf
;
ULONG
j
,
k
;
if
(
!
(
buf
=
heap_
alloc
(
hash_len
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
buf
=
m
alloc
(
hash_len
)))
return
STATUS_NO_MEMORY
;
for
(
j
=
0
;
j
<
iterations
;
j
++
)
{
...
...
@@ -1987,7 +1985,7 @@ static NTSTATUS pbkdf2( struct hash *hash, UCHAR *pwd, ULONG pwd_len, UCHAR *sal
/* use salt || INT(i) */
if
((
status
=
hash_update
(
&
hash
->
inner
,
hash
->
alg_id
,
salt
,
salt_len
)))
{
heap_
free
(
buf
);
free
(
buf
);
return
status
;
}
bytes
[
0
]
=
(
i
>>
24
)
&
0xff
;
...
...
@@ -2000,13 +1998,13 @@ static NTSTATUS pbkdf2( struct hash *hash, UCHAR *pwd, ULONG pwd_len, UCHAR *sal
if
(
status
)
{
heap_
free
(
buf
);
free
(
buf
);
return
status
;
}
if
((
status
=
hash_finalize
(
hash
,
buf
,
hash_len
)))
{
heap_
free
(
buf
);
free
(
buf
);
return
status
;
}
...
...
@@ -2014,7 +2012,7 @@ static NTSTATUS pbkdf2( struct hash *hash, UCHAR *pwd, ULONG pwd_len, UCHAR *sal
else
for
(
k
=
0
;
k
<
hash_len
;
k
++
)
dst
[
k
]
^=
buf
[
k
];
}
heap_
free
(
buf
);
free
(
buf
);
return
status
;
}
...
...
@@ -2051,7 +2049,7 @@ NTSTATUS WINAPI BCryptDeriveKeyPBKDF2( BCRYPT_ALG_HANDLE handle, UCHAR *pwd, ULO
}
/* final partial block */
if
(
!
(
partial
=
heap_
alloc
(
hash_len
)))
if
(
!
(
partial
=
m
alloc
(
hash_len
)))
{
hash_destroy
(
hash
);
return
STATUS_NO_MEMORY
;
...
...
@@ -2060,13 +2058,13 @@ NTSTATUS WINAPI BCryptDeriveKeyPBKDF2( BCRYPT_ALG_HANDLE handle, UCHAR *pwd, ULO
if
((
status
=
pbkdf2
(
hash
,
pwd
,
pwd_len
,
salt
,
salt_len
,
iterations
,
block_count
,
partial
,
hash_len
)))
{
hash_destroy
(
hash
);
heap_
free
(
partial
);
free
(
partial
);
return
status
;
}
memcpy
(
dk
+
((
block_count
-
1
)
*
hash_len
),
partial
,
bytes_left
);
hash_destroy
(
hash
);
heap_
free
(
partial
);
free
(
partial
);
return
STATUS_SUCCESS
;
}
...
...
@@ -2082,7 +2080,7 @@ NTSTATUS WINAPI BCryptSecretAgreement(BCRYPT_KEY_HANDLE privatekey, BCRYPT_KEY_H
if
(
!
pubkey
||
pubkey
->
hdr
.
magic
!=
MAGIC_KEY
)
return
STATUS_INVALID_HANDLE
;
if
(
!
handle
)
return
STATUS_INVALID_PARAMETER
;
if
(
!
(
secret
=
heap_alloc_zero
(
sizeof
(
*
secret
)
)))
return
STATUS_NO_MEMORY
;
if
(
!
(
secret
=
calloc
(
1
,
sizeof
(
*
secret
)
)))
return
STATUS_NO_MEMORY
;
secret
->
hdr
.
magic
=
MAGIC_SECRET
;
*
handle
=
secret
;
...
...
@@ -2097,7 +2095,7 @@ NTSTATUS WINAPI BCryptDestroySecret(BCRYPT_SECRET_HANDLE handle)
if
(
!
secret
||
secret
->
hdr
.
magic
!=
MAGIC_SECRET
)
return
STATUS_INVALID_HANDLE
;
secret
->
hdr
.
magic
=
0
;
heap_
free
(
secret
);
free
(
secret
);
return
STATUS_SUCCESS
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment