o
    +ke                     @   sv   d dl Z d dlZd dlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 dd	lmZmZ d
ZdZG dd dZdS )    N)	unhexlify   )get_security_dir)
bin_to_hex)SaveFile)InvalidRPCMethod   )bytes_to_longlong_to_bytesl    i   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )NonceManagerc                 C   s.   || _ d | _|| _tjt| j jd| _d S )Nnonce)	
repositoryend_of_nonce_reservationmanifest_nonceospathjoinr   Zid_str
nonce_file)selfr   r    r   6usr/lib/python3.10/site-packages/borg/crypto/nonces.py__init__   s   zNonceManager.__init__c                 C   sX   z!t | j}tt| W  d    W S 1 sw   Y  W d S  ty+   Y d S w N)openr   r	   r   readFileNotFoundError)r   fdr   r   r   get_local_free_nonce   s   (z!NonceManager.get_local_free_noncec                 C   sZ   |   |kr
tdt| jdd}|tt| W d    d S 1 s&w   Y  d S )Nz6nonce space reservation with mismatched previous stateF)binary)r   	Exceptionr   r   writer   r
   )r   next_unreservedstart_noncer   r   r   r   commit_local_nonce_reservation   s
   "z+NonceManager.commit_local_nonce_reservationc                 C   sB   z| j  W S  ty    tjd dd | _dd | _Y d S w )NzTPlease upgrade to borg version 1.1+ on the server for safer AES-CTR nonce handling.
c                   S      d S r   r   r   r   r   r   <lambda>*       z2NonceManager.get_repo_free_nonce.<locals>.<lambda>c                 S   r$   r   r   )r!   r"   r   r   r   r%   +   r&   )r   Zget_free_noncer   sysstderrr    get_repo_free_noncecommit_repo_nonce_reservation)r   r   r   r   r)   $   s   

z NonceManager.get_repo_free_noncec                 C   s   | j || d S r   )r   Zcommit_nonce_reservation)r   r!   r"   r   r   r   r*   .   s   z*NonceManager.commit_repo_nonce_reservationc                 C   s   | j r|}|| j ksJ || | j kr|S |  }|  }tdd ||| j| j fD }|| t }|tk s8J | || | || || _ |S )a  
        Call this before doing encryption, give current, yet unused, integer IV as <nonce>
        and the amount of subsequent (counter-like) IVs needed as <nonce_space_needed>.
        Return value is the IV (counter) integer you shall use for encryption.

        Note: this method may return the <nonce> you gave, if a reservation for it exists or
              can be established, so make sure you give a unused nonce.
        c                 s   s    | ]	}|d ur|V  qd S r   r   ).0xr   r   r   	<genexpr>Q   s    z2NonceManager.ensure_reservation.<locals>.<genexpr>)	r   r)   r   maxr   NONCE_SPACE_RESERVATIONMAX_REPRESENTABLE_NONCEr*   r#   )r   r   Znonce_space_neededZ
next_nonceZrepo_free_nonceZlocal_free_nonceZfree_nonce_spaceZreservation_endr   r   r   ensure_reservation1   s   zNonceManager.ensure_reservationN)	__name__
__module____qualname__r   r   r#   r)   r*   r1   r   r   r   r   r      s    
r   )r   r'   binasciir   helpersr   r   platformr   Zremoter   Z	low_levelr	   r
   r0   r/   r   r   r   r   r   <module>   s    