=pod

=head1 NAME

BN_zero, BN_one, BN_value_one, BN_set_word, BN_get_word - BIGNUM assignment
operations

=head1 SYNOPSIS

 #include <openssl/bn.h>

 void BN_zero(BIGNUM *a);
 int BN_one(BIGNUM *a);

 const BIGNUM *BN_value_one(void);

 int BN_set_word(BIGNUM *a, unsigned long w);
 unsigned long BN_get_word(BIGNUM *a);

Deprecated:

 #if OPENSSL_API_COMPAT < 0x00908000L
 int BN_zero(BIGNUM *a);
 #endif

=head1 DESCRIPTION

BN_zero(), BN_one() and BN_set_word() set B<a> to the values 0, 1 and
B<w> respectively.  BN_zero() and BN_one() are macros.

BN_value_one() returns a B<BIGNUM> constant of value 1. This constant
is useful for use in comparisons and assignment.

BN_get_word() returns B<a>, if it can be represented as an unsigned
long.

=head1 RETURN VALUES

BN_get_word() returns the value B<a>, and 0xffffffffL if B<a> cannot
be represented as an unsigned long.

BN_one(), BN_set_word() and the deprecated version of BN_zero()
return 1 on success, 0 otherwise.
BN_value_one() returns the constant.
The preferred version of BN_zer() never fails and returns no value.

=head1 BUGS

Someone might change the constant.

If a B<BIGNUM> is equal to 0xffffffffL it can be represented as an
unsigned long but this value is also returned on error.

=head1 SEE ALSO

L<bn(3)>, L<BN_bn2bin(3)>

=head1 COPYRIGHT

Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the OpenSSL license (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
