
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
yb                 @   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_bytes@      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   s4   || _ || _d | _|| _tjjt| j jd| _	d S )NZnonce)

repository
enc_cipherend_of_nonce_reservationmanifest_nonceospathjoinr   Zid_str
nonce_file)selfr   r   r    r   /usr/lib64/python3.6/nonces.py__init__   s
    zNonceManager.__init__c             C   sB   y(t | jd}tt|j S Q R X W n tk
r<   d S X d S )Nr)openr   r	   r   readFileNotFoundError)r   fdr   r   r   get_local_free_nonce   s
    z!NonceManager.get_local_free_noncec             C   sD   | j  |krtdt| jdd}|jtt| W d Q R X d S )Nz6nonce space reservation with mismatched previous stateF)Z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   sD   y
| j j S  tk
r>   tjjd dd | _dd | _d S X d S )NzTPlease upgrade to borg version 1.1+ on the server for safer AES-CTR nonce handling.
c               S   s   d S )Nr   r   r   r   r   <lambda>+   s    z2NonceManager.get_repo_free_nonce.<locals>.<lambda>c             S   s   d S )Nr   )r"   r#   r   r   r   r%   ,   s    )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 j|| d S )N)r   Zcommit_nonce_reservation)r   r"   r#   r   r   r   r)   /   s    z*NonceManager.commit_repo_nonce_reservationc             C   s   | j r8tj| jjdd}|| j ks&t|| | j kr8d S | j }| j }tdd ||| j	| j fD }|| t
 }|tk s~t| j d kr| jjd |jddd n"|| j kr| jjd |jddd | j|| | j|| || _ d S )NZbig)	byteorderc             s   s   | ]}|d k	r|V  qd S )Nr   ).0xr   r   r   	<genexpr>J   s    z2NonceManager.ensure_reservation.<locals>.<genexpr>   )r   int
from_bytesr   ZivAssertionErrorr(   r   maxr   NONCE_SPACE_RESERVATIONMAX_REPRESENTABLE_NONCEresetto_bytesr)   r$   )r   Znonce_space_neededZ
next_nonceZrepo_free_nonceZlocal_free_nonceZfree_nonce_spaceZreservation_endr   r   r   ensure_reservation2   s"    

zNonceManager.ensure_reservationN)	__name__
__module____qualname__r   r   r$   r(   r)   r7   r   r   r   r   r      s   
r   l            l    i   )r   r&   Zbinasciir   Zhelpersr   r   platformr   Zremoter   Z	low_levelr	   r
   r4   r3   r   r   r   r   r   <module>   s   