• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.10.1/Security-57031.1.35/Security/sec/Security/

Lines Matching refs:session

128     SecOTRSessionRef session = (SecOTRSessionRef)cf;
130 SecOTRAuthStateString(session->_state),
131 session->_compactAppleMessages ? "C" :"c",
132 session->_me ? "F" : "f",
133 session->_them ? "P" : "p",
134 session->_receivedDHMessage ? "D" : "d",
135 session->_receivedDHKeyMessage ? "K" : "k",
136 session->_keyID,
137 session->_theirKeyID,
138 session->_theirPreviousKey ? "P" : "p",
139 session->_theirKey ? "T" : "t");
143 SecOTRSessionRef session = (SecOTRSessionRef)cf;
145 CFReleaseNull(session->_receivedDHMessage);
146 CFReleaseNull(session->_receivedDHKeyMessage);
148 CFReleaseNull(session->_me);
149 CFReleaseNull(session->_myKey);
150 CFReleaseNull(session->_myNextKey);
152 CFReleaseNull(session->_them);
153 CFReleaseNull(session->_theirKey);
154 CFReleaseNull(session->_theirPreviousKey);
156 CFReleaseNull(session->_macKeysToExpose);
158 dispatch_release(session->_queue);
161 static void SecOTRSessionResetInternal(SecOTRSessionRef session)
163 session->_state = kIdle;
165 CFReleaseNull(session->_receivedDHMessage);
166 CFReleaseNull(session->_receivedDHKeyMessage);
168 session->_keyID = 0;
169 CFReleaseNull(session->_myKey);
170 CFReleaseNull(session->_myNextKey);
171 //session->_myNextKey = SecOTRFullDHKCreate(kCFAllocatorDefault);
172 session->_theirKeyID = 0;
173 CFReleaseNull(session->_theirKey);
174 CFReleaseNull(session->_theirPreviousKey);
175 CFReleaseNull(session->_macKeysToExpose);
176 session->_macKeysToExpose = CFDataCreateMutable(kCFAllocatorDefault, 0);
178 bzero(session->_keyCache, sizeof(session->_keyCache));
181 void SecOTRSessionReset(SecOTRSessionRef session)
183 dispatch_sync_f(session->_queue, session, (dispatch_function_t) SecOTRSessionResetInternal);
247 static void SecOTRSFindKeysForMessage(SecOTRSessionRef session,
269 if (0 == constant_memcmp(session->_keyCache[i]._fullKeyHash, SecFDHKGetHash(myKey), CCSHA1_OUTPUT_SIZE)
270 && (0 == constant_memcmp(session->_keyCache[i]._publicKeyHash, SecPDHKGetHash(theirKey), CCSHA1_OUTPUT_SIZE))) {
271 cachedKeys = &session->_keyCache[i];
275 if (emptyKeys == NULL && SOSOTRSCacheEntryIsEmpty(&(session->_keyCache[i]))) {
276 emptyKeys = &session->_keyCache[i];
283 emptyKeys = &session->_keyCache[0];
314 SecOTRSessionRef session = CFTypeAllocate(SecOTRSession, struct _SecOTRSession, allocator);
319 session->_queue = dispatch_queue_create("OTRSession", DISPATCH_QUEUE_SERIAL);
321 session->_me = NULL;
322 session->_them = NULL;
323 session->_myKey = NULL;
324 session->_myNextKey = NULL;
325 session->_theirKey = NULL;
326 session->_theirPreviousKey = NULL;
327 session->_receivedDHMessage = NULL;
328 session->_receivedDHKeyMessage = NULL;
329 session->_textOutput = false;
330 session->_compactAppleMessages = false;
332 bzero(session->_keyCache, sizeof(session->_keyCache));
338 require_noerr(ReadLong(&bytes, &size, &session->_state), fail);
339 session->_me = SecOTRFullIdentityCreateFromBytes(kCFAllocatorDefault, &bytes, &size, NULL);
340 require(session->_me != NULL, fail);
341 session->_them = SecOTRPublicIdentityCreateFromBytes(kCFAllocatorDefault, &bytes, &size, NULL);
342 require(session->_them != NULL, fail);
344 require(size > sizeof(session->_r), fail);
345 memcpy(session->_r, bytes, sizeof(session->_r));
346 bytes += sizeof(session->_r);
347 size -= sizeof(session->_r);
353 session->_receivedDHMessage = CFDataCreateMutableFromOTRDATA(kCFAllocatorDefault, &bytes, &size);
361 session->_receivedDHKeyMessage = CFDataCreateMutableFromOTRDATA(kCFAllocatorDefault, &bytes, &size);
368 if (ready && session->_state == kIdle)
369 session->_state = kDone;
372 require_noerr(ReadLong(&bytes, &size, &session->_keyID), fail);
373 if (session->_keyID > 0) {
374 session->_myKey = SecOTRFullDHKCreateFromBytes(kCFAllocatorDefault, &bytes, &size);
375 require(session->_myKey != NULL, fail);
376 session->_myNextKey = SecOTRFullDHKCreateFromBytes(kCFAllocatorDefault, &bytes, &size);
377 require(session->_myNextKey != NULL, fail);
380 require_noerr(ReadLong(&bytes, &size, &session->_theirKeyID), fail);
381 if (session->_theirKeyID > 0) {
382 if (session->_theirKeyID > 1) {
383 session->_theirPreviousKey = SecOTRPublicDHKCreateFromSerialization(kCFAllocatorDefault, &bytes, &size);
384 require(session->_theirPreviousKey != NULL, fail);
386 session->_theirKey = SecOTRPublicDHKCreateFromSerialization(kCFAllocatorDefault, &bytes, &size);
387 require(session->_theirKey != NULL, fail);
391 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirKey, false, NULL, NULL, &counter);
393 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirKey, true, NULL, NULL, &counter);
395 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirPreviousKey, false, NULL, NULL, &counter);
397 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirPreviousKey, true, NULL, NULL, &counter);
399 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirKey, false, NULL, NULL, &counter);
401 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirKey, true, NULL, NULL, &counter);
403 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirPreviousKey, false, NULL, NULL, &counter);
405 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirPreviousKey, true, NULL, NULL, &counter);
408 session->_macKeysToExpose = CFDataCreateMutableFromOTRDATA(kCFAllocatorDefault, &bytes, &size);
409 require(session->_macKeysToExpose != NULL, fail);
411 require_noerr(ReadByteAsBool(&bytes, &size, &session->_textOutput), fail);
414 require_noerr(ReadByteAsBool(&bytes, &size, &session->_compactAppleMessages), fail);
417 result = session;
418 session = NULL;
421 CFReleaseNull(session);
426 OSStatus SecOTRSAppendSerialization(SecOTRSessionRef session, CFMutableDataRef serializeInto)
430 require(session, abort);
435 dispatch_sync(session->_queue, ^{
440 AppendLong(serializeInto, session->_state);
442 result = (SecOTRFIAppendSerialization(session->_me, serializeInto, NULL)) ? errSecSuccess : errSecParam;
445 result = (SecOTRPIAppendSerialization(session->_them, serializeInto, NULL)) ? errSecSuccess : errSecParam;
449 CFDataAppendBytes(serializeInto, session->_r, sizeof(session->_r));
451 if (session->_receivedDHMessage == NULL) {
455 AppendCFDataAsDATA(serializeInto, session->_receivedDHMessage);
458 if (session->_receivedDHKeyMessage == NULL) {
462 AppendCFDataAsDATA(serializeInto, session->_receivedDHKeyMessage);
465 AppendLong(serializeInto, session->_keyID);
466 if (session->_keyID > 0) {
467 SecFDHKAppendSerialization(session->_myKey, serializeInto);
468 SecFDHKAppendSerialization(session->_myNextKey, serializeInto);
471 AppendLong(serializeInto, session->_theirKeyID);
472 if (session->_theirKeyID > 0) {
473 if (session->_theirKeyID > 1) {
474 SecPDHKAppendSerialization(session->_theirPreviousKey, serializeInto);
476 SecPDHKAppendSerialization(session->_theirKey, serializeInto);
480 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirKey, false, NULL, NULL, &counter);
482 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirKey, true, NULL, NULL, &counter);
484 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirPreviousKey, false, NULL, NULL, &counter);
486 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirPreviousKey, true, NULL, NULL, &counter);
488 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirKey, false, NULL, NULL, &counter);
490 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirKey, true, NULL, NULL, &counter);
492 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirPreviousKey, false, NULL, NULL, &counter);
494 SecOTRSFindKeysForMessage(session, session->_myNextKey, session->_theirPreviousKey, true, NULL, NULL, &counter);
497 AppendCFDataAsDATA(serializeInto, session->_macKeysToExpose);
499 AppendByte(serializeInto, session->_textOutput ? 1 : 0);
500 AppendByte(serializeInto, session->_compactAppleMessages ? 1 : 0);
512 bool SecOTRSGetIsReadyForMessages(SecOTRSessionRef session)
516 dispatch_sync(session->_queue, ^{ result = session->_state == kDone; });
521 bool SecOTRSGetIsIdle(SecOTRSessionRef session)
525 dispatch_sync(session->_queue, ^{ result = session->_state == kIdle; });
530 static void SecOTRSExpireCachedKeysForFullKey(SecOTRSessionRef session, SecOTRFullDHKeyRef myKey)
534 if (0 == constant_memcmp(session->_keyCache[i]._fullKeyHash, SecFDHKGetHash(myKey), CCSHA1_OUTPUT_SIZE)) {
535 CFDataAppendBytes(session->_macKeysToExpose, session->_keyCache[i]._receiveMacKey, sizeof(session->_keyCache[i]._receiveMacKey));
537 bzero(&session->_keyCache[i], sizeof(session->_keyCache[i]));
542 static void SecOTRSExpireCachedKeysForPublicKey(SecOTRSessionRef session, SecOTRPublicDHKeyRef theirKey)
546 if (0 == constant_memcmp(session->_keyCache[i]._publicKeyHash, SecPDHKGetHash(theirKey), CCSHA1_OUTPUT_SIZE)) {
547 CFDataAppendBytes(session->_macKeysToExpose, session->_keyCache[i]._receiveMacKey, sizeof(session->_keyCache[i]._receiveMacKey));
549 bzero(&session->_keyCache[i], sizeof(session->_keyCache[i]));
554 static void SecOTRSPrecalculateForPair(SecOTRSessionRef session,
561 SecOTRSFindKeysForMessage(session, myKey, theirKey, true, NULL, NULL, NULL);
562 SecOTRSFindKeysForMessage(session, myKey, theirKey, false, NULL, NULL, NULL);
565 static void SecOTRSPrecalculateKeysInternal(SecOTRSessionRef session)
567 SecOTRSPrecalculateForPair(session, session->_myKey, session->_theirKey);
568 SecOTRSPrecalculateForPair(session, session->_myNextKey, session->_theirKey);
569 SecOTRSPrecalculateForPair(session, session->_myKey, session->_theirPreviousKey);
570 SecOTRSPrecalculateForPair(session, session->_myNextKey, session->_theirPreviousKey);
573 void SecOTRSPrecalculateKeys(SecOTRSessionRef session)
575 dispatch_sync_f(session->_queue, session, (dispatch_function_t) SecOTRSPrecalculateKeysInternal);
578 enum SecOTRSMessageKind SecOTRSGetMessageKind(SecOTRSessionRef session, CFDataRef message)
605 static OSStatus SecOTRSSignAndProtectRaw_locked(SecOTRSessionRef session,
614 AppendLong(destinationMessage, session->_keyID);
615 AppendLong(destinationMessage, session->_theirKeyID);
616 SecFDHKAppendPublicSerialization(session->_myNextKey, destinationMessage);
637 CFDataAppend(destinationMessage, session->_macKeysToExpose);
644 static OSStatus SecOTRSSignAndProtectCompact_locked(SecOTRSessionRef session,
650 AppendByte(destinationMessage, (session->_theirKeyID & 0x1) ? kOddCompactDataMessage : kEvenCompactDataMessage);
652 SecFDHKAppendCompactPublicSerialization(session->_myNextKey, destinationMessage);
676 OSStatus SecOTRSSignAndProtectMessage(SecOTRSessionRef session,
682 require(session, abort);
686 dispatch_sync(session->_queue, ^{
687 if (session->_myKey == NULL ||
688 session->_theirKey == NULL) {
696 SecOTRSFindKeysForMessage(session, session->_myKey, session->_theirKey,
701 CFMutableDataRef destinationMessage = session->_textOutput ? CFDataCreateMutable(kCFAllocatorDefault, 0) : CFRetainSafe(protectedMessage);
703 result = session->_compactAppleMessages ? SecOTRSSignAndProtectCompact_locked(session, sourceMessage, destinationMessage, messageKey, macKey, counter)
704 : SecOTRSSignAndProtectRaw_locked(session, sourceMessage, destinationMessage, messageKey, macKey, counter);
707 if (session->_textOutput) {
711 CFDataSetLength(session->_macKeysToExpose, 0);
723 static void SecOTRAcceptNewRemoteKey(SecOTRSessionRef session, SecOTRPublicDHKeyRef newKey)
725 if (session->_theirPreviousKey) {
726 SecOTRSExpireCachedKeysForPublicKey(session, session->_theirPreviousKey);
729 CFReleaseNull(session->_theirPreviousKey);
730 session->_theirPreviousKey = session->_theirKey;
731 session->_theirKey = CFRetainSafe(newKey);
733 session->_theirKeyID += 1;
736 static void SecOTRGenerateNewProposedKey(SecOTRSessionRef session)
738 SecOTRSExpireCachedKeysForFullKey(session, session->_myKey);
742 SecOTRFullDHKeyRef oldKey = session->_myKey;
743 session->_myKey = session->_myNextKey;
744 session->_myNextKey = oldKey;
748 SecFDHKNewKey(session->_myNextKey);
750 session->_keyID += 1;
753 static OSStatus SecOTRVerifyAndExposeRaw_locked(SecOTRSessionRef session,
778 require_action_quiet(theirID == session->_theirKeyID || (theirID == (session->_theirKeyID - 1) && session->_theirPreviousKey != NULL),
780 result = ((theirID + 1) < session->_theirKeyID) ? errSecOTRTooOld : errSecOTRIDTooNew);
784 require_action_quiet(myID == session->_keyID || (myID == session->_keyID + 1 && session->_myNextKey != NULL),
786 result = (myID < session->_keyID) ? errSecOTRTooOld : errSecOTRIDTooNew);
795 SecOTRFullDHKeyRef myKeyForMessage = (myID == session->_keyID) ? session->_myKey : session->_myNextKey;
796 SecOTRPublicDHKeyRef theirKeyForMessage = (theirID == session->_theirKeyID) ? session->_theirKey : session->_theirPreviousKey;
798 SecOTRSFindKeysForMessage(session, myKeyForMessage, theirKeyForMessage, false,
837 bool acceptTheirNewKey = newKey != NULL && theirID == session->_theirKeyID;
840 SecOTRAcceptNewRemoteKey(session, newKey);
843 if (myID == (session->_keyID + 1)) {
844 SecOTRGenerateNewProposedKey(session);
847 SecOTRSPrecalculateKeysInternal(session);
854 static OSStatus SecOTRVerifyAndExposeRawCompact_locked(SecOTRSessionRef session,
874 bool useCurrentKey = useEvenKey ^ (session->_keyID & 1);
875 SecOTRFullDHKeyRef myKeyForMessage = useCurrentKey ? session->_myKey : session->_myNextKey;
881 bool proposalIsNew = !CFEqualSafe(theirProposal, session->_theirKey);
882 SecOTRPublicDHKeyRef theirKeyForMessage = proposalIsNew ? session->_theirKey : session->_theirPreviousKey;
888 SecOTRSFindKeysForMessage(session, myKeyForMessage, theirKeyForMessage, false, &messageKey, &macKey, &theirCounter);
922 SecOTRAcceptNewRemoteKey(session, theirProposal);
926 SecOTRGenerateNewProposedKey(session);
929 SecOTRSPrecalculateKeysInternal(session);
937 OSStatus SecOTRSVerifyAndExposeMessage(SecOTRSessionRef session,
944 require(session, abort);
948 dispatch_sync(session->_queue, ^{
955 result = SecOTRVerifyAndExposeRaw_locked(session, decodedBytes, exposedMessageContents);
960 result = SecOTRVerifyAndExposeRawCompact_locked(session, decodedBytes, exposedMessageContents);
976 OSStatus SecOTRSEndSession(SecOTRSessionRef session,