nl::Weave::Platform::Security

מרחב השמות הזה כולל את כל הממשקים ב-Weave עבור מנהל הזיכרון של Weave Security Monitor.

סיכום

הפונקציות במרחב השמות הזה יוטמעו על ידי פלטפורמות שמשתמשות ב-Weave, בהתאם לצרכים/למגבלות של הסביבה הספציפית.

ערכים של ספירה

BlockSetParamFields{
  kBlockSetSizeMask = 0x07,
  kBlockSetSizeShift = 0,
  kBlockSetSizeValueShift = 7,
  kBlockSetCountMask = 0x18,
  kBlockSetCountShift = 3,
  kBlockSetBufferIndexMask = 0x60,
  kBlockSetBufferIndexShift = 5,
  kBlockSetIsLongTermMask = 0x80,
  kBlockSetIsLongTermShift = 7
}
טיפוסים בני מנייה (enum)
חסימת המיקום של שדות פרמטרים מוגדרים בטופס מקודד של 8 ביט.
BlockSetParams{
  kNumberOfNetworkBuffers = 2,
  kNumberOfBlockSets = 4,
  kNetworkBuffer0BlockAllocationMask = 0x07,
  kNetworkBuffer1BlockAllocationMask = 0x18,
  kBlockSet1Size = 1,
  kBlockSet1Count = 1,
  kBlockSet1BufferIndex = 0,
  kBlockSet1isLongTerm = 1,
  kBlockSet2Size = 4,
  kBlockSet2Count = 1,
  kBlockSet2BufferIndex = 0,
  kBlockSet2isLongTerm = 1,
  kBlockSet3Size = 4,
  kBlockSet3Count = 1,
  kBlockSet3BufferIndex = 0,
  kBlockSet3isLongTerm = 0,
  kBlockSet4Size = 5,
  kBlockSet4Count = 2,
  kBlockSet4BufferIndex = 1,
  kBlockSet4isLongTerm = 0,
  kTotalMemorySize = (kBlockSet1Size * kBlockSet1Count + kBlockSet2Size * kBlockSet2Count + kBlockSet3Size * kBlockSet3Count + kBlockSet4Size * kBlockSet4Count) << kBlockSetSizeValueShift,
  kMaxBlockSize = 600,
  kMinBufferSize = 1240
}
טיפוסים בני מנייה (enum)
הגדרת פרמטרים של קבוצת בלוקים.

Typedefs

BlockMark_t typedef
uint8_t
הסוג שמשמש לסימון איזה בלוק מוקצה כרגע או לא מוקצה.
BlockSetParams_t typedef
uint8_t
הסוג הזה משמש לקידוד מידע על קבוצת בלוקים.

משתנים

sBlockSetParams = { ((kBlockSet1Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet1Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet1BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet1isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), ((kBlockSet2Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet2Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet2BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet2isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), ((kBlockSet3Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet3Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet3BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet3isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), ((kBlockSet4Size << kBlockSetSizeShift) & kBlockSetSizeMask) | ((kBlockSet4Count << kBlockSetCountShift) & kBlockSetCountMask) | ((kBlockSet4BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | ((kBlockSet4isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask), }[kNumberOfBlockSets]
פרמטרים של קבוצות בלוקים מקודדים.
sBufferAllocationMask = { kNetworkBuffer0BlockAllocationMask, kNetworkBuffer1BlockAllocationMask, }[kNumberOfNetworkBuffers]
const BlockMark_t
סט של מסכות חוסמות מאגר נתונים.
sMemBlocksAllocated = 0
מציין איזה בלוק מוקצה או לא מוקצה.
sMemBufs = { NULL }[kNumberOfNetworkBuffers]
void *
מצביעים על מאגרי נתונים זמניים שאותחלו ל-NULL.
sNetworkBuffersUsed = true
bool
ערך בוליאני שמציין אם (true) או לא (false) את מאגרי הנתונים הזמניים של הרשת Simple Allocator.

פונקציות

DecodeBlockSetParams(BlockSetParams_t blockSetParams, uint16_t & blockSize, uint8_t & blockCount, uint8_t & blockBufferIndex, bool & blockIsLongTerm)
void
GetSecureRandomData(uint8_t *buf, uint16_t len)
הפונקציה נקראת על ידי שכבת Weave כדי ליצור נתונים אקראיים.
InitSecureRandomDataSource(nl::Weave::Crypto::EntropyFunct entropyFunct, uint16_t entropyLen, const uint8_t *personalizationData, uint16_t perDataLen)
הפונקציה נקראת על ידי שכבת Weave כדי לאתחל מקור נתונים אקראי.
MemoryAlloc(size_t size)
void *
הפונקציה נקראת על ידי שכבת Weave כדי להקצות בלוק זיכרון בעל 'גודל' בייטים.
MemoryAlloc(size_t size, bool isLongTermAlloc)
void *
הפונקציה נקראת על ידי שכבת Weave כדי להקצות בלוק זיכרון בעל 'גודל' בייטים.
MemoryFree(void *p)
void
הפונקציה נקראת על ידי שכבת Weave כדי לשחרר בלוק זיכרון שהוקצה על ידי הפונקציה MemeoryAlloc() .
MemoryInit(void *buf, size_t bufSize)
הפונקציה הזו נקראת על ידי שכבת Weave כדי לאתחל זיכרון ומשאבים שנדרשים לפונקציונליות תקינה של מקצה הזיכרון של Weave Security Manager.
MemoryShutdown(void)
void
הפונקציה נקרא על ידי שכבת Weave כדי לשחרר את כל המשאבים שהוקצו על ידי פונקציית MemoryInit().
OnTimeConsumingCryptoDone(void)
void
הפונקציה הזו מופעלת כדי להודיע לאפליקציה כשפעולה קריפטוגרפית שגוזלת זמן רב הסתיימה.
OnTimeConsumingCryptoStart(void)
void
הפונקציה הזו מופעלת כדי להודיע לאפליקציה כשפעולה קריפטוגרפית שגוזלת זמן רב עומדת להתחיל.

שיעורים

nl::Weave::Platform::Security::AES128BlockCipher
nl::Weave::Platform::Security::AES128BlockCipherDec
nl::Weave::Platform::Security::AES128BlockCipherEnc
nl::Weave::Platform::Security::AES256BlockCipher
nl::Weave::Platform::Security::AES256BlockCipherDec
nl::Weave::Platform::Security::AES256BlockCipherEnc
nl::Weave::Platform::Security::SHA1
nl::Weave::Platform::Security::SHA256

ערכים של ספירה

BlockSetParamFields

 BlockSetParamFields

חסימת המיקום של שדות פרמטרים מוגדרים בטופס מקודד של 8 ביט.

מאפיינים
kBlockSetBufferIndexMask

אנונימיזציה של שדות באינדקס מאגר הנתונים הזמני.

kBlockSetBufferIndexShift

תזוזה בשדה של אינדקס מאגר הנתונים הזמני.

kBlockSetCountMask

מסכה של ספירת השדות.

kBlockSetCountShift

ספירת השינויים בשדה.

kBlockSetIsLongTermMask

כאן מקלידים מסכת שדות.

kBlockSetIsLongTermShift

הקלדה של שינוי בשדה.

kBlockSetSizeMask

מסכה של שדה גודל.

kBlockSetSizeShift

שינוי בשדה הגודל.

kBlockSetSizeValueShift

שינוי בפענוח של שדה הגודל (מכפילים ב-128).

BlockSetParams

 BlockSetParams

הגדרת פרמטרים של קבוצת בלוקים.

מאפיינים
kBlockSet1BufferIndex

הגדר את אינדקס מאגר הנתונים הזמני מס' 1 הוא 0.

kBlockSet1Count

קביעת מספר הבלוקים מספר 1 הוא 1.

kBlockSet1Size

גודל קבוצה 1 הוא 128 בייטים.

kBlockSet1isLongTerm

הסוג הראשון הוא טווח ארוך.

kBlockSet2BufferIndex

הגדרת מספר 2 של אינדקס מאגר הנתונים הזמני הוא 0.

kBlockSet2Count

ספירת בלוקים מס' 2 היא 1.

kBlockSet2Size

גודל קבוצה 2 הוא 512 בייטים.

kBlockSet2isLongTerm

סוג קבוצה 2 הוא לטווח ארוך.

kBlockSet3BufferIndex

טווח 3: אינדקס מאגר הנתונים הזמני הוא 0.

kBlockSet3Count

ספירת בלוקים מספר 3 היא 1.

kBlockSet3Size

גודל קבוצה 3 הוא 512 בייטים.

kBlockSet3isLongTerm

סוג קבוצה 3 הוא טווח קצר.

kBlockSet4BufferIndex

הגדרת מספר 4 של אינדקס מאגר הנתונים הזמני הוא 1.

kBlockSet4Count

ספירת בלוקים מס' 4 היא 2.

kBlockSet4Size

גודל מס' 4 הוא 640 בייטים.

kBlockSet4isLongTerm

סוג קבוצה 4 הוא טווח קצר.

kMaxBlockSize

גודל הבלוק המקסימלי שנתמך על ידי Simple Allocator.

kMinBufferSize

הגודל המינימלי של מאגר הנתונים הזמני ברשת שנדרש כדי לתמוך בתרחישים לדוגמה של Allocator.

הפרמטר הזה נגזר מהגדלים של שני בלוקי זיכרון (640 + 600) שהוקצו במאגר הנתונים הזמני של הרשת מס' 1.

kNetworkBuffer0BlockAllocationMask

המסכה הזו מזהה את כל בלוקי הזיכרון שהוקצו ממאגר נתונים זמני של רשת מס' 0.

kNetworkBuffer1BlockAllocationMask

המסכה הזו מזהה את כל בלוקי הזיכרון שהוקצו ממאגר הנתונים הזמני של הרשת מס' 1.

kNumberOfBlockSets

מספר ערכות הבלוקים שנעשה בהן שימוש ב-Simplecator.

kNumberOfNetworkBuffers

מספר מאגרי הנתונים הזמניים של הרשת ב-Simplecator.

kTotalMemorySize

הזיכרון הכולל בשימוש של Simple Allocator.

Typedefs

BlockMark_t

uint8_t BlockMark_t

הסוג שמשמש לסימון איזה בלוק מוקצה כרגע או לא מוקצה.

uint8_t - תמיכה בעד 8 בלוקים של זיכרון סה"כ uint16_t - תמיכה ב-16 בלוקים של זיכרון סה"כ uint32_t - תמיכה ב-32 בלוקים של זיכרון סה"כ

BlockSetParams_t

uint8_t BlockSetParams_t

הסוג הזה משמש לקידוד מידע על קבוצת בלוקים.

קבוצת בלוקים היא קבוצה של מקטעי זיכרון בעלי מאפיינים זהים (גודל, סוג ושייכים לאותו מאגר נתונים זמני). בתרשים הבא אפשר לראות איך המידע על קבוצת הבלוקים מקודד בפורמט של 8 ביט:

לטווח ארוך חסימת האינדקס מספר הבלוקים גודל הבלוק
[7] [6:5] [4:3] [2:0]
[2:0] - גודל בלוק הזיכרון בקבוצה. ערך הגודל מקודד ברמת פירוט של 128 בייטים.
[2:0] פענוח הקוד
000 אפס בייט
001 128 בייטים
010 ‫256 בייטים
... -
111 896 בייטים
[4:3] – מספר הבלוקים בקבוצה.
[4:3] פענוח הקוד
00 4 בלוקים
01 בלוק אחד
10 2 בלוקים
11 3 בלוקים
[6:5] - אינדקס מאגר הנתונים הזמני של הרשת שבו נמצאים בלוקים של זיכרון. שימו לב שכשמשתמשים במאגר הנתונים הזמני, כל בלוקי הזיכרון מוקצים ממאגר ייעודי ייעודי, והמערכת מתעלמת מפרמטר האינדקס הזה.
[6:5] פענוח הקוד
00 מאגר נתונים זמני ברשת מס' 0
... -
11 מאגר נתונים זמני ברשת מס' 3
[7] – מציינת אם בלוקים מיועדים לאחסון לטווח ארוך/קצר.
[7] פענוח הקוד
0 בלוקים של זיכרון לטווח קצר
1 בלוקים של זיכרון לטווח ארוך

משתנים

sBlockSetParams

const BlockSetParams_t sBlockSetParams[kNumberOfBlockSets] = {
    
    ((kBlockSet1Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet1Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet1BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet1isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),
    
    ((kBlockSet2Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet2Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet2BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet2isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),
    
    ((kBlockSet3Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet3Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet3BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet3isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),
    
    ((kBlockSet4Size << kBlockSetSizeShift) & kBlockSetSizeMask) | 
    ((kBlockSet4Count << kBlockSetCountShift) & kBlockSetCountMask) | 
    ((kBlockSet4BufferIndex << kBlockSetBufferIndexShift) & kBlockSetBufferIndexMask) | 
    ((kBlockSet4isLongTerm << kBlockSetIsLongTermShift) & kBlockSetIsLongTermMask),







}

פרמטרים של קבוצות בלוקים מקודדים.

sBufferAllocationMask

const BlockMark_t sBufferAllocationMask[kNumberOfNetworkBuffers] = {
                                                   kNetworkBuffer0BlockAllocationMask,
                                                   kNetworkBuffer1BlockAllocationMask,




                                                                                       }

סט של מסכות חוסמות מאגר נתונים.

מזהה אם כל הבלוקים במאגר הנתונים הזמני ולא מוקצים, ואז אפשר לשחרר את המאגר.

sMemBlocksAllocated

BlockMark_t sMemBlocksAllocated = 0

מציין איזה בלוק מוקצה או לא מוקצה.

אותחל ל-0 – המשמעות היא שכל בלוקי הזיכרון ולא מוקצים.

sMemBufs

void * sMemBufs[kNumberOfNetworkBuffers] = { NULL }

מצביעים על מאגרי נתונים זמניים שאותחלו ל-NULL.

כשמשתמשים במאגרי נתונים זמניים ברשת, sMemBufs[] מצביעים על אובייקטים של PacketBuffer. כשמשתמשים במאגר נתונים זמני ייעודי (sMemBufs[0]), המערכת מתעלמת מנקודה למאגר הנתונים ומנקודות sMemBuf אחרות[].

sNetworkBuffersUsed

bool sNetworkBuffersUsed = true

ערך בוליאני שמציין אם (true) או לא (false) את מאגרי הנתונים הזמניים של הרשת Simple Allocator.

אם הערך הוא False, נעשה שימוש במאגר הנתונים הזמני הייעודי שמסופק באמצעות הפונקציה MemoryInit().

פונקציות

DecodeBlockSetParams

void DecodeBlockSetParams(
  BlockSetParams_t blockSetParams,
  uint16_t & blockSize,
  uint8_t & blockCount,
  uint8_t & blockBufferIndex,
  bool & blockIsLongTerm
)

GetSecureRandomData

WEAVE_ERROR GetSecureRandomData(
  uint8_t *buf,
  uint16_t len
)

הפונקציה נקראת על ידי שכבת Weave כדי ליצור נתונים אקראיים.

פרטים
פרמטרים
[in] buf
מצביעים על מאגר נתונים זמני של זיכרון, שבו יש לאחסן את הנתונים האקראיים המבוקשים.
[in] len
מציינת את גודל הנתונים האקראיים המבוקש בבייטים.
מוחזר ערכים
WEAVE_ERROR_DRBG_ENTROPY_SOURCE_FAILED
אם מקור האנטרופיה לא מצליח ליצור אנטרופיה שנשלחה על ידי מחולל הנתונים האקראי.
WEAVE_ERROR_RANDOM_DATA_UNAVAILABLE
אם מקור נתונים אקראי לא מצליח ליצור נתונים אקראיים.
WEAVE_ERROR_INCORRECT_STATE
אם מקור נתונים אקראי נמצא במצב שגוי.
WEAVE_NO_ERROR
הצלחה.

InitSecureRandomDataSource

WEAVE_ERROR InitSecureRandomDataSource(
  nl::Weave::Crypto::EntropyFunct entropyFunct,
  uint16_t entropyLen,
  const uint8_t *personalizationData,
  uint16_t perDataLen
)

הפונקציה נקראת על ידי שכבת Weave כדי לאתחל מקור נתונים אקראי.

הפונקציה הזו ספציפית לפלטפורמה ויכול להיות שהיא תהיה ריקה אם לא נדרש אתחול של מקור נתונים אקראי.

פרטים
פרמטרים
[in] entropyFunct
מצביעים על פונקציה שיוצרת אנטרופיה אל מחולל הנתונים האקראי. כאשר האלגוריתם לא נדרש לקלט אנטרופיה, הקלט יכול להיות NULL, כלומר כאשר משתמשים בגרסת OpenSSL של מחולל הנתונים האקראי.
[in] entropyLen
מציינת את גודל האנטרופיה בבייטים שפונקציית האנטרופיה צריכה ליצור כשמשתמשים בה.
[in] personalizationData
מצביעים על מאגר נתונים זמני בזיכרון שמאחסן את הקלט של נתוני ההתאמה האישית. קלט הנתונים הזה צריך להיות ספציפי למכשיר, והוא עוזר לשפר את המאפיינים הסטטיסטיים של הנתונים האקראיים.
[in] perDataLen
מציינת את גודל הנתונים של ההתאמה האישית בבייטים.
מוחזר ערכים
WEAVE_ERROR_INVALID_ARGUMENT
אם הועבר ארגומנט לא תקין לפונקציה הזו.
WEAVE_NO_ERROR
הצלחה.

MemoryAlloc

void * MemoryAlloc(
  size_t size
)

הפונקציה נקראת על ידי שכבת Weave כדי להקצות בלוק זיכרון בעל 'גודל' בייטים.

הפונקציה הזו מקבילה ל-MemoryAlloc(size, false).

פרטים
פרמטרים
[in] size
מציינת את גודל הזיכרון המבוקש בבייטים.
מוחזר ערכים
Pointer
לבלוק זיכרון, במקרה של הצלחה.
NULL-pointer
אם הקצאת הזיכרון נכשלה.

MemoryAlloc

void * MemoryAlloc(
  size_t size,
  bool isLongTermAlloc
)

הפונקציה נקראת על ידי שכבת Weave כדי להקצות בלוק זיכרון בעל 'גודל' בייטים.

פרטים
פרמטרים
[in] size
מציינת את גודל הזיכרון המבוקש בבייטים.
[in] isLongTermAlloc
ערך בוליאני שמציין אם (true) או לא (false) בלוק הזיכרון המבוקש לשימוש לטווח ארוך. הקצאה לטווח ארוך היא זיכרון שצריך להישאר מוקצה עד שסיום הפעלה או לחיצת יד מאובטחים. דוגמאות להקצאה לטווח ארוך כוללות בלוקים שהוקצו לאובייקטים מסוג CASE או PASE ואת נתוני ההקשר שלהם. הקצאה לטווח קצר היא זיכרון שנדרש כדי לבצע פעולה ספציפית, ואפשר לשחרר אותה מיד לאחר מכן. הקלט הזה עוזר לייעל את ניצול הזיכרון במערכת שמוגבלת על ידי זיכרון. השימוש בפרמטר הזה הוא שרירותי ותלוי בכלי ההטמעה של הפונקציה. לדוגמה, כשמשתמשים ב-C Standard Library Malloc() , המערכת מתעלמת מהפרמטר הזה.
מוחזר ערכים
Pointer
לבלוק זיכרון, במקרה של הצלחה.
NULL-pointer
אם הקצאת הזיכרון נכשלה.

MemoryFree

void MemoryFree(
  void *p
)

הפונקציה נקראת על ידי שכבת Weave כדי לשחרר בלוק זיכרון שהוקצה על ידי הפונקציה MemeoryAlloc() .

פרטים
פרמטרים
[in] p
מצביעים על בלוק זיכרון שאמור להיות משוחרר.

MemoryInit

WEAVE_ERROR MemoryInit(
  void *buf,
  size_t bufSize
)

הפונקציה הזו נקראת על ידי שכבת Weave כדי לאתחל זיכרון ומשאבים שנדרשים לפונקציונליות תקינה של מקצה הזיכרון של Weave Security Manager.

הפונקציה הזו ספציפית לפלטפורמה ויכול להיות שהיא תהיה ריקה במקרים מסוימים. לדוגמה, הפונקציה הזו לא מבצעת שום פעולה כשהפונקציות C Standard Library Malloc() ו-free() משמשות להקצאת זיכרון.

פרטים
פרמטרים
[in] buf
מצביע למאגר אחסון ייעודי בזיכרון, שישמש כמאגר זיכרון להקצאת זיכרון של Weave Security Manager. הקלט הזה הוא אופציונלי (ברירת המחדל היא NULL) ואין להשתמש בו אם לא משתמשים במאגר נתונים זמני ייעודי לזיכרון.
[in] bufSize
הגודל של מאגר נתונים ייעודי לזיכרון. הקלט הזה הוא אופציונלי (ברירת המחדל היא 0) ואין להשתמש בו אם לא משתמשים במאגר הנתונים הזמני. כשמשתמשים במאגר נתונים זמני ייעודי לזיכרון, הפונקציה בודקת את הפונקציה ויוצרת שגיאה אם הגודל של מאגר הנתונים הזמני לא מספיק גדול בשביל לתמוך בתרחישים לדוגמה של מנהל האבטחה ב-Weave.
מוחזר ערכים
WEAVE_ERROR_BUFFER_TOO_SMALL
אם הגודל הייעודי של מאגר הנתונים הזמני של הקלט לא מספיק כדי לתמוך בתרחישים לדוגמה של מנהל האבטחה ב-Weave.
WEAVE_NO_ERROR
הצלחה.
other
שגיאה שנוצרה על ידי פונקציית אתחול הזיכרון הספציפית לפלטפורמה.

MemoryShutdown

void MemoryShutdown(
  void
)

הפונקציה נקרא על ידי שכבת Weave כדי לשחרר את כל המשאבים שהוקצו על ידי פונקציית MemoryInit().

הפונקציה הזו יכולה להיות קריאה ריקה אם לא צריך לשחרר משאבים. לדוגמה, נניח שהפונקציות C Standard Library Malloc() ו-free() משמשות להקצאת זיכרון.

OnTimeConsumingCryptoDone

void OnTimeConsumingCryptoDone(
  void
)

הפונקציה הזו מופעלת כדי להודיע לאפליקציה כשפעולה קריפטוגרפית שגוזלת זמן רב הסתיימה.

OnTimeConsumingCryptoStart

void OnTimeConsumingCryptoStart(
  void
)

הפונקציה הזו מופעלת כדי להודיע לאפליקציה כשפעולה קריפטוגרפית שגוזלת זמן רב עומדת להתחיל.