2 * Copyright (c) 2011-2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 #ifndef _SECOTRIDENTITYPRIV_H_
27 #include <CoreFoundation/CFRuntime.h>
28 #include <CoreFoundation/CFData.h>
30 #include <Security/SecKey.h>
32 #include <Security/oidsalg.h>
34 #include <CommonCrypto/CommonDigest.h> // DIGEST_LENGTH
35 #include <Security/SecOTR.h>
39 // OAEP Padding, uses lots of space. Might need this to be data
40 // Driven when we support more key types.
41 #define kPaddingOverhead (2 + 2 * CC_SHA1_DIGEST_LENGTH + 1)
44 // Identity opaque structs
47 #define kMPIDHashSize CC_SHA1_DIGEST_LENGTH
49 struct _SecOTRFullIdentity
{
52 SecKeyRef publicSigningKey
;
53 SecKeyRef privateSigningKey
;
54 CFDataRef privateKeyPersistentRef
;
56 bool isMessageProtectionKey
;
57 uint8_t publicIDHash
[kMPIDHashSize
];
61 struct _SecOTRPublicIdentity
{
64 SecKeyRef publicSigningKey
;
68 uint8_t hash
[kMPIDHashSize
];
76 extern const SecAsn1AlgId
*kOTRSignatureAlgIDPtr
;
77 void EnsureOTRAlgIDInited(void);
79 // Private functions for Public and Full IDs
81 bool SecOTRFIAppendSignature(SecOTRFullIdentityRef fullID
,
83 CFMutableDataRef appendTo
,
86 void SecOTRFIAppendPublicHash(SecOTRFullIdentityRef fullID
, CFMutableDataRef appendTo
);
87 bool SecOTRFIComparePublicHash(SecOTRFullIdentityRef fullID
, const uint8_t hash
[kMPIDHashSize
]);
89 size_t SecOTRFISignatureSize(SecOTRFullIdentityRef privateID
);
91 bool SecOTRFICompareToPublicKey(SecOTRFullIdentityRef fullID
, SecKeyRef publicKey
);
93 bool SecOTRPIVerifySignature(SecOTRPublicIdentityRef publicID
,
94 const uint8_t *dataToHash
, size_t amountToHash
,
95 const uint8_t *signatureStart
, size_t signatureSize
, CFErrorRef
*error
);
97 bool SecOTRPIEqualToBytes(SecOTRPublicIdentityRef id
, const uint8_t*bytes
, CFIndex size
);
98 bool SecOTRPIEqual(SecOTRPublicIdentityRef left
, SecOTRPublicIdentityRef right
);
100 size_t SecOTRPISignatureSize(SecOTRPublicIdentityRef publicID
);
102 void SecOTRPICopyHash(SecOTRPublicIdentityRef publicID
, uint8_t hash
[kMPIDHashSize
]);
103 void SecOTRPIAppendHash(SecOTRPublicIdentityRef publicID
, CFMutableDataRef appendTo
);
105 bool SecOTRPICompareHash(SecOTRPublicIdentityRef publicID
, const uint8_t hash
[kMPIDHashSize
]);
107 bool SecOTRPICompareToPublicKey(SecOTRPublicIdentityRef publicID
, SecKeyRef publicKey
);
110 // Utility streaming functions
111 OSStatus
insertSize(CFIndex size
, uint8_t* here
);
112 OSStatus
appendSize(CFIndex size
, CFMutableDataRef into
);
113 OSStatus
readSize(const uint8_t** data
, size_t* limit
, uint16_t* size
);
115 OSStatus
appendPublicOctets(SecKeyRef fromKey
, CFMutableDataRef appendTo
);
116 OSStatus
appendPublicOctetsAndSize(SecKeyRef fromKey
, CFMutableDataRef appendTo
);
117 OSStatus
appendSizeAndData(CFDataRef data
, CFMutableDataRef appendTo
);
119 SecKeyRef
CreateECPublicKeyFrom(CFAllocatorRef allocator
, const uint8_t** data
, size_t* limit
);
121 bool SecOTRCreateError(enum SecOTRError family
, CFIndex errorCode
, CFStringRef descriptionString
, CFErrorRef previousError
, CFErrorRef
*newError
);