Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
96ebad1a
Commit
96ebad1a
authored
Dec 13, 2004
by
Michael Jung
Committed by
Alexandre Julliard
Dec 13, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implemented CPSignHash and CPVerifySignature.
Added tests for CPVerifySignature. Fixed minor bugs in implglue.c.
parent
3e60f767
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
610 additions
and
58 deletions
+610
-58
implglue.c
dlls/rsaenh/implglue.c
+14
-4
rsaenh.c
dlls/rsaenh/rsaenh.c
+338
-54
rsaenh.c
dlls/rsaenh/tests/rsaenh.c
+258
-0
No files found.
dlls/rsaenh/implglue.c
View file @
96ebad1a
...
...
@@ -198,6 +198,10 @@ BOOL setup_key_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, DWORD dwKeyLen, DW
case
CALG_DES
:
des_setup
(
abKeyValue
,
8
,
0
,
&
pKeyContext
->
des
);
break
;
case
CALG_RSA_SIGN
:
case
CALG_RSA_KEYX
:
break
;
default:
SetLastError
(
NTE_BAD_ALGID
);
...
...
@@ -289,7 +293,7 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, CONST BYTE *in
SetLastError
(
NTE_FAIL
);
return
FALSE
;
}
reverse_bytes
((
BYTE
*
)
in
,
in
len
);
reverse_bytes
((
BYTE
*
)
out
,
out
len
);
}
else
{
reverse_bytes
((
BYTE
*
)
in
,
inlen
);
if
(
rsa_exptmod
(
in
,
inlen
,
out
,
&
outlen
,
PK_PRIVATE
,
&
pKeyContext
->
rsa
)
!=
CRYPT_OK
)
{
...
...
@@ -302,11 +306,17 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, KEY_CONTEXT *pKeyContext, CONST BYTE *in
case
CALG_RSA_SIGN
:
outlen
=
inlen
=
(
mp_count_bits
(
&
pKeyContext
->
rsa
.
N
)
+
7
)
/
8
;
if
(
enc
)
{
rsa_exptmod
(
in
,
inlen
,
out
,
&
outlen
,
PK_PRIVATE
,
&
pKeyContext
->
rsa
);
reverse_bytes
((
BYTE
*
)
in
,
inlen
);
if
(
rsa_exptmod
(
in
,
inlen
,
out
,
&
outlen
,
PK_PRIVATE
,
&
pKeyContext
->
rsa
)
!=
CRYPT_OK
)
{
SetLastError
(
NTE_FAIL
);
return
FALSE
;
}
reverse_bytes
((
BYTE
*
)
out
,
outlen
);
}
else
{
reverse_bytes
((
BYTE
*
)
in
,
inlen
);
rsa_exptmod
(
in
,
inlen
,
out
,
&
outlen
,
PK_PUBLIC
,
&
pKeyContext
->
rsa
);
if
(
rsa_exptmod
(
in
,
inlen
,
out
,
&
outlen
,
PK_PUBLIC
,
&
pKeyContext
->
rsa
)
!=
CRYPT_OK
)
{
SetLastError
(
NTE_FAIL
);
return
FALSE
;
}
}
break
;
...
...
dlls/rsaenh/rsaenh.c
View file @
96ebad1a
...
...
@@ -98,7 +98,7 @@ typedef struct tagCRYPTKEY
typedef
struct
tagKEYCONTAINER
{
OBJECTHDR
header
;
DWORD
dw
Mode
;
DWORD
dw
Flags
;
DWORD
dwPersonality
;
DWORD
dwEnumAlgsCtr
;
CHAR
szName
[
MAX_PATH
];
...
...
@@ -124,6 +124,7 @@ typedef struct tagKEYCONTAINER
#define RSAENH_MAGIC_RSA2 0x32415352
#define RSAENH_MAGIC_RSA1 0x31415352
#define RSAENH_PKC_BLOCKTYPE 0x02
#define RSAENH_REGKEY "Software\\Wine\\Crypto\\RSA\\%s"
#define RSAENH_MIN(a,b) ((a)<(b)?(a):(b))
/******************************************************************************
...
...
@@ -685,57 +686,59 @@ static void destroy_key_container(OBJECTHDR *pObjectHdr)
DWORD
dwLen
;
BYTE
*
pbKey
;
/* On WinXP, persistent keys are stored in a file located at:
* $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
*/
sprintf
(
szRSABase
,
"Software
\\
Wine
\\
Crypto
\\
RSA
\\
%s"
,
pKeyContainer
->
szName
);
if
(
!
(
pKeyContainer
->
dwFlags
&
CRYPT_VERIFYCONTEXT
))
{
/* On WinXP, persistent keys are stored in a file located at:
* $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
*/
sprintf
(
szRSABase
,
RSAENH_REGKEY
,
pKeyContainer
->
szName
);
if
(
RegCreateKeyExA
(
HKEY_CURRENT_USER
,
szRSABase
,
0
,
NULL
,
REG_OPTION_NON_VOLATILE
,
KEY_WRITE
,
NULL
,
&
hKey
,
NULL
)
==
ERROR_SUCCESS
)
{
if
(
lookup_handle
(
&
handle_table
,
pKeyContainer
->
hKeyExchangeKeyPair
,
RSAENH_MAGIC_KEY
,
(
OBJECTHDR
**
)
&
pKey
))
if
(
RegCreateKeyExA
(
HKEY_CURRENT_USER
,
szRSABase
,
0
,
NULL
,
REG_OPTION_NON_VOLATILE
,
KEY_WRITE
,
NULL
,
&
hKey
,
NULL
)
==
ERROR_SUCCESS
)
{
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hKeyExchangeKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
0
,
&
dwLen
))
if
(
lookup_handle
(
&
handle_table
,
pKeyContainer
->
hKeyExchangeKeyPair
,
RSAENH_MAGIC_KEY
,
(
OBJECTHDR
**
)
&
pKey
))
{
pbKey
=
(
BYTE
*
)
HeapAlloc
(
GetProcessHeap
(),
0
,
dwLen
);
if
(
pbKey
)
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hKeyExchangeKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
0
,
&
dwLen
)
)
{
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hKeyExchangeKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
pbKey
,
&
dwLen
))
pbKey
=
(
BYTE
*
)
HeapAlloc
(
GetProcessHeap
(),
0
,
dwLen
);
if
(
pbKey
)
{
RegSetValueExA
(
hKey
,
"KeyExchangeKeyPair"
,
0
,
REG_BINARY
,
pbKey
,
dwLen
);
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hKeyExchangeKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
pbKey
,
&
dwLen
))
{
RegSetValueExA
(
hKey
,
"KeyExchangeKeyPair"
,
0
,
REG_BINARY
,
pbKey
,
dwLen
);
}
HeapFree
(
GetProcessHeap
(),
0
,
pbKey
);
}
HeapFree
(
GetProcessHeap
(),
0
,
pbKey
);
}
release_handle
(
&
handle_table
,
(
unsigned
int
)
pKeyContainer
->
hKeyExchangeKeyPair
,
RSAENH_MAGIC_KEY
);
}
release_handle
(
&
handle_table
,
(
unsigned
int
)
pKeyContainer
->
hKeyExchangeKeyPair
,
RSAENH_MAGIC_KEY
);
}
if
(
lookup_handle
(
&
handle_table
,
pKeyContainer
->
hSignatureKeyPair
,
RSAENH_MAGIC_KEY
,
(
OBJECTHDR
**
)
&
pKey
))
{
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hSignatureKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
0
,
&
dwLen
))
if
(
lookup_handle
(
&
handle_table
,
pKeyContainer
->
hSignatureKeyPair
,
RSAENH_MAGIC_KEY
,
(
OBJECTHDR
**
)
&
pKey
))
{
pbKey
=
(
BYTE
*
)
HeapAlloc
(
GetProcessHeap
(),
0
,
dwLen
);
if
(
pbKey
)
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hSignatureKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
0
,
&
dwLen
)
)
{
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hSignatureKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
pbKey
,
&
dwLen
))
pbKey
=
(
BYTE
*
)
HeapAlloc
(
GetProcessHeap
(),
0
,
dwLen
);
if
(
pbKey
)
{
RegSetValueExA
(
hKey
,
"SignatureKeyPair"
,
0
,
REG_BINARY
,
pbKey
,
dwLen
);
if
(
RSAENH_CPExportKey
(
pKey
->
hProv
,
pKeyContainer
->
hSignatureKeyPair
,
0
,
PRIVATEKEYBLOB
,
0
,
pbKey
,
&
dwLen
))
{
RegSetValueExA
(
hKey
,
"SignatureKeyPair"
,
0
,
REG_BINARY
,
pbKey
,
dwLen
);
}
HeapFree
(
GetProcessHeap
(),
0
,
pbKey
);
}
HeapFree
(
GetProcessHeap
(),
0
,
pbKey
);
}
release_handle
(
&
handle_table
,
(
unsigned
int
)
pKeyContainer
->
hSignatureKeyPair
,
RSAENH_MAGIC_KEY
);
}
release_handle
(
&
handle_table
,
(
unsigned
int
)
pKeyContainer
->
hSignatureKeyPair
,
RSAENH_MAGIC_KEY
);
}
RegCloseKey
(
hKey
);
RegCloseKey
(
hKey
);
}
}
HeapFree
(
GetProcessHeap
(),
0
,
pKeyContainer
);
...
...
@@ -755,7 +758,7 @@ static void destroy_key_container(OBJECTHDR *pObjectHdr)
* Success: Handle to the new key container.
* Failure: INVALID_HANDLE_VALUE
*/
static
HCRYPTPROV
new_key_container
(
PCHAR
pszContainerName
,
PVTableProvStruc
pVTable
)
static
HCRYPTPROV
new_key_container
(
PCHAR
pszContainerName
,
DWORD
dwFlags
,
PVTableProvStruc
pVTable
)
{
KEYCONTAINER
*
pKeyContainer
;
HCRYPTPROV
hKeyContainer
;
...
...
@@ -766,7 +769,7 @@ static HCRYPTPROV new_key_container(PCHAR pszContainerName, PVTableProvStruc pVT
{
strncpy
(
pKeyContainer
->
szName
,
pszContainerName
,
MAX_PATH
);
pKeyContainer
->
szName
[
MAX_PATH
-
1
]
=
'\0'
;
pKeyContainer
->
dw
Mode
=
0
;
pKeyContainer
->
dw
Flags
=
dwFlags
;
pKeyContainer
->
dwEnumAlgsCtr
=
0
;
pKeyContainer
->
hKeyExchangeKeyPair
=
(
HCRYPTKEY
)
INVALID_HANDLE_VALUE
;
pKeyContainer
->
hSignatureKeyPair
=
(
HCRYPTKEY
)
INVALID_HANDLE_VALUE
;
...
...
@@ -800,7 +803,7 @@ static HCRYPTPROV new_key_container(PCHAR pszContainerName, PVTableProvStruc pVT
* Success: Handle to the key container read from the registry
* Failure: INVALID_HANDLE_VALUE
*/
static
HCRYPTPROV
read_key_container
(
PCHAR
pszContainerName
,
PVTableProvStruc
pVTable
)
static
HCRYPTPROV
read_key_container
(
PCHAR
pszContainerName
,
DWORD
dwFlags
,
PVTableProvStruc
pVTable
)
{
CHAR
szRSABase
[
MAX_PATH
];
BYTE
*
pbKey
;
...
...
@@ -809,7 +812,7 @@ static HCRYPTPROV read_key_container(PCHAR pszContainerName, PVTableProvStruc pV
KEYCONTAINER
*
pKeyContainer
;
HCRYPTPROV
hKeyContainer
;
sprintf
(
szRSABase
,
"Software
\\
Wine
\\
Crypto
\\
RSA
\\
%s"
,
pszContainerName
);
sprintf
(
szRSABase
,
RSAENH_REGKEY
,
pszContainerName
);
if
(
RegOpenKeyExA
(
HKEY_CURRENT_USER
,
szRSABase
,
0
,
KEY_READ
,
&
hKey
)
!=
ERROR_SUCCESS
)
{
...
...
@@ -817,7 +820,7 @@ static HCRYPTPROV read_key_container(PCHAR pszContainerName, PVTableProvStruc pV
return
(
HCRYPTPROV
)
INVALID_HANDLE_VALUE
;
}
hKeyContainer
=
new_key_container
(
pszContainerName
,
pVTable
);
hKeyContainer
=
new_key_container
(
pszContainerName
,
dwFlags
,
pVTable
);
if
(
hKeyContainer
!=
(
HCRYPTPROV
)
INVALID_HANDLE_VALUE
)
{
if
(
!
lookup_handle
(
&
handle_table
,
hKeyContainer
,
RSAENH_MAGIC_CONTAINER
,
...
...
@@ -861,6 +864,91 @@ static HCRYPTPROV read_key_container(PCHAR pszContainerName, PVTableProvStruc pV
}
/******************************************************************************
* build_hash_signature [Internal]
*
* Builds a padded version of a hash to match the length of the RSA key modulus.
*
* PARAMS
* pbSignature [O] The padded hash object is stored here.
* dwLen [I] Length of the pbSignature buffer.
* aiAlgid [I] Algorithm identifier of the hash to be padded.
* abHashValue [I] The value of the hash object.
* dwHashLen [I] Length of the hash value.
* dwFlags [I] Selection of padding algorithm.
*
* RETURNS
* Success: TRUE
* Failure: FALSE (NTE_BAD_ALGID)
*/
static
BOOL
build_hash_signature
(
BYTE
*
pbSignature
,
DWORD
dwLen
,
ALG_ID
aiAlgid
,
CONST
BYTE
*
abHashValue
,
DWORD
dwHashLen
,
DWORD
dwFlags
)
{
/* These prefixes are meant to be concatenated with hash values of the
* respective kind to form a PKCS #7 DigestInfo. */
static
const
struct
tagOIDDescriptor
{
ALG_ID
aiAlgid
;
DWORD
dwLen
;
CONST
BYTE
abOID
[
18
];
}
aOIDDescriptor
[
5
]
=
{
{
CALG_MD2
,
18
,
{
0x30
,
0x20
,
0x30
,
0x0c
,
0x06
,
0x08
,
0x2a
,
0x86
,
0x48
,
0x86
,
0xf7
,
0x0d
,
0x02
,
0x02
,
0x05
,
0x00
,
0x04
,
0x10
}
},
{
CALG_MD4
,
18
,
{
0x30
,
0x20
,
0x30
,
0x0c
,
0x06
,
0x08
,
0x2a
,
0x86
,
0x48
,
0x86
,
0xf7
,
0x0d
,
0x02
,
0x04
,
0x05
,
0x00
,
0x04
,
0x10
}
},
{
CALG_MD5
,
18
,
{
0x30
,
0x20
,
0x30
,
0x0c
,
0x06
,
0x08
,
0x2a
,
0x86
,
0x48
,
0x86
,
0xf7
,
0x0d
,
0x02
,
0x05
,
0x05
,
0x00
,
0x04
,
0x10
}
},
{
CALG_SHA
,
15
,
{
0x30
,
0x21
,
0x30
,
0x09
,
0x06
,
0x05
,
0x2b
,
0x0e
,
0x03
,
0x02
,
0x1a
,
0x05
,
0x00
,
0x04
,
0x14
}
},
{
0
,
0
,
{}
}
};
DWORD
dwIdxOID
,
i
,
j
;
for
(
dwIdxOID
=
0
;
aOIDDescriptor
[
dwIdxOID
].
aiAlgid
;
dwIdxOID
++
)
{
if
(
aOIDDescriptor
[
dwIdxOID
].
aiAlgid
==
aiAlgid
)
break
;
}
if
(
!
aOIDDescriptor
[
dwIdxOID
].
aiAlgid
)
{
SetLastError
(
NTE_BAD_ALGID
);
return
FALSE
;
}
/* Build the padded signature */
if
(
dwFlags
&
CRYPT_X931_FORMAT
)
{
pbSignature
[
0
]
=
0x6b
;
for
(
i
=
1
;
i
<
dwLen
-
dwHashLen
-
3
;
i
++
)
{
pbSignature
[
i
]
=
0xbb
;
}
pbSignature
[
i
++
]
=
0xba
;
for
(
j
=
0
;
j
<
dwHashLen
;
j
++
,
i
++
)
{
pbSignature
[
i
]
=
abHashValue
[
j
];
}
pbSignature
[
i
++
]
=
0x33
;
pbSignature
[
i
++
]
=
0xcc
;
}
else
{
pbSignature
[
0
]
=
0x00
;
pbSignature
[
1
]
=
0x01
;
if
(
dwFlags
&
CRYPT_NOHASHOID
)
{
for
(
i
=
2
;
i
<
dwLen
-
1
-
dwHashLen
;
i
++
)
{
pbSignature
[
i
]
=
0xff
;
}
pbSignature
[
i
++
]
=
0x00
;
}
else
{
for
(
i
=
2
;
i
<
dwLen
-
1
-
aOIDDescriptor
[
dwIdxOID
].
dwLen
-
dwHashLen
;
i
++
)
{
pbSignature
[
i
]
=
0xff
;
}
pbSignature
[
i
++
]
=
0x00
;
for
(
j
=
0
;
j
<
aOIDDescriptor
[
dwIdxOID
].
dwLen
;
j
++
)
{
pbSignature
[
i
++
]
=
aOIDDescriptor
[
dwIdxOID
].
abOID
[
j
];
}
}
for
(
j
=
0
;
j
<
dwHashLen
;
j
++
)
{
pbSignature
[
i
++
]
=
abHashValue
[
j
];
}
}
return
TRUE
;
}
/******************************************************************************
* CPAcquireContext (RSAENH.@)
*
* Acquire a handle to the key container specified by pszContainer
...
...
@@ -890,6 +978,7 @@ BOOL WINAPI RSAENH_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
{
DWORD
dwLen
;
CHAR
szKeyContainerName
[
MAX_PATH
]
=
""
;
CHAR
szRegKey
[
MAX_PATH
];
TRACE
(
"(phProv=%p, pszContainer=%s, dwFlags=%08lx, pVTable=%p)
\n
"
,
phProv
,
debugstr_a
(
pszContainer
),
dwFlags
,
pVTable
);
...
...
@@ -907,23 +996,41 @@ BOOL WINAPI RSAENH_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
if
(
!
GetUserNameA
(
szKeyContainerName
,
&
dwLen
))
return
FALSE
;
}
switch
(
dwFlags
)
switch
(
dwFlags
&
(
CRYPT_NEWKEYSET
|
CRYPT_VERIFYCONTEXT
|
CRYPT_DELETEKEYSET
)
)
{
case
0
:
*
phProv
=
read_key_container
(
szKeyContainerName
,
pVTable
);
*
phProv
=
read_key_container
(
szKeyContainerName
,
dwFlags
,
pVTable
);
break
;
case
CRYPT_DELETEKEYSET
:
if
(
snprintf
(
szRegKey
,
MAX_PATH
,
RSAENH_REGKEY
,
pszContainer
)
>=
MAX_PATH
)
{
SetLastError
(
NTE_BAD_KEYSET_PARAM
);
return
FALSE
;
}
else
{
RegDeleteKeyA
(
HKEY_CURRENT_USER
,
szRegKey
);
return
TRUE
;
}
break
;
case
CRYPT_NEWKEYSET
:
*
phProv
=
read_key_container
(
szKeyContainerName
,
pVTable
);
*
phProv
=
read_key_container
(
szKeyContainerName
,
dwFlags
,
pVTable
);
if
(
*
phProv
!=
(
HCRYPTPROV
)
INVALID_HANDLE_VALUE
)
{
release_handle
(
&
handle_table
,
(
unsigned
int
)
*
phProv
,
RSAENH_MAGIC_CONTAINER
);
SetLastError
(
NTE_EXISTS
);
return
FALSE
;
}
*
phProv
=
new_key_container
(
szKeyContainerName
,
pVTable
);
*
phProv
=
new_key_container
(
szKeyContainerName
,
dwFlags
,
pVTable
);
break
;
case
CRYPT_VERIFYCONTEXT
:
if
(
pszContainer
)
{
SetLastError
(
NTE_BAD_FLAGS
);
return
FALSE
;
}
*
phProv
=
new_key_container
(
""
,
dwFlags
,
pVTable
);
break
;
default:
*
phProv
=
(
unsigned
int
)
INVALID_HANDLE_VALUE
;
SetLastError
(
NTE_BAD_FLAGS
);
...
...
@@ -1408,8 +1515,9 @@ BOOL WINAPI RSAENH_CPDecrypt(HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash,
}
else
if
(
GET_ALG_TYPE
(
pCryptKey
->
aiAlgid
)
==
ALG_TYPE_STREAM
)
{
encrypt_stream_impl
(
pCryptKey
->
aiAlgid
,
&
pCryptKey
->
context
,
pbData
,
*
pdwDataLen
);
}
else
if
(
GET_ALG_TYPE
(
pCryptKey
->
aiAlgid
)
==
ALG_TYPE_RSA
)
{
encrypt_block_impl
(
pCryptKey
->
aiAlgid
,
&
pCryptKey
->
context
,
pbData
,
pbData
,
RSAENH_DECRYPT
);
}
if
(
Final
)
setup_key
(
pCryptKey
);
return
TRUE
;
...
...
@@ -1630,6 +1738,7 @@ BOOL WINAPI RSAENH_CPImportKey(HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDat
*
phKey
=
new_key
(
hProv
,
pBlobHeader
->
aiKeyAlg
,
MAKELONG
(
0
,
pRSAPubKey
->
bitlen
),
&
pCryptKey
);
if
(
*
phKey
==
(
HCRYPTKEY
)
INVALID_HANDLE_VALUE
)
return
FALSE
;
setup_key
(
pCryptKey
);
return
import_private_key_impl
((
CONST
BYTE
*
)(
pRSAPubKey
+
1
),
&
pCryptKey
->
context
,
pRSAPubKey
->
bitlen
/
8
,
pRSAPubKey
->
pubexp
);
...
...
@@ -1644,6 +1753,7 @@ BOOL WINAPI RSAENH_CPImportKey(HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDat
*
phKey
=
new_key
(
hProv
,
pBlobHeader
->
aiKeyAlg
,
MAKELONG
(
0
,
pRSAPubKey
->
bitlen
),
&
pCryptKey
);
if
(
*
phKey
==
(
HCRYPTKEY
)
INVALID_HANDLE_VALUE
)
return
FALSE
;
setup_key
(
pCryptKey
);
return
import_public_key_impl
((
CONST
BYTE
*
)(
pRSAPubKey
+
1
),
&
pCryptKey
->
context
,
pRSAPubKey
->
bitlen
>>
3
,
pRSAPubKey
->
pubexp
);
...
...
@@ -1745,7 +1855,7 @@ BOOL WINAPI RSAENH_CPGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYP
case
AT_KEYEXCHANGE
:
case
CALG_RSA_KEYX
:
*
phKey
=
new_key
(
hProv
,
CALG_RSA_KEYX
,
dwFlags
,
&
pCryptKey
);
*
phKey
=
new_key
(
hProv
,
CALG_RSA_KEYX
,
dwFlags
,
&
pCryptKey
);
if
(
pCryptKey
)
{
new_key_impl
(
pCryptKey
->
aiAlgid
,
&
pCryptKey
->
context
,
pCryptKey
->
dwKeyLen
);
setup_key
(
pCryptKey
);
...
...
@@ -2097,7 +2207,27 @@ BOOL WINAPI RSAENH_CPGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData,
KEYCONTAINER
*
pKeyContainer
;
PROV_ENUMALGS
provEnumalgs
;
DWORD
dwTemp
;
/* This is for dwParam 41, which does not seem to be documented
* on MSDN. IE6 SP1 asks for it in the 'About' dialog, however.
* Returning this BLOB seems to satisfy IE. The marked 0x00 seem
* to be 'don't care's. If you know anything more specific about
* provider parameter 41, please report to wine-devel@winehq.org */
static
CONST
BYTE
abWTF
[
96
]
=
{
0xb0
,
0x25
,
0x63
,
0x86
,
0x9c
,
0xab
,
0xb6
,
0x37
,
0xe8
,
0x82
,
/**/
0x00
,
/**/
0x72
,
0x06
,
0xb2
,
/**/
0x00
,
/**/
0x3b
,
0x60
,
0x35
,
/**/
0x00
,
/**/
0x3b
,
0x88
,
0xce
,
/**/
0x00
,
/**/
0x82
,
0xbc
,
0x7a
,
/**/
0x00
,
/**/
0xb7
,
0x4f
,
0x7e
,
/**/
0x00
,
/**/
0xde
,
0x92
,
0xf1
,
/**/
0x00
,
/**/
0x83
,
0xea
,
0x5e
,
/**/
0x00
,
/**/
0xc8
,
0x12
,
0x1e
,
0xd4
,
0x06
,
0xf7
,
0x66
,
/**/
0x00
,
/**/
0x01
,
0x29
,
0xa4
,
/**/
0x00
,
/**/
0xf8
,
0x24
,
0x0c
,
/**/
0x00
,
/**/
0x33
,
0x06
,
0x80
,
/**/
0x00
,
/**/
0x02
,
0x46
,
0x0b
,
/**/
0x00
,
/**/
0x6d
,
0x5b
,
0xca
,
/**/
0x00
,
/**/
0x9a
,
0x10
,
0xf0
,
/**/
0x00
,
/**/
0x05
,
0x19
,
0xd0
,
/**/
0x00
,
/**/
0x2c
,
0xf6
,
0x27
,
/**/
0x00
,
/**/
0xaa
,
0x7c
,
0x6f
,
/**/
0x00
,
/**/
0xb9
,
0xd8
,
0x72
,
/**/
0x00
,
/**/
0x03
,
0xf3
,
0x81
,
/**/
0x00
,
/**/
0xfa
,
0xe8
,
0x26
,
/**/
0x00
,
/**/
0xca
};
TRACE
(
"(hProv=%08lx, dwParam=%08lx, pbData=%p, pdwDataLen=%p, dwFlags=%08lx)
\n
"
,
hProv
,
dwParam
,
pbData
,
pdwDataLen
,
dwFlags
);
...
...
@@ -2163,6 +2293,9 @@ BOOL WINAPI RSAENH_CPGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData,
sizeof
(
PROV_ENUMALGS_EX
));
}
case
41
:
/* Undocumented. Asked for by IE About dialog */
return
copy_param
(
pbData
,
pdwDataLen
,
abWTF
,
sizeof
(
abWTF
));
default:
/* MSDN: Unknown parameter number in dwParam */
SetLastError
(
NTE_BAD_TYPE
);
...
...
@@ -2447,7 +2580,7 @@ BOOL WINAPI RSAENH_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
* Success: TRUE.
* Failure: FALSE.
*
* NOTES
:
* NOTES
* Currently only the HP_HMAC_INFO dwParam type is defined.
* The HMAC_INFO struct will be deep copied into the hash object.
* See Internet RFC 2104 for details on the HMAC algorithm.
...
...
@@ -2504,6 +2637,11 @@ BOOL WINAPI RSAENH_CPSetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwPa
return
RSAENH_CPHashData
(
hProv
,
hHash
,
pCryptHash
->
pHMACInfo
->
pbInnerString
,
pCryptHash
->
pHMACInfo
->
cbInnerString
,
0
);
case
HP_HASHVAL
:
memcpy
(
pCryptHash
->
abHashValue
,
pbData
,
pCryptHash
->
dwHashSize
);
pCryptHash
->
dwState
=
RSAENH_HASHSTATE_FINISHED
;
return
TRUE
;
default:
SetLastError
(
NTE_BAD_TYPE
);
...
...
@@ -2522,24 +2660,170 @@ BOOL WINAPI RSAENH_CPSetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData,
/******************************************************************************
* CPSignHash (RSAENH.@)
*
* Sign a hash object
*
* PARAMS
* hProv [I] The key container, to which the hash object belongs.
* hHash [I] The hash object to be signed.
* dwKeySpec [I] AT_SIGNATURE or AT_KEYEXCHANGE: Key used to generate the signature.
* sDescription [I] Should be NULL for security reasons.
* dwFlags [I] 0, CRYPT_NOHASHOID or CRYPT_X931_FORMAT: Format of the signature.
* pbSignature [O] Buffer, to which the signature will be stored. May be NULL to query SigLen.
* pdwSigLen [I/O] Size of the buffer (in), Length of the signature (out)
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* FIXME: sDescription is currently ignored.
*/
BOOL
WINAPI
RSAENH_CPSignHash
(
HCRYPTPROV
hProv
,
HCRYPTHASH
hHash
,
DWORD
dwKeySpec
,
LPCWSTR
sDescription
,
DWORD
dwFlags
,
BYTE
*
pbSignature
,
DWORD
*
pdwSigLen
)
{
FIXME
(
"(stub)
\n
"
);
return
FALSE
;
HCRYPTKEY
hCryptKey
;
CRYPTKEY
*
pCryptKey
;
DWORD
dwHashLen
;
BYTE
abHashValue
[
RSAENH_MAX_HASH_SIZE
];
ALG_ID
aiAlgid
;
TRACE
(
"(hProv=%08lx, hHash=%08lx, dwKeySpec=%08lx, sDescription=%s, dwFlags=%08lx, "
"pbSignature=%p, pdwSigLen=%p)
\n
"
,
hProv
,
hHash
,
dwKeySpec
,
debugstr_w
(
sDescription
),
dwFlags
,
pbSignature
,
pdwSigLen
);
if
(
dwFlags
&
~
(
CRYPT_NOHASHOID
|
CRYPT_X931_FORMAT
))
{
SetLastError
(
NTE_BAD_FLAGS
);
return
FALSE
;
}
if
(
!
RSAENH_CPGetUserKey
(
hProv
,
dwKeySpec
,
&
hCryptKey
))
return
FALSE
;
if
(
!
lookup_handle
(
&
handle_table
,
(
unsigned
int
)
hCryptKey
,
RSAENH_MAGIC_KEY
,
(
OBJECTHDR
**
)
&
pCryptKey
))
{
SetLastError
(
NTE_NO_KEY
);
return
FALSE
;
}
dwHashLen
=
sizeof
(
DWORD
);
if
(
!
RSAENH_CPGetHashParam
(
hProv
,
hHash
,
HP_ALGID
,
(
BYTE
*
)
&
aiAlgid
,
&
dwHashLen
,
0
))
return
FALSE
;
dwHashLen
=
RSAENH_MAX_HASH_SIZE
;
if
(
!
RSAENH_CPGetHashParam
(
hProv
,
hHash
,
HP_HASHVAL
,
abHashValue
,
&
dwHashLen
,
0
))
return
FALSE
;
if
(
!
pbSignature
)
{
*
pdwSigLen
=
pCryptKey
->
dwKeyLen
;
return
TRUE
;
}
if
(
pCryptKey
->
dwKeyLen
>
*
pdwSigLen
)
{
SetLastError
(
ERROR_MORE_DATA
);
*
pdwSigLen
=
pCryptKey
->
dwKeyLen
;
return
FALSE
;
}
*
pdwSigLen
=
pCryptKey
->
dwKeyLen
;
if
(
!
build_hash_signature
(
pbSignature
,
*
pdwSigLen
,
aiAlgid
,
abHashValue
,
dwHashLen
,
dwFlags
))
{
return
FALSE
;
}
return
encrypt_block_impl
(
pCryptKey
->
aiAlgid
,
&
pCryptKey
->
context
,
pbSignature
,
pbSignature
,
RSAENH_ENCRYPT
);
}
/******************************************************************************
* CPVerifySignature (RSAENH.@)
*
* Verify the signature of a hash object.
*
* PARAMS
* hProv [I] The key container, to which the hash belongs.
* hHash [I] The hash for which the signature is verified.
* pbSignature [I] The binary signature.
* dwSigLen [I] Length of the signature BLOB.
* hPubKey [I] Public key used to verify the signature.
* sDescription [I] Should be NULL for security reasons.
* dwFlags [I] 0, CRYPT_NOHASHOID or CRYPT_X931_FORMAT: Format of the signature.
*
* RETURNS
* Success: TRUE (Signature is valid)
* Failure: FALSE (GetLastError() == NTE_BAD_SIGNATURE, if signature is invalid)
*
* NOTES
* FIXME: sDescription is currently ignored.
*/
BOOL
WINAPI
RSAENH_CPVerifySignature
(
HCRYPTPROV
hProv
,
HCRYPTHASH
hHash
,
CONST
BYTE
*
pbSignature
,
DWORD
dwSigLen
,
HCRYPTKEY
hPubKey
,
LPCWSTR
sDescription
,
DWORD
dwFlags
)
{
FIXME
(
"(stub)
\n
"
);
return
FALSE
;
BYTE
*
pbConstructed
=
NULL
,
*
pbDecrypted
=
NULL
;
CRYPTKEY
*
pCryptKey
;
DWORD
dwHashLen
;
ALG_ID
aiAlgid
;
BYTE
abHashValue
[
RSAENH_MAX_HASH_SIZE
];
BOOL
res
=
FALSE
;
TRACE
(
"(hProv=%08lx, hHash=%08lx, pbSignature=%p, dwSigLen=%ld, hPubKey=%08lx, sDescription=%s, "
"dwFlags=%08lx)
\n
"
,
hProv
,
hHash
,
pbSignature
,
dwSigLen
,
hPubKey
,
debugstr_w
(
sDescription
),
dwFlags
);
if
(
dwFlags
&
~
(
CRYPT_NOHASHOID
|
CRYPT_X931_FORMAT
))
{
SetLastError
(
NTE_BAD_FLAGS
);
return
FALSE
;
}
if
(
!
is_valid_handle
(
&
handle_table
,
hProv
,
RSAENH_MAGIC_CONTAINER
))
{
SetLastError
(
NTE_BAD_UID
);
return
FALSE
;
}
if
(
!
lookup_handle
(
&
handle_table
,
(
unsigned
int
)
hPubKey
,
RSAENH_MAGIC_KEY
,
(
OBJECTHDR
**
)
&
pCryptKey
))
{
SetLastError
(
NTE_BAD_KEY
);
return
FALSE
;
}
dwHashLen
=
sizeof
(
DWORD
);
if
(
!
RSAENH_CPGetHashParam
(
hProv
,
hHash
,
HP_ALGID
,
(
BYTE
*
)
&
aiAlgid
,
&
dwHashLen
,
0
))
return
FALSE
;
dwHashLen
=
RSAENH_MAX_HASH_SIZE
;
if
(
!
RSAENH_CPGetHashParam
(
hProv
,
hHash
,
HP_HASHVAL
,
abHashValue
,
&
dwHashLen
,
0
))
return
FALSE
;
pbConstructed
=
HeapAlloc
(
GetProcessHeap
(),
0
,
dwSigLen
);
if
(
!
pbConstructed
)
{
SetLastError
(
NTE_NO_MEMORY
);
goto
cleanup
;
}
pbDecrypted
=
HeapAlloc
(
GetProcessHeap
(),
0
,
dwSigLen
);
if
(
!
pbDecrypted
)
{
SetLastError
(
NTE_NO_MEMORY
);
goto
cleanup
;
}
if
(
!
encrypt_block_impl
(
pCryptKey
->
aiAlgid
,
&
pCryptKey
->
context
,
pbSignature
,
pbDecrypted
,
RSAENH_DECRYPT
))
{
goto
cleanup
;
}
if
(
!
build_hash_signature
(
pbConstructed
,
dwSigLen
,
aiAlgid
,
abHashValue
,
dwHashLen
,
dwFlags
))
{
goto
cleanup
;
}
if
(
memcmp
(
pbDecrypted
,
pbConstructed
,
dwSigLen
))
{
SetLastError
(
NTE_BAD_SIGNATURE
);
goto
cleanup
;
}
res
=
TRUE
;
cleanup:
if
(
pbConstructed
)
HeapFree
(
GetProcessHeap
(),
0
,
pbConstructed
);
if
(
pbDecrypted
)
HeapFree
(
GetProcessHeap
(),
0
,
pbDecrypted
);
return
res
;
}
static
const
WCHAR
szProviderKeys
[
3
][
97
]
=
{
...
...
dlls/rsaenh/tests/rsaenh.c
View file @
96ebad1a
...
...
@@ -56,6 +56,9 @@ static int init_environment(void)
hProv
=
(
HCRYPTPROV
)
INVALID_HANDLE_VALUE
;
result
=
CryptAcquireContext
(
&
hProv
,
szContainer
,
szProvider
,
PROV_RSA_FULL
,
CRYPT_VERIFYCONTEXT
);
ok
(
!
result
&&
GetLastError
()
==
NTE_BAD_FLAGS
,
"%d, %08lx
\n
"
,
result
,
GetLastError
());
if
(
!
CryptAcquireContext
(
&
hProv
,
szContainer
,
szProvider
,
PROV_RSA_FULL
,
0
))
{
ok
(
GetLastError
()
==
NTE_BAD_KEYSET
,
"%08lx
\n
"
,
GetLastError
());
...
...
@@ -823,6 +826,260 @@ static void test_import_private()
if
(
!
result
)
return
;
}
static
void
test_verify_signature
()
{
HCRYPTHASH
hHash
;
HCRYPTKEY
hPubSignKey
;
BYTE
abData
[]
=
"Wine rocks!"
;
BOOL
result
;
BYTE
abPubKey
[
148
]
=
{
0x06
,
0x02
,
0x00
,
0x00
,
0x00
,
0x24
,
0x00
,
0x00
,
0x52
,
0x53
,
0x41
,
0x31
,
0x00
,
0x04
,
0x00
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x71
,
0x64
,
0x9f
,
0x19
,
0x89
,
0x1c
,
0x21
,
0xcc
,
0x36
,
0xa3
,
0xc9
,
0x27
,
0x08
,
0x8a
,
0x09
,
0xc6
,
0xbe
,
0xeb
,
0xd3
,
0xf8
,
0x19
,
0xa9
,
0x92
,
0x57
,
0xe4
,
0xb9
,
0x5d
,
0xda
,
0x88
,
0x93
,
0xe4
,
0x6b
,
0x38
,
0x77
,
0x14
,
0x8a
,
0x96
,
0xc0
,
0xb6
,
0x4e
,
0x42
,
0xf5
,
0x01
,
0xdc
,
0xf0
,
0xeb
,
0x3c
,
0xc7
,
0x7b
,
0xc4
,
0xfd
,
0x7c
,
0xde
,
0x93
,
0x34
,
0x0a
,
0x92
,
0xe5
,
0x97
,
0x9c
,
0x3e
,
0x65
,
0xb8
,
0x91
,
0x2f
,
0xe3
,
0xf3
,
0x89
,
0xcd
,
0x6c
,
0x26
,
0xa4
,
0x6c
,
0xc7
,
0x6d
,
0x0b
,
0x2c
,
0xa2
,
0x0b
,
0x29
,
0xe2
,
0xfc
,
0x30
,
0xfa
,
0x20
,
0xdb
,
0x4c
,
0xb8
,
0x91
,
0xb8
,
0x69
,
0x63
,
0x96
,
0x41
,
0xc2
,
0xb4
,
0x60
,
0xeb
,
0xcd
,
0xff
,
0x3a
,
0x1f
,
0x94
,
0xb1
,
0x23
,
0xcf
,
0x0f
,
0x49
,
0xad
,
0xd5
,
0x33
,
0x85
,
0x71
,
0xaf
,
0x12
,
0x87
,
0x84
,
0xef
,
0xa0
,
0xea
,
0xe1
,
0xc1
,
0xd4
,
0xc7
,
0xe1
,
0x21
,
0x50
,
0xac
};
/* md2 with hash oid */
BYTE
abSignatureMD2
[
128
]
=
{
0x4a
,
0x4e
,
0xb7
,
0x5e
,
0x32
,
0xda
,
0xdb
,
0x67
,
0x9f
,
0x77
,
0x84
,
0x32
,
0x00
,
0xba
,
0x5f
,
0x6b
,
0x0d
,
0xcf
,
0xd9
,
0x99
,
0xbd
,
0x96
,
0x31
,
0xda
,
0x23
,
0x4c
,
0xd9
,
0x4a
,
0x90
,
0x84
,
0x20
,
0x59
,
0x51
,
0xdc
,
0xd4
,
0x93
,
0x3a
,
0xae
,
0x0a
,
0x0a
,
0xa1
,
0x76
,
0xfa
,
0xb5
,
0x68
,
0xee
,
0xc7
,
0x34
,
0x41
,
0xd3
,
0xe7
,
0x5a
,
0x0e
,
0x22
,
0x61
,
0x40
,
0xea
,
0x24
,
0x56
,
0xf1
,
0x91
,
0x5a
,
0xf7
,
0xa7
,
0x5b
,
0xf4
,
0x98
,
0x6b
,
0xc3
,
0xef
,
0xad
,
0xc0
,
0x5e
,
0x6b
,
0x87
,
0x76
,
0xcb
,
0x1f
,
0x62
,
0x06
,
0x7c
,
0xf6
,
0x48
,
0x97
,
0x81
,
0x8d
,
0xef
,
0x51
,
0x51
,
0xdc
,
0x21
,
0x91
,
0x57
,
0x1e
,
0x79
,
0x6f
,
0x49
,
0xb5
,
0xde
,
0x31
,
0x07
,
0x45
,
0x99
,
0x46
,
0xc3
,
0x4f
,
0xca
,
0x2d
,
0x0e
,
0x4c
,
0x10
,
0x25
,
0xcb
,
0x1a
,
0x98
,
0x63
,
0x41
,
0x93
,
0x47
,
0xc0
,
0xb2
,
0xbc
,
0x10
,
0x3c
,
0xe7
,
0xd4
,
0x3c
,
0x1e
};
/* md2 without hash oid */
BYTE
abSignatureMD2NoOID
[
128
]
=
{
0x0c
,
0x21
,
0x3e
,
0x60
,
0xf9
,
0xd0
,
0x36
,
0x2d
,
0xe1
,
0x10
,
0x45
,
0x45
,
0x85
,
0x03
,
0x29
,
0x19
,
0xef
,
0x19
,
0xd9
,
0xa6
,
0x7e
,
0x9c
,
0x0d
,
0xbd
,
0x03
,
0x0e
,
0xb9
,
0x51
,
0x9e
,
0x74
,
0x79
,
0xc4
,
0xde
,
0x25
,
0xf2
,
0x35
,
0x74
,
0x55
,
0xbc
,
0x65
,
0x7e
,
0x33
,
0x28
,
0xa8
,
0x1e
,
0x72
,
0xaa
,
0x99
,
0xdd
,
0xf5
,
0x26
,
0x20
,
0x29
,
0xf8
,
0xa6
,
0xdf
,
0x28
,
0x4b
,
0x1c
,
0xdb
,
0xa1
,
0x41
,
0x56
,
0xbc
,
0xf9
,
0x9c
,
0x66
,
0xc0
,
0x37
,
0x41
,
0x55
,
0xa0
,
0xe2
,
0xec
,
0xbf
,
0x71
,
0xf0
,
0x5d
,
0x25
,
0x01
,
0x75
,
0x91
,
0xe2
,
0x81
,
0xb2
,
0x9f
,
0x57
,
0xa7
,
0x5c
,
0xd2
,
0xfa
,
0x66
,
0xdb
,
0x71
,
0x2b
,
0x1f
,
0xad
,
0x30
,
0xde
,
0xea
,
0x49
,
0x73
,
0x30
,
0x6a
,
0x22
,
0x54
,
0x49
,
0x4e
,
0xae
,
0xf6
,
0x88
,
0xc9
,
0xff
,
0x71
,
0xba
,
0xbf
,
0x27
,
0xc5
,
0xfa
,
0x06
,
0xe2
,
0x91
,
0x71
,
0x8a
,
0x7e
,
0x0c
,
0xc2
,
0x07
};
/* md4 with hash oid */
BYTE
abSignatureMD4
[
128
]
=
{
0x1c
,
0x78
,
0xaa
,
0xea
,
0x74
,
0xf4
,
0x83
,
0x51
,
0xae
,
0x66
,
0xe3
,
0xa9
,
0x1c
,
0x03
,
0x39
,
0x1b
,
0xac
,
0x7e
,
0x4e
,
0x85
,
0x7e
,
0x1c
,
0x38
,
0xd2
,
0x82
,
0x43
,
0xb3
,
0x6f
,
0x6f
,
0x46
,
0x45
,
0x8e
,
0x17
,
0x74
,
0x58
,
0x29
,
0xca
,
0xe1
,
0x03
,
0x13
,
0x45
,
0x79
,
0x34
,
0xdf
,
0x5c
,
0xd6
,
0xc3
,
0xf9
,
0x7a
,
0x1c
,
0x9d
,
0xff
,
0x6f
,
0x03
,
0x7d
,
0x0f
,
0x59
,
0x1a
,
0x2d
,
0x0e
,
0x94
,
0xb4
,
0x75
,
0x96
,
0xd1
,
0x48
,
0x63
,
0x6e
,
0xb2
,
0xc4
,
0x5c
,
0xd9
,
0xab
,
0x49
,
0xb4
,
0x90
,
0xd9
,
0x57
,
0x04
,
0x6e
,
0x4c
,
0xb6
,
0xea
,
0x00
,
0x94
,
0x4a
,
0x34
,
0xa0
,
0xd9
,
0x63
,
0xef
,
0x2c
,
0xde
,
0x5b
,
0xb9
,
0xbe
,
0x35
,
0xc8
,
0xc1
,
0x31
,
0xb5
,
0x31
,
0x15
,
0x18
,
0x90
,
0x39
,
0xf5
,
0x2a
,
0x34
,
0x6d
,
0xb4
,
0xab
,
0x09
,
0x34
,
0x69
,
0x54
,
0x4d
,
0x11
,
0x2f
,
0xf3
,
0xa2
,
0x36
,
0x0e
,
0xa8
,
0x45
,
0xe7
,
0x36
,
0xac
};
/* md4 without hash oid */
BYTE
abSignatureMD4NoOID
[
128
]
=
{
0xd3
,
0x60
,
0xb2
,
0xb0
,
0x22
,
0x0a
,
0x99
,
0xda
,
0x04
,
0x85
,
0x64
,
0xc6
,
0xc6
,
0xdb
,
0x11
,
0x24
,
0xe9
,
0x68
,
0x2d
,
0xf7
,
0x09
,
0xef
,
0xb6
,
0xa0
,
0xa2
,
0xfe
,
0x45
,
0xee
,
0x85
,
0x49
,
0xcd
,
0x36
,
0xf7
,
0xc7
,
0x9d
,
0x2b
,
0x4c
,
0x68
,
0xda
,
0x85
,
0x8c
,
0x50
,
0xcc
,
0x4f
,
0x4b
,
0xe1
,
0x82
,
0xc3
,
0xbe
,
0xa3
,
0xf1
,
0x78
,
0x6b
,
0x60
,
0x42
,
0x3f
,
0x67
,
0x22
,
0x14
,
0xe4
,
0xe1
,
0xa4
,
0x6e
,
0xa9
,
0x4e
,
0xf1
,
0xd4
,
0xb0
,
0xce
,
0x82
,
0xac
,
0x06
,
0xba
,
0x2c
,
0xbc
,
0xf7
,
0xcb
,
0xf6
,
0x0c
,
0x3f
,
0xf6
,
0x79
,
0xfe
,
0xb3
,
0xd8
,
0x5a
,
0xbc
,
0xdb
,
0x05
,
0x41
,
0xa4
,
0x07
,
0x57
,
0x9e
,
0xa2
,
0x96
,
0xfc
,
0x60
,
0x4b
,
0xf7
,
0x6f
,
0x86
,
0x26
,
0x1f
,
0xc2
,
0x2c
,
0x67
,
0x08
,
0xcd
,
0x7f
,
0x91
,
0xe9
,
0x16
,
0xb5
,
0x0e
,
0xd9
,
0xc4
,
0xc4
,
0x97
,
0xeb
,
0x91
,
0x3f
,
0x20
,
0x6c
,
0xf0
,
0x68
,
0x86
,
0x7f
};
/* md5 with hash oid */
BYTE
abSignatureMD5
[
128
]
=
{
0x4f
,
0xe0
,
0x8c
,
0x9b
,
0x43
,
0xdd
,
0x02
,
0xe5
,
0xf4
,
0xa1
,
0xdd
,
0x88
,
0x4c
,
0x9c
,
0x40
,
0x0f
,
0x6c
,
0x43
,
0x86
,
0x64
,
0x00
,
0xe6
,
0xac
,
0xf7
,
0xd0
,
0x92
,
0xaa
,
0xc4
,
0x62
,
0x9a
,
0x48
,
0x98
,
0x1a
,
0x56
,
0x6d
,
0x75
,
0xec
,
0x04
,
0x89
,
0xec
,
0x69
,
0x93
,
0xd6
,
0x61
,
0x37
,
0xb2
,
0x36
,
0xb5
,
0xb2
,
0xba
,
0xf2
,
0xf5
,
0x21
,
0x0c
,
0xf1
,
0x04
,
0xc8
,
0x2d
,
0xf5
,
0xa0
,
0x8d
,
0x6d
,
0x10
,
0x0b
,
0x68
,
0x63
,
0xf2
,
0x08
,
0x68
,
0xdc
,
0xbd
,
0x95
,
0x25
,
0x7d
,
0xee
,
0x63
,
0x5c
,
0x3b
,
0x98
,
0x4c
,
0xea
,
0x41
,
0xdc
,
0x6a
,
0x8b
,
0x6c
,
0xbb
,
0x29
,
0x2b
,
0x1c
,
0x5c
,
0x8b
,
0x7d
,
0x94
,
0x24
,
0xa9
,
0x7a
,
0x62
,
0x94
,
0xf3
,
0x3a
,
0x6a
,
0xb2
,
0x4c
,
0x33
,
0x59
,
0x00
,
0xcd
,
0x7d
,
0x37
,
0x79
,
0x90
,
0x31
,
0xd1
,
0xd9
,
0x84
,
0x12
,
0xe5
,
0x08
,
0x5e
,
0xb3
,
0x60
,
0x61
,
0x27
,
0x78
,
0x37
,
0x63
,
0x01
};
/* md5 without hash oid */
BYTE
abSignatureMD5NoOID
[
128
]
=
{
0xc6
,
0xad
,
0x5c
,
0x2b
,
0x9b
,
0xe0
,
0x99
,
0x2f
,
0x5e
,
0x55
,
0x04
,
0x32
,
0x65
,
0xe0
,
0xb5
,
0x75
,
0x01
,
0x9a
,
0x11
,
0x4d
,
0x0e
,
0x9a
,
0xe1
,
0x9f
,
0xc7
,
0xbf
,
0x77
,
0x6d
,
0xa9
,
0xfd
,
0xcc
,
0x9d
,
0x8b
,
0xd1
,
0x31
,
0xed
,
0x5a
,
0xd2
,
0xe5
,
0x5f
,
0x42
,
0x3b
,
0xb5
,
0x3c
,
0x32
,
0x30
,
0x88
,
0x49
,
0xcb
,
0x67
,
0xb8
,
0x2e
,
0xc9
,
0xf5
,
0x2b
,
0xc8
,
0x35
,
0x71
,
0xb5
,
0x1b
,
0x32
,
0x3f
,
0x44
,
0x4c
,
0x66
,
0x93
,
0xcb
,
0xe8
,
0x48
,
0x7c
,
0x14
,
0x23
,
0xfb
,
0x12
,
0xa5
,
0xb7
,
0x86
,
0x94
,
0x6b
,
0x19
,
0x17
,
0x20
,
0xc6
,
0xb8
,
0x09
,
0xe8
,
0xbb
,
0xdb
,
0x00
,
0x2b
,
0x96
,
0x4a
,
0x93
,
0x00
,
0x26
,
0xd3
,
0x07
,
0xa0
,
0x06
,
0xce
,
0x5a
,
0x13
,
0x69
,
0x6b
,
0x62
,
0x5a
,
0x56
,
0x61
,
0x6a
,
0xd8
,
0x11
,
0x3b
,
0xd5
,
0x67
,
0xc7
,
0x4d
,
0xf6
,
0x66
,
0x63
,
0xc5
,
0xe3
,
0x8f
,
0x7c
,
0x7c
,
0xb1
,
0x3e
,
0x55
,
0x43
};
/* sha with hash oid */
BYTE
abSignatureSHA
[
128
]
=
{
0x5a
,
0x4c
,
0x66
,
0xc9
,
0x30
,
0x67
,
0xcb
,
0x91
,
0x3c
,
0x4d
,
0xd5
,
0x8d
,
0xea
,
0x4e
,
0x85
,
0xcd
,
0xd9
,
0x68
,
0x3a
,
0xf3
,
0x24
,
0x3c
,
0x99
,
0x24
,
0x25
,
0x32
,
0x93
,
0x3d
,
0xd6
,
0x2f
,
0x86
,
0x94
,
0x23
,
0x09
,
0xee
,
0x02
,
0xd4
,
0x15
,
0xdc
,
0x5f
,
0x0e
,
0x44
,
0x45
,
0x13
,
0x5f
,
0x18
,
0x5d
,
0x1a
,
0xd7
,
0x0b
,
0xd1
,
0x23
,
0xd6
,
0x35
,
0x98
,
0x52
,
0x57
,
0x45
,
0x74
,
0x92
,
0xe3
,
0x50
,
0xb4
,
0x20
,
0x28
,
0x2a
,
0x11
,
0xbf
,
0x49
,
0xb4
,
0x2c
,
0xc5
,
0xd4
,
0x1a
,
0x27
,
0x4e
,
0xdf
,
0xa0
,
0xb5
,
0x7a
,
0xc8
,
0x14
,
0xdd
,
0x9b
,
0xb6
,
0xca
,
0xd6
,
0xff
,
0xb2
,
0x6b
,
0xd8
,
0x98
,
0x67
,
0x80
,
0xab
,
0x53
,
0x52
,
0xbb
,
0xe1
,
0x2a
,
0xce
,
0x79
,
0x2f
,
0x00
,
0x53
,
0x26
,
0xd8
,
0xa7
,
0x43
,
0xca
,
0x72
,
0x0e
,
0x68
,
0x97
,
0x37
,
0x71
,
0x87
,
0xc2
,
0x6a
,
0x98
,
0xbb
,
0x6c
,
0xa0
,
0x01
,
0xff
,
0x04
,
0x9d
,
0xa6
};
/* sha without hash oid */
BYTE
abSignatureSHANoOID
[
128
]
=
{
0x86
,
0xa6
,
0x2b
,
0x9a
,
0x04
,
0xda
,
0x47
,
0xc6
,
0x4f
,
0x97
,
0x8a
,
0x8a
,
0xf4
,
0xfa
,
0x63
,
0x1a
,
0x32
,
0x89
,
0x56
,
0x41
,
0x37
,
0x91
,
0x15
,
0x2f
,
0x2d
,
0x1c
,
0x8f
,
0xdc
,
0x88
,
0x40
,
0xbb
,
0x37
,
0x3e
,
0x06
,
0x33
,
0x1b
,
0xde
,
0xda
,
0x7c
,
0x65
,
0x91
,
0x35
,
0xca
,
0x45
,
0x17
,
0x0e
,
0x24
,
0xbe
,
0x9e
,
0xf6
,
0x4e
,
0x8a
,
0xa4
,
0x3e
,
0xca
,
0xe6
,
0x11
,
0x36
,
0xb8
,
0x3a
,
0xf0
,
0xde
,
0x71
,
0xfe
,
0xdd
,
0xb3
,
0xcb
,
0x6c
,
0x39
,
0xe0
,
0x5f
,
0x0c
,
0x9e
,
0xa8
,
0x40
,
0x26
,
0x9c
,
0x81
,
0xe9
,
0xc4
,
0x15
,
0x90
,
0xbf
,
0x4f
,
0xd2
,
0xc1
,
0xa1
,
0x80
,
0x52
,
0xfd
,
0xf6
,
0x3d
,
0x99
,
0x1b
,
0x9c
,
0x8a
,
0x27
,
0x1b
,
0x0c
,
0x9a
,
0xf3
,
0xf9
,
0xa2
,
0x00
,
0x3e
,
0x5b
,
0xdf
,
0xc2
,
0xb4
,
0x71
,
0xa5
,
0xbd
,
0xf8
,
0xae
,
0x63
,
0xbb
,
0x4a
,
0xc9
,
0xdd
,
0x67
,
0xc1
,
0x3e
,
0x93
,
0xee
,
0xf1
,
0x1f
,
0x24
,
0x5b
};
result
=
CryptImportKey
(
hProv
,
abPubKey
,
148
,
0
,
0
,
&
hPubSignKey
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptCreateHash
(
hProv
,
CALG_MD2
,
0
,
0
,
&
hHash
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptHashData
(
hHash
,
abData
,
(
DWORD
)
sizeof
(
abData
),
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureMD2
,
128
,
hPubSignKey
,
NULL
,
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureMD2NoOID
,
128
,
hPubSignKey
,
NULL
,
CRYPT_NOHASHOID
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
/* Next test fails on WinXP SP2. It seems that CPVerifySignature doesn't care about
* the OID at all. */
/*result = CryptVerifySignature(hHash, abSignatureMD2NoOID, 128, hPubSignKey, NULL, 0);
ok(!result && GetLastError()==NTE_BAD_SIGNATURE, "%08lx\n", GetLastError());
if (result) return;*/
result
=
CryptCreateHash
(
hProv
,
CALG_MD4
,
0
,
0
,
&
hHash
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptHashData
(
hHash
,
abData
,
(
DWORD
)
sizeof
(
abData
),
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureMD4
,
128
,
hPubSignKey
,
NULL
,
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureMD4NoOID
,
128
,
hPubSignKey
,
NULL
,
CRYPT_NOHASHOID
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptCreateHash
(
hProv
,
CALG_MD5
,
0
,
0
,
&
hHash
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptHashData
(
hHash
,
abData
,
(
DWORD
)
sizeof
(
abData
),
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureMD5
,
128
,
hPubSignKey
,
NULL
,
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureMD5NoOID
,
128
,
hPubSignKey
,
NULL
,
CRYPT_NOHASHOID
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptCreateHash
(
hProv
,
CALG_SHA
,
0
,
0
,
&
hHash
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptHashData
(
hHash
,
abData
,
(
DWORD
)
sizeof
(
abData
),
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureSHA
,
128
,
hPubSignKey
,
NULL
,
0
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
result
=
CryptVerifySignature
(
hHash
,
abSignatureSHANoOID
,
128
,
hPubSignKey
,
NULL
,
CRYPT_NOHASHOID
);
ok
(
result
,
"%08lx
\n
"
,
GetLastError
());
if
(
!
result
)
return
;
}
START_TEST
(
rsaenh
)
{
if
(
!
init_environment
())
...
...
@@ -839,5 +1096,6 @@ START_TEST(rsaenh)
test_mac
();
test_block_cipher_modes
();
test_import_private
();
test_verify_signature
();
clean_up_environment
();
}
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